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