[svn] Now three updating function. (see IMMSStore.__init__). immsview
authorfabien
Sat, 07 Feb 2004 00:30:40 -0500
branchimmsview
changeset 27 9ac26f2f83e1
parent 26 76768c12aa04
child 28 7f61cb2ddb7b
[svn] Now three updating function. (see IMMSStore.__init__). Currently, I'm better to replace everything. But eh, YMMV.
immsview
--- 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)