[svn] All functions are now implemented (with a somewhat "cleaner" interface. immsview
authorfabien
Mon, 02 Feb 2004 01:44:10 -0500
branchimmsview
changeset 7 c5c0a84bb15b
parent 6 ad5b932e411d
child 8 9aa8b1c884e7
[svn] All functions are now implemented (with a somewhat "cleaner" interface.
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()