changeset 5829674cd606 in tryton:default
details: https://hg.tryton.org/tryton?cmd=changeset;node=5829674cd606
description:
Position new record based on order
We sent an order to the client for action and xxx2Many so its screen has
always a default order set.
To position a new record on non editable tree, we use the order of the
'id'
column if presents.
issue8880
review276501003
diffstat:
CHANGELOG | 1 +
tryton/gui/window/view_form/screen/screen.py | 21 ++++++++++-----
tryton/gui/window/view_form/view/form_gtk/many2many.py | 1 +
tryton/gui/window/view_form/view/form_gtk/one2many.py | 1 +
tryton/gui/window/view_form/view/list.py | 9 ++---
tryton/gui/window/view_form/view/list_gtk/editabletree.py | 12 ++-----
tryton/gui/window/view_form/view/list_gtk/widget.py | 7 ++--
7 files changed, 28 insertions(+), 24 deletions(-)
diffs (176 lines):
diff -r f577de6b639c -r 5829674cd606 CHANGELOG
--- a/CHANGELOG Sat Dec 28 17:52:30 2019 +0100
+++ b/CHANGELOG Sat Dec 28 18:16:28 2019 +0100
@@ -1,3 +1,4 @@
+* Position new record based on order
* Allow relation field to be selected in CSV export
* Support validate attribute of wizard's Button
diff -r f577de6b639c -r 5829674cd606
tryton/gui/window/view_form/screen/screen.py
--- a/tryton/gui/window/view_form/screen/screen.py Sat Dec 28 17:52:30
2019 +0100
+++ b/tryton/gui/window/view_form/screen/screen.py Sat Dec 28 18:16:28
2019 +0100
@@ -597,7 +597,7 @@
else:
group = self.group
record = group.new(default, rec_name=rec_name)
- group.add(record, self.new_model_position())
+ group.add(record, self.new_position)
if previous_view.view_type == 'calendar':
previous_view.set_default_date(record, selected_date)
self.current_record = record
@@ -606,12 +606,19 @@
GLib.idle_add(self.set_cursor, True)
return self.current_record
- def new_model_position(self):
- position = -1
- if (self.current_view and self.current_view.view_type == 'tree'
- and self.current_view.attributes.get('editable') == 'top'):
- position = 0
- return position
+ @property
+ def new_position(self):
+ if self.order:
+ for oexpr, otype in self.order:
+ if oexpr == 'id' and otype:
+ if otype.startswith('DESC'):
+ return 0
+ elif otype.startswith('ASC'):
+ return -1
+ if self.parent:
+ return -1
+ else:
+ return 0
def set_on_write(self, func_name):
if func_name:
diff -r f577de6b639c -r 5829674cd606
tryton/gui/window/view_form/view/form_gtk/many2many.py
--- a/tryton/gui/window/view_form/view/form_gtk/many2many.py Sat Dec 28
17:52:30 2019 +0100
+++ b/tryton/gui/window/view_form/view/form_gtk/many2many.py Sat Dec 28
18:16:28 2019 +0100
@@ -89,6 +89,7 @@
self.screen = Screen(attrs['relation'],
view_ids=attrs.get('view_ids', '').split(','),
mode=['tree'], views_preload=attrs.get('views', {}),
+ order=attrs.get('order'),
row_activate=self._on_activate,
limit=None)
self.screen.signal_connect(self, 'record-message', self._sig_label)
diff -r f577de6b639c -r 5829674cd606
tryton/gui/window/view_form/view/form_gtk/one2many.py
--- a/tryton/gui/window/view_form/view/form_gtk/one2many.py Sat Dec 28
17:52:30 2019 +0100
+++ b/tryton/gui/window/view_form/view/form_gtk/one2many.py Sat Dec 28
18:16:28 2019 +0100
@@ -160,6 +160,7 @@
mode=attrs.get('mode', 'tree,form').split(','),
view_ids=attrs.get('view_ids', '').split(','),
views_preload=attrs.get('views', {}),
+ order=attrs.get('order'),
row_activate=self._on_activate,
exclude_field=attrs.get('relation_field', None),
limit=None)
diff -r f577de6b639c -r 5829674cd606 tryton/gui/window/view_form/view/list.py
--- a/tryton/gui/window/view_form/view/list.py Sat Dec 28 17:52:30 2019 +0100
+++ b/tryton/gui/window/view_form/view/list.py Sat Dec 28 18:16:28 2019 +0100
@@ -438,9 +438,9 @@
self.sum_widgets = []
self.sum_box = Gtk.HBox()
self.treeview = None
- editable = xml.getAttribute('editable')
- if editable and not screen.readonly:
- self.treeview = EditableTreeView(editable, self)
+ self._editable = bool(int(xml.getAttribute('editable') or 0))
+ if self._editable:
+ self.treeview = EditableTreeView(self)
grid_lines = Gtk.TreeViewGridLines.BOTH
else:
self.treeview = TreeView(self)
@@ -609,8 +609,7 @@
@property
def editable(self):
- return (bool(getattr(self.treeview, 'editable', False))
- and not self.screen.readonly)
+ return self._editable and not self.screen.readonly
def get_fields(self):
return [col.name for col in self.treeview.get_columns() if col.name]
diff -r f577de6b639c -r 5829674cd606
tryton/gui/window/view_form/view/list_gtk/editabletree.py
--- a/tryton/gui/window/view_form/view/list_gtk/editabletree.py Sat Dec 28
17:52:30 2019 +0100
+++ b/tryton/gui/window/view_form/view/list_gtk/editabletree.py Sat Dec 28
18:16:28 2019 +0100
@@ -78,10 +78,6 @@
leaving_events = leaving_record_events + (
Gdk.KEY_Tab, Gdk.KEY_ISO_Left_Tab, Gdk.KEY_KP_Enter)
- def __init__(self, position, view):
- super(EditableTreeView, self).__init__(view)
- self.editable = position
-
def on_quit_cell(
self, current_record, column, renderer, value, callback=None):
field = current_record[column.name]
@@ -121,7 +117,7 @@
and (len(model) >= self.view.screen.size_limit >= 0))
if not access['create'] or limit:
return
- if self.editable == 'top':
+ if self.view.screen.new_position == 0:
method = model.prepend
else:
method = model.append
@@ -231,7 +227,7 @@
elif keyval == Gdk.KEY_Down:
self._key_down(path, model, column)
elif keyval == Gdk.KEY_Return:
- if self.editable == 'top':
+ if self.view.screen.new_position == 0:
new_path = self._key_up(path, model)
else:
new_path = self._key_down(path, model)
@@ -278,7 +274,7 @@
return True
def _key_down(self, path, model, column=None):
- if path[0] == len(model) - 1 and self.editable == 'bottom':
+ if path[0] == len(model) - 1 and self.view.screen.new_position == -1:
self.on_create_line()
new_path = Gtk.TreePath((path[0] + 1) % len(model))
if not column:
@@ -288,7 +284,7 @@
return new_path
def _key_up(self, path, model, column=None):
- if path[0] == 0 and self.editable == 'top':
+ if path[0] == 0 and self.view.screen.new_position == 0:
self.on_create_line()
new_path = Gtk.TreePath(0)
else:
diff -r f577de6b639c -r 5829674cd606
tryton/gui/window/view_form/view/list_gtk/widget.py
--- a/tryton/gui/window/view_form/view/list_gtk/widget.py Sat Dec 28
17:52:30 2019 +0100
+++ b/tryton/gui/window/view_form/view/list_gtk/widget.py Sat Dec 28
18:16:28 2019 +0100
@@ -242,9 +242,8 @@
cell.set_property('strikethrough', record.deleted)
cell.set_property('text', text)
- editable = getattr(self.view.treeview, 'editable', False)
states = ('invisible',)
- if editable:
+ if self.view.editable:
states = ('readonly', 'required', 'invisible')
field.state_set(record, states=states)
@@ -257,7 +256,7 @@
if invisible and not isinstance(cell, CellRendererToggle):
cell.set_property('text', '')
- if editable:
+ if self.view.editable:
readonly = self.attrs.get('readonly',
field.get_state_attrs(record).get('readonly', False))
if invisible:
@@ -483,7 +482,7 @@
cell.set_property('text', text)
states = ('invisible',)
- if getattr(self.view.treeview, 'editable', False):
+ if self.view.editable:
states = ('readonly', 'required', 'invisible')
field.state_set(record, states=states)