diff options
| author | Huang Peng <shawn.p.huang@gmail.com> | 2008-09-01 07:40:50 +0800 |
|---|---|---|
| committer | Huang Peng <shawn.p.huang@gmail.com> | 2008-09-01 07:40:50 +0800 |
| commit | 8ebf458002b30be9f7aebb87e3b471ef74f7b86a (patch) | |
| tree | 4e0d3fef8233020fa8404f988dbe8c1b41c6752e | |
| parent | 17eeeb8dd2ba385b1a9e67beb386abc83852a7c1 (diff) | |
| download | ibus-8ebf458002b30be9f7aebb87e3b471ef74f7b86a.tar.gz ibus-8ebf458002b30be9f7aebb87e3b471ef74f7b86a.tar.xz ibus-8ebf458002b30be9f7aebb87e3b471ef74f7b86a.zip | |
WIP
| -rw-r--r-- | ibus/setup/Makefile.am | 39 | ||||
| -rw-r--r-- | ibus/setup/__init__.py | 22 | ||||
| -rw-r--r-- | ibus/setup/keyboardshortcut.py | 265 | ||||
| -rw-r--r-- | ibus/setup/main.py | 55 |
4 files changed, 381 insertions, 0 deletions
diff --git a/ibus/setup/Makefile.am b/ibus/setup/Makefile.am new file mode 100644 index 0000000..aa94941 --- /dev/null +++ b/ibus/setup/Makefile.am @@ -0,0 +1,39 @@ +# vim:set noet ts=4: +# +# ibus - The Input Bus +# +# Copyright (c) 2007-2008 Huang Peng <shawn.p.huang@gmail.com> +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place, Suite 330, +# Boston, MA 02111-1307 USA +SUBDIRS = \ + $(NULL) + +ibus_PYTHON = \ + __init__.py \ + keyboardshortcut.py \ + $(NULL) + +ibusdir = @pkgpythondir@/setup + +EXTRA_DIST = \ + $(NULL) + +CLEANFILES = \ + *.pyc \ + $(NULL) + +DISTCLEANFILES = \ + $(NULL) diff --git a/ibus/setup/__init__.py b/ibus/setup/__init__.py new file mode 100644 index 0000000..4c7ca52 --- /dev/null +++ b/ibus/setup/__init__.py @@ -0,0 +1,22 @@ +# vim:set et sts=4 sw=4: +# +# ibus - The Input Bus +# +# Copyright (c) 2007-2008 Huang Peng <shawn.p.huang@gmail.com> +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place, Suite 330, +# Boston, MA 02111-1307 USA + + diff --git a/ibus/setup/keyboardshortcut.py b/ibus/setup/keyboardshortcut.py new file mode 100644 index 0000000..c667903 --- /dev/null +++ b/ibus/setup/keyboardshortcut.py @@ -0,0 +1,265 @@ +# vim:set et sts=4 sw=4: +# +# ibus - The Input Bus +# +# Copyright (c) 2007-2008 Huang Peng <shawn.p.huang@gmail.com> +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place, Suite 330, +# Boston, MA 02111-1307 USA + +__all__ = ( + "KeyboardShortcutSelection", + "KeyboardShortcutSelectionDialog", +); + +import gobject +import gtk +from gtk import gdk + +from gettext import dgettext +_ = lambda a : dgettext("ibus", a) +N_ = lambda a : a + +class KeyboardShortcutSelection(gtk.VBox): + def __init__(self, shortcuts = None): + super(KeyboardShortcutSelection, self).__init__() + self.__init_ui() + self.set_shortcuts(shortcuts) + + def __init_ui(self): + # label = gtk.Label(_("Keyboard shortcuts:")) + # label.set_justify(gtk.JUSTIFY_LEFT) + # label.set_alignment(0.0, 0.5) + # self.pack_start(label, False, True, 4) + + # shortcuts view + viewport = gtk.Viewport() + viewport.set_shadow_type(gtk.SHADOW_IN) + self.__shortcut_view = gtk.TreeView(gtk.ListStore(gobject.TYPE_STRING)) + self.__shortcut_view.set_size_request(-1, 100) + renderer = gtk.CellRendererText() + column = gtk.TreeViewColumn(_("Keyboard shortcuts"), renderer, text = 0) + self.__shortcut_view.append_column(column) + self.__shortcut_view.connect("cursor-changed", self.__shortcut_view_cursor_changed_cb) + viewport.add(self.__shortcut_view) + self.pack_start(viewport, True, True, 4) + + # key code + hbox = gtk.HBox() + label = gtk.Label(_("Key code:")) + label.set_justify(gtk.JUSTIFY_LEFT) + label.set_alignment(0.0, 0.5) + hbox.pack_start(label, False, True, 4) + + self.__keycode_entry = gtk.Entry() + self.__keycode_entry.connect("notify::text", self.__keycode_entry_notify_cb) + hbox.pack_start(self.__keycode_entry, True, True, 4) + self.__keycode_button = gtk.Button("...") + self.__keycode_button.connect("clicked", self.__keycode_button_clicked_cb) + hbox.pack_start(self.__keycode_button, False, True, 4) + self.pack_start(hbox, False, True, 4) + + # modifiers + hbox = gtk.HBox() + label = gtk.Label(_("Modifiers:")) + label.set_justify(gtk.JUSTIFY_LEFT) + label.set_alignment(0.0, 0.5) + hbox.pack_start(label, False, True, 4) + + table = gtk.Table(4, 2) + self.__modifier_buttons = [] + self.__modifier_buttons.append(("Ctrl", gtk.CheckButton("_Ctrl"), gdk.CONTROL_MASK)) + self.__modifier_buttons.append(("Alt", gtk.CheckButton("A_lt"), gdk.MOD1_MASK)) + self.__modifier_buttons.append(("Shift", gtk.CheckButton("_Shift"), gdk.SHIFT_MASK)) + self.__modifier_buttons.append(("Meta", gtk.CheckButton("_Meta"), gdk.META_MASK)) + self.__modifier_buttons.append(("Super", gtk.CheckButton("S_uper"), gdk.SUPER_MASK)) + self.__modifier_buttons.append(("Hyper", gtk.CheckButton("_Hyper"), gdk.HYPER_MASK)) + self.__modifier_buttons.append(("Capslock", gtk.CheckButton("Capsloc_k"), gdk.LOCK_MASK)) + self.__modifier_buttons.append(("Release", gtk.CheckButton("_Release"), gdk.RELEASE_MASK)) + for name, button, mask in self.__modifier_buttons: + button.connect("toggled", self.__modifier_button_toggled_cb, name) + + table.attach(self.__modifier_buttons[0][1], 0, 1, 0, 1) + table.attach(self.__modifier_buttons[1][1], 1, 2, 0, 1) + table.attach(self.__modifier_buttons[2][1], 2, 3, 0, 1) + table.attach(self.__modifier_buttons[3][1], 3, 4, 0, 1) + table.attach(self.__modifier_buttons[4][1], 0, 1, 1, 2) + table.attach(self.__modifier_buttons[5][1], 1, 2, 1, 2) + table.attach(self.__modifier_buttons[6][1], 2, 3, 1, 2) + table.attach(self.__modifier_buttons[7][1], 3, 4, 1, 2) + hbox.pack_start(table, True, True, 4) + self.pack_start(hbox, False, True, 4) + + # buttons + hbox = gtk.HBox() + # add button + self.__add_button = gtk.Button(stock = gtk.STOCK_ADD) + self.__add_button.connect("clicked", self.__add_button_clicked_cb) + hbox.pack_start(self.__add_button) + # apply button + self.__apply_button = gtk.Button(stock = gtk.STOCK_APPLY) + self.__apply_button.connect("clicked", self.__apply_button_clicked_cb) + hbox.pack_start(self.__apply_button) + # delete button + self.__delete_button = gtk.Button(stock = gtk.STOCK_DELETE) + self.__delete_button.connect("clicked", self.__delete_button_clicked_cb) + hbox.pack_start(self.__delete_button) + self.pack_start(hbox, False, True, 4) + + def set_shortcuts(self, shortcuts = None): + if shortcuts == None: + shortcuts = [] + model = self.__shortcut_view.get_model() + model.clear() + for shortcut in shortcuts: + model.insert(0, (shortcut,)) + # self.__shortcut_view.set_model(model) + + def get_shortcuts(self): + model = self.__shortcut_view.get_model() + return map(lambda i:i[0] , model) + + def add_shortcut(self, shortcut): + model = self.__shortcut_view.get_model() + model.insert(-1, (shortcut,)) + + def __get_shortcut_from_buttons(self): + modifiers = [] + keycode = self.__keycode_entry.get_text() + if gdk.keyval_from_name(keycode) == 0: + return None + + for name, button, mask in self.__modifier_buttons: + if button.get_active(): + modifiers.append(name) + if keycode.startswith("_"): + keycode = keycode[1:] + keys = modifiers + [keycode] + shortcut = "+".join(keys) + return shortcut + + def __set_shortcut_to_buttons(self, shortcut): + keys = shortcut.split("+") + mods = keys[:-1] + for name, button, mask in self.__modifier_buttons: + if name in mods: + button.set_active(True) + else: + button.set_active(False) + self.__keycode_entry.set_text(keys[-1]) + + def __get_selected_shortcut(self): + model = self.__shortcut_view.get_model() + path, column = self.__shortcut_view.get_cursor() + if path == None: + return None + return model[path[0]][0] + + def __set_selected_shortcut(self, shortcut): + model = self.__shortcut_view.get_model() + path, column = self.__shortcut_view.get_cursor() + model[path[0]][0] = shortcut + + def __del_selected_shortcut(self): + model = self.__shortcut_view.get_model() + path, column = self.__shortcut_view.get_cursor() + del model[path[0]] + + def __shortcut_view_cursor_changed_cb(self, treeview): + shortcut = self.__get_selected_shortcut() + self.__set_shortcut_to_buttons(shortcut) + if shortcut != None: + self.__delete_button.set_sensitive(True) + else: + self.__delete_button.set_sensitive(False) + + def __modifier_button_toggled_cb(self, button, name): + shortcut = self.__get_shortcut_from_buttons() + selected_shortcut = self.__get_selected_shortcut() + self.__add_button.set_sensitive(shortcut != None) + can_apply = shortcut != selected_shortcut and shortcut != None and selected_shortcut != None + self.__apply_button.set_sensitive(can_apply) + + def __keycode_entry_notify_cb(self, entry, arg): + shortcut = self.__get_shortcut_from_buttons() + selected_shortcut = self.__get_selected_shortcut() + self.__add_button.set_sensitive(shortcut != None) + can_apply = shortcut != selected_shortcut and shortcut != None and selected_shortcut != None + self.__apply_button.set_sensitive(can_apply) + + def __keycode_button_clicked_cb(self, button): + out = [] + dlg = gtk.MessageDialog(parent = self.get_toplevel(), buttons = gtk.BUTTONS_CLOSE) + message = _("Please press a key (or a key combination).\nThe dialog will be closed when the key is released.") + dlg.set_markup(message) + dlg.set_title(_("Please press a key (or a key combination)")) + + def __key_release_event(d, k, out): + out.append(k.copy()) + d.response(gtk.RESPONSE_OK) + + dlg.connect("key-release-event", __key_release_event, out) + id = dlg.run() + dlg.destroy() + if id != gtk.RESPONSE_OK or not out: + return + keyevent = out[0] + for name, button, mask in self.__modifier_buttons: + if keyevent.state & mask: + button.set_active(True) + else: + button.set_active(False) + self.__keycode_entry.set_text(gdk.keyval_name(keyevent.keyval)) + + def __add_button_clicked_cb(self, button): + shortcut = self.__get_shortcut_from_buttons() + self.add_shortcut(shortcut) + + def __apply_button_clicked_cb(self, button): + shortcut = self.__get_shortcut_from_buttons() + self.__set_selected_shortcut(shortcut) + + def __delete_button_clicked_cb(self, button): + self.__del_selected_shortcut() + self.__delete_button.set_sensitive(False) + self.__apply_button.set_sensitive(False) + +class KeyboardShortcutSelectionDialog(gtk.Dialog): + def __init__(self, title = None, parent = None, flags = 0, buttons = None): + super(KeyboardShortcutSelectionDialog, self).__init__(title, parent, flags, buttons) + self.__selection_view = KeyboardShortcutSelection() + self.vbox.pack_start(self.__selection_view) + self.vbox.show_all() + + def set_shortcuts(self, shotrcuts = None): + self.__selection_view.set_shortcuts(shotrcuts) + + def add_shortcut(self, shotrcut): + self.__selection_view.add_shortcut(shotrcut) + + def get_shortcuts(self): + return self.__selection_view.get_shortcuts() + + + +if __name__ == "__main__": + dlg = KeyboardShortcutSelectionDialog( + title = "Select test", + buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OK, gtk.RESPONSE_OK)) + dlg.add_shortcut("Ctrl+Shift+space") + dlg.set_shortcuts(None) + print dlg.run() + print dlg.get_shortcuts() + diff --git a/ibus/setup/main.py b/ibus/setup/main.py new file mode 100644 index 0000000..114b4d4 --- /dev/null +++ b/ibus/setup/main.py @@ -0,0 +1,55 @@ + +import gtk +_ = lambda a : a + +TYPE_NOTEBOOK, \ +TYPE_FRAME = range(2) + +general_page = [ +] + +notebook = [ + (_("General"), general_page), +] + +root_ui = [ + (TYPE_NOTEBOOK, notebook) +] + + + +class SetupDialog(gtk.Dialog): + def __init__(self): + super(SetupDialog, self).__init__() + + self.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_OK) + for i in root_ui: + widget = self.__create_ui(i) + self.vbox.pack_start(widget) + self.vbox.show_all() + + def __create_ui(self, ui): + print ui + type, data = ui + if type == TYPE_NOTEBOOK: + widget = self.__create_notebook(data) + else: + widget = None + return widget + + def __create_notebook(self, notebook): + widget = gtk.Notebook() + for page_name, data in notebook: + vbox = gtk.VBox() + for i in data: + widget = self.__create_ui(i) + vbox.pack_start(widget) + widget.append_page(vbox, gtk.Label(page_name)) + return widget + +def main(): + dlg = SetupDialog() + dlg.run() + +if __name__ == "__main__": + main() |
