Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--util/__init__.py0
-rw-r--r--util/configfile.py158
-rw-r--r--util/configwizard.py192
3 files changed, 350 insertions, 0 deletions
diff --git a/util/__init__.py b/util/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/util/__init__.py
diff --git a/util/configfile.py b/util/configfile.py
new file mode 100644
index 0000000..5df8f59
--- /dev/null
+++ b/util/configfile.py
@@ -0,0 +1,158 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2011 Collabora Ltd. <http://www.collabora.co.uk/>
+#
+
+import gobject
+
+class ConfigFile(gobject.GObject):
+ """Load/save a simple (key = value) config file"""
+
+ __gsignals__ = {
+ 'configuration-loaded': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
+ ()),
+ 'configuration-saved': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
+ ()),
+ }
+
+ def __init__(self, config_file_path, valid_keys = {}):
+ gobject.GObject.__init__(self)
+
+ self._config_file_path = config_file_path
+ self._valid_keys = valid_keys
+ self._config_hash = {}
+ self._is_loaded = False
+
+ def set_valid_keys(self, valid_keys):
+ self._valid_keys = valid_keys
+
+ def is_loaded(self):
+ return self._is_loaded
+
+ def get(self, key, empty_if_not_loaded = False):
+ if not self._valid_keys.has_key(key):
+ raise RuntimeError("Unknown config value %s" % key)
+
+ if self._config_hash.has_key(key):
+ value = self._config_hash[key]
+ else:
+ if self._valid_keys[key]["type"] == "text":
+ value = ""
+ elif self._valid_keys[key]["type"] == "boolean":
+ value = False
+ elif self._valid_keys[key]["type"] == "integer":
+ value = 0
+
+ return value
+
+ def set(self, key, value):
+ if not self._valid_keys.has_key(key):
+ raise RuntimeError("Unknown config value %s" % key)
+
+ self._config_hash[key] = value
+
+ def load(self):
+ try:
+ config_file = open(self._config_file_path, 'r')
+ lines = config_file.readlines()
+ config_file.close()
+ for line in lines:
+ line = line.strip()
+ k,v = line.split('=')
+ k = k.strip(' ')
+ v = v.strip(' ')
+ if not self._valid_keys.has_key(k):
+ raise RuntimeError("Unknown config value %s" % k)
+ value_type = self._valid_keys[k]["type"]
+ if value_type == "text":
+ value = v
+ elif value_type == "boolean":
+ value = eval(v)
+ elif value_type == "integer":
+ value = int(v)
+ self._config_hash[k] = value
+ self._is_loaded = True
+ self.emit('configuration-loaded')
+ except Exception,e:
+ print e
+
+ return self._is_loaded
+
+ def save(self):
+ config_file = open(self._config_file_path, 'w')
+ for k in self._config_hash.keys():
+ v = self._config_hash[k]
+ l = "%s = %s\n" % (k, v)
+ config_file.write(l)
+ config_file.close()
+ self.emit('configuration-saved')
+
+ def dump_keys(self):
+ print "\n\nDumping keys\n\n"
+ for k in self._config_hash.keys():
+ v = self._config_hash[k]
+ l = "%s = %s\n" % (k, v)
+ print l
+
+def test_save_load(test_config_file):
+ keys = {}
+ keys["nick"] = { "type" : "text" }
+ keys["account_id"] = { "type" : "text" }
+ keys["server"] = { "type" : "text" }
+ keys["port"] = { "type" : "text" }
+ keys["password"] = { "type" : "text" }
+ keys["register"] = { "type" : "text" }
+
+ c = ConfigFile(test_config_file)
+ c.set_valid_keys(keys)
+ c.set("nick", "rgs")
+ c.set("account_id", "rgs@andromeda")
+ c.set("server", "andromeda")
+ c.set("port", 5223)
+ c.set("password", "97c74fa0dc3b39b8c87f119fa53cced2b7040786")
+ c.set("register", True)
+
+ c.save()
+
+ c = ConfigFile(test_config_file)
+ c.set_valid_keys(keys)
+ c.load()
+ c.dump_keys()
+
+def _configuration_saved_cb(config_file_obj):
+ print "_configuration_saved_cb called"
+ config_file_obj.dump_keys()
+
+def _configuration_loaded_cb(config_file_obj):
+ print "_configuration_loaded_cb called"
+ config_file_obj.dump_keys()
+
+def test_signals(test_config_file):
+ keys = {}
+ keys["nick"] = { "type" : "text" }
+ keys["account_id"] = { "type" : "text" }
+ keys["server"] = { "type" : "text" }
+ keys["port"] = { "type" : "text" }
+ keys["password"] = { "type" : "text" }
+ keys["register"] = { "type" : "text" }
+
+ c = ConfigFile(test_config_file)
+ c.connect('configuration-saved', _configuration_saved_cb)
+ c.set_valid_keys(keys)
+ c.set("nick", "rgs")
+ c.set("account_id", "rgs@andromeda")
+ c.set("server", "andromeda")
+ c.set("port", 5223)
+ c.set("password", "97c74fa0dc3b39b8c87f119fa53cced2b7040786")
+ c.set("register", True)
+
+ c.save()
+
+ c = ConfigFile(test_config_file)
+ c.connect('configuration-loaded', _configuration_loaded_cb)
+ c.set_valid_keys(keys)
+ c.load()
+
+if __name__ == "__main__":
+ test_save_load("/tmp/configfile.0001")
+ test_signals("/tmp/configfile.0002")
diff --git a/util/configwizard.py b/util/configwizard.py
new file mode 100644
index 0000000..7716362
--- /dev/null
+++ b/util/configwizard.py
@@ -0,0 +1,192 @@
+#!/usr/bin/python
+
+from configfile import ConfigFile
+import gtk
+
+class ConfigWizard():
+ """Simple configuration wizard window."""
+
+ def __init__(self, config_file_path):
+ self._config_items = []
+ self._config_entries = {}
+ self._config_file_path = config_file_path
+ self._config_file_obj = None
+
+ """
+ [ { item_label, item_type, item_name, item_with_value } , ... ]
+ """
+ def set_config_items(self, items):
+ self._config_items = items
+ keys = {}
+ for i in self._config_items:
+ keys[i["item_name"]] = { "type" : i["item_type"] }
+ self._valid_keys = keys
+
+ def set_config_file_obj(self, obj):
+ self._config_file_obj = obj
+
+ def get_config_file_obj(self, obj):
+ return self._config_file_obj
+
+ def show(self, read_from_disc = False):
+
+ if read_from_disc:
+ self._config_file_obj = ConfigFile(self._config_file_path)
+ self._config_file_obj.set_valid_keys(self._valid_keys)
+ self._config_file_obj.load()
+ else:
+ if self._config_file_obj is None:
+ raise RuntimeError("I need the run time obj")
+
+ self._config_popup = gtk.Window()
+ self._config_popup.set_default_size(200, 200)
+ self._config_popup.connect('delete_event', self._close_config_cb)
+ table = gtk.Table(12, 1, True)
+ self._config_popup.add(table)
+
+ row = 1
+ for i in self._config_items:
+ hbox = self._create_param(i)
+ table.attach(hbox, 0, 1, row, row+1, xpadding=5, ypadding=2)
+ row = row +1
+
+ hbox = gtk.HBox()
+ save_button = gtk.Button('Save')
+ save_button.set_size_request(50, 15)
+ save_button.connect('pressed', self._save_config_cb)
+ hbox.add(save_button)
+ cancel_button = gtk.Button('Cancel')
+ cancel_button.set_size_request(50, 15)
+ cancel_button.connect('pressed', self._close_config_cb)
+ hbox.add(cancel_button)
+ table.attach(hbox, 0, 1, row, row+1, xpadding=5, ypadding=2)
+
+ self._config_popup.show_all()
+
+ def _save_config_cb(self, widget):
+ try:
+ self._do_save_config()
+ except Exception, e:
+ w = gtk.Window()
+ l = gtk.Label(e.message)
+ w.add(l)
+ w.show_all()
+ finally:
+ self._config_popup.hide()
+
+ def _do_save_config(self):
+ for i in self._config_items:
+ param_name = i["item_name"]
+ v = self._config_entries[param_name]
+ if v.__class__ is gtk.Entry:
+ value = v.get_text()
+ elif v.__class__ is gtk.CheckButton:
+ value = v.get_active()
+ else:
+ raise RuntimeError("Don't recognize the class %s" % type(v))
+ self._config_file_obj.set(param_name, value)
+
+ self._config_file_obj.save()
+
+ """
+ { item_label, item_type, item_name, item_with_value }
+ """
+ def _create_param(self, opts):
+ param_name = opts["item_name"]
+ with_value = opts["item_with_value"] if opts.has_key("item_with_value") else True
+ hbox = gtk.HBox()
+ if opts["item_type"] == "text":
+ entry = gtk.Entry()
+ entry.set_size_request(150, 25)
+ if with_value:
+ value = self._config_file_obj.get(param_name, True)
+ entry.set_text(str(value))
+ elif opts["item_type"] == "boolean":
+ entry = gtk.CheckButton()
+ if with_value:
+ value = self._config_file_obj.get(param_name, True)
+ entry.set_active(value)
+ self._config_entries[param_name] = entry
+ label = gtk.Label(opts["item_label"] + ': ')
+ label.set_alignment(1.0, 0.5)
+ label.set_size_request(100, 25)
+ hbox.add(label)
+ hbox.add(entry)
+ return hbox
+
+ def _close_config_cb(self, widget, event=None):
+ self._config_popup.hide()
+
+def test_wizard_from_config_file_obj(test_config_file):
+ keys = {}
+ keys["nick"] = { "type" : "text" }
+ keys["account_id"] = { "type" : "text" }
+ keys["server"] = { "type" : "text" }
+ keys["port"] = { "type" : "text" }
+ keys["password"] = { "type" : "text" }
+ keys["register"] = { "type" : "text" }
+
+ c = ConfigFile(test_config_file)
+ c.set_valid_keys(keys)
+ c.set("nick", "rgs")
+ c.set("account_id", "rgs@andromeda")
+ c.set("server", "andromeda")
+ c.set("port", 5223)
+ c.set("password", "97c74fa0dc3b39b8c87f119fa53cced2b7040786")
+ c.set("register", True)
+
+ c.save()
+
+ c = ConfigFile(test_config_file)
+ c.set_valid_keys(keys)
+ c.load()
+
+ config_w = ConfigWizard(test_config_file)
+ config_items = [
+ {"item_label" : "Nickname", "item_type" : "text", "item_name" : "nick" },
+ { "item_label" : "Account ID", "item_type" : "text", "item_name" : "account_id" },
+ { "item_label" : "Server", "item_type" : "text", "item_name" : "server" },
+ { "item_label" : "Port", "item_type" : "text", "item_name" : "port" },
+ { "item_label" : "Password", "item_type" : "text", "item_name" : "password" },
+ { "item_label" : "Register", "item_type" : "text", "item_name" : "register" }
+ ]
+ config_w.set_config_items(config_items)
+ config_w.set_config_file_obj(c)
+ config_w.show()
+
+def test_wizard_from_config_file_path(test_config_file):
+ keys = {}
+ keys["nick"] = { "type" : "text" }
+ keys["account_id"] = { "type" : "text" }
+ keys["server"] = { "type" : "text" }
+ keys["port"] = { "type" : "text" }
+ keys["password"] = { "type" : "text" }
+ keys["register"] = { "type" : "text" }
+
+ c = ConfigFile(test_config_file)
+ c.set_valid_keys(keys)
+ c.set("nick", "rgs")
+ c.set("account_id", "rgs@andromeda")
+ c.set("server", "andromeda")
+ c.set("port", 5223)
+ c.set("password", "97c74fa0dc3b39b8c87f119fa53cced2b7040786")
+ c.set("register", True)
+
+ c.save()
+
+ config_w = ConfigWizard(test_config_file)
+ config_items = [
+ {"item_label" : "Nickname", "item_type" : "text", "item_name" : "nick" },
+ { "item_label" : "Account ID", "item_type" : "text", "item_name" : "account_id" },
+ { "item_label" : "Server", "item_type" : "text", "item_name" : "server" },
+ { "item_label" : "Port", "item_type" : "text", "item_name" : "port" },
+ { "item_label" : "Password", "item_type" : "text", "item_name" : "password" },
+ { "item_label" : "Register", "item_type" : "text", "item_name" : "register" }
+ ]
+ config_w.set_config_items(config_items)
+ config_w.show(True)
+
+if __name__ == "__main__":
+ #test_wizard_from_config_file_obj("/tmp/configwizard.test.0001")
+ test_wizard_from_config_file_path("/tmp/configwizard.test.0002")
+ gtk.main()