1
# -*- coding: utf-8 -*-
2
# Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License version 2 as
6
# published by the Free Software Foundation
8
# $Id: tracknumbers.py 3634 2006-07-14 19:38:41Z piman $
16
from qltk.views import HintedTreeView
17
from qltk.wlw import WritingWindow
19
class TrackNumbers(gtk.VBox):
20
def __init__(self, prop, library):
21
super(TrackNumbers, self).__init__(spacing=6)
22
self.title = _("Track Numbers")
23
self.set_border_width(12)
24
hbox = gtk.HBox(spacing=18)
25
hbox2 = gtk.HBox(spacing=12)
27
hbox_start = gtk.HBox(spacing=3)
28
label_start = gtk.Label(_("Start fro_m:"))
29
label_start.set_use_underline(True)
30
spin_start = gtk.SpinButton()
31
spin_start.set_range(0, 99)
32
spin_start.set_increments(1, 10)
33
spin_start.set_value(1)
34
label_start.set_mnemonic_widget(spin_start)
35
hbox_start.pack_start(label_start)
36
hbox_start.pack_start(spin_start)
38
hbox_total = gtk.HBox(spacing=3)
39
label_total = gtk.Label(_("_Total tracks:"))
40
label_total.set_use_underline(True)
41
spin_total = gtk.SpinButton()
42
spin_total.set_range(0, 99)
43
spin_total.set_increments(1, 10)
44
label_total.set_mnemonic_widget(spin_total)
45
hbox_total.pack_start(label_total)
46
hbox_total.pack_start(spin_total)
47
preview = gtk.Button(stock=stock.PREVIEW)
49
hbox2.pack_start(hbox_start, expand=True, fill=False)
50
hbox2.pack_start(hbox_total, expand=True, fill=False)
51
hbox2.pack_start(preview, expand=False, fill=True)
53
model = gtk.ListStore(object, str, str)
54
view = HintedTreeView(model)
56
self.pack_start(hbox2, expand=False)
58
render = gtk.CellRendererText()
59
column = gtk.TreeViewColumn(_('File'), render, text=1)
60
column.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
61
view.append_column(column)
62
render = gtk.CellRendererText()
63
render.set_property('editable', True)
64
column = gtk.TreeViewColumn(_('Track'), render, text=2)
65
column.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
66
view.append_column(column)
67
view.set_reorderable(True)
68
w = gtk.ScrolledWindow()
69
w.set_shadow_type(gtk.SHADOW_IN)
70
w.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
74
bbox = gtk.HButtonBox()
76
bbox.set_layout(gtk.BUTTONBOX_END)
77
save = gtk.Button(stock=gtk.STOCK_SAVE)
79
'clicked', self.__save_files, prop, model, library)
80
revert = gtk.Button(stock=gtk.STOCK_REVERT_TO_SAVED)
81
bbox.pack_start(revert)
83
self.pack_start(bbox, expand=False)
85
preview_args = [spin_start, spin_total, model, save, revert]
86
preview.connect('clicked', self.__preview_tracks, *preview_args)
87
revert.connect_object('clicked', self.__update, None, *preview_args[1:])
89
'value-changed', self.__preview_tracks, *preview_args)
91
'value-changed', self.__preview_tracks, *preview_args)
93
'drag-end', self.__class__.__preview_tracks, self,
95
render.connect('edited', self.__row_edited, model, preview, save)
98
'changed', self.__class__.__update, self,
99
spin_total, model, save, revert)
103
def __row_edited(self, render, path, new, model, preview, save):
107
preview.set_sensitive(True)
108
save.set_sensitive(True)
110
def __save_files(self, parent, model, library):
111
win = WritingWindow(parent, len(model))
116
if song.get("tracknumber") == track:
119
if not song.valid() and not qltk.ConfirmAction(
120
win, _("Tag may not be accurate"),
121
_("<b>%s</b> changed while the program was running. "
122
"Saving without refreshing your library may "
123
"overwrite other changes to the song.\n\n"
124
"Save this song anyway?") %(
125
util.escape(util.fsdecode(song("~basename"))))
128
song["tracknumber"] = track
132
win, _("Unable to save song"),
133
_("Saving <b>%s</b> failed. The file may be "
134
"read-only, corrupted, or you do not have "
135
"permission to edit it.")%(
136
util.escape(util.fsdecode(song('~basename'))))).run()
139
was_changed.append(song)
141
library.changed(was_changed)
144
def __preview_tracks(self, ctx, start, total, model, save, revert):
145
start = start.get_value_as_int()
146
total = total.get_value_as_int()
148
if total: s = "%d/%d" % (row.path[0] + start, total)
149
else: s = str(row.path[0] + start)
151
save.set_sensitive(True)
152
revert.set_sensitive(True)
154
def __update(self, songs, total, model, save, revert):
156
songs = [row[0] for row in model]
160
key=lambda song: (song("~#track"), song("~basename"), song))
162
total.set_value(len(songs))
164
if not song.can_change("tracknumber"):
165
self.set_sensitive(False)
167
else: self.set_sensitive(True)
169
basename = util.fsdecode(song("~basename"))
170
model.append(row=[song, basename, song("tracknumber")])
171
save.set_sensitive(False)
172
revert.set_sensitive(False)