--- 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()