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]: