summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorhut <hut@lavabit.com>2009-12-23 01:18:31 +0100
committerhut <hut@lavabit.com>2009-12-23 01:18:31 +0100
commit0115ab105d160c6923f7a3449dbd9345d0fe4a65 (patch)
treeff229528344968dc01247ad79c91a66c91d59dd0
parent85f45f481311ff3fb241c89c824ccc80583cd99a (diff)
downloadranger-0115ab105d160c6923f7a3449dbd9345d0fe4a65.tar.gz
fixed / improved loader
-rw-r--r--ranger/fm.py2
-rw-r--r--ranger/fsobject/directory.py22
-rw-r--r--ranger/fsobject/fsobject.py1
-rw-r--r--ranger/fsobject/loader.py39
-rw-r--r--ranger/gui/widgets/filelist.py1
-rw-r--r--ranger/gui/widgets/statusbar.py2
6 files changed, 42 insertions, 25 deletions
diff --git a/ranger/fm.py b/ranger/fm.py
index 59568e68..a8db3b93 100644
--- a/ranger/fm.py
+++ b/ranger/fm.py
@@ -63,8 +63,8 @@ class FM(Actions):
 				try:
 					self.bookmarks.update_if_outdated()
 					self.ui.redraw()
+					self.ui.set_load_mode(self.loader.has_work())
 					self.loader.work()
-					self.ui.set_load_mode(self.loader)
 
 					key = self.ui.get_next_key()
 
diff --git a/ranger/fsobject/directory.py b/ranger/fsobject/directory.py
index 5ad07ef1..7fa130ec 100644
--- a/ranger/fsobject/directory.py
+++ b/ranger/fsobject/directory.py
@@ -2,6 +2,7 @@ from . import BAD_INFO
 from .file import File
 from .fsobject import FileSystemObject as SuperClass
 from ranger.shared import SettingsAware
+from ranger import log
 import ranger.fsobject
 
 def sort_by_basename(path):
@@ -17,6 +18,7 @@ class NoDirectoryGiven(Exception):
 
 class Directory(SuperClass, SettingsAware):
 	enterable = False
+	load_generator = None
 	loading = False
 
 	filenames = None
@@ -47,9 +49,12 @@ class Directory(SuperClass, SettingsAware):
 		"""Loads the contents of the directory. Use this sparingly since
 		it takes rather long.
 		"""
+
+		log("generating loader for " + self.path + "(" + str(id(self)) + ")")
 		from os.path import join, isdir, basename
 		from os import listdir
 
+		self.loading = True
 		self.load_if_outdated()
 		yield
 
@@ -89,7 +94,8 @@ class Directory(SuperClass, SettingsAware):
 
 		self.content_loaded = True
 		self.loading = False
-		yield
+#		yield
+#		yield
 
 	def load_content(self, schedule=False):
 		"""Loads the contents of the directory. Use this sparingly since
@@ -101,13 +107,21 @@ class Directory(SuperClass, SettingsAware):
 		if schedule is None:
 			schedule = self.size > 30
 
-		if not self.loading:
+		if self.load_generator is None:
+			self.load_generator = self.load_bit_by_bit()
+
 			if schedule and self.fm:
-				self.loading = True
 				self.fm.loader.add(self)
 			else:
-				for _ in self.load_bit_by_bit():
+				for _ in self.load_generator:
 					pass
+				self.load_generator = None
+
+		elif not schedule or not self.fm:
+			for _ in self.load_generator:
+				pass
+			self.load_generator = None
+
 
 	def sort(self):
 		"""Sort the containing files"""
diff --git a/ranger/fsobject/fsobject.py b/ranger/fsobject/fsobject.py
index 10a97fd5..c0ab6a9c 100644
--- a/ranger/fsobject/fsobject.py
+++ b/ranger/fsobject/fsobject.py
@@ -25,6 +25,7 @@ class FileSystemObject(MimeTypeAware, FileManagerAware):
 	infostring = None
 	permissions = None
 	type = T_UNKNOWN
+	size = 0
 
 	last_used = None
 
diff --git a/ranger/fsobject/loader.py b/ranger/fsobject/loader.py
index a1ebcc97..ef91aae3 100644
--- a/ranger/fsobject/loader.py
+++ b/ranger/fsobject/loader.py
@@ -14,7 +14,8 @@ def delayfunc(n):
 	if n < 4:
 		return 0.05
 	else:
-		return math.log(n-2) * 0.2
+		return 0.3
+#		return math.log(n-2) * 0.2
 
 class Loader(object):
 	seconds_of_work_time = 0.1
@@ -25,37 +26,37 @@ class Loader(object):
 		self.status_generator = status_generator()
 		self.tick = 0
 		self.rotate()
+		self.old_item = None
 	
 	def rotate(self):
 		self.status = next(self.status_generator)
 	
 	def add(self, obj):
-		self.queue.append(obj)
+		while obj in self.queue:
+			self.queue.remove(obj)
+		self.queue.appendleft(obj)
 
 	def work(self):
-		if self.item is None:
-			try:
-				self.item = self.queue.popleft()
-			except IndexError:
-				return
+		if not self.queue:
+			return
 
-			self.load_generator = self.item.load_bit_by_bit()
-			self.tick = 0
+		item = self.queue[0]
+		if item.load_generator is None:
+			self.queue.popleft()
 
 		self.rotate()
 		self.tick += 1
-		start_time = time()
-		end_time = time() + delayfunc(self.tick)
+		if item != self.old_item:
+			self.tick = 0
+			self.old_item = item
 
-		log(tuple(map(str, self.queue)))
+		end_time = time() + delayfunc(self.tick)
 		try:
-#			log("loading " + self.item.basename)
 			while time() < end_time:
-				next(self.load_generator)
-
+				next(item.load_generator)
 		except StopIteration:
-			self.item = None
-			self.load_generator = None
+			item.load_generator = None
+			self.queue.popleft()
 	
-	def __nonzero__(self):
-		return bool(self.queue or self.item is not None)
+	def has_work(self):
+		return bool(self.queue)
diff --git a/ranger/gui/widgets/filelist.py b/ranger/gui/widgets/filelist.py
index 952a6d45..2ece3077 100644
--- a/ranger/gui/widgets/filelist.py
+++ b/ranger/gui/widgets/filelist.py
@@ -121,6 +121,7 @@ class FileList(Widget):
 #
 			maxdirsize = self.settings.max_dirsize_for_autopreview
 			if not self.target.force_load and maxdirsize is not None \
+					and self.target.accessible \
 					and self.target.size > maxdirsize:
 				self.color(base_color, 'error')
 				self.win.addnstr(self.y, self.x, "no preview", self.wid)
diff --git a/ranger/gui/widgets/statusbar.py b/ranger/gui/widgets/statusbar.py
index f99882b1..b8b418c9 100644
--- a/ranger/gui/widgets/statusbar.py
+++ b/ranger/gui/widgets/statusbar.py
@@ -99,7 +99,7 @@ class StatusBar(Widget):
 		else:
 			target = self.env.at_level(0)
 
-		if not target.content_loaded:
+		if not target.content_loaded or not target.accessible:
 			return part
 
 		if self.filelist is not None:
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189