Reviewers: ,


Please review this at http://codereview.tryton.org/530002/

Affected files:
  M CHANGELOG
  M tryton/gui/window/view_form/view/list.py
  M tryton/gui/window/view_form/view/list_gtk/parser.py


Index: CHANGELOG
===================================================================

--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,4 @@
+* Allow to paste in editable list view
 * Manage readonly state on group
 * Remove "Please wait" box
 * Refactorize date widgets

Index: tryton/gui/window/view_form/view/list.py
===================================================================

--- a/tryton/gui/window/view_form/view/list.py
+++ b/tryton/gui/window/view_form/view/list.py
@@ -346,6 +346,10 @@
                 and event.state & gtk.gdk.CONTROL_MASK):
             self.on_copy()
             return False
+        if (event.keyval == gtk.keysyms.v
+                and event.state & gtk.gdk.CONTROL_MASK):
+            self.on_paste()
+            return False
         if event.keyval in (gtk.keysyms.Down, gtk.keysyms.Up):
             path, column = widget.get_cursor()
             if not path:
@@ -447,6 +451,52 @@
         del selection
         return

+    def on_paste(self):
+        if (not hasattr(self.widget_tree, 'editable')
+                or not self.widget_tree.editable):
+            return
+
+        def unquote(value):
+            if value[:1] == '"' and value[-1:] == '"':
+                return value[1:-1]
+            return value
+        data = []
+        for clipboard_type in (gtk.gdk.SELECTION_CLIPBOARD,
+                gtk.gdk.SELECTION_PRIMARY):
+            clipboard = self.widget_tree.get_clipboard(clipboard_type)
+            text = clipboard.wait_for_text()
+            if not text:
+                continue
+            data = [[unquote(v) for v in l.split('\t')]
+                for l in text.splitlines()]
+            break
+        col = self.widget_tree.get_cursor()[1]
+        columns = [c for c in self.widget_tree.get_columns()
+            if c.get_visible() and c.name]
+        if col in columns:
+            idx = columns.index(col)
+            columns = columns[idx:]
+        record = self.screen.current_record
+        group = record.group
+        idx = group.index(record)
+        for line in data:
+            record = group[idx]
+            for col, value in zip(columns, line):
+                cell = self.widget_tree.cells[col.name]
+                if cell.get_textual_value(record) != value:
+                    cell.value_from_text(record, value)
+                    if cell.get_textual_value(record) != value:
+                        # Stop setting value if a value is correctly set
+                        idx = len(group)
+                        break
+            if not record.validate() or not record.save():
+                break
+            idx += 1
+            if idx > len(group):
+                break
+        self.screen.current_record = record
+        self.screen.display(set_cursor=True)
+
     def drag_begin(self, treeview, context):
         return True

@@ -556,6 +606,9 @@
                 copy_item = gtk.ImageMenuItem('gtk-copy')
                 copy_item.connect('activate', lambda x: self.on_copy())
                 menu.append(copy_item)
+                paste_item = gtk.ImageMenuItem('gtk-paste')
+                paste_item.connect('activate', lambda x: self.on_paste())
+                menu.append(paste_item)
                 # Don't activate actions if parent is modified
                 parent = record.parent if record else None
                 while parent:

Index: tryton/gui/window/view_form/view/list_gtk/parser.py
===================================================================

--- a/tryton/gui/window/view_form/view/list_gtk/parser.py
+++ b/tryton/gui/window/view_form/view/list_gtk/parser.py
@@ -596,9 +596,8 @@
                 callback()
             return
         if len(ids) != 1:
-            if callback:
-                self.search_remote(record, relation, ids, domain=domain,
-                    context=context, callback=callback)
+            self.search_remote(record, relation, ids, domain=domain,
+                context=context, callback=callback)
             return
         field.set_client(record, ids[0])
         if callback:



--
[email protected] mailing list

Reply via email to