--- a/immsview Fri Feb 06 23:14:40 2004 -0500
+++ b/immsview Sat Feb 07 00:30:40 2004 -0500
@@ -20,9 +20,13 @@
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
-_version_ = "$Id: immsview 1708 2004-02-07 04:14:40Z fabien $"
+_version_ = "$Id: immsview 1709 2004-02-07 05:30:40Z fabien $"
# $Log$
+# Revision 1.27 2004/02/07 05:30:40 fabien
+# Now three updating function. (see IMMSStore.__init__).
+# Currently, I'm better to replace everything. But eh, YMMV.
+#
# Revision 1.26 2004/02/07 04:14:40 fabien
# Display only distinct UID. The path selected is arbitrary, but
# it's always the current one if Current is pressed.
@@ -271,6 +275,8 @@
rate = min(max(rate,75),150)
return _gdk_colors[rate-75]
+# This class must be derived from a GtkTreeModel
+# with persistent GtkTreeIter !!!
class IMMSStore(gtk.ListStore):
COL_RATING = 0
COL_PATH = 1
@@ -293,9 +299,15 @@
self.set_default_sort_func(self.default_sort)
self.set_sort_column_id(IMMSStore.COL_RATING, gtk.SORT_DESCENDING)
self.curtime = time.time()
+ # Only refresh last and rating. 6 / 17
+ # self._update_me = self.refresh
+ # Try to recycle old giter. 6 / 11
+ # self._update_me = self.recycle
+ # Replace everything. 6 / 7
+ self._update_me = self.replace
def default_sort(self, a, b, dummy):
return 0
- def tune_to_giter(self, uid, tune, giter = None, path = None):
+ def tune_to_giter(self, uid, tune, path = None, giter = None):
if path:
for fn in tune['path']:
if fn == path:
@@ -315,19 +327,66 @@
IMMSStore.COL_RATING_COLOR, rating_to_color(tune['rating']),
IMMSStore.COL_SELECT, gtk.FALSE)
return giter
- def refresh(self):
+ def update(self):
+ self.curtime = time
self.curtime = time.time()
col, order = self.get_sort_column_id()
if col:
self.set_sort_column_id(-1, gtk.SORT_ASCENDING)
tunes = self.db.get_ratings_and_info()
- self.clear()
print time.ctime(time.time()) + ": inserting"
- for uid, tune in tunes.items():
- self.tune_to_giter(uid, tune)
+ self._update_me(tunes)
print time.ctime(time.time()) + ": end insert"
if col:
self.set_sort_column_id(col, order)
+ def replace(self, tunes):
+ "replace simply replace all giter with new one"
+ self.clear()
+ for uid, tune in tunes.iteritems():
+ self.tune_to_giter(uid, tune)
+ def recycle(self, tunes):
+ "Recycle old giter, replacing old data."
+ giter = self.get_iter_first()
+ for uid, tune in tunes.iteritems():
+ self.tune_to_giter(uid, tune, giter = giter)
+ if giter:
+ giter = self.iter_next(giter)
+ while giter:
+ next = self.iter_next(giter)
+ self.remove(giter)
+ giter = next
+ def refresh(self, tunes):
+ "refresh only get new data and update last time and rating."
+ freed_giters = []
+ # first, try to recycle current giter.
+ giter = self.get_iter_first()
+ while giter:
+ # check if giter exist in DB.
+ guid = self.get_value(giter, IMMSStore.COL_UID)
+ if tunes.has_key(guid):
+ tune = tunes[guid]
+ self.set(giter,
+ IMMSStore.COL_RATING, tune['rating'],
+ IMMSStore.COL_LAST, tune['last'],
+ IMMSStore.COL_LAST_STR,
+ strtime(self.curtime-tune['last']),
+ IMMSStore.COL_RATING_COLOR,
+ rating_to_color(tune['rating']))
+ else:
+ # Elsewhere, collect them for further use...
+ # Hopefully, ListStore have persistent giter!
+ freed_giters.append(giter)
+ giter = self.iter_next(giter)
+ # populate the remeaning tunes into the collected giters
+ for uid, tune in tunes.iteritems():
+ if len(freed_giters) > 0:
+ giter = freed_giters.pop()
+ else:
+ giter = None
+ self.tune_to_giter(uid, tune, None, giter)
+ # then erase the remeaning giter.
+ for giter in freed_giters:
+ self.remove(giter)
def find_selected_giter(self):
giter = self.get_iter_first()
while giter:
@@ -351,7 +410,7 @@
if not giter:
tunes = self.db.get_ratings_and_info([uid])
if tunes > 0:
- giter = self.tune_to_giter(uid, tunes[uid], None, song)
+ giter = self.tune_to_giter(uid, tunes[uid], song)
else:
giter = self.update_giter(giter, song)
return giter
@@ -359,7 +418,7 @@
uid = self.get_value(giter, IMMSStore.COL_UID)
tunes = self.db.get_ratings_and_info([uid,])
if len(tunes) > 0:
- return self.tune_to_giter(uid, tunes[uid], giter, path)
+ return self.tune_to_giter(uid, tunes[uid], path, giter)
return giter
## def get_value(self, giter, col):
## # sniff! Can't override built-ins
@@ -458,7 +517,7 @@
def plot(self, dummy):
os.system(self._IMMSPLOT_COMMAND)
def do_refresh(self, dummy):
- self.iview.get_model().refresh()
+ self.iview.get_model().update()
def do_get_current(self, dummy):
song = self.xmms.get_current_file()
self.iview.set_current_song(song)