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