From 09f4e8eaecafe477007540416da88de0069df5aa Mon Sep 17 00:00:00 2001 From: Eitan Isaacson Date: Sat, 28 May 2011 13:13:10 -0700 Subject: Add scanning support in antler. --- caribou/antler/keyboard_view.py | 72 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) (limited to 'caribou') diff --git a/caribou/antler/keyboard_view.py b/caribou/antler/keyboard_view.py index e7c0fd8..1192300 100644 --- a/caribou/antler/keyboard_view.py +++ b/caribou/antler/keyboard_view.py @@ -42,6 +42,25 @@ class AntlerKey(Gtk.Button): if key.get_extended_keys (): self._sublevel = AntlerSubLevel(self) + self._key_pressed_handler = key.connect( + 'key-pressed', + lambda x: self.set_state_flags(Gtk.StateFlags.ACTIVE, False)) + self._key_released_handler = key.connect( + 'key-released', + lambda x: self.unset_state_flags(Gtk.StateFlags.ACTIVE)) + + def set_dwell_scan(self, dwell): + if dwell: + self.set_state_flags(Gtk.StateFlags.SELECTED, False) + else: + self.unset_state_flags(Gtk.StateFlags.SELECTED) + + def set_group_scan_active(self, active): + if active: + self.set_state_flags(Gtk.StateFlags.INCONSISTENT, False) + else: + self.unset_state_flags(Gtk.StateFlags.INCONSISTENT) + def _on_prefs_clicked(self, key): p = PreferencesDialog(AntlerSettings()) p.populate_settings(CaribouSettings()) @@ -63,10 +82,14 @@ class AntlerKey(Gtk.Button): return "%s" % glib.markup_escape_text(label.encode('utf-8')) def _on_pressed(self, button): + self.caribou_key.handler_block(self._key_pressed_handler) self.caribou_key.press() + self.caribou_key.handler_unblock(self._key_pressed_handler) def _on_released(self, button): + self.caribou_key.handler_block(self._key_released_handler) self.caribou_key.release() + self.caribou_key.handler_unblock(self._key_released_handler) def do_get_preferred_width_for_height(self, w): return (w, w) @@ -120,6 +143,9 @@ class AntlerLayout(Gtk.HBox): if level: self.load_rows(level.get_rows ()) + level.connect("selected-item-changed", self._on_active_group_changed) + level.connect("step-item-changed", self._on_dwelling_group_changed) + level.connect("scan-cleared", self._on_scan_cleared) def add_column (self): col = Gtk.Grid() @@ -131,6 +157,40 @@ class AntlerLayout(Gtk.HBox): self._columns.append(col) return col + def _on_scan_cleared (self, level): + for key in self._active_scan_group: + self._keys_map[key].set_group_scan_active(False) + + self._active_scan_group = [] + + for key in self._dwelling_scan_group: + self._keys_map[key].set_dwell_scan(False) + + self._dwelling_scan_group = [] + + def _on_active_group_changed(self, level, active_item): + for key in self._active_scan_group: + self._keys_map[key].set_group_scan_active(False) + + if isinstance(active_item, Caribou.KeyModel): + self._active_scan_group = [active_item] + else: + self._active_scan_group = active_item.get_keys() + + for key in self._active_scan_group: + self._keys_map[key].set_group_scan_active(True) + + def _on_dwelling_group_changed(self, level, dwell_item): + for key in self._dwelling_scan_group: + self._keys_map[key].set_dwell_scan(False) + + if isinstance(dwell_item, Caribou.KeyModel): + self._dwelling_scan_group = [dwell_item] + else: + self._dwelling_scan_group = dwell_item.get_keys() + + for key in self._dwelling_scan_group: + self._keys_map[key].set_dwell_scan(True) def add_row(self, row, row_num=0): x = 0 @@ -151,16 +211,26 @@ class AntlerLayout(Gtk.HBox): int(self.KEY_SPAN * key.props.width), self.KEY_SPAN) x += int((key.props.width + key.props.margin_left ) * self.KEY_SPAN) - + def load_rows(self, rows): for row_num, row in enumerate(rows): self.add_row([c.get_keys() for c in row.get_columns()], row_num) + def _on_scan_state_changed(self, row, prop, antler_keys): + if prop.name == "scan-dwelling": + for key in antler_keys: + key.set_dwell_scan(row.props.scan_dwelling) + elif prop.name == "scan-active": + for key in antler_keys: + key.set_group_scan_active(row.props.scan_active) + class AntlerKeyboardView(Gtk.Notebook): def __init__(self): gobject.GObject.__init__(self) self.set_show_tabs(False) self.keyboard_model = Caribou.KeyboardModel() + self.scanner = Caribou.Scanner() + self.scanner.set_keyboard(self.keyboard_model) self.keyboard_model.connect("notify::active-group", self._on_group_changed) self.layers = {} -- cgit v1.2.1