From 7dc16ec20b10e1e4fbdcf3d32165e228a21218a1 Mon Sep 17 00:00:00 2001 From: Martijn Voncken Date: Wed, 30 Jul 2008 19:35:43 +0000 Subject: [PATCH] move gtk-label config to sidebar --- .../label/label/data/label_options.glade | 404 ++++++++++++++++++ .../plugins/label/label/data/label_pref.glade | 368 +--------------- .../plugins/label/label/gtkui/label_config.py | 195 --------- deluge/plugins/label/label/gtkui/sidebar.py | 129 +++++- 4 files changed, 537 insertions(+), 559 deletions(-) create mode 100644 deluge/plugins/label/label/data/label_options.glade 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) +