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