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)

Reply via email to