summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Resch <andrewresch@gmail.com>2009-12-21 19:04:15 +0000
committerAndrew Resch <andrewresch@gmail.com>2009-12-21 19:04:15 +0000
commit0b7e05e27b00c1c14b836897015557c12b883240 (patch)
treeac8d0842f150694a596f40af09c691f436051ce6
downloaddeluge-1.3-prefs-proto.zip
deluge-1.3-prefs-proto.tar.gz
deluge-1.3-prefs-proto.tar.bz2
New preferences prototype1.3-prefs-proto
-rw-r--r--main.py222
1 files changed, 222 insertions, 0 deletions
diff --git a/main.py b/main.py
new file mode 100644
index 0000000..4f92583
--- /dev/null
+++ b/main.py
@@ -0,0 +1,222 @@
+import gtk
+import gobject
+
+_ = lambda x: x
+
+class Client(object):
+ def is_localhost(self):
+ return True
+client = Client()
+
+class MainWindow(object):
+ def __init__(self):
+ # {(PreferenceItem, widget_number): (widget, method), ...}
+ self.widgets = {}
+
+ self.renderers = {
+ FolderSelect: self.render_folder_select,
+ }
+
+ self.window = gtk.Window()
+ self.window.set_default_size(510, 530)
+ self.window.set_border_width(5)
+ vbox = gtk.VBox()
+ hpaned = gtk.HPaned()
+ button_box = gtk.HButtonBox()
+ button_box.set_layout(gtk.BUTTONBOX_END)
+ self.button_ok = gtk.Button(stock=gtk.STOCK_OK)
+ self.button_apply = gtk.Button(stock=gtk.STOCK_APPLY)
+ self.button_cancel = gtk.Button(stock=gtk.STOCK_CANCEL)
+ button_box.pack_start(self.button_cancel)
+ button_box.pack_start(self.button_apply)
+ button_box.pack_start(self.button_ok)
+
+ vbox.pack_start(hpaned, True)
+ vbox.pack_start(button_box, False)
+
+ self.cat_listview = gtk.TreeView()
+ sw = gtk.ScrolledWindow()
+ sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+ sw.add_with_viewport(self.cat_listview)
+ hpaned.pack1(sw)
+ self.notebook = gtk.Notebook()
+ self.notebook.set_show_tabs(False)
+ hpaned.pack2(self.notebook)
+
+ # Setup the liststore for the categories (tab pages)
+ self.cat_liststore = gtk.ListStore(int, str)
+ self.cat_listview.set_model(self.cat_liststore)
+ render = gtk.CellRendererText()
+ column = gtk.TreeViewColumn("Categories", render, text=1)
+ self.cat_listview.append_column(column)
+
+
+ # Add the default categories
+# i = 0
+# for category in [_("Downloads"), _("Network"), _("Bandwidth"), _("Interface"),
+# _("Other"), _("Daemon"), _("Queue"), _("Proxy"), _("Notification"),
+# _("Cache"), _("Plugins")]:
+# self.cat_liststore.append([i, category])
+# i += 1
+
+ self.window.add(vbox)
+ self.window.show_all()
+
+ def add_page(self, page):
+ """Add a another page to the notebook"""
+ # Create a header and scrolled window for the preferences tab
+ vbox = gtk.VBox()
+ scrolled = gtk.ScrolledWindow()
+ viewport = gtk.Viewport()
+ viewport.set_shadow_type(gtk.SHADOW_NONE)
+ viewport.add(vbox)
+ scrolled.add(viewport)
+ scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+
+ # Create the top header
+ label = gtk.Label()
+ label.set_use_markup(True)
+ label.set_markup("<b><i><big>" + page.name + "</big></i></b>")
+ label.set_alignment(0.00, 0.50)
+ label.set_padding(10, 10)
+ vbox.pack_start(label, False, True, 0)
+ vbox.pack_start(gtk.HSeparator(), False, True, 0)
+
+ # All the page widgets will be added to the alignment widget via the pvbox
+ align = gtk.Alignment()
+ align.set_padding(5, 0, 0, 0)
+ pvbox = gtk.VBox()
+ align.add(pvbox)
+ # Add in the page widgets here..
+ for section in page.items:
+ # Setup section frame
+ frame = gtk.Frame("<b>"+section+"</b>")
+ frame.get_label_widget().set_use_markup(True)
+ frame.set_shadow_type(gtk.SHADOW_NONE)
+ pvbox.pack_start(frame)
+ frame_align = gtk.Alignment()
+ frame_align.set_padding(2, 2, 12, 0)
+ frame.add(frame_align)
+ frame_vbox = gtk.VBox()
+ frame_align.add(frame_vbox)
+
+ # Now we add the section items to the vbox
+ for item in page.items[section]:
+ frame_vbox.pack_start(self.renderers[type(item)](item))
+
+ print self.widgets
+ # Add them to the vbox which is in the scrolled window
+ vbox.pack_start(align, True, True, 0)
+
+ # Show all the widgets
+ scrolled.show_all()
+
+ # Add this page to the notebook
+ index = self.notebook.append_page(scrolled)
+ self.cat_liststore.append([index, page.name])
+
+ def render_folder_select(self, item):
+ """
+ Returns a folder select widget.
+ """
+ hbox = gtk.HBox()
+ hbox.set_spacing(5)
+ hbox.set_homogeneous(True)
+ if item.toggleable:
+ label = gtk.CheckButton(item.label)
+ self.widgets[(item, 1)] = (label, "get_active")
+ else:
+ label = gtk.Label(item.label)
+ label.set_alignment(0.0, 0.5)
+ if client.is_localhost():
+ entry = gtk.FileChooserButton(_("Select a folder"))
+ entry.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER)
+ else:
+ entry = gtk.Entry()
+
+ # Add this widget to the widgets dict so
+ self.widgets[(item, 0)] = (entry, "get_text")
+
+ hbox.pack_start(label, False)
+ hbox.pack_end(entry)
+ return hbox
+
+class PreferenceItem(object):
+ pass
+
+class FolderSelect(PreferenceItem):
+ def __init__(self, config, label, toggleable=False):
+ """
+ :param config: the config dict and key to use
+ :type config: a tuple (dict, key), eg, ("ui", "key") or ("core", "key1", "key2")
+ :param label: the text to display
+ :type label: string
+ :param toggleable: if a checkbox is needed. this param uses config key2.
+ :type toggleable: bool
+
+ """
+ self.config = config
+ self.label = label
+ self.toggleable = toggleable
+
+class RadioButton(PreferenceItem):
+ def __init__(self, config, label, group=0):
+ """
+ :param config: the config dict and key to use
+ :type config: a tuple (dict, key), eg, ("ui", "key") or ("core", "key")
+ :param label: the text to display
+ :type label: string
+ :param group: the group number to assign this radio button to
+ :type group: int
+
+ """
+ self.config = config
+ self.label = label
+ self.group = group
+
+class CheckButton(PreferenceItem):
+ def __init__(self, config, label):
+ """
+ :param config: the config dict and key to use
+ :type config: a tuple (dict, key), eg, ("ui", "key") or ("core", "key")
+ :param label: the text to display
+ :type label: string
+
+ """
+ self.config = config
+ self.label = label
+
+class PreferencePage(object):
+ def __init__(self, name):
+ self.name = name
+ self.section = "General"
+ self.items = {}
+
+ def set_section(self, section):
+ self.section = section
+ if self.section not in self.items:
+ self.items[self.section] = []
+
+ def add(self, item):
+ """
+ Adds a PreferenceItem to the page.
+
+ :param item: the item to add
+ :type item: PreferenceItem
+
+ """
+ if not isinstance(item, PreferenceItem):
+ raise ValueError("item is not a PreferenceItem!")
+
+ self.items[self.section].append(item)
+
+
+p = PreferencePage(_("Downloads"))
+p.set_section(_("Folders"))
+p.add(FolderSelect(("core", "download_location"), _("Download to:")))
+p.add(FolderSelect(("core", "move_completed_path", "move_completed"), _("Move completed to:"), True))
+p.add(FolderSelect(("core", "torrentfiles_location", "copy_torrent_file"), _("Copy of .torrent files to:"), True))
+p.add(FolderSelect(("core", "autoadd_location", "autoadd_enable"), _("Auto add .torrents from:"), True))
+m = MainWindow()
+m.add_page(p)
+gtk.main()