~ubuntu-branches/ubuntu/karmic/quodlibet/karmic

« back to all changes in this revision

Viewing changes to quodlibet/qltk/tracknumbers.py

  • Committer: Bazaar Package Importer
  • Author(s): Luca Falavigna
  • Date: 2009-01-30 23:55:34 UTC
  • mfrom: (1.1.12 upstream)
  • Revision ID: james.westby@ubuntu.com-20090130235534-l4e72ulw0vqfo17w
Tags: 2.0-1ubuntu1
* Merge from Debian experimental (LP: #276856), remaining Ubuntu changes:
  + debian/patches/40-use-music-profile.patch:
    - Use the "Music and Movies" pipeline per default.
* Refresh the above patch for new upstream release.

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 4330 2008-09-14 03:19:26Z piman $
 
9
 
 
10
import gtk
 
11
 
 
12
from quodlibet import qltk
 
13
from quodlibet import stock
 
14
from quodlibet import util
 
15
 
 
16
from quodlibet.qltk.views import HintedTreeView
 
17
from quodlibet.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, 999)
 
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, 999)
 
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, changed=was_changed)
 
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)