From 60d290e00766fb5ceb84f21229dfc19ac9f2c3d5 Mon Sep 17 00:00:00 2001 From: jsbautista Date: Mon, 24 Apr 2023 14:21:42 -0500 Subject: [PATCH 01/28] first changes in variable explorer --- .../spyder_kernels/utils/nsview.py | 10 ++- spyder/config/main.py | 3 +- .../variableexplorer/widgets/main_widget.py | 84 +++++++++++++------ 3 files changed, 68 insertions(+), 29 deletions(-) diff --git a/external-deps/spyder-kernels/spyder_kernels/utils/nsview.py b/external-deps/spyder-kernels/spyder_kernels/utils/nsview.py index c19927f8fe7..14d321536f0 100644 --- a/external-deps/spyder-kernels/spyder_kernels/utils/nsview.py +++ b/external-deps/spyder-kernels/spyder_kernels/utils/nsview.py @@ -589,7 +589,8 @@ def is_callable_or_module(value): def globalsfilter(input_dict, check_all=False, filters=None, exclude_private=None, exclude_capitalized=None, exclude_uppercase=None, exclude_unsupported=None, - excluded_names=None, exclude_callables_and_modules=None): + excluded_names=None, exclude_callables_and_modules=None, + filter_on=False): """Keep objects in namespace view according to different criteria.""" output_dict = {} def _is_string(obj): @@ -605,7 +606,7 @@ def _is_string(obj): (exclude_callables_and_modules and is_callable_or_module(value)) or (exclude_unsupported and not is_supported(value, check_all=check_all, filters=filters)) - ) + ) and filter_on if not excluded: output_dict[key] = value return output_dict @@ -617,7 +618,8 @@ def _is_string(obj): REMOTE_SETTINGS = ('check_all', 'exclude_private', 'exclude_uppercase', 'exclude_capitalized', 'exclude_unsupported', 'excluded_names', 'minmax', 'show_callable_attributes', - 'show_special_attributes', 'exclude_callables_and_modules') + 'show_special_attributes', 'exclude_callables_and_modules', + 'filter_on') def get_supported_types(): @@ -673,7 +675,7 @@ def get_remote_data(data, settings, mode, more_excluded_names=None): exclude_capitalized=settings['exclude_capitalized'], exclude_unsupported=settings['exclude_unsupported'], exclude_callables_and_modules=settings['exclude_callables_and_modules'], - excluded_names=excluded_names) + excluded_names=excluded_names, filter_on=settings['filter_on']) def make_remote_view(data, settings, more_excluded_names=None): diff --git a/spyder/config/main.py b/spyder/config/main.py index 46a7c93e398..4390f9e8662 100644 --- a/spyder/config/main.py +++ b/spyder/config/main.py @@ -180,7 +180,8 @@ 'truncate': True, 'minmax': False, 'show_callable_attributes': True, - 'show_special_attributes': False + 'show_special_attributes': False, + 'filter_on': False }), ('debugger', { diff --git a/spyder/plugins/variableexplorer/widgets/main_widget.py b/spyder/plugins/variableexplorer/widgets/main_widget.py index 23c36e9ffb3..5cff0d1b767 100644 --- a/spyder/plugins/variableexplorer/widgets/main_widget.py +++ b/spyder/plugins/variableexplorer/widgets/main_widget.py @@ -18,6 +18,7 @@ from spyder.api.shellconnect.main_widget import ShellConnectMainWidget from spyder.plugins.variableexplorer.widgets.namespacebrowser import ( NamespaceBrowser) +from spyder.utils.icon_manager import ima from spyder.utils.programs import is_module_installed @@ -41,11 +42,17 @@ class VariableExplorerWidgetActions: ToggleExcludeCallablesAndModules = ( 'toggle_exclude_callables_and_modules_action') ToggleMinMax = 'toggle_minmax_action' + ToggleFilter = 'toggle_filter_variable_action' + + # Resize + ResizeRowsAction = 'resize_rows_action' + ResizeColumnsAction = 'resize_columns_action' class VariableExplorerWidgetOptionsMenuSections: Display = 'excludes_section' - Highlight = 'highlight_section' + Highlight = 'highlight_section' + Resize = 'resize_section' class VariableExplorerWidgetMainToolBarSections: @@ -58,8 +65,6 @@ class VariableExplorerWidgetMenus: class VariableExplorerContextMenuActions: - ResizeRowsAction = 'resize_rows_action' - ResizeColumnsAction = 'resize_columns_action' PasteAction = 'paste_action' CopyAction = 'copy' EditAction = 'edit_action' @@ -78,7 +83,6 @@ class VariableExplorerContextMenuSections: Edit = 'edit_section' Insert = 'insert_section' View = 'view_section' - Resize = 'resize_section' # ============================================================================= @@ -97,6 +101,8 @@ class VariableExplorerWidget(ShellConnectMainWidget): def __init__(self, name=None, plugin=None, parent=None): super().__init__(name, plugin, parent) + self.filter_on = False + # Widgets self.context_menu = None self.empty_context_menu = None @@ -108,7 +114,7 @@ def get_title(self): def setup(self): # ---- Options menu actions - exclude_private_action = self.create_action( + self.exclude_private_action = self.create_action( VariableExplorerWidgetActions.ToggleExcludePrivate, text=_("Exclude private variables"), tip=_("Exclude variables that start with an underscore"), @@ -116,7 +122,7 @@ def setup(self): option='exclude_private', ) - exclude_uppercase_action = self.create_action( + self.exclude_uppercase_action = self.create_action( VariableExplorerWidgetActions.ToggleExcludeUpperCase, text=_("Exclude all-uppercase variables"), tip=_("Exclude variables whose name is uppercase"), @@ -124,7 +130,7 @@ def setup(self): option='exclude_uppercase', ) - exclude_capitalized_action = self.create_action( + self.exclude_capitalized_action = self.create_action( VariableExplorerWidgetActions.ToggleExcludeCapitalized, text=_("Exclude capitalized variables"), tip=_("Exclude variables whose name starts with a capital " @@ -133,7 +139,7 @@ def setup(self): option='exclude_capitalized', ) - exclude_unsupported_action = self.create_action( + self.exclude_unsupported_action = self.create_action( VariableExplorerWidgetActions.ToggleExcludeUnsupported, text=_("Exclude unsupported data types"), tip=_("Exclude references to data types that don't have " @@ -142,7 +148,7 @@ def setup(self): option='exclude_unsupported', ) - exclude_callables_and_modules_action = self.create_action( + self.exclude_callables_and_modules_action = self.create_action( VariableExplorerWidgetActions.ToggleExcludeCallablesAndModules, text=_("Exclude callables and modules"), tip=_("Exclude references to functions, modules and " @@ -203,17 +209,25 @@ def setup(self): triggered=self.refresh_table, register_shortcut=True, ) + self.filter_button = self.create_action( + VariableExplorerWidgetActions.ToggleFilter, + text="", + icon=ima.icon('filter'), + toggled=self.change_filter_state, + option='filter_on' + ) + self.filter_button.setCheckable(True) # ---- Context menu actions resize_rows_action = self.create_action( - VariableExplorerContextMenuActions.ResizeRowsAction, + VariableExplorerWidgetActions.ResizeRowsAction, text=_("Resize rows to contents"), icon=self.create_icon('collapse_row'), triggered=self.resize_rows ) resize_columns_action = self.create_action( - VariableExplorerContextMenuActions.ResizeColumnsAction, + VariableExplorerWidgetActions.ResizeColumnsAction, _("Resize columns to contents"), icon=self.create_icon('collapse_column'), triggered=self.resize_columns @@ -309,9 +323,11 @@ def setup(self): # Options menu options_menu = self.get_options_menu() - for item in [exclude_private_action, exclude_uppercase_action, - exclude_capitalized_action, exclude_unsupported_action, - exclude_callables_and_modules_action, + for item in [self.exclude_private_action, + self.exclude_uppercase_action, + self.exclude_capitalized_action, + self.exclude_unsupported_action, + self.exclude_callables_and_modules_action, self.show_minmax_action]: self.add_item_to_menu( item, @@ -319,10 +335,19 @@ def setup(self): section=VariableExplorerWidgetOptionsMenuSections.Display, ) + # Resize + for item in [resize_rows_action, resize_columns_action]: + self.add_item_to_menu( + item, + menu=options_menu, + section=VariableExplorerWidgetOptionsMenuSections.Resize, + ) + # Main toolbar main_toolbar = self.get_main_toolbar() for item in [import_data_action, save_action, save_as_action, - reset_namespace_action, search_action, refresh_action]: + reset_namespace_action, search_action, refresh_action, + self.filter_button]: self.add_item_to_toolbar( item, toolbar=main_toolbar, @@ -350,20 +375,13 @@ def setup(self): ) for item in [self.view_action, self.plot_action, self.hist_action, - self.imshow_action, self.show_minmax_action]: + self.imshow_action]: self.add_item_to_menu( item, menu=self.context_menu, section=VariableExplorerContextMenuSections.View, ) - for item in [resize_rows_action, resize_columns_action]: - self.add_item_to_menu( - item, - menu=self.context_menu, - section=VariableExplorerContextMenuSections.Resize, - ) - # ---- Context menu when the variable explorer is empty self.empty_context_menu = self.create_menu( VariableExplorerWidgetMenus.EmptyContextMenu) @@ -406,6 +424,25 @@ def switch_widget(self, nsb, old_nsb): # ---- Public API # ------------------------------------------------------------------------ + def change_filter_state(self): + """Handle the change of the filter state.""" + self.filter_on = not self.filter_on + self.filter_button.setChecked(self.filter_on) + self.filter_button.setToolTip(_("Filter variables")) + self.filter_variables() + + def filter_variables(self): + self.exclude_private_action.setEnabled(self.filter_on) + #self.exclude_private_action.setChecked(self.filter_on) + self.exclude_uppercase_action.setEnabled(self.filter_on) + #self.exclude_uppercase_action.setChecked(self.filter_on) + self.exclude_capitalized_action.setEnabled(self.filter_on) + self.exclude_unsupported_action.setEnabled(self.filter_on) + self.exclude_callables_and_modules_action.setEnabled(self.filter_on) + #self.exclude_capitalized_action.setChecked(self.filter_on) + #self.exclude_unsupported_action.setChecked(self.filter_on) + #self.exclude_callables_and_modules_action.setChecked(self.filter_on) + def create_new_widget(self, shellwidget): """Create new NamespaceBrowser.""" nsb = NamespaceBrowser(self) @@ -557,7 +594,6 @@ def _set_actions_and_menus(self, nsb): editor.save_array_action = self.save_array_action editor.insert_action = self.insert_action editor.remove_action = self.remove_action - editor.minmax_action = self.show_minmax_action editor.rename_action = self.rename_action editor.duplicate_action = self.duplicate_action editor.view_action = self.view_action From 87f5f653cb189e7e11da048b836b80be516435c3 Mon Sep 17 00:00:00 2001 From: jsbautista Date: Mon, 24 Apr 2023 14:52:42 -0500 Subject: [PATCH 02/28] changes in variable explorer --- spyder/plugins/variableexplorer/widgets/main_widget.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/spyder/plugins/variableexplorer/widgets/main_widget.py b/spyder/plugins/variableexplorer/widgets/main_widget.py index 5cff0d1b767..a281df3167a 100644 --- a/spyder/plugins/variableexplorer/widgets/main_widget.py +++ b/spyder/plugins/variableexplorer/widgets/main_widget.py @@ -334,7 +334,7 @@ def setup(self): menu=options_menu, section=VariableExplorerWidgetOptionsMenuSections.Display, ) - + self.filter_variables() # Resize for item in [resize_rows_action, resize_columns_action]: self.add_item_to_menu( @@ -424,7 +424,7 @@ def switch_widget(self, nsb, old_nsb): # ---- Public API # ------------------------------------------------------------------------ - def change_filter_state(self): + def change_filter_state(self, value): """Handle the change of the filter state.""" self.filter_on = not self.filter_on self.filter_button.setChecked(self.filter_on) @@ -433,15 +433,10 @@ def change_filter_state(self): def filter_variables(self): self.exclude_private_action.setEnabled(self.filter_on) - #self.exclude_private_action.setChecked(self.filter_on) self.exclude_uppercase_action.setEnabled(self.filter_on) - #self.exclude_uppercase_action.setChecked(self.filter_on) self.exclude_capitalized_action.setEnabled(self.filter_on) self.exclude_unsupported_action.setEnabled(self.filter_on) self.exclude_callables_and_modules_action.setEnabled(self.filter_on) - #self.exclude_capitalized_action.setChecked(self.filter_on) - #self.exclude_unsupported_action.setChecked(self.filter_on) - #self.exclude_callables_and_modules_action.setChecked(self.filter_on) def create_new_widget(self, shellwidget): """Create new NamespaceBrowser.""" From 48eca80c9dfde29cd657a122fb3b268e5c8df300 Mon Sep 17 00:00:00 2001 From: jsbautista Date: Thu, 4 May 2023 16:38:12 -0500 Subject: [PATCH 03/28] Apply suggestions --- .../variableexplorer/widgets/main_widget.py | 20 +++++++++---------- spyder/widgets/collectionseditor.py | 2 ++ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/spyder/plugins/variableexplorer/widgets/main_widget.py b/spyder/plugins/variableexplorer/widgets/main_widget.py index a281df3167a..debbec38f51 100644 --- a/spyder/plugins/variableexplorer/widgets/main_widget.py +++ b/spyder/plugins/variableexplorer/widgets/main_widget.py @@ -114,47 +114,47 @@ def get_title(self): def setup(self): # ---- Options menu actions - self.exclude_private_action = self.create_action( + exclude_private_action = self.create_action( VariableExplorerWidgetActions.ToggleExcludePrivate, text=_("Exclude private variables"), tip=_("Exclude variables that start with an underscore"), toggled=True, - option='exclude_private', + initial=self.get_conf('exclude_private'), ) - self.exclude_uppercase_action = self.create_action( + exclude_uppercase_action = self.create_action( VariableExplorerWidgetActions.ToggleExcludeUpperCase, text=_("Exclude all-uppercase variables"), tip=_("Exclude variables whose name is uppercase"), toggled=True, - option='exclude_uppercase', + initial=self.get_conf('exclude_uppercase'), ) - self.exclude_capitalized_action = self.create_action( + exclude_capitalized_action = self.create_action( VariableExplorerWidgetActions.ToggleExcludeCapitalized, text=_("Exclude capitalized variables"), tip=_("Exclude variables whose name starts with a capital " "letter"), toggled=True, - option='exclude_capitalized', + initial=self.get_conf('exclude_capitalized'), ) - self.exclude_unsupported_action = self.create_action( + exclude_unsupported_action = self.create_action( VariableExplorerWidgetActions.ToggleExcludeUnsupported, text=_("Exclude unsupported data types"), tip=_("Exclude references to data types that don't have " "an specialized viewer or can't be edited."), toggled=True, - option='exclude_unsupported', + initial=self.get_conf('exclude_unsupported'), ) - self.exclude_callables_and_modules_action = self.create_action( + exclude_callables_and_modules_action = self.create_action( VariableExplorerWidgetActions.ToggleExcludeCallablesAndModules, text=_("Exclude callables and modules"), tip=_("Exclude references to functions, modules and " "any other callable."), toggled=True, - option='exclude_callables_and_modules' + initial=self.get_conf('exclude_callables_and_modules') ) self.show_minmax_action = self.create_action( diff --git a/spyder/widgets/collectionseditor.py b/spyder/widgets/collectionseditor.py index 603b0d6f193..9cd7d987246 100644 --- a/spyder/widgets/collectionseditor.py +++ b/spyder/widgets/collectionseditor.py @@ -402,6 +402,8 @@ def data(self, index, role=Qt.DisplayRole): if not index.isValid(): return to_qvariant() value = self.get_value(index) + if role == Qt.ToolTipRole: + return value if index.column() == 4 and role == Qt.DisplayRole: # TODO: Check the effect of not hiding the column # Treating search scores as a table column simplifies the From a92d52a42d7cd65e1807ada9eb2b3b6286d13c25 Mon Sep 17 00:00:00 2001 From: jsbautista Date: Thu, 4 May 2023 17:12:48 -0500 Subject: [PATCH 04/28] Apply suggestions --- spyder/plugins/variableexplorer/widgets/main_widget.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/spyder/plugins/variableexplorer/widgets/main_widget.py b/spyder/plugins/variableexplorer/widgets/main_widget.py index debbec38f51..f0c0259597d 100644 --- a/spyder/plugins/variableexplorer/widgets/main_widget.py +++ b/spyder/plugins/variableexplorer/widgets/main_widget.py @@ -114,7 +114,7 @@ def get_title(self): def setup(self): # ---- Options menu actions - exclude_private_action = self.create_action( + self.exclude_private_action = self.create_action( VariableExplorerWidgetActions.ToggleExcludePrivate, text=_("Exclude private variables"), tip=_("Exclude variables that start with an underscore"), @@ -122,7 +122,7 @@ def setup(self): initial=self.get_conf('exclude_private'), ) - exclude_uppercase_action = self.create_action( + self.exclude_uppercase_action = self.create_action( VariableExplorerWidgetActions.ToggleExcludeUpperCase, text=_("Exclude all-uppercase variables"), tip=_("Exclude variables whose name is uppercase"), @@ -130,7 +130,7 @@ def setup(self): initial=self.get_conf('exclude_uppercase'), ) - exclude_capitalized_action = self.create_action( + self.exclude_capitalized_action = self.create_action( VariableExplorerWidgetActions.ToggleExcludeCapitalized, text=_("Exclude capitalized variables"), tip=_("Exclude variables whose name starts with a capital " @@ -139,7 +139,7 @@ def setup(self): initial=self.get_conf('exclude_capitalized'), ) - exclude_unsupported_action = self.create_action( + self.exclude_unsupported_action = self.create_action( VariableExplorerWidgetActions.ToggleExcludeUnsupported, text=_("Exclude unsupported data types"), tip=_("Exclude references to data types that don't have " @@ -148,7 +148,7 @@ def setup(self): initial=self.get_conf('exclude_unsupported'), ) - exclude_callables_and_modules_action = self.create_action( + self.exclude_callables_and_modules_action = self.create_action( VariableExplorerWidgetActions.ToggleExcludeCallablesAndModules, text=_("Exclude callables and modules"), tip=_("Exclude references to functions, modules and " From bd90a858e4510180cbf51b1bc7f58dde10c8af11 Mon Sep 17 00:00:00 2001 From: jsbautista Date: Mon, 8 May 2023 10:51:54 -0500 Subject: [PATCH 05/28] Apply suggestions --- spyder/plugins/variableexplorer/plugin.py | 14 ++++++++++- .../variableexplorer/widgets/main_widget.py | 23 ++++++++++++++++++- spyder/widgets/collectionseditor.py | 4 +++- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/spyder/plugins/variableexplorer/plugin.py b/spyder/plugins/variableexplorer/plugin.py index be9ab2ddd80..f148deaee1a 100644 --- a/spyder/plugins/variableexplorer/plugin.py +++ b/spyder/plugins/variableexplorer/plugin.py @@ -47,7 +47,19 @@ def get_icon(self): return self.create_icon('dictedit') def on_initialize(self): - pass + widget = self.get_widget() + widget.sig_open_preferences_requested.connect( + self._open_interpreter_preferences + ) + + def _open_interpreter_preferences(self): + """Open the Preferences dialog in the variable explorer section.""" + self._main.show_preferences() + preferences = self._main.preferences + container = preferences.get_container() + dlg = container.dialog + index = dlg.get_index_by_name(self.NAME) + dlg.set_current_index(index) @on_plugin_available(plugin=Plugins.Preferences) def on_preferences_available(self): diff --git a/spyder/plugins/variableexplorer/widgets/main_widget.py b/spyder/plugins/variableexplorer/widgets/main_widget.py index f0c0259597d..586fee3e77d 100644 --- a/spyder/plugins/variableexplorer/widgets/main_widget.py +++ b/spyder/plugins/variableexplorer/widgets/main_widget.py @@ -9,7 +9,7 @@ """ # Third party imports -from qtpy.QtCore import QTimer, Slot +from qtpy.QtCore import QTimer, Slot, Signal from qtpy.QtWidgets import QAction # Local imports @@ -77,12 +77,14 @@ class VariableExplorerContextMenuActions: RenameAction = 'rename_action' DuplicateAction = 'duplicate_action' ViewAction = 'view_action' + EditFiltersAction = 'edit_filters_action' class VariableExplorerContextMenuSections: Edit = 'edit_section' Insert = 'insert_section' View = 'view_section' + Filter = 'Filter_section' # ============================================================================= @@ -98,6 +100,11 @@ class VariableExplorerWidget(ShellConnectMainWidget): INITIAL_FREE_MEMORY_TIME_TRIGGER = 60 * 1000 # ms SECONDARY_FREE_MEMORY_TIME_TRIGGER = 180 * 1000 # ms + sig_open_preferences_requested = Signal() + """ + Signal to open the main interpreter preferences. + """ + def __init__(self, name=None, plugin=None, parent=None): super().__init__(name, plugin, parent) @@ -293,6 +300,13 @@ def setup(self): triggered=self.insert_item ) + self.edit_filters = self.create_action( + VariableExplorerContextMenuActions.EditFiltersAction, + _("Edit filters"), + icon=self.create_icon('filter'), + triggered=self.sig_open_preferences_requested + ) + self.remove_action = self.create_action( VariableExplorerContextMenuActions.RemoveAction, _("Remove"), @@ -374,6 +388,13 @@ def setup(self): section=VariableExplorerContextMenuSections.Insert, ) + for item in [self.edit_filters]: + self.add_item_to_menu( + item, + menu=self.context_menu, + section=VariableExplorerContextMenuSections.Filter, + ) + for item in [self.view_action, self.plot_action, self.hist_action, self.imshow_action]: self.add_item_to_menu( diff --git a/spyder/widgets/collectionseditor.py b/spyder/widgets/collectionseditor.py index 9cd7d987246..52df57f385a 100644 --- a/spyder/widgets/collectionseditor.py +++ b/spyder/widgets/collectionseditor.py @@ -402,7 +402,9 @@ def data(self, index, role=Qt.DisplayRole): if not index.isValid(): return to_qvariant() value = self.get_value(index) - if role == Qt.ToolTipRole: + if role == Qt.ToolTipRole and index.column() == 3: + return value['view'] + elif role == Qt.ToolTipRole: return value if index.column() == 4 and role == Qt.DisplayRole: # TODO: Check the effect of not hiding the column From 4e3ef83eed8232dd0feafe89b8c2af6e195bc29e Mon Sep 17 00:00:00 2001 From: jsbautista Date: Mon, 8 May 2023 11:52:19 -0500 Subject: [PATCH 06/28] Apply suggestions --- spyder/config/main.py | 10 +++++----- spyder/plugins/variableexplorer/confpage.py | 15 ++++++++++----- .../variableexplorer/widgets/main_widget.py | 15 ++++++++++----- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/spyder/config/main.py b/spyder/config/main.py index 53ca3cbb353..64b11e1cfae 100644 --- a/spyder/config/main.py +++ b/spyder/config/main.py @@ -172,11 +172,11 @@ 'dataframe_format': '.6g', # No percent sign to avoid problems # with ConfigParser's interpolation 'excluded_names': EXCLUDED_NAMES, - 'exclude_private': True, - 'exclude_uppercase': False, - 'exclude_capitalized': False, - 'exclude_unsupported': False, - 'exclude_callables_and_modules': True, + 'exclude_private_preferences': True, + 'exclude_uppercase_preferences': False, + 'exclude_capitalized_preferences': False, + 'exclude_unsupported_preferences': False, + 'exclude_callables_and_modules_preferences': True, 'truncate': True, 'minmax': False, 'show_callable_attributes': True, diff --git a/spyder/plugins/variableexplorer/confpage.py b/spyder/plugins/variableexplorer/confpage.py index a2e7a8d0ecd..3d3f6543759 100644 --- a/spyder/plugins/variableexplorer/confpage.py +++ b/spyder/plugins/variableexplorer/confpage.py @@ -13,16 +13,21 @@ from spyder.config.base import _ from spyder.api.preferences import PluginConfigPage + class VariableExplorerConfigPage(PluginConfigPage): def setup_page(self): filter_group = QGroupBox(_("Filter")) filter_data = [ - ('exclude_private', _("Exclude private references")), - ('exclude_capitalized', _("Exclude capitalized references")), - ('exclude_uppercase', _("Exclude all-uppercase references")), - ('exclude_unsupported', _("Exclude unsupported data types")), - ('exclude_callables_and_modules', + ('exclude_private_preferences', + _("Exclude private references")), + ('exclude_capitalized_preferences', + _("Exclude capitalized references")), + ('exclude_uppercase_preferences', + _("Exclude all-uppercase references")), + ('exclude_unsupported_preferences', + _("Exclude unsupported data types")), + ('exclude_callables_and_modules_preferences', _("Exclude callables and modules")) ] filter_boxes = [self.create_checkbox(text, option) diff --git a/spyder/plugins/variableexplorer/widgets/main_widget.py b/spyder/plugins/variableexplorer/widgets/main_widget.py index 586fee3e77d..a8af583c94b 100644 --- a/spyder/plugins/variableexplorer/widgets/main_widget.py +++ b/spyder/plugins/variableexplorer/widgets/main_widget.py @@ -126,7 +126,8 @@ def setup(self): text=_("Exclude private variables"), tip=_("Exclude variables that start with an underscore"), toggled=True, - initial=self.get_conf('exclude_private'), + option='exclude_private', + initial=self.get_conf('exclude_private_preferences'), ) self.exclude_uppercase_action = self.create_action( @@ -134,7 +135,8 @@ def setup(self): text=_("Exclude all-uppercase variables"), tip=_("Exclude variables whose name is uppercase"), toggled=True, - initial=self.get_conf('exclude_uppercase'), + option='exclude_uppercase', + initial=self.get_conf('exclude_uppercase_preferences'), ) self.exclude_capitalized_action = self.create_action( @@ -143,7 +145,8 @@ def setup(self): tip=_("Exclude variables whose name starts with a capital " "letter"), toggled=True, - initial=self.get_conf('exclude_capitalized'), + option='exclude_capitalized', + initial=self.get_conf('exclude_capitalized_preferences'), ) self.exclude_unsupported_action = self.create_action( @@ -152,7 +155,8 @@ def setup(self): tip=_("Exclude references to data types that don't have " "an specialized viewer or can't be edited."), toggled=True, - initial=self.get_conf('exclude_unsupported'), + option='exclude_unsupported', + initial=self.get_conf('exclude_unsupported_preferences'), ) self.exclude_callables_and_modules_action = self.create_action( @@ -161,7 +165,8 @@ def setup(self): tip=_("Exclude references to functions, modules and " "any other callable."), toggled=True, - initial=self.get_conf('exclude_callables_and_modules') + option='exclude_callables_and_modules', + initial=self.get_conf('exclude_callables_and_modules_preferences') ) self.show_minmax_action = self.create_action( From c04755eab00e8a987645e51229d7f75938e23345 Mon Sep 17 00:00:00 2001 From: jsbautista Date: Mon, 8 May 2023 12:56:22 -0500 Subject: [PATCH 07/28] Apply suggestions --- spyder/plugins/ipythonconsole/tests/test_ipythonconsole.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spyder/plugins/ipythonconsole/tests/test_ipythonconsole.py b/spyder/plugins/ipythonconsole/tests/test_ipythonconsole.py index 644ac0501a9..9a4dc12c667 100644 --- a/spyder/plugins/ipythonconsole/tests/test_ipythonconsole.py +++ b/spyder/plugins/ipythonconsole/tests/test_ipythonconsole.py @@ -1828,7 +1828,8 @@ def test_pdb_comprehension_namespace(ipyconsole, qtbot, tmpdir): 'excluded_names': [], 'minmax': False, 'show_callable_attributes': True, - 'show_special_attributes': False} + 'show_special_attributes': False, + 'filter_on': True} shell.call_kernel( interrupt=True From 17b630a221d62f693d17bdc1d0c9a95d8c0303fb Mon Sep 17 00:00:00 2001 From: jsbautista Date: Mon, 15 May 2023 08:56:51 -0500 Subject: [PATCH 08/28] Apply suggestions --- spyder/widgets/collectionseditor.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spyder/widgets/collectionseditor.py b/spyder/widgets/collectionseditor.py index 52df57f385a..924dae7b8c8 100644 --- a/spyder/widgets/collectionseditor.py +++ b/spyder/widgets/collectionseditor.py @@ -904,6 +904,10 @@ def mousePressEvent(self, event): and index_clicked in self.selectedIndexes(): self.clearSelection() else: + row = index_clicked.row() + # TODO: Remove hard coded "Value" column number (3 here) + index_clicked = index_clicked.child(row, 3) + self.edit(index_clicked) QTableView.mousePressEvent(self, event) else: self.clearSelection() From d61b818d4673cebc5a4214fa0ade8161901996bd Mon Sep 17 00:00:00 2001 From: jsbautista Date: Mon, 15 May 2023 10:13:43 -0500 Subject: [PATCH 09/28] Apply suggestions --- spyder/widgets/collectionseditor.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spyder/widgets/collectionseditor.py b/spyder/widgets/collectionseditor.py index 924dae7b8c8..658cdd2fa63 100644 --- a/spyder/widgets/collectionseditor.py +++ b/spyder/widgets/collectionseditor.py @@ -924,6 +924,10 @@ def mouseDoubleClickEvent(self, event): else: event.accept() + def mouseMoveEvent(self, event): + """Change cursor shape.""" + self.setCursor(Qt.PointingHandCursor) + def keyPressEvent(self, event): """Reimplement Qt methods""" if event.key() == Qt.Key_Delete: From ee61c05ddc566a6985a768fed88ddc6f51614dd2 Mon Sep 17 00:00:00 2001 From: jsbautista Date: Thu, 18 May 2023 09:28:02 -0500 Subject: [PATCH 10/28] Apply suggestions --- spyder/config/main.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/spyder/config/main.py b/spyder/config/main.py index 64b11e1cfae..97a381c6f81 100644 --- a/spyder/config/main.py +++ b/spyder/config/main.py @@ -177,6 +177,11 @@ 'exclude_capitalized_preferences': False, 'exclude_unsupported_preferences': False, 'exclude_callables_and_modules_preferences': True, + 'exclude_private': True, + 'exclude_uppercase': False, + 'exclude_capitalized': False, + 'exclude_unsupported': False, + 'exclude_callables_and_modules': True, 'truncate': True, 'minmax': False, 'show_callable_attributes': True, From 111a90c207a1fef192eea6f3bbde6f1074813fa6 Mon Sep 17 00:00:00 2001 From: jsbautista <42411448+jsbautista@users.noreply.github.com> Date: Mon, 29 May 2023 15:23:18 -0500 Subject: [PATCH 11/28] Update spyder/plugins/variableexplorer/widgets/main_widget.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Daniel Althviz Moré --- spyder/plugins/variableexplorer/widgets/main_widget.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spyder/plugins/variableexplorer/widgets/main_widget.py b/spyder/plugins/variableexplorer/widgets/main_widget.py index a8af583c94b..c013d875873 100644 --- a/spyder/plugins/variableexplorer/widgets/main_widget.py +++ b/spyder/plugins/variableexplorer/widgets/main_widget.py @@ -102,7 +102,7 @@ class VariableExplorerWidget(ShellConnectMainWidget): sig_open_preferences_requested = Signal() """ - Signal to open the main interpreter preferences. + Signal to open the variable explorer preferences. """ def __init__(self, name=None, plugin=None, parent=None): From 4bb6b65bdccc6ae93a2c4fd250f2f732f1a08443 Mon Sep 17 00:00:00 2001 From: jsbautista <42411448+jsbautista@users.noreply.github.com> Date: Mon, 5 Jun 2023 09:51:56 -0500 Subject: [PATCH 12/28] Apply suggestions from code review Co-authored-by: Carlos Cordoba --- spyder/plugins/variableexplorer/plugin.py | 6 +++--- spyder/plugins/variableexplorer/widgets/main_widget.py | 5 ++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/spyder/plugins/variableexplorer/plugin.py b/spyder/plugins/variableexplorer/plugin.py index f148deaee1a..ac786960369 100644 --- a/spyder/plugins/variableexplorer/plugin.py +++ b/spyder/plugins/variableexplorer/plugin.py @@ -49,11 +49,11 @@ def get_icon(self): def on_initialize(self): widget = self.get_widget() widget.sig_open_preferences_requested.connect( - self._open_interpreter_preferences + self._open_preferences ) - def _open_interpreter_preferences(self): - """Open the Preferences dialog in the variable explorer section.""" + def _open_preferences(self): + """Open the Preferences dialog in the Variable Explorer section.""" self._main.show_preferences() preferences = self._main.preferences container = preferences.get_container() diff --git a/spyder/plugins/variableexplorer/widgets/main_widget.py b/spyder/plugins/variableexplorer/widgets/main_widget.py index c013d875873..bcfea3fdf01 100644 --- a/spyder/plugins/variableexplorer/widgets/main_widget.py +++ b/spyder/plugins/variableexplorer/widgets/main_widget.py @@ -108,7 +108,7 @@ class VariableExplorerWidget(ShellConnectMainWidget): def __init__(self, name=None, plugin=None, parent=None): super().__init__(name, plugin, parent) - self.filter_on = False + self.filter_on = True # Widgets self.context_menu = None @@ -221,6 +221,7 @@ def setup(self): triggered=self.refresh_table, register_shortcut=True, ) + self.filter_button = self.create_action( VariableExplorerWidgetActions.ToggleFilter, text="", @@ -353,7 +354,9 @@ def setup(self): menu=options_menu, section=VariableExplorerWidgetOptionsMenuSections.Display, ) + self.filter_variables() + # Resize for item in [resize_rows_action, resize_columns_action]: self.add_item_to_menu( From f146d1c69f5aa0ddf76c1d0ebc6e17a0555750fb Mon Sep 17 00:00:00 2001 From: jsbautista Date: Tue, 6 Jun 2023 13:09:27 -0500 Subject: [PATCH 13/28] Apply suggestions --- spyder/config/main.py | 7 +-- spyder/plugins/variableexplorer/confpage.py | 10 ++--- .../variableexplorer/widgets/main_widget.py | 43 ++++++++----------- 3 files changed, 25 insertions(+), 35 deletions(-) diff --git a/spyder/config/main.py b/spyder/config/main.py index 97a381c6f81..34d1683056a 100644 --- a/spyder/config/main.py +++ b/spyder/config/main.py @@ -172,11 +172,6 @@ 'dataframe_format': '.6g', # No percent sign to avoid problems # with ConfigParser's interpolation 'excluded_names': EXCLUDED_NAMES, - 'exclude_private_preferences': True, - 'exclude_uppercase_preferences': False, - 'exclude_capitalized_preferences': False, - 'exclude_unsupported_preferences': False, - 'exclude_callables_and_modules_preferences': True, 'exclude_private': True, 'exclude_uppercase': False, 'exclude_capitalized': False, @@ -186,7 +181,7 @@ 'minmax': False, 'show_callable_attributes': True, 'show_special_attributes': False, - 'filter_on': False + 'filter_on': True }), ('debugger', { diff --git a/spyder/plugins/variableexplorer/confpage.py b/spyder/plugins/variableexplorer/confpage.py index 3d3f6543759..bd3ae283cdd 100644 --- a/spyder/plugins/variableexplorer/confpage.py +++ b/spyder/plugins/variableexplorer/confpage.py @@ -19,15 +19,15 @@ class VariableExplorerConfigPage(PluginConfigPage): def setup_page(self): filter_group = QGroupBox(_("Filter")) filter_data = [ - ('exclude_private_preferences', + ('exclude_private', _("Exclude private references")), - ('exclude_capitalized_preferences', + ('exclude_capitalized', _("Exclude capitalized references")), - ('exclude_uppercase_preferences', + ('exclude_uppercase', _("Exclude all-uppercase references")), - ('exclude_unsupported_preferences', + ('exclude_unsupported', _("Exclude unsupported data types")), - ('exclude_callables_and_modules_preferences', + ('exclude_callables_and_modules', _("Exclude callables and modules")) ] filter_boxes = [self.create_checkbox(text, option) diff --git a/spyder/plugins/variableexplorer/widgets/main_widget.py b/spyder/plugins/variableexplorer/widgets/main_widget.py index bcfea3fdf01..2d87bc9f7aa 100644 --- a/spyder/plugins/variableexplorer/widgets/main_widget.py +++ b/spyder/plugins/variableexplorer/widgets/main_widget.py @@ -126,8 +126,7 @@ def setup(self): text=_("Exclude private variables"), tip=_("Exclude variables that start with an underscore"), toggled=True, - option='exclude_private', - initial=self.get_conf('exclude_private_preferences'), + option=self.get_conf('exclude_private'), ) self.exclude_uppercase_action = self.create_action( @@ -135,8 +134,7 @@ def setup(self): text=_("Exclude all-uppercase variables"), tip=_("Exclude variables whose name is uppercase"), toggled=True, - option='exclude_uppercase', - initial=self.get_conf('exclude_uppercase_preferences'), + option=self.get_conf('exclude_uppercase'), ) self.exclude_capitalized_action = self.create_action( @@ -145,8 +143,7 @@ def setup(self): tip=_("Exclude variables whose name starts with a capital " "letter"), toggled=True, - option='exclude_capitalized', - initial=self.get_conf('exclude_capitalized_preferences'), + option=self.get_conf('exclude_capitalized'), ) self.exclude_unsupported_action = self.create_action( @@ -155,8 +152,7 @@ def setup(self): tip=_("Exclude references to data types that don't have " "an specialized viewer or can't be edited."), toggled=True, - option='exclude_unsupported', - initial=self.get_conf('exclude_unsupported_preferences'), + option=self.get_conf('exclude_unsupported'), ) self.exclude_callables_and_modules_action = self.create_action( @@ -165,8 +161,7 @@ def setup(self): tip=_("Exclude references to functions, modules and " "any other callable."), toggled=True, - option='exclude_callables_and_modules', - initial=self.get_conf('exclude_callables_and_modules_preferences') + option=self.get_conf('exclude_callables_and_modules') ) self.show_minmax_action = self.create_action( @@ -453,20 +448,6 @@ def switch_widget(self, nsb, old_nsb): # ---- Public API # ------------------------------------------------------------------------ - def change_filter_state(self, value): - """Handle the change of the filter state.""" - self.filter_on = not self.filter_on - self.filter_button.setChecked(self.filter_on) - self.filter_button.setToolTip(_("Filter variables")) - self.filter_variables() - - def filter_variables(self): - self.exclude_private_action.setEnabled(self.filter_on) - self.exclude_uppercase_action.setEnabled(self.filter_on) - self.exclude_capitalized_action.setEnabled(self.filter_on) - self.exclude_unsupported_action.setEnabled(self.filter_on) - self.exclude_callables_and_modules_action.setEnabled(self.filter_on) - def create_new_widget(self, shellwidget): """Create new NamespaceBrowser.""" nsb = NamespaceBrowser(self) @@ -631,3 +612,17 @@ def _set_actions_and_menus(self, nsb): # several places in CollectionsEditor. editor.insert_action_above = QAction() editor.insert_action_below = QAction() + + def _change_filter_state(self, value): + """Handle the change of the filter state.""" + self.filter_on = not self.filter_on + self.filter_button.setChecked(self.filter_on) + self.filter_button.setToolTip(_("Filter variables")) + self.filter_variables() + + def _enable_filter_actions(self): + self.exclude_private_action.setEnabled(self.filter_on) + self.exclude_uppercase_action.setEnabled(self.filter_on) + self.exclude_capitalized_action.setEnabled(self.filter_on) + self.exclude_unsupported_action.setEnabled(self.filter_on) + self.exclude_callables_and_modules_action.setEnabled(self.filter_on) \ No newline at end of file From b1fba8238daa714e2607c043277fadb04b58ad03 Mon Sep 17 00:00:00 2001 From: jsbautista Date: Tue, 13 Jun 2023 14:38:52 -0500 Subject: [PATCH 14/28] git subrepo pull --remote=https://github.com/jsbautista/spyder-kernels.git --branch=variableExplorerKernels --update --force external-deps/spyder-kernels subrepo: subdir: "external-deps/spyder-kernels" merged: "db201a8aa" upstream: origin: "https://github.com/jsbautista/spyder-kernels.git" branch: "variableExplorerKernels" commit: "db201a8aa" git-subrepo: version: "0.4.6" origin: "???" commit: "???" --- external-deps/spyder-kernels/.gitrepo | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/external-deps/spyder-kernels/.gitrepo b/external-deps/spyder-kernels/.gitrepo index ab25632c4a0..042e1c176c0 100644 --- a/external-deps/spyder-kernels/.gitrepo +++ b/external-deps/spyder-kernels/.gitrepo @@ -4,9 +4,9 @@ ; git-subrepo command. See https://github.com/ingydotnet/git-subrepo#readme ; [subrepo] - remote = https://github.com/spyder-ide/spyder-kernels.git - branch = master - commit = efb058ff73718a2c65a256ac59e75d018f46c09d - parent = acc475a8e2701813bfde06fe48f0e2418a24320d + remote = https://github.com/jsbautista/spyder-kernels.git + branch = variableExplorerKernels + commit = db201a8aa9a6a5d2bb3d147ae475a43b6baa11e9 + parent = f6ca198b485a77eae3a985002e97fe57d70b477c method = merge - cmdver = 0.4.3 + cmdver = 0.4.6 From d669a1a0781e76ce69d6fff7b7ab9631af1d63bd Mon Sep 17 00:00:00 2001 From: jsbautista Date: Mon, 19 Jun 2023 11:08:39 -0500 Subject: [PATCH 15/28] git subrepo pull --remote=https://github.com/jsbautista/spyder-kernels.git --branch=variableExplorerKernels --update --force external-deps/spyder-kernels subrepo: subdir: "external-deps/spyder-kernels" merged: "fd7a942a4" upstream: origin: "https://github.com/jsbautista/spyder-kernels.git" branch: "variableExplorerKernels" commit: "fd7a942a4" git-subrepo: version: "0.4.6" origin: "???" commit: "???" --- external-deps/spyder-kernels/.gitrepo | 4 ++-- .../spyder_kernels/console/tests/test_console_kernel.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/external-deps/spyder-kernels/.gitrepo b/external-deps/spyder-kernels/.gitrepo index 042e1c176c0..2bc41c8b452 100644 --- a/external-deps/spyder-kernels/.gitrepo +++ b/external-deps/spyder-kernels/.gitrepo @@ -6,7 +6,7 @@ [subrepo] remote = https://github.com/jsbautista/spyder-kernels.git branch = variableExplorerKernels - commit = db201a8aa9a6a5d2bb3d147ae475a43b6baa11e9 - parent = f6ca198b485a77eae3a985002e97fe57d70b477c + commit = fd7a942a49376aa05006907314dab37b93f66c2f + parent = b1fba8238daa714e2607c043277fadb04b58ad03 method = merge cmdver = 0.4.6 diff --git a/external-deps/spyder-kernels/spyder_kernels/console/tests/test_console_kernel.py b/external-deps/spyder-kernels/spyder_kernels/console/tests/test_console_kernel.py index d7efae21fa7..76ccbedd8b6 100644 --- a/external-deps/spyder-kernels/spyder_kernels/console/tests/test_console_kernel.py +++ b/external-deps/spyder-kernels/spyder_kernels/console/tests/test_console_kernel.py @@ -227,7 +227,8 @@ def kernel(request): 'False_', 'True_' ], - 'minmax': False + 'minmax': False, + 'filter_on':True } # Teardown From 429c61a1046c67c711e1c1b693af3ec4f094f2fb Mon Sep 17 00:00:00 2001 From: jsbautista Date: Mon, 26 Jun 2023 13:53:55 -0500 Subject: [PATCH 16/28] Apply suggestions --- external-deps/spyder-kernels/spyder_kernels/utils/nsview.py | 2 +- spyder/plugins/ipythonconsole/comms/tests/test_comms.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/external-deps/spyder-kernels/spyder_kernels/utils/nsview.py b/external-deps/spyder-kernels/spyder_kernels/utils/nsview.py index 14d321536f0..d7e0ce5a727 100644 --- a/external-deps/spyder-kernels/spyder_kernels/utils/nsview.py +++ b/external-deps/spyder-kernels/spyder_kernels/utils/nsview.py @@ -590,7 +590,7 @@ def globalsfilter(input_dict, check_all=False, filters=None, exclude_private=None, exclude_capitalized=None, exclude_uppercase=None, exclude_unsupported=None, excluded_names=None, exclude_callables_and_modules=None, - filter_on=False): + filter_on=True): """Keep objects in namespace view according to different criteria.""" output_dict = {} def _is_string(obj): diff --git a/spyder/plugins/ipythonconsole/comms/tests/test_comms.py b/spyder/plugins/ipythonconsole/comms/tests/test_comms.py index f8bf989e002..5cbfa44be80 100644 --- a/spyder/plugins/ipythonconsole/comms/tests/test_comms.py +++ b/spyder/plugins/ipythonconsole/comms/tests/test_comms.py @@ -60,7 +60,8 @@ def kernel(request): 'False_', 'True_' ], - 'minmax': False} + 'minmax': False, + 'filter_on': True} # Teardown def reset_kernel(): From 079132d1d96f6844ac6936c8797dbb6d6e84eb96 Mon Sep 17 00:00:00 2001 From: jsbautista Date: Mon, 10 Jul 2023 10:47:56 -0500 Subject: [PATCH 17/28] Apply suggestions --- spyder/plugins/variableexplorer/widgets/main_widget.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/spyder/plugins/variableexplorer/widgets/main_widget.py b/spyder/plugins/variableexplorer/widgets/main_widget.py index 2d87bc9f7aa..8261993930f 100644 --- a/spyder/plugins/variableexplorer/widgets/main_widget.py +++ b/spyder/plugins/variableexplorer/widgets/main_widget.py @@ -108,7 +108,6 @@ class VariableExplorerWidget(ShellConnectMainWidget): def __init__(self, name=None, plugin=None, parent=None): super().__init__(name, plugin, parent) - self.filter_on = True # Widgets self.context_menu = None @@ -225,7 +224,7 @@ def setup(self): option='filter_on' ) self.filter_button.setCheckable(True) - + self.filter_on = self.get_conf('filter_on') # ---- Context menu actions resize_rows_action = self.create_action( VariableExplorerWidgetActions.ResizeRowsAction, @@ -615,7 +614,7 @@ def _set_actions_and_menus(self, nsb): def _change_filter_state(self, value): """Handle the change of the filter state.""" - self.filter_on = not self.filter_on + self.filter_on = self.get_conf('filter_on') self.filter_button.setChecked(self.filter_on) self.filter_button.setToolTip(_("Filter variables")) self.filter_variables() From 8054316a42f7628d180f9ffe080a4771ebc060ad Mon Sep 17 00:00:00 2001 From: jsbautista Date: Mon, 10 Jul 2023 11:51:35 -0500 Subject: [PATCH 18/28] Apply suggestions --- .../plugins/variableexplorer/widgets/main_widget.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/spyder/plugins/variableexplorer/widgets/main_widget.py b/spyder/plugins/variableexplorer/widgets/main_widget.py index 8261993930f..71beb897760 100644 --- a/spyder/plugins/variableexplorer/widgets/main_widget.py +++ b/spyder/plugins/variableexplorer/widgets/main_widget.py @@ -125,7 +125,7 @@ def setup(self): text=_("Exclude private variables"), tip=_("Exclude variables that start with an underscore"), toggled=True, - option=self.get_conf('exclude_private'), + option='exclude_private', ) self.exclude_uppercase_action = self.create_action( @@ -133,7 +133,7 @@ def setup(self): text=_("Exclude all-uppercase variables"), tip=_("Exclude variables whose name is uppercase"), toggled=True, - option=self.get_conf('exclude_uppercase'), + option='exclude_uppercase', ) self.exclude_capitalized_action = self.create_action( @@ -142,7 +142,7 @@ def setup(self): tip=_("Exclude variables whose name starts with a capital " "letter"), toggled=True, - option=self.get_conf('exclude_capitalized'), + option='exclude_capitalized', ) self.exclude_unsupported_action = self.create_action( @@ -151,7 +151,7 @@ def setup(self): tip=_("Exclude references to data types that don't have " "an specialized viewer or can't be edited."), toggled=True, - option=self.get_conf('exclude_unsupported'), + option='exclude_unsupported', ) self.exclude_callables_and_modules_action = self.create_action( @@ -160,7 +160,7 @@ def setup(self): tip=_("Exclude references to functions, modules and " "any other callable."), toggled=True, - option=self.get_conf('exclude_callables_and_modules') + option='exclude_callables_and_modules' ) self.show_minmax_action = self.create_action( @@ -618,7 +618,7 @@ def _change_filter_state(self, value): self.filter_button.setChecked(self.filter_on) self.filter_button.setToolTip(_("Filter variables")) self.filter_variables() - + def _enable_filter_actions(self): self.exclude_private_action.setEnabled(self.filter_on) self.exclude_uppercase_action.setEnabled(self.filter_on) From ea6243a98c4771abd14b347d97bfb64e190ee7b9 Mon Sep 17 00:00:00 2001 From: jsbautista Date: Mon, 10 Jul 2023 14:21:17 -0500 Subject: [PATCH 19/28] Apply suggestions --- spyder/plugins/variableexplorer/widgets/main_widget.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spyder/plugins/variableexplorer/widgets/main_widget.py b/spyder/plugins/variableexplorer/widgets/main_widget.py index 71beb897760..7e52793d5a6 100644 --- a/spyder/plugins/variableexplorer/widgets/main_widget.py +++ b/spyder/plugins/variableexplorer/widgets/main_widget.py @@ -220,7 +220,7 @@ def setup(self): VariableExplorerWidgetActions.ToggleFilter, text="", icon=ima.icon('filter'), - toggled=self.change_filter_state, + toggled=self._change_filter_state, option='filter_on' ) self.filter_button.setCheckable(True) From b0057277da1ec6a4abb94dc395947b073ec4954a Mon Sep 17 00:00:00 2001 From: jsbautista Date: Mon, 10 Jul 2023 14:24:42 -0500 Subject: [PATCH 20/28] Apply suggestions --- spyder/plugins/variableexplorer/widgets/main_widget.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spyder/plugins/variableexplorer/widgets/main_widget.py b/spyder/plugins/variableexplorer/widgets/main_widget.py index 7e52793d5a6..f7428aef023 100644 --- a/spyder/plugins/variableexplorer/widgets/main_widget.py +++ b/spyder/plugins/variableexplorer/widgets/main_widget.py @@ -348,8 +348,9 @@ def setup(self): menu=options_menu, section=VariableExplorerWidgetOptionsMenuSections.Display, ) + + self._enable_filter_actions() - self.filter_variables() # Resize for item in [resize_rows_action, resize_columns_action]: @@ -617,7 +618,7 @@ def _change_filter_state(self, value): self.filter_on = self.get_conf('filter_on') self.filter_button.setChecked(self.filter_on) self.filter_button.setToolTip(_("Filter variables")) - self.filter_variables() + self._enable_filter_actions() def _enable_filter_actions(self): self.exclude_private_action.setEnabled(self.filter_on) From c1703d0312b16a01602c14d56d2dfed093203a9d Mon Sep 17 00:00:00 2001 From: jsbautista Date: Mon, 10 Jul 2023 15:35:21 -0500 Subject: [PATCH 21/28] Apply suggestions --- .../variableexplorer/widgets/main_widget.py | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/spyder/plugins/variableexplorer/widgets/main_widget.py b/spyder/plugins/variableexplorer/widgets/main_widget.py index f7428aef023..6308fdf27a3 100644 --- a/spyder/plugins/variableexplorer/widgets/main_widget.py +++ b/spyder/plugins/variableexplorer/widgets/main_widget.py @@ -224,7 +224,6 @@ def setup(self): option='filter_on' ) self.filter_button.setCheckable(True) - self.filter_on = self.get_conf('filter_on') # ---- Context menu actions resize_rows_action = self.create_action( VariableExplorerWidgetActions.ResizeRowsAction, @@ -615,14 +614,14 @@ def _set_actions_and_menus(self, nsb): def _change_filter_state(self, value): """Handle the change of the filter state.""" - self.filter_on = self.get_conf('filter_on') - self.filter_button.setChecked(self.filter_on) + value = self.get_conf('filter_on') + self.filter_button.setChecked(value) self.filter_button.setToolTip(_("Filter variables")) - self._enable_filter_actions() - - def _enable_filter_actions(self): - self.exclude_private_action.setEnabled(self.filter_on) - self.exclude_uppercase_action.setEnabled(self.filter_on) - self.exclude_capitalized_action.setEnabled(self.filter_on) - self.exclude_unsupported_action.setEnabled(self.filter_on) - self.exclude_callables_and_modules_action.setEnabled(self.filter_on) \ No newline at end of file + self._enable_filter_actions(value) + + def _enable_filter_actions(self, value): + self.exclude_private_action.setEnabled(value) + self.exclude_uppercase_action.setEnabled(value) + self.exclude_capitalized_action.setEnabled(value) + self.exclude_unsupported_action.setEnabled(value) + self.exclude_callables_and_modules_action.setEnabled(value) \ No newline at end of file From cd1f4391f092f1701c4bae8d151d42a19770dd4f Mon Sep 17 00:00:00 2001 From: jsbautista Date: Mon, 10 Jul 2023 17:37:00 -0500 Subject: [PATCH 22/28] Apply suggestions --- spyder/plugins/variableexplorer/widgets/main_widget.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spyder/plugins/variableexplorer/widgets/main_widget.py b/spyder/plugins/variableexplorer/widgets/main_widget.py index 6308fdf27a3..14bb724903b 100644 --- a/spyder/plugins/variableexplorer/widgets/main_widget.py +++ b/spyder/plugins/variableexplorer/widgets/main_widget.py @@ -347,9 +347,8 @@ def setup(self): menu=options_menu, section=VariableExplorerWidgetOptionsMenuSections.Display, ) - - self._enable_filter_actions() + self._enable_filter_actions(self.get_conf('filter_on')) # Resize for item in [resize_rows_action, resize_columns_action]: From 4952a496cb5bc5c14dcbe57d546b81a7bf1a970c Mon Sep 17 00:00:00 2001 From: jsbautista Date: Mon, 10 Jul 2023 17:44:13 -0500 Subject: [PATCH 23/28] Apply suggestions --- .../variableexplorer/widgets/main_widget.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/spyder/plugins/variableexplorer/widgets/main_widget.py b/spyder/plugins/variableexplorer/widgets/main_widget.py index 14bb724903b..19c3b461907 100644 --- a/spyder/plugins/variableexplorer/widgets/main_widget.py +++ b/spyder/plugins/variableexplorer/widgets/main_widget.py @@ -113,6 +113,8 @@ def __init__(self, name=None, plugin=None, parent=None): self.context_menu = None self.empty_context_menu = None + self.filter_button = None + # ---- PluginMainWidget API # ------------------------------------------------------------------------ def get_title(self): @@ -220,9 +222,10 @@ def setup(self): VariableExplorerWidgetActions.ToggleFilter, text="", icon=ima.icon('filter'), - toggled=self._change_filter_state, - option='filter_on' - ) + toggled=self._enable_filter_actions, + option='filter_on', + tip=_("Filter variables") + ) self.filter_button.setCheckable(True) # ---- Context menu actions resize_rows_action = self.create_action( @@ -611,14 +614,8 @@ def _set_actions_and_menus(self, nsb): editor.insert_action_above = QAction() editor.insert_action_below = QAction() - def _change_filter_state(self, value): - """Handle the change of the filter state.""" - value = self.get_conf('filter_on') - self.filter_button.setChecked(value) - self.filter_button.setToolTip(_("Filter variables")) - self._enable_filter_actions(value) - def _enable_filter_actions(self, value): + """Handle the change of the filter state.""" self.exclude_private_action.setEnabled(value) self.exclude_uppercase_action.setEnabled(value) self.exclude_capitalized_action.setEnabled(value) From ae04a3c7829f87671adf27f406aa0abbd374807d Mon Sep 17 00:00:00 2001 From: jsbautista <42411448+jsbautista@users.noreply.github.com> Date: Tue, 11 Jul 2023 19:06:49 -0500 Subject: [PATCH 24/28] Update spyder/widgets/collectionseditor.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Daniel Althviz Moré --- 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 0f0b4cebd3c..c199ef22322 100644 --- a/spyder/widgets/collectionseditor.py +++ b/spyder/widgets/collectionseditor.py @@ -936,7 +936,10 @@ def mouseDoubleClickEvent(self, event): def mouseMoveEvent(self, event): """Change cursor shape.""" - self.setCursor(Qt.PointingHandCursor) + if self.rowAt(event.y()) != -1: + self.setCursor(Qt.PointingHandCursor) + else: + self.setCursor(Qt.ArrowCursor) def keyPressEvent(self, event): """Reimplement Qt methods""" From dd82da947611439932bf5f67f50dd719b95c6a98 Mon Sep 17 00:00:00 2001 From: dalthviz Date: Wed, 12 Jul 2023 16:27:03 -0500 Subject: [PATCH 25/28] git subrepo pull --remote=https://github.com/spyder-ide/spyder-kernels.git --branch=master --update --force external-deps/spyder-kernels subrepo: subdir: "external-deps/spyder-kernels" merged: "838f55d83" upstream: origin: "https://github.com/spyder-ide/spyder-kernels.git" branch: "master" commit: "838f55d83" git-subrepo: version: "0.4.3" origin: "???" commit: "???" --- external-deps/spyder-kernels/.gitrepo | 6 ++--- .../console/tests/test_console_kernel.py | 25 +++++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/external-deps/spyder-kernels/.gitrepo b/external-deps/spyder-kernels/.gitrepo index fdfde50b850..35069b9b996 100644 --- a/external-deps/spyder-kernels/.gitrepo +++ b/external-deps/spyder-kernels/.gitrepo @@ -6,7 +6,7 @@ [subrepo] remote = https://github.com/spyder-ide/spyder-kernels.git branch = master - commit = 82222bbeb8cfa48f20cf762a272eb2aaadaebf2c - parent = fc973c39da8c97bbcd9d1dc1aff5ffcdefe96a32 + commit = 838f55d838641ec95bd0565baaac0cc34d0c93b0 + parent = ae04a3c7829f87671adf27f406aa0abbd374807d method = merge - cmdver = 0.4.6 + cmdver = 0.4.3 diff --git a/external-deps/spyder-kernels/spyder_kernels/console/tests/test_console_kernel.py b/external-deps/spyder-kernels/spyder_kernels/console/tests/test_console_kernel.py index 76ccbedd8b6..65870f02cfb 100644 --- a/external-deps/spyder-kernels/spyder_kernels/console/tests/test_console_kernel.py +++ b/external-deps/spyder-kernels/spyder_kernels/console/tests/test_console_kernel.py @@ -289,6 +289,31 @@ def test_get_namespace_view(kernel): assert "'python_type': 'int'" in nsview +@pytest.mark.parametrize("filter_on", [True, False]) +def test_get_namespace_view_filter_on(kernel, filter_on): + """ + Test the namespace view of the kernel with filters on and off. + """ + execute = asyncio.run(kernel.do_execute('a = 1', True)) + asyncio.run(kernel.do_execute('TestFilterOff = 1', True)) + + settings = kernel.namespace_view_settings + settings['filter_on'] = filter_on + settings['exclude_capitalized'] = True + nsview = kernel.get_namespace_view() + + if not filter_on: + assert 'a' in nsview + assert 'TestFilterOff' in nsview + else: + assert 'TestFilterOff' not in nsview + assert 'a' in nsview + + # Restore settings for other tests + settings['filter_on'] = True + settings['exclude_capitalized'] = False + + def test_get_var_properties(kernel): """ Test the properties fo the variables in the namespace. From 4c68a79c957df766d8bcbe82129e0c0f154ba067 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Althviz=20Mor=C3=A9?= Date: Thu, 13 Jul 2023 14:04:17 -0500 Subject: [PATCH 26/28] Apply suggestions from code review Co-authored-by: Carlos Cordoba --- spyder/plugins/variableexplorer/plugin.py | 11 ++++++----- .../plugins/variableexplorer/widgets/main_widget.py | 3 ++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/spyder/plugins/variableexplorer/plugin.py b/spyder/plugins/variableexplorer/plugin.py index ac786960369..49fa763faaa 100644 --- a/spyder/plugins/variableexplorer/plugin.py +++ b/spyder/plugins/variableexplorer/plugin.py @@ -55,11 +55,12 @@ def on_initialize(self): def _open_preferences(self): """Open the Preferences dialog in the Variable Explorer section.""" self._main.show_preferences() - preferences = self._main.preferences - container = preferences.get_container() - dlg = container.dialog - index = dlg.get_index_by_name(self.NAME) - dlg.set_current_index(index) + preferences = self.get_plugin(Plugins.Preferences) + if preferences: + container = preferences.get_container() + dlg = container.dialog + index = dlg.get_index_by_name(self.NAME) + dlg.set_current_index(index) @on_plugin_available(plugin=Plugins.Preferences) def on_preferences_available(self): diff --git a/spyder/plugins/variableexplorer/widgets/main_widget.py b/spyder/plugins/variableexplorer/widgets/main_widget.py index 19c3b461907..15728cfca76 100644 --- a/spyder/plugins/variableexplorer/widgets/main_widget.py +++ b/spyder/plugins/variableexplorer/widgets/main_widget.py @@ -227,6 +227,7 @@ def setup(self): tip=_("Filter variables") ) self.filter_button.setCheckable(True) + # ---- Context menu actions resize_rows_action = self.create_action( VariableExplorerWidgetActions.ResizeRowsAction, @@ -620,4 +621,4 @@ def _enable_filter_actions(self, value): self.exclude_uppercase_action.setEnabled(value) self.exclude_capitalized_action.setEnabled(value) self.exclude_unsupported_action.setEnabled(value) - self.exclude_callables_and_modules_action.setEnabled(value) \ No newline at end of file + self.exclude_callables_and_modules_action.setEnabled(value) From 7f930d76aaf53fd59df5636c8927a484f2cf89fe Mon Sep 17 00:00:00 2001 From: dalthviz Date: Thu, 13 Jul 2023 14:39:27 -0500 Subject: [PATCH 27/28] Create private API section --- spyder/plugins/variableexplorer/plugin.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/spyder/plugins/variableexplorer/plugin.py b/spyder/plugins/variableexplorer/plugin.py index 49fa763faaa..ea6e4ed87ac 100644 --- a/spyder/plugins/variableexplorer/plugin.py +++ b/spyder/plugins/variableexplorer/plugin.py @@ -52,16 +52,6 @@ def on_initialize(self): self._open_preferences ) - def _open_preferences(self): - """Open the Preferences dialog in the Variable Explorer section.""" - self._main.show_preferences() - preferences = self.get_plugin(Plugins.Preferences) - if preferences: - container = preferences.get_container() - dlg = container.dialog - index = dlg.get_index_by_name(self.NAME) - dlg.set_current_index(index) - @on_plugin_available(plugin=Plugins.Preferences) def on_preferences_available(self): preferences = self.get_plugin(Plugins.Preferences) @@ -71,3 +61,15 @@ def on_preferences_available(self): def on_preferences_teardown(self): preferences = self.get_plugin(Plugins.Preferences) preferences.deregister_plugin_preferences(self) + + # ---- Private API + # ------------------------------------------------------------------------- + def _open_preferences(self): + """Open the Preferences dialog in the Variable Explorer section.""" + self._main.show_preferences() + preferences = self.get_plugin(Plugins.Preferences) + if preferences: + container = preferences.get_container() + dlg = container.dialog + index = dlg.get_index_by_name(self.NAME) + dlg.set_current_index(index) From a9e895b97236c8ed77403881b01bd3127aef64d7 Mon Sep 17 00:00:00 2001 From: dalthviz Date: Thu, 13 Jul 2023 14:42:56 -0500 Subject: [PATCH 28/28] Update maininterpreter open preferences logic --- spyder/plugins/maininterpreter/plugin.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/spyder/plugins/maininterpreter/plugin.py b/spyder/plugins/maininterpreter/plugin.py index 822f926f1c8..907a93120bb 100644 --- a/spyder/plugins/maininterpreter/plugin.py +++ b/spyder/plugins/maininterpreter/plugin.py @@ -112,11 +112,12 @@ def set_custom_interpreter(self, interpreter): def _open_interpreter_preferences(self): """Open the Preferences dialog in the main interpreter section.""" self._main.show_preferences() - preferences = self._main.preferences - container = preferences.get_container() - dlg = container.dialog - index = dlg.get_index_by_name("main_interpreter") - dlg.set_current_index(index) + preferences = self.get_plugin(Plugins.Preferences) + if preferences: + container = preferences.get_container() + dlg = container.dialog + index = dlg.get_index_by_name("main_interpreter") + dlg.set_current_index(index) @Slot(str) def _add_to_custom_interpreters(self, interpreter):