| author | fabien | 
| Sat, 07 Feb 2004 00:30:40 -0500 | |
| branch | immsview | 
| changeset 27 | 9ac26f2f83e1 | 
| parent 26 | 76768c12aa04 | 
| child 28 | 7f61cb2ddb7b | 
| permissions | -rwxr-xr-x | 
| 0 | 1  | 
#!/usr/bin/python  | 
2  | 
||
3  | 
# Copyright (C) 2004 by Fabien Ninoles  | 
|
4  | 
||
| 3 | 5  | 
# IMMSView is aim to be a replacement to XMMS playlist editor  | 
6  | 
# with better support for IMMS plugin.  | 
|
7  | 
||
| 0 | 8  | 
# IMMSView is free software; you can redistribute it and/or modify  | 
9  | 
# it under the terms of the GNU General Public License as published by  | 
|
10  | 
# the Free Software Foundation; either version 2, or (at your option)  | 
|
11  | 
# any later version.  | 
|
12  | 
||
13  | 
# IMMSView is distributed in the hope that it will be useful,  | 
|
14  | 
# but WITHOUT ANY WARRANTY; without even the implied warranty of  | 
|
15  | 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  | 
|
16  | 
# GNU General Public License for more details.  | 
|
17  | 
||
18  | 
# You should have received a copy of the GNU General Public License  | 
|
19  | 
# along with GNU Emacs; see the file COPYING. If not, write to the  | 
|
20  | 
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,  | 
|
21  | 
# Boston, MA 02111-1307, USA.  | 
|
22  | 
||
| 
27
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
23  | 
_version_ = "$Id: immsview 1709 2004-02-07 05:30:40Z fabien $"  | 
| 
7
 
c5c0a84bb15b
[svn] All functions are now implemented (with a somewhat "cleaner" interface.
 
fabien 
parents: 
6 
diff
changeset
 | 
24  | 
|
| 
 
c5c0a84bb15b
[svn] All functions are now implemented (with a somewhat "cleaner" interface.
 
fabien 
parents: 
6 
diff
changeset
 | 
25  | 
# $Log$  | 
| 
27
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
26  | 
# Revision 1.27 2004/02/07 05:30:40 fabien  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
27  | 
# Now three updating function. (see IMMSStore.__init__).  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
28  | 
# Currently, I'm better to replace everything. But eh, YMMV.  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
29  | 
#  | 
| 
26
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
30  | 
# Revision 1.26 2004/02/07 04:14:40 fabien  | 
| 
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
31  | 
# Display only distinct UID. The path selected is arbitrary, but  | 
| 
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
32  | 
# it's always the current one if Current is pressed.  | 
| 
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
33  | 
#  | 
| 25 | 34  | 
# Revision 1.25 2004/02/07 01:21:32 fabien  | 
35  | 
# Some typos... (better take a break now...)  | 
|
36  | 
#  | 
|
| 24 | 37  | 
# Revision 1.24 2004/02/07 01:18:41 fabien  | 
38  | 
# Better like a four colors gradient.  | 
|
39  | 
#  | 
|
| 22 | 40  | 
# Revision 1.23 2004/02/07 00:53:02 fabien  | 
41  | 
# Make a gradient of color instead...  | 
|
42  | 
# I'm not sure which one I prefer however.  | 
|
43  | 
#  | 
|
| 21 | 44  | 
# Revision 1.22 2004/02/06 06:10:49 fabien  | 
45  | 
# Add presentation page.  | 
|
46  | 
#  | 
|
| 20 | 47  | 
# Revision 1.21 2004/02/05 17:14:33 fabien  | 
48  | 
# Fix curtime until refresh.  | 
|
49  | 
#  | 
|
| 19 | 50  | 
# Revision 1.20 2004/02/05 15:46:17 fabien  | 
51  | 
# Remove the useless ORDER BY from the query for  | 
|
52  | 
# speed improvemennt (Doh!)  | 
|
53  | 
#  | 
|
| 18 | 54  | 
# Revision 1.19 2004/02/05 07:07:38 fabien  | 
55  | 
# Add some colors related to the rating.  | 
|
56  | 
#  | 
|
| 
17
 
bef598558a5b
[svn] Try to update the Last string dynamically... doesn't seem to work.
 
fabien 
parents: 
16 
diff
changeset
 | 
57  | 
# Revision 1.18 2004/02/04 22:21:47 fabien  | 
| 
 
bef598558a5b
[svn] Try to update the Last string dynamically... doesn't seem to work.
 
fabien 
parents: 
16 
diff
changeset
 | 
58  | 
# Try to update the Last string dynamically... doesn't seem to work.  | 
| 
 
bef598558a5b
[svn] Try to update the Last string dynamically... doesn't seem to work.
 
fabien 
parents: 
16 
diff
changeset
 | 
59  | 
#  | 
| 
16
 
894cac760e29
[svn] Update the current song.  This slow down thing a bit (any querying
 
fabien 
parents: 
15 
diff
changeset
 | 
60  | 
# Revision 1.17 2004/02/04 21:31:45 fabien  | 
| 
 
894cac760e29
[svn] Update the current song.  This slow down thing a bit (any querying
 
fabien 
parents: 
15 
diff
changeset
 | 
61  | 
# Update the current song. This slow down thing a bit (any querying  | 
| 
 
894cac760e29
[svn] Update the current song.  This slow down thing a bit (any querying
 
fabien 
parents: 
15 
diff
changeset
 | 
62  | 
# take one to 2 seconds... That's pity!) but it make sure that at least  | 
| 
 
894cac760e29
[svn] Update the current song.  This slow down thing a bit (any querying
 
fabien 
parents: 
15 
diff
changeset
 | 
63  | 
# this song is correct.  | 
| 
 
894cac760e29
[svn] Update the current song.  This slow down thing a bit (any querying
 
fabien 
parents: 
15 
diff
changeset
 | 
64  | 
#  | 
| 15 | 65  | 
# Revision 1.16 2004/02/04 20:20:40 fabien  | 
66  | 
# Used the default sort function (return 0).  | 
|
67  | 
#  | 
|
| 14 | 68  | 
# Revision 1.15 2004/02/04 05:46:57 fabien  | 
69  | 
# Add SQL quoting for path name.  | 
|
70  | 
#  | 
|
| 13 | 71  | 
# Revision 1.14 2004/02/03 21:50:28 fabien  | 
72  | 
# Update also on double click.  | 
|
73  | 
#  | 
|
| 
12
 
d275de5d2be2
[svn] Play selected: check if the file exist, elsewhere try to
 
fabien 
parents: 
11 
diff
changeset
 | 
74  | 
# Revision 1.13 2004/02/03 20:55:27 fabien  | 
| 
 
d275de5d2be2
[svn] Play selected: check if the file exist, elsewhere try to
 
fabien 
parents: 
11 
diff
changeset
 | 
75  | 
# Play selected: check if the file exist, elsewhere try to  | 
| 
 
d275de5d2be2
[svn] Play selected: check if the file exist, elsewhere try to
 
fabien 
parents: 
11 
diff
changeset
 | 
76  | 
# update it through the Db.  | 
| 
 
d275de5d2be2
[svn] Play selected: check if the file exist, elsewhere try to
 
fabien 
parents: 
11 
diff
changeset
 | 
77  | 
#  | 
| 
11
 
2913cf0e73e2
[svn] Add double click and remove sorting when refreshing data.
 
fabien 
parents: 
10 
diff
changeset
 | 
78  | 
# Revision 1.12 2004/02/03 18:50:03 fabien  | 
| 
 
2913cf0e73e2
[svn] Add double click and remove sorting when refreshing data.
 
fabien 
parents: 
10 
diff
changeset
 | 
79  | 
# Add double click and remove sorting when refreshing data.  | 
| 
 
2913cf0e73e2
[svn] Add double click and remove sorting when refreshing data.
 
fabien 
parents: 
10 
diff
changeset
 | 
80  | 
#  | 
| 
10
 
bc1c7546502a
[svn] Add a comment about the autocommit value in db.connect()
 
fabien 
parents: 
9 
diff
changeset
 | 
81  | 
# Revision 1.11 2004/02/02 15:45:25 fabien  | 
| 
 
bc1c7546502a
[svn] Add a comment about the autocommit value in db.connect()
 
fabien 
parents: 
9 
diff
changeset
 | 
82  | 
# Add a comment about the autocommit value in db.connect()  | 
| 
 
bc1c7546502a
[svn] Add a comment about the autocommit value in db.connect()
 
fabien 
parents: 
9 
diff
changeset
 | 
83  | 
#  | 
| 
9
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
84  | 
# Revision 1.10 2004/02/02 15:42:43 fabien  | 
| 
10
 
bc1c7546502a
[svn] Add a comment about the autocommit value in db.connect()
 
fabien 
parents: 
9 
diff
changeset
 | 
85  | 
# OK, reset current after changing song manually... however, I most  | 
| 
 
bc1c7546502a
[svn] Add a comment about the autocommit value in db.connect()
 
fabien 
parents: 
9 
diff
changeset
 | 
86  | 
# sleep for almost a second to be sure to catch it.  | 
| 
9
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
87  | 
#  | 
| 
8
 
9aa8b1c884e7
[svn] Add cvs log since I don't maintain a changelog currently.
 
fabien 
parents: 
7 
diff
changeset
 | 
88  | 
# Revision 1.9 2004/02/02 06:54:09 fabien  | 
| 
 
9aa8b1c884e7
[svn] Add cvs log since I don't maintain a changelog currently.
 
fabien 
parents: 
7 
diff
changeset
 | 
89  | 
# Add cvs log since I don't maintain a changelog currently.  | 
| 
 
9aa8b1c884e7
[svn] Add cvs log since I don't maintain a changelog currently.
 
fabien 
parents: 
7 
diff
changeset
 | 
90  | 
#  | 
| 
7
 
c5c0a84bb15b
[svn] All functions are now implemented (with a somewhat "cleaner" interface.
 
fabien 
parents: 
6 
diff
changeset
 | 
91  | 
# Revision 1.8 2004/02/02 06:44:10 fabien  | 
| 
 
c5c0a84bb15b
[svn] All functions are now implemented (with a somewhat "cleaner" interface.
 
fabien 
parents: 
6 
diff
changeset
 | 
92  | 
# All functions are now implemented (with a somewhat "cleaner" interface.  | 
| 
10
 
bc1c7546502a
[svn] Add a comment about the autocommit value in db.connect()
 
fabien 
parents: 
9 
diff
changeset
 | 
93  | 
#  | 
| 
8
 
9aa8b1c884e7
[svn] Add cvs log since I don't maintain a changelog currently.
 
fabien 
parents: 
7 
diff
changeset
 | 
94  | 
# Revision 1.7 2004/02/02 04:51:35 fabien  | 
| 
 
9aa8b1c884e7
[svn] Add cvs log since I don't maintain a changelog currently.
 
fabien 
parents: 
7 
diff
changeset
 | 
95  | 
# Switch to GTK2.  | 
| 
10
 
bc1c7546502a
[svn] Add a comment about the autocommit value in db.connect()
 
fabien 
parents: 
9 
diff
changeset
 | 
96  | 
#  | 
| 
8
 
9aa8b1c884e7
[svn] Add cvs log since I don't maintain a changelog currently.
 
fabien 
parents: 
7 
diff
changeset
 | 
97  | 
# Revision 1.6 2004/02/01 17:21:02 fabien  | 
| 
 
9aa8b1c884e7
[svn] Add cvs log since I don't maintain a changelog currently.
 
fabien 
parents: 
7 
diff
changeset
 | 
98  | 
# Add play selected song.  | 
| 
10
 
bc1c7546502a
[svn] Add a comment about the autocommit value in db.connect()
 
fabien 
parents: 
9 
diff
changeset
 | 
99  | 
#  | 
| 
8
 
9aa8b1c884e7
[svn] Add cvs log since I don't maintain a changelog currently.
 
fabien 
parents: 
7 
diff
changeset
 | 
100  | 
# Revision 1.5 2004/02/01 16:22:40 fabien  | 
| 
 
9aa8b1c884e7
[svn] Add cvs log since I don't maintain a changelog currently.
 
fabien 
parents: 
7 
diff
changeset
 | 
101  | 
# Add title.  | 
| 
10
 
bc1c7546502a
[svn] Add a comment about the autocommit value in db.connect()
 
fabien 
parents: 
9 
diff
changeset
 | 
102  | 
#  | 
| 
8
 
9aa8b1c884e7
[svn] Add cvs log since I don't maintain a changelog currently.
 
fabien 
parents: 
7 
diff
changeset
 | 
103  | 
# Revision 1.4 2004/02/01 16:12:45 fabien  | 
| 
 
9aa8b1c884e7
[svn] Add cvs log since I don't maintain a changelog currently.
 
fabien 
parents: 
7 
diff
changeset
 | 
104  | 
# Add current and correct plot function.  | 
| 
10
 
bc1c7546502a
[svn] Add a comment about the autocommit value in db.connect()
 
fabien 
parents: 
9 
diff
changeset
 | 
105  | 
#  | 
| 
8
 
9aa8b1c884e7
[svn] Add cvs log since I don't maintain a changelog currently.
 
fabien 
parents: 
7 
diff
changeset
 | 
106  | 
# Revision 1.3 2004/02/01 15:59:04 fabien  | 
| 
 
9aa8b1c884e7
[svn] Add cvs log since I don't maintain a changelog currently.
 
fabien 
parents: 
7 
diff
changeset
 | 
107  | 
# Adding xmms selection and last display.  | 
| 
10
 
bc1c7546502a
[svn] Add a comment about the autocommit value in db.connect()
 
fabien 
parents: 
9 
diff
changeset
 | 
108  | 
#  | 
| 
8
 
9aa8b1c884e7
[svn] Add cvs log since I don't maintain a changelog currently.
 
fabien 
parents: 
7 
diff
changeset
 | 
109  | 
# Revision 1.2 2004/02/01 04:40:41 fabien  | 
| 
 
9aa8b1c884e7
[svn] Add cvs log since I don't maintain a changelog currently.
 
fabien 
parents: 
7 
diff
changeset
 | 
110  | 
# add versioning.  | 
| 
10
 
bc1c7546502a
[svn] Add a comment about the autocommit value in db.connect()
 
fabien 
parents: 
9 
diff
changeset
 | 
111  | 
#  | 
| 
8
 
9aa8b1c884e7
[svn] Add cvs log since I don't maintain a changelog currently.
 
fabien 
parents: 
7 
diff
changeset
 | 
112  | 
# Revision 1.1 2004/02/01 03:05:25 fabien  | 
| 
9
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
113  | 
# Premiere version de immsview.  | 
| 
7
 
c5c0a84bb15b
[svn] All functions are now implemented (with a somewhat "cleaner" interface.
 
fabien 
parents: 
6 
diff
changeset
 | 
114  | 
|
| 3 | 115  | 
# The aim of immsview is to become a better playlist editor than the  | 
116  | 
# normal  | 
|
117  | 
||
| 0 | 118  | 
# TODO:  | 
119  | 
# * IMMS:  | 
|
120  | 
# - Add composed rating  | 
|
121  | 
# - Rating edition  | 
|
| 
26
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
122  | 
# - SID grouping  | 
| 
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
123  | 
# - UID grouping!!! (yes, you can have different path with the same UID)  | 
| 0 | 124  | 
# * XMMS:  | 
125  | 
# - getting current playlist  | 
|
126  | 
# - editing playlist  | 
|
127  | 
# * File support:  | 
|
128  | 
# - adding, deleting, suppressing a file (including updating other  | 
|
129  | 
# interface).  | 
|
| 
7
 
c5c0a84bb15b
[svn] All functions are now implemented (with a somewhat "cleaner" interface.
 
fabien 
parents: 
6 
diff
changeset
 | 
130  | 
# - artist, title, genre informations (ID3)  | 
| 
 
c5c0a84bb15b
[svn] All functions are now implemented (with a somewhat "cleaner" interface.
 
fabien 
parents: 
6 
diff
changeset
 | 
131  | 
# * Interface:  | 
| 
 
c5c0a84bb15b
[svn] All functions are now implemented (with a somewhat "cleaner" interface.
 
fabien 
parents: 
6 
diff
changeset
 | 
132  | 
# - Real application interface (with menu, icons, accelerators, etc.)  | 
| 0 | 133  | 
|
| 6 | 134  | 
import pygtk  | 
135  | 
pygtk.require('2.0')
 | 
|
136  | 
||
| 0 | 137  | 
import sys  | 
138  | 
import os  | 
|
139  | 
import sqlite  | 
|
| 6 | 140  | 
import gobject  | 
141  | 
import gtk  | 
|
142  | 
import gtk.glade  | 
|
| 0 | 143  | 
import gettext  | 
| 2 | 144  | 
import xmms.control  | 
145  | 
import time  | 
|
| 0 | 146  | 
|
| 6 | 147  | 
gtk.glade.bindtextdomain('immsview', '/usr/share/immsview/LANG')
 | 
148  | 
gtk.glade.textdomain('immsview')
 | 
|
| 0 | 149  | 
_ = gettext.gettext  | 
150  | 
||
| 2 | 151  | 
def strtime(seconds):  | 
152  | 
secs = abs(round(seconds))  | 
|
153  | 
minutes = secs / 60;  | 
|
154  | 
hours = minutes / 60;  | 
|
155  | 
days = hours / 24;  | 
|
156  | 
secs = secs % 60;  | 
|
157  | 
minutes %= 60;  | 
|
158  | 
hours %= 24;  | 
|
159  | 
||
160  | 
if seconds < 0:  | 
|
161  | 
s = "-"  | 
|
162  | 
else:  | 
|
163  | 
s = ""  | 
|
164  | 
if days >= 1:  | 
|
165  | 
s += "%dd %dh" % (days, hours)  | 
|
166  | 
elif hours >= 1:  | 
|
167  | 
s += "%dh%02d" % (hours, minutes)  | 
|
168  | 
elif minutes >= 1:  | 
|
169  | 
s += "%d'%02d\"" % (minutes, secs)  | 
|
170  | 
else:  | 
|
171  | 
s += "%d\"" % (secs)  | 
|
172  | 
return s  | 
|
173  | 
||
| 5 | 174  | 
class XMMSControl:  | 
175  | 
def __getattr__(self, name):  | 
|
176  | 
return xmms.control.__dict__[name]  | 
|
177  | 
def get_current_file(self):  | 
|
178  | 
return self.get_playlist_file(  | 
|
179  | 
self.get_playlist_pos())  | 
|
180  | 
def find_in_playlist(self, filename):  | 
|
181  | 
for idx in range(self.get_playlist_length()):  | 
|
182  | 
if filename == self.get_playlist_file(idx):  | 
|
183  | 
return idx  | 
|
184  | 
return -1  | 
|
185  | 
def play_file(self, filename):  | 
|
186  | 
idx = self.find_in_playlist(filename)  | 
|
187  | 
if idx == -1:  | 
|
188  | 
self.enqueue_and_play((filename,))  | 
|
189  | 
else:  | 
|
190  | 
self.set_playlist_pos(idx)  | 
|
| 2 | 191  | 
|
| 14 | 192  | 
def quote_sql(str):  | 
193  | 
    return str.replace("'", "''")
 | 
|
194  | 
||
| 0 | 195  | 
class IMMSDb:  | 
| 6 | 196  | 
_dbname = os.environ['HOME'] + '/.imms/imms.db'  | 
197  | 
# _dbname = os.environ['HOME'] + '/.imms/imms.backup.db'  | 
|
198  | 
def __init__(self):  | 
|
| 
10
 
bc1c7546502a
[svn] Add a comment about the autocommit value in db.connect()
 
fabien 
parents: 
9 
diff
changeset
 | 
199  | 
# autocommit = 1 disable autocommit!  | 
| 
9
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
200  | 
self.cx = sqlite.connect(IMMSDb._dbname, autocommit = 1,  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
201  | 
                                 timeout = 2, encoding = ('utf-8', 'replace'))
 | 
| 6 | 202  | 
def commit(self):  | 
| 
9
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
203  | 
# self.cx.commit()  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
204  | 
pass  | 
| 6 | 205  | 
def _get_ratings(self, min = 0, max = 250):  | 
206  | 
cu = self.cx.cursor()  | 
|
207  | 
        cu.execute('''SELECT Rating.uid, Rating.rating 
 | 
|
208  | 
FROM Rating  | 
|
209  | 
WHERE Rating.rating >= %d  | 
|
210  | 
AND Rating.rating <= %d  | 
|
211  | 
ORDER BY Rating.rating;''' % (min, max))  | 
|
212  | 
return cu.fetchall()  | 
|
213  | 
def _get_library_uid(self, uid):  | 
|
214  | 
cu = self.cx.cursor()  | 
|
215  | 
        cu.execute('''SELECT Library.path
 | 
|
216  | 
FROM Library  | 
|
217  | 
WHERE Library.uid = %d;''' % (uid,))  | 
|
218  | 
return cu.fetchone()  | 
|
| 13 | 219  | 
def get_uid_by_path(self, path):  | 
| 6 | 220  | 
cu = self.cx.cursor()  | 
| 14 | 221  | 
        cu.execute("""SELECT Library.uid FROM Library
 | 
222  | 
WHERE Library.path = '%s';""" % quote_sql(path))  | 
|
| 
16
 
894cac760e29
[svn] Update the current song.  This slow down thing a bit (any querying
 
fabien 
parents: 
15 
diff
changeset
 | 
223  | 
return map(lambda x: x[0], cu.fetchall())  | 
| 
12
 
d275de5d2be2
[svn] Play selected: check if the file exist, elsewhere try to
 
fabien 
parents: 
11 
diff
changeset
 | 
224  | 
def get_ratings_and_info(self, uids = None):  | 
| 
11
 
2913cf0e73e2
[svn] Add double click and remove sorting when refreshing data.
 
fabien 
parents: 
10 
diff
changeset
 | 
225  | 
print time.ctime(time.time()) + ": querying"  | 
| 6 | 226  | 
cu = self.cx.cursor()  | 
| 19 | 227  | 
qry = '''SELECT l.uid, r.rating, l.path, ls.last  | 
228  | 
FROM Library l, Rating r, Last ls  | 
|
229  | 
WHERE l.uid = r.uid AND l.sid = ls.sid'''  | 
|
| 
12
 
d275de5d2be2
[svn] Play selected: check if the file exist, elsewhere try to
 
fabien 
parents: 
11 
diff
changeset
 | 
230  | 
if uids:  | 
| 19 | 231  | 
qry += ' AND (l.uid = %d' % (uids.pop())  | 
| 
12
 
d275de5d2be2
[svn] Play selected: check if the file exist, elsewhere try to
 
fabien 
parents: 
11 
diff
changeset
 | 
232  | 
for uid in uids:  | 
| 19 | 233  | 
qry += ' OR l.uid = %d' % uid  | 
234  | 
qry += ')'  | 
|
235  | 
qry += ';'  | 
|
| 
12
 
d275de5d2be2
[svn] Play selected: check if the file exist, elsewhere try to
 
fabien 
parents: 
11 
diff
changeset
 | 
236  | 
cu.execute(qry)  | 
| 6 | 237  | 
# Better to fetch everything since locking can really mess  | 
238  | 
# things in imms plugin.  | 
|
| 
11
 
2913cf0e73e2
[svn] Add double click and remove sorting when refreshing data.
 
fabien 
parents: 
10 
diff
changeset
 | 
239  | 
print time.ctime(time.time()) + ": mapping"  | 
| 
26
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
240  | 
	results = {}
 | 
| 
11
 
2913cf0e73e2
[svn] Add double click and remove sorting when refreshing data.
 
fabien 
parents: 
10 
diff
changeset
 | 
241  | 
tune = cu.fetchone()  | 
| 
 
2913cf0e73e2
[svn] Add double click and remove sorting when refreshing data.
 
fabien 
parents: 
10 
diff
changeset
 | 
242  | 
while tune:  | 
| 6 | 243  | 
try:  | 
| 
26
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
244  | 
uid = int(tune[0])  | 
| 
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
245  | 
if results.has_key(uid):  | 
| 
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
246  | 
results[uid]['path'].append(  | 
| 
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
247  | 
                        tune[2].decode('utf-8', 'replace'))
 | 
| 
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
248  | 
else:  | 
| 
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
249  | 
                    results[uid] = {
 | 
| 
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
250  | 
'rating' : int(tune[1]),  | 
| 
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
251  | 
                        'path' : [ tune[2].decode('utf-8', 'replace') ],
 | 
| 
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
252  | 
'last' : int(tune[3])}  | 
| 6 | 253  | 
except UnicodeDecodeError:  | 
254  | 
print tune[2]  | 
|
| 
11
 
2913cf0e73e2
[svn] Add double click and remove sorting when refreshing data.
 
fabien 
parents: 
10 
diff
changeset
 | 
255  | 
tune = cu.fetchone()  | 
| 6 | 256  | 
return results  | 
257  | 
||
| 22 | 258  | 
_gdk_colors = []  | 
| 24 | 259  | 
for i in range(76):  | 
260  | 
if i <= 25:  | 
|
261  | 
red = 255  | 
|
| 25 | 262  | 
green = i * 255 / 25  | 
| 24 | 263  | 
blue = 0  | 
264  | 
elif i <= 50:  | 
|
265  | 
red = (50-i) * 255 / 25  | 
|
| 22 | 266  | 
green = 255  | 
| 24 | 267  | 
blue = 0  | 
| 22 | 268  | 
else:  | 
| 25 | 269  | 
red = 0  | 
| 24 | 270  | 
green = 255  | 
271  | 
blue = (i-50) * 255 / 25  | 
|
| 22 | 272  | 
    _gdk_colors.append("#%02X%02X%02X" % (red, green, blue))
 | 
273  | 
||
| 18 | 274  | 
def rating_to_color(rate):  | 
| 22 | 275  | 
rate = min(max(rate,75),150)  | 
276  | 
return _gdk_colors[rate-75]  | 
|
| 18 | 277  | 
|
| 
27
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
278  | 
# This class must be derived from a GtkTreeModel  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
279  | 
# with persistent GtkTreeIter !!!  | 
| 6 | 280  | 
class IMMSStore(gtk.ListStore):  | 
281  | 
COL_RATING = 0  | 
|
282  | 
COL_PATH = 1  | 
|
283  | 
COL_LAST_STR = 2  | 
|
284  | 
COL_LAST = 3  | 
|
285  | 
COL_SELECT = 4  | 
|
| 
12
 
d275de5d2be2
[svn] Play selected: check if the file exist, elsewhere try to
 
fabien 
parents: 
11 
diff
changeset
 | 
286  | 
COL_UID = 5  | 
| 18 | 287  | 
COL_RATING_COLOR = 6  | 
| 
7
 
c5c0a84bb15b
[svn] All functions are now implemented (with a somewhat "cleaner" interface.
 
fabien 
parents: 
6 
diff
changeset
 | 
288  | 
def __init__(self, db):  | 
| 6 | 289  | 
gtk.ListStore.__init__(self,  | 
290  | 
gobject.TYPE_INT,  | 
|
291  | 
gobject.TYPE_STRING,  | 
|
292  | 
gobject.TYPE_STRING,  | 
|
293  | 
gobject.TYPE_INT,  | 
|
| 
12
 
d275de5d2be2
[svn] Play selected: check if the file exist, elsewhere try to
 
fabien 
parents: 
11 
diff
changeset
 | 
294  | 
gobject.TYPE_BOOLEAN,  | 
| 18 | 295  | 
gobject.TYPE_INT,  | 
296  | 
gobject.TYPE_STRING,  | 
|
297  | 
)  | 
|
| 6 | 298  | 
self.db = db  | 
| 15 | 299  | 
self.set_default_sort_func(self.default_sort)  | 
| 19 | 300  | 
self.set_sort_column_id(IMMSStore.COL_RATING, gtk.SORT_DESCENDING)  | 
| 20 | 301  | 
self.curtime = time.time()  | 
| 
27
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
302  | 
# Only refresh last and rating. 6 / 17  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
303  | 
# self._update_me = self.refresh  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
304  | 
# Try to recycle old giter. 6 / 11  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
305  | 
# self._update_me = self.recycle  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
306  | 
# Replace everything. 6 / 7  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
307  | 
self._update_me = self.replace  | 
| 
11
 
2913cf0e73e2
[svn] Add double click and remove sorting when refreshing data.
 
fabien 
parents: 
10 
diff
changeset
 | 
308  | 
def default_sort(self, a, b, dummy):  | 
| 
 
2913cf0e73e2
[svn] Add double click and remove sorting when refreshing data.
 
fabien 
parents: 
10 
diff
changeset
 | 
309  | 
return 0  | 
| 
27
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
310  | 
def tune_to_giter(self, uid, tune, path = None, giter = None):  | 
| 
26
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
311  | 
if path:  | 
| 
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
312  | 
for fn in tune['path']:  | 
| 
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
313  | 
if fn == path:  | 
| 
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
314  | 
break  | 
| 
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
315  | 
else:  | 
| 
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
316  | 
fn = tune['path'][0]  | 
| 
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
317  | 
else:  | 
| 
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
318  | 
fn = tune['path'][0]  | 
| 
12
 
d275de5d2be2
[svn] Play selected: check if the file exist, elsewhere try to
 
fabien 
parents: 
11 
diff
changeset
 | 
319  | 
if not giter:  | 
| 
 
d275de5d2be2
[svn] Play selected: check if the file exist, elsewhere try to
 
fabien 
parents: 
11 
diff
changeset
 | 
320  | 
giter = self.append(None)  | 
| 
 
d275de5d2be2
[svn] Play selected: check if the file exist, elsewhere try to
 
fabien 
parents: 
11 
diff
changeset
 | 
321  | 
self.set(giter,  | 
| 
26
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
322  | 
IMMSStore.COL_UID, uid,  | 
| 
12
 
d275de5d2be2
[svn] Play selected: check if the file exist, elsewhere try to
 
fabien 
parents: 
11 
diff
changeset
 | 
323  | 
IMMSStore.COL_RATING, tune['rating'],  | 
| 
26
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
324  | 
IMMSStore.COL_PATH, fn,  | 
| 
12
 
d275de5d2be2
[svn] Play selected: check if the file exist, elsewhere try to
 
fabien 
parents: 
11 
diff
changeset
 | 
325  | 
IMMSStore.COL_LAST, tune['last'],  | 
| 20 | 326  | 
IMMSStore.COL_LAST_STR, strtime(self.curtime-tune['last']),  | 
| 18 | 327  | 
IMMSStore.COL_RATING_COLOR, rating_to_color(tune['rating']),  | 
| 
12
 
d275de5d2be2
[svn] Play selected: check if the file exist, elsewhere try to
 
fabien 
parents: 
11 
diff
changeset
 | 
328  | 
IMMSStore.COL_SELECT, gtk.FALSE)  | 
| 13 | 329  | 
return giter  | 
| 
27
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
330  | 
def update(self):  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
331  | 
self.curtime = time  | 
| 20 | 332  | 
self.curtime = time.time()  | 
| 
7
 
c5c0a84bb15b
[svn] All functions are now implemented (with a somewhat "cleaner" interface.
 
fabien 
parents: 
6 
diff
changeset
 | 
333  | 
col, order = self.get_sort_column_id()  | 
| 
16
 
894cac760e29
[svn] Update the current song.  This slow down thing a bit (any querying
 
fabien 
parents: 
15 
diff
changeset
 | 
334  | 
if col:  | 
| 19 | 335  | 
self.set_sort_column_id(-1, gtk.SORT_ASCENDING)  | 
| 6 | 336  | 
tunes = self.db.get_ratings_and_info()  | 
| 
11
 
2913cf0e73e2
[svn] Add double click and remove sorting when refreshing data.
 
fabien 
parents: 
10 
diff
changeset
 | 
337  | 
print time.ctime(time.time()) + ": inserting"  | 
| 
27
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
338  | 
self._update_me(tunes)  | 
| 
11
 
2913cf0e73e2
[svn] Add double click and remove sorting when refreshing data.
 
fabien 
parents: 
10 
diff
changeset
 | 
339  | 
print time.ctime(time.time()) + ": end insert"  | 
| 
16
 
894cac760e29
[svn] Update the current song.  This slow down thing a bit (any querying
 
fabien 
parents: 
15 
diff
changeset
 | 
340  | 
if col:  | 
| 
 
894cac760e29
[svn] Update the current song.  This slow down thing a bit (any querying
 
fabien 
parents: 
15 
diff
changeset
 | 
341  | 
self.set_sort_column_id(col, order)  | 
| 
27
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
342  | 
def replace(self, tunes):  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
343  | 
"replace simply replace all giter with new one"  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
344  | 
self.clear()  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
345  | 
for uid, tune in tunes.iteritems():  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
346  | 
self.tune_to_giter(uid, tune)  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
347  | 
def recycle(self, tunes):  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
348  | 
"Recycle old giter, replacing old data."  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
349  | 
giter = self.get_iter_first()  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
350  | 
for uid, tune in tunes.iteritems():  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
351  | 
self.tune_to_giter(uid, tune, giter = giter)  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
352  | 
if giter:  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
353  | 
giter = self.iter_next(giter)  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
354  | 
while giter:  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
355  | 
next = self.iter_next(giter)  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
356  | 
self.remove(giter)  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
357  | 
giter = next  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
358  | 
def refresh(self, tunes):  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
359  | 
"refresh only get new data and update last time and rating."  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
360  | 
freed_giters = []  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
361  | 
# first, try to recycle current giter.  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
362  | 
giter = self.get_iter_first()  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
363  | 
while giter:  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
364  | 
# check if giter exist in DB.  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
365  | 
guid = self.get_value(giter, IMMSStore.COL_UID)  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
366  | 
if tunes.has_key(guid):  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
367  | 
tune = tunes[guid]  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
368  | 
self.set(giter,  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
369  | 
IMMSStore.COL_RATING, tune['rating'],  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
370  | 
IMMSStore.COL_LAST, tune['last'],  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
371  | 
IMMSStore.COL_LAST_STR,  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
372  | 
strtime(self.curtime-tune['last']),  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
373  | 
IMMSStore.COL_RATING_COLOR,  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
374  | 
rating_to_color(tune['rating']))  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
375  | 
else:  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
376  | 
# Elsewhere, collect them for further use...  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
377  | 
# Hopefully, ListStore have persistent giter!  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
378  | 
freed_giters.append(giter)  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
379  | 
giter = self.iter_next(giter)  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
380  | 
# populate the remeaning tunes into the collected giters  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
381  | 
for uid, tune in tunes.iteritems():  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
382  | 
if len(freed_giters) > 0:  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
383  | 
giter = freed_giters.pop()  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
384  | 
else:  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
385  | 
giter = None  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
386  | 
self.tune_to_giter(uid, tune, None, giter)  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
387  | 
# then erase the remeaning giter.  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
388  | 
for giter in freed_giters:  | 
| 
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
389  | 
self.remove(giter)  | 
| 13 | 390  | 
def find_selected_giter(self):  | 
391  | 
giter = self.get_iter_first()  | 
|
392  | 
while giter:  | 
|
393  | 
if self.get_value(giter, IMMSStore.COL_SELECT):  | 
|
394  | 
break  | 
|
395  | 
giter = self.iter_next(giter)  | 
|
396  | 
return giter  | 
|
397  | 
def find_giter_from_uid(self, uid):  | 
|
| 
7
 
c5c0a84bb15b
[svn] All functions are now implemented (with a somewhat "cleaner" interface.
 
fabien 
parents: 
6 
diff
changeset
 | 
398  | 
giter = self.get_iter_first()  | 
| 
 
c5c0a84bb15b
[svn] All functions are now implemented (with a somewhat "cleaner" interface.
 
fabien 
parents: 
6 
diff
changeset
 | 
399  | 
while giter:  | 
| 13 | 400  | 
if self.get_value(giter, IMMSStore.COL_UID) == uid:  | 
401  | 
break  | 
|
| 
7
 
c5c0a84bb15b
[svn] All functions are now implemented (with a somewhat "cleaner" interface.
 
fabien 
parents: 
6 
diff
changeset
 | 
402  | 
giter = self.iter_next(giter)  | 
| 13 | 403  | 
return giter  | 
404  | 
def find_giter_from_path(self, song):  | 
|
405  | 
uids = self.db.get_uid_by_path(song)  | 
|
406  | 
if len(uids) == 0:  | 
|
407  | 
return None  | 
|
408  | 
uid = uids[0]  | 
|
| 
16
 
894cac760e29
[svn] Update the current song.  This slow down thing a bit (any querying
 
fabien 
parents: 
15 
diff
changeset
 | 
409  | 
giter = self.find_giter_from_uid(uid)  | 
| 13 | 410  | 
if not giter:  | 
| 
26
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
411  | 
tunes = self.db.get_ratings_and_info([uid])  | 
| 
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
412  | 
if tunes > 0:  | 
| 
27
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
413  | 
giter = self.tune_to_giter(uid, tunes[uid], song)  | 
| 
16
 
894cac760e29
[svn] Update the current song.  This slow down thing a bit (any querying
 
fabien 
parents: 
15 
diff
changeset
 | 
414  | 
else:  | 
| 
26
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
415  | 
giter = self.update_giter(giter, song)  | 
| 13 | 416  | 
return giter  | 
| 
26
 
76768c12aa04
[svn] Display only distinct UID.  The path selected is arbitrary, but
 
fabien 
parents: 
25 
diff
changeset
 | 
417  | 
def update_giter(self, giter, path = None):  | 
| 
12
 
d275de5d2be2
[svn] Play selected: check if the file exist, elsewhere try to
 
fabien 
parents: 
11 
diff
changeset
 | 
418  | 
uid = self.get_value(giter, IMMSStore.COL_UID)  | 
| 
 
d275de5d2be2
[svn] Play selected: check if the file exist, elsewhere try to
 
fabien 
parents: 
11 
diff
changeset
 | 
419  | 
tunes = self.db.get_ratings_and_info([uid,])  | 
| 13 | 420  | 
if len(tunes) > 0:  | 
| 
27
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
421  | 
return self.tune_to_giter(uid, tunes[uid], path, giter)  | 
| 
12
 
d275de5d2be2
[svn] Play selected: check if the file exist, elsewhere try to
 
fabien 
parents: 
11 
diff
changeset
 | 
422  | 
return giter  | 
| 
17
 
bef598558a5b
[svn] Try to update the Last string dynamically... doesn't seem to work.
 
fabien 
parents: 
16 
diff
changeset
 | 
423  | 
## def get_value(self, giter, col):  | 
| 18 | 424  | 
## # sniff! Can't override built-ins  | 
| 
17
 
bef598558a5b
[svn] Try to update the Last string dynamically... doesn't seem to work.
 
fabien 
parents: 
16 
diff
changeset
 | 
425  | 
## if col == IMMSStore.COL_LAST_STR:  | 
| 18 | 426  | 
## return strtime(time.time() -  | 
427  | 
## self.get_value(giter, IMMSStore.COL_LAST))  | 
|
| 
17
 
bef598558a5b
[svn] Try to update the Last string dynamically... doesn't seem to work.
 
fabien 
parents: 
16 
diff
changeset
 | 
428  | 
## else:  | 
| 18 | 429  | 
## return gtk.ListStore.get_value(self, giter, col)  | 
| 6 | 430  | 
|
431  | 
class IMMSView(gtk.TreeView):  | 
|
| 
11
 
2913cf0e73e2
[svn] Add double click and remove sorting when refreshing data.
 
fabien 
parents: 
10 
diff
changeset
 | 
432  | 
def __init__(self, model, xmms):  | 
| 6 | 433  | 
gtk.TreeView.__init__(self, model)  | 
| 
11
 
2913cf0e73e2
[svn] Add double click and remove sorting when refreshing data.
 
fabien 
parents: 
10 
diff
changeset
 | 
434  | 
self.xmms = xmms  | 
| 6 | 435  | 
self.create_widgets()  | 
436  | 
def create_widgets(self):  | 
|
437  | 
renderer = gtk.CellRendererText()  | 
|
438  | 
            renderer.set_property('weight', 700)
 | 
|
| 18 | 439  | 
            renderer.set_property('background-set', gtk.TRUE)
 | 
| 6 | 440  | 
            column = gtk.TreeViewColumn(_("Rating"), renderer,
 | 
441  | 
weight_set = IMMSStore.COL_SELECT,  | 
|
| 18 | 442  | 
background = IMMSStore.COL_RATING_COLOR,  | 
| 6 | 443  | 
text = IMMSStore.COL_RATING)  | 
444  | 
column.set_sort_column_id(IMMSStore.COL_RATING)  | 
|
445  | 
self.append_column(column)  | 
|
| 18 | 446  | 
|
447  | 
renderer = gtk.CellRendererText()  | 
|
448  | 
            renderer.set_property('weight', 700)            
 | 
|
449  | 
            # renderer.set_property('background-set', gtk.FALSE)
 | 
|
| 
7
 
c5c0a84bb15b
[svn] All functions are now implemented (with a somewhat "cleaner" interface.
 
fabien 
parents: 
6 
diff
changeset
 | 
450  | 
            column = gtk.TreeViewColumn(_("Last"), renderer,
 | 
| 
 
c5c0a84bb15b
[svn] All functions are now implemented (with a somewhat "cleaner" interface.
 
fabien 
parents: 
6 
diff
changeset
 | 
451  | 
weight_set = IMMSStore.COL_SELECT,  | 
| 
 
c5c0a84bb15b
[svn] All functions are now implemented (with a somewhat "cleaner" interface.
 
fabien 
parents: 
6 
diff
changeset
 | 
452  | 
text = IMMSStore.COL_LAST_STR)  | 
| 
 
c5c0a84bb15b
[svn] All functions are now implemented (with a somewhat "cleaner" interface.
 
fabien 
parents: 
6 
diff
changeset
 | 
453  | 
column.set_sort_column_id(IMMSStore.COL_LAST)  | 
| 
 
c5c0a84bb15b
[svn] All functions are now implemented (with a somewhat "cleaner" interface.
 
fabien 
parents: 
6 
diff
changeset
 | 
454  | 
self.append_column(column)  | 
| 6 | 455  | 
            column = gtk.TreeViewColumn(_("File"), renderer,
 | 
456  | 
weight_set = IMMSStore.COL_SELECT,  | 
|
457  | 
text = IMMSStore.COL_PATH)  | 
|
458  | 
column.set_resizable(gtk.TRUE)  | 
|
459  | 
column.set_sort_column_id(IMMSStore.COL_PATH)  | 
|
460  | 
self.append_column(column)  | 
|
461  | 
self.set_search_column(IMMSStore.COL_PATH)  | 
|
462  | 
self.set_headers_clickable(gtk.TRUE)  | 
|
| 
11
 
2913cf0e73e2
[svn] Add double click and remove sorting when refreshing data.
 
fabien 
parents: 
10 
diff
changeset
 | 
463  | 
            self.connect('row-activated', self.on_row_activated)
 | 
| 
7
 
c5c0a84bb15b
[svn] All functions are now implemented (with a somewhat "cleaner" interface.
 
fabien 
parents: 
6 
diff
changeset
 | 
464  | 
def set_current_song(self, song):  | 
| 
 
c5c0a84bb15b
[svn] All functions are now implemented (with a somewhat "cleaner" interface.
 
fabien 
parents: 
6 
diff
changeset
 | 
465  | 
model = self.get_model()  | 
| 13 | 466  | 
giter = model.find_selected_giter()  | 
467  | 
if giter:  | 
|
| 
16
 
894cac760e29
[svn] Update the current song.  This slow down thing a bit (any querying
 
fabien 
parents: 
15 
diff
changeset
 | 
468  | 
model.update_giter(giter)  | 
| 
7
 
c5c0a84bb15b
[svn] All functions are now implemented (with a somewhat "cleaner" interface.
 
fabien 
parents: 
6 
diff
changeset
 | 
469  | 
model.set_value(giter, IMMSStore.COL_SELECT, gtk.FALSE)  | 
| 13 | 470  | 
giter = model.find_giter_from_path(song)  | 
471  | 
if giter:  | 
|
| 
7
 
c5c0a84bb15b
[svn] All functions are now implemented (with a somewhat "cleaner" interface.
 
fabien 
parents: 
6 
diff
changeset
 | 
472  | 
model.set_value(giter, IMMSStore.COL_SELECT, gtk.TRUE)  | 
| 13 | 473  | 
self.set_cursor(model.get_path(giter))  | 
| 
12
 
d275de5d2be2
[svn] Play selected: check if the file exist, elsewhere try to
 
fabien 
parents: 
11 
diff
changeset
 | 
474  | 
def get_filename(self, giter):  | 
| 13 | 475  | 
model = self.get_model()  | 
| 
16
 
894cac760e29
[svn] Update the current song.  This slow down thing a bit (any querying
 
fabien 
parents: 
15 
diff
changeset
 | 
476  | 
fn = model.get_value(model.update_giter(giter), IMMSStore.COL_PATH)  | 
| 
12
 
d275de5d2be2
[svn] Play selected: check if the file exist, elsewhere try to
 
fabien 
parents: 
11 
diff
changeset
 | 
477  | 
try:  | 
| 
 
d275de5d2be2
[svn] Play selected: check if the file exist, elsewhere try to
 
fabien 
parents: 
11 
diff
changeset
 | 
478  | 
os.stat(fn)  | 
| 
 
d275de5d2be2
[svn] Play selected: check if the file exist, elsewhere try to
 
fabien 
parents: 
11 
diff
changeset
 | 
479  | 
except OSError:  | 
| 13 | 480  | 
return None  | 
481  | 
return fn  | 
|
| 
7
 
c5c0a84bb15b
[svn] All functions are now implemented (with a somewhat "cleaner" interface.
 
fabien 
parents: 
6 
diff
changeset
 | 
482  | 
def get_file_selected(self):  | 
| 6 | 483  | 
model, giter = self.get_selection().get_selected()  | 
| 
7
 
c5c0a84bb15b
[svn] All functions are now implemented (with a somewhat "cleaner" interface.
 
fabien 
parents: 
6 
diff
changeset
 | 
484  | 
if giter:  | 
| 
12
 
d275de5d2be2
[svn] Play selected: check if the file exist, elsewhere try to
 
fabien 
parents: 
11 
diff
changeset
 | 
485  | 
return self.get_filename(giter)  | 
| 
7
 
c5c0a84bb15b
[svn] All functions are now implemented (with a somewhat "cleaner" interface.
 
fabien 
parents: 
6 
diff
changeset
 | 
486  | 
return None  | 
| 
11
 
2913cf0e73e2
[svn] Add double click and remove sorting when refreshing data.
 
fabien 
parents: 
10 
diff
changeset
 | 
487  | 
def on_row_activated(self, tview, path, col):  | 
| 
 
2913cf0e73e2
[svn] Add double click and remove sorting when refreshing data.
 
fabien 
parents: 
10 
diff
changeset
 | 
488  | 
model = self.get_model()  | 
| 
 
2913cf0e73e2
[svn] Add double click and remove sorting when refreshing data.
 
fabien 
parents: 
10 
diff
changeset
 | 
489  | 
giter = model.get_iter(path)  | 
| 13 | 490  | 
fn = self.get_filename(giter)  | 
| 
12
 
d275de5d2be2
[svn] Play selected: check if the file exist, elsewhere try to
 
fabien 
parents: 
11 
diff
changeset
 | 
491  | 
self.set_current_song(fn)  | 
| 13 | 492  | 
self.xmms.play_file(fn)  | 
| 
11
 
2913cf0e73e2
[svn] Add double click and remove sorting when refreshing data.
 
fabien 
parents: 
10 
diff
changeset
 | 
493  | 
|
| 6 | 494  | 
|
495  | 
class IMMSToolbar(gtk.Toolbar):  | 
|
| 
9
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
496  | 
# _IMMSPLOT_COMMAND = 'immsplot &'  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
497  | 
_IMMSPLOT_COMMAND = '/home/fabien/bin/immsplot &'  | 
| 18 | 498  | 
_SLEEP_TIME = 5  | 
| 
9
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
499  | 
def __init__(self, iview, xmms):  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
500  | 
gtk.Toolbar.__init__(self)  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
501  | 
self.iview = iview  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
502  | 
self.xmms = xmms  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
503  | 
self.create_widgets()  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
504  | 
def create_widgets(self):  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
505  | 
        self.append_item(_('Refresh'), _('Refresh list'),
 | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
506  | 
None, None, self.do_refresh)  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
507  | 
        self.append_item(_('Plot'), _('Show graph of rates'),
 | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
508  | 
None, None, self.plot)  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
509  | 
        self.append_item(_('Current'), _('Get current song'),
 | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
510  | 
None, None, self.do_get_current)  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
511  | 
        self.append_item(_('Previous'), _('Play previous song'),
 | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
512  | 
None, None, self.do_play_prev)  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
513  | 
        self.append_item(_('Play'), _('Play selection'),
 | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
514  | 
None, None, self.do_play)  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
515  | 
        self.append_item(_('Next'), _('Play next song'),
 | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
516  | 
None, None, self.do_play_next)  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
517  | 
def plot(self, dummy):  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
518  | 
os.system(self._IMMSPLOT_COMMAND)  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
519  | 
def do_refresh(self, dummy):  | 
| 
27
 
9ac26f2f83e1
[svn] Now three updating function. (see IMMSStore.__init__).
 
fabien 
parents: 
26 
diff
changeset
 | 
520  | 
self.iview.get_model().update()  | 
| 
9
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
521  | 
def do_get_current(self, dummy):  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
522  | 
song = self.xmms.get_current_file()  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
523  | 
self.iview.set_current_song(song)  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
524  | 
def do_play(self, dummy):  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
525  | 
fn = self.iview.get_file_selected()  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
526  | 
if fn:  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
527  | 
self.xmms.play_file(fn)  | 
| 18 | 528  | 
self.sleep(self._SLEEP_TIME)  | 
| 
9
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
529  | 
self.do_get_current(dummy)  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
530  | 
def do_play_prev(self, dummy):  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
531  | 
self.xmms.playlist_prev()  | 
| 18 | 532  | 
self.sleep(self._SLEEP_TIME)  | 
| 
9
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
533  | 
self.do_get_current(dummy)  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
534  | 
def do_play_next(self, dummy):  | 
| 
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
535  | 
self.xmms.playlist_next()  | 
| 18 | 536  | 
self.sleep(self._SLEEP_TIME)  | 
| 
9
 
412e93decb7c
[svn] OK, reset current after changing song manually... however, I most sleep for almost a second to be sure to catch it.
 
fabien 
parents: 
8 
diff
changeset
 | 
537  | 
self.do_get_current(dummy)  | 
| 18 | 538  | 
def sleep(self, secs):  | 
539  | 
start = time.time()  | 
|
540  | 
while (time.time() - start) < secs:  | 
|
541  | 
time.sleep(0.2)  | 
|
542  | 
if gtk.main_iteration_do(gtk.FALSE):  | 
|
543  | 
break;  | 
|
| 0 | 544  | 
|
| 21 | 545  | 
class Application:  | 
546  | 
def __init__(self):  | 
|
547  | 
self.xmms = XMMSControl()  | 
|
548  | 
self.db = IMMSDb()  | 
|
549  | 
self.model = IMMSStore(self.db)  | 
|
550  | 
def main(self):  | 
|
| 22 | 551  | 
self.create_widgets()  | 
552  | 
gtk.mainloop()  | 
|
| 21 | 553  | 
def create_widgets(self):  | 
554  | 
root = gtk.Window()  | 
|
555  | 
        root.set_title(_("IMMSView"))
 | 
|
556  | 
        root.connect('destroy', gtk.mainquit)
 | 
|
557  | 
vbox = gtk.VBox(spacing = 3)  | 
|
558  | 
root.add(vbox)  | 
|
559  | 
vbox.show()  | 
|
560  | 
iview = IMMSView(self.model,self.xmms)  | 
|
561  | 
scroll = gtk.ScrolledWindow()  | 
|
562  | 
scroll.add(iview)  | 
|
563  | 
vbox.pack_end(scroll)  | 
|
564  | 
iview.show()  | 
|
565  | 
scroll.show()  | 
|
566  | 
toolbar = IMMSToolbar(iview, self.xmms)  | 
|
567  | 
vbox.pack_start(toolbar, expand = gtk.FALSE)  | 
|
568  | 
toolbar.show()  | 
|
569  | 
root.show()  | 
|
570  | 
toolbar.do_refresh(None)  | 
|
571  | 
toolbar.do_get_current(None)  | 
|
572  | 
||
573  | 
if __name__ == '__main__':  | 
|
574  | 
app = Application()  | 
|
575  | 
app.main()  |