3
This module implements a user interface for bookmarking remote music
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()
11
self.streams.populate()
19
class Streams(object):
20
def __init__(self, config, window, on_streams_button_press, on_add_item, settings_save, TAB_STREAMS, new_tab):
23
self.on_streams_button_press = on_streams_button_press
24
self.on_add_item = on_add_item
25
self.settings_save = settings_save
28
self.streams = ui.treeview()
29
self.streams_selection = self.streams.get_selection()
30
self.streamswindow = ui.scrollwindow(add=self.streams)
32
self.tab = new_tab(self.streamswindow, gtk.STOCK_NETWORK, TAB_STREAMS, self.streams)
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)
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)
54
return self.streamsdata
56
def get_widgets(self):
57
return self.streamswindow
59
def get_treeview(self):
62
def get_selection(self):
63
return self.streams_selection
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"]])
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])
80
def on_streams_activated(self, _treeview, _path, _column=0):
81
self.on_add_item(None)
83
def on_streams_edit(self, action):
84
model, selected = self.streams_selection.get_selected_rows()
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)
94
def on_streams_new(self, _action, stream_num=-1):
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")
102
dialog.set_title(_("Edit Stream"))
104
dialog.set_title(_("New Stream"))
106
namelabel = ui.label(text=_('Stream name') + ':')
107
hbox.pack_start(namelabel, False, False, 5)
108
nameentry = ui.entry()
110
nameentry.set_text(self.config.stream_names[stream_num])
111
hbox.pack_start(nameentry, True, True, 5)
113
urllabel = ui.label(text=_('Stream URL') + ':')
114
hbox2.pack_start(urllabel, False, False, 5)
115
urlentry = ui.entry()
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)
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:
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):
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)
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)