~ubuntu-branches/ubuntu/karmic/sonata/karmic

« back to all changes in this revision

Viewing changes to sonata/streams.py

  • Committer: Bazaar Package Importer
  • Author(s): Michal Čihař
  • Date: 2009-05-11 09:10:00 UTC
  • mfrom: (4.2.3 squeeze)
  • Revision ID: james.westby@ubuntu.com-20090511091000-jzspxudws5ngxb5e
Tags: 1.6.2-1
New upstream version (Closes: #528045).

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
"""
 
3
This module implements a user interface for bookmarking remote music
 
4
streams.
 
5
 
 
6
Example usage:
 
7
import streams
 
8
self.streams = streams.Streams(self.config, self.window, self.on_streams_button_press, self.on_add_item, self.settings_save, self.TAB_STREAMS)
 
9
streamswindow, streamsevbox = self.streams.get_widgets()
 
10
...
 
11
self.streams.populate()
 
12
...
 
13
"""
 
14
 
 
15
import gtk, pango
 
16
 
 
17
import misc, ui
 
18
 
 
19
class Streams(object):
 
20
        def __init__(self, config, window, on_streams_button_press, on_add_item, settings_save, TAB_STREAMS, new_tab):
 
21
                self.config = config
 
22
                self.window = window
 
23
                self.on_streams_button_press = on_streams_button_press
 
24
                self.on_add_item = on_add_item
 
25
                self.settings_save = settings_save
 
26
 
 
27
                # Streams tab
 
28
                self.streams = ui.treeview()
 
29
                self.streams_selection = self.streams.get_selection()
 
30
                self.streamswindow = ui.scrollwindow(add=self.streams)
 
31
 
 
32
                self.tab = new_tab(self.streamswindow, gtk.STOCK_NETWORK, TAB_STREAMS, self.streams)
 
33
 
 
34
                self.streams.connect('button_press_event', self.on_streams_button_press)
 
35
                self.streams.connect('row_activated', self.on_streams_activated)
 
36
                self.streams.connect('key-press-event', self.on_streams_key_press)
 
37
 
 
38
                # Initialize streams data and widget
 
39
                self.streamsdata = gtk.ListStore(str, str, str)
 
40
                self.streams.set_model(self.streamsdata)
 
41
                self.streams.set_search_column(1)
 
42
                self.streamsimg = gtk.CellRendererPixbuf()
 
43
                self.streamscell = gtk.CellRendererText()
 
44
                self.streamscell.set_property("ellipsize", pango.ELLIPSIZE_END)
 
45
                self.streamscolumn = gtk.TreeViewColumn()
 
46
                self.streamscolumn.pack_start(self.streamsimg, False)
 
47
                self.streamscolumn.pack_start(self.streamscell, True)
 
48
                self.streamscolumn.set_attributes(self.streamsimg, stock_id=0)
 
49
                self.streamscolumn.set_attributes(self.streamscell, markup=1)
 
50
                self.streams.append_column(self.streamscolumn)
 
51
                self.streams_selection.set_mode(gtk.SELECTION_MULTIPLE)
 
52
 
 
53
        def get_model(self):
 
54
                return self.streamsdata
 
55
 
 
56
        def get_widgets(self):
 
57
                return self.streamswindow
 
58
 
 
59
        def get_treeview(self):
 
60
                return self.streams
 
61
 
 
62
        def get_selection(self):
 
63
                return self.streams_selection
 
64
 
 
65
        def populate(self):
 
66
                self.streamsdata.clear()
 
67
                streamsinfo = [{'name' : misc.escape_html(name),
 
68
                                'uri' : misc.escape_html(uri)}
 
69
                                for name, uri in zip(self.config.stream_names,
 
70
                                                     self.config.stream_uris)]
 
71
                streamsinfo.sort(key=lambda x: x["name"].lower()) # Remove case sensitivity
 
72
                for item in streamsinfo:
 
73
                        self.streamsdata.append([gtk.STOCK_NETWORK, item["name"], item["uri"]])
 
74
 
 
75
        def on_streams_key_press(self, widget, event):
 
76
                if event.keyval == gtk.gdk.keyval_from_name('Return'):
 
77
                        self.on_streams_activated(widget, widget.get_cursor()[0])
 
78
                        return True
 
79
 
 
80
        def on_streams_activated(self, _treeview, _path, _column=0):
 
81
                self.on_add_item(None)
 
82
 
 
83
        def on_streams_edit(self, action):
 
84
                model, selected = self.streams_selection.get_selected_rows()
 
85
                try:
 
86
                        streamname = misc.unescape_html(model.get_value(model.get_iter(selected[0]), 1))
 
87
                        for i, name in enumerate(self.config.stream_names):
 
88
                                if name == streamname:
 
89
                                        self.on_streams_new(action, i)
 
90
                                        return
 
91
                except:
 
92
                        pass
 
93
 
 
94
        def on_streams_new(self, _action, stream_num=-1):
 
95
                if stream_num > -1:
 
96
                        edit_mode = True
 
97
                else:
 
98
                        edit_mode = False
 
99
                # Prompt user for playlist name:
 
100
                dialog = ui.dialog(title=None, parent=self.window, flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT), role="streamsNew")
 
101
                if edit_mode:
 
102
                        dialog.set_title(_("Edit Stream"))
 
103
                else:
 
104
                        dialog.set_title(_("New Stream"))
 
105
                hbox = gtk.HBox()
 
106
                namelabel = ui.label(text=_('Stream name') + ':')
 
107
                hbox.pack_start(namelabel, False, False, 5)
 
108
                nameentry = ui.entry()
 
109
                if edit_mode:
 
110
                        nameentry.set_text(self.config.stream_names[stream_num])
 
111
                hbox.pack_start(nameentry, True, True, 5)
 
112
                hbox2 = gtk.HBox()
 
113
                urllabel = ui.label(text=_('Stream URL') + ':')
 
114
                hbox2.pack_start(urllabel, False, False, 5)
 
115
                urlentry = ui.entry()
 
116
                if edit_mode:
 
117
                        urlentry.set_text(self.config.stream_uris[stream_num])
 
118
                hbox2.pack_start(urlentry, True, True, 5)
 
119
                ui.set_widths_equal([namelabel, urllabel])
 
120
                dialog.vbox.pack_start(hbox)
 
121
                dialog.vbox.pack_start(hbox2)
 
122
                ui.show(dialog.vbox)
 
123
                response = dialog.run()
 
124
                if response == gtk.RESPONSE_ACCEPT:
 
125
                        name = nameentry.get_text()
 
126
                        uri = urlentry.get_text()
 
127
                        if len(name.decode('utf-8')) > 0 and len(uri.decode('utf-8')) > 0:
 
128
                                # Make sure this stream name doesn't already exit:
 
129
                                i = 0
 
130
                                for item in self.config.stream_names:
 
131
                                        # Prevent a name collision in edit_mode..
 
132
                                        if not edit_mode or (edit_mode and i != stream_num):
 
133
                                                if item == name:
 
134
                                                        dialog.destroy()
 
135
                                                        if ui.show_msg(self.window, _("A stream with this name already exists. Would you like to replace it?"), _("New Stream"), 'newStreamError', gtk.BUTTONS_YES_NO) == gtk.RESPONSE_YES:
 
136
                                                                # Pop existing stream:
 
137
                                                                self.config.stream_names.pop(i)
 
138
                                                                self.config.stream_uris.pop(i)
 
139
                                                        else:
 
140
                                                                return
 
141
                                        i = i + 1
 
142
                                if edit_mode:
 
143
                                        self.config.stream_names.pop(stream_num)
 
144
                                        self.config.stream_uris.pop(stream_num)
 
145
                                self.config.stream_names.append(name)
 
146
                                self.config.stream_uris.append(uri)
 
147
                                self.populate()
 
148
                                self.settings_save()
 
149
                dialog.destroy()