From 905995c1b9525318f221f702c3f32c43dee613f7 Mon Sep 17 00:00:00 2001 From: Diego Prosperi Turibio Date: Fri, 11 Mar 2022 16:11:22 -0300 Subject: [PATCH 01/14] Add menu for list/tables (from double click) to a static toolbar #67 --- spyder/widgets/collectionseditor.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/spyder/widgets/collectionseditor.py b/spyder/widgets/collectionseditor.py index b8abe2bd48e..6ad9974ef56 100644 --- a/spyder/widgets/collectionseditor.py +++ b/spyder/widgets/collectionseditor.py @@ -61,6 +61,7 @@ from spyder.widgets.helperwidgets import CustomSortFilterProxy from spyder.plugins.variableexplorer.widgets.basedialog import BaseDialog from spyder.utils.palette import SpyderPalette +from spyder.api.widgets.toolbars import SpyderToolbar # Maximum length of a serialized variable to be set in the kernel @@ -585,6 +586,7 @@ def __init__(self, parent): self.array_filename = None self.menu = None + self.menu_actions = None self.empty_ws_menu = None self.paste_action = None self.copy_action = None @@ -683,7 +685,7 @@ def setup_menu(self): icon=ima.icon('outline_explorer'), triggered=self.view_item) menu = QMenu(self) - menu_actions = [self.edit_action, self.plot_action, self.hist_action, + self.menu_actions = [self.edit_action, self.plot_action, self.hist_action, self.imshow_action, self.save_array_action, self.insert_action, self.insert_action_above, self.insert_action_below, @@ -691,7 +693,7 @@ def setup_menu(self): self.paste_action, self.view_action, None, self.rename_action, self.duplicate_action, None, resize_action, resize_columns_action] - add_actions(menu, menu_actions) + add_actions(menu, self.menu_actions) self.empty_ws_menu = QMenu(self) add_actions( self.empty_ws_menu, @@ -1312,7 +1314,14 @@ def __init__(self, parent, data, readonly=False, title="", remote=False): else: self.editor = CollectionsEditorTableView(self, data, readonly, title) + toolbar = SpyderToolbar(parent = None, title = 'Editor toolbar') + + for item in self.editor.menu_actions: + if item != None: + toolbar.addAction(item) + layout = QVBoxLayout() + layout.addWidget(toolbar) layout.addWidget(self.editor) self.setLayout(layout) From bc6aefd0a89c775c88a8fb1dc26035456145e865 Mon Sep 17 00:00:00 2001 From: Diego Prosperi Turibio Date: Fri, 11 Mar 2022 16:33:04 -0300 Subject: [PATCH 02/14] Add menu for list/tables (from double click) to a static toolbar spyder-ide/ux-improvements#67 --- spyder/widgets/collectionseditor.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spyder/widgets/collectionseditor.py b/spyder/widgets/collectionseditor.py index 6ad9974ef56..224e808650a 100644 --- a/spyder/widgets/collectionseditor.py +++ b/spyder/widgets/collectionseditor.py @@ -1317,8 +1317,8 @@ def __init__(self, parent, data, readonly=False, title="", remote=False): toolbar = SpyderToolbar(parent = None, title = 'Editor toolbar') for item in self.editor.menu_actions: - if item != None: - toolbar.addAction(item) + if item != None: + toolbar.addAction(item) layout = QVBoxLayout() layout.addWidget(toolbar) From a993c307c4c855d6722a9b1f05cf8594b558933f Mon Sep 17 00:00:00 2001 From: Diego Prosperi Turibio Date: Fri, 11 Mar 2022 16:55:01 -0300 Subject: [PATCH 03/14] resolving PEP8 issues --- spyder/widgets/collectionseditor.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/spyder/widgets/collectionseditor.py b/spyder/widgets/collectionseditor.py index 224e808650a..240de6c3d1f 100644 --- a/spyder/widgets/collectionseditor.py +++ b/spyder/widgets/collectionseditor.py @@ -685,14 +685,15 @@ def setup_menu(self): icon=ima.icon('outline_explorer'), triggered=self.view_item) menu = QMenu(self) - self.menu_actions = [self.edit_action, self.plot_action, self.hist_action, - self.imshow_action, self.save_array_action, - self.insert_action, - self.insert_action_above, self.insert_action_below, - self.remove_action, self.copy_action, - self.paste_action, self.view_action, - None, self.rename_action, self.duplicate_action, - None, resize_action, resize_columns_action] + self.menu_actions = [self.edit_action, self.plot_action, + self.hist_action, self.imshow_action, + self.save_array_action, self.insert_action, + self.insert_action_above, + self.insert_action_below, + self.remove_action, self.copy_action, + self.paste_action, self.view_action, + None, self.rename_action, self.duplicate_action, + None, resize_action, resize_columns_action] add_actions(menu, self.menu_actions) self.empty_ws_menu = QMenu(self) add_actions( @@ -1314,10 +1315,10 @@ def __init__(self, parent, data, readonly=False, title="", remote=False): else: self.editor = CollectionsEditorTableView(self, data, readonly, title) - toolbar = SpyderToolbar(parent = None, title = 'Editor toolbar') + toolbar = SpyderToolbar(parent=None, title='Editor toolbar') for item in self.editor.menu_actions: - if item != None: + if item is not None: toolbar.addAction(item) layout = QVBoxLayout() From 604d6b8334867625b2debddb4b603b32fa1b2d0b Mon Sep 17 00:00:00 2001 From: Diego Prosperi Turibio Date: Tue, 15 Mar 2022 19:37:33 -0300 Subject: [PATCH 04/14] solving iteration over None object --- spyder/widgets/collectionseditor.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/spyder/widgets/collectionseditor.py b/spyder/widgets/collectionseditor.py index 240de6c3d1f..b8d0ca53821 100644 --- a/spyder/widgets/collectionseditor.py +++ b/spyder/widgets/collectionseditor.py @@ -692,9 +692,19 @@ def setup_menu(self): self.insert_action_below, self.remove_action, self.copy_action, self.paste_action, self.view_action, - None, self.rename_action, self.duplicate_action, - None, resize_action, resize_columns_action] - add_actions(menu, self.menu_actions) + self.rename_action, self.duplicate_action, + resize_action, resize_columns_action] + + menu_actions = [self.edit_action, self.plot_action, + self.hist_action, self.imshow_action, + self.save_array_action, self.insert_action, + self.insert_action_above, + self.insert_action_below, + self.remove_action, self.copy_action, + self.paste_action, self.view_action, + None, self.rename_action, self.duplicate_action, + None, resize_action, resize_columns_action] + add_actions(menu, menu_actions) self.empty_ws_menu = QMenu(self) add_actions( self.empty_ws_menu, @@ -1318,8 +1328,7 @@ def __init__(self, parent, data, readonly=False, title="", remote=False): toolbar = SpyderToolbar(parent=None, title='Editor toolbar') for item in self.editor.menu_actions: - if item is not None: - toolbar.addAction(item) + toolbar.addAction(item) layout = QVBoxLayout() layout.addWidget(toolbar) From 8d985fee5acda1579552971bd51602a640ac2d07 Mon Sep 17 00:00:00 2001 From: Diego Prosperi Turibio Date: Tue, 15 Mar 2022 19:48:28 -0300 Subject: [PATCH 05/14] solving iteration over None object --- spyder/widgets/collectionseditor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spyder/widgets/collectionseditor.py b/spyder/widgets/collectionseditor.py index b8d0ca53821..14da4e32c5c 100644 --- a/spyder/widgets/collectionseditor.py +++ b/spyder/widgets/collectionseditor.py @@ -586,7 +586,7 @@ def __init__(self, parent): self.array_filename = None self.menu = None - self.menu_actions = None + self.menu_actions = [] self.empty_ws_menu = None self.paste_action = None self.copy_action = None From 8d35e6a1669aea6970e297d179a55b53be7735c2 Mon Sep 17 00:00:00 2001 From: Diego Prosperi Turibio Date: Tue, 15 Mar 2022 22:00:17 -0300 Subject: [PATCH 06/14] solving iteration over None object --- spyder/widgets/collectionseditor.py | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/spyder/widgets/collectionseditor.py b/spyder/widgets/collectionseditor.py index 14da4e32c5c..4343b0a81dd 100644 --- a/spyder/widgets/collectionseditor.py +++ b/spyder/widgets/collectionseditor.py @@ -692,19 +692,9 @@ def setup_menu(self): self.insert_action_below, self.remove_action, self.copy_action, self.paste_action, self.view_action, - self.rename_action, self.duplicate_action, - resize_action, resize_columns_action] - - menu_actions = [self.edit_action, self.plot_action, - self.hist_action, self.imshow_action, - self.save_array_action, self.insert_action, - self.insert_action_above, - self.insert_action_below, - self.remove_action, self.copy_action, - self.paste_action, self.view_action, - None, self.rename_action, self.duplicate_action, - None, resize_action, resize_columns_action] - add_actions(menu, menu_actions) + None, self.rename_action, self.duplicate_action, + None, resize_action, resize_columns_action] + add_actions(menu, self.menu_actions) self.empty_ws_menu = QMenu(self) add_actions( self.empty_ws_menu, @@ -1328,7 +1318,8 @@ def __init__(self, parent, data, readonly=False, title="", remote=False): toolbar = SpyderToolbar(parent=None, title='Editor toolbar') for item in self.editor.menu_actions: - toolbar.addAction(item) + if item is not None: + toolbar.addAction(item) layout = QVBoxLayout() layout.addWidget(toolbar) From 5e13262a764b6174003d0817de7ca0c9b1c1bca6 Mon Sep 17 00:00:00 2001 From: Diego Prosperi Turibio Date: Tue, 22 Mar 2022 22:07:10 -0300 Subject: [PATCH 07/14] refresh menu/toolbar with enabled/disabled items --- spyder/widgets/collectionseditor.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/spyder/widgets/collectionseditor.py b/spyder/widgets/collectionseditor.py index 4343b0a81dd..62bbc58c87e 100644 --- a/spyder/widgets/collectionseditor.py +++ b/spyder/widgets/collectionseditor.py @@ -621,6 +621,7 @@ def setup_table(self): # Sorting columns self.setSortingEnabled(True) self.sortByColumn(0, Qt.AscendingOrder) + self.selectionModel().selectionChanged.connect(self.refresh_menu) def setup_menu(self): """Setup context menu""" @@ -1320,7 +1321,9 @@ def __init__(self, parent, data, readonly=False, title="", remote=False): for item in self.editor.menu_actions: if item is not None: toolbar.addAction(item) - + + # Update the toolbar actions state + self.editor.refresh_menu() layout = QVBoxLayout() layout.addWidget(toolbar) layout.addWidget(self.editor) From b28cf5fbfd86a6984c5676b62a87b74fbc0efe3c Mon Sep 17 00:00:00 2001 From: Diego Prosperi Turibio Date: Tue, 22 Mar 2022 22:42:07 -0300 Subject: [PATCH 08/14] refresh menu/toolbar with enabled/disabled items --- spyder/widgets/collectionseditor.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/spyder/widgets/collectionseditor.py b/spyder/widgets/collectionseditor.py index 62bbc58c87e..d06e76d7598 100644 --- a/spyder/widgets/collectionseditor.py +++ b/spyder/widgets/collectionseditor.py @@ -766,8 +766,10 @@ def refresh_menu(self): """Refresh context menu""" index = self.currentIndex() condition = index.isValid() - self.edit_action.setEnabled(condition) - self.remove_action.setEnabled(condition) + if self.edit_action is not None: + self.edit_action.setEnabled(condition) + if self.remove_action is not None: + self.remove_action.setEnabled(condition) self.refresh_plot_entries(index) def refresh_plot_entries(self, index): From 1d927720870c4a1fa637994b027810ccc47be760 Mon Sep 17 00:00:00 2001 From: Diego Prosperi Turibio Date: Tue, 22 Mar 2022 22:57:05 -0300 Subject: [PATCH 09/14] refresh menu/toolbar with enabled/disabled items --- spyder/widgets/collectionseditor.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/spyder/widgets/collectionseditor.py b/spyder/widgets/collectionseditor.py index d06e76d7598..76a8ead3079 100644 --- a/spyder/widgets/collectionseditor.py +++ b/spyder/widgets/collectionseditor.py @@ -788,13 +788,20 @@ def refresh_plot_entries(self, index): is_array = condition_plot = condition_imshow = is_list \ = condition_hist = False is_list_instance = isinstance(self.source_model.get_data(), list) - self.plot_action.setVisible(condition_plot or is_list) - self.hist_action.setVisible(condition_hist or is_list) - self.insert_action.setVisible(not is_list_instance) - self.insert_action_above.setVisible(is_list_instance) - self.insert_action_below.setVisible(is_list_instance) - self.imshow_action.setVisible(condition_imshow) - self.save_array_action.setVisible(is_array) + if self.plot_action is not None: + self.plot_action.setVisible(condition_plot or is_list) + if self.hist_action is not None: + self.hist_action.setVisible(condition_hist or is_list) + if self.insert_action is not None: + self.insert_action.setVisible(not is_list_instance) + if self.insert_action_above is not None: + self.insert_action_above.setVisible(is_list_instance) + if self.insert_action_below is not None: + self.insert_action_below.setVisible(is_list_instance) + if self.imshow_action is not None: + self.imshow_action.setVisible(condition_imshow) + if self.save_array_action is not None: + self.save_array_action.setVisible(is_array) def resize_column_contents(self): """Resize columns to contents.""" From 8bf38641005bee3f5e411a91178d41c5e14feb63 Mon Sep 17 00:00:00 2001 From: Diego Prosperi Turibio Date: Wed, 23 Mar 2022 17:54:21 -0300 Subject: [PATCH 10/14] changed order of setup_menu() and setup_table() in order to set variables before using it --- spyder/widgets/collectionseditor.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/spyder/widgets/collectionseditor.py b/spyder/widgets/collectionseditor.py index 76a8ead3079..94cdbb94772 100644 --- a/spyder/widgets/collectionseditor.py +++ b/spyder/widgets/collectionseditor.py @@ -1194,10 +1194,9 @@ def __init__(self, parent, data, readonly=False, title="", self.setModel(self.source_model) self.delegate = CollectionsDelegate(self) self.setItemDelegate(self.delegate) - - self.setup_table() + self.menu = self.setup_menu() - + self.setup_table() if isinstance(data, set): self.horizontalHeader().hideSection(0) @@ -1507,10 +1506,9 @@ def __init__(self, parent, data, shellwidget=None, remote_editing=False, self.delegate.sig_editor_shown.connect(self.sig_editor_shown) self.setItemDelegate(self.delegate) - self.setup_table() - if create_menu: self.menu = self.setup_menu() + self.setup_table() # ------ Remote/local API ------------------------------------------------- def get_value(self, name): From 058bdafcef2531672ea85aab67560589c23afc1d Mon Sep 17 00:00:00 2001 From: Diego Prosperi Turibio Date: Wed, 30 Mar 2022 09:00:57 -0300 Subject: [PATCH 11/14] overwrite method refresh_menu for RemoteCollectionsEditorTableView class --- spyder/widgets/collectionseditor.py | 36 +++++++++++++---------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/spyder/widgets/collectionseditor.py b/spyder/widgets/collectionseditor.py index 94cdbb94772..371f3790097 100644 --- a/spyder/widgets/collectionseditor.py +++ b/spyder/widgets/collectionseditor.py @@ -766,10 +766,8 @@ def refresh_menu(self): """Refresh context menu""" index = self.currentIndex() condition = index.isValid() - if self.edit_action is not None: - self.edit_action.setEnabled(condition) - if self.remove_action is not None: - self.remove_action.setEnabled(condition) + self.edit_action.setEnabled(condition) + self.remove_action.setEnabled(condition) self.refresh_plot_entries(index) def refresh_plot_entries(self, index): @@ -788,20 +786,13 @@ def refresh_plot_entries(self, index): is_array = condition_plot = condition_imshow = is_list \ = condition_hist = False is_list_instance = isinstance(self.source_model.get_data(), list) - if self.plot_action is not None: - self.plot_action.setVisible(condition_plot or is_list) - if self.hist_action is not None: - self.hist_action.setVisible(condition_hist or is_list) - if self.insert_action is not None: - self.insert_action.setVisible(not is_list_instance) - if self.insert_action_above is not None: - self.insert_action_above.setVisible(is_list_instance) - if self.insert_action_below is not None: - self.insert_action_below.setVisible(is_list_instance) - if self.imshow_action is not None: - self.imshow_action.setVisible(condition_imshow) - if self.save_array_action is not None: - self.save_array_action.setVisible(is_array) + self.plot_action.setVisible(condition_plot or is_list) + self.hist_action.setVisible(condition_hist or is_list) + self.insert_action.setVisible(not is_list_instance) + self.insert_action_above.setVisible(is_list_instance) + self.insert_action_below.setVisible(is_list_instance) + self.imshow_action.setVisible(condition_imshow) + self.save_array_action.setVisible(is_array) def resize_column_contents(self): """Resize columns to contents.""" @@ -1195,8 +1186,8 @@ def __init__(self, parent, data, readonly=False, title="", self.delegate = CollectionsDelegate(self) self.setItemDelegate(self.delegate) - self.menu = self.setup_menu() self.setup_table() + self.menu = self.setup_menu() if isinstance(data, set): self.horizontalHeader().hideSection(0) @@ -1505,10 +1496,11 @@ def __init__(self, parent, data, shellwidget=None, remote_editing=False, self.sig_editor_creation_started) self.delegate.sig_editor_shown.connect(self.sig_editor_shown) self.setItemDelegate(self.delegate) + + self.setup_table() if create_menu: self.menu = self.setup_menu() - self.setup_table() # ------ Remote/local API ------------------------------------------------- def get_value(self, name): @@ -1594,6 +1586,10 @@ def setup_menu(self): menu = BaseTableView.setup_menu(self) return menu + def refresh_menu(self): + if self.var_properties: + super().refresh_menu() + def set_regex(self, regex=None, reset=False): """Update the regex text for the variable finder.""" if reset or self.finder is None or not self.finder.text(): From efec316a864321e27d10743a97ce7d7b7f18cec9 Mon Sep 17 00:00:00 2001 From: Diego Prosperi Turibio Date: Wed, 13 Apr 2022 15:51:43 -0300 Subject: [PATCH 12/14] added icons for collapse columns and rows --- spyder/utils/icon_manager.py | 2 ++ spyder/widgets/collectionseditor.py | 8 +++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/spyder/utils/icon_manager.py b/spyder/utils/icon_manager.py index ab3fc989d6a..ba7b2b316bd 100644 --- a/spyder/utils/icon_manager.py +++ b/spyder/utils/icon_manager.py @@ -198,6 +198,8 @@ def __init__(self): 'rename': [('mdi.rename-box',), {'color': self.MAIN_FG_COLOR}], 'move': [('mdi.file-move',), {'color': self.MAIN_FG_COLOR}], 'edit_add': [('mdi.plus',), {'color': self.MAIN_FG_COLOR}], + 'collapcol': [('mdi.arrow-collapse-horizontal',), {'color': self.MAIN_FG_COLOR}], + 'collaprow': [('mdi.arrow-collapse-vertical',), {'color': self.MAIN_FG_COLOR}], 'edit_remove': [('mdi.minus',), {'color': self.MAIN_FG_COLOR}], 'browse_tab': [('mdi.tab',), {'color': self.MAIN_FG_COLOR}], 'filelist': [('mdi.view-list',), {'color': self.MAIN_FG_COLOR}], diff --git a/spyder/widgets/collectionseditor.py b/spyder/widgets/collectionseditor.py index 371f3790097..461e20468ef 100644 --- a/spyder/widgets/collectionseditor.py +++ b/spyder/widgets/collectionseditor.py @@ -626,10 +626,12 @@ def setup_table(self): def setup_menu(self): """Setup context menu""" resize_action = create_action(self, _("Resize rows to contents"), + icon=ima.icon('collaprow'), triggered=self.resizeRowsToContents) resize_columns_action = create_action( self, _("Resize columns to contents"), + icon=ima.icon('collapcol'), triggered=self.resize_column_contents) self.paste_action = create_action(self, _("Paste"), icon=ima.icon('editpaste'), @@ -1185,7 +1187,7 @@ def __init__(self, parent, data, readonly=False, title="", self.setModel(self.source_model) self.delegate = CollectionsDelegate(self) self.setItemDelegate(self.delegate) - + self.setup_table() self.menu = self.setup_menu() if isinstance(data, set): @@ -1320,7 +1322,7 @@ def __init__(self, parent, data, readonly=False, title="", remote=False): for item in self.editor.menu_actions: if item is not None: toolbar.addAction(item) - + # Update the toolbar actions state self.editor.refresh_menu() layout = QVBoxLayout() @@ -1496,7 +1498,7 @@ def __init__(self, parent, data, shellwidget=None, remote_editing=False, self.sig_editor_creation_started) self.delegate.sig_editor_shown.connect(self.sig_editor_shown) self.setItemDelegate(self.delegate) - + self.setup_table() if create_menu: From 2ad2fcb1cce622e6651609da0c34d6fcfd7e2106 Mon Sep 17 00:00:00 2001 From: Diego Prosperi Turibio Date: Thu, 14 Apr 2022 17:10:29 -0300 Subject: [PATCH 13/14] changed variable names for better reading --- spyder/utils/icon_manager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spyder/utils/icon_manager.py b/spyder/utils/icon_manager.py index ba7b2b316bd..254bce68c1d 100644 --- a/spyder/utils/icon_manager.py +++ b/spyder/utils/icon_manager.py @@ -198,8 +198,8 @@ def __init__(self): 'rename': [('mdi.rename-box',), {'color': self.MAIN_FG_COLOR}], 'move': [('mdi.file-move',), {'color': self.MAIN_FG_COLOR}], 'edit_add': [('mdi.plus',), {'color': self.MAIN_FG_COLOR}], - 'collapcol': [('mdi.arrow-collapse-horizontal',), {'color': self.MAIN_FG_COLOR}], - 'collaprow': [('mdi.arrow-collapse-vertical',), {'color': self.MAIN_FG_COLOR}], + 'collapse_column': [('mdi.arrow-collapse-horizontal',), {'color': self.MAIN_FG_COLOR}], + 'collapse_row': [('mdi.arrow-collapse-vertical',), {'color': self.MAIN_FG_COLOR}], 'edit_remove': [('mdi.minus',), {'color': self.MAIN_FG_COLOR}], 'browse_tab': [('mdi.tab',), {'color': self.MAIN_FG_COLOR}], 'filelist': [('mdi.view-list',), {'color': self.MAIN_FG_COLOR}], From 34c2fafef00a7d334ec0abff023f4c47fb916a85 Mon Sep 17 00:00:00 2001 From: Diego Prosperi Turibio Date: Thu, 14 Apr 2022 20:39:54 -0300 Subject: [PATCH 14/14] changed forgotten variables --- spyder/widgets/collectionseditor.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spyder/widgets/collectionseditor.py b/spyder/widgets/collectionseditor.py index 461e20468ef..cf1bc54c34a 100644 --- a/spyder/widgets/collectionseditor.py +++ b/spyder/widgets/collectionseditor.py @@ -626,12 +626,12 @@ def setup_table(self): def setup_menu(self): """Setup context menu""" resize_action = create_action(self, _("Resize rows to contents"), - icon=ima.icon('collaprow'), + icon=ima.icon('collapse_row'), triggered=self.resizeRowsToContents) resize_columns_action = create_action( self, _("Resize columns to contents"), - icon=ima.icon('collapcol'), + icon=ima.icon('collapse_column'), triggered=self.resize_column_contents) self.paste_action = create_action(self, _("Paste"), icon=ima.icon('editpaste'),