From 8ebb61c02ab7f38950aa19186b404a37319dea9b Mon Sep 17 00:00:00 2001 From: Raul Gutierrez Segales Date: Sat, 22 Jan 2011 21:07:45 +0000 Subject: Added helper classes that will be used for collaboration --- (limited to 'util') 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. +# + +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() -- cgit v0.9.1