From a808a661b1368e74cbb67fb1de021e746a1d53d1 Mon Sep 17 00:00:00 2001 From: hut Date: Wed, 6 Jan 2010 22:59:13 +0100 Subject: loader: fixed some issues with updating/redrawing --- TODO | 2 +- ranger/actions.py | 14 +++-- ranger/fsobject/directory.py | 118 +++++++++++++++++++----------------- ranger/gui/widgets/browsercolumn.py | 12 +++- 4 files changed, 82 insertions(+), 64 deletions(-) diff --git a/TODO b/TODO index db86fb74..7b124a93 100644 --- a/TODO +++ b/TODO @@ -31,7 +31,7 @@ Bugs (X) #17 10/01/01 why do bookmarks disappear sometimes? (X) #18 10/01/01 fix notify widget (by adding a LogView?) (X) #19 10/01/01 resizing after pressing g - ( ) #23 10/01/04 stop dir loading with ^C -> wont load anymore + (X) #23 10/01/04 stop dir loading with ^C -> wont load anymore ( ) #25 10/01/06 directories sometimes dont reload correctly ( ) #26 10/01/06 :delete on symlinks of directories fails ( ) #31 10/01/06 ^C breaks cd-after-exit diff --git a/ranger/actions.py b/ranger/actions.py index 8fc796a3..ed0fc2c1 100644 --- a/ranger/actions.py +++ b/ranger/actions.py @@ -305,14 +305,16 @@ class Actions(EnvironmentAware, SettingsAware): def force_load_preview(self): cf = self.env.cf - if cf is not None: - cf.force_load = True + if hasattr(cf, 'unload') and hasattr(cf, 'load_content'): + cf.unload() + cf.load_content() def reload_cwd(self): try: cwd = self.env.pwd except: pass + cwd.unload() cwd.load_content() def set_filter(self, fltr): @@ -391,7 +393,7 @@ class Actions(EnvironmentAware, SettingsAware): if not copied_files: return - pwd = self.env.pwd + original_path = self.env.pwd.path try: one_file = copied_files[0] except: @@ -406,8 +408,9 @@ class Actions(EnvironmentAware, SettingsAware): descr = "moving files from: " + one_file.dirname def generate(): for f in copied_files: - for _ in shutil_g.move(f.path, pwd.path): + for _ in shutil_g.move(f.path, original_path): yield + pwd = self.env.get_directory(original_path) pwd.load_content() else: if len(copied_files) == 1: @@ -421,8 +424,9 @@ class Actions(EnvironmentAware, SettingsAware): join(self.env.pwd.path, f.basename)): yield else: - for _ in shutil_g.copy2(f.path, self.env.pwd.path): + for _ in shutil_g.copy2(f.path, original_path): yield + pwd = self.env.get_directory(original_path) pwd.load_content() self.loader.add(LoadableObject(generate(), descr)) diff --git a/ranger/fsobject/directory.py b/ranger/fsobject/directory.py index 9b42e3c6..f1810915 100644 --- a/ranger/fsobject/directory.py +++ b/ranger/fsobject/directory.py @@ -1,7 +1,9 @@ +from collections import deque +from time import time + from ranger.fsobject import BAD_INFO, File, FileSystemObject from ranger.shared import SettingsAware from ranger.ext.accumulator import Accumulator -from collections import deque import ranger.fsobject def sort_by_basename(path): @@ -28,6 +30,8 @@ class Directory(FileSystemObject, Accumulator, SettingsAware): scroll_begin = 0 scroll_offset = 0 + last_update_time = -1 + old_show_hidden = None old_directories_first = None old_reverse = None @@ -119,62 +123,66 @@ class Directory(FileSystemObject, Accumulator, SettingsAware): self.loading = True self.load_if_outdated() - if self.exists and self.runnable: - yield - filenames = [] - for fname in listdir(self.path): - if not self.settings.show_hidden and fname[0] == '.': - continue - if isinstance(self.filter, str) and self.filter \ - and self.filter not in fname: - continue - filenames.append(join(self.path, fname)) - yield - - marked_paths = set(map( \ - lambda obj: obj.path, self.marked_items)) - - files = [] - for name in filenames: - if isdir(name): - try: - item = self.fm.env.get_directory(name) - except: - item = Directory(name) - else: - item = File(name) - item.load_if_outdated() - files.append(item) + try: + if self.exists and self.runnable: + yield + filenames = [] + for fname in listdir(self.path): + if not self.settings.show_hidden and fname[0] == '.': + continue + if isinstance(self.filter, str) and self.filter \ + and self.filter not in fname: + continue + filenames.append(join(self.path, fname)) yield - self.scroll_offset = 0 - self.filenames = filenames - self.infostring = ' %d' % len(self.filenames) # update the infostring - self.files = files - - self._clear_marked_items() - for item in self.files: - if item.path in marked_paths: - self.mark_item(item, True) - else: - self.mark_item(item, False) - - self.old_directories_first = None - self.sort() - - if len(self.files) > 0: - if self.pointed_obj is not None: - self.sync_index() - else: - self.move(absolute=0) - else: - self.filenames = None - self.files = None - self.infostring = BAD_INFO - - self.cycle_list = None - self.content_loaded = True - self.loading = False + marked_paths = set(map( \ + lambda obj: obj.path, self.marked_items)) + + files = [] + for name in filenames: + if isdir(name): + try: + item = self.fm.env.get_directory(name) + except: + item = Directory(name) + else: + item = File(name) + item.load_if_outdated() + files.append(item) + yield + + self.scroll_offset = 0 + self.filenames = filenames + self.infostring = ' %d' % len(self.filenames) # update the infostring + self.files = files + + self._clear_marked_items() + for item in self.files: + if item.path in marked_paths: + self.mark_item(item, True) + else: + self.mark_item(item, False) + + self.old_directories_first = None + self.sort() + + if len(self.files) > 0: + if self.pointed_obj is not None: + self.sync_index() + else: + self.move(absolute=0) + else: + self.filenames = None + self.files = None + self.infostring = BAD_INFO + + self.cycle_list = None + self.content_loaded = True + self.last_update_time = time() + + finally: + self.loading = False def unload(self): self.loading = False diff --git a/ranger/gui/widgets/browsercolumn.py b/ranger/gui/widgets/browsercolumn.py index f392aecc..b359d7de 100644 --- a/ranger/gui/widgets/browsercolumn.py +++ b/ranger/gui/widgets/browsercolumn.py @@ -1,4 +1,6 @@ """The BrowserColumn widget displays the contents of a directory or file.""" +from time import time + from . import Widget from .pager import Pager @@ -9,6 +11,7 @@ class BrowserColumn(Pager, Widget): target = None postpone_drawing = False tagged_marker = '*' + last_redraw_time = -1 old_dir = None old_cf = None @@ -72,6 +75,7 @@ class BrowserColumn(Pager, Widget): def draw(self): """Call either _draw_file() or _draw_directory()""" + from ranger import log from ranger.fsobject.file import File from ranger.fsobject.directory import Directory @@ -87,9 +91,10 @@ class BrowserColumn(Pager, Widget): if type(self.target) == Directory: if self.target.load_content_if_outdated(): self.need_redraw = True - else: - if self.target.sort_if_outdated(): - self.need_redraw = True + elif self.target.sort_if_outdated(): + self.need_redraw = True + elif self.last_redraw_time < self.target.last_update_time: + self.need_redraw = True if self.need_redraw: self.win.erase() @@ -102,6 +107,7 @@ class BrowserColumn(Pager, Widget): self._draw_directory() Widget.draw(self) self.need_redraw = False + self.last_redraw_time = time() def _preview_this_file(self, target): return target.document and self.settings.preview_files -- cgit 1.4.1-2-gfad0 5.4&id=1295513fdf03f442881c9a0018ee95678822ff1b'>1295513f ^
94c5d83e ^
e9e4b4ff ^







94c5d83e ^







76f8d548 ^



94c5d83e ^


423ce88a ^

94c5d83e ^








e9e4b4ff ^

50a0cb1c ^
e9e4b4ff ^

26aa5c8e ^
e9e4b4ff ^
fde932f2 ^
75682d43 ^
e9e4b4ff ^

2c5ea01d ^
e9e4b4ff ^




e9e4b4ff ^

2c5ea01d ^
e9e4b4ff ^
0c2c782d ^

30ae2137 ^
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92