From 26368bfb5aaa152360c15726cc9ea6a5ea0599b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Thu, 22 May 2014 23:27:31 +0200 Subject: [PATCH] Factorize TreeView with CONTROL MASK inverted - always grab focus on button press - use bitwise exclusive or to allow usage of CONTROL - use this view for search box issue3919 review5301002 --- tryton/common/treeviewcontrol.py | 29 +++++++++++++++++++ .../view_form/view/form_gtk/multiselection.py | 19 ++---------- .../window/view_form/view/screen_container.py | 3 +- 3 files changed, 33 insertions(+), 18 deletions(-) create mode 100644 tryton/common/treeviewcontrol.py diff --git a/tryton/common/treeviewcontrol.py b/tryton/common/treeviewcontrol.py new file mode 100644 index 0000000000..d6ecc2af64 --- /dev/null +++ b/tryton/common/treeviewcontrol.py @@ -0,0 +1,29 @@ +# This file is part of Tryton. The COPYRIGHT file at the top level of this +# repository contains the full copyright notices and license terms. +import gtk + +MOVEMENT_KEYS = {gtk.keysyms.Up, gtk.keysyms.Down, gtk.keysyms.space, + gtk.keysyms.Left, gtk.keysyms.KP_Left, + gtk.keysyms.Right, gtk.keysyms.KP_Right, + gtk.keysyms.Home, gtk.keysyms.KP_Home, + gtk.keysyms.End, gtk.keysyms.KP_End} + +__all__ = ['TreeViewControl'] + + +class TreeViewControl(gtk.TreeView): + __gsignals__ = { + 'button-press-event': 'override', + 'key-press-event': 'override', + } + + def do_button_press_event(self, event): + self.grab_focus() # grab focus because it doesn't whith CONTROL MASK + if event.button == 1: + event.state ^= gtk.gdk.CONTROL_MASK + return super(TreeViewControl, self).do_button_press_event(self, event) + + def do_key_press_event(self, event): + if event.keyval in MOVEMENT_KEYS: + event.state ^= gtk.gdk.CONTROL_MASK + return super(TreeViewControl, self).do_key_press_event(self, event) diff --git a/tryton/gui/window/view_form/view/form_gtk/multiselection.py b/tryton/gui/window/view_form/view/form_gtk/multiselection.py index 0e44673d61..8e4b6c22df 100644 --- a/tryton/gui/window/view_form/view/form_gtk/multiselection.py +++ b/tryton/gui/window/view_form/view/form_gtk/multiselection.py @@ -5,12 +5,7 @@ import gobject from .interface import WidgetInterface from tryton.common.selection import SelectionMixin - -MOVEMENT_KEYS = {gtk.keysyms.Up, gtk.keysyms.Down, gtk.keysyms.space, - gtk.keysyms.Left, gtk.keysyms.KP_Left, - gtk.keysyms.Right, gtk.keysyms.KP_Right, - gtk.keysyms.Home, gtk.keysyms.KP_Home, - gtk.keysyms.End, gtk.keysyms.KP_End} +from tryton.common.treeviewcontrol import TreeViewControl class MultiSelection(WidgetInterface, SelectionMixin): @@ -27,12 +22,10 @@ class MultiSelection(WidgetInterface, SelectionMixin): viewport.add(scroll) self.model = gtk.ListStore(gobject.TYPE_INT, gobject.TYPE_STRING) - self.tree = gtk.TreeView() + self.tree = TreeViewControl() self.tree.set_model(self.model) self.tree.set_search_column(1) self.tree.connect('focus-out-event', lambda *a: self._focus_out()) - self.tree.connect('button-press-event', self.__button_press) - self.tree.connect('key_press_event', self.__key_press) selection = self.tree.get_selection() selection.set_mode(gtk.SELECTION_MULTIPLE) selection.connect('changed', self.send_modified) @@ -89,11 +82,3 @@ class MultiSelection(WidgetInterface, SelectionMixin): if (element not in group.record_removed and element not in group.record_deleted): selection.select_path(id2path[element.id]) - - def __button_press(self, treeview, event): - if event.button == 1: - event.state |= gtk.gdk.CONTROL_MASK - - def __key_press(self, treeview, event): - if event.keyval in MOVEMENT_KEYS: - event.state |= gtk.gdk.CONTROL_MASK diff --git a/tryton/gui/window/view_form/view/screen_container.py b/tryton/gui/window/view_form/view/screen_container.py index 295d7c4617..5949658ec0 100644 --- a/tryton/gui/window/view_form/view/screen_container.py +++ b/tryton/gui/window/view_form/view/screen_container.py @@ -7,6 +7,7 @@ import gobject import tryton.common as common from tryton.common.domain_parser import quote from tryton.common.placeholder_entry import PlaceholderEntry +from tryton.common.treeviewcontrol import TreeViewControl from tryton.translate import date_format from tryton.config import TRYTON_ICON from tryton.pyson import PYSONDecoder @@ -42,7 +43,7 @@ class Selection(gtk.ScrolledWindow): def __init__(self, selections): super(Selection, self).__init__() - self.treeview = gtk.TreeView() + self.treeview = TreeViewControl() model = gtk.ListStore(gobject.TYPE_STRING) for selection in selections: model.append((selection,))