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