[svn] Premi��re version de immsview. immsview
authorfabien
Sat, 31 Jan 2004 22:05:25 -0500
branchimmsview
changeset 0 fab56cacf4bc
child 1 a445a5e6c775
[svn] Premi��re version de immsview.
immsview
immsview.glade
immsview.gladep
--- /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>