changeset 90eb14f40b6e in tryton:default
details: https://hg.tryton.org/tryton?cmd=changeset;node=90eb14f40b6e
description:
        Rely on editing property of renderer to set value

        In Python3, the 'remove-widget' is not trigger when the selected row is
        changed. This makes the attribute editabletree_entry not reliable. 
Instead we
        should use the editing property of the renderer and manage the editable
        reference on the widget (which is a cleaner separation concept). This 
allows
        also to remove duplicate code in set_value by calling on_editing_done.

        issue7936
        review46711002
diffstat:

 tryton/gui/window/view_form/view/list_gtk/editabletree.py |  25 ++------------
 tryton/gui/window/view_form/view/list_gtk/widget.py       |   5 +++
 2 files changed, 9 insertions(+), 21 deletions(-)

diffs (66 lines):

diff -r 33bddb1a5ad0 -r 90eb14f40b6e 
tryton/gui/window/view_form/view/list_gtk/editabletree.py
--- a/tryton/gui/window/view_form/view/list_gtk/editabletree.py Wed Jan 30 
10:04:52 2019 +0100
+++ b/tryton/gui/window/view_form/view/list_gtk/editabletree.py Wed Jan 30 
10:10:00 2019 +0100
@@ -115,21 +115,12 @@
 
     def set_value(self):
         path, column = self.get_cursor()
-        model = self.get_model()
         if not path or not column or not column.name:
             return True
-        record = model.get_value(model.get_iter(path), 0)
-        field = record[column.name]
-        if hasattr(field, 'editabletree_entry'):
-            entry = field.editabletree_entry
-            if isinstance(entry, (Date, Time)):
-                entry.activate()
-                txt = entry.props.value
-            elif isinstance(entry, gtk.Entry):
-                txt = entry.get_text()
-            else:
-                txt = entry.get_active_text()
-            self.on_quit_cell(record, column, txt)
+        for renderer in column.get_cell_renderers():
+            if renderer.props.editing:
+                widget = self.view.get_column_widget(column)
+                self.on_editing_done(widget.editable)
         return True
 
     def on_keypressed(self, entry, event):
@@ -235,14 +226,6 @@
             field = record[column.name]
             if isinstance(entry, gtk.Entry):
                 entry.set_max_length(int(field.attrs.get('size', 0)))
-            # store in the record the entry widget to get the value in
-            # set_value
-            field.editabletree_entry = entry
-
-            def remove_widget(widget):
-                if hasattr(field, 'editabletree_entry'):
-                    del field.editabletree_entry
-            entry.connect('remove-widget', remove_widget)
             record.modified_fields.setdefault(column.name)
             return False
 
diff -r 33bddb1a5ad0 -r 90eb14f40b6e 
tryton/gui/window/view_form/view/list_gtk/widget.py
--- a/tryton/gui/window/view_form/view/list_gtk/widget.py       Wed Jan 30 
10:04:52 2019 +0100
+++ b/tryton/gui/window/view_form/view/list_gtk/widget.py       Wed Jan 30 
10:10:00 2019 +0100
@@ -170,6 +170,7 @@
 
 class GenericText(Cell):
     align = 0
+    editable = None
 
     def __init__(self, view, attrs, renderer=None):
         super(GenericText, self).__init__()
@@ -259,6 +260,10 @@
             callback()
 
     def editing_started(self, cell, editable, path):
+        def remove(editable):
+            self.editable = None
+        self.editable = editable
+        editable.connect('remove-widget', remove)
         return False
 
     def _get_record_field(self, path):

Reply via email to