[svn] Premi��re version de immsview.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/immsview Sat Jan 31 22:05:25 2004 -0500
@@ -0,0 +1,125 @@
+#!/usr/bin/python
+
+# Copyright (C) 2004 by Fabien Ninoles
+
+# IMMSView is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# IMMSView is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with GNU Emacs; see the file COPYING. If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# TODO:
+# * IMMS:
+# - Add Artist, Title, SID, etc.
+# - Add composed rating
+# - Columns ordering (should pass to GTK probably for this).
+# - Rating edition
+# * XMMS:
+# - current song display
+# - selecting a song
+# - getting current playlist
+# - editing playlist
+# * File support:
+# - adding, deleting, suppressing a file (including updating other
+# interface).
+
+import sys
+import os
+import sqlite
+import Tkinter
+import ScrolledText
+import gettext
+
+gettext.bindtextdomain('immsview', '/usr/share/immsview/LANG')
+gettext.textdomain('immsview')
+_ = gettext.gettext
+
+_dbname = os.environ['HOME'] + '/.imms/imms.db'
+
+class IMMSDb:
+ def __init__(self):
+ self.cx = sqlite.connect(_dbname)
+ def commit(self):
+ self.cx.commit()
+ def get_ratings(self, min = 0, max = 250):
+ cu = self.cx.cursor()
+ cu.execute('''SELECT Rating.uid, Rating.rating
+ FROM Rating
+ WHERE Rating.rating >= %d
+ AND Rating.rating <= %d
+ ORDER BY Rating.rating;''' % (min, max))
+ return cu.fetchall()
+ def get_library_uid(self, uid):
+ cu = self.cx.cursor()
+ cu.execute('''SELECT Library.path
+ FROM Library
+ WHERE Library.uid = %d;''' % (uid,))
+ return cu.fetchone()
+ def get_library_by_path(self, path):
+ cu = self.cx.cursor()
+ cu.execute('''SELECT Library.uid, Library.sid
+ FROM Library
+ WHERE Library.path = '%s';''' % (path))
+
+class IMMSView(Tkinter.Frame):
+ def __init__(self, master = None):
+ Tkinter.Frame.__init__(self, master)
+ self.db = IMMSDb()
+ self.create_widgets()
+ def create_widgets(self):
+ lf = Tkinter.Frame(self)
+ lf.pack(expand = 1, fill = Tkinter.BOTH, side = Tkinter.LEFT)
+ self.lb = Tkinter.Listbox(lf, relief = Tkinter.RAISED)
+ self.lb.pack(expand = 1, side = Tkinter.TOP, fill = Tkinter.BOTH)
+ xsb = Tkinter.Scrollbar(lf, orient = Tkinter.HORIZONTAL)
+ xsb.pack({'fill' : Tkinter.X, 'side' : Tkinter.BOTTOM})
+ ysb = Tkinter.Scrollbar(self)
+ ysb.pack({'fill' : Tkinter.Y, 'side' : Tkinter.RIGHT})
+
+ ysb['command'] = self.lb.yview
+ xsb['command'] = self.lb.xview
+ self.lb['yscrollcommand'] = ysb.set
+ self.lb['xscrollcommand'] = xsb.set
+
+ self.refresh()
+ def refresh(self):
+ rates = self.db.get_ratings()
+ self.lb.delete(0,self.lb.size())
+ for rate in rates:
+ lib = self.db.get_library_uid(rate[0])
+ self.lb.insert(-1, "%4d - %s" % (rate[1], lib[0]))
+ self.db.commit()
+ self.lb.see(0)
+class IMMSToolbar(Tkinter.Frame):
+ def __init__(self, master = None):
+ Tkinter.Frame.__init__(self, master)
+ self.refresh_command = None
+ self.create_widgets()
+ def create_widgets(self):
+ button = Tkinter.Button(self, text = _('Refresh'),
+ command = self.do_refresh)
+ button.pack(side = Tkinter.LEFT)
+ button = Tkinter.Button(self, text = _('Plot'), command = self.plot)
+ button.pack(side = Tkinter.LEFT)
+ def plot():
+ os.system('exec immsplot &')
+ def do_refresh(self):
+ if (self.refresh_command):
+ self.refresh_command()
+
+root = Tkinter.Tk()
+iview = IMMSView(root)
+iview.pack(side = Tkinter.BOTTOM, expand = 1, fill = Tkinter.BOTH)
+toolbar = IMMSToolbar()
+toolbar.refresh_command = iview.refresh
+toolbar.pack(side = Tkinter.TOP, fill = Tkinter.X)
+root.mainloop()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/immsview.glade Sat Jan 31 22:05:25 2004 -0500
@@ -0,0 +1,231 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
+
+<glade-interface>
+
+<widget class="GtkWindow" id="window1">
+ <property name="visible">True</property>
+ <property name="title" translatable="yes">window1</property>
+ <property name="type">GTK_WINDOW_TOPLEVEL</property>
+ <property name="window_position">GTK_WIN_POS_NONE</property>
+ <property name="modal">False</property>
+ <property name="resizable">True</property>
+ <property name="destroy_with_parent">False</property>
+
+ <child>
+ <widget class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkHandleBox" id="handlebox1">
+ <property name="visible">True</property>
+ <property name="shadow_type">GTK_SHADOW_OUT</property>
+ <property name="handle_position">GTK_POS_LEFT</property>
+ <property name="snap_edge">GTK_POS_TOP</property>
+
+ <child>
+ <widget class="GtkMenuBar" id="menubar1">
+ <property name="visible">True</property>
+
+ <child>
+ <widget class="GtkMenuItem" id="menuitem1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Fichier</property>
+ <property name="use_underline">True</property>
+
+ <child>
+ <widget class="GtkMenu" id="menu1">
+
+ <child>
+ <widget class="GtkImageMenuItem" id="nouveau1">
+ <property name="visible">True</property>
+ <property name="label">gtk-new</property>
+ <property name="use_stock">True</property>
+ <signal name="activate" handler="on_nouveau1_activate" last_modification_time="Tue, 27 Jan 2004 16:10:40 GMT"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="ouvrir1">
+ <property name="visible">True</property>
+ <property name="label">gtk-open</property>
+ <property name="use_stock">True</property>
+ <signal name="activate" handler="on_ouvrir1_activate" last_modification_time="Tue, 27 Jan 2004 16:10:40 GMT"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="enregistrer1">
+ <property name="visible">True</property>
+ <property name="label">gtk-save</property>
+ <property name="use_stock">True</property>
+ <signal name="activate" handler="on_enregistrer1_activate" last_modification_time="Tue, 27 Jan 2004 16:10:40 GMT"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="enregistrer_sous1">
+ <property name="visible">True</property>
+ <property name="label">gtk-save-as</property>
+ <property name="use_stock">True</property>
+ <signal name="activate" handler="on_enregistrer_sous1_activate" last_modification_time="Tue, 27 Jan 2004 16:10:40 GMT"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkSeparatorMenuItem" id="separatormenuitem1">
+ <property name="visible">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="quitter1">
+ <property name="visible">True</property>
+ <property name="label">gtk-quit</property>
+ <property name="use_stock">True</property>
+ <signal name="activate" handler="on_quitter1_activate" last_modification_time="Tue, 27 Jan 2004 16:10:40 GMT"/>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="menuitem2">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Édition</property>
+ <property name="use_underline">True</property>
+
+ <child>
+ <widget class="GtkMenu" id="menu2">
+
+ <child>
+ <widget class="GtkImageMenuItem" id="couper1">
+ <property name="visible">True</property>
+ <property name="label">gtk-cut</property>
+ <property name="use_stock">True</property>
+ <signal name="activate" handler="on_couper1_activate" last_modification_time="Tue, 27 Jan 2004 16:10:40 GMT"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="copier1">
+ <property name="visible">True</property>
+ <property name="label">gtk-copy</property>
+ <property name="use_stock">True</property>
+ <signal name="activate" handler="on_copier1_activate" last_modification_time="Tue, 27 Jan 2004 16:10:40 GMT"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="coller1">
+ <property name="visible">True</property>
+ <property name="label">gtk-paste</property>
+ <property name="use_stock">True</property>
+ <signal name="activate" handler="on_coller1_activate" last_modification_time="Tue, 27 Jan 2004 16:10:40 GMT"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="supprimer1">
+ <property name="visible">True</property>
+ <property name="label">gtk-delete</property>
+ <property name="use_stock">True</property>
+ <signal name="activate" handler="on_supprimer1_activate" last_modification_time="Tue, 27 Jan 2004 16:10:40 GMT"/>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="menuitem3">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Vue</property>
+ <property name="use_underline">True</property>
+
+ <child>
+ <widget class="GtkMenu" id="menu3">
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="menuitem4">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Aide</property>
+ <property name="use_underline">True</property>
+
+ <child>
+ <widget class="GtkMenu" id="menu4">
+
+ <child>
+ <widget class="GtkMenuItem" id="À_propos1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">À _propos</property>
+ <property name="use_underline">True</property>
+ <signal name="activate" handler="on_À_propos1_activate" last_modification_time="Tue, 27 Jan 2004 16:10:40 GMT"/>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkScrolledWindow" id="scrolledwindow1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">GTK_POLICY_ALWAYS</property>
+ <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
+ <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+ <child>
+ <widget class="GtkTreeView" id="treeview1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="headers_visible">True</property>
+ <property name="rules_hint">False</property>
+ <property name="reorderable">False</property>
+ <property name="enable_search">True</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkStatusbar" id="statusbar1">
+ <property name="visible">True</property>
+ <property name="has_resize_grip">True</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+</widget>
+
+</glade-interface>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/immsview.gladep Sat Jan 31 22:05:25 2004 -0500
@@ -0,0 +1,8 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-project SYSTEM "http://glade.gnome.org/glade-project-2.0.dtd">
+
+<glade-project>
+ <name>Immsview</name>
+ <program_name>immsview</program_name>
+ <gnome_support>FALSE</gnome_support>
+</glade-project>