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
This commit is contained in:
Cédric Krier committed 2022-04-25 23:20:58 +02:00
1 parent d43f4a842e
commit 7a1781097c
3 files changed
+50 -22

No files matched your search

+2 -2
View File
@@ -618,8 +618,8 @@ class Form(TabContent):
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" % (
+40 -20
View File
@@ -982,10 +982,8 @@ class Screen:
# 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 @@ class Screen:
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 @@ class Screen:
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 @@ class Screen:
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
self.set_cursor(reset_view=False)
view.display()
return self.group[0] if len(self.group) else None
def display_prev(self):
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 _get_prev_record(self):
view = self.current_view
if view.view_type == 'tree' and len(self.group):
range_ = view.treeview.get_visible_range()
if range_:
@@ -1074,7 +1082,9 @@ class Screen:
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 @@ class Screen:
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 @@ class Screen:
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()
+8
View File
@@ -465,6 +465,8 @@ class ViewTree(View):
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 @@ class ViewTree(View):
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]: