~ubuntu-branches/debian/wheezy/quodlibet/wheezy

« back to all changes in this revision

Viewing changes to qltk/tracknumbers.py

  • Committer: Bazaar Package Importer
  • Author(s): Luca Falavigna
  • Date: 2009-01-30 23:55:34 UTC
  • mto: (18.1.1 squeeze) (2.1.9 sid)
  • mto: This revision was merged to the branch mainline in revision 23.
  • Revision ID: james.westby@ubuntu.com-20090130235534-45857nfsgobw4apc
Tags: upstream-2.0
Import upstream version 2.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# -*- coding: utf-8 -*-
2
 
# Copyright 2004-2005 Joe Wreschnig, Michael Urman, Iñigo Serna
3
 
#
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
7
 
#
8
 
# $Id: tracknumbers.py 3634 2006-07-14 19:38:41Z piman $
9
 
 
10
 
import gtk
11
 
 
12
 
import qltk
13
 
import stock
14
 
import util
15
 
 
16
 
from qltk.views import HintedTreeView
17
 
from qltk.wlw import WritingWindow
18
 
 
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)
26
 
 
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)
37
 
 
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)
48
 
 
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)
52
 
 
53
 
        model = gtk.ListStore(object, str, str)
54
 
        view = HintedTreeView(model)
55
 
 
56
 
        self.pack_start(hbox2, expand=False)
57
 
 
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)
71
 
        w.add(view)
72
 
        self.pack_start(w)
73
 
 
74
 
        bbox = gtk.HButtonBox()
75
 
        bbox.set_spacing(12)
76
 
        bbox.set_layout(gtk.BUTTONBOX_END)
77
 
        save = gtk.Button(stock=gtk.STOCK_SAVE)
78
 
        save.connect_object(
79
 
            'clicked', self.__save_files, prop, model, library)
80
 
        revert = gtk.Button(stock=gtk.STOCK_REVERT_TO_SAVED)
81
 
        bbox.pack_start(revert)
82
 
        bbox.pack_start(save)
83
 
        self.pack_start(bbox, expand=False)
84
 
 
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:])
88
 
        spin_total.connect(
89
 
            'value-changed', self.__preview_tracks, *preview_args)
90
 
        spin_start.connect(
91
 
            'value-changed', self.__preview_tracks, *preview_args)
92
 
        view.connect_object(
93
 
            'drag-end', self.__class__.__preview_tracks, self,
94
 
            *preview_args)
95
 
        render.connect('edited', self.__row_edited, model, preview, save)
96
 
 
97
 
        prop.connect_object(
98
 
            'changed', self.__class__.__update, self,
99
 
            spin_total, model, save, revert)
100
 
 
101
 
        self.show_all()
102
 
 
103
 
    def __row_edited(self, render, path, new, model, preview, save):
104
 
        row = model[path]
105
 
        if row[2] != new:
106
 
            row[2] = new
107
 
            preview.set_sensitive(True)
108
 
            save.set_sensitive(True)
109
 
 
110
 
    def __save_files(self, parent, model, library):
111
 
        win = WritingWindow(parent, len(model))
112
 
        was_changed = []
113
 
        for row in model:
114
 
            song = row[0]
115
 
            track = row[2]
116
 
            if song.get("tracknumber") == track:
117
 
                win.step()
118
 
                continue
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"))))
126
 
                ).run():
127
 
                break
128
 
            song["tracknumber"] = track
129
 
            try: song.write()
130
 
            except:
131
 
                qltk.ErrorMessage(
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()
137
 
                library.reload(song)
138
 
                break
139
 
            was_changed.append(song)
140
 
            if win.step(): break
141
 
        library.changed(was_changed)
142
 
        win.destroy()
143
 
 
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()
147
 
        for row in model:
148
 
            if total: s = "%d/%d" % (row.path[0] + start, total)
149
 
            else: s = str(row.path[0] + start)
150
 
            row[2] = s
151
 
        save.set_sensitive(True)
152
 
        revert.set_sensitive(True)
153
 
 
154
 
    def __update(self, songs, total, model, save, revert):
155
 
        if songs is None:
156
 
            songs = [row[0] for row in model]
157
 
        else:
158
 
            songs = list(songs)
159
 
        songs.sort(
160
 
            key=lambda song: (song("~#track"), song("~basename"), song))
161
 
        model.clear()
162
 
        total.set_value(len(songs))
163
 
        for song in songs:
164
 
            if not song.can_change("tracknumber"):
165
 
                self.set_sensitive(False)
166
 
                break
167
 
        else: self.set_sensitive(True)
168
 
        for song in songs:
169
 
            basename = util.fsdecode(song("~basename"))
170
 
            model.append(row=[song, basename, song("tracknumber")])
171
 
        save.set_sensitive(False)
172
 
        revert.set_sensitive(False)