# HG changeset patch # User fabien # Date 1076131840 18000 # Node ID 9ac26f2f83e1d65064b327e8e2a93d460eca78cf # Parent 76768c12aa046030d9b16e644d7c914620d334f7 [svn] Now three updating function. (see IMMSStore.__init__). Currently, I'm better to replace everything. But eh, YMMV. diff -r 76768c12aa04 -r 9ac26f2f83e1 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)