summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--TODO2
-rw-r--r--ranger/actions.py14
-rw-r--r--ranger/fsobject/directory.py118
-rw-r--r--ranger/gui/widgets/browsercolumn.py12
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