From adc5e7b484430c9bb8e8a28028fa35889cd23720 Mon Sep 17 00:00:00 2001
From: Marko Mecina <marko.mecina@univie.ac.at>
Date: Tue, 20 Sep 2022 13:41:09 +0200
Subject: [PATCH] implement additional drag&drop and copy/paste functionality

---
 Ccs/editor.py            |  2 +-
 Ccs/poolview_sql.py      | 28 +++++++++++++++++++++++++++-
 Tst/tst/data_pool_tab.py | 36 +++++++++++++++++++++++++++++++++---
 Tst/tst/tc_management.py | 12 ++++++++++++
 Tst/tst/tm_management.py | 28 ++++++++++++++++++++++++++--
 Tst/tst/tst.py           |  9 +++++++++
 6 files changed, 108 insertions(+), 7 deletions(-)

diff --git a/Ccs/editor.py b/Ccs/editor.py
index 5f9d999..0e45700 100644
--- a/Ccs/editor.py
+++ b/Ccs/editor.py
@@ -860,7 +860,7 @@ class CcsEditor(Gtk.Window):
             label.set_text(filename.split('/')[-1])
             label.set_tooltip_text(filename)
 
-        img = Gtk.Image.new_from_icon_name(Gtk.STOCK_CLOSE, Gtk.IconSize.MENU)
+        img = Gtk.Image.new_from_icon_name('window-close-symbolic', Gtk.IconSize.MENU)
 
         button = Gtk.Button()
         button.set_image(img)
diff --git a/Ccs/poolview_sql.py b/Ccs/poolview_sql.py
index 8cdacb7..c08344c 100644
--- a/Ccs/poolview_sql.py
+++ b/Ccs/poolview_sql.py
@@ -578,6 +578,14 @@ class TMPoolView(Gtk.Window):
         scrollbar.connect('button-press-event', self.scroll_bar)
         # scrollbar.connect('value_changed', self.reselect_rows)
 
+
+        # Set up Drag and Drop
+        self.treeview.drag_source_set(Gdk.ModifierType.BUTTON1_MASK, [], Gdk.DragAction.COPY)
+        self.treeview.drag_source_set_target_list(None)
+        self.treeview.drag_source_add_text_targets()
+
+        self.treeview.connect("drag-data-get", self.on_drag_data_get)
+
         hbox = Gtk.HBox()
         hbox.pack_start(self.scrolled_treelist, 1, 1, 0)
         hbox.pack_start(scrollbar, 0, 0, 0)
@@ -623,7 +631,7 @@ class TMPoolView(Gtk.Window):
         self.reselect_rows()
 
     def resize_treeview(self, widget, event):
-        if (Gdk.WindowState.MAXIMIZED == event.new_window_state):
+        if Gdk.WindowState.MAXIMIZED == event.new_window_state:
             self.set_number_of_treeview_rows()
 
     # @delayed(10)
@@ -676,6 +684,24 @@ class TMPoolView(Gtk.Window):
         new_session.close()
         return rows
 
+    def on_drag_data_get(self, treeview, drag_context, selection_data, info, time, *args):
+        treeselection = treeview.get_selection()
+        model, my_iter = treeselection.get_selected()
+
+        if model is not None and my_iter is not None:
+            new_session = self.session_factory_storage
+            row = new_session.query(
+                Telemetry[self.decoding_type]
+            ).join(
+                DbTelemetryPool,
+                Telemetry[self.decoding_type].pool_id == DbTelemetryPool.iid
+            ).filter(
+                DbTelemetryPool.pool_name == self.active_pool_info.filename
+            ).filter(
+                Telemetry[self.decoding_type].idx == model[my_iter][0]
+            )
+            selection_data.set_text(str(row.first().raw), -1)
+            new_session.close()
 
     def fetch_lines_from_db(self, offset=0, limit=None, sort=None, order='asc', buffer=10, rows=None, scrolled=False,
                             force_import=False):
diff --git a/Tst/tst/data_pool_tab.py b/Tst/tst/data_pool_tab.py
index bf1f152..5a7ba38 100644
--- a/Tst/tst/data_pool_tab.py
+++ b/Tst/tst/data_pool_tab.py
@@ -118,10 +118,23 @@ class DataPoolTable(Gtk.Grid):
         self.treeview.drag_source_add_text_targets()
 
         self.treeview.connect("drag-data-get", self.on_drag_data_get)
-        self.treeview.connect("drag-begin", self.on_drag_begin)
+
+        self.clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
+        self.rcl_menu = TreeRightClickMenu(cruf=self)
+        self.treeview.connect("button-press-event", self.on_treeview_clicked)
 
         self.show_all()
 
+    def on_treeview_clicked(self, widget, event):
+        if event.button == 3:
+            self.rcl_menu.popup_at_pointer()
+
+    def copy_cell_content(self, cell_idx):
+        treeselection = self.treeview.get_selection()
+        model, it = treeselection.get_selected()
+        if model is not None and it is not None:
+            self.clipboard.set_text(model[it][cell_idx], -1)
+
     def on_pid_combo_changed(self, combo):
         combo_iter = combo.get_active_iter()
         if combo_iter is not None:
@@ -156,5 +169,22 @@ class DataPoolTable(Gtk.Grid):
         if model is not None and my_iter is not None:
             selection_data.set_text(model[my_iter][0], -1)
 
-    def on_drag_begin(self, *args):
-        pass
+
+class TreeRightClickMenu(Gtk.Menu):
+    def __init__(self, cruf):
+        super(TreeRightClickMenu, self).__init__()
+
+        entry_1 = Gtk.MenuItem('Copy PID')
+        self.attach(entry_1, 0, 1, 0, 1)
+        entry_1.show()
+        entry_2 = Gtk.MenuItem('Copy NAME')
+        self.attach(entry_2, 0, 1, 1, 2)
+        entry_2.show()
+        entry_1.connect('activate', self.on_copy_pid, cruf)
+        entry_2.connect('activate', self.on_copy_name, cruf)
+
+    def on_copy_pid(self, menu_item, cruf, *args):
+        cruf.copy_cell_content(0)
+
+    def on_copy_name(self, menu_item, cruf, *args):
+        cruf.copy_cell_content(1)
diff --git a/Tst/tst/tc_management.py b/Tst/tst/tc_management.py
index cfd09a6..8ea27a8 100644
--- a/Tst/tst/tc_management.py
+++ b/Tst/tst/tc_management.py
@@ -328,6 +328,13 @@ class CommandDescriptionBox(Gtk.Box):
             column.colnumbr = i
             self.cal_treeview.append_column(column)
 
+        # Set up Drag and Drop
+        self.cal_treeview.drag_source_set(Gdk.ModifierType.BUTTON1_MASK, [], Gdk.DragAction.COPY)
+        self.cal_treeview.drag_source_set_target_list(None)
+        self.cal_treeview.drag_source_add_text_targets()
+
+        self.cal_treeview.connect("drag-data-get", self.on_drag_data_get_cal)
+
         self.scrollable_calibrations_treelist = Gtk.ScrolledWindow()
         self.pack_start(self.scrollable_calibrations_treelist, True, True, 0)
 
@@ -370,3 +377,8 @@ class CommandDescriptionBox(Gtk.Box):
                 self.cal_liststore.append(list(cal_ref))
 
         self.cal_treeview.set_model(self.cal_liststore)
+
+    def on_drag_data_get_cal(self, treeview, drag_context, selection_data, info, time, *args):
+        treeselection = treeview.get_selection()
+        model, my_iter = treeselection.get_selected()
+        selection_data.set_text(model[my_iter][2], -1)
diff --git a/Tst/tst/tm_management.py b/Tst/tst/tm_management.py
index a937c71..7105be0 100644
--- a/Tst/tst/tm_management.py
+++ b/Tst/tst/tm_management.py
@@ -175,8 +175,7 @@ class TmTable(Gtk.Grid):
     def on_drag_data_get(self, treeview, drag_context, selection_data, info, time, *args):
         treeselection = treeview.get_selection()
         model, my_iter = treeselection.get_selected()
-        # selection_data.set_text(cfl.make_tc_template(descr, comment=False), -1)
-        selection_data.set_text('', -1)
+        selection_data.set_text(model[my_iter][-1], -1)
 
     def on_drag_begin(self, *args):
         pass
@@ -203,6 +202,13 @@ class TmSecondaryTable(Gtk.Box):
             self.parameter_treeview.append_column(column)
         self.parameter_treeview.set_tooltip_column(1)
 
+        # Set up Drag and Drop
+        self.parameter_treeview.drag_source_set(Gdk.ModifierType.BUTTON1_MASK, [], Gdk.DragAction.COPY)
+        self.parameter_treeview.drag_source_set_target_list(None)
+        self.parameter_treeview.drag_source_add_text_targets()
+
+        self.parameter_treeview.connect("drag-data-get", self.on_drag_data_get)
+
         # item selection
         self.selected_row = self.parameter_treeview.get_selection()
         self.selected_row.connect("changed", self.parameter_selected)
@@ -232,6 +238,13 @@ class TmSecondaryTable(Gtk.Box):
         self.scrollable_secondary_tm_treelist = Gtk.ScrolledWindow()
         self.pack_start(self.scrollable_secondary_tm_treelist, True, True, 0)
 
+        # Set up Drag and Drop
+        self.secondary_treeview.drag_source_set(Gdk.ModifierType.BUTTON1_MASK, [], Gdk.DragAction.COPY)
+        self.secondary_treeview.drag_source_set_target_list(None)
+        self.secondary_treeview.drag_source_add_text_targets()
+
+        self.secondary_treeview.connect("drag-data-get", self.on_drag_data_get_cal)
+
         self.scrollable_secondary_tm_treelist.add(self.secondary_treeview)
 
     def refresh_parameter_treelist(self, parlist):
@@ -265,3 +278,14 @@ class TmSecondaryTable(Gtk.Box):
         # for tm_type_sub_ref in tm_type_sub_list:
         #     self.secondary_liststore.append(list(tm_type_sub_ref))
         # self.secondary_treeview.set_model(self.secondary_liststore)
+
+    def on_drag_data_get(self, treeview, drag_context, selection_data, info, time, *args):
+        treeselection = treeview.get_selection()
+        model, my_iter = treeselection.get_selected()
+        # selection_data.set_text(cfl.make_tc_template(descr, comment=False), -1)
+        selection_data.set_text(model[my_iter][2], -1)
+
+    def on_drag_data_get_cal(self, treeview, drag_context, selection_data, info, time, *args):
+        treeselection = treeview.get_selection()
+        model, my_iter = treeselection.get_selected()
+        selection_data.set_text(model[my_iter][-1], -1)
diff --git a/Tst/tst/tst.py b/Tst/tst/tst.py
index dfe42c1..67455c4 100755
--- a/Tst/tst/tst.py
+++ b/Tst/tst/tst.py
@@ -241,6 +241,7 @@ class TstAppWindow(Gtk.ApplicationWindow):
         self.create_make_menu()
 
         self.set_icon_from_file(path_icon)
+        self.set_keybinds()
 
         # GUI
         self.box = Gtk.Box()
@@ -435,6 +436,14 @@ class TstAppWindow(Gtk.ApplicationWindow):
         action.connect('activate', self.on_generate_csv)
         self.add_action(action)
 
+    def set_keybinds(self):
+        accel = Gtk.AccelGroup()
+        accel.connect(Gdk.keyval_from_name('c'), Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK, 0, self.copy_pid_name)
+        self.add_accel_group(accel)
+
+    def copy_pid_name(self, *args):
+        self.data_pool_tab.copy_cell_content(1)
+
     def add_info_bar(self, message_type, message):
         """
         Adds a InfoBar and moves it below the toolbar
-- 
GitLab