changeset 4d1088d51219 in tryton:default
details: https://hg.tryton.org/tryton?cmd=changeset&node=4d1088d51219
description:
        Compute next/previous record to set button state

        The position is not enough to determine if the button will change the 
current
        record. Also the position can be a list for the tree.

        issue11413
        review405241002
diffstat:

 tryton/gui/window/form.py                    |   4 +-
 tryton/gui/window/view_form/screen/screen.py |  60 ++++++++++++++++++---------
 tryton/gui/window/view_form/view/list.py     |   8 +++
 3 files changed, 50 insertions(+), 22 deletions(-)

diffs (180 lines):

diff -r 4192c90e4750 -r 4d1088d51219 tryton/gui/window/form.py
--- a/tryton/gui/window/form.py Mon Apr 25 23:19:07 2022 +0200
+++ b/tryton/gui/window/form.py Mon Apr 25 23:20:58 2022 +0200
@@ -618,8 +618,8 @@
             set_sensitive(button_id, bool(position) and can_be_sensitive)
         set_sensitive('switch', self.screen.number_of_views > 1)
         set_sensitive('remove', self.screen.deletable)
-        set_sensitive('previous', position > (self.screen.offset + 1))
-        set_sensitive('next', position < size)
+        set_sensitive('previous', self.screen.has_prev())
+        set_sensitive('next', self.screen.has_next())
 
         if size < max_size:
             msg = "%s@%s/%s" % (
diff -r 4192c90e4750 -r 4d1088d51219 
tryton/gui/window/view_form/screen/screen.py
--- a/tryton/gui/window/view_form/screen/screen.py      Mon Apr 25 23:19:07 
2022 +0200
+++ b/tryton/gui/window/view_form/screen/screen.py      Mon Apr 25 23:20:58 
2022 +0200
@@ -982,10 +982,8 @@
         # Force record_message
         self.current_record = self.current_record
 
-    def display_next(self):
+    def _get_next_record(self):
         view = self.current_view
-        view.set_value()
-        self.set_cursor(reset_view=False)
         if view.view_type == 'tree' and len(self.group):
             range_ = view.treeview.get_visible_range()
             if range_:
@@ -996,7 +994,9 @@
                     vadjustment.props.upper)
                 model = view.treeview.get_model()
                 iter_ = model.get_iter(end)
-                self.current_record = model.get_value(iter_, 0)
+                return model.get_value(iter_, 0)
+            else:
+                return self.group[-1]
         elif (view.view_type == 'form'
                 and self.current_record
                 and self.current_record.group):
@@ -1024,12 +1024,12 @@
                     break
                 record = next
                 break
-            self.current_record = record
+            return record
         elif (view.view_type == 'list-form' and len(self.group)
                 and self.current_record in self.group):
             idx = self.group.index(self.current_record)
             if 0 <= idx < len(self.group) - 1:
-                self.current_record = self.group[idx + 1]
+                return self.group[idx + 1]
         elif view.view_type == 'calendar':
             record = self.current_record
             goocalendar = view.widgets.get('goocalendar')
@@ -1045,25 +1045,33 @@
                 events.sort()
                 if not record:
                     if events:
-                        self.current_record = events[0].record
+                        return events[0].record
                     else:
-                        self.current_record = None
+                        return
                 else:
                     for idx, event in enumerate(events):
                         if event.record == record:
                             next_id = idx + 1
                             if next_id < len(events):
-                                self.current_record = events[next_id].record
+                                return events[next_id].record
                             break
         else:
-            self.current_record = self.group[0] if len(self.group) else None
+            return self.group[0] if len(self.group) else None
+
+    def has_next(self):
+        next_record = self._get_next_record()
+        return next_record and next_record != self.current_record
+
+    def display_next(self):
+        view = self.current_view
+        view.set_value()
+        self.set_cursor(reset_view=False)
+        self.current_record = self._get_next_record()
         self.set_cursor(reset_view=False)
         view.display()
 
-    def display_prev(self):
+    def _get_prev_record(self):
         view = self.current_view
-        view.set_value()
-        self.set_cursor(reset_view=False)
         if view.view_type == 'tree' and len(self.group):
             range_ = view.treeview.get_visible_range()
             if range_:
@@ -1074,7 +1082,9 @@
                     vadjustment.props.lower)
                 model = view.treeview.get_model()
                 iter_ = model.get_iter(start)
-                self.current_record = model.get_value(iter_, 0)
+                return model.get_value(iter_, 0)
+            else:
+                return self.group[0]
         elif (view.view_type == 'form'
                 and self.current_record
                 and self.current_record.group):
@@ -1092,7 +1102,7 @@
                 parent = record.parent
                 if parent and record.model_name == parent.model_name:
                     record = parent
-            self.current_record = record
+            return record
         elif view.view_type == 'calendar':
             record = self.current_record
             goocalendar = view.widgets.get('goocalendar')
@@ -1108,23 +1118,33 @@
                 events.sort()
                 if not record:
                     if events:
-                        self.current_record = events[0].record
+                        return events[0].record
                     else:
-                        self.current_record = None
+                        return
                 else:
                     for idx, event in enumerate(events):
                         if event.record == record:
                             prev_id = idx - 1
                             if prev_id >= 0:
-                                self.current_record = events[prev_id].record
+                                return events[prev_id].record
                             break
         elif (view.view_type == 'list-form' and len(self.group)
                 and self.current_record in self.group):
             idx = self.group.index(self.current_record)
             if 0 < idx <= len(self.group) - 1:
-                self.current_record = self.group[idx - 1]
+                return self.group[idx - 1]
         else:
-            self.current_record = self.group[-1] if len(self.group) else None
+            return self.group[-1] if len(self.group) else None
+
+    def has_prev(self):
+        prev_record = self._get_prev_record()
+        return prev_record and prev_record != self.current_record
+
+    def display_prev(self):
+        view = self.current_view
+        view.set_value()
+        self.set_cursor(reset_view=False)
+        self.current_record = self._get_prev_record()
         self.set_cursor(reset_view=False)
         view.display()
 
diff -r 4192c90e4750 -r 4d1088d51219 tryton/gui/window/view_form/view/list.py
--- a/tryton/gui/window/view_form/view/list.py  Mon Apr 25 23:19:07 2022 +0200
+++ b/tryton/gui/window/view_form/view/list.py  Mon Apr 25 23:20:58 2022 +0200
@@ -465,6 +465,8 @@
         self.treeview.connect_after('row-activated', self.__sig_switch)
         if self.children_field:
             self.treeview.connect('test-expand-row', self.test_expand_row)
+            self.treeview.connect('row-expanded', self._row_expanded)
+            self.treeview.connect('row-collapsed', self._row_collapsed)
         self.treeview.set_rubber_banding(True)
 
         selection = self.treeview.get_selection()
@@ -719,6 +721,12 @@
             iter_ = model.iter_next(iter_)
         return False
 
+    def _row_expanded(self, treeview, iter_, path):
+        # Force record_message
+        self.screen.current_record = self.screen.current_record
+
+    _row_collapsed = _row_expanded
+
     def on_copy(self):
         for clipboard_type in [
                 Gdk.SELECTION_CLIPBOARD, Gdk.SELECTION_PRIMARY]:

Reply via email to