--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric7/JediInterface/AssistantJedi.py Sat Sep 11 19:47:02 2021 +0200 @@ -0,0 +1,196 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2015 - 2021 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing the Jedi assistant plug-in. +""" + +from PyQt6.QtCore import pyqtSlot, QObject + +import Preferences + + +class AssistantJedi(QObject): + """ + Class implementing the Jedi assistant interface. + """ + def __init__(self, ui, viewManager, project): + """ + Constructor + + @param ui reference to the user interface object + @type UserInterface + @param viewManager reference to the viewmanager object + @type ViewManager + @param project reference to the project object + @type Project + """ + super().__init__(ui) + self.__ui = ui + self.__vm = viewManager + + self.__jediServer = None + self.__editors = [] + + from .JediServer import JediServer + self.__jediServer = JediServer(self.__vm, project, self.__ui) + self.__jediServer.activate() + + self.__ui.preferencesChanged.connect(self.__preferencesChanged) + + self.__vm.editorOpenedEd.connect(self.__editorOpened) + self.__vm.editorClosedEd.connect(self.__editorClosed) + + @pyqtSlot() + def __preferencesChanged(self): + """ + Private slot handling changes of the Disassembly viewer settings. + """ + for editor in self.__editors: + self.__disconnectMouseClickHandler(editor) + self.__connectMouseClickHandler(editor) + + def __determineLanguage(self): + """ + Private method to determine the valid language strings. + + @return list of valid language strings + @rtype list of str + """ + return ["Python3", "MicroPython", + "Pygments|Python", "Pygments|Python 2.x", + "Cython"] + + def __editorOpened(self, editor): + """ + Private slot called, when a new editor was opened. + + @param editor reference to the new editor + @type Editor + """ + languages = self.__determineLanguage() + + if editor.getLanguage() in languages: + self.__connectEditor(editor) + + editor.languageChanged.connect(self.__editorLanguageChanged) + self.__editors.append(editor) + + def __editorClosed(self, editor): + """ + Private slot called, when an editor was closed. + + @param editor reference to the editor + @type Editor + """ + if editor in self.__editors: + editor.languageChanged.disconnect(self.__editorLanguageChanged) + self.__disconnectEditor(editor) + self.__editors.remove(editor) + + def __editorLanguageChanged(self, language): + """ + Private slot to handle the language change of an editor. + + @param language programming language of the editor + @type str + """ + editor = self.sender() + languages = self.__determineLanguage() + + self.__disconnectEditor(editor) + if language in languages: + self.__connectEditor(editor) + + def __connectEditor(self, editor): + """ + Private method to connect an editor. + + @param editor reference to the editor + @type Editor + """ + self.__setAutoCompletionHook(editor) + self.__setCalltipsHook(editor) + + self.__connectMouseClickHandler(editor) + + editor.registerMouseHoverHelpFunction( + self.__jediServer.hoverHelp) + + def __disconnectEditor(self, editor): + """ + Private method to disconnect an editor. + + @param editor reference to the editor + @type Editor + """ + self.__unsetAutoCompletionHook(editor) + self.__unsetCalltipsHook(editor) + + self.__disconnectMouseClickHandler(editor) + + editor.unregisterMouseHoverHelpFunction( + self.__jediServer.hoverHelp) + + def __connectMouseClickHandler(self, editor): + """ + Private method to connect the mouse click handler to an editor. + + @param editor reference to the editor + @type Editor + """ + if Preferences.getJedi("MouseClickGotoButton"): + editor.setMouseClickHandler( + "jedi", + Preferences.getJedi("MouseClickGotoModifiers"), + Preferences.getJedi("MouseClickGotoButton"), + self.__jediServer.gotoDefinition + ) + + def __disconnectMouseClickHandler(self, editor): + """ + Private method to disconnect the mouse click handler from an editor. + + @param editor reference to the editor + @type Editor + """ + editor.removeMouseClickHandlers("jedi") + + def __setAutoCompletionHook(self, editor): + """ + Private method to set the autocompletion hook. + + @param editor reference to the editor + @type Editor + """ + editor.addCompletionListHook( + "jedi", self.__jediServer.requestCompletions, True) + + def __unsetAutoCompletionHook(self, editor): + """ + Private method to unset the autocompletion hook. + + @param editor reference to the editor + @type Editor + """ + editor.removeCompletionListHook("jedi") + + def __setCalltipsHook(self, editor): + """ + Private method to set the calltip hook. + + @param editor reference to the editor + @type Editor + """ + editor.addCallTipHook("jedi", self.__jediServer.getCallTips) + + def __unsetCalltipsHook(self, editor): + """ + Private method to unset the calltip hook. + + @param editor reference to the editor + @type Editor + """ + editor.removeCallTipHook("jedi")