diff --git a/deluge/plugins/label/label/data/label_options.glade b/deluge/plugins/label/label/data/label_options.glade
new file mode 100644
index 000000000..8f53b44a1
--- /dev/null
+++ b/deluge/plugins/label/label/data/label_options.glade
@@ -0,0 +1,404 @@
+
+
+
+
+
+ 5
+ Label Options
+ GTK_WIN_POS_CENTER_ON_PARENT
+ GDK_WINDOW_TYPE_HINT_DIALOG
+ False
+
+
+ True
+ 2
+
+
+ True
+ True
+
+
+ True
+ 6
+ 4
+ 5
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+
+
+ 1
+ 2
+ 5
+ 6
+
+
+
+
+ True
+
+
+ 1
+ 2
+
+
+
+
+ True
+ True
+ -1 -1 9999 1 10 10
+ True
+
+
+ 2
+ 3
+ 4
+ 5
+
+ GTK_EXPAND
+
+
+
+
+ True
+ 0
+ Connections:
+
+
+ 1
+ 2
+ 4
+ 5
+ GTK_FILL
+
+
+
+
+
+ True
+ True
+ -1 -1 9999 1 10 10
+ True
+
+
+ 2
+ 3
+ 3
+ 4
+ GTK_EXPAND
+ GTK_EXPAND
+
+
+
+
+ True
+ Kib/s
+
+
+ 3
+ 4
+ 2
+ 3
+ GTK_EXPAND
+
+
+
+
+ True
+ 0
+ Download Speed:
+ True
+
+
+ 1
+ 2
+ 1
+ 2
+ GTK_FILL
+
+
+
+
+
+ True
+ 0
+ Upload Speed:
+
+
+ 1
+ 2
+ 2
+ 3
+ GTK_FILL
+
+
+
+
+
+ True
+ 0
+ Upload Slots:
+
+
+ 1
+ 2
+ 3
+ 4
+ GTK_FILL
+
+
+
+
+
+ True
+ True
+ -1 -1 9999 1 10 10
+
+
+ 2
+ 3
+ 1
+ 2
+ GTK_EXPAND
+ GTK_EXPAND
+
+
+
+
+ True
+ Kib/s
+
+
+ 3
+ 4
+ 1
+ 2
+ GTK_EXPAND | GTK_SHRINK | GTK_FILL
+ GTK_EXPAND
+
+
+
+
+ True
+ True
+ -1 -1 9999 1 10 10
+
+
+ 2
+ 3
+ 2
+ 3
+ GTK_EXPAND
+ GTK_EXPAND
+
+
+
+
+
+
+ True
+ Bandwith
+
+
+ tab
+ False
+
+
+
+
+ True
+ todo
+
+
+ 1
+
+
+
+
+ True
+ Queue
+
+
+ tab
+ 1
+ False
+
+
+
+
+ True
+ todo
+
+
+
+ 2
+
+
+
+
+ True
+ Location
+
+
+ tab
+ 2
+ False
+
+
+
+
+ 1
+
+
+
+
+ True
+ GTK_BUTTONBOX_END
+
+
+ True
+ True
+ True
+ gtk-cancel
+ True
+ 0
+
+
+
+
+
+ True
+ True
+ True
+ gtk-ok
+ True
+ 0
+
+
+
+ 1
+
+
+
+
+ False
+ GTK_PACK_END
+
+
+
+
+
+
+ 5
+ Add Label
+ GTK_WIN_POS_CENTER_ON_PARENT
+ GDK_WINDOW_TYPE_HINT_DIALOG
+ False
+
+
+
+ True
+ 2
+
+
+ True
+
+
+ True
+ <b>Label name:</b>
+ True
+
+
+
+
+ True
+ True
+
+
+ 1
+
+
+
+
+
+
+
+ 1
+
+
+
+
+ True
+ GTK_BUTTONBOX_END
+
+
+ True
+ True
+ True
+ gtk-cancel
+ True
+ 0
+
+
+
+
+
+ True
+ True
+ True
+ gtk-ok
+ True
+ 0
+
+
+
+ 1
+
+
+
+
+ False
+ GTK_PACK_END
+
+
+
+
+
+
diff --git a/deluge/plugins/label/label/data/label_pref.glade b/deluge/plugins/label/label/data/label_pref.glade
index d4be23368..c69608a6b 100644
--- a/deluge/plugins/label/label/data/label_pref.glade
+++ b/deluge/plugins/label/label/data/label_pref.glade
@@ -1,6 +1,6 @@
-
+
@@ -73,371 +73,13 @@
-
+
True
- 0
- GTK_SHADOW_NONE
-
-
- True
- True
- 150
-
-
- True
-
-
- True
- 1
- 2
-
-
- True
- True
- True
- add
- 0
-
-
- 1
- 2
- GTK_EXPAND
-
-
-
-
- 100
- True
- True
-
-
-
-
-
-
- 250
- True
- True
- True
-
-
- 1
-
-
-
-
- True
- True
- True
- Remove
- 0
-
-
- False
- 2
-
-
-
-
- False
- False
-
-
-
-
- True
-
-
- 30
- True
- <b>label</b>
- True
-
-
-
-
- True
- 12
- 3
- 5
- 5
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 50
- True
- True
- True
- Apply to all
- 0
-
-
- 1
- 3
- 5
- 6
-
-
-
-
- True
- Select A Folder
-
-
- 3
- 7
- 8
- GTK_EXPAND
-
-
-
-
- True
- True
- -1 -1 9999 1 10 10
-
-
- 1
- 2
- 3
- 4
- GTK_EXPAND
- GTK_EXPAND
-
-
-
-
- True
- True
- Apply maximum limits on add:
- 0
- True
-
-
- 3
-
-
-
-
- True
- True
- Move completed to:
- 0
- True
-
-
- 3
- 6
- 7
-
-
-
-
- True
- Kib/s
-
-
- 2
- 3
- 2
- 3
- GTK_EXPAND | GTK_SHRINK | GTK_FILL
- GTK_EXPAND
-
-
-
-
- True
- True
- -1 -1 9999 1 10 10
-
-
- 1
- 2
- 2
- 3
- GTK_EXPAND
- GTK_EXPAND
-
-
-
-
- True
- True
- -1 -1 9999 1 10 10
- True
-
-
- 1
- 2
- 1
- 2
-
- GTK_EXPAND
-
-
-
-
- True
- 0
- Upload Slots:
-
-
- 4
- 5
- GTK_FILL
-
-
-
-
-
- True
- 0
- Upload Speed:
-
-
- 3
- 4
- GTK_FILL
-
-
-
-
-
- True
- 0
- Download Speed:
- True
-
-
- 2
- 3
- GTK_FILL
-
-
-
-
-
- True
- 0
- Connections:
-
-
- 1
- 2
- GTK_FILL
-
-
-
-
-
- True
- Kib/s
-
-
- 2
- 3
- 3
- 4
- GTK_EXPAND
-
-
-
-
- True
- True
- -1 -1 9999 1 10 10
- True
-
-
- 1
- 2
- 4
- 5
- GTK_EXPAND
- GTK_EXPAND
-
-
-
-
- True
- True
- True
- Save Label Settings
- 0
-
-
- 3
- 9
- 10
-
-
-
-
- 1
-
-
-
-
-
-
-
- True
- True
-
-
-
-
-
-
- True
- 5
- <b>Labels</b>
- True
-
-
- label_item
-
-
+ <i>Use the sidebar to add,edit and remove labels.</i>
+
+ True
- False
- False
1
diff --git a/deluge/plugins/label/label/gtkui/label_config.py b/deluge/plugins/label/label/gtkui/label_config.py
index 7b4d3b10e..b22c767fa 100644
--- a/deluge/plugins/label/label/gtkui/label_config.py
+++ b/deluge/plugins/label/label/gtkui/label_config.py
@@ -50,32 +50,13 @@ class LabelConfig(object):
#self.glade = gtk.glade.XML(self.get_resource("label_pref.glade"))
log.debug('Adding Label Preferences page')
-
-
self.glade = gtk.glade.XML(self.get_resource("label_pref.glade"))
- self.prefs_box = self.glade.get_widget("label_prefs_box")
- self.label_view = self.glade.get_widget("label_view")
- self.txt_add = self.glade.get_widget("txt_add")
- self.btn_add = self.glade.get_widget("btn_add")
- self.btn_remove = self.glade.get_widget("btn_remove")
- self.label_view = self.glade.get_widget("label_view")
- self.btn_remove.connect("clicked", self.on_remove, None)
- self.btn_add.connect("clicked", self.on_add, None)
-
- self.build_label_view()
-
self.plugin.add_preferences_page("Label", self.glade.get_widget("label_prefs_box"))
self.plugin.register_hook("on_show_prefs", self.load_settings)
self.plugin.register_hook("on_apply_prefs", self.on_apply_prefs)
- self.glade.get_widget("chk_move_completed").connect("clicked",self.on_chk_move_changed)
- self.glade.get_widget("apply_max").connect("clicked",self.on_apply_max_changed)
- self.glade.get_widget("btn_save").connect("clicked",self.on_save_label)
- self.glade.get_widget("btn_apply").connect("clicked",self.on_apply_label)
-
-
self.load_settings()
def unload(self):
@@ -86,188 +67,12 @@ class LabelConfig(object):
return pkg_resources.resource_filename("label", os.path.join("data", filename))
def load_settings(self ,widget = None , data = None):
- aclient.label_get_labels(self.cb_update_labels)
aclient.label_get_global_options(self.cb_global_options)
def cb_global_options(self, data):
self.glade.get_widget("hide_zero_hits").set_active(data["hide_zero_hits"])
- def cb_update_labels(self, labels):
- log.debug("update labels")
- self.labels = labels
- self.label_store.clear()
- for label in labels:
- self.label_store.append([label])
- if labels:
- self.label_view.get_selection().select_iter(self.label_store.get_iter_first())
-
- def cb_label_options(self, data):
- for key in ["max_download_speed", "max_upload_speed", "max_connections" ,"max_upload_slots"]:
- spin = self.glade.get_widget(key)
- spin.set_value(data[key])
-
- self.glade.get_widget("apply_max").set_active(data["apply_max"])
- self.glade.get_widget("chk_move_completed").set_active(bool(data["move_completed_to"]))
- self.glade.get_widget("move_completed_to").set_filename(data["move_completed_to"] or "")
-
- self.on_apply_max_changed()
- self.on_chk_move_changed()
-
def on_apply_prefs(self):
options = {"hide_zero_hits":self.glade.get_widget("hide_zero_hits").get_active()}
aclient.label_set_global_options(None, options)
- def on_chk_move_changed(self, data = None):
- self.glade.get_widget("move_completed_to").set_sensitive(
- self.glade.get_widget("chk_move_completed").get_active())
-
- def on_apply_max_changed(self, data = None):
- active = self.glade.get_widget("apply_max").get_active()
- for key in ["max_download_speed", "max_upload_speed", "max_connections" ,"max_upload_slots","btn_apply"]:
- spin = self.glade.get_widget(key)
- spin.set_sensitive(active)
-
-
- def on_add(self, widget, data = None):
- label = self.txt_add.get_text()
- self.txt_add.set_text("")
- if label in self.labels:
- return
- aclient.label_add(None , label)
- aclient.label_get_labels(self.cb_update_labels)
- aclient.force_call(block=True)
- self.select_label(label)
-
- def on_remove(self, widget, data=None):
- label = self.get_selected_label()
- aclient.label_remove(None, label)
- aclient.label_get_labels(self.cb_update_labels)
- self.select_label(0)
-
- def on_save_label(self, arg = None, apply = False):
- options = {}
- for key in ["max_download_speed", "max_upload_speed", "max_connections" ,"max_upload_slots"]:
- options[key] = self.glade.get_widget(key).get_value()
- options["apply_max"] = self.glade.get_widget("apply_max").get_active()
-
- if self.glade.get_widget("chk_move_completed").get_active():
- options["move_completed_to"] = self.glade.get_widget("move_completed_to").get_filename()
- else:
- options["move_completed_to"] = None
-
- aclient.label_set_options(None, self.label, options , apply)
-
- def on_apply_label(self, arg = None):
- self.on_save_label(apply = True)
-
- def get_selected_label(self):
- model , iter = self.label_view.get_selection().get_selected()
- return self.label_store.get_value(iter,0)
-
- def select_label(self, label):
- aclient.force_call(block=True) #sync..
- if label:
- it = self.label_store.iter_nth_child(None,self.labels.index(label))
- elif self.labels:
- it = self.label_store.iter_nth_child(None,0)
- if self.labels:
- self.label_view.get_selection().select_iter(it)
-
- def build_label_view(self):
- "gtk should have a simple listbox widget..."
- self.label_store = gtk.ListStore(str)
-
- column = gtk.TreeViewColumn(_("Label"))
- renderer = gtk.CellRendererText()
- column.pack_start(renderer)
- column.set_attributes(renderer, text = 0)
-
-
- self.label_view.set_model(self.label_store)
- self.label_view.append_column(column)
- self.label_view.set_headers_visible(False)
-
- self.label_view.get_selection().connect("changed", self.on_label_changed)
-
- def on_label_changed(self, selection):
- try:
- (model, row) = self.label_view.get_selection().get_selected()
- self.label = model.get_value(row, 0)
- self.glade.get_widget("txt_label").set_markup("%s" % self.label)
- aclient.label_get_options(self.cb_label_options, self.label)
- except:
- log.debug("none selected")
-
-
-
-
-
-
-
-
-
-
-
-
-
-"""
-
- label = gtk.Label()
- label.set_markup('' + _('General') + '')
-
-
- self.set_shadow_type(gtk.SHADOW_NONE)
- self.set_label_widget(label)
-
- self.btn_load = gtk.Button("Load Settings")
- self.btn_load.connect("clicked", self.load_settings, None)
-
- self.btn_remove = gtk.Button("Remove")
- self.btn_remove.connect("clicked", self.on_remove, None)
-
- vb = gtk.VBox()
- self.add(vb)
- #vb.add(self.btn_load)
- #vb.add(gtk.Label("Label is in developent, you're testing pre-alfa!!!"))
-
-
- self.hide_zero_hits = gtk.CheckButton(_('Hide Zero Hits'))
- vb.add(self.hide_zero_hits)
-
- label = gtk.Label()
- label.set_markup('' + _('Labels') + '')
- vb.add(label)
-
- hp = gtk.HPaned()
- hp.add1(self.label_view)
-
-
- hp.add2(self.label_options)
-
- hp.set_position(100)
-
- hp.set_size_request(400, 200) #bug..
-
-
- hbAdd = gtk.HBox()
- hbAdd.add(gtk.Label("Label:"))
- self.txt_add = gtk.Entry()
- hbAdd.add(self.txt_add)
- btn_add = gtk.Button("Add")
- hbAdd.add(btn_add)
- btn_add.connect("clicked", self.on_add, None)
-
- vb.pack_end(hbAdd)
-
- label = gtk.Label()
- label.set_markup('' + _('Add') + '')
-
-
-
- vb.pack_end(label)
-
- vb.pack_end(self.btn_remove, True , True)
-
- vb.pack_end(hp,True , True)
-
-"""
diff --git a/deluge/plugins/label/label/gtkui/sidebar.py b/deluge/plugins/label/label/gtkui/sidebar.py
index 75e6705e5..65eed64ec 100644
--- a/deluge/plugins/label/label/gtkui/sidebar.py
+++ b/deluge/plugins/label/label/gtkui/sidebar.py
@@ -49,7 +49,107 @@ STATE_PIX = {
"Error":"alert"
}
+NO_LABEL = "No Label"
+#helpers:
+def get_resource(filename):
+ import pkg_resources
+ import os
+ return pkg_resources.resource_filename("label", os.path.join("data", filename))
+
+#menu
+class LabelMenu(gtk.Menu):
+ def __init__(self):
+ gtk.Menu.__init__(self)
+ self._add_item("add", _("_Add"), gtk.STOCK_ADD)
+ self._add_item("options", _("_Options") ,gtk.STOCK_PREFERENCES)
+ self._add_item("remove", _("Remove"), gtk.STOCK_REMOVE)
+ self.show_all()
+ self.label = None
+
+ #dialogs:
+ self.add_dialog = AddDialog()
+ self.options_dialog = OptionsDialog()
+
+ def _add_item(self, id, label , stock):
+ "add a menu item, some magic here because i hate glade."
+ method = getattr(self,"on_%s" % id)
+ item = gtk.ImageMenuItem(stock)
+ item.connect("activate", method)
+ self.append(item)
+ setattr(self,"item_%s" % id, item)
+
+ def on_add(self, event=None):
+ self.add_dialog.show(self.label)
+
+ def on_remove(self, event=None):
+ aclient.label_remove(None, self.label)
+
+ def on_options (self, event=None):
+ self.options_dialog.show(self.label)
+
+ def set_label(self,label):
+ "No Label:disable options/del"
+ self.label = label
+ sensitive = (label != NO_LABEL)
+ self.item_options.set_sensitive(sensitive)
+ self.item_remove.set_sensitive(sensitive)
+
+#dialogs:
+class AddDialog(object):
+ def __init__(self):
+ pass
+
+ def show(self, label):
+ self.glade = gtk.glade.XML(get_resource("label_options.glade"))
+ self.dialog = self.glade.get_widget("dlg_label_add")
+ self.glade.signal_autoconnect({
+ "on_add_ok":self.on_ok,
+ "on_add_cancel":self.on_cancel,
+ })
+ self.dialog.run()
+
+ def on_ok(self, event=None):
+ value = self.glade.get_widget("txt_add").get_text()
+ aclient.label_add(None, value)
+ self.dialog.destroy()
+
+ def on_cancel(self, event=None):
+ self.dialog.destroy()
+
+
+class OptionsDialog(object):
+ spin_ids = ["max_download_speed","max_upload_speed","max_upload_slots","max_connections"]
+
+ def __init__(self):
+ pass
+
+ def show(self, label):
+ self.label = label
+ self.glade = gtk.glade.XML(get_resource("label_options.glade"))
+ self.dialog = self.glade.get_widget("dlg_label_options")
+ self.glade.signal_autoconnect({
+ "on_options_ok":self.on_ok,
+ "on_options_cancel":self.on_cancel,
+ })
+ aclient.label_get_options(self.load_options, self.label)
+ self.dialog.run()
+
+ def load_options(self, options):
+ for id in self.spin_ids:
+ self.glade.get_widget(id).set_value(options[id])
+
+ def on_ok(self, event=None):
+ options = {}
+ for id in self.spin_ids:
+ options[id] = self.glade.get_widget(id).get_value()
+ aclient.label_set_options(None, self.label, options)
+ self.dialog.destroy()
+
+ def on_cancel(self, event=None):
+ self.dialog.destroy()
+
+#sidebar-treeview
class LabelSideBar(component.Component):
def __init__(self):
component.Component.__init__(self, "LabelSideBar", interval=2000)
@@ -108,6 +208,10 @@ class LabelSideBar(component.Component):
self.label_view.expand_all()
self.hpaned.set_position(170)
+ self.label_view.connect("button-press-event", self.on_button_press_event)
+
+ self.label_menu = LabelMenu()
+
def load(self):
sidebar = component.get("SideBar")
@@ -208,7 +312,7 @@ class LabelSideBar(component.Component):
filter = (cat, value)
if value == "All" or cat == "cat":
filter = (None, None)
- elif (cat == "label" and value == "No Label"):
+ elif (cat == "label" and value == NO_LABEL):
filter = ("label","")
component.get("TorrentView").set_filter(*filter)
@@ -225,3 +329,26 @@ class LabelSideBar(component.Component):
log.debug(e)
+ ### Callbacks ###
+ def on_button_press_event(self, widget, event):
+ """This is a callback for showing the right-click context menu."""
+
+ # We only care about right-clicks
+ if event.button == 3:
+ x, y = event.get_coords()
+ path = self.label_view.get_path_at_pos(int(x), int(y))
+ if not path:
+ return
+ row = self.model_filter.get_iter(path[0])
+ cat = self.model_filter.get_value(row, 0)
+ value = self.model_filter.get_value(row, 1)
+
+ log.debug("right-click->cat='%s',value='%s'", cat ,value)
+
+ if cat == "label":
+ self.show_label_menu(value, event)
+
+ def show_label_menu(self, label, event):
+ self.label_menu.set_label(label)
+ self.label_menu.popup(None, None, None, event.button, event.time)
+