diff --git a/CHANGELOG b/CHANGELOG index f222a5bc7e..c93645bb21 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ +* Add communication between boards * Added domain inversion feature * Handle loading attribute on fields * Use default format for value in wizard form diff --git a/tryton/gui/window/view_board/action.py b/tryton/gui/window/view_board/action.py index 3ec8cee780..cfff94e34c 100644 --- a/tryton/gui/window/view_board/action.py +++ b/tryton/gui/window/view_board/action.py @@ -13,12 +13,14 @@ import tryton.common as common from tryton.pyson import PYSONDecoder import gettext from tryton.config import CONFIG +from tryton.signal_event import SignalEvent _ = gettext.gettext -class Action(object): +class Action(SignalEvent): def __init__(self, window, attrs=None): + super(Action, self).__init__() self.act_id = int(attrs['name']) self._window = window self.screen = None @@ -51,10 +53,8 @@ class Action(object): self.context.update(PYSONDecoder(eval_ctx).decode( self.action.get('pyson_context', '{}'))) - domain_ctx = self.context.copy() - self.domain = PYSONDecoder(domain_ctx).decode( - self.action['pyson_domain']) - + self.domain = [] + self.update_domain([]) self.widget = gtk.Frame() self.widget.set_border_width(0) @@ -151,6 +151,8 @@ class Action(object): alignment.add(self.screen.screen_container.alternate_viewport) name = self.screen.current_view.title self.screen.signal_connect(self, 'record-message', self._sig_label) + self.screen.signal_connect(self, 'record-message', + self._active_changed) elif self.action['view_type'] == 'tree': ctx = {} ctx.update(rpc.CONTEXT) @@ -172,6 +174,8 @@ class Action(object): alignment.add(self.tree.widget_get()) name = self.tree.name self.tree.view.connect('key_press_event', self.sig_key_press) + self.tree.signal_connect(self, 'select-changed', + self._active_changed) if attrs.get('string'): self.title.set_text(attrs['string']) @@ -251,3 +255,28 @@ class Action(object): .get_selected_rows() for path in paths: self.tree.view.expand_row(path, False) + + def _active_changed(self, *args): + self.signal('active-changed') + + def _get_active(self): + if self.screen: + return common.EvalEnvironment(self.screen.current_record, False) + elif self.tree: + return {'id': self.tree.sel_id_get()} + + active = property(_get_active) + + def update_domain(self, actions): + domain_ctx = self.context.copy() + for action in actions: + if action.active: + domain_ctx['_active_%s' % action.act_id] = action.active + new_domain = PYSONDecoder(domain_ctx).decode( + self.action['pyson_domain']) + if self.domain == new_domain: + return + del self.domain[:] + self.domain.extend(new_domain) + if self.screen: + self.screen.search_filter() diff --git a/tryton/gui/window/view_board/view_board.py b/tryton/gui/window/view_board/view_board.py index 152b7aa388..5774b37a37 100644 --- a/tryton/gui/window/view_board/view_board.py +++ b/tryton/gui/window/view_board/view_board.py @@ -2,8 +2,9 @@ #this repository contains the full copyright notices and license terms. 'View board' -from parser import ParserBoard import xml.dom.minidom +from parser import ParserBoard +from tryton.gui.window.view_board.action import Action class ViewBoard(object): 'View board' @@ -18,7 +19,12 @@ class ViewBoard(object): continue self.widget, self.widgets = parser.parse(node) break + self.actions = [x for x in self.widgets if isinstance(x, Action)] + for action in self.actions: + action.signal_connect(self, 'active-changed', + self._active_changed) self.widget.show_all() + self._active_changed(None) def widget_get(self): return self.widget @@ -26,3 +32,9 @@ class ViewBoard(object): def reload(self): for widget in self.widgets: widget.display() + + def _active_changed(self, event_action, *args): + for action in self.actions: + if action == event_action: + continue + action.update_domain(self.actions) diff --git a/tryton/gui/window/view_tree/view_tree.py b/tryton/gui/window/view_tree/view_tree.py index 44093e080f..20418579b0 100644 --- a/tryton/gui/window/view_tree/view_tree.py +++ b/tryton/gui/window/view_tree/view_tree.py @@ -13,6 +13,7 @@ from tryton.common import HM_FORMAT import tryton.common as common from tryton.translate import date_format from tryton.pyson import PYSONDecoder +from tryton.signal_event import SignalEvent FIELDS_LIST_TYPE = { 'boolean': gobject.TYPE_BOOLEAN, @@ -323,11 +324,12 @@ class ViewTreeModel(gtk.GenericTreeModel, gtk.TreeSortable): except Exception: return None -class ViewTree(object): +class ViewTree(SignalEvent): "View tree" def __init__(self, view_info, ids, window, sel_multi=False, context=None): + super(ViewTree, self).__init__() self.window = window self.view = gtk.TreeView() self.view.set_headers_visible(not CONFIG['client.modepda']) @@ -342,10 +344,12 @@ class ViewTree(object): self.name = parse.title self.sel_multi = sel_multi + selection = self.view.get_selection() if sel_multi: - self.view.get_selection().set_mode(gtk.SELECTION_MULTIPLE) + selection.set_mode(gtk.SELECTION_MULTIPLE) else: - self.view.get_selection().set_mode(gtk.SELECTION_SINGLE) + selection.self.view.get_selection().set_mode(gtk.SELECTION_SINGLE) + selection.connect('changed', self.__select_changed) self.view.set_expander_column(self.view.get_column(1)) self.view.set_enable_search(False) self.view.get_column(0).set_visible(False) @@ -413,3 +417,6 @@ class ViewTree(object): if not i: return None return model.get_value(i, col) + + def __select_changed(self, tree_sel): + self.signal('select-changed')