# -*- coding: utf-8 -*- # # Copyright © Spyder Project Contributors # Licensed under the terms of the MIT License # (see spyder/__init__.py for details) """Outline explorer main widget.""" from qtpy.QtCore import Signal from qtpy.QtWidgets import QHBoxLayout from spyder.api.widgets.main_widget import PluginMainWidget from spyder.api.translations import get_translation from spyder.plugins.outlineexplorer.widgets import OutlineExplorerTreeWidget _ = get_translation('spyder') # ---- Enums # ----------------------------------------------------------------------------- class OutlineExplorerToolbuttons: GoToCursor = 'go_to_cursor' class OutlineExplorerSections: Main = 'main_section' DisplayOptions = 'display_options' class OutlineExplorerActions: GoToCursor = 'go_to_cursor' ShowFullPath = 'show_fullpath' ShowAllFiles = 'show_all_files' ShowSpecialComments = 'show_comments' GroupCodeCells = 'group_code_cells' DisplayVariables = 'display_variables' FollowCursor = 'follow_cursor' SortFiles = 'sort_files_alphabetically' # ---- Main widget # ----------------------------------------------------------------------------- class OutlineExplorerWidget(PluginMainWidget): """Class browser""" edit_goto = Signal(str, int, str) edit = Signal(str) is_visible = Signal() sig_update_configuration = Signal() ENABLE_SPINNER = True CONF_SECTION = 'outline_explorer' def __init__(self, name, plugin, parent=None, context=None): if context is not None: self.CONTEXT_NAME = context super().__init__(name, plugin, parent) self.treewidget = OutlineExplorerTreeWidget(self) self.treewidget.sig_display_spinner.connect(self.start_spinner) self.treewidget.sig_hide_spinner.connect(self.stop_spinner) self.treewidget.sig_update_configuration.connect( self.sig_update_configuration) self.treewidget.header().hide() layout = QHBoxLayout() layout.addWidget(self.treewidget) self.setLayout(layout) # ---- PluginMainWidget API # ------------------------------------------------------------------------- def get_focus_widget(self): """Define the widget to focus.""" return self.treewidget def get_title(self): """Return the title of the plugin tab.""" return _("Outline") def setup(self): """Performs the setup of plugin's menu and actions.""" # Toolbar buttons toolbar = self.get_main_toolbar() fromcursor_btn = self.create_toolbutton( OutlineExplorerToolbuttons.GoToCursor, icon=self.create_icon('fromcursor'), tip=_('Go to cursor position'), triggered=self.treewidget.go_to_cursor_position) for item in [fromcursor_btn, self.treewidget.collapse_all_action, self.treewidget.expand_all_action, self.treewidget.restore_action, self.treewidget.collapse_selection_action, self.treewidget.expand_selection_action]: self.add_item_to_toolbar(item, toolbar=toolbar, section=OutlineExplorerSections.Main) # Actions fromcursor_act = self.create_action( OutlineExplorerActions.GoToCursor, text=_('Go to cursor position'), icon=self.create_icon('fromcursor'), triggered=self.treewidget.go_to_cursor_position) fullpath_act = self.create_action( OutlineExplorerActions.ShowFullPath, text=_('Show absolute path'), toggled=True, option='show_fullpath') allfiles_act = self.create_action( OutlineExplorerActions.ShowAllFiles, text=_('Show all files'), toggled=True, option='show_all_files') comment_act = self.create_action( OutlineExplorerActions.ShowSpecialComments, text=_('Show special comments'), toggled=True, option='show_comments') group_cells_act = self.create_action( OutlineExplorerActions.GroupCodeCells, text=_('Group code cells'), toggled=True, option='group_cells') display_variables_act = self.create_action( OutlineExplorerActions.DisplayVariables, text=_('Display variables and attributes'), toggled=True, option='display_variables' ) follow_cursor_act = self.create_action( OutlineExplorerActions.FollowCursor, text=_('Follow cursor position'), toggled=True, option='follow_cursor' ) sort_files_alphabetically_act = self.create_action( OutlineExplorerActions.SortFiles, text=_('Sort files alphabetically'), toggled=True, option='sort_files_alphabetically' ) actions = [fullpath_act, allfiles_act, group_cells_act, display_variables_act, follow_cursor_act, comment_act, sort_files_alphabetically_act, fromcursor_act] option_menu = self.get_options_menu() for action in actions: self.add_item_to_menu( action, option_menu, section=OutlineExplorerSections.DisplayOptions, ) def update_actions(self): pass def change_visibility(self, enable, force_focus=None): """ Reimplemented to tell treewidget what the visibility state is. """ super().change_visibility(enable, force_focus) self._change_treewidget_visibility(self.is_visible) # ---- Public API # ------------------------------------------------------------------------- def set_current_editor(self, editor, update, clear): if clear: self.remove_editor(editor) if editor is not None: self.treewidget.set_current_editor(editor, update) def remove_editor(self, editor): self.treewidget.remove_editor(editor) def register_editor(self, editor): self.treewidget.register_editor(editor) def file_renamed(self, editor, new_filename): self.treewidget.file_renamed(editor, new_filename) def start_symbol_services(self, language): """Enable LSP symbols functionality.""" self.treewidget.start_symbol_services(language) def stop_symbol_services(self, language): """Disable LSP symbols functionality.""" self.treewidget.stop_symbol_services(language) def update_all_editors(self): """Update all editors with an associated LSP server.""" self.treewidget.update_all_editors() # ---- Private API # ------------------------------------------------------------------------- def _change_treewidget_visibility(self, is_visible): """Set visibility state in treewidget.""" self.treewidget.is_visible = is_visible if is_visible: self.treewidget.update_all_editors()