# HG changeset patch # User fabien # Date 1075704250 18000 # Node ID c5c0a84bb15b8a22bd077cc93a42a3d1b19093d7 # Parent ad5b932e411dfee5856ce56fb7fab882e57aa25a [svn] All functions are now implemented (with a somewhat "cleaner" interface. diff -r ad5b932e411d -r c5c0a84bb15b immsview --- a/immsview Sun Feb 01 23:51:35 2004 -0500 +++ b/immsview Mon Feb 02 01:44:10 2004 -0500 @@ -1,7 +1,5 @@ #!/usr/bin/python -_immsview_version = "$Id: immsview 1688 2004-02-02 04:51:35Z fabien $" - # Copyright (C) 2004 by Fabien Ninoles # IMMSView is aim to be a replacement to XMMS playlist editor @@ -22,14 +20,20 @@ # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. +_immsview_version = "$Id: immsview 1689 2004-02-02 06:44:10Z fabien $" + +# $Log$ +# Revision 1.8 2004/02/02 06:44:10 fabien +# All functions are now implemented (with a somewhat "cleaner" interface. +# + + # The aim of immsview is to become a better playlist editor than the # normal # TODO: # * IMMS: -# - Add Artist, Title, SID, etc. # - Add composed rating -# - Columns ordering (should pass to GTK probably for this). # - Rating edition # * XMMS: # - getting current playlist @@ -37,6 +41,9 @@ # * File support: # - adding, deleting, suppressing a file (including updating other # interface). +# - artist, title, genre informations (ID3) +# * Interface: +# - Real application interface (with menu, icons, accelerators, etc.) import pygtk pygtk.require('2.0') @@ -100,7 +107,8 @@ _dbname = os.environ['HOME'] + '/.imms/imms.db' # _dbname = os.environ['HOME'] + '/.imms/imms.backup.db' def __init__(self): - self.cx = sqlite.connect(IMMSDb._dbname) + self.cx = sqlite.connect(IMMSDb._dbname, + encoding = ('utf-8', 'replace')) def commit(self): self.cx.commit() def _get_ratings(self, min = 0, max = 250): @@ -138,8 +146,8 @@ results = [] for tune in res: try: - tmp = {'rating' : tune[1], - 'path' : tune[2].decode('latin_1', 'replace'), + tmp = {'rating' : int(tune[1]), + 'path' : tune[2].decode('utf8', 'replace'), 'last' : int(tune[3])} results.append(tmp) except UnicodeDecodeError: @@ -152,7 +160,7 @@ COL_LAST_STR = 2 COL_LAST = 3 COL_SELECT = 4 - def __init__(self, db, xmms): + def __init__(self, db): gtk.ListStore.__init__(self, gobject.TYPE_INT, gobject.TYPE_STRING, @@ -160,9 +168,11 @@ gobject.TYPE_INT, gobject.TYPE_BOOLEAN) self.db = db - self.xmms = xmms + self.set_sort_column_id(IMMSStore.COL_RATING, gtk.SORT_DESCENDING) def refresh(self): curtime = time.time() + col, order = self.get_sort_column_id() + self.set_sort_column_id(IMMSStore.COL_RATING, gtk.SORT_DESCENDING) tunes = self.db.get_ratings_and_info() self.clear() for tune in tunes: @@ -173,48 +183,70 @@ IMMSStore.COL_LAST_STR, strtime(curtime-tune['last']), IMMSStore.COL_LAST, tune['last'], IMMSStore.COL_SELECT, gtk.FALSE) - def _check_song_path(self, path, giter, song): - self.set(giter, 4, self.get_value(giter, 1) == song) - def set_current_song(self): - self.foreach(IMMSStore._check_song_path, self.xmms.get_current_file()) + self.set_sort_column_id(col, order) + def find_selection(self): + giter = self.get_iter_first() + while giter: + if self.get_value(giter, 4): + return self.get_path(giter) + giter = self.iter_next(giter) + return None + def find_song_path(self, song): + giter = self.get_iter_first() + while giter: + if self.get_value(giter, 1) == song: + return self.get_path(giter) + giter = self.iter_next(giter) + return None class IMMSView(gtk.TreeView): - def __init__(self, model, xmms): + def __init__(self, model): gtk.TreeView.__init__(self, model) self.create_widgets() def create_widgets(self): renderer = gtk.CellRendererText() renderer.set_property('weight', 700) - # renderer.connect('double-clicked', on_clicked) column = gtk.TreeViewColumn(_("Rating"), renderer, weight_set = IMMSStore.COL_SELECT, text = IMMSStore.COL_RATING) column.set_sort_column_id(IMMSStore.COL_RATING) self.append_column(column) + column = gtk.TreeViewColumn(_("Last"), renderer, + weight_set = IMMSStore.COL_SELECT, + text = IMMSStore.COL_LAST_STR) + column.set_sort_column_id(IMMSStore.COL_LAST) + self.append_column(column) column = gtk.TreeViewColumn(_("File"), renderer, weight_set = IMMSStore.COL_SELECT, text = IMMSStore.COL_PATH) column.set_resizable(gtk.TRUE) column.set_sort_column_id(IMMSStore.COL_PATH) - column.set_clickable(gtk.TRUE) - self.append_column(column) - column = gtk.TreeViewColumn(_("Last"), renderer, - weight_set = IMMSStore.COL_SELECT, - text = IMMSStore.COL_LAST_STR) - column.set_sort_column_id(IMMSStore.COL_LAST) self.append_column(column) self.set_search_column(IMMSStore.COL_PATH) self.set_headers_clickable(gtk.TRUE) - def get_selected(self): + def set_current_song(self, song): + model = self.get_model() + gpath = model.find_selection() + if gpath: + giter = model.get_iter(gpath) + model.set_value(giter, IMMSStore.COL_SELECT, gtk.FALSE) + gpath = model.find_song_path(song) + if gpath: + giter = model.get_iter(gpath) + model.set_value(giter, IMMSStore.COL_SELECT, gtk.TRUE) + self.set_cursor(gpath) + def get_file_selected(self): model, giter = self.get_selection().get_selected() - return model.get_value(giter, IMMSStore.COL_PATH) + if giter: + return model.get_value(giter, IMMSStore.COL_PATH) + return None class IMMSToolbar(gtk.Toolbar): - def __init__(self): - gtk.Toolbar.__init__(self) - self.refresh_command = None - self.select_command = None - self.create_widgets() + def __init__(self, iview, xmms): + gtk.Toolbar.__init__(self) + self.iview = iview + self.xmms = xmms + self.create_widgets() def create_widgets(self): self.append_item(_('Refresh'), _('Refresh list'), None, None, self.do_refresh) @@ -222,14 +254,19 @@ None, None, self.plot) self.append_item(_('Current'), _('Get current song'), None, None, self.do_get_current) + self.append_item(_('Play'), _('Play selection'), + None, None, self.do_play) def plot(self, data): - os.system('/home/fabien/bin/immsplot &') + os.system('/home/fabien/bin/immsplot &') def do_refresh(self, data): - if (self.refresh_command): - self.refresh_command() + self.iview.get_model().refresh() def do_get_current(self, data): - if (self.get_current): - self.get_current() + song = self.xmms.get_current_file() + self.iview.set_current_song(song) + def do_play(self, data): + fn = self.iview.get_file_selected() + if fn: + self.xmms.play_file(fn) root = gtk.Window() root.set_name(_("IMMSview")) @@ -237,20 +274,17 @@ vbox = gtk.VBox(spacing = 3) root.add(vbox) vbox.show() -xmms_control = XMMSControl() -model = IMMSStore(IMMSDb(), xmms_control) -iview = IMMSView(model, xmms_control) +model = IMMSStore(IMMSDb()) +iview = IMMSView(model) scroll = gtk.ScrolledWindow() scroll.add(iview) vbox.pack_end(scroll) iview.show() scroll.show() -toolbar = IMMSToolbar() -toolbar.refresh_command = model.refresh -toolbar.get_current = model.set_current_song +toolbar = IMMSToolbar(iview, XMMSControl()) vbox.pack_start(toolbar, expand = gtk.FALSE) toolbar.show() root.show() -model.refresh() -model.set_current_song() +toolbar.do_refresh(None) +toolbar.do_get_current(None) gtk.main()