Sat, 02 Dec 2017 12:40:22 +0100
Merged with default branch to prepare a new release.
--- a/APIs/Python3/eric6.api Sun Nov 19 13:06:01 2017 +0100 +++ b/APIs/Python3/eric6.api Sat Dec 02 12:40:22 2017 +0100 @@ -125,6 +125,7 @@ eric6.DebugClients.Python.AsyncFile.AsyncFile.maxtries?7 eric6.DebugClients.Python.AsyncFile.AsyncFile.pendingWrite?4() eric6.DebugClients.Python.AsyncFile.AsyncFile.read?4(size=-1) +eric6.DebugClients.Python.AsyncFile.AsyncFile.readCommand?4() eric6.DebugClients.Python.AsyncFile.AsyncFile.read_p?4(size=-1) eric6.DebugClients.Python.AsyncFile.AsyncFile.readable?4() eric6.DebugClients.Python.AsyncFile.AsyncFile.readline?4(sizehint=-1) @@ -217,7 +218,6 @@ eric6.DebugClients.Python.DebugClientBase.DebugClientBase.getCoding?4() eric6.DebugClients.Python.DebugClientBase.DebugClientBase.getRunning?4() eric6.DebugClients.Python.DebugClientBase.DebugClientBase.handleJsonCommand?4(jsonStr) -eric6.DebugClients.Python.DebugClientBase.DebugClientBase.handleLine?4(line) eric6.DebugClients.Python.DebugClientBase.DebugClientBase.input?4(prompt) eric6.DebugClients.Python.DebugClientBase.DebugClientBase.main?4() eric6.DebugClients.Python.DebugClientBase.DebugClientBase.progTerminated?4(status, message="") @@ -552,8 +552,8 @@ eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteBreakpointIgnore?4(fn, line, count) eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteCapabilities?4() eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteClientSetFilter?4(scope, filterStr) -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteClientVariable?4(scope, filterList, var, framenr=0) -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteClientVariables?4(scope, filterList, framenr=0) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteClientVariable?4(scope, filterList, var, framenr=0, maxSize=0) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteClientVariables?4(scope, filterList, framenr=0, maxSize=0) eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteCompletion?4(text) eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteContinue?4(special=False) eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteCoverage?4(fn, argv, wd, erase=False) @@ -595,8 +595,8 @@ eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteBreakpointIgnore?4(fn, line, count) eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteCapabilities?4() eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteClientSetFilter?4(scope, filterStr) -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteClientVariable?4(scope, filterList, var, framenr=0) -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteClientVariables?4(scope, filterList, framenr=0) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteClientVariable?4(scope, filterList, var, framenr=0, maxSize=0) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteClientVariables?4(scope, filterList, framenr=0, maxSize=0) eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteCompletion?4(text) eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteContinue?4(special=False) eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteCoverage?4(fn, argv, wd, erase=False) @@ -1256,7 +1256,7 @@ eric6.E5Gui.E5TextEditSearchWidget.E5TextEditSearchWidget.on_findNextButton_clicked?4() eric6.E5Gui.E5TextEditSearchWidget.E5TextEditSearchWidget.on_findPrevButton_clicked?4() eric6.E5Gui.E5TextEditSearchWidget.E5TextEditSearchWidget.on_findtextCombo_editTextChanged?4(txt) -eric6.E5Gui.E5TextEditSearchWidget.E5TextEditSearchWidget?1(parent=None) +eric6.E5Gui.E5TextEditSearchWidget.E5TextEditSearchWidget?1(parent=None, widthForHeight=True) eric6.E5Gui.E5TextSpinBox.E5TextSpinBox.addItem?4(txt, data=None) eric6.E5Gui.E5TextSpinBox.E5TextSpinBox.currentIndex?4() eric6.E5Gui.E5TextSpinBox.E5TextSpinBox.itemData?4(index) @@ -2123,7 +2123,9 @@ eric6.Helpviewer.Bookmarks.DefaultBookmarks_rc.qInitResources?4() eric6.Helpviewer.Bookmarks.DefaultBookmarks_rc.qt_resource_data?7 eric6.Helpviewer.Bookmarks.DefaultBookmarks_rc.qt_resource_name?7 -eric6.Helpviewer.Bookmarks.DefaultBookmarks_rc.qt_resource_struct?7 +eric6.Helpviewer.Bookmarks.DefaultBookmarks_rc.qt_resource_struct_v1?7 +eric6.Helpviewer.Bookmarks.DefaultBookmarks_rc.qt_resource_struct_v2?7 +eric6.Helpviewer.Bookmarks.DefaultBookmarks_rc.qt_version?7 eric6.Helpviewer.Bookmarks.NsHtmlReader.NsHtmlReader.indentSize?7 eric6.Helpviewer.Bookmarks.NsHtmlReader.NsHtmlReader.read?4(fileNameOrDevice) eric6.Helpviewer.Bookmarks.NsHtmlReader.NsHtmlReader?1() @@ -2858,7 +2860,9 @@ eric6.Helpviewer.OpenSearch.DefaultSearchEngines.DefaultSearchEngines_rc.qInitResources?4() eric6.Helpviewer.OpenSearch.DefaultSearchEngines.DefaultSearchEngines_rc.qt_resource_data?7 eric6.Helpviewer.OpenSearch.DefaultSearchEngines.DefaultSearchEngines_rc.qt_resource_name?7 -eric6.Helpviewer.OpenSearch.DefaultSearchEngines.DefaultSearchEngines_rc.qt_resource_struct?7 +eric6.Helpviewer.OpenSearch.DefaultSearchEngines.DefaultSearchEngines_rc.qt_resource_struct_v1?7 +eric6.Helpviewer.OpenSearch.DefaultSearchEngines.DefaultSearchEngines_rc.qt_resource_struct_v2?7 +eric6.Helpviewer.OpenSearch.DefaultSearchEngines.DefaultSearchEngines_rc.qt_version?7 eric6.Helpviewer.OpenSearch.OpenSearchDialog.OpenSearchDialog.on_addButton_clicked?4() eric6.Helpviewer.OpenSearch.OpenSearchDialog.OpenSearchDialog.on_deleteButton_clicked?4() eric6.Helpviewer.OpenSearch.OpenSearchDialog.OpenSearchDialog.on_editButton_clicked?4() @@ -3201,7 +3205,9 @@ eric6.Helpviewer.UserAgent.UserAgentDefaults_rc.qInitResources?4() eric6.Helpviewer.UserAgent.UserAgentDefaults_rc.qt_resource_data?7 eric6.Helpviewer.UserAgent.UserAgentDefaults_rc.qt_resource_name?7 -eric6.Helpviewer.UserAgent.UserAgentDefaults_rc.qt_resource_struct?7 +eric6.Helpviewer.UserAgent.UserAgentDefaults_rc.qt_resource_struct_v1?7 +eric6.Helpviewer.UserAgent.UserAgentDefaults_rc.qt_resource_struct_v2?7 +eric6.Helpviewer.UserAgent.UserAgentDefaults_rc.qt_version?7 eric6.Helpviewer.UserAgent.UserAgentManager.UserAgentManager.allHostNames?4() eric6.Helpviewer.UserAgent.UserAgentManager.UserAgentManager.changed?7 eric6.Helpviewer.UserAgent.UserAgentManager.UserAgentManager.close?4() @@ -3553,7 +3559,9 @@ eric6.IconEditor.cursors.cursors_rc.qInitResources?4() eric6.IconEditor.cursors.cursors_rc.qt_resource_data?7 eric6.IconEditor.cursors.cursors_rc.qt_resource_name?7 -eric6.IconEditor.cursors.cursors_rc.qt_resource_struct?7 +eric6.IconEditor.cursors.cursors_rc.qt_resource_struct_v1?7 +eric6.IconEditor.cursors.cursors_rc.qt_resource_struct_v2?7 +eric6.IconEditor.cursors.cursors_rc.qt_version?7 eric6.MultiProject.AddProjectDialog.AddProjectDialog.getData?4() eric6.MultiProject.AddProjectDialog.AddProjectDialog.on_filenamePicker_textChanged?4(txt) eric6.MultiProject.AddProjectDialog.AddProjectDialog.on_nameEdit_textChanged?4(txt) @@ -6517,6 +6525,9 @@ eric6.Preferences.ConfigurationPages.ProjectPage.ProjectPage.save?4() eric6.Preferences.ConfigurationPages.ProjectPage.ProjectPage?1() eric6.Preferences.ConfigurationPages.ProjectPage.create?4(dlg) +eric6.Preferences.ConfigurationPages.ProtobufPage.ProtobufPage.save?4() +eric6.Preferences.ConfigurationPages.ProtobufPage.ProtobufPage?1() +eric6.Preferences.ConfigurationPages.ProtobufPage.create?4(dlg) eric6.Preferences.ConfigurationPages.PythonPage.PythonPage.save?4() eric6.Preferences.ConfigurationPages.PythonPage.PythonPage?1() eric6.Preferences.ConfigurationPages.PythonPage.create?4(dlg) @@ -6616,6 +6627,7 @@ eric6.Preferences.Prefs.projectBrowserColourDefaults?7 eric6.Preferences.Prefs.projectBrowserFlagsDefaults?7 eric6.Preferences.Prefs.projectDefaults?7 +eric6.Preferences.Prefs.protobufDefaults?7 eric6.Preferences.Prefs.pyflakesDefaults?7 eric6.Preferences.Prefs.qtDefaults?7 eric6.Preferences.Prefs.resetLayout?7 @@ -6716,6 +6728,7 @@ eric6.Preferences.getProject?4(key, prefClass=Prefs) eric6.Preferences.getProjectBrowserColour?4(key, prefClass=Prefs) eric6.Preferences.getProjectBrowserFlags?4(key, prefClass=Prefs) +eric6.Preferences.getProtobuf?4(key, prefClass=Prefs) eric6.Preferences.getPython?4(key, prefClass=Prefs) eric6.Preferences.getQt4DocDir?4(prefClass=Prefs) eric6.Preferences.getQt5DocDir?4(prefClass=Prefs) @@ -6771,6 +6784,7 @@ eric6.Preferences.setProjectBrowserColour?4(key, value, prefClass=Prefs) eric6.Preferences.setProjectBrowserFlags?4(key, value, prefClass=Prefs) eric6.Preferences.setProjectBrowserFlagsDefault?4(key, value, prefClass=Prefs) +eric6.Preferences.setProtobuf?4(key, value, prefClass=Prefs) eric6.Preferences.setPython?4(key, value, prefClass=Prefs) eric6.Preferences.setQt?4(key, value, prefClass=Prefs) eric6.Preferences.setShell?4(key, value, prefClass=Prefs) @@ -6855,6 +6869,8 @@ eric6.Project.Project.Project.addLanguage?4() eric6.Project.Project.Project.addOthersDir?4() eric6.Project.Project.Project.addOthersFiles?4() +eric6.Project.Project.Project.addProtoDir?4() +eric6.Project.Project.Project.addProtoFiles?4() eric6.Project.Project.Project.addResourceDir?4() eric6.Project.Project.Project.addResourceFiles?4() eric6.Project.Project.Project.addSourceDir?4() @@ -6936,6 +6952,7 @@ eric6.Project.Project.Project.isProjectFile?4(fn) eric6.Project.Project.Project.isProjectForm?4(fn) eric6.Project.Project.Project.isProjectInterface?4(fn) +eric6.Project.Project.Project.isProjectProtocol?4(fn) eric6.Project.Project.Project.isProjectResource?4(fn) eric6.Project.Project.Project.isProjectSource?4(fn) eric6.Project.Project.Project.isPy2Project?4() @@ -6969,6 +6986,8 @@ eric6.Project.Project.Project.projectOthersAdded?7 eric6.Project.Project.Project.projectOthersRemoved?7 eric6.Project.Project.Project.projectPropertiesChanged?7 +eric6.Project.Project.Project.projectProtocolAdded?7 +eric6.Project.Project.Project.projectProtocolRemoved?7 eric6.Project.Project.Project.projectResourceAdded?7 eric6.Project.Project.Project.projectResourceRemoved?7 eric6.Project.Project.Project.projectSourceAdded?7 @@ -7060,6 +7079,7 @@ eric6.Project.ProjectBrowserFlags.FormsBrowserFlag?7 eric6.Project.ProjectBrowserFlags.InterfacesBrowserFlag?7 eric6.Project.ProjectBrowserFlags.OthersBrowserFlag?7 +eric6.Project.ProjectBrowserFlags.ProtocolsBrowserFlag?7 eric6.Project.ProjectBrowserFlags.ResourcesBrowserFlag?7 eric6.Project.ProjectBrowserFlags.SourcesBrowserFlag?7 eric6.Project.ProjectBrowserFlags.TranslationsBrowserFlag?7 @@ -7100,6 +7120,7 @@ eric6.Project.ProjectBrowserModel.ProjectBrowserModel?1(parent) eric6.Project.ProjectBrowserModel.ProjectBrowserNoType?7 eric6.Project.ProjectBrowserModel.ProjectBrowserOthersType?7 +eric6.Project.ProjectBrowserModel.ProjectBrowserProtocolsType?7 eric6.Project.ProjectBrowserModel.ProjectBrowserResourceType?7 eric6.Project.ProjectBrowserModel.ProjectBrowserSimpleDirectoryItem.dirName?4() eric6.Project.ProjectBrowserModel.ProjectBrowserSimpleDirectoryItem.lessThan?4(other, column, order) @@ -7138,6 +7159,13 @@ eric6.Project.ProjectOthersBrowser.ProjectOthersBrowser._showContextMenu?5(menu) eric6.Project.ProjectOthersBrowser.ProjectOthersBrowser.showMenu?7 eric6.Project.ProjectOthersBrowser.ProjectOthersBrowser?1(project, parent=None) +eric6.Project.ProjectProtocolsBrowser.ProjectProtocolsBrowser._contextMenuRequested?5(coord) +eric6.Project.ProjectProtocolsBrowser.ProjectProtocolsBrowser._createPopupMenus?5() +eric6.Project.ProjectProtocolsBrowser.ProjectProtocolsBrowser._openItem?5() +eric6.Project.ProjectProtocolsBrowser.ProjectProtocolsBrowser.appendStderr?7 +eric6.Project.ProjectProtocolsBrowser.ProjectProtocolsBrowser.appendStdout?7 +eric6.Project.ProjectProtocolsBrowser.ProjectProtocolsBrowser.showMenu?7 +eric6.Project.ProjectProtocolsBrowser.ProjectProtocolsBrowser?1(project, parent=None) eric6.Project.ProjectResourcesBrowser.ProjectResourcesBrowser.RCFilenameFormatPython?7 eric6.Project.ProjectResourcesBrowser.ProjectResourcesBrowser.RCFilenameFormatRuby?7 eric6.Project.ProjectResourcesBrowser.ProjectResourcesBrowser._contextMenuRequested?5(coord) @@ -8583,6 +8611,7 @@ eric6.UI.BrowserModel.BrowserFileItem.isMultiProjectFile?4() eric6.UI.BrowserModel.BrowserFileItem.isPixmapFile?4() eric6.UI.BrowserModel.BrowserFileItem.isProjectFile?4() +eric6.UI.BrowserModel.BrowserFileItem.isProtobufFile?4() eric6.UI.BrowserModel.BrowserFileItem.isPython2File?4() eric6.UI.BrowserModel.BrowserFileItem.isPython3File?4() eric6.UI.BrowserModel.BrowserFileItem.isResourcesFile?4() @@ -9003,6 +9032,7 @@ eric6.Utilities.ClassBrowsers.ClbrBaseClasses.ClbrVisibilityMixinBase.setProtected?4() eric6.Utilities.ClassBrowsers.ClbrBaseClasses.ClbrVisibilityMixinBase.setPublic?4() eric6.Utilities.ClassBrowsers.ClbrBaseClasses.Coding?1(module, file, lineno, coding) +eric6.Utilities.ClassBrowsers.ClbrBaseClasses.Enum?1(module, name, file, lineno) eric6.Utilities.ClassBrowsers.ClbrBaseClasses.Function.Class?7 eric6.Utilities.ClassBrowsers.ClbrBaseClasses.Function.General?7 eric6.Utilities.ClassBrowsers.ClbrBaseClasses.Function.Static?7 @@ -9012,6 +9042,7 @@ eric6.Utilities.ClassBrowsers.ClbrBaseClasses._ClbrBase?2(module, name, file, lineno) eric6.Utilities.ClassBrowsers.IDL_SOURCE?7 eric6.Utilities.ClassBrowsers.JS_SOURCE?7 +eric6.Utilities.ClassBrowsers.PROTO_SOURCE?7 eric6.Utilities.ClassBrowsers.PTL_SOURCE?7 eric6.Utilities.ClassBrowsers.PY_SOURCE?7 eric6.Utilities.ClassBrowsers.RB_SOURCE?7 @@ -9042,6 +9073,17 @@ eric6.Utilities.ClassBrowsers.jsclbr.Visitor?1(src, module, filename) eric6.Utilities.ClassBrowsers.jsclbr._modules?8 eric6.Utilities.ClassBrowsers.jsclbr.readmodule_ex?4(module, path=None) +eric6.Utilities.ClassBrowsers.protoclbr.Enum?1(module, name, file, lineno) +eric6.Utilities.ClassBrowsers.protoclbr.Message?1(module, name, file, lineno) +eric6.Utilities.ClassBrowsers.protoclbr.SUPPORTED_TYPES?7 +eric6.Utilities.ClassBrowsers.protoclbr.Service?1(module, name, file, lineno) +eric6.Utilities.ClassBrowsers.protoclbr.ServiceMethod?1(name, file, lineno, signature, returns) +eric6.Utilities.ClassBrowsers.protoclbr.VisibilityMixin?1() +eric6.Utilities.ClassBrowsers.protoclbr._commentsub?8 +eric6.Utilities.ClassBrowsers.protoclbr._getnext?8 +eric6.Utilities.ClassBrowsers.protoclbr._modules?8 +eric6.Utilities.ClassBrowsers.protoclbr._normalize?8 +eric6.Utilities.ClassBrowsers.protoclbr.readmodule_ex?4(module, path=None) eric6.Utilities.ClassBrowsers.pyclbr.Attribute?1(module, name, file, lineno) eric6.Utilities.ClassBrowsers.pyclbr.Class?1(module, name, superClasses, file, lineno) eric6.Utilities.ClassBrowsers.pyclbr.Function?1(module, name, file, lineno, signature='', separator=', ', modifierType=ClbrBaseClasses.Function.General, annotation="") @@ -9912,7 +9954,9 @@ eric6.WebBrowser.Bookmarks.DefaultBookmarks_rc.qInitResources?4() eric6.WebBrowser.Bookmarks.DefaultBookmarks_rc.qt_resource_data?7 eric6.WebBrowser.Bookmarks.DefaultBookmarks_rc.qt_resource_name?7 -eric6.WebBrowser.Bookmarks.DefaultBookmarks_rc.qt_resource_struct?7 +eric6.WebBrowser.Bookmarks.DefaultBookmarks_rc.qt_resource_struct_v1?7 +eric6.WebBrowser.Bookmarks.DefaultBookmarks_rc.qt_resource_struct_v2?7 +eric6.WebBrowser.Bookmarks.DefaultBookmarks_rc.qt_version?7 eric6.WebBrowser.Bookmarks.NsHtmlReader.NsHtmlReader.indentSize?7 eric6.WebBrowser.Bookmarks.NsHtmlReader.NsHtmlReader.read?4(fileNameOrDevice) eric6.WebBrowser.Bookmarks.NsHtmlReader.NsHtmlReader?1() @@ -10403,7 +10447,9 @@ eric6.WebBrowser.OpenSearch.DefaultSearchEngines.DefaultSearchEngines_rc.qInitResources?4() eric6.WebBrowser.OpenSearch.DefaultSearchEngines.DefaultSearchEngines_rc.qt_resource_data?7 eric6.WebBrowser.OpenSearch.DefaultSearchEngines.DefaultSearchEngines_rc.qt_resource_name?7 -eric6.WebBrowser.OpenSearch.DefaultSearchEngines.DefaultSearchEngines_rc.qt_resource_struct?7 +eric6.WebBrowser.OpenSearch.DefaultSearchEngines.DefaultSearchEngines_rc.qt_resource_struct_v1?7 +eric6.WebBrowser.OpenSearch.DefaultSearchEngines.DefaultSearchEngines_rc.qt_resource_struct_v2?7 +eric6.WebBrowser.OpenSearch.DefaultSearchEngines.DefaultSearchEngines_rc.qt_version?7 eric6.WebBrowser.OpenSearch.OpenSearchDialog.OpenSearchDialog.on_addButton_clicked?4() eric6.WebBrowser.OpenSearch.OpenSearchDialog.OpenSearchDialog.on_deleteButton_clicked?4() eric6.WebBrowser.OpenSearch.OpenSearchDialog.OpenSearchDialog.on_editButton_clicked?4() @@ -11030,7 +11076,9 @@ eric6.WebBrowser.UserAgent.UserAgentDefaults_rc.qInitResources?4() eric6.WebBrowser.UserAgent.UserAgentDefaults_rc.qt_resource_data?7 eric6.WebBrowser.UserAgent.UserAgentDefaults_rc.qt_resource_name?7 -eric6.WebBrowser.UserAgent.UserAgentDefaults_rc.qt_resource_struct?7 +eric6.WebBrowser.UserAgent.UserAgentDefaults_rc.qt_resource_struct_v1?7 +eric6.WebBrowser.UserAgent.UserAgentDefaults_rc.qt_resource_struct_v2?7 +eric6.WebBrowser.UserAgent.UserAgentDefaults_rc.qt_version?7 eric6.WebBrowser.UserAgent.UserAgentManager.UserAgentManager.allHostNames?4() eric6.WebBrowser.UserAgent.UserAgentManager.UserAgentManager.changed?7 eric6.WebBrowser.UserAgent.UserAgentManager.UserAgentManager.close?4()
--- a/APIs/Python3/eric6.bas Sun Nov 19 13:06:01 2017 +0100 +++ b/APIs/Python3/eric6.bas Sat Dec 02 12:40:22 2017 +0100 @@ -203,7 +203,7 @@ E5StringListEditWidget QWidget Ui_E5StringListEditWidget E5TabWidget QTabWidget E5TableView QTableView -E5TextEditSearchWidget QWidget Ui_E5TextEditSearchWidget +E5TextEditSearchWidget QWidget E5TextSpinBox QSpinBox E5TldExtractor QObject E5ToolBarDialog QDialog Ui_E5ToolBarDialog @@ -244,6 +244,7 @@ EmailDialog QDialog Ui_EmailDialog EmailPage ConfigurationPageBase Ui_EmailPage EmptyNetworkReply QNetworkReply +Enum ClbrBaseClasses.Enum VisibilityMixin EricAccessHandler SchemeAccessHandler EricSchemeHandler QWebEngineUrlSchemeHandler EricSchemeReply QIODevice @@ -519,6 +520,7 @@ MarkdownProvider MarkupBase MasterPasswordEntryDialog QDialog Ui_MasterPasswordEntryDialog MercurialPage ConfigurationPageBase Ui_MercurialPage +Message ClbrBaseClasses.Module VisibilityMixin MessageBoxWizard QObject MessageBoxWizardDialog QDialog Ui_MessageBoxWizardDialog MimeTypesPage ConfigurationPageBase Ui_MimeTypesPage @@ -630,6 +632,7 @@ ProjectInterfacesBrowser ProjectBaseBrowser ProjectOthersBrowser ProjectBaseBrowser ProjectPage ConfigurationPageBase Ui_ProjectPage +ProjectProtocolsBrowser ProjectBaseBrowser ProjectReader XMLStreamReaderBase ProjectResourcesBrowser ProjectBaseBrowser ProjectSourcesBrowser ProjectBaseBrowser @@ -637,6 +640,7 @@ ProjectTranslationsBrowser ProjectBaseBrowser ProjectWriter XMLStreamWriterBase PropertiesDialog QDialog Ui_PropertiesDialog +ProtobufPage ConfigurationPageBase Ui_ProtobufPage Purge HgExtension PurgeProjectHelper HgExtensionProjectHelper PyCoverageDialog QDialog Ui_PyCoverageDialog @@ -698,6 +702,8 @@ SearchWidget QWidget Ui_SearchWidget SecurityPage ConfigurationPageBase Ui_SecurityPage SendRefererWhitelistDialog QDialog Ui_SendRefererWhitelistDialog +Service ClbrBaseClasses.Class VisibilityMixin +ServiceMethod ClbrBaseClasses.Function VisibilityMixin SessionManager QObject SessionManagerDialog QDialog Ui_SessionManagerDialog SessionReader XMLStreamReaderBase
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DTDs/Project-6.0.dtd Sat Dec 02 12:40:22 2017 +0100 @@ -0,0 +1,174 @@ +<!-- This is the DTD for eric5's project file version 6.0 --> + +<!-- This is a copy of the Basic DTD --> +<!ELEMENT int (#PCDATA)> +<!ELEMENT long (#PCDATA)> +<!ELEMENT float (#PCDATA)> +<!ELEMENT complex (#PCDATA)> +<!ELEMENT bool (#PCDATA)> +<!ELEMENT string (#PCDATA)> +<!ELEMENT bytes (#PCDATA)> +<!ELEMENT bytearray (#PCDATA)> +<!ELEMENT none EMPTY> + +<!ELEMENT pickle (#PCDATA)> +<!ATTLIST pickle + method CDATA #REQUIRED + encoding CDATA #REQUIRED> + +<!ELEMENT key (int | long | float | complex | string | bytes)> +<!ELEMENT value (int | long | float | complex | bool | string | bytes | + bytearray | none | dict | tuple | list | set | frozenset | pickle)> + +<!ELEMENT dict (key, value)*> + +<!ELEMENT tuple (int | long | float | complex | bool | string | bytes | + bytearray | none | dict | tuple | list | set | frozenset | pickle)*> + +<!ELEMENT list (int | long | float | complex | bool | string | bytes | + bytearray | none | dict | tuple | list | set | frozenset | pickle)*> + +<!ELEMENT set (int | long | float | complex | bool | string | bytes | + bytearray | none | dict | tuple | list | set | frozenset | pickle)*> + +<!ELEMENT frozenset (int | long | float | complex | bool | string | bytes | + bytearray | none | dict | tuple | list | set | frozenset | pickle)*> +<!-- End of the Basic DTD --> + +<!ELEMENT ProgLanguage (#PCDATA)> +<!ATTLIST ProgLanguage + mixed CDATA #REQUIRED> + +<!ELEMENT ProjectType (#PCDATA)> + +<!ELEMENT Description (#PCDATA)> + +<!ELEMENT Version (#PCDATA)> + +<!ELEMENT Author (#PCDATA)> + +<!ELEMENT Email (#PCDATA)> + +<!ELEMENT TranslationPattern (#PCDATA)> + +<!ELEMENT TranslationsBinPath (#PCDATA)> + +<!ELEMENT Source (#PCDATA)> + +<!ELEMENT Sources (Source*)> + +<!ELEMENT Form (#PCDATA)> + +<!ELEMENT Forms (Form*)> + +<!ELEMENT Translation (#PCDATA)> + +<!ELEMENT Translations (Translation*)> + +<!ELEMENT TranslationException (#PCDATA)> + +<!ELEMENT TranslationExceptions (TranslationException*)> + +<!ELEMENT Resource (#PCDATA)> + +<!ELEMENT Resources (Resource*)> + +<!ELEMENT Interface (#PCDATA)> + +<!ELEMENT Interfaces (Interface*)> + +<!ELEMENT Protocol (#PCDATA)> + +<!ELEMENT Protocols (Protocol*)> + +<!ELEMENT Other (#PCDATA)> + +<!ELEMENT Others (Other*)> + +<!ELEMENT MainScript (#PCDATA)> + +<!ELEMENT VcsType (#PCDATA)> +<!ELEMENT VcsOptions (dict)> +<!ELEMENT VcsOtherData (dict)> + +<!ELEMENT Vcs (VcsType?, + VcsOptions?, + VcsOtherData?)> + +<!ELEMENT FiletypeAssociation EMPTY> +<!ATTLIST FiletypeAssociation + pattern CDATA #REQUIRED + type CDATA #REQUIRED> + +<!ELEMENT FiletypeAssociations (FiletypeAssociation*)> + +<!ELEMENT LexerAssociation EMPTY> +<!ATTLIST LexerAssociation + pattern CDATA #REQUIRED + lexer CDATA #REQUIRED> + +<!ELEMENT LexerAssociations (LexerAssociation*)> + +<!ELEMENT ProjectTypeSpecificData (dict)> + +<!ELEMENT ProjectTypeSpecific (ExtraData?)> + +<!ELEMENT DocumentationParams (dict)> + +<!ELEMENT Documentation (DocumentationParams?)> + +<!ELEMENT PackagersParams (dict)> + +<!ELEMENT Packagers (PackagersParams?)> + +<!ELEMENT CheckersParams (dict)> + +<!ELEMENT Checkers (CheckersParams?)> + +<!ELEMENT OtherToolsParams (dict)> + +<!ELEMENT OtherTools (OtherToolsParams?)> + +<!ELEMENT Language (#PCDATA)> + +<!ELEMENT ProjectWordList (#PCDATA)> + +<!ELEMENT ProjectExcludeList (#PCDATA)> + +<!ELEMENT Hash (#PCDATA)> + +<!ELEMENT Eol EMPTY> +<!ATTLIST Eol + index CDATA #REQUIRED> + +<!ELEMENT Project (Language, + ProjectWordList?, + ProjectExcludeList?, + Hash, + ProgLanguage, + ProjectType, + Description?, + Version?, + Author?, + Email?, + TranslationPattern?, + TranslationsBinPath?, + Eol?, + Sources, + Forms, + Translations, + TranslationExceptions?, + Resources, + Interfaces, + Others, + MainScript?, + Vcs, + FiletypeAssociations, + LexerAssociations?, + Extra?, + Documentation?, + Packagers?, + Checkers?, + OtherTools?)> +<!ATTLIST Project + version CDATA #REQUIRED>
--- a/DebugClients/Python/AsyncFile.py Sun Nov 19 13:06:01 2017 +0100 +++ b/DebugClients/Python/AsyncFile.py Sat Dec 02 12:40:22 2017 +0100 @@ -184,7 +184,25 @@ if size >= 0: buf = buf[:size] return buf - + + def readCommand(self): + """ + Public method to read a length prefixed command string. + + @return command string + @rtype str + """ + # The command string is prefixed by a 9 character long length field. + length = self.sock.recv(9) + length = int(length) + data = b'' + while len(data) < length: + newData = self.sock.recv(length - len(data)) + data += newData + + # step 2: convert the data + return data.decode('utf8', 'backslashreplace') + def readline_p(self, size=-1): """ Public method to read a line from this file.
--- a/DebugClients/Python/DebugBase.py Sun Nov 19 13:06:01 2017 +0100 +++ b/DebugClients/Python/DebugBase.py Sat Dec 02 12:40:22 2017 +0100 @@ -382,14 +382,14 @@ frame = sys._getframe().f_back # Skip set_trace method if sys.version_info[0] == 2: - stopOnHandleLine = self._dbgClient.handleLine.func_code + stopOnHandleCommand = self._dbgClient.handleJsonCommand.func_code else: - stopOnHandleLine = self._dbgClient.handleLine.__code__ + stopOnHandleCommand = self._dbgClient.handleJsonCommand.__code__ frame.f_trace = self.trace_dispatch while frame.f_back is not None: - # stop at erics debugger frame or a threading bootstrap - if (frame.f_back.f_code == stopOnHandleLine): + # stop at eric's debugger frame or a threading bootstrap + if (frame.f_back.f_code == stopOnHandleCommand): frame.f_trace = self.trace_dispatch break
--- a/DebugClients/Python/DebugClientBase.py Sun Nov 19 13:06:01 2017 +0100 +++ b/DebugClients/Python/DebugClientBase.py Sat Dec 02 12:40:22 2017 +0100 @@ -187,7 +187,6 @@ """ self.breakpoints = {} self.redirect = True - self.__receiveBuffer = "" # special objects representing the main scripts thread and frame self.mainThread = self @@ -355,23 +354,6 @@ return code - def handleLine(self, line): - """ - Public method to handle the receipt of a complete line. - - It first looks for a valid protocol token at the start of the line. - Thereafter it trys to execute the lines accumulated so far. - - @param line the received line - """ - # Remove any newline. - if line[-1] == '\n': - line = line[:-1] - -## printerr(line) ##debug - - self.handleJsonCommand(line) - def handleJsonCommand(self, jsonStr): """ Public method to handle a command serialized as a JSON string. @@ -379,9 +361,12 @@ @param jsonStr string containing the command received from the IDE @type str """ +## printerr(jsonStr) ##debug + try: commandDict = json.loads(jsonStr.strip()) except (TypeError, ValueError) as err: + printerr("Error handling command: " + jsonStr) printerr(str(err)) return @@ -393,12 +378,14 @@ if method == "RequestVariables": self.__dumpVariables( - params["frameNumber"], params["scope"], params["filters"]) + params["frameNumber"], params["scope"], params["filters"], + params["maxSize"]) elif method == "RequestVariable": self.__dumpVariable( params["variable"], params["frameNumber"], - params["scope"], params["filters"]) + params["scope"], params["filters"], + params["maxSize"]) elif method == "RequestThreadList": self.dumpThreadList() @@ -1029,23 +1016,17 @@ @param stream file like object that has data to be written """ try: - got = stream.readline_p() + self.lockClient() + command = stream.readCommand() + self.unlockClient() except Exception: return - if len(got) == 0: + if len(command) == 0: self.sessionClose() return - - self.__receiveBuffer = self.__receiveBuffer + got - - # Call handleLine for the line if it is complete. - eol = self.__receiveBuffer.find('\n') - while eol >= 0: - line = self.__receiveBuffer[:eol + 1] - self.__receiveBuffer = self.__receiveBuffer[eol + 1:] - self.handleLine(line) - eol = self.__receiveBuffer.find('\n') + + self.handleJsonCommand(command) def writeReady(self, stream): """ @@ -1321,15 +1302,20 @@ # reset coding self.__coding = self.defaultCoding - def __dumpVariables(self, frmnr, scope, filterList): + def __dumpVariables(self, frmnr, scope, filterList, maxSize): """ Private method to return the variables of a frame to the debug server. @param frmnr distance of frame reported on. 0 is the current frame - (int) - @param scope 1 to report global variables, 0 for local variables (int) + @type int + @param scope 1 to report global variables, 0 for local variables + @type int @param filterList the indices of variable types to be filtered - (list of int) + @type list of int + @param maxSize maximum size the formatted value of a variable will + be shown. If it is bigger than that, a 'too big' indication will + be given. + @type int """ if self.currentThread is None: return @@ -1362,7 +1348,7 @@ keylist = varDict.keys() vlist = self.__formatVariablesList( - keylist, varDict, scope, filterList) + keylist, varDict, scope, filterList, maxSize=maxSize) varlist.extend(vlist) self.sendJsonCommand("ResponseVariables", { @@ -1370,17 +1356,21 @@ "variables": varlist, }) - def __dumpVariable(self, var, frmnr, scope, filterList): + def __dumpVariable(self, var, frmnr, scope, filterList, maxSize): """ Private method to return the variables of a frame to the debug server. @param var list encoded name of the requested variable - (list of strings) + @type list of strings @param frmnr distance of frame reported on. 0 is the current frame - (int) + @type int @param scope 1 to report global variables, 0 for local variables (int) @param filterList the indices of variable types to be filtered - (list of int) + @type list of int + @param maxSize maximum size the formatted value of a variable will + be shown. If it is bigger than that, a 'too big' indication will + be given. + @type int """ if self.currentThread is None: return @@ -1429,7 +1419,8 @@ elif resolver: varDict = resolver.getDictionary(variable) vlist = self.__formatVariablesList( - list(varDict.keys()), varDict, scope, filterList) + list(varDict.keys()), varDict, scope, filterList, + maxSize=maxSize) varlist.extend(vlist) self.sendJsonCommand("ResponseVariable", { @@ -1600,7 +1591,7 @@ return varlist def __formatVariablesList(self, keylist, dict_, scope, filterList=None, - formatSequences=False): + formatSequences=False, maxSize=0): """ Private method to produce a formated variables list. @@ -1610,21 +1601,31 @@ expressions. The formated variables list (a list of tuples of 3 values) is returned. - @param keylist keys of the dictionary + @param keylist keys of the dictionary to be formatted + @type list of str @param dict_ the dictionary to be scanned + @type dict @param scope 1 to filter using the globals filter, 0 using the locals - filter (int). + filter. Variables are only added to the list, if their name do not match any of the filter expressions. + @type int @param filterList the indices of variable types to be filtered. Variables are only added to the list, if their type is not contained in the filter list. + @type list of int @param formatSequences flag indicating, that sequence or dictionary variables should be formatted. If it is 0 (or false), just the - number of items contained in these variables is returned. (boolean) + number of items contained in these variables is returned. + @type bool + @param maxSize maximum size the formatted value of a variable will + be shown. If it is bigger than that, a 'too big' indication will + be placed in the value field. + @type int @return A tuple consisting of a list of formatted variables. Each variable entry is a tuple of three elements, the variable name, its type and value. + @rtype list of tuple of (str, str, str) """ filterList = [] if filterList is None else filterList[:] @@ -1724,6 +1725,8 @@ if valtype.startswith('class') and \ rvalue[0] in ['{', '(', '[']: rvalue = "" + elif maxSize and len(rvalue) > maxSize: + rvalue = "@@TOO_BIG_TO_SHOW@@" except Exception: rvalue = '' @@ -2047,7 +2050,7 @@ redirect = True elif sys.argv[2] == "False": redirect = False - else: + else: try: redirect = int(sys.argv[2]) except (ValueError, IndexError):
--- a/Debugger/DebugServer.py Sun Nov 19 13:06:01 2017 +0100 +++ b/Debugger/DebugServer.py Sat Dec 02 12:40:22 2017 +0100 @@ -124,7 +124,7 @@ clientOutput = pyqtSignal(str) clientLine = pyqtSignal(str, int, bool) clientStack = pyqtSignal(list) - clientThreadList = pyqtSignal(int, list) + clientThreadList = pyqtSignal('PyQt_PyObject', list) clientThreadSet = pyqtSignal() clientVariables = pyqtSignal(int, list) clientVariable = pyqtSignal(int, list) @@ -245,6 +245,8 @@ self.watchpointModel.dataChanged.connect(self.__changeWatchPoints) self.watchpointModel.rowsInserted.connect(self.__addWatchPoints) + self.__maxVariableSize = Preferences.getDebugger("MaxVariableSize") + self.__registerDebuggerInterfaces() def getHostAddress(self, localhost): @@ -304,6 +306,8 @@ for interfaceName, getRegistryData in registeredInterfaces.items(): self.registerDebuggerInterface(interfaceName, getRegistryData) + self.__maxVariableSize = Preferences.getDebugger("MaxVariableSize") + def registerDebuggerInterface(self, interfaceName, getRegistryData): """ Public method to register a debugger interface. @@ -1127,8 +1131,8 @@ @param filterList list of variable types to filter out (list of int) @param framenr framenumber of the variables to retrieve (int) """ - self.debuggerInterface.remoteClientVariables(scope, filterList, - framenr) + self.debuggerInterface.remoteClientVariables( + scope, filterList, framenr, self.__maxVariableSize) def remoteClientVariable(self, scope, filterList, var, framenr=0): """ @@ -1140,7 +1144,7 @@ @param framenr framenumber of the variables to retrieve (int) """ self.debuggerInterface.remoteClientVariable( - scope, filterList, var, framenr) + scope, filterList, var, framenr, self.__maxVariableSize) def remoteClientSetFilter(self, scope, filterStr): """
--- a/Debugger/DebuggerInterfaceNone.py Sun Nov 19 13:06:01 2017 +0100 +++ b/Debugger/DebuggerInterfaceNone.py Sat Dec 02 12:40:22 2017 +0100 @@ -309,24 +309,40 @@ """ return - def remoteClientVariables(self, scope, filterList, framenr=0): + def remoteClientVariables(self, scope, filterList, framenr=0, maxSize=0): """ Public method to request the variables of the debugged program. @param scope the scope of the variables (0 = local, 1 = global) - @param filterList list of variable types to filter out (list of int) - @param framenr framenumber of the variables to retrieve (int) + @type int + @param filterList list of variable types to filter out + @type list of int + @param framenr framenumber of the variables to retrieve + @type int + @param maxSize maximum size the formatted value of a variable will + be shown. If it is bigger than that, a 'too big' indication will + be given (@@TOO_BIG_TO_SHOW@@). + @type int """ return - def remoteClientVariable(self, scope, filterList, var, framenr=0): + def remoteClientVariable(self, scope, filterList, var, framenr=0, + maxSize=0): """ Public method to request the variables of the debugged program. @param scope the scope of the variables (0 = local, 1 = global) - @param filterList list of variable types to filter out (list of int) - @param var list encoded name of variable to retrieve (string) + @type int + @param filterList list of variable types to filter out + @type list of int + @param var list encoded name of variable to retrieve + @type list of str @param framenr framenumber of the variables to retrieve (int) + @type int + @param maxSize maximum size the formatted value of a variable will + be shown. If it is bigger than that, a 'too big' indication will + be given (@@TOO_BIG_TO_SHOW@@). + @type int """ return
--- a/Debugger/DebuggerInterfacePython.py Sun Nov 19 13:06:01 2017 +0100 +++ b/Debugger/DebuggerInterfacePython.py Sat Dec 02 12:40:22 2017 +0100 @@ -407,7 +407,7 @@ """ # Send commands that were waiting for the connection. for cmd in self.queue: - self.qsock.write(cmd.encode('utf8', 'backslashreplace')) + self.__writeJsonCommandToSocket(cmd) self.queue = [] @@ -718,34 +718,52 @@ "threadID": tid, }) - def remoteClientVariables(self, scope, filterList, framenr=0): + def remoteClientVariables(self, scope, filterList, framenr=0, maxSize=0): """ Public method to request the variables of the debugged program. @param scope the scope of the variables (0 = local, 1 = global) - @param filterList list of variable types to filter out (list of int) - @param framenr framenumber of the variables to retrieve (int) + @type int + @param filterList list of variable types to filter out + @type list of int + @param framenr framenumber of the variables to retrieve + @type int + @param maxSize maximum size the formatted value of a variable will + be shown. If it is bigger than that, a 'too big' indication will + be given (@@TOO_BIG_TO_SHOW@@). + @type int """ self.__sendJsonCommand("RequestVariables", { "frameNumber": framenr, "scope": scope, "filters": filterList, + "maxSize": maxSize, }) - def remoteClientVariable(self, scope, filterList, var, framenr=0): + def remoteClientVariable(self, scope, filterList, var, framenr=0, + maxSize=0): """ Public method to request the variables of the debugged program. @param scope the scope of the variables (0 = local, 1 = global) - @param filterList list of variable types to filter out (list of int) - @param var list encoded name of variable to retrieve (string) - @param framenr framenumber of the variables to retrieve (int) + @type int + @param filterList list of variable types to filter out + @type list of int + @param var list encoded name of variable to retrieve + @type list of str + @param framenr framenumber of the variables to retrieve + @type int + @param maxSize maximum size the formatted value of a variable will + be shown. If it is bigger than that, a 'too big' indication will + be given (@@TOO_BIG_TO_SHOW@@). + @type int """ self.__sendJsonCommand("RequestVariable", { "variable": var, "frameNumber": framenr, "scope": scope, "filters": filterList, + "maxSize": maxSize, }) def remoteClientSetFilter(self, scope, filterStr): @@ -1087,9 +1105,21 @@ } cmd = json.dumps(commandDict) + '\n' if self.qsock is not None: - self.qsock.write(cmd.encode('utf8', 'backslashreplace')) + self.__writeJsonCommandToSocket(cmd) else: self.queue.append(cmd) + + def __writeJsonCommandToSocket(self, cmd): + """ + Private method to write a JSON command to the socket. + + @param cmd JSON command to be sent + @type str + """ + data = cmd.encode('utf8', 'backslashreplace') + length = "{0:09d}".format(len(data)) + self.qsock.write(length.encode() + data) + self.qsock.flush() def createDebuggerInterfacePython2(debugServer, passive):
--- a/Debugger/VariablesViewer.py Sun Nov 19 13:06:01 2017 +0100 +++ b/Debugger/VariablesViewer.py Sat Dec 02 12:40:22 2017 +0100 @@ -56,6 +56,9 @@ dvalue = QCoreApplication.translate( "VariableItem", "<double click to show value>") self.__tooltip = dvalue + elif dvalue == "@@TOO_BIG_TO_SHOW@@": + dvalue = QCoreApplication.translate( + "VariableItem", "<variable value is too big>") else: if Qt.mightBeRichText(dvalue): self.__tooltip = Utilities.html_encode(dvalue)
--- a/Documentation/Help/source.qhp Sun Nov 19 13:06:01 2017 +0100 +++ b/Documentation/Help/source.qhp Sat Dec 02 12:40:22 2017 +0100 @@ -823,6 +823,7 @@ <section title="eric6.Preferences.ConfigurationPages.PrinterPage" ref="eric6.Preferences.ConfigurationPages.PrinterPage.html" /> <section title="eric6.Preferences.ConfigurationPages.ProjectBrowserPage" ref="eric6.Preferences.ConfigurationPages.ProjectBrowserPage.html" /> <section title="eric6.Preferences.ConfigurationPages.ProjectPage" ref="eric6.Preferences.ConfigurationPages.ProjectPage.html" /> + <section title="eric6.Preferences.ConfigurationPages.ProtobufPage" ref="eric6.Preferences.ConfigurationPages.ProtobufPage.html" /> <section title="eric6.Preferences.ConfigurationPages.PythonPage" ref="eric6.Preferences.ConfigurationPages.PythonPage.html" /> <section title="eric6.Preferences.ConfigurationPages.QtPage" ref="eric6.Preferences.ConfigurationPages.QtPage.html" /> <section title="eric6.Preferences.ConfigurationPages.SecurityPage" ref="eric6.Preferences.ConfigurationPages.SecurityPage.html" /> @@ -868,6 +869,7 @@ <section title="eric6.Project.ProjectFormsBrowser" ref="eric6.Project.ProjectFormsBrowser.html" /> <section title="eric6.Project.ProjectInterfacesBrowser" ref="eric6.Project.ProjectInterfacesBrowser.html" /> <section title="eric6.Project.ProjectOthersBrowser" ref="eric6.Project.ProjectOthersBrowser.html" /> + <section title="eric6.Project.ProjectProtocolsBrowser" ref="eric6.Project.ProjectProtocolsBrowser.html" /> <section title="eric6.Project.ProjectResourcesBrowser" ref="eric6.Project.ProjectResourcesBrowser.html" /> <section title="eric6.Project.ProjectSourcesBrowser" ref="eric6.Project.ProjectSourcesBrowser.html" /> <section title="eric6.Project.ProjectTranslationsBrowser" ref="eric6.Project.ProjectTranslationsBrowser.html" /> @@ -1044,6 +1046,7 @@ <section title="eric6.Utilities.ClassBrowsers.__init__" ref="eric6.Utilities.ClassBrowsers.__init__.html" /> <section title="eric6.Utilities.ClassBrowsers.idlclbr" ref="eric6.Utilities.ClassBrowsers.idlclbr.html" /> <section title="eric6.Utilities.ClassBrowsers.jsclbr" ref="eric6.Utilities.ClassBrowsers.jsclbr.html" /> + <section title="eric6.Utilities.ClassBrowsers.protoclbr" ref="eric6.Utilities.ClassBrowsers.protoclbr.html" /> <section title="eric6.Utilities.ClassBrowsers.pyclbr" ref="eric6.Utilities.ClassBrowsers.pyclbr.html" /> <section title="eric6.Utilities.ClassBrowsers.rbclbr" ref="eric6.Utilities.ClassBrowsers.rbclbr.html" /> </section> @@ -1911,6 +1914,7 @@ <keyword name="AsyncFile.isatty" id="AsyncFile.isatty" ref="eric6.DebugClients.Python.AsyncFile.html#AsyncFile.isatty" /> <keyword name="AsyncFile.pendingWrite" id="AsyncFile.pendingWrite" ref="eric6.DebugClients.Python.AsyncFile.html#AsyncFile.pendingWrite" /> <keyword name="AsyncFile.read" id="AsyncFile.read" ref="eric6.DebugClients.Python.AsyncFile.html#AsyncFile.read" /> + <keyword name="AsyncFile.readCommand" id="AsyncFile.readCommand" ref="eric6.DebugClients.Python.AsyncFile.html#AsyncFile.readCommand" /> <keyword name="AsyncFile.read_p" id="AsyncFile.read_p" ref="eric6.DebugClients.Python.AsyncFile.html#AsyncFile.read_p" /> <keyword name="AsyncFile.readable" id="AsyncFile.readable" ref="eric6.DebugClients.Python.AsyncFile.html#AsyncFile.readable" /> <keyword name="AsyncFile.readline" id="AsyncFile.readline" ref="eric6.DebugClients.Python.AsyncFile.html#AsyncFile.readline" /> @@ -2474,6 +2478,7 @@ <keyword name="BrowserFileItem.isMultiProjectFile" id="BrowserFileItem.isMultiProjectFile" ref="eric6.UI.BrowserModel.html#BrowserFileItem.isMultiProjectFile" /> <keyword name="BrowserFileItem.isPixmapFile" id="BrowserFileItem.isPixmapFile" ref="eric6.UI.BrowserModel.html#BrowserFileItem.isPixmapFile" /> <keyword name="BrowserFileItem.isProjectFile" id="BrowserFileItem.isProjectFile" ref="eric6.UI.BrowserModel.html#BrowserFileItem.isProjectFile" /> + <keyword name="BrowserFileItem.isProtobufFile" id="BrowserFileItem.isProtobufFile" ref="eric6.UI.BrowserModel.html#BrowserFileItem.isProtobufFile" /> <keyword name="BrowserFileItem.isPython2File" id="BrowserFileItem.isPython2File" ref="eric6.UI.BrowserModel.html#BrowserFileItem.isPython2File" /> <keyword name="BrowserFileItem.isPython3File" id="BrowserFileItem.isPython3File" ref="eric6.UI.BrowserModel.html#BrowserFileItem.isPython3File" /> <keyword name="BrowserFileItem.isResourcesFile" id="BrowserFileItem.isResourcesFile" ref="eric6.UI.BrowserModel.html#BrowserFileItem.isResourcesFile" /> @@ -3429,7 +3434,6 @@ <keyword name="DebugClientBase.getCoding" id="DebugClientBase.getCoding" ref="eric6.DebugClients.Python.DebugClientBase.html#DebugClientBase.getCoding" /> <keyword name="DebugClientBase.getRunning" id="DebugClientBase.getRunning" ref="eric6.DebugClients.Python.DebugClientBase.html#DebugClientBase.getRunning" /> <keyword name="DebugClientBase.handleJsonCommand" id="DebugClientBase.handleJsonCommand" ref="eric6.DebugClients.Python.DebugClientBase.html#DebugClientBase.handleJsonCommand" /> - <keyword name="DebugClientBase.handleLine" id="DebugClientBase.handleLine" ref="eric6.DebugClients.Python.DebugClientBase.html#DebugClientBase.handleLine" /> <keyword name="DebugClientBase.input" id="DebugClientBase.input" ref="eric6.DebugClients.Python.DebugClientBase.html#DebugClientBase.input" /> <keyword name="DebugClientBase.main" id="DebugClientBase.main" ref="eric6.DebugClients.Python.DebugClientBase.html#DebugClientBase.main" /> <keyword name="DebugClientBase.progTerminated" id="DebugClientBase.progTerminated" ref="eric6.DebugClients.Python.DebugClientBase.html#DebugClientBase.progTerminated" /> @@ -3725,6 +3729,7 @@ <keyword name="DebuggerInterfacePython.__remoteTranslation" id="DebuggerInterfacePython.__remoteTranslation" ref="eric6.Debugger.DebuggerInterfacePython.html#DebuggerInterfacePython.__remoteTranslation" /> <keyword name="DebuggerInterfacePython.__sendJsonCommand" id="DebuggerInterfacePython.__sendJsonCommand" ref="eric6.Debugger.DebuggerInterfacePython.html#DebuggerInterfacePython.__sendJsonCommand" /> <keyword name="DebuggerInterfacePython.__startProcess" id="DebuggerInterfacePython.__startProcess" ref="eric6.Debugger.DebuggerInterfacePython.html#DebuggerInterfacePython.__startProcess" /> + <keyword name="DebuggerInterfacePython.__writeJsonCommandToSocket" id="DebuggerInterfacePython.__writeJsonCommandToSocket" ref="eric6.Debugger.DebuggerInterfacePython.html#DebuggerInterfacePython.__writeJsonCommandToSocket" /> <keyword name="DebuggerInterfacePython.flush" id="DebuggerInterfacePython.flush" ref="eric6.Debugger.DebuggerInterfacePython.html#DebuggerInterfacePython.flush" /> <keyword name="DebuggerInterfacePython.getClientCapabilities" id="DebuggerInterfacePython.getClientCapabilities" ref="eric6.Debugger.DebuggerInterfacePython.html#DebuggerInterfacePython.getClientCapabilities" /> <keyword name="DebuggerInterfacePython.isConnected" id="DebuggerInterfacePython.isConnected" ref="eric6.Debugger.DebuggerInterfacePython.html#DebuggerInterfacePython.isConnected" /> @@ -4702,6 +4707,7 @@ <keyword name="E5TextEditSearchWidget.__findPrevNextQWebView" id="E5TextEditSearchWidget.__findPrevNextQWebView" ref="eric6.E5Gui.E5TextEditSearchWidget.html#E5TextEditSearchWidget.__findPrevNextQWebView" /> <keyword name="E5TextEditSearchWidget.__setFindtextComboBackground" id="E5TextEditSearchWidget.__setFindtextComboBackground" ref="eric6.E5Gui.E5TextEditSearchWidget.html#E5TextEditSearchWidget.__setFindtextComboBackground" /> <keyword name="E5TextEditSearchWidget.__setSearchButtons" id="E5TextEditSearchWidget.__setSearchButtons" ref="eric6.E5Gui.E5TextEditSearchWidget.html#E5TextEditSearchWidget.__setSearchButtons" /> + <keyword name="E5TextEditSearchWidget.__setupUi" id="E5TextEditSearchWidget.__setupUi" ref="eric6.E5Gui.E5TextEditSearchWidget.html#E5TextEditSearchWidget.__setupUi" /> <keyword name="E5TextEditSearchWidget.attachTextEdit" id="E5TextEditSearchWidget.attachTextEdit" ref="eric6.E5Gui.E5TextEditSearchWidget.html#E5TextEditSearchWidget.attachTextEdit" /> <keyword name="E5TextEditSearchWidget.keyPressEvent" id="E5TextEditSearchWidget.keyPressEvent" ref="eric6.E5Gui.E5TextEditSearchWidget.html#E5TextEditSearchWidget.keyPressEvent" /> <keyword name="E5TextEditSearchWidget.on_findNextButton_clicked" id="E5TextEditSearchWidget.on_findNextButton_clicked" ref="eric6.E5Gui.E5TextEditSearchWidget.html#E5TextEditSearchWidget.on_findNextButton_clicked" /> @@ -5493,6 +5499,10 @@ <keyword name="EmptyNetworkReply (Module)" id="EmptyNetworkReply (Module)" ref="eric6.Helpviewer.Network.EmptyNetworkReply.html" /> <keyword name="EmptyNetworkReply.abort" id="EmptyNetworkReply.abort" ref="eric6.Helpviewer.Network.EmptyNetworkReply.html#EmptyNetworkReply.abort" /> <keyword name="EmptyNetworkReply.readData" id="EmptyNetworkReply.readData" ref="eric6.Helpviewer.Network.EmptyNetworkReply.html#EmptyNetworkReply.readData" /> + <keyword name="Enum" id="Enum" ref="eric6.Utilities.ClassBrowsers.ClbrBaseClasses.html#Enum" /> + <keyword name="Enum" id="Enum" ref="eric6.Utilities.ClassBrowsers.protoclbr.html#Enum" /> + <keyword name="Enum (Constructor)" id="Enum (Constructor)" ref="eric6.Utilities.ClassBrowsers.ClbrBaseClasses.html#Enum.__init__" /> + <keyword name="Enum (Constructor)" id="Enum (Constructor)" ref="eric6.Utilities.ClassBrowsers.protoclbr.html#Enum.__init__" /> <keyword name="EricAccessHandler" id="EricAccessHandler" ref="eric6.Helpviewer.Network.EricAccessHandler.html#EricAccessHandler" /> <keyword name="EricAccessHandler (Module)" id="EricAccessHandler (Module)" ref="eric6.Helpviewer.Network.EricAccessHandler.html" /> <keyword name="EricAccessHandler.__createHomePage" id="EricAccessHandler.__createHomePage" ref="eric6.Helpviewer.Network.EricAccessHandler.html#EricAccessHandler.__createHomePage" /> @@ -9771,6 +9781,8 @@ <keyword name="MercurialPage (Module)" id="MercurialPage (Module)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.MercurialPage.html" /> <keyword name="MercurialPage.on_configButton_clicked" id="MercurialPage.on_configButton_clicked" ref="eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.MercurialPage.html#MercurialPage.on_configButton_clicked" /> <keyword name="MercurialPage.save" id="MercurialPage.save" ref="eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.MercurialPage.html#MercurialPage.save" /> + <keyword name="Message" id="Message" ref="eric6.Utilities.ClassBrowsers.protoclbr.html#Message" /> + <keyword name="Message (Constructor)" id="Message (Constructor)" ref="eric6.Utilities.ClassBrowsers.protoclbr.html#Message.__init__" /> <keyword name="MessageBoxWizard" id="MessageBoxWizard" ref="eric6.Plugins.PluginWizardQMessageBox.html#MessageBoxWizard" /> <keyword name="MessageBoxWizard (Constructor)" id="MessageBoxWizard (Constructor)" ref="eric6.Plugins.PluginWizardQMessageBox.html#MessageBoxWizard.__init__" /> <keyword name="MessageBoxWizard (Package)" id="MessageBoxWizard (Package)" ref="index-eric6.Plugins.WizardPlugins.MessageBoxWizard.html" /> @@ -11198,6 +11210,8 @@ <keyword name="Project.addLanguage" id="Project.addLanguage" ref="eric6.Project.Project.html#Project.addLanguage" /> <keyword name="Project.addOthersDir" id="Project.addOthersDir" ref="eric6.Project.Project.html#Project.addOthersDir" /> <keyword name="Project.addOthersFiles" id="Project.addOthersFiles" ref="eric6.Project.Project.html#Project.addOthersFiles" /> + <keyword name="Project.addProtoDir" id="Project.addProtoDir" ref="eric6.Project.Project.html#Project.addProtoDir" /> + <keyword name="Project.addProtoFiles" id="Project.addProtoFiles" ref="eric6.Project.Project.html#Project.addProtoFiles" /> <keyword name="Project.addResourceDir" id="Project.addResourceDir" ref="eric6.Project.Project.html#Project.addResourceDir" /> <keyword name="Project.addResourceFiles" id="Project.addResourceFiles" ref="eric6.Project.Project.html#Project.addResourceFiles" /> <keyword name="Project.addSourceDir" id="Project.addSourceDir" ref="eric6.Project.Project.html#Project.addSourceDir" /> @@ -11274,6 +11288,7 @@ <keyword name="Project.isProjectFile" id="Project.isProjectFile" ref="eric6.Project.Project.html#Project.isProjectFile" /> <keyword name="Project.isProjectForm" id="Project.isProjectForm" ref="eric6.Project.Project.html#Project.isProjectForm" /> <keyword name="Project.isProjectInterface" id="Project.isProjectInterface" ref="eric6.Project.Project.html#Project.isProjectInterface" /> + <keyword name="Project.isProjectProtocol" id="Project.isProjectProtocol" ref="eric6.Project.Project.html#Project.isProjectProtocol" /> <keyword name="Project.isProjectResource" id="Project.isProjectResource" ref="eric6.Project.Project.html#Project.isProjectResource" /> <keyword name="Project.isProjectSource" id="Project.isProjectSource" ref="eric6.Project.Project.html#Project.isProjectSource" /> <keyword name="Project.isPy2Project" id="Project.isPy2Project" ref="eric6.Project.Project.html#Project.isPy2Project" /> @@ -11526,6 +11541,29 @@ <keyword name="ProjectPage (Constructor)" id="ProjectPage (Constructor)" ref="eric6.Preferences.ConfigurationPages.ProjectPage.html#ProjectPage.__init__" /> <keyword name="ProjectPage (Module)" id="ProjectPage (Module)" ref="eric6.Preferences.ConfigurationPages.ProjectPage.html" /> <keyword name="ProjectPage.save" id="ProjectPage.save" ref="eric6.Preferences.ConfigurationPages.ProjectPage.html#ProjectPage.save" /> + <keyword name="ProjectProtocolsBrowser" id="ProjectProtocolsBrowser" ref="eric6.Project.ProjectProtocolsBrowser.html#ProjectProtocolsBrowser" /> + <keyword name="ProjectProtocolsBrowser (Constructor)" id="ProjectProtocolsBrowser (Constructor)" ref="eric6.Project.ProjectProtocolsBrowser.html#ProjectProtocolsBrowser.__init__" /> + <keyword name="ProjectProtocolsBrowser (Module)" id="ProjectProtocolsBrowser (Module)" ref="eric6.Project.ProjectProtocolsBrowser.html" /> + <keyword name="ProjectProtocolsBrowser.__addProtocolFiles" id="ProjectProtocolsBrowser.__addProtocolFiles" ref="eric6.Project.ProjectProtocolsBrowser.html#ProjectProtocolsBrowser.__addProtocolFiles" /> + <keyword name="ProjectProtocolsBrowser.__addProtocolsDirectory" id="ProjectProtocolsBrowser.__addProtocolsDirectory" ref="eric6.Project.ProjectProtocolsBrowser.html#ProjectProtocolsBrowser.__addProtocolsDirectory" /> + <keyword name="ProjectProtocolsBrowser.__compileAllProtocols" id="ProjectProtocolsBrowser.__compileAllProtocols" ref="eric6.Project.ProjectProtocolsBrowser.html#ProjectProtocolsBrowser.__compileAllProtocols" /> + <keyword name="ProjectProtocolsBrowser.__compileProto" id="ProjectProtocolsBrowser.__compileProto" ref="eric6.Project.ProjectProtocolsBrowser.html#ProjectProtocolsBrowser.__compileProto" /> + <keyword name="ProjectProtocolsBrowser.__compileProtoDone" id="ProjectProtocolsBrowser.__compileProtoDone" ref="eric6.Project.ProjectProtocolsBrowser.html#ProjectProtocolsBrowser.__compileProtoDone" /> + <keyword name="ProjectProtocolsBrowser.__compileProtocol" id="ProjectProtocolsBrowser.__compileProtocol" ref="eric6.Project.ProjectProtocolsBrowser.html#ProjectProtocolsBrowser.__compileProtocol" /> + <keyword name="ProjectProtocolsBrowser.__compileSelectedProtocols" id="ProjectProtocolsBrowser.__compileSelectedProtocols" ref="eric6.Project.ProjectProtocolsBrowser.html#ProjectProtocolsBrowser.__compileSelectedProtocols" /> + <keyword name="ProjectProtocolsBrowser.__configureProtobuf" id="ProjectProtocolsBrowser.__configureProtobuf" ref="eric6.Project.ProjectProtocolsBrowser.html#ProjectProtocolsBrowser.__configureProtobuf" /> + <keyword name="ProjectProtocolsBrowser.__deleteFile" id="ProjectProtocolsBrowser.__deleteFile" ref="eric6.Project.ProjectProtocolsBrowser.html#ProjectProtocolsBrowser.__deleteFile" /> + <keyword name="ProjectProtocolsBrowser.__getCompilerCommand" id="ProjectProtocolsBrowser.__getCompilerCommand" ref="eric6.Project.ProjectProtocolsBrowser.html#ProjectProtocolsBrowser.__getCompilerCommand" /> + <keyword name="ProjectProtocolsBrowser.__readStderr" id="ProjectProtocolsBrowser.__readStderr" ref="eric6.Project.ProjectProtocolsBrowser.html#ProjectProtocolsBrowser.__readStderr" /> + <keyword name="ProjectProtocolsBrowser.__readStdout" id="ProjectProtocolsBrowser.__readStdout" ref="eric6.Project.ProjectProtocolsBrowser.html#ProjectProtocolsBrowser.__readStdout" /> + <keyword name="ProjectProtocolsBrowser.__showContextMenu" id="ProjectProtocolsBrowser.__showContextMenu" ref="eric6.Project.ProjectProtocolsBrowser.html#ProjectProtocolsBrowser.__showContextMenu" /> + <keyword name="ProjectProtocolsBrowser.__showContextMenuBack" id="ProjectProtocolsBrowser.__showContextMenuBack" ref="eric6.Project.ProjectProtocolsBrowser.html#ProjectProtocolsBrowser.__showContextMenuBack" /> + <keyword name="ProjectProtocolsBrowser.__showContextMenuDir" id="ProjectProtocolsBrowser.__showContextMenuDir" ref="eric6.Project.ProjectProtocolsBrowser.html#ProjectProtocolsBrowser.__showContextMenuDir" /> + <keyword name="ProjectProtocolsBrowser.__showContextMenuDirMulti" id="ProjectProtocolsBrowser.__showContextMenuDirMulti" ref="eric6.Project.ProjectProtocolsBrowser.html#ProjectProtocolsBrowser.__showContextMenuDirMulti" /> + <keyword name="ProjectProtocolsBrowser.__showContextMenuMulti" id="ProjectProtocolsBrowser.__showContextMenuMulti" ref="eric6.Project.ProjectProtocolsBrowser.html#ProjectProtocolsBrowser.__showContextMenuMulti" /> + <keyword name="ProjectProtocolsBrowser._contextMenuRequested" id="ProjectProtocolsBrowser._contextMenuRequested" ref="eric6.Project.ProjectProtocolsBrowser.html#ProjectProtocolsBrowser._contextMenuRequested" /> + <keyword name="ProjectProtocolsBrowser._createPopupMenus" id="ProjectProtocolsBrowser._createPopupMenus" ref="eric6.Project.ProjectProtocolsBrowser.html#ProjectProtocolsBrowser._createPopupMenus" /> + <keyword name="ProjectProtocolsBrowser._openItem" id="ProjectProtocolsBrowser._openItem" ref="eric6.Project.ProjectProtocolsBrowser.html#ProjectProtocolsBrowser._openItem" /> <keyword name="ProjectReader" id="ProjectReader" ref="eric6.E5XML.ProjectReader.html#ProjectReader" /> <keyword name="ProjectReader (Constructor)" id="ProjectReader (Constructor)" ref="eric6.E5XML.ProjectReader.html#ProjectReader.__init__" /> <keyword name="ProjectReader (Module)" id="ProjectReader (Module)" ref="eric6.E5XML.ProjectReader.html" /> @@ -11654,6 +11692,10 @@ <keyword name="PropertiesDialog.on_vcsInfoButton_clicked" id="PropertiesDialog.on_vcsInfoButton_clicked" ref="eric6.Project.PropertiesDialog.html#PropertiesDialog.on_vcsInfoButton_clicked" /> <keyword name="PropertiesDialog.storeData" id="PropertiesDialog.storeData" ref="eric6.MultiProject.PropertiesDialog.html#PropertiesDialog.storeData" /> <keyword name="PropertiesDialog.storeData" id="PropertiesDialog.storeData" ref="eric6.Project.PropertiesDialog.html#PropertiesDialog.storeData" /> + <keyword name="ProtobufPage" id="ProtobufPage" ref="eric6.Preferences.ConfigurationPages.ProtobufPage.html#ProtobufPage" /> + <keyword name="ProtobufPage (Constructor)" id="ProtobufPage (Constructor)" ref="eric6.Preferences.ConfigurationPages.ProtobufPage.html#ProtobufPage.__init__" /> + <keyword name="ProtobufPage (Module)" id="ProtobufPage (Module)" ref="eric6.Preferences.ConfigurationPages.ProtobufPage.html" /> + <keyword name="ProtobufPage.save" id="ProtobufPage.save" ref="eric6.Preferences.ConfigurationPages.ProtobufPage.html#ProtobufPage.save" /> <keyword name="Publics" id="Publics" ref="eric6.Utilities.ClassBrowsers.pyclbr.html#Publics" /> <keyword name="Publics (Constructor)" id="Publics (Constructor)" ref="eric6.Utilities.ClassBrowsers.pyclbr.html#Publics.__init__" /> <keyword name="Purge" id="Purge" ref="eric6.Plugins.VcsPlugins.vcsMercurial.PurgeExtension.purge.html#Purge" /> @@ -12583,6 +12625,10 @@ <keyword name="SendRefererWhitelistDialog.accept" id="SendRefererWhitelistDialog.accept" ref="eric6.WebBrowser.Network.SendRefererWhitelistDialog.html#SendRefererWhitelistDialog.accept" /> <keyword name="SendRefererWhitelistDialog.on_addButton_clicked" id="SendRefererWhitelistDialog.on_addButton_clicked" ref="eric6.Helpviewer.Network.SendRefererWhitelistDialog.html#SendRefererWhitelistDialog.on_addButton_clicked" /> <keyword name="SendRefererWhitelistDialog.on_addButton_clicked" id="SendRefererWhitelistDialog.on_addButton_clicked" ref="eric6.WebBrowser.Network.SendRefererWhitelistDialog.html#SendRefererWhitelistDialog.on_addButton_clicked" /> + <keyword name="Service" id="Service" ref="eric6.Utilities.ClassBrowsers.protoclbr.html#Service" /> + <keyword name="Service (Constructor)" id="Service (Constructor)" ref="eric6.Utilities.ClassBrowsers.protoclbr.html#Service.__init__" /> + <keyword name="ServiceMethod" id="ServiceMethod" ref="eric6.Utilities.ClassBrowsers.protoclbr.html#ServiceMethod" /> + <keyword name="ServiceMethod (Constructor)" id="ServiceMethod (Constructor)" ref="eric6.Utilities.ClassBrowsers.protoclbr.html#ServiceMethod.__init__" /> <keyword name="Session (Package)" id="Session (Package)" ref="index-eric6.WebBrowser.Session.html" /> <keyword name="SessionManager" id="SessionManager" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager" /> <keyword name="SessionManager (Constructor)" id="SessionManager (Constructor)" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.__init__" /> @@ -15910,10 +15956,12 @@ <keyword name="VisibilityBase.setPublic" id="VisibilityBase.setPublic" ref="eric6.Utilities.ModuleParser.html#VisibilityBase.setPublic" /> <keyword name="VisibilityMixin" id="VisibilityMixin" ref="eric6.Utilities.ClassBrowsers.idlclbr.html#VisibilityMixin" /> <keyword name="VisibilityMixin" id="VisibilityMixin" ref="eric6.Utilities.ClassBrowsers.jsclbr.html#VisibilityMixin" /> + <keyword name="VisibilityMixin" id="VisibilityMixin" ref="eric6.Utilities.ClassBrowsers.protoclbr.html#VisibilityMixin" /> <keyword name="VisibilityMixin" id="VisibilityMixin" ref="eric6.Utilities.ClassBrowsers.pyclbr.html#VisibilityMixin" /> <keyword name="VisibilityMixin" id="VisibilityMixin" ref="eric6.Utilities.ClassBrowsers.rbclbr.html#VisibilityMixin" /> <keyword name="VisibilityMixin (Constructor)" id="VisibilityMixin (Constructor)" ref="eric6.Utilities.ClassBrowsers.idlclbr.html#VisibilityMixin.__init__" /> <keyword name="VisibilityMixin (Constructor)" id="VisibilityMixin (Constructor)" ref="eric6.Utilities.ClassBrowsers.jsclbr.html#VisibilityMixin.__init__" /> + <keyword name="VisibilityMixin (Constructor)" id="VisibilityMixin (Constructor)" ref="eric6.Utilities.ClassBrowsers.protoclbr.html#VisibilityMixin.__init__" /> <keyword name="VisibilityMixin (Constructor)" id="VisibilityMixin (Constructor)" ref="eric6.Utilities.ClassBrowsers.pyclbr.html#VisibilityMixin.__init__" /> <keyword name="VisibilityMixin (Constructor)" id="VisibilityMixin (Constructor)" ref="eric6.Utilities.ClassBrowsers.rbclbr.html#VisibilityMixin.__init__" /> <keyword name="Visitor" id="Visitor" ref="eric6.Utilities.ClassBrowsers.jsclbr.html#Visitor" /> @@ -16871,6 +16919,7 @@ <keyword name="create" id="create" ref="eric6.Preferences.ConfigurationPages.PrinterPage.html#create" /> <keyword name="create" id="create" ref="eric6.Preferences.ConfigurationPages.ProjectBrowserPage.html#create" /> <keyword name="create" id="create" ref="eric6.Preferences.ConfigurationPages.ProjectPage.html#create" /> + <keyword name="create" id="create" ref="eric6.Preferences.ConfigurationPages.ProtobufPage.html#create" /> <keyword name="create" id="create" ref="eric6.Preferences.ConfigurationPages.PythonPage.html#create" /> <keyword name="create" id="create" ref="eric6.Preferences.ConfigurationPages.QtPage.html#create" /> <keyword name="create" id="create" ref="eric6.Preferences.ConfigurationPages.SecurityPage.html#create" /> @@ -17112,6 +17161,7 @@ <keyword name="getProject" id="getProject" ref="eric6.Preferences.__init__.html#getProject" /> <keyword name="getProjectBrowserColour" id="getProjectBrowserColour" ref="eric6.Preferences.__init__.html#getProjectBrowserColour" /> <keyword name="getProjectBrowserFlags" id="getProjectBrowserFlags" ref="eric6.Preferences.__init__.html#getProjectBrowserFlags" /> + <keyword name="getProtobuf" id="getProtobuf" ref="eric6.Preferences.__init__.html#getProtobuf" /> <keyword name="getPyQt5ModulesDirectory" id="getPyQt5ModulesDirectory" ref="eric6.Globals.__init__.html#getPyQt5ModulesDirectory" /> <keyword name="getPyQtToolsPath" id="getPyQtToolsPath" ref="eric6.Globals.__init__.html#getPyQtToolsPath" /> <keyword name="getPython" id="getPython" ref="eric6.Preferences.__init__.html#getPython" /> @@ -17327,6 +17377,7 @@ <keyword name="printerr" id="printerr" ref="eric6.DebugClients.Python.DebugBase.html#printerr" /> <keyword name="process_options" id="process_options" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.pycodestyle.html#process_options" /> <keyword name="process_tokens" id="process_tokens" ref="eric6.Plugins.CheckerPlugins.Tabnanny.Tabnanny.html#process_tokens" /> + <keyword name="protoclbr (Module)" id="protoclbr (Module)" ref="eric6.Utilities.ClassBrowsers.protoclbr.html" /> <keyword name="proxyAuthenticationRequired" id="proxyAuthenticationRequired" ref="eric6.E5Network.E5NetworkProxyFactory.html#proxyAuthenticationRequired" /> <keyword name="purge (Module)" id="purge (Module)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.PurgeExtension.purge.html" /> <keyword name="pushView" id="pushView" ref="eric6.WebBrowser.WebInspector.html#pushView" /> @@ -17368,6 +17419,7 @@ <keyword name="readmodule" id="readmodule" ref="eric6.Utilities.ClassBrowsers.__init__.html#readmodule" /> <keyword name="readmodule_ex" id="readmodule_ex" ref="eric6.Utilities.ClassBrowsers.idlclbr.html#readmodule_ex" /> <keyword name="readmodule_ex" id="readmodule_ex" ref="eric6.Utilities.ClassBrowsers.jsclbr.html#readmodule_ex" /> + <keyword name="readmodule_ex" id="readmodule_ex" ref="eric6.Utilities.ClassBrowsers.protoclbr.html#readmodule_ex" /> <keyword name="readmodule_ex" id="readmodule_ex" ref="eric6.Utilities.ClassBrowsers.pyclbr.html#readmodule_ex" /> <keyword name="readmodule_ex" id="readmodule_ex" ref="eric6.Utilities.ClassBrowsers.rbclbr.html#readmodule_ex" /> <keyword name="rebase (Module)" id="rebase (Module)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.RebaseExtension.rebase.html" /> @@ -17433,6 +17485,7 @@ <keyword name="setProjectBrowserColour" id="setProjectBrowserColour" ref="eric6.Preferences.__init__.html#setProjectBrowserColour" /> <keyword name="setProjectBrowserFlags" id="setProjectBrowserFlags" ref="eric6.Preferences.__init__.html#setProjectBrowserFlags" /> <keyword name="setProjectBrowserFlagsDefault" id="setProjectBrowserFlagsDefault" ref="eric6.Preferences.__init__.html#setProjectBrowserFlagsDefault" /> + <keyword name="setProtobuf" id="setProtobuf" ref="eric6.Preferences.__init__.html#setProtobuf" /> <keyword name="setPython" id="setPython" ref="eric6.Preferences.__init__.html#setPython" /> <keyword name="setQt" id="setQt" ref="eric6.Preferences.__init__.html#setQt" /> <keyword name="setRecursionLimit" id="setRecursionLimit" ref="eric6.DebugClients.Python.DebugBase.html#setRecursionLimit" /> @@ -18182,6 +18235,7 @@ <file>eric6.Preferences.ConfigurationPages.PrinterPage.html</file> <file>eric6.Preferences.ConfigurationPages.ProjectBrowserPage.html</file> <file>eric6.Preferences.ConfigurationPages.ProjectPage.html</file> + <file>eric6.Preferences.ConfigurationPages.ProtobufPage.html</file> <file>eric6.Preferences.ConfigurationPages.PythonPage.html</file> <file>eric6.Preferences.ConfigurationPages.QtPage.html</file> <file>eric6.Preferences.ConfigurationPages.SecurityPage.html</file> @@ -18223,6 +18277,7 @@ <file>eric6.Project.ProjectFormsBrowser.html</file> <file>eric6.Project.ProjectInterfacesBrowser.html</file> <file>eric6.Project.ProjectOthersBrowser.html</file> + <file>eric6.Project.ProjectProtocolsBrowser.html</file> <file>eric6.Project.ProjectResourcesBrowser.html</file> <file>eric6.Project.ProjectSourcesBrowser.html</file> <file>eric6.Project.ProjectTranslationsBrowser.html</file> @@ -18369,6 +18424,7 @@ <file>eric6.Utilities.ClassBrowsers.__init__.html</file> <file>eric6.Utilities.ClassBrowsers.idlclbr.html</file> <file>eric6.Utilities.ClassBrowsers.jsclbr.html</file> + <file>eric6.Utilities.ClassBrowsers.protoclbr.html</file> <file>eric6.Utilities.ClassBrowsers.pyclbr.html</file> <file>eric6.Utilities.ClassBrowsers.rbclbr.html</file> <file>eric6.Utilities.FtpUtilities.html</file>
--- a/Documentation/Source/eric6.DebugClients.Python.AsyncFile.html Sun Nov 19 13:06:01 2017 +0100 +++ b/Documentation/Source/eric6.DebugClients.Python.AsyncFile.html Sat Dec 02 12:40:22 2017 +0100 @@ -85,6 +85,9 @@ <td><a href="#AsyncFile.read">read</a></td> <td>Public method to read bytes from this file.</td> </tr><tr> +<td><a href="#AsyncFile.readCommand">readCommand</a></td> +<td>Public method to read a length prefixed command string.</td> +</tr><tr> <td><a href="#AsyncFile.read_p">read_p</a></td> <td>Public method to read bytes from this file.</td> </tr><tr> @@ -243,6 +246,21 @@ <dd> str </dd> +</dl><a NAME="AsyncFile.readCommand" ID="AsyncFile.readCommand"></a> +<h4>AsyncFile.readCommand</h4> +<b>readCommand</b>(<i></i>) +<p> + Public method to read a length prefixed command string. +</p><dl> +<dt>Returns:</dt> +<dd> +command string +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +str +</dd> </dl><a NAME="AsyncFile.read_p" ID="AsyncFile.read_p"></a> <h4>AsyncFile.read_p</h4> <b>read_p</b>(<i>size=-1</i>)
--- a/Documentation/Source/eric6.DebugClients.Python.DebugClientBase.html Sun Nov 19 13:06:01 2017 +0100 +++ b/Documentation/Source/eric6.DebugClients.Python.DebugClientBase.html Sat Dec 02 12:40:22 2017 +0100 @@ -167,9 +167,6 @@ <td><a href="#DebugClientBase.handleJsonCommand">handleJsonCommand</a></td> <td>Public method to handle a command serialized as a JSON string.</td> </tr><tr> -<td><a href="#DebugClientBase.handleLine">handleLine</a></td> -<td>Public method to handle the receipt of a complete line.</td> -</tr><tr> <td><a href="#DebugClientBase.input">input</a></td> <td>Public method to implement input() (Python 2) using the event loop.</td> </tr><tr> @@ -274,43 +271,48 @@ </dd> </dl><a NAME="DebugClientBase.__dumpVariable" ID="DebugClientBase.__dumpVariable"></a> <h4>DebugClientBase.__dumpVariable</h4> -<b>__dumpVariable</b>(<i>var, frmnr, scope, filterList</i>) +<b>__dumpVariable</b>(<i>var, frmnr, scope, filterList, maxSize</i>) <p> Private method to return the variables of a frame to the debug server. </p><dl> -<dt><i>var</i></dt> +<dt><i>var</i> (list of strings)</dt> <dd> list encoded name of the requested variable - (list of strings) -</dd><dt><i>frmnr</i></dt> +</dd><dt><i>frmnr</i> (int)</dt> <dd> distance of frame reported on. 0 is the current frame - (int) </dd><dt><i>scope</i></dt> <dd> 1 to report global variables, 0 for local variables (int) -</dd><dt><i>filterList</i></dt> +</dd><dt><i>filterList</i> (list of int)</dt> <dd> the indices of variable types to be filtered - (list of int) +</dd><dt><i>maxSize</i> (int)</dt> +<dd> +maximum size the formatted value of a variable will + be shown. If it is bigger than that, a 'too big' indication will + be given. </dd> </dl><a NAME="DebugClientBase.__dumpVariables" ID="DebugClientBase.__dumpVariables"></a> <h4>DebugClientBase.__dumpVariables</h4> -<b>__dumpVariables</b>(<i>frmnr, scope, filterList</i>) +<b>__dumpVariables</b>(<i>frmnr, scope, filterList, maxSize</i>) <p> Private method to return the variables of a frame to the debug server. </p><dl> -<dt><i>frmnr</i></dt> +<dt><i>frmnr</i> (int)</dt> <dd> distance of frame reported on. 0 is the current frame - (int) -</dd><dt><i>scope</i></dt> +</dd><dt><i>scope</i> (int)</dt> <dd> -1 to report global variables, 0 for local variables (int) -</dd><dt><i>filterList</i></dt> +1 to report global variables, 0 for local variables +</dd><dt><i>filterList</i> (list of int)</dt> <dd> the indices of variable types to be filtered - (list of int) +</dd><dt><i>maxSize</i> (int)</dt> +<dd> +maximum size the formatted value of a variable will + be shown. If it is bigger than that, a 'too big' indication will + be given. </dd> </dl><a NAME="DebugClientBase.__extractIndicators" ID="DebugClientBase.__extractIndicators"></a> <h4>DebugClientBase.__extractIndicators</h4> @@ -355,7 +357,7 @@ </dd> </dl><a NAME="DebugClientBase.__formatVariablesList" ID="DebugClientBase.__formatVariablesList"></a> <h4>DebugClientBase.__formatVariablesList</h4> -<b>__formatVariablesList</b>(<i>keylist, dict_, scope, filterList=None, formatSequences=False</i>) +<b>__formatVariablesList</b>(<i>keylist, dict_, scope, filterList=None, formatSequences=False, maxSize=0</i>) <p> Private method to produce a formated variables list. </p><p> @@ -365,28 +367,33 @@ expressions. The formated variables list (a list of tuples of 3 values) is returned. </p><dl> -<dt><i>keylist</i></dt> +<dt><i>keylist</i> (list of str)</dt> <dd> -keys of the dictionary -</dd><dt><i>dict_</i></dt> +keys of the dictionary to be formatted +</dd><dt><i>dict_</i> (dict)</dt> <dd> the dictionary to be scanned -</dd><dt><i>scope</i></dt> +</dd><dt><i>scope</i> (int)</dt> <dd> 1 to filter using the globals filter, 0 using the locals - filter (int). + filter. Variables are only added to the list, if their name do not match any of the filter expressions. -</dd><dt><i>filterList</i></dt> +</dd><dt><i>filterList</i> (list of int)</dt> <dd> the indices of variable types to be filtered. Variables are only added to the list, if their type is not contained in the filter list. -</dd><dt><i>formatSequences</i></dt> +</dd><dt><i>formatSequences</i> (bool)</dt> <dd> flag indicating, that sequence or dictionary variables should be formatted. If it is 0 (or false), just the - number of items contained in these variables is returned. (boolean) + number of items contained in these variables is returned. +</dd><dt><i>maxSize</i> (int)</dt> +<dd> +maximum size the formatted value of a variable will + be shown. If it is bigger than that, a 'too big' indication will + be placed in the value field. </dd> </dl><dl> <dt>Returns:</dt> @@ -395,6 +402,11 @@ variable entry is a tuple of three elements, the variable name, its type and value. </dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +list of tuple of (str, str, str) +</dd> </dl><a NAME="DebugClientBase.__generateFilterObjects" ID="DebugClientBase.__generateFilterObjects"></a> <h4>DebugClientBase.__generateFilterObjects</h4> <b>__generateFilterObjects</b>(<i>scope, filterString</i>) @@ -615,19 +627,6 @@ <dd> string containing the command received from the IDE </dd> -</dl><a NAME="DebugClientBase.handleLine" ID="DebugClientBase.handleLine"></a> -<h4>DebugClientBase.handleLine</h4> -<b>handleLine</b>(<i>line</i>) -<p> - Public method to handle the receipt of a complete line. -</p><p> - It first looks for a valid protocol token at the start of the line. - Thereafter it trys to execute the lines accumulated so far. -</p><dl> -<dt><i>line</i></dt> -<dd> -the received line -</dd> </dl><a NAME="DebugClientBase.input" ID="DebugClientBase.input"></a> <h4>DebugClientBase.input</h4> <b>input</b>(<i>prompt</i>)
--- a/Documentation/Source/eric6.Debugger.DebuggerInterfaceNone.html Sun Nov 19 13:06:01 2017 +0100 +++ b/Documentation/Source/eric6.Debugger.DebuggerInterfaceNone.html Sat Dec 02 12:40:22 2017 +0100 @@ -315,38 +315,48 @@ </dd> </dl><a NAME="DebuggerInterfaceNone.remoteClientVariable" ID="DebuggerInterfaceNone.remoteClientVariable"></a> <h4>DebuggerInterfaceNone.remoteClientVariable</h4> -<b>remoteClientVariable</b>(<i>scope, filterList, var, framenr=0</i>) +<b>remoteClientVariable</b>(<i>scope, filterList, var, framenr=0, maxSize=0</i>) <p> Public method to request the variables of the debugged program. </p><dl> -<dt><i>scope</i></dt> +<dt><i>scope</i> (int)</dt> <dd> the scope of the variables (0 = local, 1 = global) -</dd><dt><i>filterList</i></dt> +</dd><dt><i>filterList</i> (list of int)</dt> <dd> -list of variable types to filter out (list of int) -</dd><dt><i>var</i></dt> +list of variable types to filter out +</dd><dt><i>var</i> (list of str)</dt> <dd> -list encoded name of variable to retrieve (string) -</dd><dt><i>framenr</i></dt> +list encoded name of variable to retrieve +</dd><dt><i>framenr</i> (int)</dt> <dd> framenumber of the variables to retrieve (int) +</dd><dt><i>maxSize</i> (int)</dt> +<dd> +maximum size the formatted value of a variable will + be shown. If it is bigger than that, a 'too big' indication will + be given (@@TOO_BIG_TO_SHOW@@). </dd> </dl><a NAME="DebuggerInterfaceNone.remoteClientVariables" ID="DebuggerInterfaceNone.remoteClientVariables"></a> <h4>DebuggerInterfaceNone.remoteClientVariables</h4> -<b>remoteClientVariables</b>(<i>scope, filterList, framenr=0</i>) +<b>remoteClientVariables</b>(<i>scope, filterList, framenr=0, maxSize=0</i>) <p> Public method to request the variables of the debugged program. </p><dl> -<dt><i>scope</i></dt> +<dt><i>scope</i> (int)</dt> <dd> the scope of the variables (0 = local, 1 = global) -</dd><dt><i>filterList</i></dt> +</dd><dt><i>filterList</i> (list of int)</dt> +<dd> +list of variable types to filter out +</dd><dt><i>framenr</i> (int)</dt> <dd> -list of variable types to filter out (list of int) -</dd><dt><i>framenr</i></dt> +framenumber of the variables to retrieve +</dd><dt><i>maxSize</i> (int)</dt> <dd> -framenumber of the variables to retrieve (int) +maximum size the formatted value of a variable will + be shown. If it is bigger than that, a 'too big' indication will + be given (@@TOO_BIG_TO_SHOW@@). </dd> </dl><a NAME="DebuggerInterfaceNone.remoteCompletion" ID="DebuggerInterfaceNone.remoteCompletion"></a> <h4>DebuggerInterfaceNone.remoteCompletion</h4>
--- a/Documentation/Source/eric6.Debugger.DebuggerInterfacePython.html Sun Nov 19 13:06:01 2017 +0100 +++ b/Documentation/Source/eric6.Debugger.DebuggerInterfacePython.html Sat Dec 02 12:40:22 2017 +0100 @@ -91,6 +91,9 @@ <td><a href="#DebuggerInterfacePython.__startProcess">__startProcess</a></td> <td>Private method to start the debugger client process.</td> </tr><tr> +<td><a href="#DebuggerInterfacePython.__writeJsonCommandToSocket">__writeJsonCommandToSocket</a></td> +<td>Private method to write a JSON command to the socket.</td> +</tr><tr> <td><a href="#DebuggerInterfacePython.flush">flush</a></td> <td>Public slot to flush the queue.</td> </tr><tr> @@ -321,6 +324,16 @@ <dd> the process object (QProcess) or None </dd> +</dl><a NAME="DebuggerInterfacePython.__writeJsonCommandToSocket" ID="DebuggerInterfacePython.__writeJsonCommandToSocket"></a> +<h4>DebuggerInterfacePython.__writeJsonCommandToSocket</h4> +<b>__writeJsonCommandToSocket</b>(<i>cmd</i>) +<p> + Private method to write a JSON command to the socket. +</p><dl> +<dt><i>cmd</i> (str)</dt> +<dd> +JSON command to be sent +</dd> </dl><a NAME="DebuggerInterfacePython.flush" ID="DebuggerInterfacePython.flush"></a> <h4>DebuggerInterfacePython.flush</h4> <b>flush</b>(<i></i>) @@ -443,38 +456,48 @@ </dd> </dl><a NAME="DebuggerInterfacePython.remoteClientVariable" ID="DebuggerInterfacePython.remoteClientVariable"></a> <h4>DebuggerInterfacePython.remoteClientVariable</h4> -<b>remoteClientVariable</b>(<i>scope, filterList, var, framenr=0</i>) +<b>remoteClientVariable</b>(<i>scope, filterList, var, framenr=0, maxSize=0</i>) <p> Public method to request the variables of the debugged program. </p><dl> -<dt><i>scope</i></dt> +<dt><i>scope</i> (int)</dt> <dd> the scope of the variables (0 = local, 1 = global) -</dd><dt><i>filterList</i></dt> +</dd><dt><i>filterList</i> (list of int)</dt> <dd> -list of variable types to filter out (list of int) -</dd><dt><i>var</i></dt> +list of variable types to filter out +</dd><dt><i>var</i> (list of str)</dt> <dd> -list encoded name of variable to retrieve (string) -</dd><dt><i>framenr</i></dt> +list encoded name of variable to retrieve +</dd><dt><i>framenr</i> (int)</dt> <dd> -framenumber of the variables to retrieve (int) +framenumber of the variables to retrieve +</dd><dt><i>maxSize</i> (int)</dt> +<dd> +maximum size the formatted value of a variable will + be shown. If it is bigger than that, a 'too big' indication will + be given (@@TOO_BIG_TO_SHOW@@). </dd> </dl><a NAME="DebuggerInterfacePython.remoteClientVariables" ID="DebuggerInterfacePython.remoteClientVariables"></a> <h4>DebuggerInterfacePython.remoteClientVariables</h4> -<b>remoteClientVariables</b>(<i>scope, filterList, framenr=0</i>) +<b>remoteClientVariables</b>(<i>scope, filterList, framenr=0, maxSize=0</i>) <p> Public method to request the variables of the debugged program. </p><dl> -<dt><i>scope</i></dt> +<dt><i>scope</i> (int)</dt> <dd> the scope of the variables (0 = local, 1 = global) -</dd><dt><i>filterList</i></dt> +</dd><dt><i>filterList</i> (list of int)</dt> +<dd> +list of variable types to filter out +</dd><dt><i>framenr</i> (int)</dt> <dd> -list of variable types to filter out (list of int) -</dd><dt><i>framenr</i></dt> +framenumber of the variables to retrieve +</dd><dt><i>maxSize</i> (int)</dt> <dd> -framenumber of the variables to retrieve (int) +maximum size the formatted value of a variable will + be shown. If it is bigger than that, a 'too big' indication will + be given (@@TOO_BIG_TO_SHOW@@). </dd> </dl><a NAME="DebuggerInterfacePython.remoteCompletion" ID="DebuggerInterfacePython.remoteCompletion"></a> <h4>DebuggerInterfacePython.remoteCompletion</h4>
--- a/Documentation/Source/eric6.E5Gui.E5TextEditSearchWidget.html Sun Nov 19 13:06:01 2017 +0100 +++ b/Documentation/Source/eric6.E5Gui.E5TextEditSearchWidget.html Sat Dec 02 12:40:22 2017 +0100 @@ -45,7 +45,7 @@ Class implementing a horizontal search widget for QTextEdit. </p> <h3>Derived from</h3> -QWidget, Ui_E5TextEditSearchWidget +QWidget <h3>Class Attributes</h3> <table> <tr><td>None</td></tr> @@ -84,6 +84,9 @@ <td><a href="#E5TextEditSearchWidget.__setSearchButtons">__setSearchButtons</a></td> <td>Private slot to set the state of the search buttons.</td> </tr><tr> +<td><a href="#E5TextEditSearchWidget.__setupUi">__setupUi</a></td> +<td>Private method to generate the UI.</td> +</tr><tr> <td><a href="#E5TextEditSearchWidget.attachTextEdit">attachTextEdit</a></td> <td>Public method to attach a QTextEdit widget.</td> </tr><tr> @@ -106,13 +109,18 @@ </table> <a NAME="E5TextEditSearchWidget.__init__" ID="E5TextEditSearchWidget.__init__"></a> <h4>E5TextEditSearchWidget (Constructor)</h4> -<b>E5TextEditSearchWidget</b>(<i>parent=None</i>) +<b>E5TextEditSearchWidget</b>(<i>parent=None, widthForHeight=True</i>) <p> Constructor </p><dl> -<dt><i>parent</i></dt> +<dt><i>parent</i> (QWidget)</dt> <dd> -reference to the parent widget (QWidget) +reference to the parent widget +</dd><dt><i>widthForHeight</i> (bool)</dt> +<dd> +flag indicating to prefer width for height. + If this parameter is False, some widgets are shown in a third + line. </dd> </dl><a NAME="E5TextEditSearchWidget.__find" ID="E5TextEditSearchWidget.__find"></a> <h4>E5TextEditSearchWidget.__find</h4> @@ -214,6 +222,16 @@ <dd> flag indicating the state (boolean) </dd> +</dl><a NAME="E5TextEditSearchWidget.__setupUi" ID="E5TextEditSearchWidget.__setupUi"></a> +<h4>E5TextEditSearchWidget.__setupUi</h4> +<b>__setupUi</b>(<i>widthForHeight</i>) +<p> + Private method to generate the UI. +</p><dl> +<dt><i>widthForHeight</i> (bool)</dt> +<dd> +flag indicating to prefer width for height +</dd> </dl><a NAME="E5TextEditSearchWidget.attachTextEdit" ID="E5TextEditSearchWidget.attachTextEdit"></a> <h4>E5TextEditSearchWidget.attachTextEdit</h4> <b>attachTextEdit</b>(<i>textedit, editType="QTextEdit"</i>)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Documentation/Source/eric6.Preferences.ConfigurationPages.ProtobufPage.html Sat Dec 02 12:40:22 2017 +0100 @@ -0,0 +1,105 @@ +<!DOCTYPE html> +<html><head> +<title>eric6.Preferences.ConfigurationPages.ProtobufPage</title> +<meta charset="UTF-8"> +<style> +body { + background: #EDECE6; + margin: 0em 1em 10em 1em; + color: black; +} + +h1 { color: white; background: #85774A; } +h2 { color: white; background: #85774A; } +h3 { color: white; background: #9D936E; } +h4 { color: white; background: #9D936E; } + +a { color: #BA6D36; } + +</style> +</head> +<body><a NAME="top" ID="top"></a> +<h1>eric6.Preferences.ConfigurationPages.ProtobufPage</h1> +<p> +Module implementing the protobuf configuration page. +</p> +<h3>Global Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Classes</h3> +<table> +<tr> +<td><a href="#ProtobufPage">ProtobufPage</a></td> +<td>Class implementing the protobuf configuration page.</td> +</tr> +</table> +<h3>Functions</h3> +<table> +<tr> +<td><a href="#create">create</a></td> +<td>Module function to create the configuration page.</td> +</tr> +</table> +<hr /><hr /> +<a NAME="ProtobufPage" ID="ProtobufPage"></a> +<h2>ProtobufPage</h2> +<p> + Class implementing the protobuf configuration page. +</p> +<h3>Derived from</h3> +ConfigurationPageBase, Ui_ProtobufPage +<h3>Class Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Class Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Methods</h3> +<table> +<tr> +<td><a href="#ProtobufPage.__init__">ProtobufPage</a></td> +<td>Constructor</td> +</tr><tr> +<td><a href="#ProtobufPage.save">save</a></td> +<td>Public slot to save the protobuf configuration.</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="ProtobufPage.__init__" ID="ProtobufPage.__init__"></a> +<h4>ProtobufPage (Constructor)</h4> +<b>ProtobufPage</b>(<i></i>) +<p> + Constructor +</p><a NAME="ProtobufPage.save" ID="ProtobufPage.save"></a> +<h4>ProtobufPage.save</h4> +<b>save</b>(<i></i>) +<p> + Public slot to save the protobuf configuration. +</p> +<div align="right"><a href="#top">Up</a></div> +<hr /><hr /> +<a NAME="create" ID="create"></a> +<h2>create</h2> +<b>create</b>(<i>dlg</i>) +<p> + Module function to create the configuration page. +</p><dl> +<dt><i>dlg</i></dt> +<dd> +reference to the configuration dialog +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +reference to the instantiated page (ConfigurationPageBase) +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /> +</body></html> \ No newline at end of file
--- a/Documentation/Source/eric6.Preferences.ProgramsDialog.html Sun Nov 19 13:06:01 2017 +0100 +++ b/Documentation/Source/eric6.Preferences.ProgramsDialog.html Sat Dec 02 12:40:22 2017 +0100 @@ -108,7 +108,7 @@ </dd> </dl><a NAME="ProgramsDialog.__createProgramEntry" ID="ProgramsDialog.__createProgramEntry"></a> <h4>ProgramsDialog.__createProgramEntry</h4> -<b>__createProgramEntry</b>(<i>description, exe, versionCommand="", versionStartsWith="", versionPosition=0, version="", versionCleanup=None, versionRe=None</i>) +<b>__createProgramEntry</b>(<i>description, exe, versionCommand="", versionStartsWith="", versionPosition=0, version="", versionCleanup=None, versionRe=None, exeModule=None</i>) <p> Private method to generate a program entry. </p><dl> @@ -121,7 +121,7 @@ </dd><dt><i>versionCommand</i></dt> <dd> command line switch to get the version info - (string) if this is empty, the given version will be shown. + (str). If this is empty, the given version will be shown. </dd><dt><i>versionStartsWith</i></dt> <dd> start of line identifying version info @@ -141,6 +141,11 @@ <dd> regexp to determine the line identifying version info (string). Takes precedence over versionStartsWith. +</dd><dt><i>exeModule=</i></dt> +<dd> +list of command line parameters to execute a module + with the program given in exe (e.g. to execute a Python module) + (list of str) </dd> </dl><dl> <dt>Returns:</dt>
--- a/Documentation/Source/eric6.Preferences.__init__.html Sun Nov 19 13:06:01 2017 +0100 +++ b/Documentation/Source/eric6.Preferences.__init__.html Sat Dec 02 12:40:22 2017 +0100 @@ -56,7 +56,7 @@ <td>Module function to retrieve the various Cooperation settings.</td> </tr><tr> <td><a href="#getCorba">getCorba</a></td> -<td>Module function to retrieve the various corba settings.</td> +<td>Module function to retrieve the various Corba settings.</td> </tr><tr> <td><a href="#getDebugger">getDebugger</a></td> <td>Module function to retrieve the debugger settings.</td> @@ -136,6 +136,9 @@ <td><a href="#getProjectBrowserFlags">getProjectBrowserFlags</a></td> <td>Module function to retrieve the various project browser flags settings.</td> </tr><tr> +<td><a href="#getProtobuf">getProtobuf</a></td> +<td>Module function to retrieve the various protobuf settings.</td> +</tr><tr> <td><a href="#getPython">getPython</a></td> <td>Module function to retrieve the Python settings.</td> </tr><tr> @@ -221,7 +224,7 @@ <td>Module function to store the various Cooperation settings.</td> </tr><tr> <td><a href="#setCorba">setCorba</a></td> -<td>Module function to store the various corba settings.</td> +<td>Module function to store the various Corba settings.</td> </tr><tr> <td><a href="#setDebugger">setDebugger</a></td> <td>Module function to store the debugger settings.</td> @@ -301,6 +304,9 @@ <td><a href="#setProjectBrowserFlagsDefault">setProjectBrowserFlagsDefault</a></td> <td>Module function to store the various project browser flags settings.</td> </tr><tr> +<td><a href="#setProtobuf">setProtobuf</a></td> +<td>Module function to store the various protobuf settings.</td> +</tr><tr> <td><a href="#setPython">setPython</a></td> <td>Module function to store the Python settings.</td> </tr><tr> @@ -375,7 +381,7 @@ object <h3>Class Attributes</h3> <table> -<tr><td>cooperationDefaults</td></tr><tr><td>corbaDefaults</td></tr><tr><td>debuggerDefaults</td></tr><tr><td>diffColourDefaults</td></tr><tr><td>docuViewerDefaults</td></tr><tr><td>editorColourDefaults</td></tr><tr><td>editorDefaults</td></tr><tr><td>editorExporterDefaults</td></tr><tr><td>editorOtherFontsDefaults</td></tr><tr><td>editorTypingDefaults</td></tr><tr><td>geometryDefaults</td></tr><tr><td>graphicsDefaults</td></tr><tr><td>helpDefaults</td></tr><tr><td>hexEditorDefaults</td></tr><tr><td>iconEditorDefaults</td></tr><tr><td>iconsDefaults</td></tr><tr><td>ircDefaults</td></tr><tr><td>multiProjectDefaults</td></tr><tr><td>pluginManagerDefaults</td></tr><tr><td>printerDefaults</td></tr><tr><td>projectBrowserColourDefaults</td></tr><tr><td>projectBrowserFlagsDefaults</td></tr><tr><td>projectDefaults</td></tr><tr><td>pyflakesDefaults</td></tr><tr><td>qtDefaults</td></tr><tr><td>resetLayout</td></tr><tr><td>shellDefaults</td></tr><tr><td>sysDefaults</td></tr><tr><td>tasksDefaults</td></tr><tr><td>templatesDefaults</td></tr><tr><td>trayStarterDefaults</td></tr><tr><td>uiDefaults</td></tr><tr><td>userDefaults</td></tr><tr><td>varDefaults</td></tr><tr><td>vcsDefaults</td></tr><tr><td>webBrowserDefaults</td></tr><tr><td>webEngineSettingsIntitialized</td></tr><tr><td>webSettingsIntitialized</td></tr> +<tr><td>cooperationDefaults</td></tr><tr><td>corbaDefaults</td></tr><tr><td>debuggerDefaults</td></tr><tr><td>diffColourDefaults</td></tr><tr><td>docuViewerDefaults</td></tr><tr><td>editorColourDefaults</td></tr><tr><td>editorDefaults</td></tr><tr><td>editorExporterDefaults</td></tr><tr><td>editorOtherFontsDefaults</td></tr><tr><td>editorTypingDefaults</td></tr><tr><td>geometryDefaults</td></tr><tr><td>graphicsDefaults</td></tr><tr><td>helpDefaults</td></tr><tr><td>hexEditorDefaults</td></tr><tr><td>iconEditorDefaults</td></tr><tr><td>iconsDefaults</td></tr><tr><td>ircDefaults</td></tr><tr><td>multiProjectDefaults</td></tr><tr><td>pluginManagerDefaults</td></tr><tr><td>printerDefaults</td></tr><tr><td>projectBrowserColourDefaults</td></tr><tr><td>projectBrowserFlagsDefaults</td></tr><tr><td>projectDefaults</td></tr><tr><td>protobufDefaults</td></tr><tr><td>pyflakesDefaults</td></tr><tr><td>qtDefaults</td></tr><tr><td>resetLayout</td></tr><tr><td>shellDefaults</td></tr><tr><td>sysDefaults</td></tr><tr><td>tasksDefaults</td></tr><tr><td>templatesDefaults</td></tr><tr><td>trayStarterDefaults</td></tr><tr><td>uiDefaults</td></tr><tr><td>userDefaults</td></tr><tr><td>varDefaults</td></tr><tr><td>vcsDefaults</td></tr><tr><td>webBrowserDefaults</td></tr><tr><td>webEngineSettingsIntitialized</td></tr><tr><td>webSettingsIntitialized</td></tr> </table> <h3>Class Methods</h3> <table> @@ -465,7 +471,7 @@ <h2>getCorba</h2> <b>getCorba</b>(<i>key, prefClass=Prefs</i>) <p> - Module function to retrieve the various corba settings. + Module function to retrieve the various Corba settings. </p><dl> <dt><i>key</i></dt> <dd> @@ -1036,6 +1042,32 @@ </dl> <div align="right"><a href="#top">Up</a></div> <hr /><hr /> +<a NAME="getProtobuf" ID="getProtobuf"></a> +<h2>getProtobuf</h2> +<b>getProtobuf</b>(<i>key, prefClass=Prefs</i>) +<p> + Module function to retrieve the various protobuf settings. +</p><dl> +<dt><i>key</i> (str)</dt> +<dd> +the key of the value to get +</dd><dt><i>prefClass</i> (Prefs)</dt> +<dd> +preferences class used as the storage area +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +the requested protobuf setting +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +any +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /><hr /> <a NAME="getPython" ID="getPython"></a> <h2>getPython</h2> <b>getPython</b>(<i>key, prefClass=Prefs</i>) @@ -1548,7 +1580,7 @@ <h2>setCorba</h2> <b>setCorba</b>(<i>key, value, prefClass=Prefs</i>) <p> - Module function to store the various corba settings. + Module function to store the various Corba settings. </p><dl> <dt><i>key</i></dt> <dd> @@ -2057,6 +2089,25 @@ </dl> <div align="right"><a href="#top">Up</a></div> <hr /><hr /> +<a NAME="setProtobuf" ID="setProtobuf"></a> +<h2>setProtobuf</h2> +<b>setProtobuf</b>(<i>key, value, prefClass=Prefs</i>) +<p> + Module function to store the various protobuf settings. +</p><dl> +<dt><i>key</i> (str)</dt> +<dd> +the key of the setting to be set +</dd><dt><i>value</i> (any)</dt> +<dd> +the value to be set +</dd><dt><i>prefClass</i> (Prefs)</dt> +<dd> +preferences class used as the storage area +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /><hr /> <a NAME="setPython" ID="setPython"></a> <h2>setPython</h2> <b>setPython</b>(<i>key, value, prefClass=Prefs</i>)
--- a/Documentation/Source/eric6.Project.Project.html Sun Nov 19 13:06:01 2017 +0100 +++ b/Documentation/Source/eric6.Project.Project.html Sat Dec 02 12:40:22 2017 +0100 @@ -139,6 +139,12 @@ <dd> emitted after the project properties were changed +</dd><dt>projectProtocolAdded(str)</dt> +<dd> +emitted after a new proto file was added +</dd><dt>projectProtocolRemoved(str)</dt> +<dd> +emitted after a proto file was removed </dd><dt>projectResourceAdded(str)</dt> <dd> emitted after a new resource file was @@ -380,6 +386,12 @@ <td><a href="#Project.addOthersFiles">addOthersFiles</a></td> <td>Public slot to add files to the OTHERS project data.</td> </tr><tr> +<td><a href="#Project.addProtoDir">addProtoDir</a></td> +<td>Public slot to add all protocol files of a directory to the current project.</td> +</tr><tr> +<td><a href="#Project.addProtoFiles">addProtoFiles</a></td> +<td>Public slot to add protocol files to the current project.</td> +</tr><tr> <td><a href="#Project.addResourceDir">addResourceDir</a></td> <td>Public slot to add all Qt resource files of a directory to the current project.</td> </tr><tr> @@ -608,6 +620,9 @@ <td><a href="#Project.isProjectInterface">isProjectInterface</a></td> <td>Public method used to check, if the passed in filename belongs to the project interfaces.</td> </tr><tr> +<td><a href="#Project.isProjectProtocol">isProjectProtocol</a></td> +<td>Public method used to check, if the passed in filename belongs to the project protocols.</td> +</tr><tr> <td><a href="#Project.isProjectResource">isProjectResource</a></td> <td>Public method used to check, if the passed in filename belongs to the project resources.</td> </tr><tr> @@ -1241,13 +1256,12 @@ <p> Public method used to add all files of a directory to the project. </p><dl> -<dt><i>fileTypeFilter</i></dt> +<dt><i>fileTypeFilter</i> (str out of source, form, resource, interface, protocol, others)</dt> <dd> filter to be used by the add directory dialog - (string out of source, form, resource, interface, others) -</dd><dt><i>startdir</i></dt> +</dd><dt><i>startdir</i> (str)</dt> <dd> -start directory for the selection dialog (string) +start directory for the selection dialog </dd> </dl><a NAME="Project.addE5Actions" ID="Project.addE5Actions"></a> <h4>Project.addE5Actions</h4> @@ -1265,11 +1279,10 @@ <p> Public slot used to add files to the project. </p><dl> -<dt><i>fileTypeFilter</i></dt> +<dt><i>fileTypeFilter</i> (str out of source, form, resource, interface, protocol, others)</dt> <dd> filter to be used by the add file dialog - (string out of source, form, resource, interface, others) -</dd><dt><i>startdir</i></dt> +</dd><dt><i>startdir</i> (str)</dt> <dd> start directory for the selection dialog </dd> @@ -1299,6 +1312,17 @@ <b>addOthersFiles</b>(<i></i>) <p> Public slot to add files to the OTHERS project data. +</p><a NAME="Project.addProtoDir" ID="Project.addProtoDir"></a> +<h4>Project.addProtoDir</h4> +<b>addProtoDir</b>(<i></i>) +<p> + Public slot to add all protocol files of a directory to the current + project. +</p><a NAME="Project.addProtoFiles" ID="Project.addProtoFiles"></a> +<h4>Project.addProtoFiles</h4> +<b>addProtoFiles</b>(<i></i>) +<p> + Public slot to add protocol files to the current project. </p><a NAME="Project.addResourceDir" ID="Project.addResourceDir"></a> <h4>Project.addResourceDir</h4> <b>addResourceDir</b>(<i></i>) @@ -1797,7 +1821,7 @@ <dt><i>fileType</i> (str)</dt> <dd> project file type (one of SOURCES, FORMS, RESOURCES, - INTERFACES, OTHERS, TRANSLATIONS) + INTERFACES, PROTOCOLS, OTHERS, TRANSLATIONS) </dd><dt><i>normalized</i> (boolean)</dt> <dd> flag indicating normalized file names are wanted @@ -2203,6 +2227,27 @@ <dd> flag indicating membership (boolean) </dd> +</dl><a NAME="Project.isProjectProtocol" ID="Project.isProjectProtocol"></a> +<h4>Project.isProjectProtocol</h4> +<b>isProjectProtocol</b>(<i>fn</i>) +<p> + Public method used to check, if the passed in filename belongs to the + project protocols. +</p><dl> +<dt><i>fn</i> (str)</dt> +<dd> +filename to be checked +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +flag indicating membership +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +bool +</dd> </dl><a NAME="Project.isProjectResource" ID="Project.isProjectResource"></a> <h4>Project.isProjectResource</h4> <b>isProjectResource</b>(<i>fn</i>)
--- a/Documentation/Source/eric6.Project.ProjectBrowser.html Sun Nov 19 13:06:01 2017 +0100 +++ b/Documentation/Source/eric6.Project.ProjectBrowser.html Sat Dec 02 12:40:22 2017 +0100 @@ -214,7 +214,7 @@ <dd> name of the requested project browser (string). Valid names are "sources, forms, resources, translations, - interfaces, others". + interfaces, protocols, others". </dd> </dl><dl> <dt>Returns:</dt>
--- a/Documentation/Source/eric6.Project.ProjectBrowserFlags.html Sun Nov 19 13:06:01 2017 +0100 +++ b/Documentation/Source/eric6.Project.ProjectBrowserFlags.html Sat Dec 02 12:40:22 2017 +0100 @@ -25,7 +25,7 @@ </p> <h3>Global Attributes</h3> <table> -<tr><td>AllBrowsersFlag</td></tr><tr><td>FormsBrowserFlag</td></tr><tr><td>InterfacesBrowserFlag</td></tr><tr><td>OthersBrowserFlag</td></tr><tr><td>ResourcesBrowserFlag</td></tr><tr><td>SourcesBrowserFlag</td></tr><tr><td>TranslationsBrowserFlag</td></tr> +<tr><td>AllBrowsersFlag</td></tr><tr><td>FormsBrowserFlag</td></tr><tr><td>InterfacesBrowserFlag</td></tr><tr><td>OthersBrowserFlag</td></tr><tr><td>ProtocolsBrowserFlag</td></tr><tr><td>ResourcesBrowserFlag</td></tr><tr><td>SourcesBrowserFlag</td></tr><tr><td>TranslationsBrowserFlag</td></tr> </table> <h3>Classes</h3> <table>
--- a/Documentation/Source/eric6.Project.ProjectBrowserModel.html Sun Nov 19 13:06:01 2017 +0100 +++ b/Documentation/Source/eric6.Project.ProjectBrowserModel.html Sat Dec 02 12:40:22 2017 +0100 @@ -25,7 +25,7 @@ </p> <h3>Global Attributes</h3> <table> -<tr><td>ProjectBrowserFormType</td></tr><tr><td>ProjectBrowserInterfaceType</td></tr><tr><td>ProjectBrowserItemDirectory</td></tr><tr><td>ProjectBrowserItemFile</td></tr><tr><td>ProjectBrowserItemSimpleDirectory</td></tr><tr><td>ProjectBrowserNoType</td></tr><tr><td>ProjectBrowserOthersType</td></tr><tr><td>ProjectBrowserResourceType</td></tr><tr><td>ProjectBrowserSourceType</td></tr><tr><td>ProjectBrowserTranslationType</td></tr> +<tr><td>ProjectBrowserFormType</td></tr><tr><td>ProjectBrowserInterfaceType</td></tr><tr><td>ProjectBrowserItemDirectory</td></tr><tr><td>ProjectBrowserItemFile</td></tr><tr><td>ProjectBrowserItemSimpleDirectory</td></tr><tr><td>ProjectBrowserNoType</td></tr><tr><td>ProjectBrowserOthersType</td></tr><tr><td>ProjectBrowserProtocolsType</td></tr><tr><td>ProjectBrowserResourceType</td></tr><tr><td>ProjectBrowserSourceType</td></tr><tr><td>ProjectBrowserTranslationType</td></tr> </table> <h3>Classes</h3> <table>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Documentation/Source/eric6.Project.ProjectProtocolsBrowser.html Sat Dec 02 12:40:22 2017 +0100 @@ -0,0 +1,332 @@ +<!DOCTYPE html> +<html><head> +<title>eric6.Project.ProjectProtocolsBrowser</title> +<meta charset="UTF-8"> +<style> +body { + background: #EDECE6; + margin: 0em 1em 10em 1em; + color: black; +} + +h1 { color: white; background: #85774A; } +h2 { color: white; background: #85774A; } +h3 { color: white; background: #9D936E; } +h4 { color: white; background: #9D936E; } + +a { color: #BA6D36; } + +</style> +</head> +<body><a NAME="top" ID="top"></a> +<h1>eric6.Project.ProjectProtocolsBrowser</h1> +<p> +Module implementing the a class used to display the protocols (protobuf) part +of the project. +</p> +<h3>Global Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Classes</h3> +<table> +<tr> +<td><a href="#ProjectProtocolsBrowser">ProjectProtocolsBrowser</a></td> +<td>A class used to display the protocols (protobuf) part of the project.</td> +</tr> +</table> +<h3>Functions</h3> +<table> +<tr><td>None</td></tr> +</table> +<hr /><hr /> +<a NAME="ProjectProtocolsBrowser" ID="ProjectProtocolsBrowser"></a> +<h2>ProjectProtocolsBrowser</h2> +<p> + A class used to display the protocols (protobuf) part of the project. +</p><h3>Signals</h3> +<dl> +<dt>appendStderr(str)</dt> +<dd> +emitted after something was received from + a QProcess on stderr +</dd><dt>appendStdout(str)</dt> +<dd> +emitted after something was received from + a QProcess on stdout +</dd><dt>showMenu(str, QMenu)</dt> +<dd> +emitted when a menu is about to be shown. + The name of the menu and a reference to the menu are given. +</dd> +</dl> +<h3>Derived from</h3> +ProjectBaseBrowser +<h3>Class Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Class Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Methods</h3> +<table> +<tr> +<td><a href="#ProjectProtocolsBrowser.__init__">ProjectProtocolsBrowser</a></td> +<td>Constructor</td> +</tr><tr> +<td><a href="#ProjectProtocolsBrowser.__addProtocolFiles">__addProtocolFiles</a></td> +<td>Private method to add protocol files to the project.</td> +</tr><tr> +<td><a href="#ProjectProtocolsBrowser.__addProtocolsDirectory">__addProtocolsDirectory</a></td> +<td>Private method to add protocol files of a directory to the project.</td> +</tr><tr> +<td><a href="#ProjectProtocolsBrowser.__compileAllProtocols">__compileAllProtocols</a></td> +<td>Private method to compile all protocols to Python.</td> +</tr><tr> +<td><a href="#ProjectProtocolsBrowser.__compileProto">__compileProto</a></td> +<td>Private method to compile a .proto file to Python.</td> +</tr><tr> +<td><a href="#ProjectProtocolsBrowser.__compileProtoDone">__compileProtoDone</a></td> +<td>Private slot to handle the finished signal of the protoc process.</td> +</tr><tr> +<td><a href="#ProjectProtocolsBrowser.__compileProtocol">__compileProtocol</a></td> +<td>Private method to compile a protocol to Python.</td> +</tr><tr> +<td><a href="#ProjectProtocolsBrowser.__compileSelectedProtocols">__compileSelectedProtocols</a></td> +<td>Private method to compile selected protocols to Python.</td> +</tr><tr> +<td><a href="#ProjectProtocolsBrowser.__configureProtobuf">__configureProtobuf</a></td> +<td>Private method to open the configuration dialog.</td> +</tr><tr> +<td><a href="#ProjectProtocolsBrowser.__deleteFile">__deleteFile</a></td> +<td>Private method to delete files from the project.</td> +</tr><tr> +<td><a href="#ProjectProtocolsBrowser.__getCompilerCommand">__getCompilerCommand</a></td> +<td>Private method to get the compiler command.</td> +</tr><tr> +<td><a href="#ProjectProtocolsBrowser.__readStderr">__readStderr</a></td> +<td>Private slot to handle the readyReadStandardError signal of the protoc process.</td> +</tr><tr> +<td><a href="#ProjectProtocolsBrowser.__readStdout">__readStdout</a></td> +<td>Private slot to handle the readyReadStandardOutput signal of the protoc process.</td> +</tr><tr> +<td><a href="#ProjectProtocolsBrowser.__showContextMenu">__showContextMenu</a></td> +<td>Private slot called by the menu aboutToShow signal.</td> +</tr><tr> +<td><a href="#ProjectProtocolsBrowser.__showContextMenuBack">__showContextMenuBack</a></td> +<td>Private slot called by the backMenu aboutToShow signal.</td> +</tr><tr> +<td><a href="#ProjectProtocolsBrowser.__showContextMenuDir">__showContextMenuDir</a></td> +<td>Private slot called by the dirMenu aboutToShow signal.</td> +</tr><tr> +<td><a href="#ProjectProtocolsBrowser.__showContextMenuDirMulti">__showContextMenuDirMulti</a></td> +<td>Private slot called by the dirMultiMenu aboutToShow signal.</td> +</tr><tr> +<td><a href="#ProjectProtocolsBrowser.__showContextMenuMulti">__showContextMenuMulti</a></td> +<td>Private slot called by the multiMenu aboutToShow signal.</td> +</tr><tr> +<td><a href="#ProjectProtocolsBrowser._contextMenuRequested">_contextMenuRequested</a></td> +<td>Protected slot to show the context menu.</td> +</tr><tr> +<td><a href="#ProjectProtocolsBrowser._createPopupMenus">_createPopupMenus</a></td> +<td>Protected overloaded method to generate the popup menu.</td> +</tr><tr> +<td><a href="#ProjectProtocolsBrowser._openItem">_openItem</a></td> +<td>Protected slot to handle the open popup menu entry.</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="ProjectProtocolsBrowser.__init__" ID="ProjectProtocolsBrowser.__init__"></a> +<h4>ProjectProtocolsBrowser (Constructor)</h4> +<b>ProjectProtocolsBrowser</b>(<i>project, parent=None</i>) +<p> + Constructor +</p><dl> +<dt><i>project</i> (Project)</dt> +<dd> +reference to the project object +</dd><dt><i>parent</i> (QWidget)</dt> +<dd> +parent widget of this browser +</dd> +</dl><a NAME="ProjectProtocolsBrowser.__addProtocolFiles" ID="ProjectProtocolsBrowser.__addProtocolFiles"></a> +<h4>ProjectProtocolsBrowser.__addProtocolFiles</h4> +<b>__addProtocolFiles</b>(<i></i>) +<p> + Private method to add protocol files to the project. +</p><a NAME="ProjectProtocolsBrowser.__addProtocolsDirectory" ID="ProjectProtocolsBrowser.__addProtocolsDirectory"></a> +<h4>ProjectProtocolsBrowser.__addProtocolsDirectory</h4> +<b>__addProtocolsDirectory</b>(<i></i>) +<p> + Private method to add protocol files of a directory to the project. +</p><a NAME="ProjectProtocolsBrowser.__compileAllProtocols" ID="ProjectProtocolsBrowser.__compileAllProtocols"></a> +<h4>ProjectProtocolsBrowser.__compileAllProtocols</h4> +<b>__compileAllProtocols</b>(<i>grpc=False</i>) +<p> + Private method to compile all protocols to Python. +</p><dl> +<dt><i>grpc</i> (bool)</dt> +<dd> +flag indicating to compile as gRPC files +</dd> +</dl><a NAME="ProjectProtocolsBrowser.__compileProto" ID="ProjectProtocolsBrowser.__compileProto"></a> +<h4>ProjectProtocolsBrowser.__compileProto</h4> +<b>__compileProto</b>(<i>fn, noDialog=False, progress=None, grpc=False</i>) +<p> + Private method to compile a .proto file to Python. +</p><dl> +<dt><i>fn</i> (str)</dt> +<dd> +filename of the .proto file to be compiled +</dd><dt><i>noDialog</i> (bool)</dt> +<dd> +flag indicating silent operations +</dd><dt><i>progress</i> (E5ProgressDialog)</dt> +<dd> +reference to the progress dialog +</dd><dt><i>grpc</i> (bool)</dt> +<dd> +flag indicating to compile as gRPC files +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +reference to the compile process +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +QProcess +</dd> +</dl><a NAME="ProjectProtocolsBrowser.__compileProtoDone" ID="ProjectProtocolsBrowser.__compileProtoDone"></a> +<h4>ProjectProtocolsBrowser.__compileProtoDone</h4> +<b>__compileProtoDone</b>(<i>exitCode, exitStatus, grpc</i>) +<p> + Private slot to handle the finished signal of the protoc process. +</p><dl> +<dt><i>exitCode</i> (int)</dt> +<dd> +exit code of the process +</dd><dt><i>exitStatus</i> (QProcess.ExitStatus)</dt> +<dd> +exit status of the process +</dd><dt><i>grpc</i> (bool)</dt> +<dd> +flag indicating to compile as gRPC files +</dd> +</dl><a NAME="ProjectProtocolsBrowser.__compileProtocol" ID="ProjectProtocolsBrowser.__compileProtocol"></a> +<h4>ProjectProtocolsBrowser.__compileProtocol</h4> +<b>__compileProtocol</b>(<i>grpc=False</i>) +<p> + Private method to compile a protocol to Python. +</p><dl> +<dt><i>grpc</i> (bool)</dt> +<dd> +flag indicating to compile as gRPC files +</dd> +</dl><a NAME="ProjectProtocolsBrowser.__compileSelectedProtocols" ID="ProjectProtocolsBrowser.__compileSelectedProtocols"></a> +<h4>ProjectProtocolsBrowser.__compileSelectedProtocols</h4> +<b>__compileSelectedProtocols</b>(<i>grpc=False</i>) +<p> + Private method to compile selected protocols to Python. +</p><dl> +<dt><i>grpc</i> (bool)</dt> +<dd> +flag indicating to compile as gRPC files +</dd> +</dl><a NAME="ProjectProtocolsBrowser.__configureProtobuf" ID="ProjectProtocolsBrowser.__configureProtobuf"></a> +<h4>ProjectProtocolsBrowser.__configureProtobuf</h4> +<b>__configureProtobuf</b>(<i></i>) +<p> + Private method to open the configuration dialog. +</p><a NAME="ProjectProtocolsBrowser.__deleteFile" ID="ProjectProtocolsBrowser.__deleteFile"></a> +<h4>ProjectProtocolsBrowser.__deleteFile</h4> +<b>__deleteFile</b>(<i></i>) +<p> + Private method to delete files from the project. +</p><a NAME="ProjectProtocolsBrowser.__getCompilerCommand" ID="ProjectProtocolsBrowser.__getCompilerCommand"></a> +<h4>ProjectProtocolsBrowser.__getCompilerCommand</h4> +<b>__getCompilerCommand</b>(<i>grpc</i>) +<p> + Private method to get the compiler command. +</p><dl> +<dt><i>grpc</i> (bool)</dt> +<dd> +flag indicating to get a gRPC command +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +tuple giving the executable and its parameter list +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +tuple of (str, list of str) +</dd> +</dl><a NAME="ProjectProtocolsBrowser.__readStderr" ID="ProjectProtocolsBrowser.__readStderr"></a> +<h4>ProjectProtocolsBrowser.__readStderr</h4> +<b>__readStderr</b>(<i></i>) +<p> + Private slot to handle the readyReadStandardError signal of the + protoc process. +</p><a NAME="ProjectProtocolsBrowser.__readStdout" ID="ProjectProtocolsBrowser.__readStdout"></a> +<h4>ProjectProtocolsBrowser.__readStdout</h4> +<b>__readStdout</b>(<i></i>) +<p> + Private slot to handle the readyReadStandardOutput signal of the + protoc process. +</p><a NAME="ProjectProtocolsBrowser.__showContextMenu" ID="ProjectProtocolsBrowser.__showContextMenu"></a> +<h4>ProjectProtocolsBrowser.__showContextMenu</h4> +<b>__showContextMenu</b>(<i></i>) +<p> + Private slot called by the menu aboutToShow signal. +</p><a NAME="ProjectProtocolsBrowser.__showContextMenuBack" ID="ProjectProtocolsBrowser.__showContextMenuBack"></a> +<h4>ProjectProtocolsBrowser.__showContextMenuBack</h4> +<b>__showContextMenuBack</b>(<i></i>) +<p> + Private slot called by the backMenu aboutToShow signal. +</p><a NAME="ProjectProtocolsBrowser.__showContextMenuDir" ID="ProjectProtocolsBrowser.__showContextMenuDir"></a> +<h4>ProjectProtocolsBrowser.__showContextMenuDir</h4> +<b>__showContextMenuDir</b>(<i></i>) +<p> + Private slot called by the dirMenu aboutToShow signal. +</p><a NAME="ProjectProtocolsBrowser.__showContextMenuDirMulti" ID="ProjectProtocolsBrowser.__showContextMenuDirMulti"></a> +<h4>ProjectProtocolsBrowser.__showContextMenuDirMulti</h4> +<b>__showContextMenuDirMulti</b>(<i></i>) +<p> + Private slot called by the dirMultiMenu aboutToShow signal. +</p><a NAME="ProjectProtocolsBrowser.__showContextMenuMulti" ID="ProjectProtocolsBrowser.__showContextMenuMulti"></a> +<h4>ProjectProtocolsBrowser.__showContextMenuMulti</h4> +<b>__showContextMenuMulti</b>(<i></i>) +<p> + Private slot called by the multiMenu aboutToShow signal. +</p><a NAME="ProjectProtocolsBrowser._contextMenuRequested" ID="ProjectProtocolsBrowser._contextMenuRequested"></a> +<h4>ProjectProtocolsBrowser._contextMenuRequested</h4> +<b>_contextMenuRequested</b>(<i>coord</i>) +<p> + Protected slot to show the context menu. +</p><dl> +<dt><i>coord</i></dt> +<dd> +the position of the mouse pointer (QPoint) +</dd> +</dl><a NAME="ProjectProtocolsBrowser._createPopupMenus" ID="ProjectProtocolsBrowser._createPopupMenus"></a> +<h4>ProjectProtocolsBrowser._createPopupMenus</h4> +<b>_createPopupMenus</b>(<i></i>) +<p> + Protected overloaded method to generate the popup menu. +</p><a NAME="ProjectProtocolsBrowser._openItem" ID="ProjectProtocolsBrowser._openItem"></a> +<h4>ProjectProtocolsBrowser._openItem</h4> +<b>_openItem</b>(<i></i>) +<p> + Protected slot to handle the open popup menu entry. +</p> +<div align="right"><a href="#top">Up</a></div> +<hr /> +</body></html> \ No newline at end of file
--- a/Documentation/Source/eric6.UI.BrowserModel.html Sun Nov 19 13:06:01 2017 +0100 +++ b/Documentation/Source/eric6.UI.BrowserModel.html Sat Dec 02 12:40:22 2017 +0100 @@ -698,6 +698,9 @@ <td><a href="#BrowserFileItem.isProjectFile">isProjectFile</a></td> <td>Public method to check, if this file is an eric project file.</td> </tr><tr> +<td><a href="#BrowserFileItem.isProtobufFile">isProtobufFile</a></td> +<td>Public method to check, if this file is a Google Protocol Buffer file.</td> +</tr><tr> <td><a href="#BrowserFileItem.isPython2File">isPython2File</a></td> <td>Public method to check, if this file is a Python script.</td> </tr><tr> @@ -859,6 +862,21 @@ <dd> flag indicating an eric project file (boolean) </dd> +</dl><a NAME="BrowserFileItem.isProtobufFile" ID="BrowserFileItem.isProtobufFile"></a> +<h4>BrowserFileItem.isProtobufFile</h4> +<b>isProtobufFile</b>(<i></i>) +<p> + Public method to check, if this file is a Google Protocol Buffer file. +</p><dl> +<dt>Returns:</dt> +<dd> +flag indicating a protobuf file +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +bool +</dd> </dl><a NAME="BrowserFileItem.isPython2File" ID="BrowserFileItem.isPython2File"></a> <h4>BrowserFileItem.isPython2File</h4> <b>isPython2File</b>(<i></i>)
--- a/Documentation/Source/eric6.UI.CodeDocumentationViewer.html Sun Nov 19 13:06:01 2017 +0100 +++ b/Documentation/Source/eric6.UI.CodeDocumentationViewer.html Sat Dec 02 12:40:22 2017 +0100 @@ -184,14 +184,15 @@ <p> Public method to provide the documentation info to the viewer. </p><p> - If documentationInfo is a dictionary, it should contains these keys - and data: + If documentationInfo is a dictionary, it should contain these + (optional) keys and data: </p><p> name: the name of the inspected object - argspec: its argspec + argspec: its arguments specification note: A phrase describing the type of object (function or method) and the module it belongs to. docstring: its documentation string + typ: its type information </p><dl> <dt><i>documentationInfo</i> (dict or str)</dt> <dd>
--- a/Documentation/Source/eric6.Utilities.ClassBrowsers.ClbrBaseClasses.html Sun Nov 19 13:06:01 2017 +0100 +++ b/Documentation/Source/eric6.Utilities.ClassBrowsers.ClbrBaseClasses.html Sat Dec 02 12:40:22 2017 +0100 @@ -45,6 +45,9 @@ <td><a href="#Coding">Coding</a></td> <td>Class to represent a source coding.</td> </tr><tr> +<td><a href="#Enum">Enum</a></td> +<td>Class to represent an enum definition.</td> +</tr><tr> <td><a href="#Function">Function</a></td> <td>Class to represent a function or method.</td> </tr><tr> @@ -95,18 +98,18 @@ <p> Constructor </p><dl> -<dt><i>module</i></dt> +<dt><i>module</i> (str)</dt> <dd> -name of the module containing this class -</dd><dt><i>name</i></dt> +name of the module containing this attribute +</dd><dt><i>name</i> (str)</dt> <dd> -name of this class -</dd><dt><i>file</i></dt> +name of this attribute +</dd><dt><i>file</i> (str)</dt> <dd> filename containing this attribute -</dd><dt><i>lineno</i></dt> +</dd><dt><i>lineno</i> (int)</dt> <dd> -linenumber of the class definition +line number of the attribute definition </dd> </dl><a NAME="Attribute.addAssignment" ID="Attribute.addAssignment"></a> <h4>Attribute.addAssignment</h4> @@ -114,10 +117,9 @@ <p> Public method to add another assignment line number. </p><dl> -<dt><i>lineno</i></dt> +<dt><i>lineno</i> (int)</dt> <dd> -linenumber of the additional attribute assignment - (integer) +line number of the additional attribute assignment </dd> </dl> <div align="right"><a href="#top">Up</a></div> @@ -154,21 +156,21 @@ <p> Constructor </p><dl> -<dt><i>module</i></dt> +<dt><i>module</i> (str)</dt> <dd> name of the module containing this class -</dd><dt><i>name</i></dt> +</dd><dt><i>name</i> (str)</dt> <dd> name of this class -</dd><dt><i>superClasses</i></dt> +</dd><dt><i>superClasses</i> (list of str)</dt> <dd> list of class names this class is inherited from -</dd><dt><i>file</i></dt> +</dd><dt><i>file</i> (str)</dt> <dd> filename containing this class -</dd><dt><i>lineno</i></dt> +</dd><dt><i>lineno</i> (int)</dt> <dd> -linenumber of the class definition +line number of the class definition </dd> </dl> <div align="right"><a href="#top">Up</a></div> @@ -226,18 +228,18 @@ <p> Constructor </p><dl> -<dt><i>module</i></dt> +<dt><i>module</i> (str)</dt> <dd> -name of the module containing this class -</dd><dt><i>name</i></dt> +name of the module containing this object +</dd><dt><i>name</i> (str)</dt> <dd> -name of this class -</dd><dt><i>file</i></dt> +name of this object +</dd><dt><i>file</i> (str)</dt> <dd> filename containing this object -</dd><dt><i>lineno</i></dt> +</dd><dt><i>lineno</i> (int)</dt> <dd> -linenumber of the class definition +linenumber of the object definition </dd> </dl><a NAME="ClbrBase._addattribute" ID="ClbrBase._addattribute"></a> <h4>ClbrBase._addattribute</h4> @@ -245,9 +247,9 @@ <p> Protected method to add information about attributes. </p><dl> -<dt><i>attr</i></dt> +<dt><i>attr</i> (Attribute)</dt> <dd> -Attribute object to be added (Attribute) +Attribute object to be added </dd> </dl><a NAME="ClbrBase._addclass" ID="ClbrBase._addclass"></a> <h4>ClbrBase._addclass</h4> @@ -255,12 +257,12 @@ <p> Protected method method to add a nested class to this class. </p><dl> -<dt><i>name</i></dt> +<dt><i>name</i> (str)</dt> <dd> name of the class -</dd><dt><i>_class</i></dt> +</dd><dt><i>_class</i> (Class)</dt> <dd> -Class object to be added (Class) +Class object to be added </dd> </dl><a NAME="ClbrBase._addglobal" ID="ClbrBase._addglobal"></a> <h4>ClbrBase._addglobal</h4> @@ -268,9 +270,9 @@ <p> Protected method to add information about global variables. </p><dl> -<dt><i>attr</i></dt> +<dt><i>attr</i> (Attribute)</dt> <dd> -Attribute object to be added (Attribute) +Attribute object to be added </dd> </dl><a NAME="ClbrBase._addmethod" ID="ClbrBase._addmethod"></a> <h4>ClbrBase._addmethod</h4> @@ -278,10 +280,10 @@ <p> Protected method to add information about a method. </p><dl> -<dt><i>name</i></dt> +<dt><i>name</i> (str)</dt> <dd> -name of method to be added (string) -</dd><dt><i>function</i></dt> +name of method to be added +</dd><dt><i>function</i> (Function)</dt> <dd> Function object to be added </dd> @@ -291,14 +293,19 @@ <p> Protected method to retrieve an attribute by name. </p><dl> -<dt><i>name</i></dt> +<dt><i>name</i> (str)</dt> <dd> -name of the attribute (string) +name of the attribute </dd> </dl><dl> <dt>Returns:</dt> <dd> -the named attribute or None +the named attribute +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +Attribute or None </dd> </dl><a NAME="ClbrBase._getglobal" ID="ClbrBase._getglobal"></a> <h4>ClbrBase._getglobal</h4> @@ -306,14 +313,19 @@ <p> Protected method to retrieve a global variable by name. </p><dl> -<dt><i>name</i></dt> +<dt><i>name</i> (str)</dt> <dd> -name of the global variable (string) +name of the global variable </dd> </dl><dl> <dt>Returns:</dt> <dd> -the named global variable or None +the named global variable +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +Attribute or None </dd> </dl><a NAME="ClbrBase._getmethod" ID="ClbrBase._getmethod"></a> <h4>ClbrBase._getmethod</h4> @@ -321,14 +333,19 @@ <p> Protected method to retrieve a method by name. </p><dl> -<dt><i>name</i></dt> +<dt><i>name</i> (str)</dt> <dd> name of the method (string) </dd> </dl><dl> <dt>Returns:</dt> <dd> -the named method or None +the named method +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +Function or None </dd> </dl> <div align="right"><a href="#top">Up</a></div> @@ -382,7 +399,12 @@ </p><dl> <dt>Returns:</dt> <dd> -flag indicating Private visibility (boolean) +flag indicating Private visibility +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +bool </dd> </dl><a NAME="ClbrVisibilityMixinBase.isProtected" ID="ClbrVisibilityMixinBase.isProtected"></a> <h4>ClbrVisibilityMixinBase.isProtected</h4> @@ -392,7 +414,12 @@ </p><dl> <dt>Returns:</dt> <dd> -flag indicating Protected visibility (boolean) +flag indicating Protected visibility +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +bool </dd> </dl><a NAME="ClbrVisibilityMixinBase.isPublic" ID="ClbrVisibilityMixinBase.isPublic"></a> <h4>ClbrVisibilityMixinBase.isPublic</h4> @@ -402,7 +429,12 @@ </p><dl> <dt>Returns:</dt> <dd> -flag indicating Public visibility (boolean) +flag indicating Public visibility +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +bool </dd> </dl><a NAME="ClbrVisibilityMixinBase.setPrivate" ID="ClbrVisibilityMixinBase.setPrivate"></a> <h4>ClbrVisibilityMixinBase.setPrivate</h4> @@ -454,22 +486,70 @@ <p> Constructor </p><dl> -<dt><i>module</i></dt> +<dt><i>module</i> (str)</dt> <dd> -name of the module containing this module -</dd><dt><i>file</i></dt> +name of the module containing this coding statement +</dd><dt><i>file</i> (str)</dt> <dd> -filename containing this module -</dd><dt><i>lineno</i></dt> +filename containing this coding statement +</dd><dt><i>lineno</i> (int)</dt> <dd> -linenumber of the module definition -</dd><dt><i>coding</i></dt> +line number of the coding definition +</dd><dt><i>coding</i> (str)</dt> <dd> character coding of the source file </dd> </dl> <div align="right"><a href="#top">Up</a></div> <hr /><hr /> +<a NAME="Enum" ID="Enum"></a> +<h2>Enum</h2> +<p> + Class to represent an enum definition. +</p> +<h3>Derived from</h3> +ClbrBase +<h3>Class Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Class Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Methods</h3> +<table> +<tr> +<td><a href="#Enum.__init__">Enum</a></td> +<td>Constructor</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="Enum.__init__" ID="Enum.__init__"></a> +<h4>Enum (Constructor)</h4> +<b>Enum</b>(<i>module, name, file, lineno</i>) +<p> + Constructor +</p><dl> +<dt><i>module</i> (str)</dt> +<dd> +name of the module containing this enum +</dd><dt><i>name</i> (str)</dt> +<dd> +name of this enum +</dd><dt><i>file</i> (str)</dt> +<dd> +filename containing this enum +</dd><dt><i>lineno</i> (int)</dt> +<dd> +line number of the enum definition +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /><hr /> <a NAME="Function" ID="Function"></a> <h2>Function</h2> <p> @@ -502,30 +582,30 @@ <p> Constructor </p><dl> -<dt><i>module</i></dt> +<dt><i>module</i> (str)</dt> <dd> name of the module containing this function -</dd><dt><i>name</i></dt> +</dd><dt><i>name</i> (str)</dt> <dd> name of this function -</dd><dt><i>file</i></dt> +</dd><dt><i>file</i> (str)</dt> <dd> -filename containing this class -</dd><dt><i>lineno</i></dt> +filename containing this function +</dd><dt><i>lineno</i> (int)</dt> <dd> -linenumber of the class definition -</dd><dt><i>signature</i></dt> +line number of the function definition +</dd><dt><i>signature</i> (str)</dt> <dd> -parameterlist of the method -</dd><dt><i>separator</i></dt> +parameter list of the function +</dd><dt><i>separator</i> (str)</dt> <dd> -string separating the parameters -</dd><dt><i>modifierType</i></dt> +string separating the parameters of the function +</dd><dt><i>modifierType</i> (int)</dt> <dd> type of the function -</dd><dt><i>annotation</i></dt> +</dd><dt><i>annotation</i> (str)</dt> <dd> -return annotation +function return annotation </dd> </dl> <div align="right"><a href="#top">Up</a></div> @@ -562,18 +642,18 @@ <p> Constructor </p><dl> -<dt><i>module</i></dt> +<dt><i>module</i> (str)</dt> <dd> name of the module containing this module -</dd><dt><i>name</i></dt> +</dd><dt><i>name</i> (str)</dt> <dd> name of this module -</dd><dt><i>file</i></dt> +</dd><dt><i>file</i> (str)</dt> <dd> filename containing this module -</dd><dt><i>lineno</i></dt> +</dd><dt><i>lineno</i> (int)</dt> <dd> -linenumber of the module definition +line number of the module definition </dd> </dl> <div align="right"><a href="#top">Up</a></div> @@ -613,18 +693,18 @@ <p> Constructor </p><dl> -<dt><i>module</i></dt> +<dt><i>module</i> (str)</dt> <dd> -name of the module containing this class -</dd><dt><i>name</i></dt> +name of the module containing this object +</dd><dt><i>name</i> (str)</dt> <dd> -name of this class -</dd><dt><i>file</i></dt> +name of this object +</dd><dt><i>file</i> (str)</dt> <dd> filename containing this object -</dd><dt><i>lineno</i></dt> +</dd><dt><i>lineno</i> (int)</dt> <dd> -linenumber of the class definition +linenumber of the object definition </dd> </dl><a NAME="_ClbrBase.setEndLine" ID="_ClbrBase.setEndLine"></a> <h4>_ClbrBase.setEndLine</h4> @@ -632,9 +712,9 @@ <p> Public method to set the ending line number. </p><dl> -<dt><i>endLineNo</i></dt> +<dt><i>endLineNo</i> (int)</dt> <dd> -number of the last line (integer) +number of the last line </dd> </dl> <div align="right"><a href="#top">Up</a></div>
--- a/Documentation/Source/eric6.Utilities.ClassBrowsers.__init__.html Sun Nov 19 13:06:01 2017 +0100 +++ b/Documentation/Source/eric6.Utilities.ClassBrowsers.__init__.html Sat Dec 02 12:40:22 2017 +0100 @@ -28,13 +28,16 @@ </p><p> <ul> <li>CORBA IDL</li> -<li>Python</li> +<li>JavaScript</li> +<li>ProtoBuf</li> +<li>Python 2</li> +<li>Python 3</li> <li>Ruby</li> </ul> </p> <h3>Global Attributes</h3> <table> -<tr><td>IDL_SOURCE</td></tr><tr><td>JS_SOURCE</td></tr><tr><td>PTL_SOURCE</td></tr><tr><td>PY_SOURCE</td></tr><tr><td>RB_SOURCE</td></tr><tr><td>SUPPORTED_TYPES</td></tr><tr><td>__extensions</td></tr> +<tr><td>IDL_SOURCE</td></tr><tr><td>JS_SOURCE</td></tr><tr><td>PROTO_SOURCE</td></tr><tr><td>PTL_SOURCE</td></tr><tr><td>PY_SOURCE</td></tr><tr><td>RB_SOURCE</td></tr><tr><td>SUPPORTED_TYPES</td></tr><tr><td>__extensions</td></tr> </table> <h3>Classes</h3> <table> @@ -57,20 +60,20 @@ <p> Module function to extend the Python module finding mechanism. </p><p> - This function searches for files in the given path. If the filename - doesn't have an extension or an extension of .py, the normal search - implemented in the imp module is used. For all other supported files - only path is searched. + This function searches for files in the given list of paths. If the + file name doesn't have an extension or an extension of .py, the normal + Python search implemented in the imp module is used. For all other + supported files only the paths list is searched. </p><dl> -<dt><i>name</i></dt> +<dt><i>name</i> (str)</dt> <dd> -filename or modulename to search for (string) -</dd><dt><i>path</i></dt> +file name or module name to search for +</dd><dt><i>path</i> (list of str)</dt> <dd> -search path (list of strings) -</dd><dt><i>isPyFile</i></dt> +search paths +</dd><dt><i>isPyFile</i> (bool)</dt> <dd> -flag indicating a Python file (boolean) +flag indicating a Python file </dd> </dl><dl> <dt>Returns:</dt> @@ -79,6 +82,11 @@ is a tuple of file suffix, file mode and file type) </dd> </dl><dl> +<dt>Return Type:</dt> +<dd> +tuple +</dd> +</dl><dl> <dt>Raises <b>ImportError</b>:</dt> <dd> The file or module wasn't found. @@ -96,21 +104,26 @@ The real work of parsing the source file is delegated to the individual file parsers. </p><dl> -<dt><i>module</i></dt> +<dt><i>module</i> (str)</dt> <dd> -name of the source file (string) -</dd><dt><i>path</i></dt> +name of the source file +</dd><dt><i>path</i> (list of str)</dt> <dd> -path the file should be searched in (list of strings) -</dd><dt><i>isPyFile</i></dt> +list of paths the file should be searched in +</dd><dt><i>isPyFile</i> (bool)</dt> <dd> -flag indicating a Python file (boolean) +flag indicating a Python file </dd> </dl><dl> <dt>Returns:</dt> <dd> the resulting dictionary </dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +dict +</dd> </dl> <div align="right"><a href="#top">Up</a></div> <hr />
--- a/Documentation/Source/eric6.Utilities.ClassBrowsers.idlclbr.html Sun Nov 19 13:06:01 2017 +0100 +++ b/Documentation/Source/eric6.Utilities.ClassBrowsers.idlclbr.html Sat Dec 02 12:40:22 2017 +0100 @@ -93,18 +93,18 @@ <p> Constructor </p><dl> -<dt><i>module</i></dt> +<dt><i>module</i> (str)</dt> <dd> -name of the module containing this class -</dd><dt><i>name</i></dt> +name of the module containing this attribute +</dd><dt><i>name</i> (str)</dt> <dd> -name of this class -</dd><dt><i>file</i></dt> +name of this attribute +</dd><dt><i>file</i> (str)</dt> <dd> filename containing this attribute -</dd><dt><i>lineno</i></dt> +</dd><dt><i>lineno</i> (int)</dt> <dd> -linenumber of the class definition +line number of the attribute definition </dd> </dl> <div align="right"><a href="#top">Up</a></div> @@ -141,22 +141,22 @@ <p> Constructor </p><dl> -<dt><i>module</i></dt> +<dt><i>module</i> (str)</dt> <dd> name of the module containing this function -</dd><dt><i>name</i></dt> +</dd><dt><i>name</i> (str)</dt> <dd> name of this function -</dd><dt><i>file</i></dt> +</dd><dt><i>file</i> (str)</dt> <dd> -filename containing this class -</dd><dt><i>lineno</i></dt> +filename containing this function +</dd><dt><i>lineno</i> (int)</dt> <dd> -linenumber of the class definition -</dd><dt><i>signature</i></dt> +line number of the function definition +</dd><dt><i>signature</i> (str)</dt> <dd> -parameterlist of the method -</dd><dt><i>separator</i></dt> +parameter list of the function +</dd><dt><i>separator</i> (str)</dt> <dd> string separating the parameters </dd> @@ -195,22 +195,22 @@ <p> Constructor </p><dl> -<dt><i>module</i></dt> +<dt><i>module</i> (str)</dt> <dd> -name of the module containing this class -</dd><dt><i>name</i></dt> +name of the module containing this interface +</dd><dt><i>name</i> (str)</dt> <dd> name of this interface -</dd><dt><i>superClasses</i></dt> +</dd><dt><i>superClasses</i> (list of str)</dt> <dd> list of interface names this interface is inherited from -</dd><dt><i>file</i></dt> +</dd><dt><i>file</i> (str)</dt> <dd> filename containing this interface -</dd><dt><i>lineno</i></dt> +</dd><dt><i>lineno</i> (int)</dt> <dd> -linenumber of the interface definition +line number of the interface definition </dd> </dl> <div align="right"><a href="#top">Up</a></div> @@ -247,18 +247,18 @@ <p> Constructor </p><dl> -<dt><i>module</i></dt> +<dt><i>module</i> (str)</dt> <dd> -name of the module containing this class -</dd><dt><i>name</i></dt> +name of the module containing this module +</dd><dt><i>name</i> (str)</dt> <dd> -name of this class -</dd><dt><i>file</i></dt> +name of this module +</dd><dt><i>file</i> (str)</dt> <dd> -filename containing this class -</dd><dt><i>lineno</i></dt> +filename containing this module +</dd><dt><i>lineno</i> (int)</dt> <dd> -linenumber of the class definition +line number of the module definition </dd> </dl> <div align="right"><a href="#top">Up</a></div> @@ -304,18 +304,23 @@ Read a CORBA IDL file and return a dictionary of classes, functions and modules. </p><dl> -<dt><i>module</i></dt> +<dt><i>module</i> (str)</dt> <dd> -name of the CORBA IDL file (string) -</dd><dt><i>path</i></dt> +name of the CORBA IDL file +</dd><dt><i>path</i> (list of str)</dt> <dd> -path the file should be searched in (list of strings) +path the file should be searched in </dd> </dl><dl> <dt>Returns:</dt> <dd> the resulting dictionary </dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +dict +</dd> </dl> <div align="right"><a href="#top">Up</a></div> <hr />
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Documentation/Source/eric6.Utilities.ClassBrowsers.protoclbr.html Sat Dec 02 12:40:22 2017 +0100 @@ -0,0 +1,316 @@ +<!DOCTYPE html> +<html><head> +<title>eric6.Utilities.ClassBrowsers.protoclbr</title> +<meta charset="UTF-8"> +<style> +body { + background: #EDECE6; + margin: 0em 1em 10em 1em; + color: black; +} + +h1 { color: white; background: #85774A; } +h2 { color: white; background: #85774A; } +h3 { color: white; background: #9D936E; } +h4 { color: white; background: #9D936E; } + +a { color: #BA6D36; } + +</style> +</head> +<body><a NAME="top" ID="top"></a> +<h1>eric6.Utilities.ClassBrowsers.protoclbr</h1> +<p> +Parse a ProtoBuf protocol file and retrieve messages, enums, services and +rpc methods. +</p><p> +It is based on the Python class browser found in this package. +</p> +<h3>Global Attributes</h3> +<table> +<tr><td>SUPPORTED_TYPES</td></tr><tr><td>_commentsub</td></tr><tr><td>_getnext</td></tr><tr><td>_modules</td></tr><tr><td>_normalize</td></tr> +</table> +<h3>Classes</h3> +<table> +<tr> +<td><a href="#Enum">Enum</a></td> +<td>Class to represent a ProtoBuf Enum.</td> +</tr><tr> +<td><a href="#Message">Message</a></td> +<td>Class to represent a ProtoBuf Message.</td> +</tr><tr> +<td><a href="#Service">Service</a></td> +<td>Class to represent a ProtoBuf Service.</td> +</tr><tr> +<td><a href="#ServiceMethod">ServiceMethod</a></td> +<td>Class to represent a ProtoBuf Service Method.</td> +</tr><tr> +<td><a href="#VisibilityMixin">VisibilityMixin</a></td> +<td>Mixin class implementing the notion of visibility.</td> +</tr> +</table> +<h3>Functions</h3> +<table> +<tr> +<td><a href="#readmodule_ex">readmodule_ex</a></td> +<td>Read a ProtoBuf protocol file and return a dictionary of messages, enums, services and rpc methods.</td> +</tr> +</table> +<hr /><hr /> +<a NAME="Enum" ID="Enum"></a> +<h2>Enum</h2> +<p> + Class to represent a ProtoBuf Enum. +</p> +<h3>Derived from</h3> +ClbrBaseClasses.Enum, VisibilityMixin +<h3>Class Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Class Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Methods</h3> +<table> +<tr> +<td><a href="#Enum.__init__">Enum</a></td> +<td>Constructor</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="Enum.__init__" ID="Enum.__init__"></a> +<h4>Enum (Constructor)</h4> +<b>Enum</b>(<i>module, name, file, lineno</i>) +<p> + Constructor +</p><dl> +<dt><i>module</i> (str)</dt> +<dd> +name of the module containing this enum +</dd><dt><i>name</i> (str)</dt> +<dd> +name of this enum +</dd><dt><i>file</i> (str)</dt> +<dd> +filename containing this enum +</dd><dt><i>lineno</i> (int)</dt> +<dd> +linenumber of the message enum +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /><hr /> +<a NAME="Message" ID="Message"></a> +<h2>Message</h2> +<p> + Class to represent a ProtoBuf Message. +</p> +<h3>Derived from</h3> +ClbrBaseClasses.Module, VisibilityMixin +<h3>Class Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Class Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Methods</h3> +<table> +<tr> +<td><a href="#Message.__init__">Message</a></td> +<td>Constructor</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="Message.__init__" ID="Message.__init__"></a> +<h4>Message (Constructor)</h4> +<b>Message</b>(<i>module, name, file, lineno</i>) +<p> + Constructor +</p><dl> +<dt><i>module</i> (str)</dt> +<dd> +name of the module containing this message +</dd><dt><i>name</i> (str)</dt> +<dd> +name of this message +</dd><dt><i>file</i> (str)</dt> +<dd> +filename containing this message +</dd><dt><i>lineno</i> (int)</dt> +<dd> +linenumber of the message definition +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /><hr /> +<a NAME="Service" ID="Service"></a> +<h2>Service</h2> +<p> + Class to represent a ProtoBuf Service. +</p> +<h3>Derived from</h3> +ClbrBaseClasses.Class, VisibilityMixin +<h3>Class Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Class Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Methods</h3> +<table> +<tr> +<td><a href="#Service.__init__">Service</a></td> +<td>Constructor</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="Service.__init__" ID="Service.__init__"></a> +<h4>Service (Constructor)</h4> +<b>Service</b>(<i>module, name, file, lineno</i>) +<p> + Constructor +</p><dl> +<dt><i>module</i> (str)</dt> +<dd> +name of the module containing this service +</dd><dt><i>name</i> (str)</dt> +<dd> +name of this service +</dd><dt><i>file</i> (str)</dt> +<dd> +filename containing this service +</dd><dt><i>lineno</i> (int)</dt> +<dd> +linenumber of the service definition +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /><hr /> +<a NAME="ServiceMethod" ID="ServiceMethod"></a> +<h2>ServiceMethod</h2> +<p> + Class to represent a ProtoBuf Service Method. +</p> +<h3>Derived from</h3> +ClbrBaseClasses.Function, VisibilityMixin +<h3>Class Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Class Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Methods</h3> +<table> +<tr> +<td><a href="#ServiceMethod.__init__">ServiceMethod</a></td> +<td>Constructor</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="ServiceMethod.__init__" ID="ServiceMethod.__init__"></a> +<h4>ServiceMethod (Constructor)</h4> +<b>ServiceMethod</b>(<i>name, file, lineno, signature, returns</i>) +<p> + Constructor +</p><dl> +<dt><i>name</i> (str)</dt> +<dd> +name of this service method +</dd><dt><i>file</i> (str)</dt> +<dd> +filename containing this service method +</dd><dt><i>lineno</i> (int)</dt> +<dd> +linenumber of the service method definition +</dd><dt><i>signature</i> (str)</dt> +<dd> +parameter list of the service method +</dd><dt><i>returns</i> (str)</dt> +<dd> +return type of the service method +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /><hr /> +<a NAME="VisibilityMixin" ID="VisibilityMixin"></a> +<h2>VisibilityMixin</h2> +<p> + Mixin class implementing the notion of visibility. +</p> +<h3>Derived from</h3> +ClbrBaseClasses.ClbrVisibilityMixinBase +<h3>Class Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Class Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Methods</h3> +<table> +<tr> +<td><a href="#VisibilityMixin.__init__">VisibilityMixin</a></td> +<td>Constructor</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="VisibilityMixin.__init__" ID="VisibilityMixin.__init__"></a> +<h4>VisibilityMixin (Constructor)</h4> +<b>VisibilityMixin</b>(<i></i>) +<p> + Constructor +</p> +<div align="right"><a href="#top">Up</a></div> +<hr /><hr /> +<a NAME="readmodule_ex" ID="readmodule_ex"></a> +<h2>readmodule_ex</h2> +<b>readmodule_ex</b>(<i>module, path=None</i>) +<p> + Read a ProtoBuf protocol file and return a dictionary of messages, enums, + services and rpc methods. +</p><dl> +<dt><i>module</i> (str)</dt> +<dd> +name of the ProtoBuf protocol file +</dd><dt><i>path</i> (list of str)</dt> +<dd> +path the file should be searched in +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +the resulting dictionary +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +dict +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /> +</body></html> \ No newline at end of file
--- a/Documentation/Source/index-eric6.Preferences.ConfigurationPages.html Sun Nov 19 13:06:01 2017 +0100 +++ b/Documentation/Source/index-eric6.Preferences.ConfigurationPages.html Sat Dec 02 12:40:22 2017 +0100 @@ -181,6 +181,9 @@ <td><a href="eric6.Preferences.ConfigurationPages.ProjectPage.html">ProjectPage</a></td> <td>Module implementing the Project configuration page.</td> </tr><tr> +<td><a href="eric6.Preferences.ConfigurationPages.ProtobufPage.html">ProtobufPage</a></td> +<td>Module implementing the protobuf configuration page.</td> +</tr><tr> <td><a href="eric6.Preferences.ConfigurationPages.PythonPage.html">PythonPage</a></td> <td>Module implementing the Python configuration page.</td> </tr><tr>
--- a/Documentation/Source/index-eric6.Project.html Sun Nov 19 13:06:01 2017 +0100 +++ b/Documentation/Source/index-eric6.Project.html Sat Dec 02 12:40:22 2017 +0100 @@ -92,6 +92,9 @@ <td><a href="eric6.Project.ProjectOthersBrowser.html">ProjectOthersBrowser</a></td> <td>Module implementing a class used to display the parts of the project, that don't fit the other categories.</td> </tr><tr> +<td><a href="eric6.Project.ProjectProtocolsBrowser.html">ProjectProtocolsBrowser</a></td> +<td>Module implementing the a class used to display the protocols (protobuf) part of the project.</td> +</tr><tr> <td><a href="eric6.Project.ProjectResourcesBrowser.html">ProjectResourcesBrowser</a></td> <td>Module implementing a class used to display the resources part of the project.</td> </tr><tr>
--- a/Documentation/Source/index-eric6.Utilities.ClassBrowsers.html Sun Nov 19 13:06:01 2017 +0100 +++ b/Documentation/Source/index-eric6.Utilities.ClassBrowsers.html Sat Dec 02 12:40:22 2017 +0100 @@ -28,7 +28,10 @@ </p><p> <ul> <li>CORBA IDL</li> -<li>Python</li> +<li>JavaScript</li> +<li>ProtoBuf</li> +<li>Python 2</li> +<li>Python 3</li> <li>Ruby</li> </ul> </p> @@ -49,6 +52,9 @@ <td><a href="eric6.Utilities.ClassBrowsers.jsclbr.html">jsclbr</a></td> <td>Parse a JavaScript file and retrieve variables and functions.</td> </tr><tr> +<td><a href="eric6.Utilities.ClassBrowsers.protoclbr.html">protoclbr</a></td> +<td>Parse a ProtoBuf protocol file and retrieve messages, enums, services and rpc methods.</td> +</tr><tr> <td><a href="eric6.Utilities.ClassBrowsers.pyclbr.html">pyclbr</a></td> <td>Parse a Python file and retrieve classes, functions/methods and attributes.</td> </tr><tr>
--- a/E5Gui/E5TextEditSearchWidget.py Sun Nov 19 13:06:01 2017 +0100 +++ b/E5Gui/E5TextEditSearchWidget.py Sat Dec 02 12:40:22 2017 +0100 @@ -9,35 +9,38 @@ from __future__ import unicode_literals -from PyQt5.QtCore import pyqtSlot, Qt +from PyQt5.QtCore import pyqtSlot, Qt, QMetaObject, QSize from PyQt5.QtGui import QPalette, QBrush, QColor, QTextDocument, QTextCursor -from PyQt5.QtWidgets import QWidget +from PyQt5.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLabel, \ + QComboBox, QCheckBox, QToolButton, QSizePolicy -from .Ui_E5TextEditSearchWidget import Ui_E5TextEditSearchWidget +from E5Gui.E5ComboBox import E5ClearableComboBox import UI.PixmapCache -class E5TextEditSearchWidget(QWidget, Ui_E5TextEditSearchWidget): +class E5TextEditSearchWidget(QWidget): """ Class implementing a horizontal search widget for QTextEdit. """ - def __init__(self, parent=None): + def __init__(self, parent=None, widthForHeight=True): """ Constructor - @param parent reference to the parent widget (QWidget) + @param parent reference to the parent widget + @type QWidget + @param widthForHeight flag indicating to prefer width for height. + If this parameter is False, some widgets are shown in a third + line. + @type bool """ super(E5TextEditSearchWidget, self).__init__(parent) - self.setupUi(self) + self.__setupUi(widthForHeight) self.__textedit = None self.__texteditType = "" self.__findBackwards = True - self.findPrevButton.setIcon(UI.PixmapCache.getIcon("1leftarrow.png")) - self.findNextButton.setIcon(UI.PixmapCache.getIcon("1rightarrow.png")) - self.__defaultBaseColor = \ self.findtextCombo.lineEdit().palette().color(QPalette.Base) self.__defaultTextColor = \ @@ -54,6 +57,97 @@ self.setFocusProxy(self.findtextCombo) + def __setupUi(self, widthForHeight): + """ + Private method to generate the UI. + + @param widthForHeight flag indicating to prefer width for height + @type bool + """ + self.setObjectName("E5TextEditSearchWidget") + + self.verticalLayout = QVBoxLayout(self) + self.verticalLayout.setObjectName("verticalLayout") + self.verticalLayout.setContentsMargins(0, 0, 0, 0) + + # row 1 of widgets + self.horizontalLayout1 = QHBoxLayout() + self.horizontalLayout1.setObjectName("horizontalLayout1") + + self.label = QLabel(self) + self.label.setObjectName("label") + self.label.setText(self.tr("Find:")) + self.horizontalLayout1.addWidget(self.label) + + self.findtextCombo = E5ClearableComboBox(self) + sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth( + self.findtextCombo.sizePolicy().hasHeightForWidth()) + self.findtextCombo.setSizePolicy(sizePolicy) + self.findtextCombo.setMinimumSize(QSize(200, 0)) + self.findtextCombo.setEditable(True) + self.findtextCombo.setInsertPolicy(QComboBox.InsertAtTop) + self.findtextCombo.setDuplicatesEnabled(False) + self.findtextCombo.setObjectName("findtextCombo") + self.horizontalLayout1.addWidget(self.findtextCombo) + + # row 2 (maybe) of widgets + self.horizontalLayout2 = QHBoxLayout() + self.horizontalLayout2.setObjectName("horizontalLayout2") + + self.caseCheckBox = QCheckBox(self) + self.caseCheckBox.setObjectName("caseCheckBox") + self.caseCheckBox.setText(self.tr("Match case")) + self.horizontalLayout2.addWidget(self.caseCheckBox) + + self.wordCheckBox = QCheckBox(self) + self.wordCheckBox.setObjectName("wordCheckBox") + self.wordCheckBox.setText(self.tr("Whole word")) + self.horizontalLayout2.addWidget(self.wordCheckBox) + + # layout for the navigation buttons + self.horizontalLayout3 = QHBoxLayout() + self.horizontalLayout3.setSpacing(0) + self.horizontalLayout3.setObjectName("horizontalLayout3") + + self.findPrevButton = QToolButton(self) + self.findPrevButton.setObjectName("findPrevButton") + self.findPrevButton.setToolTip(self.tr( + "Press to find the previous occurrence")) + self.findPrevButton.setIcon(UI.PixmapCache.getIcon("1leftarrow.png")) + self.horizontalLayout3.addWidget(self.findPrevButton) + + self.findNextButton = QToolButton(self) + self.findNextButton.setObjectName("findNextButton") + self.findNextButton.setToolTip(self.tr( + "Press to find the next occurrence")) + self.findNextButton.setIcon(UI.PixmapCache.getIcon("1rightarrow.png")) + self.horizontalLayout3.addWidget(self.findNextButton) + + self.horizontalLayout2.addLayout(self.horizontalLayout3) + + # info label (in row 2 or 3) + self.infoLabel = QLabel(self) + self.infoLabel.setText("") + self.infoLabel.setObjectName("infoLabel") + + # place everything together + self.verticalLayout.addLayout(self.horizontalLayout1) + if widthForHeight: + self.horizontalLayout1.addLayout(self.horizontalLayout2) + else: + self.verticalLayout.addLayout(self.horizontalLayout2) + self.verticalLayout.addWidget(self.infoLabel) + + QMetaObject.connectSlotsByName(self) + + self.setTabOrder(self.findtextCombo, self.caseCheckBox) + self.setTabOrder(self.caseCheckBox, self.wordCheckBox) + self.setTabOrder(self.wordCheckBox, self.findPrevButton) + self.setTabOrder(self.findPrevButton, self.findNextButton) + def attachTextEdit(self, textedit, editType="QTextEdit"): """ Public method to attach a QTextEdit widget.
--- a/E5Gui/E5TextEditSearchWidget.ui Sun Nov 19 13:06:01 2017 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,118 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>E5TextEditSearchWidget</class> - <widget class="QWidget" name="E5TextEditSearchWidget"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>475</width> - <height>43</height> - </rect> - </property> - <layout class="QGridLayout" name="gridLayout"> - <property name="leftMargin"> - <number>0</number> - </property> - <property name="topMargin"> - <number>0</number> - </property> - <property name="rightMargin"> - <number>0</number> - </property> - <property name="bottomMargin"> - <number>0</number> - </property> - <item row="0" column="0"> - <widget class="QLabel" name="label"> - <property name="text"> - <string>Find:</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="E5ClearableComboBox" name="findtextCombo"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>200</width> - <height>0</height> - </size> - </property> - <property name="editable"> - <bool>true</bool> - </property> - <property name="insertPolicy"> - <enum>QComboBox::InsertAtTop</enum> - </property> - <property name="duplicatesEnabled"> - <bool>false</bool> - </property> - </widget> - </item> - <item row="0" column="2"> - <widget class="QCheckBox" name="caseCheckBox"> - <property name="text"> - <string>Match case</string> - </property> - </widget> - </item> - <item row="0" column="3"> - <widget class="QCheckBox" name="wordCheckBox"> - <property name="text"> - <string>Whole word</string> - </property> - </widget> - </item> - <item row="0" column="4"> - <layout class="QHBoxLayout" name="horizontalLayout"> - <property name="spacing"> - <number>0</number> - </property> - <item> - <widget class="QToolButton" name="findPrevButton"> - <property name="toolTip"> - <string>Press to find the previous occurrence</string> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="findNextButton"> - <property name="toolTip"> - <string>Press to find the next occurrence</string> - </property> - </widget> - </item> - </layout> - </item> - <item row="1" column="0" colspan="5"> - <widget class="QLabel" name="infoLabel"> - <property name="text"> - <string/> - </property> - </widget> - </item> - </layout> - </widget> - <customwidgets> - <customwidget> - <class>E5ClearableComboBox</class> - <extends>QComboBox</extends> - <header>E5Gui/E5ComboBox.h</header> - </customwidget> - </customwidgets> - <tabstops> - <tabstop>findtextCombo</tabstop> - <tabstop>caseCheckBox</tabstop> - <tabstop>wordCheckBox</tabstop> - <tabstop>findPrevButton</tabstop> - <tabstop>findNextButton</tabstop> - </tabstops> - <resources/> - <connections/> -</ui>
--- a/E5XML/Config.py Sun Nov 19 13:06:01 2017 +0100 +++ b/E5XML/Config.py Sat Dec 02 12:40:22 2017 +0100 @@ -11,7 +11,7 @@ multiProjectFileFormatVersion = "5.1" # version number of the project file -projectFileFormatVersion = "5.1" +projectFileFormatVersion = "6.0" # version number of the user project file userProjectFileFormatVersion = "4.0"
--- a/E5XML/ProjectReader.py Sun Nov 19 13:06:01 2017 +0100 +++ b/E5XML/ProjectReader.py Sat Dec 02 12:40:22 2017 +0100 @@ -19,7 +19,7 @@ """ Class for reading an XML project file. """ - supportedVersions = ["4.6", "5.0", "5.1"] + supportedVersions = ["4.6", "5.0", "5.1", "6.0"] def __init__(self, device, project): """ @@ -99,6 +99,8 @@ self.__readFiles("Resources", "Resource", "RESOURCES") elif self.name() == "Interfaces": self.__readFiles("Interfaces", "Interface", "INTERFACES") + elif self.name() == "Protocols": + self.__readFiles("Protocols", "Protocol", "PROTOCOLS") elif self.name() == "Others": self.__readFiles("Others", "Other", "OTHERS") elif self.name() == "MainScript":
--- a/E5XML/ProjectWriter.py Sun Nov 19 13:06:01 2017 +0100 +++ b/E5XML/ProjectWriter.py Sat Dec 02 12:40:22 2017 +0100 @@ -112,24 +112,28 @@ self.writeAttribute("index", str(int(self.pdata["EOL"]))) # do the sources - self.writeStartElement("Sources") - for name in sorted(self.pdata["SOURCES"]): - self.writeTextElement( - "Source", Utilities.fromNativeSeparators(name)) - self.writeEndElement() + if self.pdata["SOURCES"]: + self.writeStartElement("Sources") + for name in sorted(self.pdata["SOURCES"]): + self.writeTextElement( + "Source", Utilities.fromNativeSeparators(name)) + self.writeEndElement() # do the forms - self.writeStartElement("Forms") - for name in sorted(self.pdata["FORMS"]): - self.writeTextElement("Form", Utilities.fromNativeSeparators(name)) - self.writeEndElement() + if self.pdata["FORMS"]: + self.writeStartElement("Forms") + for name in sorted(self.pdata["FORMS"]): + self.writeTextElement( + "Form", Utilities.fromNativeSeparators(name)) + self.writeEndElement() # do the translations - self.writeStartElement("Translations") - for name in sorted(self.pdata["TRANSLATIONS"]): - self.writeTextElement( - "Translation", Utilities.fromNativeSeparators(name)) - self.writeEndElement() + if self.pdata["TRANSLATIONS"]: + self.writeStartElement("Translations") + for name in sorted(self.pdata["TRANSLATIONS"]): + self.writeTextElement( + "Translation", Utilities.fromNativeSeparators(name)) + self.writeEndElement() # do the translation exceptions if self.pdata["TRANSLATIONEXCEPTIONS"]: @@ -141,25 +145,36 @@ self.writeEndElement() # do the resources - self.writeStartElement("Resources") - for name in sorted(self.pdata["RESOURCES"]): - self.writeTextElement( - "Resource", Utilities.fromNativeSeparators(name)) - self.writeEndElement() + if self.pdata["RESOURCES"]: + self.writeStartElement("Resources") + for name in sorted(self.pdata["RESOURCES"]): + self.writeTextElement( + "Resource", Utilities.fromNativeSeparators(name)) + self.writeEndElement() # do the interfaces (IDL) - self.writeStartElement("Interfaces") - for name in sorted(self.pdata["INTERFACES"]): - self.writeTextElement( - "Interface", Utilities.fromNativeSeparators(name)) - self.writeEndElement() + if self.pdata["INTERFACES"]: + self.writeStartElement("Interfaces") + for name in sorted(self.pdata["INTERFACES"]): + self.writeTextElement( + "Interface", Utilities.fromNativeSeparators(name)) + self.writeEndElement() + + # do the protocols (protobuf) + if self.pdata["PROTOCOLS"]: + self.writeStartElement("Protocols") + for name in sorted(self.pdata["PROTOCOLS"]): + self.writeTextElement( + "Protocol", Utilities.fromNativeSeparators(name)) + self.writeEndElement() # do the others - self.writeStartElement("Others") - for name in sorted(self.pdata["OTHERS"]): - self.writeTextElement( - "Other", Utilities.fromNativeSeparators(name)) - self.writeEndElement() + if self.pdata["OTHERS"]: + self.writeStartElement("Others") + for name in sorted(self.pdata["OTHERS"]): + self.writeTextElement( + "Other", Utilities.fromNativeSeparators(name)) + self.writeEndElement() # do the main script if self.pdata["MAINSCRIPT"]:
--- a/Preferences/ConfigurationDialog.py Sun Nov 19 13:06:01 2017 +0100 +++ b/Preferences/ConfigurationDialog.py Sat Dec 02 12:40:22 2017 +0100 @@ -12,7 +12,8 @@ import os import types -from PyQt5.QtCore import pyqtSignal, pyqtSlot, PYQT_VERSION, Qt, QMetaObject, QRect +from PyQt5.QtCore import pyqtSignal, pyqtSlot, PYQT_VERSION, Qt, QMetaObject, \ + QRect from PyQt5.QtGui import QPixmap from PyQt5.QtWidgets import QSizePolicy, QSpacerItem, QWidget, QTreeWidget, \ QStackedWidget, QDialog, QSplitter, QScrollArea, QApplication, \ @@ -178,6 +179,9 @@ "printerPage": [self.tr("Printer"), "preferences-printer.png", "PrinterPage", None, None], + "protobufPage": + [self.tr("Protobuf"), "protobuf.png", + "ProtobufPage", None, None], "pythonPage": [self.tr("Python"), "preferences-python.png", "PythonPage", None, None],
--- a/Preferences/ConfigurationPages/DebuggerGeneralPage.py Sun Nov 19 13:06:01 2017 +0100 +++ b/Preferences/ConfigurationPages/DebuggerGeneralPage.py Sat Dec 02 12:40:22 2017 +0100 @@ -143,6 +143,8 @@ Preferences.getDebugger("ShowExceptionInShell")) self.autoViewSourcecodeCheckBox.setChecked( Preferences.getDebugger("AutoViewSourceCode")) + self.maxSizeSpinBox.setValue( + Preferences.getDebugger("MaxVariableSize")) def save(self): """ @@ -227,6 +229,9 @@ Preferences.setDebugger( "AutoViewSourceCode", self.autoViewSourcecodeCheckBox.isChecked()) + Preferences.setDebugger( + "MaxVariableSize", + self.maxSizeSpinBox.value()) def on_allowedHostsList_currentItemChanged(self, current, previous): """
--- a/Preferences/ConfigurationPages/DebuggerGeneralPage.ui Sun Nov 19 13:06:01 2017 +0100 +++ b/Preferences/ConfigurationPages/DebuggerGeneralPage.ui Sat Dec 02 12:40:22 2017 +0100 @@ -10,7 +10,7 @@ <height>1600</height> </rect> </property> - <layout class="QVBoxLayout" name="verticalLayout_6"> + <layout class="QVBoxLayout" name="verticalLayout_7"> <item> <widget class="QLabel" name="headerLabel"> <property name="text"> @@ -566,19 +566,77 @@ </widget> </item> <item> - <widget class="QGroupBox" name="groupBox_10"> + <widget class="QGroupBox" name="groupBox_11"> <property name="title"> - <string>Local Variables Viewer</string> + <string>Variables Viewer</string> </property> - <layout class="QVBoxLayout" name="verticalLayout_5"> + <layout class="QVBoxLayout" name="verticalLayout_6"> <item> - <widget class="QCheckBox" name="autoViewSourcecodeCheckBox"> - <property name="toolTip"> - <string>Automatically view source code when user changes the callstack frame in the callstack viewer.</string> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Max. Variable Size:</string> + </property> + </widget> + </item> + <item> + <widget class="QSpinBox" name="maxSizeSpinBox"> + <property name="toolTip"> + <string>Enter the maximum size of a variable to be shown (0 = no limit)</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + <property name="specialValueText"> + <string>no limit</string> + </property> + <property name="showGroupSeparator" stdset="0"> + <bool>true</bool> + </property> + <property name="suffix"> + <string> Bytes</string> + </property> + <property name="maximum"> + <number>1063256064</number> + </property> + <property name="singleStep"> + <number>16384</number> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_3"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <widget class="QGroupBox" name="groupBox_10"> + <property name="title"> + <string>Local Variables Viewer</string> </property> - <property name="text"> - <string>Automatically view source code</string> - </property> + <layout class="QVBoxLayout" name="verticalLayout_5"> + <item> + <widget class="QCheckBox" name="autoViewSourcecodeCheckBox"> + <property name="toolTip"> + <string>Automatically view source code when user changes the callstack frame in the callstack viewer.</string> + </property> + <property name="text"> + <string>Automatically view source code</string> + </property> + </widget> + </item> + </layout> </widget> </item> </layout> @@ -627,6 +685,7 @@ <tabstop>debugThreeStateBreakPoint</tabstop> <tabstop>exceptionBreakCheckBox</tabstop> <tabstop>exceptionShellCheckBox</tabstop> + <tabstop>maxSizeSpinBox</tabstop> <tabstop>autoViewSourcecodeCheckBox</tabstop> </tabstops> <resources/>
--- a/Preferences/ConfigurationPages/EditorHighlightingStylesPage.py Sun Nov 19 13:06:01 2017 +0100 +++ b/Preferences/ConfigurationPages/EditorHighlightingStylesPage.py Sat Dec 02 12:40:22 2017 +0100 @@ -479,10 +479,13 @@ @param lexers dictionary of lexer objects for which to import the styles """ + from eric6config import getConfig + stylesDir = getConfig("ericStylesDir") + fn = E5FileDialog.getOpenFileName( self, self.tr("Import Highlighting Styles"), - "", + stylesDir, self.tr("Highlighting styles file (*.e4h)")) if not fn:
--- a/Preferences/ConfigurationPages/InterfacePage.py Sun Nov 19 13:06:01 2017 +0100 +++ b/Preferences/ConfigurationPages/InterfacePage.py Sat Dec 02 12:40:22 2017 +0100 @@ -42,6 +42,7 @@ self.styleSheetPicker.setFilters(self.tr( "Qt Style Sheets (*.qss);;Cascading Style Sheets (*.css);;" "All files (*)")) + self.styleSheetPicker.setDefaultDirectory(getConfig("ericStylesDir")) # set initial values self.__populateStyleCombo()
--- a/Preferences/ConfigurationPages/ProjectBrowserPage.py Sun Nov 19 13:06:01 2017 +0100 +++ b/Preferences/ConfigurationPages/ProjectBrowserPage.py Sat Dec 02 12:40:22 2017 +0100 @@ -93,7 +93,7 @@ """ from Project.ProjectBrowserFlags import SourcesBrowserFlag, \ FormsBrowserFlag, ResourcesBrowserFlag, TranslationsBrowserFlag, \ - InterfacesBrowserFlag, OthersBrowserFlag + InterfacesBrowserFlag, OthersBrowserFlag, ProtocolsBrowserFlag flags = 0 if self.sourcesBrowserCheckBox.isChecked(): @@ -108,6 +108,8 @@ flags |= InterfacesBrowserFlag if self.othersBrowserCheckBox.isChecked(): flags |= OthersBrowserFlag + if self.protocolsBrowserCheckBox.isChecked(): + flags |= ProtocolsBrowserFlag self.__projectBrowserFlags[projectType] = flags @@ -120,7 +122,7 @@ """ from Project.ProjectBrowserFlags import SourcesBrowserFlag, \ FormsBrowserFlag, ResourcesBrowserFlag, TranslationsBrowserFlag, \ - InterfacesBrowserFlag, OthersBrowserFlag + InterfacesBrowserFlag, OthersBrowserFlag, ProtocolsBrowserFlag flags = self.__projectBrowserFlags[projectType] @@ -132,6 +134,7 @@ self.interfacesBrowserCheckBox.setChecked( flags & InterfacesBrowserFlag) self.othersBrowserCheckBox.setChecked(flags & OthersBrowserFlag) + self.protocolsBrowserCheckBox.setChecked(flags & ProtocolsBrowserFlag) @pyqtSlot(int) def on_projectTypeCombo_activated(self, index):
--- a/Preferences/ConfigurationPages/ProjectBrowserPage.ui Sun Nov 19 13:06:01 2017 +0100 +++ b/Preferences/ConfigurationPages/ProjectBrowserPage.ui Sat Dec 02 12:40:22 2017 +0100 @@ -10,7 +10,7 @@ <height>497</height> </rect> </property> - <layout class="QVBoxLayout" name="verticalLayout"> + <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <widget class="QLabel" name="headerLabel"> <property name="text"> @@ -81,7 +81,7 @@ <property name="title"> <string>Visible Project Browsers</string> </property> - <layout class="QVBoxLayout"> + <layout class="QVBoxLayout" name="verticalLayout"> <item> <layout class="QHBoxLayout"> <item> @@ -107,7 +107,7 @@ </layout> </item> <item> - <layout class="QGridLayout"> + <layout class="QGridLayout" name="gridLayout"> <item row="0" column="0"> <widget class="QCheckBox" name="sourcesBrowserCheckBox"> <property name="toolTip"> @@ -119,12 +119,12 @@ </widget> </item> <item row="0" column="1"> - <widget class="QCheckBox" name="translationsBrowserCheckBox"> + <widget class="QCheckBox" name="interfacesBrowserCheckBox"> <property name="toolTip"> - <string>Select to show the translations browser</string> + <string>Select to show the interfaces (IDL) browser</string> </property> <property name="text"> - <string>Translations Browser</string> + <string>Interfaces (IDL) Browser</string> </property> </widget> </item> @@ -139,12 +139,12 @@ </widget> </item> <item row="1" column="1"> - <widget class="QCheckBox" name="interfacesBrowserCheckBox"> + <widget class="QCheckBox" name="protocolsBrowserCheckBox"> <property name="toolTip"> - <string>Select to show the interfaces (IDL) browser</string> + <string>Select to show the protocols (protobuf) browser</string> </property> <property name="text"> - <string>Interfaces (IDL) Browser</string> + <string>Protocols (protobuf) Browser</string> </property> </widget> </item> @@ -168,6 +168,16 @@ </property> </widget> </item> + <item row="3" column="0"> + <widget class="QCheckBox" name="translationsBrowserCheckBox"> + <property name="toolTip"> + <string>Select to show the translations browser</string> + </property> + <property name="text"> + <string>Translations Browser</string> + </property> + </widget> + </item> </layout> </item> </layout> @@ -236,6 +246,7 @@ <tabstop>resourcesBrowserCheckBox</tabstop> <tabstop>translationsBrowserCheckBox</tabstop> <tabstop>interfacesBrowserCheckBox</tabstop> + <tabstop>protocolsBrowserCheckBox</tabstop> <tabstop>othersBrowserCheckBox</tabstop> <tabstop>followEditorCheckBox</tabstop> <tabstop>followCursorLineCheckBox</tabstop>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Preferences/ConfigurationPages/ProtobufPage.py Sat Dec 02 12:40:22 2017 +0100 @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2017 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing the protobuf configuration page. +""" + +from __future__ import unicode_literals + +from E5Gui.E5PathPicker import E5PathPickerModes + +from .ConfigurationPageBase import ConfigurationPageBase +from .Ui_ProtobufPage import Ui_ProtobufPage + +import Preferences + + +class ProtobufPage(ConfigurationPageBase, Ui_ProtobufPage): + """ + Class implementing the protobuf configuration page. + """ + def __init__(self): + """ + Constructor + """ + super(ProtobufPage, self).__init__() + self.setupUi(self) + self.setObjectName("ProtobufPage") + + self.protocPicker.setMode(E5PathPickerModes.OpenFileMode) + self.protocPicker.setToolTip(self.tr( + "Press to select the Protobuf compiler via a file selection" + " dialog.")) + + self.grpcPythonPicker.setMode(E5PathPickerModes.OpenFileMode) + self.grpcPythonPicker.setToolTip(self.tr( + "Press to select the Python interpreter containing the gRPC" + " compiler via a file selection dialog.")) + + # set initial values + self.protocPicker.setText(Preferences.getProtobuf("protoc")) + self.grpcPythonPicker.setText(Preferences.getProtobuf("grpcPython")) + + def save(self): + """ + Public slot to save the protobuf configuration. + """ + Preferences.setProtobuf("protoc", self.protocPicker.text()) + Preferences.setProtobuf("grpcPython", self.grpcPythonPicker.text()) + + +def create(dlg): + """ + Module function to create the configuration page. + + @param dlg reference to the configuration dialog + @return reference to the instantiated page (ConfigurationPageBase) + """ + page = ProtobufPage() + return page
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Preferences/ConfigurationPages/ProtobufPage.ui Sat Dec 02 12:40:22 2017 +0100 @@ -0,0 +1,111 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ProtobufPage</class> + <widget class="QWidget" name="ProtobufPage"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>589</width> + <height>490</height> + </rect> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QLabel" name="headerLabel"> + <property name="text"> + <string><b>Configure Protobuf support</b></string> + </property> + </widget> + </item> + <item> + <widget class="Line" name="line13"> + <property name="frameShape"> + <enum>QFrame::HLine</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Sunken</enum> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox_2"> + <property name="title"> + <string>Protobuf Compiler</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="E5PathPicker" name="protocPicker" native="true"> + <property name="focusPolicy"> + <enum>Qt::StrongFocus</enum> + </property> + <property name="toolTip"> + <string>Enter the path to the protobuf compiler.</string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="textLabel1_5"> + <property name="text"> + <string><b>Note:</b> Leave this entry empty to use the default value (protoc or protoc.exe).</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox_3"> + <property name="title"> + <string>gRPC Compiler</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <item> + <widget class="E5PathPicker" name="grpcPythonPicker" native="true"> + <property name="focusPolicy"> + <enum>Qt::StrongFocus</enum> + </property> + <property name="toolTip"> + <string>Enter the path of the Python interpreter containing the gRPC compiler.</string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="textLabel1_6"> + <property name="text"> + <string><b>Note:</b> Leave this entry empty to use the Python interpreter of eric.</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>81</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <customwidgets> + <customwidget> + <class>E5PathPicker</class> + <extends>QWidget</extends> + <header>E5Gui/E5PathPicker.h</header> + <container>1</container> + </customwidget> + </customwidgets> + <resources/> + <connections/> +</ui>
--- a/Preferences/ProgramsDialog.py Sun Nov 19 13:06:01 2017 +0100 +++ b/Preferences/ProgramsDialog.py Sat Dec 02 12:40:22 2017 +0100 @@ -15,6 +15,7 @@ import os import re +import sys from PyQt5.QtCore import pyqtSlot, Qt, QProcess from PyQt5.QtGui import QCursor @@ -197,13 +198,30 @@ Utilities.isWindowsPlatform() and "rbrcc.exe" or "rbrcc", '-version', 'Ruby Resource Compiler', -1) - # 5. do the CORBA programs + # 5. do the CORBA and Protobuf programs # 5a. omniORB exe = Preferences.getCorba("omniidl") + if not exe: + exe = "omniidl" if Utilities.isWindowsPlatform(): exe += ".exe" self.__createProgramEntry( self.tr("CORBA IDL Compiler"), exe, '-V', 'omniidl', -1) + # 5b. protobuf + exe = Preferences.getProtobuf("protoc") + if not exe: + exe = "protoc" + if Utilities.isWindowsPlatform(): + exe += ".exe" + self.__createProgramEntry( + self.tr("Protobuf Compiler"), exe, '--version', 'libprotoc', -1) + # 5c. grpc + exe = Preferences.getProtobuf("grpcPython") + if not exe: + exe = sys.executable + self.__createProgramEntry( + self.tr("gRPC Compiler"), exe, '--version', 'libprotoc', -1, + exeModule=['-m', 'grpc_tools.protoc']) # 6. do the spell checking entry try: @@ -243,6 +261,8 @@ pm = e5App().getObject("PluginManager") for info in pm.getPluginExeDisplayData(): if info["programEntry"]: + if "exeModule" not in info: + info["exeModule"] = None self.__createProgramEntry( info["header"], info["exe"], @@ -251,6 +271,7 @@ versionPosition=info["versionPosition"], version=info["version"], versionCleanup=info["versionCleanup"], + exeModule=info["exeModule"], ) else: self.__createEntry( @@ -267,14 +288,15 @@ def __createProgramEntry(self, description, exe, versionCommand="", versionStartsWith="", versionPosition=0, version="", - versionCleanup=None, versionRe=None): + versionCleanup=None, versionRe=None, + exeModule=None): """ Private method to generate a program entry. @param description descriptive text (string) @param exe name of the executable program (string) @param versionCommand command line switch to get the version info - (string) if this is empty, the given version will be shown. + (str). If this is empty, the given version will be shown. @param versionStartsWith start of line identifying version info (string) @param versionPosition index of part containing the version info @@ -284,6 +306,9 @@ start and stop for the version string (tuple of integers) @keyparam versionRe regexp to determine the line identifying version info (string). Takes precedence over versionStartsWith. + @keyparam exeModule list of command line parameters to execute a module + with the program given in exe (e.g. to execute a Python module) + (list of str) @return version string of detected or given version (string) """ itmList = self.programsList.findItems( @@ -310,7 +335,11 @@ versionPosition: proc = QProcess() proc.setProcessChannelMode(QProcess.MergedChannels) - proc.start(exe, [versionCommand]) + if exeModule: + args = exeModule[:] + [versionCommand] + else: + args = [versionCommand] + proc.start(exe, args) finished = proc.waitForFinished(10000) if finished: output = str(proc.readAllStandardOutput(), @@ -335,7 +364,12 @@ version = self.tr("(unknown)") else: version = self.tr("(not executable)") - QTreeWidgetItem(itm, [exe, version]) + if exeModule: + QTreeWidgetItem(itm, [ + "{0} {1}".format(exe, " ".join(exeModule)), + version]) + else: + QTreeWidgetItem(itm, [exe, version]) itm.setExpanded(True) else: itm.setText(1, self.tr("(not found)"))
--- a/Preferences/__init__.py Sun Nov 19 13:06:01 2017 +0100 +++ b/Preferences/__init__.py Sat Dec 02 12:40:22 2017 +0100 @@ -53,7 +53,7 @@ from Project.ProjectBrowserFlags import SourcesBrowserFlag, FormsBrowserFlag, \ ResourcesBrowserFlag, TranslationsBrowserFlag, InterfacesBrowserFlag, \ - OthersBrowserFlag, AllBrowsersFlag + OthersBrowserFlag, ProtocolsBrowserFlag, AllBrowsersFlag try: from Helpviewer.FlashCookieManager.FlashCookieUtilities import \ @@ -112,6 +112,7 @@ "PathTranslationLocal": "", "NetworkInterface": "127.0.0.1", "AutoViewSourceCode": False, + "MaxVariableSize": 0, # Bytes, 0 = no limit } debuggerDefaults["AllowedHosts"] = ["127.0.0.1", "::1%0"] if sys.version_info[0] == 2: @@ -779,54 +780,63 @@ ResourcesBrowserFlag | TranslationsBrowserFlag | InterfacesBrowserFlag | - OthersBrowserFlag), + OthersBrowserFlag | + ProtocolsBrowserFlag), "Qt4C": ( SourcesBrowserFlag | ResourcesBrowserFlag | TranslationsBrowserFlag | InterfacesBrowserFlag | - OthersBrowserFlag), + OthersBrowserFlag | + ProtocolsBrowserFlag), "PyQt5": ( SourcesBrowserFlag | FormsBrowserFlag | ResourcesBrowserFlag | TranslationsBrowserFlag | InterfacesBrowserFlag | - OthersBrowserFlag), + OthersBrowserFlag | + ProtocolsBrowserFlag), "PyQt5C": ( SourcesBrowserFlag | ResourcesBrowserFlag | TranslationsBrowserFlag | InterfacesBrowserFlag | - OthersBrowserFlag), + OthersBrowserFlag | + ProtocolsBrowserFlag), "E6Plugin": ( SourcesBrowserFlag | FormsBrowserFlag | ResourcesBrowserFlag | TranslationsBrowserFlag | InterfacesBrowserFlag | - OthersBrowserFlag), + OthersBrowserFlag | + ProtocolsBrowserFlag), "Console": ( SourcesBrowserFlag | InterfacesBrowserFlag | - OthersBrowserFlag), + OthersBrowserFlag | + ProtocolsBrowserFlag), "Other": ( SourcesBrowserFlag | InterfacesBrowserFlag | - OthersBrowserFlag), + OthersBrowserFlag | + ProtocolsBrowserFlag), "PySide": ( SourcesBrowserFlag | FormsBrowserFlag | ResourcesBrowserFlag | TranslationsBrowserFlag | InterfacesBrowserFlag | - OthersBrowserFlag), + OthersBrowserFlag | + ProtocolsBrowserFlag), "PySideC": ( SourcesBrowserFlag | ResourcesBrowserFlag | TranslationsBrowserFlag | InterfacesBrowserFlag | - OthersBrowserFlag), + OthersBrowserFlag | + ProtocolsBrowserFlag), } # defaults for the project browser colour settings @@ -1269,7 +1279,13 @@ # defaults for corba related stuff corbaDefaults = { - "omniidl": "omniidl" + "omniidl": "" + } + + # defaults for protobuf related stuff + protobufDefaults = { + "protoc": "", + "grpcPython": "", } # defaults for user related stuff @@ -1713,7 +1729,7 @@ ]: return toBool(prefClass.settings.value( "Debugger/" + key, prefClass.debuggerDefaults[key])) - elif key in ["PassiveDbgPort"]: + elif key in ["PassiveDbgPort", "MaxVariableSize"]: return int( prefClass.settings.value( "Debugger/" + key, prefClass.debuggerDefaults[key])) @@ -3138,7 +3154,7 @@ def getCorba(key, prefClass=Prefs): """ - Module function to retrieve the various corba settings. + Module function to retrieve the various Corba settings. @param key the key of the value to get @param prefClass preferences class used as the storage area @@ -3150,7 +3166,7 @@ def setCorba(key, value, prefClass=Prefs): """ - Module function to store the various corba settings. + Module function to store the various Corba settings. @param key the key of the setting to be set @param value the value to be set @@ -3159,6 +3175,35 @@ prefClass.settings.setValue("Corba/" + key, value) +def getProtobuf(key, prefClass=Prefs): + """ + Module function to retrieve the various protobuf settings. + + @param key the key of the value to get + @type str + @param prefClass preferences class used as the storage area + @type Prefs + @return the requested protobuf setting + @rtype any + """ + return prefClass.settings.value( + "Protobuf/" + key, prefClass.protobufDefaults[key]) + + +def setProtobuf(key, value, prefClass=Prefs): + """ + Module function to store the various protobuf settings. + + @param key the key of the setting to be set + @type str + @param value the value to be set + @type any + @param prefClass preferences class used as the storage area + @type Prefs + """ + prefClass.settings.setValue("Protobuf/" + key, value) + + def getUser(key, prefClass=Prefs): """ Module function to retrieve the various user settings.
--- a/Project/AddDirectoryDialog.py Sun Nov 19 13:06:01 2017 +0100 +++ b/Project/AddDirectoryDialog.py Sat Dec 02 12:40:22 2017 +0100 @@ -58,6 +58,9 @@ elif fileTypeFilter == 'interface': self.filterComboBox.addItem( self.tr("Interface Files"), "INTERFACES") + elif fileTypeFilter == 'protocol': + self.filterComboBox.addItem( + self.tr("Protocol Files"), "PROTOCOLS") elif fileTypeFilter == 'others': self.filterComboBox.addItem( self.tr("Other Files (*)"), "OTHERS") @@ -72,6 +75,8 @@ self.filterComboBox.addItem( self.tr("Interface Files"), "INTERFACES") self.filterComboBox.addItem( + self.tr("Protocol Files"), "PROTOCOLS") + self.filterComboBox.addItem( self.tr("Other Files (*)"), "OTHERS") self.filterComboBox.setCurrentIndex(0)
--- a/Project/AddFileDialog.py Sun Nov 19 13:06:01 2017 +0100 +++ b/Project/AddFileDialog.py Sat Dec 02 12:40:22 2017 +0100 @@ -73,6 +73,7 @@ "FORMS": [], "RESOURCES": [], "INTERFACES": [], + "PROTOCOLS": [], "TRANSLATIONS": [], } for pattern, filetype in list(self.filetypes.items()): @@ -83,13 +84,15 @@ "Forms Files ({1});;" "Resource Files ({2});;" "Interface Files ({3});;" - "Translation Files ({4});;" + "Protocol Files ({4});;" + "Translation Files ({5});;" "All Files (*)")\ .format( " ".join(patterns["SOURCES"]), " ".join(patterns["FORMS"]), " ".join(patterns["RESOURCES"]), " ".join(patterns["INTERFACES"]), + " ".join(patterns["PROTOCOLS"]), " ".join(patterns["TRANSLATIONS"])) caption = self.tr("Select Files") elif self.fileTypeFilter == 'form': @@ -124,6 +127,14 @@ dfilter = self.tr("Interface Files ({0})")\ .format(" ".join(patterns)) caption = self.tr("Select interface files") + elif self.fileTypeFilter == 'protocol': + patterns = [] + for pattern, filetype in list(self.filetypes.items()): + if filetype == "PROTOCOLS": + patterns.append(pattern) + dfilter = self.tr("Protocol Files ({0})")\ + .format(" ".join(patterns)) + caption = self.tr("Select protocol files") elif self.fileTypeFilter == 'translation': patterns = [] for pattern, filetype in list(self.filetypes.items()):
--- a/Project/FiletypeAssociationDialog.py Sun Nov 19 13:06:01 2017 +0100 +++ b/Project/FiletypeAssociationDialog.py Sat Dec 02 12:40:22 2017 +0100 @@ -36,11 +36,12 @@ # keep these lists in sync self.filetypes = ["SOURCES", "FORMS", "TRANSLATIONS", "RESOURCES", - "INTERFACES", "OTHERS", "__IGNORE__"] + "INTERFACES", "PROTOCOLS", "OTHERS", "__IGNORE__"] self.filetypeStrings = [self.tr("Sources"), self.tr("Forms"), self.tr("Translations"), self.tr("Resources"), self.tr("Interfaces"), + self.tr("Protocols"), self.tr("Others"), self.tr("Ignore")] self.filetypeCombo.addItems(self.filetypeStrings)
--- a/Project/Project.py Sun Nov 19 13:06:01 2017 +0100 +++ b/Project/Project.py Sat Dec 02 12:40:22 2017 +0100 @@ -59,6 +59,8 @@ @signal projectSourceRemoved(str) emitted after a source was removed @signal projectInterfaceAdded(str) emitted after a new IDL file was added @signal projectInterfaceRemoved(str) emitted after a IDL file was removed + @signal projectProtocolAdded(str) emitted after a new proto file was added + @signal projectProtocolRemoved(str) emitted after a proto file was removed @signal projectResourceAdded(str) emitted after a new resource file was added @signal projectResourceRemoved(str) emitted after a resource was removed @@ -111,6 +113,8 @@ projectSourceRemoved = pyqtSignal(str) projectInterfaceAdded = pyqtSignal(str) projectInterfaceRemoved = pyqtSignal(str) + projectProtocolAdded = pyqtSignal(str) + projectProtocolRemoved = pyqtSignal(str) projectResourceAdded = pyqtSignal(str) projectResourceRemoved = pyqtSignal(str) projectOthersAdded = pyqtSignal(str) @@ -428,6 +432,7 @@ "FORMS": [], "RESOURCES": [], "INTERFACES": [], + "PROTOCOLS": [], "OTHERS": [], "TRANSLATIONS": [], "TRANSLATIONEXCEPTIONS": [], @@ -544,6 +549,9 @@ # IDL interfaces self.pdata["FILETYPES"]["*.idl"] = "INTERFACES" + # Protobuf Files + self.pdata["FILETYPES"]["*.proto"] = "PROTOCOLS" + # Forms if self.pdata["PROJECTTYPE"] in ["Qt4", "PyQt5", "E6Plugin", "PySide"]: @@ -763,6 +771,7 @@ self.__checkFilesExist("SOURCES") self.__checkFilesExist("FORMS") self.__checkFilesExist("INTERFACES") + self.__checkFilesExist("PROTOCOLS") self.__checkFilesExist("TRANSLATIONS") self.__checkFilesExist("RESOURCES") self.__checkFilesExist("OTHERS") @@ -771,6 +780,7 @@ for fn in self.pdata["SOURCES"] + \ self.pdata["FORMS"] + \ self.pdata["INTERFACES"] + \ + self.pdata["PROTOCOLS"] + \ self.pdata["RESOURCES"] + \ self.pdata["TRANSLATIONS"]: dn = os.path.dirname(fn) @@ -1458,7 +1468,8 @@ if filetype == "__IGNORE__": return - if filetype in ["SOURCES", "FORMS", "INTERFACES", "RESOURCES"]: + if filetype in ["SOURCES", "FORMS", "INTERFACES", "PROTOCOLS", + "RESOURCES"]: if filetype == "SOURCES": if newfn not in self.pdata["SOURCES"]: self.pdata["SOURCES"].append(newfn) @@ -1484,6 +1495,15 @@ dirty = True else: updateModel and self.repopulateItem(newfn) + elif filetype == "PROTOCOLS": + if newfn not in self.pdata["PROTOCOLS"]: + self.pdata["PROTOCOLS"].append(newfn) + self.projectProtocolAdded.emit(newfn) + updateModel and \ + self.__model.addNewItem("PROTOCOLS", newfn) + dirty = True + else: + updateModel and self.repopulateItem(newfn) elif filetype == "RESOURCES": if newfn not in self.pdata["RESOURCES"]: self.pdata["RESOURCES"].append(newfn) @@ -1521,8 +1541,9 @@ Public slot used to add files to the project. @param fileTypeFilter filter to be used by the add file dialog - (string out of source, form, resource, interface, others) + @type str out of source, form, resource, interface, protocol, others @param startdir start directory for the selection dialog + @type str """ if startdir is None: startdir = self.ppath @@ -1672,8 +1693,9 @@ Public method used to add all files of a directory to the project. @param fileTypeFilter filter to be used by the add directory dialog - (string out of source, form, resource, interface, others) - @param startdir start directory for the selection dialog (string) + @type str out of source, form, resource, interface, protocol, others + @param startdir start directory for the selection dialog + @type str """ if startdir is None: startdir = self.ppath @@ -1745,6 +1767,12 @@ """ self.addFiles('interface') + def addProtoFiles(self): + """ + Public slot to add protocol files to the current project. + """ + self.addFiles('protocol') + def addResourceFiles(self): """ Public slot to add Qt resources to the current project. @@ -1777,6 +1805,13 @@ """ self.addDirectory('interface') + def addProtoDir(self): + """ + Public slot to add all protocol files of a directory to the current + project. + """ + self.addDirectory('protocol') + def addResourceDir(self): """ Public slot to add all Qt resource files of a directory to the current @@ -1854,6 +1889,7 @@ fn in self.pdata["FORMS"] or \ fn in self.pdata["TRANSLATIONS"] or \ fn in self.pdata["INTERFACES"] or \ + fn in self.pdata["PROTOCOLS"] or \ fn in self.pdata["RESOURCES"] or \ fn in self.pdata["OTHERS"]: self.renameFileInPdata(oldfn, newfn, isSourceFile) @@ -1890,7 +1926,8 @@ """ filelist = [] start = self.getRelativePath(start) - for key in ["SOURCES", "FORMS", "INTERFACES", "RESOURCES", "OTHERS"]: + for key in ["SOURCES", "FORMS", "INTERFACES", "PROTOCOLS", "RESOURCES", + "OTHERS"]: for entry in self.pdata[key][:]: if entry.startswith(start): filelist.append(os.path.join(self.ppath, entry)) @@ -1904,13 +1941,13 @@ # init data store for the reorganization newPdata = {} - for key in ["SOURCES", "FORMS", "INTERFACES", "RESOURCES", "OTHERS", - "TRANSLATIONS"]: + for key in ["SOURCES", "FORMS", "INTERFACES", "PROTOCOLS", "RESOURCES", + "OTHERS", "TRANSLATIONS"]: newPdata[key] = [] # iterate over all files checking for a reassignment - for key in ["SOURCES", "FORMS", "INTERFACES", "RESOURCES", "OTHERS", - "TRANSLATIONS"]: + for key in ["SOURCES", "FORMS", "INTERFACES", "PROTOCOLS", "RESOURCES", + "OTHERS", "TRANSLATIONS"]: for fn in self.pdata[key][:]: filetype = key bfn = os.path.basename(fn) @@ -1927,8 +1964,8 @@ if reorganized: # copy the reorganized files back to the project - for key in ["SOURCES", "FORMS", "INTERFACES", "RESOURCES", - "OTHERS", "TRANSLATIONS"]: + for key in ["SOURCES", "FORMS", "INTERFACES", "PROTOCOLS", + "RESOURCES", "OTHERS", "TRANSLATIONS"]: self.pdata[key] = newPdata[key][:] # repopulate the model @@ -1944,7 +1981,8 @@ """ olddn = self.getRelativePath(olddn) newdn = self.getRelativePath(newdn) - for key in ["SOURCES", "FORMS", "INTERFACES", "RESOURCES", "OTHERS"]: + for key in ["SOURCES", "FORMS", "INTERFACES", "PROTOCOLS", "RESOURCES", + "OTHERS"]: for entry in self.pdata[key][:]: if entry.startswith(olddn): entry = entry.replace(olddn, newdn) @@ -1962,7 +2000,8 @@ olddn = self.getRelativePath(olddn) newdn = self.getRelativePath(newdn) typeStrings = [] - for key in ["SOURCES", "FORMS", "INTERFACES", "RESOURCES", "OTHERS"]: + for key in ["SOURCES", "FORMS", "INTERFACES", "PROTOCOLS", "RESOURCES", + "OTHERS"]: for entry in self.pdata[key][:]: if entry.startswith(olddn): if key not in typeStrings: @@ -2004,6 +2043,9 @@ elif fn in self.pdata["INTERFACES"]: self.pdata["INTERFACES"].remove(fn) self.projectInterfaceRemoved.emit(fn) + elif fn in self.pdata["PROTOCOLS"]: + self.pdata["PROTOCOLS"].remove(fn) + self.projectProtocolRemoved.emit(fn) elif fn in self.pdata["RESOURCES"]: self.pdata["RESOURCES"].remove(fn) self.projectResourceRemoved.emit(fn) @@ -2037,7 +2079,7 @@ dn2 = dn + os.sep else: dn2 = dn - for key in ["SOURCES", "FORMS", "INTERFACES", "RESOURCES", + for key in ["SOURCES", "FORMS", "INTERFACES", "PROTOCOLS", "RESOURCES", "TRANSLATIONS", ]: for entry in self.pdata[key][:]: if entry.startswith(dn2): @@ -2129,6 +2171,7 @@ if fn in self.pdata["SOURCES"] or \ fn in self.pdata["FORMS"] or \ fn in self.pdata["INTERFACES"] or \ + fn in self.pdata["PROTOCOLS"] or \ fn in self.pdata["RESOURCES"] or \ fn in self.pdata["OTHERS"]: return True @@ -3115,7 +3158,7 @@ Public method to get the file entries of the given type. @param fileType project file type (one of SOURCES, FORMS, RESOURCES, - INTERFACES, OTHERS, TRANSLATIONS) + INTERFACES, PROTOCOLS, OTHERS, TRANSLATIONS) @type str @param normalized flag indicating normalized file names are wanted @type boolean @@ -3124,7 +3167,7 @@ @exception ValueError raised when an unsupported file type is given """ if fileType not in ["SOURCES", "FORMS", "RESOURCES", "INTERFACES", - "OTHERS", "TRANSLATIONS"]: + "PROTOCOLS", "OTHERS", "TRANSLATIONS"]: raise ValueError("Given file type has incorrect value.") if normalized: @@ -3446,7 +3489,7 @@ @param fn filename to be checked (string) @return flag indicating membership (boolean) """ - for group in ["SOURCES", "FORMS", "INTERFACES", + for group in ["SOURCES", "FORMS", "INTERFACES", "PROTOCOLS", "RESOURCES", "TRANSLATIONS", "OTHERS"]: if self.__checkProjectFileGroup(fn, group): return True @@ -3514,6 +3557,18 @@ """ return self.__checkProjectFileGroup(fn, "INTERFACES") + def isProjectProtocol(self, fn): + """ + Public method used to check, if the passed in filename belongs to the + project protocols. + + @param fn filename to be checked + @type str + @return flag indicating membership + @rtype bool + """ + return self.__checkProjectFileGroup(fn, "PROTOCOLS") + def isProjectResource(self, fn): """ Public method used to check, if the passed in filename belongs to the @@ -3652,8 +3707,9 @@ 'Search new files in the project directory.')) act.setWhatsThis(self.tr( """<b>Search new files...</b>""" - """<p>This searches for new files (sources, *.ui, *.idl) in""" - """ the project directory and registered subdirectories.</p>""" + """<p>This searches for new files (sources, *.ui, *.idl,""" + """ *.proto) in the project directory and registered""" + """ subdirectories.</p>""" )) act.triggered.connect(self.__searchNewFiles) self.actions.append(act) @@ -3709,11 +3765,11 @@ self.tr('Show the project filetype associations')) self.filetypesAct.setWhatsThis(self.tr( """<b>Filetype Associations...</b>""" - """<p>This shows a dialog to edit the filetype associations of""" + """<p>This shows a dialog to edit the file type associations of""" """ the project. These associations determine the type""" - """ (source, form, interface or others) with a filename""" - """ pattern. They are used when adding a file to the project""" - """ and when performing a search for new files.</p>""" + """ (source, form, interface, protocol or others) with a""" + """ filename pattern. They are used when adding a file to the""" + """ project and when performing a search for new files.</p>""" )) self.filetypesAct.triggered.connect( self.__showFiletypeAssociations) @@ -4306,6 +4362,8 @@ fn not in self.pdata["FORMS"]) or \ (filetype == "INTERFACES" and fn not in self.pdata["INTERFACES"]) or \ + (filetype == "PROTOCOLS" and + fn not in self.pdata["PROTOCOLS"]) or \ (filetype == "RESOURCES" and fn not in self.pdata["RESOURCES"]) or \ (filetype == "OTHERS" and fn not in self.pdata["OTHERS"]): @@ -4875,7 +4933,7 @@ # build the list of entries lst_ = [] for key in ["SOURCES", "FORMS", "RESOURCES", "TRANSLATIONS", - "INTERFACES", "OTHERS"]: + "INTERFACES", "PROTOCOLS", "OTHERS"]: lst_.extend(self.pdata[key]) lst = [] for entry in lst_:
--- a/Project/ProjectBrowser.py Sun Nov 19 13:06:01 2017 +0100 +++ b/Project/ProjectBrowser.py Sat Dec 02 12:40:22 2017 +0100 @@ -23,7 +23,7 @@ from .ProjectBrowserFlags import SourcesBrowserFlag, FormsBrowserFlag, \ ResourcesBrowserFlag, TranslationsBrowserFlag, InterfacesBrowserFlag, \ - OthersBrowserFlag, AllBrowsersFlag + OthersBrowserFlag, ProtocolsBrowserFlag, AllBrowsersFlag class ProjectBrowser(E5TabWidget): @@ -85,6 +85,7 @@ from .ProjectResourcesBrowser import ProjectResourcesBrowser from .ProjectInterfacesBrowser import ProjectInterfacesBrowser from .ProjectOthersBrowser import ProjectOthersBrowser + from .ProjectProtocolsBrowser import ProjectProtocolsBrowser # sources browser self.psBrowser = ProjectSourcesBrowser(self.project) # forms browser @@ -95,6 +96,8 @@ self.ptBrowser = ProjectTranslationsBrowser(self.project) # interfaces (IDL) browser self.piBrowser = ProjectInterfacesBrowser(self.project) + # protocols (protobuf) browser + self.ppBrowser = ProjectProtocolsBrowser(self.project) # others browser self.poBrowser = ProjectOthersBrowser(self.project) @@ -144,6 +147,14 @@ self.project.projectPropertiesChanged.connect( self.piBrowser._initMenusAndVcs) + # connect the protocols (protobuf) browser + self.project.projectClosed.connect(self.ppBrowser._projectClosed) + self.project.projectOpened.connect(self.ppBrowser._projectOpened) + self.project.newProject.connect(self.ppBrowser._newProject) + self.project.reinitVCS.connect(self.ppBrowser._initMenusAndVcs) + self.project.projectPropertiesChanged.connect( + self.ppBrowser._initMenusAndVcs) + # connect the others browser self.project.projectClosed.connect(self.poBrowser._projectClosed) self.project.projectOpened.connect(self.poBrowser._projectOpened) @@ -209,6 +220,12 @@ UI.PixmapCache.getIcon("projectInterfaces.png"), '') self.setTabToolTip(index, self.piBrowser.windowTitle()) + if browserFlags & ProtocolsBrowserFlag: + index = self.addTab( + self.ppBrowser, + UI.PixmapCache.getIcon("protobuf.png"), '') + self.setTabToolTip(index, self.ppBrowser.windowTitle()) + if browserFlags & OthersBrowserFlag: index = self.addTab( self.poBrowser, @@ -331,6 +348,10 @@ self.pfBrowser.selectFile(fn) elif self.project.isProjectInterface(fn): self.piBrowser.selectFile(fn) + elif self.project.isProjectProtocol(fn): + self.ppBrowser.selectFile(fn) + elif self.project.isProjectProtocol(fn): + self.ppBrowser.selectFile(fn) def handleEditorLineChanged(self, fn, lineno): """ @@ -351,7 +372,8 @@ @return list of references to project browsers """ return [self.psBrowser, self.pfBrowser, self.prBrowser, - self.ptBrowser, self.piBrowser, self.poBrowser] + self.ptBrowser, self.piBrowser, self.ppBrowser, + self.poBrowser] def getProjectBrowser(self, name): """ @@ -359,7 +381,7 @@ @param name name of the requested project browser (string). Valid names are "sources, forms, resources, translations, - interfaces, others". + interfaces, protocols, others". @return reference to the requested browser or None """ if name == "sources": @@ -372,6 +394,8 @@ return self.ptBrowser elif name == "interfaces": return self.piBrowser + elif name == "protocols": + return self.ppBrowser elif name == "others": return self.poBrowser else: @@ -384,7 +408,7 @@ @return list of project browser names (list of string) """ return ["sources", "forms", "resources", - "translations", "interfaces", "others"] + "translations", "interfaces", "protocols", "others"] def handlePreferencesChanged(self): """
--- a/Project/ProjectBrowserFlags.py Sun Nov 19 13:06:01 2017 +0100 +++ b/Project/ProjectBrowserFlags.py Sat Dec 02 12:40:22 2017 +0100 @@ -13,12 +13,15 @@ TranslationsBrowserFlag = 8 InterfacesBrowserFlag = 16 OthersBrowserFlag = 32 +ProtocolsBrowserFlag = 64 + AllBrowsersFlag = SourcesBrowserFlag | \ FormsBrowserFlag | \ ResourcesBrowserFlag | \ TranslationsBrowserFlag | \ InterfacesBrowserFlag | \ - OthersBrowserFlag + OthersBrowserFlag | \ + ProtocolsBrowserFlag # # eflag: noqa = M702
--- a/Project/ProjectBrowserModel.py Sun Nov 19 13:06:01 2017 +0100 +++ b/Project/ProjectBrowserModel.py Sat Dec 02 12:40:22 2017 +0100 @@ -35,6 +35,7 @@ ProjectBrowserTranslationType = 4 ProjectBrowserOthersType = 5 ProjectBrowserResourceType = 6 +ProjectBrowserProtocolsType = 7 class ProjectBrowserItemMixin(object): @@ -253,6 +254,7 @@ "FORMS": ProjectBrowserFormType, "RESOURCES": ProjectBrowserResourceType, "INTERFACES": ProjectBrowserInterfaceType, + "PROTOCOLS": ProjectBrowserProtocolsType, "TRANSLATIONS": ProjectBrowserTranslationType, "OTHERS": ProjectBrowserOthersType, }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Project/ProjectProtocolsBrowser.py Sat Dec 02 12:40:22 2017 +0100 @@ -0,0 +1,726 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2017 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing the a class used to display the protocols (protobuf) part +of the project. +""" + +from __future__ import unicode_literals +try: + str = unicode +except NameError: + pass + +import os +import glob +import sys + +from PyQt5.QtCore import QThread, pyqtSignal, QProcess +from PyQt5.QtWidgets import QDialog, QApplication, QMenu + +from E5Gui.E5Application import e5App +from E5Gui import E5MessageBox +from E5Gui.E5ProgressDialog import E5ProgressDialog + +from .ProjectBrowserModel import ProjectBrowserFileItem, \ + ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem, \ + ProjectBrowserProtocolsType +from .ProjectBaseBrowser import ProjectBaseBrowser + +from UI.BrowserModel import BrowserFileItem, BrowserClassItem, \ + BrowserMethodItem, BrowserClassAttributeItem +import UI.PixmapCache + +import Preferences +import Utilities + + +class ProjectProtocolsBrowser(ProjectBaseBrowser): + """ + A class used to display the protocols (protobuf) part of the project. + + @signal appendStdout(str) emitted after something was received from + a QProcess on stdout + @signal appendStderr(str) emitted after something was received from + a QProcess on stderr + @signal showMenu(str, QMenu) emitted when a menu is about to be shown. + The name of the menu and a reference to the menu are given. + """ + appendStdout = pyqtSignal(str) + appendStderr = pyqtSignal(str) + showMenu = pyqtSignal(str, QMenu) + + def __init__(self, project, parent=None): + """ + Constructor + + @param project reference to the project object + @type Project + @param parent parent widget of this browser + @type QWidget + """ + ProjectBaseBrowser.__init__(self, project, + ProjectBrowserProtocolsType, parent) + + self.selectedItemsFilter = \ + [ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem] + + self.setWindowTitle(self.tr('Protocols (protobuf)')) + + self.setWhatsThis(self.tr( + """<b>Project Protocols Browser</b>""" + """<p>This allows to easily see all protocols (protobuf files)""" + """ contained in the current project. Several actions can be""" + """ executed via the context menu.</p>""" + )) + + project.prepareRepopulateItem.connect(self._prepareRepopulateItem) + project.completeRepopulateItem.connect(self._completeRepopulateItem) + + def _createPopupMenus(self): + """ + Protected overloaded method to generate the popup menu. + """ + self.menuActions = [] + self.multiMenuActions = [] + self.dirMenuActions = [] + self.dirMultiMenuActions = [] + + self.sourceMenu = QMenu(self) + self.sourceMenu.addAction( + self.tr('Compile protocol'), self.__compileProtocol) + self.sourceMenu.addAction( + self.tr('Compile all protocols'), + self.__compileAllProtocols) + self.sourceMenu.addSeparator() + self.sourceMenu.addAction( + self.tr('Compile protocol as gRPC'), + lambda: self.__compileProtocol(grpc=True)) + self.sourceMenu.addAction( + self.tr('Compile all protocols as gRPC'), + lambda: self.__compileAllProtocols(grpc=True)) + self.sourceMenu.addSeparator() + self.sourceMenu.addAction(self.tr('Open'), self._openItem) + self.sourceMenu.addSeparator() + act = self.sourceMenu.addAction( + self.tr('Rename file'), self._renameFile) + self.menuActions.append(act) + act = self.sourceMenu.addAction( + self.tr('Remove from project'), self._removeFile) + self.menuActions.append(act) + act = self.sourceMenu.addAction( + self.tr('Delete'), self.__deleteFile) + self.menuActions.append(act) + self.sourceMenu.addSeparator() + self.sourceMenu.addAction( + self.tr('Add protocols...'), self.__addProtocolFiles) + self.sourceMenu.addAction( + self.tr('Add protocols directory...'), + self.__addProtocolsDirectory) + self.sourceMenu.addSeparator() + self.sourceMenu.addAction( + self.tr('Copy Path to Clipboard'), self._copyToClipboard) + self.sourceMenu.addSeparator() + self.sourceMenu.addAction( + self.tr('Expand all directories'), self._expandAllDirs) + self.sourceMenu.addAction( + self.tr('Collapse all directories'), self._collapseAllDirs) + self.sourceMenu.addSeparator() + self.sourceMenu.addAction(self.tr('Configure...'), self._configure) + self.sourceMenu.addAction( + self.tr('Configure Protobuf...'), self.__configureProtobuf) + + self.menu = QMenu(self) + self.menu.addAction( + self.tr('Compile protocol'), self.__compileProtocol) + self.menu.addAction( + self.tr('Compile all protocols'), + self.__compileAllProtocols) + self.menu.addSeparator() + self.menu.addAction( + self.tr('Compile protocol as gRPC'), + lambda: self.__compileProtocol(grpc=True)) + self.menu.addAction( + self.tr('Compile all protocols as gRPC'), + lambda: self.__compileAllProtocols(grpc=True)) + self.menu.addSeparator() + self.menu.addAction(self.tr('Open'), self._openItem) + self.menu.addSeparator() + self.menu.addAction( + self.tr('Add protocols...'), self.__addProtocolFiles) + self.menu.addAction( + self.tr('Add protocols directory...'), + self.__addProtocolsDirectory) + self.menu.addSeparator() + self.menu.addAction( + self.tr('Expand all directories'), self._expandAllDirs) + self.menu.addAction( + self.tr('Collapse all directories'), self._collapseAllDirs) + self.menu.addSeparator() + self.menu.addAction(self.tr('Configure...'), self._configure) + self.menu.addAction( + self.tr('Configure Protobuf...'), self.__configureProtobuf) + + self.backMenu = QMenu(self) + self.backMenu.addAction( + self.tr('Compile all protocols'), + self.__compileAllProtocols) + self.backMenu.addSeparator() + self.backMenu.addAction( + self.tr('Compile all protocols as gRPC'), + lambda: self.__compileAllProtocols(grpc=True)) + self.backMenu.addSeparator() + self.backMenu.addAction( + self.tr('Add protocols...'), self.project.addProtoFiles) + self.backMenu.addAction( + self.tr('Add protocols directory...'), self.project.addProtoDir) + self.backMenu.addSeparator() + self.backMenu.addAction( + self.tr('Expand all directories'), self._expandAllDirs) + self.backMenu.addAction( + self.tr('Collapse all directories'), self._collapseAllDirs) + self.backMenu.addSeparator() + self.backMenu.addAction(self.tr('Configure...'), self._configure) + self.backMenu.addAction( + self.tr('Configure Protobuf...'), self.__configureProtobuf) + self.backMenu.setEnabled(False) + + # create the menu for multiple selected files + self.multiMenu = QMenu(self) + self.multiMenu.addAction( + self.tr('Compile protocols'), + self.__compileSelectedProtocols) + self.multiMenu.addSeparator() + self.multiMenu.addAction( + self.tr('Compile protocols as gRPC'), + lambda: self.__compileSelectedProtocols(grpc=True)) + self.multiMenu.addSeparator() + self.multiMenu.addAction(self.tr('Open'), self._openItem) + self.multiMenu.addSeparator() + act = self.multiMenu.addAction( + self.tr('Remove from project'), self._removeFile) + self.multiMenuActions.append(act) + act = self.multiMenu.addAction( + self.tr('Delete'), self.__deleteFile) + self.multiMenuActions.append(act) + self.multiMenu.addSeparator() + self.multiMenu.addAction( + self.tr('Expand all directories'), self._expandAllDirs) + self.multiMenu.addAction( + self.tr('Collapse all directories'), self._collapseAllDirs) + self.multiMenu.addSeparator() + self.multiMenu.addAction(self.tr('Configure...'), self._configure) + self.multiMenu.addAction( + self.tr('Configure Protobuf...'), self.__configureProtobuf) + + self.dirMenu = QMenu(self) + self.dirMenu.addAction( + self.tr('Compile all protocols'), + self.__compileAllProtocols) + self.dirMenu.addSeparator() + self.dirMenu.addAction( + self.tr('Compile all protocols as gRPC'), + lambda: self.__compileAllProtocols(grpc=True)) + act = self.dirMenu.addAction( + self.tr('Remove from project'), self._removeFile) + self.dirMenuActions.append(act) + act = self.dirMenu.addAction( + self.tr('Delete'), self._deleteDirectory) + self.dirMenuActions.append(act) + self.dirMenu.addSeparator() + self.dirMenu.addAction( + self.tr('Add protocols...'), self.__addProtocolFiles) + self.dirMenu.addAction( + self.tr('Add protocols directory...'), + self.__addProtocolsDirectory) + self.dirMenu.addSeparator() + self.dirMenu.addAction( + self.tr('Copy Path to Clipboard'), self._copyToClipboard) + self.dirMenu.addSeparator() + self.dirMenu.addAction( + self.tr('Expand all directories'), self._expandAllDirs) + self.dirMenu.addAction( + self.tr('Collapse all directories'), self._collapseAllDirs) + self.dirMenu.addSeparator() + self.dirMenu.addAction(self.tr('Configure...'), self._configure) + self.dirMenu.addAction( + self.tr('Configure Protobuf...'), self.__configureProtobuf) + + self.dirMultiMenu = QMenu(self) + self.dirMultiMenu.addAction( + self.tr('Compile all protocols'), + self.__compileAllProtocols) + self.dirMultiMenu.addSeparator() + self.dirMultiMenu.addAction( + self.tr('Compile all protocols as gRPC'), + lambda: self.__compileAllProtocols(grpc=True)) + self.dirMultiMenu.addAction( + self.tr('Add protocols...'), self.project.addProtoFiles) + self.dirMultiMenu.addAction( + self.tr('Add protocols directory...'), self.project.addProtoDir) + self.dirMultiMenu.addSeparator() + self.dirMultiMenu.addAction( + self.tr('Expand all directories'), self._expandAllDirs) + self.dirMultiMenu.addAction( + self.tr('Collapse all directories'), self._collapseAllDirs) + self.dirMultiMenu.addSeparator() + self.dirMultiMenu.addAction( + self.tr('Configure...'), self._configure) + self.dirMultiMenu.addAction(self.tr('Configure Protobuf...'), + self.__configureProtobuf) + + self.sourceMenu.aboutToShow.connect(self.__showContextMenu) + self.multiMenu.aboutToShow.connect(self.__showContextMenuMulti) + self.dirMenu.aboutToShow.connect(self.__showContextMenuDir) + self.dirMultiMenu.aboutToShow.connect(self.__showContextMenuDirMulti) + self.backMenu.aboutToShow.connect(self.__showContextMenuBack) + self.mainMenu = self.sourceMenu + + def _contextMenuRequested(self, coord): + """ + Protected slot to show the context menu. + + @param coord the position of the mouse pointer (QPoint) + """ + if not self.project.isOpen(): + return + + try: + categories = self.getSelectedItemsCountCategorized( + [ProjectBrowserFileItem, BrowserClassItem, + BrowserMethodItem, ProjectBrowserSimpleDirectoryItem]) + cnt = categories["sum"] + if cnt <= 1: + index = self.indexAt(coord) + if index.isValid(): + self._selectSingleItem(index) + categories = self.getSelectedItemsCountCategorized( + [ProjectBrowserFileItem, BrowserClassItem, + BrowserMethodItem, ProjectBrowserSimpleDirectoryItem]) + cnt = categories["sum"] + + bfcnt = categories[str(ProjectBrowserFileItem)] + cmcnt = categories[str(BrowserClassItem)] + \ + categories[str(BrowserMethodItem)] + sdcnt = categories[str(ProjectBrowserSimpleDirectoryItem)] + if cnt > 1 and cnt == bfcnt: + self.multiMenu.popup(self.mapToGlobal(coord)) + elif cnt > 1 and cnt == sdcnt: + self.dirMultiMenu.popup(self.mapToGlobal(coord)) + else: + index = self.indexAt(coord) + if cnt == 1 and index.isValid(): + if bfcnt == 1 or cmcnt == 1: + itm = self.model().item(index) + if isinstance(itm, ProjectBrowserFileItem): + self.sourceMenu.popup(self.mapToGlobal(coord)) + elif isinstance(itm, BrowserClassItem) or \ + isinstance(itm, BrowserMethodItem): + self.menu.popup(self.mapToGlobal(coord)) + else: + self.backMenu.popup(self.mapToGlobal(coord)) + elif sdcnt == 1: + self.dirMenu.popup(self.mapToGlobal(coord)) + else: + self.backMenu.popup(self.mapToGlobal(coord)) + else: + self.backMenu.popup(self.mapToGlobal(coord)) + except Exception: + pass + + def __showContextMenu(self): + """ + Private slot called by the menu aboutToShow signal. + """ + ProjectBaseBrowser._showContextMenu(self, self.menu) + + self.showMenu.emit("Main", self.menu) + + def __showContextMenuMulti(self): + """ + Private slot called by the multiMenu aboutToShow signal. + """ + ProjectBaseBrowser._showContextMenuMulti(self, self.multiMenu) + + self.showMenu.emit("MainMulti", self.multiMenu) + + def __showContextMenuDir(self): + """ + Private slot called by the dirMenu aboutToShow signal. + """ + ProjectBaseBrowser._showContextMenuDir(self, self.dirMenu) + + self.showMenu.emit("MainDir", self.dirMenu) + + def __showContextMenuDirMulti(self): + """ + Private slot called by the dirMultiMenu aboutToShow signal. + """ + ProjectBaseBrowser._showContextMenuDirMulti(self, self.dirMultiMenu) + + self.showMenu.emit("MainDirMulti", self.dirMultiMenu) + + def __showContextMenuBack(self): + """ + Private slot called by the backMenu aboutToShow signal. + """ + ProjectBaseBrowser._showContextMenuBack(self, self.backMenu) + + self.showMenu.emit("MainBack", self.backMenu) + + def _openItem(self): + """ + Protected slot to handle the open popup menu entry. + """ + itmList = self.getSelectedItems( + [BrowserFileItem, BrowserClassItem, BrowserMethodItem, + BrowserClassAttributeItem]) + + for itm in itmList: + if isinstance(itm, BrowserFileItem): + self.sourceFile[str].emit(itm.fileName()) + elif isinstance(itm, BrowserClassItem): + self.sourceFile[str, int].emit( + itm.fileName(), itm.classObject().lineno) + elif isinstance(itm, BrowserMethodItem): + self.sourceFile[str, int].emit( + itm.fileName(), itm.functionObject().lineno) + elif isinstance(itm, BrowserClassAttributeItem): + self.sourceFile[str, int].emit( + itm.fileName(), itm.attributeObject().lineno) + + def __addProtocolFiles(self): + """ + Private method to add protocol files to the project. + """ + itm = self.model().item(self.currentIndex()) + if isinstance(itm, ProjectBrowserFileItem) or \ + isinstance(itm, BrowserClassItem) or \ + isinstance(itm, BrowserMethodItem): + dn = os.path.dirname(itm.fileName()) + elif isinstance(itm, ProjectBrowserSimpleDirectoryItem) or \ + isinstance(itm, ProjectBrowserDirectoryItem): + dn = itm.dirName() + else: + dn = None + self.project.addFiles('protocol', dn) + + def __addProtocolsDirectory(self): + """ + Private method to add protocol files of a directory to the project. + """ + itm = self.model().item(self.currentIndex()) + if isinstance(itm, ProjectBrowserFileItem) or \ + isinstance(itm, BrowserClassItem) or \ + isinstance(itm, BrowserMethodItem): + dn = os.path.dirname(itm.fileName()) + elif isinstance(itm, ProjectBrowserSimpleDirectoryItem) or \ + isinstance(itm, ProjectBrowserDirectoryItem): + dn = itm.dirName() + else: + dn = None + self.project.addDirectory('protocol', dn) + + def __deleteFile(self): + """ + Private method to delete files from the project. + """ + itmList = self.getSelectedItems() + + files = [] + fullNames = [] + for itm in itmList: + fn2 = itm.fileName() + fullNames.append(fn2) + fn = self.project.getRelativePath(fn2) + files.append(fn) + + from UI.DeleteFilesConfirmationDialog import \ + DeleteFilesConfirmationDialog + dlg = DeleteFilesConfirmationDialog( + self.parent(), + self.tr("Delete Protocols"), + self.tr("Do you really want to delete these protocol files from" + " the project?"), + files) + + if dlg.exec_() == QDialog.Accepted: + for fn2, fn in zip(fullNames, files): + self.closeSourceWindow.emit(fn2) + self.project.deleteFile(fn) + + ########################################################################### + ## Methods to handle the various compile commands + ########################################################################### + + def __getCompilerCommand(self, grpc): + """ + Private method to get the compiler command. + + @param grpc flag indicating to get a gRPC command + @type bool + @return tuple giving the executable and its parameter list + @rtype tuple of (str, list of str) + """ + exe = None + exeArgs = [] + + if grpc: + exe = Preferences.getProtobuf("grpcPython") + if exe == "": + exe = sys.executable + exeArgs = ['-m', 'grpc_tools.protoc'] + else: + exe = Preferences.getProtobuf("protoc") + if exe == "": + exe = Utilities.isWindowsPlatform() and \ + "protoc.exe" or "protoc" + if not Utilities.isinpath(exe): + exe = None + + return exe, exeArgs + + def __readStdout(self): + """ + Private slot to handle the readyReadStandardOutput signal of the + protoc process. + """ + if self.compileProc is None: + return + + ioEncoding = Preferences.getSystem("IOEncoding") + + self.compileProc.setReadChannel(QProcess.StandardOutput) + while self.compileProc and self.compileProc.canReadLine(): + s = 'protoc: ' + output = str(self.compileProc.readLine(), ioEncoding, 'replace') + s += output + self.appendStdout.emit(s) + + def __readStderr(self): + """ + Private slot to handle the readyReadStandardError signal of the + protoc process. + """ + if self.compileProc is None: + return + + ioEncoding = Preferences.getSystem("IOEncoding") + + self.compileProc.setReadChannel(QProcess.StandardError) + while self.compileProc and self.compileProc.canReadLine(): + s = 'protoc: ' + error = str(self.compileProc.readLine(), ioEncoding, 'replace') + s += error + self.appendStderr.emit(s) + + def __compileProtoDone(self, exitCode, exitStatus, grpc): + """ + Private slot to handle the finished signal of the protoc process. + + @param exitCode exit code of the process + @type int + @param exitStatus exit status of the process + @type QProcess.ExitStatus + @param grpc flag indicating to compile as gRPC files + @type bool + """ + self.__compileRunning = False + ui = e5App().getObject("UserInterface") + if exitStatus == QProcess.NormalExit and exitCode == 0: + path = os.path.dirname(self.__protoFile) + fileList = glob.glob(os.path.join(path, "*_pb2.py")) + if grpc: + fileList += glob.glob(os.path.join(path, "*_pb2_grpc.py")) + for file in fileList: + self.project.appendFile(file) + if not self.noDialog and not ui.notificationsEnabled(): + E5MessageBox.information( + self, + self.tr("Protocol Compilation"), + self.tr( + "The compilation of the protocol file was" + " successful.")) + else: + if grpc: + icon = UI.PixmapCache.getPixmap("gRPC48.png") + else: + icon = UI.PixmapCache.getPixmap("protobuf48.png") + ui.showNotification( + icon, + self.tr("Protocol Compilation"), + self.tr( + "The compilation of the protocol file was" + " successful.")) + else: + if not self.noDialog: + E5MessageBox.information( + self, + self.tr("Protocol Compilation"), + self.tr( + "The compilation of the protocol file failed.")) + else: + if grpc: + icon = UI.PixmapCache.getPixmap("gRPC48.png") + else: + icon = UI.PixmapCache.getPixmap("protobuf48.png") + ui.showNotification( + icon, + self.tr("Protocol Compilation"), + self.tr( + "The compilation of the protocol file failed.")) + self.compileProc = None + + def __compileProto(self, fn, noDialog=False, progress=None, grpc=False): + """ + Private method to compile a .proto file to Python. + + @param fn filename of the .proto file to be compiled + @type str + @param noDialog flag indicating silent operations + @type bool + @param progress reference to the progress dialog + @type E5ProgressDialog + @param grpc flag indicating to compile as gRPC files + @type bool + @return reference to the compile process + @rtype QProcess + """ + exe, exeArgs = self.__getCompilerCommand(grpc) + if exe: + self.compileProc = QProcess() + args = [] + + fn = os.path.join(self.project.ppath, fn) + self.__protoFile = fn + + srcPath = os.path.dirname(fn) + args.append("--proto_path={0}".format(srcPath)) + args.append("--python_out={0}".format(srcPath)) + if grpc: + args.append("--grpc_python_out={0}".format(srcPath)) + args.append(fn) + + self.compileProc.finished.connect( + lambda c, s: self.__compileProtoDone(c, s, grpc)) + self.compileProc.readyReadStandardOutput.connect(self.__readStdout) + self.compileProc.readyReadStandardError.connect(self.__readStderr) + + self.noDialog = noDialog + self.compileProc.start(exe, exeArgs + args) + procStarted = self.compileProc.waitForStarted(5000) + if procStarted: + self.__compileRunning = True + return self.compileProc + else: + self.__compileRunning = False + if progress is not None: + progress.cancel() + E5MessageBox.critical( + self, + self.tr('Process Generation Error'), + self.tr( + '<p>Could not start {0}.<br>' + 'Ensure that it is in the search path.</p>' + ).format(exe)) + return None + else: + E5MessageBox.critical( + self, + self.tr('Compiler Invalid'), + self.tr('The configured compiler is invalid.')) + return None + + def __compileProtocol(self, grpc=False): + """ + Private method to compile a protocol to Python. + + @param grpc flag indicating to compile as gRPC files + @type bool + """ + if self.__getCompilerCommand(grpc)[0] is not None: + itm = self.model().item(self.currentIndex()) + fn2 = itm.fileName() + fn = self.project.getRelativePath(fn2) + self.__compileProto(fn, grpc=grpc) + + def __compileAllProtocols(self, grpc=False): + """ + Private method to compile all protocols to Python. + + @param grpc flag indicating to compile as gRPC files + @type bool + """ + if self.__getCompilerCommand(grpc)[0] is not None: + numProtos = len(self.project.pdata["PROTOCOLS"]) + progress = E5ProgressDialog( + self.tr("Compiling Protocols..."), + self.tr("Abort"), 0, numProtos, + self.tr("%v/%m Protocols"), self) + progress.setModal(True) + progress.setMinimumDuration(0) + progress.setWindowTitle(self.tr("Protocols")) + i = 0 + + for fn in self.project.pdata["PROTOCOLS"]: + progress.setValue(i) + if progress.wasCanceled(): + break + proc = self.__compileProto(fn, True, progress, grpc=grpc) + if proc is not None: + while proc.state() == QProcess.Running: + QApplication.processEvents() + QThread.msleep(300) + QApplication.processEvents() + else: + break + i += 1 + + progress.setValue(numProtos) + + def __compileSelectedProtocols(self, grpc=False): + """ + Private method to compile selected protocols to Python. + + @param grpc flag indicating to compile as gRPC files + @type bool + """ + if self.__getCompilerCommand(grpc)[0] is not None: + items = self.getSelectedItems() + + files = [self.project.getRelativePath(itm.fileName()) + for itm in items] + numProtos = len(files) + progress = E5ProgressDialog( + self.tr("Compiling Protocols..."), + self.tr("Abort"), 0, numProtos, + self.tr("%v/%m Protocols"), self) + progress.setModal(True) + progress.setMinimumDuration(0) + progress.setWindowTitle(self.tr("Protocols")) + i = 0 + + for fn in files: + progress.setValue(i) + if progress.wasCanceled(): + break + proc = self.__compileProto(fn, True, progress, grpc=grpc) + if proc is not None: + while proc.state() == QProcess.Running: + QApplication.processEvents() + QThread.msleep(300) + QApplication.processEvents() + else: + break + i += 1 + + progress.setValue(numProtos) + + def __configureProtobuf(self): + """ + Private method to open the configuration dialog. + """ + e5App().getObject("UserInterface").showPreferences("protobufPage")
--- a/Project/QuickFindFile.ui Sun Nov 19 13:06:01 2017 +0100 +++ b/Project/QuickFindFile.ui Sat Dec 02 12:40:22 2017 +0100 @@ -44,12 +44,12 @@ </property> <column> <property name="text"> - <string>Path</string> + <string>Filename</string> </property> </column> <column> <property name="text"> - <string>Filename</string> + <string>Path</string> </property> </column> </widget>
--- a/Project/QuickFindFileDialog.py Sun Nov 19 13:06:01 2017 +0100 +++ b/Project/QuickFindFileDialog.py Sat Dec 02 12:40:22 2017 +0100 @@ -139,7 +139,7 @@ @return yields set of files in our project... @rtype str """ - for typ in ["SOURCES", "FORMS", "INTERFACES", "RESOURCES", + for typ in ["SOURCES", "FORMS", "INTERFACES", "PROTOCOLS", "RESOURCES", "TRANSLATIONS", "OTHERS"]: entries = self.project.pdata.get(typ) for entry in entries[:]:
--- a/QScintilla/Editor.py Sun Nov 19 13:06:01 2017 +0100 +++ b/QScintilla/Editor.py Sat Dec 02 12:40:22 2017 +0100 @@ -1414,6 +1414,10 @@ @keyparam propagate flag indicating to propagate the change (boolean) @keyparam pyname name of the pygments lexer to use (string) """ + # clear all warning and syntax error markers + self.clearSyntaxError() + self.clearWarnings() + self.menuActs["MonospacedFont"].setChecked(False) self.__lexerReset = False @@ -1426,7 +1430,7 @@ if initTextDisplay: self.__setTextDisplay() - # set the autocompletion and calltips function + # set the auto-completion and call-tips function self.__setAutoCompletion() self.__setCallTips() @@ -1599,13 +1603,16 @@ if pyname: self.apiLanguage = "Pygments|{0}".format(pyname) else: - # Change API language for lexer where QScintilla reports - # an abbreviated name. - self.apiLanguage = self.lexer_.language() - if self.apiLanguage == "POV": - self.apiLanguage = "Povray" - elif self.apiLanguage == "PO": - self.apiLanguage = "Gettext" + if language == "Protocol": + self.apiLanguage = language + else: + # Change API language for lexer where QScintilla reports + # an abbreviated name. + self.apiLanguage = self.lexer_.language() + if self.apiLanguage == "POV": + self.apiLanguage = "Povray" + elif self.apiLanguage == "PO": + self.apiLanguage = "Gettext" self.setLexer(self.lexer_) self.__setMarginsDisplay() if self.lexer_.lexer() == "container" or self.lexer_.lexer() is None: @@ -4571,7 +4578,6 @@ ## auto-completion hook interfaces ################################################################# - # TODO: document this hook in chapter 6.2 of plug-in document def addCompletionListHook(self, key, func, async=False): """ Public method to set an auto-completion list provider. @@ -4610,7 +4616,6 @@ else: self.__completionListHookFunctions[key] = func - # TODO: document this hook in chapter 6.2 of plug-in document def removeCompletionListHook(self, key): """ Public method to remove a previously registered completion list @@ -4631,7 +4636,6 @@ self.setAutoCompletionThreshold( Preferences.getEditor("AutoCompletionThreshold")) - # TODO: document this hook in chapter 6.2 of plug-in document def getCompletionListHook(self, key): """ Public method to get the registered completion list provider. @@ -4714,7 +4718,6 @@ if Preferences.getEditor("AutoCompletionScintillaOnFail"): self.__acWatchdog.start() - # TODO: document this hook in chapter 6.2 of plug-in document def completionsListReady(self, completions, acText): """ Public method to show the completions determined by a completions @@ -4727,7 +4730,7 @@ """ # process the list only, if not already obsolete ... if acText != self.__acText: - return + return self.__acCompletions.update(set(completions)) @@ -4738,8 +4741,8 @@ self.__acWatchdog.stop() # Autocomplete with QScintilla if no results present - if (Preferences.getEditor("AutoCompletionScintillaOnFail") - and not self.__acCompletions): + if Preferences.getEditor("AutoCompletionScintillaOnFail") and \ + not self.__acCompletions: self.autoCompleteQScintilla() return @@ -4834,7 +4837,6 @@ ## call-tip hook interfaces ################################################################# - # TODO: document this hook in chapter 6.2 of plug-in document def addCallTipHook(self, key, func): """ Public method to set a calltip provider. @@ -4860,7 +4862,6 @@ self.__ctHookFunctions[key] = func - # TODO: document this hook in chapter 6.2 of plug-in document def removeCallTipHook(self, key): """ Public method to remove a previously registered calltip provider. @@ -4871,7 +4872,6 @@ if key in self.__ctHookFunctions: del self.__ctHookFunctions[key] - # TODO: document this hook in chapter 6.2 of plug-in document def getCallTipHook(self, key): """ Public method to get the registered calltip provider.
--- a/QScintilla/Lexers/__init__.py Sun Nov 19 13:06:01 2017 +0100 +++ b/QScintilla/Lexers/__init__.py Sat Dec 02 12:40:22 2017 +0100 @@ -130,6 +130,9 @@ "lexerPOV.png"], "Properties": [QCoreApplication.translate('Lexers', "Properties"), 'dummy.ini', "lexerProperties.png"], + "Protocol": [QCoreApplication.translate('Lexers', + "Protocol (protobuf)"), + 'dummy.proto', "protobuf.png"], "Python2": [QCoreApplication.translate('Lexers', "Python2"), 'dummy.py', "lexerPython.png"], "Python3": [QCoreApplication.translate('Lexers', "Python3"), @@ -334,6 +337,9 @@ from .LexerMarkdown import LexerMarkdown return LexerMarkdown(parent) + elif language == "Protocol": + return __getPygmentsLexer(parent, name="Protocol Buffer") + elif language in LexerRegistry: return LexerRegistry[language][2](parent) @@ -395,6 +401,9 @@ 'IDL Files (*.idl)'), QCoreApplication.translate( 'Lexers', + 'Protocol Files (*.proto)'), + QCoreApplication.translate( + 'Lexers', 'C Files (*.h *.c)'), QCoreApplication.translate( 'Lexers', @@ -579,6 +588,9 @@ "IDL Files (*.idl)"), QCoreApplication.translate( 'Lexers', + 'Protocol Files (*.proto)'), + QCoreApplication.translate( + 'Lexers', "C Files (*.c)"), QCoreApplication.translate( 'Lexers', @@ -881,6 +893,7 @@ '*.e6q': "XML", '*.e6s': "XML", '*.e6t': "XML", + '*.proto': "Protocol", } if QSCINTILLA_VERSION() >= 0x020802:
--- a/QScintilla/Shell.py Sun Nov 19 13:06:01 2017 +0100 +++ b/QScintilla/Shell.py Sat Dec 02 12:40:22 2017 +0100 @@ -1603,7 +1603,8 @@ self.__setHistoryIndex(index=-1) elif self.__historyStyle == ShellHistoryStyle.WindowsStyle: if historyIndex is None: - if cmd != self.__history[self.__histidx - 1]: + if bool(self.__histidx - 1) and \ + cmd != self.__history[self.__histidx - 1]: self.__setHistoryIndex(index=-1) else: self.__setHistoryIndex(historyIndex)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Styles/SolarizedDark-Python.e4h Sat Dec 02 12:40:22 2017 +0100 @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE HighlightingStyles SYSTEM "HighlightingStyles-4.3.dtd"> +<!-- Eric6 highlighting styles --> +<!-- Saved: 2017-11-17, 10:26:26--> +<!-- Author: --> +<HighlightingStyles version="4.3"> + <Lexer name="Python3"> + <Style style="0" color="#839496" paper="#002b36" font="Noto Mono,9,-1,5,50,0,0,0,0,0" eolfill="False">Default</Style> + <Style style="1" color="#586e75" paper="#002b36" font="Noto Mono,9,-1,5,50,0,0,0,0,0" eolfill="False">Comment</Style> + <Style style="2" color="#839496" paper="#002b36" font="Noto Mono,9,-1,5,50,0,0,0,0,0" eolfill="False">Number</Style> + <Style style="3" color="#2aa198" paper="#002b36" font="Noto Mono,9,-1,5,50,0,0,0,0,0" eolfill="False">Double-quoted string</Style> + <Style style="4" color="#2aa198" paper="#002b36" font="Noto Mono,9,-1,5,50,0,0,0,0,0" eolfill="False">Single-quoted string</Style> + <Style style="5" color="#859900" paper="#002b36" font="Noto Mono,9,-1,5,75,0,0,0,0,0" eolfill="False">Keyword</Style> + <Style style="6" color="#2aa198" paper="#002b36" font="Noto Mono,9,-1,5,50,0,0,0,0,0" eolfill="False">Triple single-quoted string</Style> + <Style style="7" color="#2aa198" paper="#002b36" font="Noto Mono,9,-1,5,50,0,0,0,0,0" eolfill="False">Triple double-quoted string</Style> + <Style style="8" color="#859900" paper="#002b36" font="Noto Mono,9,-1,5,75,0,0,0,0,0" eolfill="False">Class name</Style> + <Style style="9" color="#859900" paper="#002b36" font="Noto Mono,9,-1,5,75,0,0,0,0,0" eolfill="False">Function or method name</Style> + <Style style="10" color="#839496" paper="#002b36" font="Noto Mono,9,-1,5,75,0,0,0,0,0" eolfill="False">Operator</Style> + <Style style="11" color="#839496" paper="#002b36" font="Noto Mono,9,-1,5,50,0,0,0,0,0" eolfill="False">Identifier</Style> + <Style style="12" color="#586e75" paper="#002b36" font="Noto Mono,9,-1,5,50,0,0,0,0,0" eolfill="False">Comment block</Style> + <Style style="13" color="#000000" paper="#e0c0e0" font="Noto Mono,9,-1,5,50,0,0,0,0,0" eolfill="False">Unclosed string</Style> + <Style style="14" color="#407090" paper="#002b36" font="Noto Mono,9,-1,5,50,0,0,0,0,0" eolfill="False">Highlighted identifier</Style> + <Style style="15" color="#657b83" paper="#002b36" font="Noto Mono,9,-1,5,50,0,0,0,0,0" eolfill="False">Decorator</Style> + </Lexer> + <Lexer name="Python2"> + <Style style="0" color="#839496" paper="#002b36" font="Noto Mono,9,-1,5,50,0,0,0,0,0" eolfill="False">Default</Style> + <Style style="1" color="#586e75" paper="#002b36" font="Noto Mono,9,-1,5,50,0,0,0,0,0" eolfill="False">Comment</Style> + <Style style="2" color="#839496" paper="#002b36" font="Noto Mono,9,-1,5,50,0,0,0,0,0" eolfill="False">Number</Style> + <Style style="3" color="#2aa198" paper="#002b36" font="Noto Mono,9,-1,5,50,0,0,0,0,0" eolfill="False">Double-quoted string</Style> + <Style style="4" color="#2aa198" paper="#002b36" font="Noto Mono,9,-1,5,50,0,0,0,0,0" eolfill="False">Single-quoted string</Style> + <Style style="5" color="#859900" paper="#002b36" font="Noto Mono,9,-1,5,75,0,0,0,0,0" eolfill="False">Keyword</Style> + <Style style="6" color="#2aa198" paper="#002b36" font="Noto Mono,9,-1,5,50,0,0,0,0,0" eolfill="False">Triple single-quoted string</Style> + <Style style="7" color="#2aa198" paper="#002b36" font="Noto Mono,9,-1,5,50,0,0,0,0,0" eolfill="False">Triple double-quoted string</Style> + <Style style="8" color="#859900" paper="#002b36" font="Noto Mono,9,-1,5,75,0,0,0,0,0" eolfill="False">Class name</Style> + <Style style="9" color="#859900" paper="#002b36" font="Noto Mono,9,-1,5,75,0,0,0,0,0" eolfill="False">Function or method name</Style> + <Style style="10" color="#839496" paper="#002b36" font="Noto Mono,9,-1,5,75,0,0,0,0,0" eolfill="False">Operator</Style> + <Style style="11" color="#839496" paper="#002b36" font="Noto Mono,9,-1,5,50,0,0,0,0,0" eolfill="False">Identifier</Style> + <Style style="12" color="#586e75" paper="#002b36" font="Noto Mono,9,-1,5,50,0,0,0,0,0" eolfill="False">Comment block</Style> + <Style style="13" color="#000000" paper="#e0c0e0" font="Noto Mono,9,-1,5,50,0,0,0,0,0" eolfill="False">Unclosed string</Style> + <Style style="14" color="#407090" paper="#002b36" font="Noto Mono,9,-1,5,50,0,0,0,0,0" eolfill="False">Highlighted identifier</Style> + <Style style="15" color="#657b83" paper="#002b36" font="Noto Mono,9,-1,5,50,0,0,0,0,0" eolfill="False">Decorator</Style> + </Lexer> +</HighlightingStyles>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Styles/SolarizedDark.qss Sat Dec 02 12:40:22 2017 +0100 @@ -0,0 +1,46 @@ +/* Solarized Dark theme for Eric6 + * Taken from https://gist.github.com/Zren/e91ad5197f9d6b6d410f + * Author: Chris Holland + * + * Theme Notes: + * - This theme is designed to work on top of the Fusion or the Plastique client style. + * It will look weird on almost all the others (including the system default). + */ +QPalette { + /* Window colors */ + window: #2b2b2b; + background: #212121; + foreground: #dddddd; + base: #131313; + alternate-base: #42403B; + + /* Just setting palette(tooltip-base) doesn't work as intended so we set it in + * a QTooltip{} rule as well. + */ + tooltip-base: #131313; /* palette(base) */ + tooltip-text: white; /* palette(text) */ + + /* The following attributes should be done in a scale */ + light: #444444; /* Tab Borders, Scrollbar handle grips, Titled Panel border (Settings) */ + midlight: #333333; /* ? */ + button: #292929; /* Menu BG, Scrollbar and Button base. */ + mid: #252525; /* Titled Panel border (Settings) */ + dark: #202020; /* TreeView [-] and ... color (Also various borders in Windows Client Style) */ + shadow: #1d1d1d; /* ? */ + + + /* Text colors */ + text: white; + button-text: #B6B3AB; + + highlight: #268bd2; + /* highlight-text: #000000; */ + + /* Link colors */ + link: #539FA3; + link-visited: #845B90; + + /* Color of the marker line in the chat view. BG Node that is overlayed on the first new ChatLine. */ + /* 0 -> 0.1 (sharp line) */ + marker-line: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #586e75, stop: 0.1 #586e75, stop: 0.1 transparent); +}
--- a/ThirdParty/Send2Trash/LICENSE Sun Nov 19 13:06:01 2017 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ -Copyright (c) 2013, Hardcoded Software, http://www.hardcoded.net -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * Neither the name of Hardcoded Software Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ThirdParty/Send2Trash/PKG-INFO Sat Dec 02 12:40:22 2017 +0100 @@ -0,0 +1,114 @@ +Metadata-Version: 1.1 +Name: Send2Trash +Version: 1.4.2 +Summary: Send file to trash natively under Mac OS X, Windows and Linux. +Home-page: https://github.com/hsoft/send2trash +Author: Virgil Dupras +Author-email: hsoft@hardcoded.net +License: BSD License +Description: ================================================== + Send2Trash -- Send files to trash on all platforms + ================================================== + + Send2Trash is a small package that sends files to the Trash (or Recycle Bin) *natively* and on + *all platforms*. On OS X, it uses native ``FSMoveObjectToTrashSync`` Cocoa calls, on Windows, it + uses native (and ugly) ``SHFileOperation`` win32 calls. On other platforms, if `PyGObject`_ and + `GIO`_ are available, it will use this. Otherwise, it will fallback to its own implementation + of the `trash specifications from freedesktop.org`_. + + ``ctypes`` is used to access native libraries, so no compilation is necessary. + + Send2Trash supports Python 2.7 and up (Python 3 is supported). + + Installation + ------------ + + You can download it with pip:: + + pip install Send2Trash + + or you can download the source from http://github.com/hsoft/send2trash and install it with:: + + >>> python setup.py install + + Usage + ----- + + >>> from send2trash import send2trash + >>> send2trash('some_file') + + When there's a problem ``OSError`` is raised. + + .. _PyGObject: https://wiki.gnome.org/PyGObject + .. _GIO: https://developer.gnome.org/gio/ + .. _trash specifications from freedesktop.org: http://freedesktop.org/wiki/Specifications/trash-spec/ + + + Changes + ======= + + Version 1.4.2 -- 2017/11/17 + --------------------------- + + * Fix incompatibility with Python 3.6 on Windows. (#18) + + Version 1.4.1 -- 2017/08/07 + --------------------------- + + * Fix crash on Windows introduced in v1.4.0. Oops... (#14) + + Version 1.4.0 -- 2017/08/07 + --------------------------- + + * Use ``bytes`` instead of ``str`` for internal path handling in ``plat_other``. (#13) + + Version 1.3.1 -- 2017/07/31 + --------------------------- + + * Throw ``WindowsError`` instead of ``OSError`` in ``plat_win``. (#7) + * Fix ``TypeError`` on python 2 in ``plat_other``. (#12) + + Version 1.3.0 -- 2013/07/19 + --------------------------- + + * Added support for Gnome's GIO. + * Merged Python 3 and Python 2 versions in a single codebase. + + Version 1.2.0 -- 2011/03/16 + --------------------------- + + * Improved ``plat_other`` to follow freedesktop.org trash specification. + + Version 1.1.0 -- 2010/10/18 + --------------------------- + + * Converted compiled modules to ctypes so that cross-platform compilation isn't necessary anymore. + + Version 1.0.2 -- 2010/07/10 + --------------------------- + + * Fixed bugs with external volumes in plat_other. + + Version 1.0.1 -- 2010/04/19 + --------------------------- + + * Fixed memory leak in OS X module. + + Version 1.0.0 -- 2010/04/07 + --------------------------- + + * Initial Release + +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Operating System :: Microsoft :: Windows +Classifier: Operating System :: POSIX +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Topic :: Desktop Environment :: File Managers
--- a/ThirdParty/Send2Trash/send2trash/compat.py Sun Nov 19 13:06:01 2017 +0100 +++ b/ThirdParty/Send2Trash/send2trash/compat.py Sat Dec 02 12:40:22 2017 +0100 @@ -1,15 +1,22 @@ -# Copyright 2013 Hardcoded Software (http://www.hardcoded.net) +# Copyright 2017 Virgil Dupras -# This software is licensed under the "BSD" License as described in the "LICENSE" file, -# which should be included with this package. The terms are also available at +# This software is licensed under the "BSD" License as described in the "LICENSE" file, +# which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license from __future__ import unicode_literals import sys -if sys.version < '3': +import os + +PY3 = sys.version_info[0] >= 3 +if PY3: + text_type = str + binary_type = bytes + if os.supports_bytes_environ: + # environb will be unset under Windows, but then again we're not supposed to use it. + environb = os.environb +else: text_type = unicode binary_type = str -else: - text_type = str - binary_type = bytes + environb = os.environ
--- a/ThirdParty/Send2Trash/send2trash/plat_gio.py Sun Nov 19 13:06:01 2017 +0100 +++ b/ThirdParty/Send2Trash/send2trash/plat_gio.py Sat Dec 02 12:40:22 2017 +0100 @@ -1,7 +1,7 @@ -# Copyright 2013 Hardcoded Software (http://www.hardcoded.net) +# Copyright 2017 Virgil Dupras -# This software is licensed under the "BSD" License as described in the "LICENSE" file, -# which should be included with this package. The terms are also available at +# This software is licensed under the "BSD" License as described in the "LICENSE" file, +# which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license from __future__ import unicode_literals
--- a/ThirdParty/Send2Trash/send2trash/plat_osx.py Sun Nov 19 13:06:01 2017 +0100 +++ b/ThirdParty/Send2Trash/send2trash/plat_osx.py Sat Dec 02 12:40:22 2017 +0100 @@ -1,7 +1,7 @@ -# Copyright 2013 Hardcoded Software (http://www.hardcoded.net) +# Copyright 2017 Virgil Dupras -# This software is licensed under the "BSD" License as described in the "LICENSE" file, -# which should be included with this package. The terms are also available at +# This software is licensed under the "BSD" License as described in the "LICENSE" file, +# which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license from __future__ import unicode_literals
--- a/ThirdParty/Send2Trash/send2trash/plat_other.py Sun Nov 19 13:06:01 2017 +0100 +++ b/ThirdParty/Send2Trash/send2trash/plat_other.py Sat Dec 02 12:40:22 2017 +0100 @@ -1,7 +1,7 @@ -# Copyright 2013 Hardcoded Software (http://www.hardcoded.net) +# Copyright 2017 Virgil Dupras -# This software is licensed under the "BSD" License as described in the "LICENSE" file, -# which should be included with this package. The terms are also available at +# This software is licensed under the "BSD" License as described in the "LICENSE" file, +# which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license # This is a reimplementation of plat_other.py with reference to the @@ -15,10 +15,6 @@ # find or create the user's trash directory. from __future__ import unicode_literals -try: - str = unicode -except NameError: - pass import sys import os @@ -31,28 +27,46 @@ # Python 2 from urllib import quote -FILES_DIR = 'files' -INFO_DIR = 'info' -INFO_SUFFIX = '.trashinfo' +from .compat import text_type, environb + +try: + fsencode = os.fsencode # Python 3 + fsdecode = os.fsdecode +except AttributeError: + def fsencode(u): # Python 2 + return u.encode(sys.getfilesystemencoding()) + def fsdecode(b): + return b.decode(sys.getfilesystemencoding()) + # The Python 3 versions are a bit smarter, handling surrogate escapes, + # but these should work in most cases. + +FILES_DIR = b'files' +INFO_DIR = b'info' +INFO_SUFFIX = b'.trashinfo' # Default of ~/.local/share [3] -XDG_DATA_HOME = op.expanduser(os.environ.get('XDG_DATA_HOME', '~/.local/share')) -HOMETRASH = op.join(XDG_DATA_HOME, 'Trash') +XDG_DATA_HOME = op.expanduser(environb.get(b'XDG_DATA_HOME', b'~/.local/share')) +HOMETRASH_B = op.join(XDG_DATA_HOME, b'Trash') +HOMETRASH = fsdecode(HOMETRASH_B) uid = os.getuid() -TOPDIR_TRASH = '.Trash' -TOPDIR_FALLBACK = '.Trash-' + str(uid) +TOPDIR_TRASH = b'.Trash' +TOPDIR_FALLBACK = b'.Trash-' + text_type(uid).encode('ascii') def is_parent(parent, path): path = op.realpath(path) # In case it's a symlink + if isinstance(path, text_type): + path = fsencode(path) parent = op.realpath(parent) + if isinstance(parent, text_type): + parent = fsencode(parent) return path.startswith(parent) def format_date(date): return date.strftime("%Y-%m-%dT%H:%M:%S") def info_for(src, topdir): - # ...it MUST not include a ".."" directory, and for files not "under" that + # ...it MUST not include a ".." directory, and for files not "under" that # directory, absolute pathnames must be used. [2] if topdir is None or not is_parent(topdir, src): src = op.abspath(src) @@ -79,22 +93,15 @@ destname = filename while op.exists(op.join(filespath, destname)) or op.exists(op.join(infopath, destname + INFO_SUFFIX)): counter += 1 - destname = '%s %s%s' % (base_name, counter, ext) - + destname = base_name + b' ' + text_type(counter).encode('ascii') + ext + check_create(filespath) check_create(infopath) - + os.rename(src, op.join(filespath, destname)) f = open(op.join(infopath, destname + INFO_SUFFIX), 'w') f.write(info_for(src, topdir)) f.close() - - # added by detlev@die-offenbachs.de to update the Trash metadata file - metadata = op.join(dst, "metadata") - entriesCount = len(os.listdir(filespath)) - f = open(metadata, 'w') - f.write("[Cached]\nSize={0}\n".format(entriesCount)) - f.close() def find_mount_point(path): # Even if something's wrong, "/" is a mount point, so the loop will exit. @@ -110,14 +117,14 @@ trash_dir = op.join(volume_root, TOPDIR_TRASH) if not op.exists(trash_dir): return None - + mode = os.lstat(trash_dir).st_mode # vol/.Trash must be a directory, cannot be a symlink, and must have the # sticky bit set. if not op.isdir(trash_dir) or op.islink(trash_dir) or not (mode & stat.S_ISVTX): return None - trash_dir = op.join(trash_dir, str(uid)) + trash_dir = op.join(trash_dir, text_type(uid).encode('ascii')) try: check_create(trash_dir) except OSError: @@ -143,29 +150,37 @@ return os.lstat(path).st_dev def send2trash(path): - if not isinstance(path, str): - path = str(path, sys.getfilesystemencoding()) - if not op.exists(path): + if isinstance(path, text_type): + path_b = fsencode(path) + elif isinstance(path, bytes): + path_b = path + elif hasattr(path, '__fspath__'): + # Python 3.6 PathLike protocol + return send2trash(path.__fspath__()) + else: + raise TypeError('str, bytes or PathLike expected, not %r' % type(path)) + + if not op.exists(path_b): raise OSError("File not found: %s" % path) # ...should check whether the user has the necessary permissions to delete # it, before starting the trashing operation itself. [2] - if not os.access(path, os.W_OK): + if not os.access(path_b, os.W_OK): raise OSError("Permission denied: %s" % path) # if the file to be trashed is on the same device as HOMETRASH we # want to move it there. - path_dev = get_dev(path) - + path_dev = get_dev(path_b) + # If XDG_DATA_HOME or HOMETRASH do not yet exist we need to stat the # home directory, and these paths will be created further on if needed. - trash_dev = get_dev(op.expanduser('~')) + trash_dev = get_dev(op.expanduser(b'~')) if path_dev == trash_dev: topdir = XDG_DATA_HOME - dest_trash = HOMETRASH + dest_trash = HOMETRASH_B else: - topdir = find_mount_point(path) + topdir = find_mount_point(path_b) trash_dev = get_dev(topdir) if trash_dev != path_dev: raise OSError("Couldn't find mount point for %s" % path) dest_trash = find_ext_volume_trash(topdir) - trash_move(path, dest_trash, topdir) + trash_move(path_b, dest_trash, topdir)
--- a/ThirdParty/Send2Trash/send2trash/plat_win.py Sun Nov 19 13:06:01 2017 +0100 +++ b/ThirdParty/Send2Trash/send2trash/plat_win.py Sat Dec 02 12:40:22 2017 +0100 @@ -1,12 +1,13 @@ -# Copyright 2013 Hardcoded Software (http://www.hardcoded.net) +# Copyright 2017 Virgil Dupras -# This software is licensed under the "BSD" License as described in the "LICENSE" file, -# which should be included with this package. The terms are also available at +# This software is licensed under the "BSD" License as described in the "LICENSE" file, +# which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license from __future__ import unicode_literals -from ctypes import windll, Structure, byref, c_uint +from ctypes import (windll, Structure, byref, c_uint, + create_unicode_buffer, sizeof, addressof) from ctypes.wintypes import HWND, UINT, LPCWSTR, BOOL import os.path as op @@ -46,7 +47,19 @@ fileop = SHFILEOPSTRUCTW() fileop.hwnd = 0 fileop.wFunc = FO_DELETE - fileop.pFrom = LPCWSTR(path + '\0') + # FIX: https://github.com/hsoft/send2trash/issues/17 + # Starting in python 3.6.3 it is no longer possible to use: + # LPCWSTR(path + '\0') directly as embedded null characters are no longer + # allowed in strings + # Workaround + # - create buffer of c_wchar[] (LPCWSTR is based on this type) + # - buffer is two c_wchar characters longer (double null terminator) + # - cast the address of the buffer to a LPCWSTR + # NOTE: based on how python allocates memory for these types they should + # always be zero, if this is ever not true we can go back to explicitly + # setting the last two characters to null using buffer[index] = '\0'. + buffer = create_unicode_buffer(path, len(path)+2) + fileop.pFrom = LPCWSTR(addressof(buffer)) fileop.pTo = None fileop.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT fileop.fAnyOperationsAborted = 0 @@ -54,6 +67,4 @@ fileop.lpszProgressTitle = None result = SHFileOperationW(byref(fileop)) if result: - msg = "Couldn't perform operation. Error code: %d" % result - raise OSError(msg) - + raise WindowsError(None, None, path, result)
--- a/UI/Browser.py Sun Nov 19 13:06:01 2017 +0100 +++ b/UI/Browser.py Sat Dec 02 12:40:22 2017 +0100 @@ -463,6 +463,8 @@ self.multiProjectFile.emit(itm.fileName()) elif itm.isIdlFile(): self.sourceFile[str].emit(itm.fileName()) + elif itm.isProtobufFile(): + self.sourceFile[str].emit(itm.fileName()) elif itm.isResourcesFile(): self.sourceFile[str].emit(itm.fileName()) elif itm.isSvgFile():
--- a/UI/BrowserModel.py Sun Nov 19 13:06:01 2017 +0100 +++ b/UI/BrowserModel.py Sat Dec 02 12:40:22 2017 +0100 @@ -1135,6 +1135,11 @@ self._populated = False self._lazyPopulation = True self._moduleName = os.path.basename(finfo) + elif self.isProtobufFile(): + pixName = "protobuf.png" + self._populated = False + self._lazyPopulation = True + self._moduleName = os.path.basename(finfo) elif self.isSvgFile(): pixName = "fileSvg.png" elif self.isPixmapFile(): @@ -1165,7 +1170,8 @@ self._filename = os.path.abspath(finfo) self.itemData[0] = os.path.basename(finfo) if self.isPython2File() or self.isPython3File() or \ - self.isRubyFile() or self.isIdlFile(): + self.isRubyFile() or self.isIdlFile() or \ + self.isProtobufFile(): self._dirName = os.path.dirname(finfo) self._moduleName = os.path.basename(finfo) @@ -1285,6 +1291,15 @@ """ return self.fileext == '.idl' + def isProtobufFile(self): + """ + Public method to check, if this file is a Google Protocol Buffer file. + + @return flag indicating a protobuf file + @rtype bool + """ + return self.fileext == ".proto" + def isJavaScriptFile(self): """ Public method to check, if this file is a JavaScript file. @@ -1382,6 +1397,9 @@ self.ismodule = isinstance( self._classObject, Utilities.ClassBrowsers.ClbrBaseClasses.Module) + self.isenum = isinstance( + self._classObject, + Utilities.ClassBrowsers.ClbrBaseClasses.Enum) if self.isfunction: if cl.isPrivate(): self.icon = UI.PixmapCache.getIcon("method_private.png") @@ -1400,6 +1418,8 @@ # for e in self._classObject.parameters])) elif self.ismodule: self.icon = UI.PixmapCache.getIcon("module.png") + elif self.isenum: + self.icon = UI.PixmapCache.getIcon("attribute.png") else: if cl.isPrivate(): self.icon = UI.PixmapCache.getIcon("class_private.png")
--- a/UI/CodeDocumentationViewer.py Sun Nov 19 13:06:01 2017 +0100 +++ b/UI/CodeDocumentationViewer.py Sat Dec 02 12:40:22 2017 +0100 @@ -59,7 +59,7 @@ self.__contents.setObjectName("contents") self.__verticalLayout.addWidget(self.__contents) - self.__searchWidget = E5TextEditSearchWidget(self) + self.__searchWidget = E5TextEditSearchWidget(self, False) self.__searchWidget.setFocusPolicy(Qt.WheelFocus) self.__searchWidget.setObjectName("searchWidget") self.__verticalLayout.addWidget(self.__searchWidget) @@ -139,7 +139,7 @@ self.__contents.setUrl(QUrl("about:blank")) self.__verticalLayout.addWidget(self.__contents) - self.__searchWidget = E5TextEditSearchWidget(self) + self.__searchWidget = E5TextEditSearchWidget(self, False) self.__searchWidget.setFocusPolicy(Qt.WheelFocus) self.__searchWidget.setObjectName("searchWidget") self.__verticalLayout.addWidget(self.__searchWidget) @@ -210,7 +210,6 @@ self.__lastDocumentation = None self.__requestingEditor = None - def __setupUi(self): """ @@ -222,14 +221,15 @@ self.verticalLayout.setObjectName("verticalLayout") self.verticalLayout.setContentsMargins(3, 3, 3, 3) - # top row of widgets - self.horizontalLayout = QHBoxLayout() - self.horizontalLayout.setObjectName("horizontalLayout") + # top row 1 of widgets + self.horizontalLayout1 = QHBoxLayout() + self.horizontalLayout1.setObjectName("horizontalLayout1") self.label = QLabel(self) self.label.setObjectName("label") self.label.setText(self.tr("Code Info Provider:")) - self.horizontalLayout.addWidget(self.label) + self.label.setAlignment(Qt.AlignRight | Qt.AlignVCenter) + self.horizontalLayout1.addWidget(self.label) self.providerComboBox = QComboBox(self) sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed) @@ -243,12 +243,29 @@ self.providerComboBox.setToolTip( self.tr("Select the code info provider")) self.providerComboBox.addItem(self.tr("<disabled>"), "disabled") - self.horizontalLayout.addWidget(self.providerComboBox) + self.horizontalLayout1.addWidget(self.providerComboBox) + + # top row 2 of widgets + self.horizontalLayout2 = QHBoxLayout() + self.horizontalLayout2.setObjectName("horizontalLayout2") self.objectLineEdit = QLineEdit(self) self.objectLineEdit.setReadOnly(True) self.objectLineEdit.setObjectName("objectLineEdit") - self.horizontalLayout.addWidget(self.objectLineEdit) + self.horizontalLayout2.addWidget(self.objectLineEdit) + + self.verticalLayout.addLayout(self.horizontalLayout1) + self.verticalLayout.addLayout(self.horizontalLayout2) + + # Plain Text Viewer + self.__plainTextViewer = PlainTextDocumentationViewer(self) + self.__plainTextViewer.setObjectName("__plainTextViewer") + self.verticalLayout.addWidget(self.__plainTextViewer) + + # Rich Text (Web) Viewer + self.__richTextViewer = WebViewDocumentationViewer(self) + self.__richTextViewer.setObjectName("__richTextViewer") + self.verticalLayout.addWidget(self.__richTextViewer) self.__toolButton = E5ToolButton(self) self.__toolButton.setObjectName( @@ -261,34 +278,22 @@ self.__toolButton.setAutoRaise(True) self.__toolButton.setShowMenuInside(True) + self.__optionsActionGroup = QActionGroup(self) + self.__optionsActionGroup.setExclusive(True) self.__optionsMenu = QMenu(self) self.__richTextAct = self.__optionsMenu.addAction( self.tr("Rich Text"), lambda: self.__showTextViewer(True)) self.__richTextAct.setCheckable(True) + self.__optionsActionGroup.addAction(self.__richTextAct) self.__plainTextAct = self.__optionsMenu.addAction( self.tr("Plain Text"), lambda: self.__showTextViewer(False)) self.__plainTextAct.setCheckable(True) - self.__optionsActionGroup = QActionGroup(self) - self.__optionsActionGroup.setExclusive(True) - self.__optionsActionGroup.addAction(self.__richTextAct) self.__optionsActionGroup.addAction(self.__plainTextAct) self.__toolButton.setMenu(self.__optionsMenu) - self.horizontalLayout.addWidget(self.__toolButton) - - self.verticalLayout.addLayout(self.horizontalLayout) - - # Plain Text Viewer - self.__plainTextViewer = PlainTextDocumentationViewer(self) - self.__plainTextViewer.setObjectName("__plainTextViewer") - self.verticalLayout.addWidget(self.__plainTextViewer) - - # Rich Text (Web) Viewer - self.__richTextViewer = WebViewDocumentationViewer(self) - self.__richTextViewer.setObjectName("__richTextViewer") - self.verticalLayout.addWidget(self.__richTextViewer) + self.horizontalLayout2.addWidget(self.__toolButton) self.providerComboBox.currentIndexChanged[int].connect( self.on_providerComboBox_currentIndexChanged) @@ -297,7 +302,8 @@ """ Public method to finalize the setup of the documentation viewer. """ - self.__showTextViewer(Preferences.getDocuViewer("ShowInfoAsRichText")) + self.__showTextViewer( + Preferences.getDocuViewer("ShowInfoAsRichText")) self.__startingUp = False provider = Preferences.getDocuViewer("Provider") @@ -311,7 +317,6 @@ if index == 0: self.__showDisabledMessage() - # TODO: document this hook in the plug-in document def registerProvider(self, providerName, providerDisplay, provider, supported): """ @@ -338,7 +343,6 @@ self.providerAdded.emit() - # TODO: document this hook in the plug-in document def unregisterProvider(self, providerName): """ Public method register a source docu provider. @@ -407,20 +411,20 @@ self.__richTextViewer.clear() self.__providers[self.__selectedProvider][0](editor) - # TODO: document this hook in the plug-in document def documentationReady(self, documentationInfo, isWarning=False, isDocWarning=False): """ Public method to provide the documentation info to the viewer. - If documentationInfo is a dictionary, it should contains these keys - and data: + If documentationInfo is a dictionary, it should contain these + (optional) keys and data: name: the name of the inspected object - argspec: its argspec + argspec: its arguments specification note: A phrase describing the type of object (function or method) and the module it belongs to. docstring: its documentation string + typ: its type information @param documentationInfo dictionary containing the source docu data @type dict or str @@ -462,27 +466,47 @@ if name: title = "".join([name, "\n", "=" * len(name), "\n\n"]) - else: - title = "" - if documentationInfo["argspec"]: - definition = self.tr("Definition: {0}{1}\n").format( - name, documentationInfo["argspec"]) + if "argspec" in documentationInfo and \ + documentationInfo["argspec"]: + definition = self.tr("Definition: {0}{1}\n")\ + .format(name, documentationInfo["argspec"]) + elif name: + definition = self.tr("Definition: {0}\n")\ + .format(name) + else: + definition = "" + + if "typ" in documentationInfo and \ + documentationInfo["typ"]: + typeInfo = self.tr("Type: {0}\n").format( + documentationInfo["typ"]) + else: + typeInfo = "" + + if "note" in documentationInfo and \ + documentationInfo["note"]: + note = self.tr("Note: {0}\n").format( + documentationInfo["note"]) + else: + note = "" + + header = "".join([title, definition, typeInfo, note]) else: - definition = '' - - if documentationInfo["note"]: - note = self.tr("Info: {0}\n\n----\n\n").format( - documentationInfo["note"]) + header = "" + + if "docstring" not in documentationInfo or \ + not documentationInfo["docstring"]: + docString = self.tr( + "No further documentation available") else: - note = "" + if header: + docString = "\n----\n\n{0}".format( + documentationInfo["docstring"]) + else: + docString = documentationInfo["docstring"] - if documentationInfo["docstring"] is None: - docString = "" - else: - docString = documentationInfo["docstring"] - - fullText = "".join([title, definition, note, docString]) + fullText = "".join([header, docString]) self.__plainTextViewer.setText(fullText)
--- a/UI/CodeDocumentationViewerTemplate.py Sun Nov 19 13:06:01 2017 +0100 +++ b/UI/CodeDocumentationViewerTemplate.py Sat Dec 02 12:40:22 2017 +0100 @@ -51,6 +51,7 @@ metadataTemplate = """ <div class="metadata"> @ARGSPEC@ + @TYPE@ @NOTE@ </div> """ @@ -60,6 +61,11 @@ '<p><b>Definition:</b> <span class="def">@NAME@@ARGSPEC@</span></p>', "Just translate 'Definition:' and leave the rest intact.") + typeTemplate = QCoreApplication.translate( + "CodeDocumentationViewer", + "<p><b>Type:</b> @TYPE@</p>", + "Just translate 'Type:' and leave the rest intact.") + noteTemplate = QCoreApplication.translate( "CodeDocumentationViewer", "<p><b>Note:</b> @NOTE@</p>", @@ -74,29 +80,37 @@ name = documentationInfo["name"] if name: title = titleTemplate.replace("@NAME@", name) - if documentationInfo["argspec"] or documentationInfo["note"]: - if documentationInfo["argspec"]: - argspec = Utilities.html_encode(documentationInfo["argspec"]) - for char in ['=', ',', '(', ')', '*', '**']: - argspec = argspec.replace( - char, - '<span class="argspec-highlight">{0}</span>'.format( - char)) - argspec = argspecTemplate\ - .replace("@NAME@", name)\ - .replace("@ARGSPEC@", argspec) - else: - argspec = "" - if documentationInfo["note"]: - note = noteTemplate.replace("@NOTE@", - documentationInfo["note"]) - else: - note = "" - metaData = metadataTemplate\ - .replace("@ARGSPEC@", argspec)\ - .replace("@NOTE@", note) + if "argspec" in documentationInfo and documentationInfo["argspec"]: + argspec = Utilities.html_encode(documentationInfo["argspec"]) + for char in ['=', ',', '(', ')', '*', '**']: + argspec = argspec.replace( + char, + '<span class="argspec-highlight">{0}</span>'.format( + char)) + argspec = argspecTemplate\ + .replace("@NAME@", name)\ + .replace("@ARGSPEC@", argspec) else: - metaData = "" + argspec = argspecTemplate\ + .replace("@NAME@", name)\ + .replace("@ARGSPEC@", "") + + if "typ" in documentationInfo and documentationInfo["typ"]: + typeInfo = typeTemplate.replace("@TYPE@", + documentationInfo["typ"]) + else: + typeInfo = "" + + if "note" in documentationInfo and documentationInfo["note"]: + note = noteTemplate.replace("@NOTE@", + documentationInfo["note"]) + else: + note = "" + + metaData = metadataTemplate\ + .replace("@ARGSPEC@", argspec)\ + .replace("@TYPE@", typeInfo)\ + .replace("@NOTE@", note) header = headerTemplate\ .replace("@TITLE@", title)\ @@ -104,7 +118,7 @@ else: header = "" - if documentationInfo["docstring"]: + if "docstring" in documentationInfo and documentationInfo["docstring"]: docstring = documentationInfo["docstring"]\ .replace("\r\n", "<br/>")\ .replace("\n", "<br/>")\
--- a/UI/FindFileDialog.py Sun Nov 19 13:06:01 2017 +0100 +++ b/UI/FindFileDialog.py Sat Dec 02 12:40:22 2017 +0100 @@ -123,6 +123,10 @@ self.filterInterfaces = r'.*\.idl$' self.interfacesExt = ['*.idl'] + # Protobuf protocol files + self.filterProtocols = r'.*\.proto$' + self.protocolsExt = ['*.proto'] + # Qt resources files self.filterResources = r'.*\.qrc$' self.resourcesExt = ['*.qrc'] @@ -327,6 +331,8 @@ files += self.project.pdata["FORMS"] if self.interfacesCheckBox.isChecked(): files += self.project.pdata["INTERFACES"] + if self.protocolsCheckBox.isChecked(): + files += self.project.pdata["PROTOCOLS"] if self.resourcesCheckBox.isChecked(): files += self.project.pdata["RESOURCES"] elif self.dirButton.isChecked(): @@ -338,11 +344,14 @@ assoc.replace(".", "\.").replace("*", ".*")) for assoc in list( Preferences.getEditorLexerAssocs().keys()) - if assoc not in self.formsExt + self.interfacesExt]) + if assoc not in self.formsExt + self.interfacesExt + + self.protocolsExt]) if self.formsCheckBox.isChecked(): filters.append(self.filterForms) if self.interfacesCheckBox.isChecked(): filters.append(self.filterInterfaces) + if self.protocolsCheckBox.isChecked(): + filters.append(self.filterProtocols) if self.resourcesCheckBox.isChecked(): filters.append(self.filterResources) filterString = "|".join(filters)
--- a/UI/FindFileDialog.ui Sun Nov 19 13:06:01 2017 +0100 +++ b/UI/FindFileDialog.ui Sat Dec 02 12:40:22 2017 +0100 @@ -7,13 +7,13 @@ <x>0</x> <y>0</y> <width>600</width> - <height>750</height> + <height>800</height> </rect> </property> <property name="windowTitle"> <string>Find in Files</string> </property> - <layout class="QVBoxLayout" name="verticalLayout"> + <layout class="QVBoxLayout" name="verticalLayout_3"> <item> <layout class="QGridLayout" name="gridLayout_3"> <item row="0" column="0"> @@ -127,7 +127,7 @@ </layout> </item> <item> - <layout class="QHBoxLayout" name="horizontalLayout"> + <layout class="QHBoxLayout" name="horizontalLayout_4"> <item> <widget class="QGroupBox" name="groupBox"> <property name="title"> @@ -148,12 +148,12 @@ </widget> </item> <item row="0" column="1"> - <widget class="QCheckBox" name="resourcesCheckBox"> + <widget class="QCheckBox" name="interfacesCheckBox"> <property name="toolTip"> - <string>Search in resources</string> + <string>Search in interfaces</string> </property> <property name="text"> - <string>&Resources</string> + <string>&Interfaces</string> </property> </widget> </item> @@ -168,118 +168,57 @@ </widget> </item> <item row="1" column="1"> - <widget class="QCheckBox" name="interfacesCheckBox"> + <widget class="QCheckBox" name="protocolsCheckBox"> <property name="toolTip"> - <string>Search in interfaces</string> + <string>Search in protocols</string> </property> <property name="text"> - <string>&Interfaces</string> + <string>&Protocols</string> </property> </widget> </item> - <item row="2" column="0" colspan="2"> + <item row="2" column="0"> + <widget class="QCheckBox" name="resourcesCheckBox"> + <property name="toolTip"> + <string>Search in resources</string> + </property> + <property name="text"> + <string>&Resources</string> + </property> + </widget> + </item> + <item row="3" column="0" colspan="2"> <widget class="Line" name="line"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> - <item row="3" column="0"> - <widget class="QCheckBox" name="filterCheckBox"> - <property name="toolTip"> - <string>Select to filter the files by a given filename pattern</string> - </property> - <property name="text"> - <string>Fi&lter</string> - </property> - </widget> - </item> - <item row="3" column="1"> - <widget class="QLineEdit" name="filterEdit"> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="toolTip"> - <string>Enter the filename wildcards separated by ';'</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QGroupBox" name="groupBox_2"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="title"> - <string>Find in</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item row="4" column="0" colspan="2"> + <layout class="QHBoxLayout" name="horizontalLayout"> <item> - <widget class="QRadioButton" name="projectButton"> + <widget class="QCheckBox" name="filterCheckBox"> <property name="toolTip"> - <string>Search in files of the current project</string> + <string>Select to filter the files by a given filename pattern</string> </property> <property name="text"> - <string>&Project</string> - </property> - <property name="checked"> - <bool>true</bool> + <string>Fi&lter</string> </property> </widget> </item> <item> - <widget class="QRadioButton" name="dirButton"> - <property name="toolTip"> - <string>Search in files of a directory tree to be entered below</string> - </property> - <property name="text"> - <string>&Directory tree</string> + <widget class="QLineEdit" name="filterEdit"> + <property name="enabled"> + <bool>false</bool> </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="E5ComboPathPicker" name="dirPicker" native="true"> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="focusPolicy"> - <enum>Qt::WheelFocus</enum> - </property> - <property name="toolTip"> - <string>Enter the directory to search in</string> - </property> - </widget> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_5"> - <item> - <widget class="QRadioButton" name="openFilesButton"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> <property name="toolTip"> - <string>Search in open files only </string> - </property> - <property name="text"> - <string>&Open files only</string> + <string>Enter the filename wildcards separated by ';'</string> </property> </widget> </item> @@ -288,6 +227,98 @@ </layout> </widget> </item> + <item> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QGroupBox" name="groupBox_2"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="title"> + <string>Find in</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <widget class="QRadioButton" name="projectButton"> + <property name="toolTip"> + <string>Search in files of the current project</string> + </property> + <property name="text"> + <string>&Project</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QRadioButton" name="dirButton"> + <property name="toolTip"> + <string>Search in files of a directory tree to be entered below</string> + </property> + <property name="text"> + <string>&Directory tree</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="E5ComboPathPicker" name="dirPicker" native="true"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>Qt::WheelFocus</enum> + </property> + <property name="toolTip"> + <string>Enter the directory to search in</string> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_5"> + <item> + <widget class="QRadioButton" name="openFilesButton"> + <property name="toolTip"> + <string>Search in open files only </string> + </property> + <property name="text"> + <string>&Open files only</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> </layout> </item> <item> @@ -394,6 +425,7 @@ <tabstop>formsCheckBox</tabstop> <tabstop>resourcesCheckBox</tabstop> <tabstop>interfacesCheckBox</tabstop> + <tabstop>protocolsCheckBox</tabstop> <tabstop>filterCheckBox</tabstop> <tabstop>filterEdit</tabstop> <tabstop>projectButton</tabstop>
--- a/UI/UserInterface.py Sun Nov 19 13:06:01 2017 +0100 +++ b/UI/UserInterface.py Sat Dec 02 12:40:22 2017 +0100 @@ -357,6 +357,15 @@ self.projectBrowser.piBrowser.appendStdout.connect(self.appendToStdout) self.projectBrowser.piBrowser.appendStderr.connect(self.appendToStderr) + self.projectBrowser.ppBrowser.sourceFile[str].connect( + self.viewmanager.openSourceFile) + self.projectBrowser.ppBrowser.sourceFile[str, int].connect( + self.viewmanager.openSourceFile) + self.projectBrowser.ppBrowser.closeSourceWindow.connect( + self.viewmanager.closeWindow) + self.projectBrowser.ppBrowser.appendStdout.connect(self.appendToStdout) + self.projectBrowser.ppBrowser.appendStderr.connect(self.appendToStderr) + self.projectBrowser.poBrowser.sourceFile.connect( self.viewmanager.openSourceFile) self.projectBrowser.poBrowser.closeSourceWindow.connect( @@ -445,6 +454,8 @@ self.preferencesChanged.connect( self.projectBrowser.piBrowser.handlePreferencesChanged) self.preferencesChanged.connect( + self.projectBrowser.ppBrowser.handlePreferencesChanged) + self.preferencesChanged.connect( self.projectBrowser.poBrowser.handlePreferencesChanged) self.preferencesChanged.connect(self.browser.handlePreferencesChanged) self.preferencesChanged.connect(
--- a/UI/data/codeDocumentationViewer_rc.py Sun Nov 19 13:06:01 2017 +0100 +++ b/UI/data/codeDocumentationViewer_rc.py Sat Dec 02 12:40:22 2017 +0100 @@ -343,7 +343,7 @@ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x01\x5f\x3f\x12\x31\xf2\ +\x00\x00\x01\x5f\x87\xf0\xf7\x48\ " qt_version = QtCore.qVersion().split('.')
--- a/Utilities/ClassBrowsers/ClbrBaseClasses.py Sun Nov 19 13:06:01 2017 +0100 +++ b/Utilities/ClassBrowsers/ClbrBaseClasses.py Sat Dec 02 12:40:22 2017 +0100 @@ -19,10 +19,14 @@ """ Constructor - @param module name of the module containing this class - @param name name of this class + @param module name of the module containing this object + @type str + @param name name of this object + @type str @param file filename containing this object - @param lineno linenumber of the class definition + @type str + @param lineno linenumber of the object definition + @type int """ self.module = module self.name = name @@ -34,7 +38,8 @@ """ Public method to set the ending line number. - @param endLineNo number of the last line (integer) + @param endLineNo number of the last line + @type int """ self.endlineno = endLineNo @@ -47,10 +52,14 @@ """ Constructor - @param module name of the module containing this class - @param name name of this class + @param module name of the module containing this object + @type str + @param name name of this object + @type str @param file filename containing this object - @param lineno linenumber of the class definition + @type str + @param lineno linenumber of the object definition + @type int """ _ClbrBase.__init__(self, module, name, file, lineno) self.methods = {} @@ -62,8 +71,10 @@ """ Protected method to add information about a method. - @param name name of method to be added (string) + @param name name of method to be added + @type str @param function Function object to be added + @type Function """ self.methods[name] = function @@ -72,7 +83,9 @@ Protected method to retrieve a method by name. @param name name of the method (string) - @return the named method or None + @type str + @return the named method + @rtype Function or None """ try: return self.methods[name] @@ -83,7 +96,8 @@ """ Protected method to add information about global variables. - @param attr Attribute object to be added (Attribute) + @param attr Attribute object to be added + @type Attribute """ if attr.name not in self.globals: self.globals[attr.name] = attr @@ -94,8 +108,10 @@ """ Protected method to retrieve a global variable by name. - @param name name of the global variable (string) - @return the named global variable or None + @param name name of the global variable + @type str + @return the named global variable + @rtype Attribute or None """ try: return self.globals[name] @@ -106,7 +122,8 @@ """ Protected method to add information about attributes. - @param attr Attribute object to be added (Attribute) + @param attr Attribute object to be added + @type Attribute """ if attr.name not in self.attributes: self.attributes[attr.name] = attr @@ -117,8 +134,10 @@ """ Protected method to retrieve an attribute by name. - @param name name of the attribute (string) - @return the named attribute or None + @param name name of the attribute + @type str + @return the named attribute + @rtype Attribute or None """ try: return self.attributes[name] @@ -130,7 +149,9 @@ Protected method method to add a nested class to this class. @param name name of the class - @param _class Class object to be added (Class) + @type str + @param _class Class object to be added + @type Class """ self.classes[name] = _class @@ -143,7 +164,8 @@ """ Public method to check, if the visibility is Private. - @return flag indicating Private visibility (boolean) + @return flag indicating Private visibility + @rtype bool """ return self.visibility == 0 @@ -151,7 +173,8 @@ """ Public method to check, if the visibility is Protected. - @return flag indicating Protected visibility (boolean) + @return flag indicating Protected visibility + @rtype bool """ return self.visibility == 1 @@ -159,7 +182,8 @@ """ Public method to check, if the visibility is Public. - @return flag indicating Public visibility (boolean) + @return flag indicating Public visibility + @rtype bool """ return self.visibility == 2 @@ -190,10 +214,14 @@ """ Constructor - @param module name of the module containing this class - @param name name of this class + @param module name of the module containing this attribute + @type str + @param name name of this attribute + @type str @param file filename containing this attribute - @param lineno linenumber of the class definition + @type str + @param lineno line number of the attribute definition + @type int """ _ClbrBase.__init__(self, module, name, file, lineno) @@ -203,8 +231,8 @@ """ Public method to add another assignment line number. - @param lineno linenumber of the additional attribute assignment - (integer) + @param lineno line number of the additional attribute assignment + @type int """ if lineno not in self.linenos: self.linenos.append(lineno) @@ -219,10 +247,15 @@ Constructor @param module name of the module containing this class + @type str @param name name of this class + @type str @param superClasses list of class names this class is inherited from + @type list of str @param file filename containing this class - @param lineno linenumber of the class definition + @type str + @param lineno line number of the class definition + @type int """ ClbrBase.__init__(self, module, name, file, lineno) if superClasses is None: @@ -239,9 +272,13 @@ Constructor @param module name of the module containing this module + @type str @param name name of this module + @type str @param file filename containing this module - @param lineno linenumber of the module definition + @type str + @param lineno line number of the module definition + @type int """ ClbrBase.__init__(self, module, name, file, lineno) @@ -260,13 +297,21 @@ Constructor @param module name of the module containing this function + @type str @param name name of this function - @param file filename containing this class - @param lineno linenumber of the class definition - @param signature parameterlist of the method - @param separator string separating the parameters + @type str + @param file filename containing this function + @type str + @param lineno line number of the function definition + @type int + @param signature parameter list of the function + @type str + @param separator string separating the parameters of the function + @type str @param modifierType type of the function - @param annotation return annotation + @type int + @param annotation function return annotation + @type str """ ClbrBase.__init__(self, module, name, file, lineno) self.parameters = [e.strip() for e in signature.split(separator)] @@ -282,10 +327,34 @@ """ Constructor - @param module name of the module containing this module - @param file filename containing this module - @param lineno linenumber of the module definition + @param module name of the module containing this coding statement + @type str + @param file filename containing this coding statement + @type str + @param lineno line number of the coding definition + @type int @param coding character coding of the source file + @type str """ ClbrBase.__init__(self, module, "Coding", file, lineno) self.coding = coding + + +class Enum(ClbrBase): + """ + Class to represent an enum definition. + """ + def __init__(self, module, name, file, lineno): + """ + Constructor + + @param module name of the module containing this enum + @type str + @param name name of this enum + @type str + @param file filename containing this enum + @type str + @param lineno line number of the enum definition + @type int + """ + ClbrBase.__init__(self, module, name, file, lineno)
--- a/Utilities/ClassBrowsers/__init__.py Sun Nov 19 13:06:01 2017 +0100 +++ b/Utilities/ClassBrowsers/__init__.py Sat Dec 02 12:40:22 2017 +0100 @@ -11,7 +11,10 @@ <ul> <li>CORBA IDL</li> -<li>Python</li> +<li>JavaScript</li> +<li>ProtoBuf</li> +<li>Python 2</li> +<li>Python 3</li> <li>Ruby</li> </ul> """ @@ -29,14 +32,17 @@ RB_SOURCE = 129 IDL_SOURCE = 130 JS_SOURCE = 131 +PROTO_SOURCE = 132 -SUPPORTED_TYPES = [PY_SOURCE, PTL_SOURCE, RB_SOURCE, IDL_SOURCE, JS_SOURCE] +SUPPORTED_TYPES = [PY_SOURCE, PTL_SOURCE, RB_SOURCE, IDL_SOURCE, JS_SOURCE, + PROTO_SOURCE] __extensions = { "IDL": [".idl"], "Python": [".py", ".pyw", ".ptl"], # currently not used "Ruby": [".rb"], "JavaScript": [".js"], + "ProtoBuf": [".proto"], } @@ -48,10 +54,14 @@ The real work of parsing the source file is delegated to the individual file parsers. - @param module name of the source file (string) - @param path path the file should be searched in (list of strings) - @param isPyFile flag indicating a Python file (boolean) + @param module name of the source file + @type str + @param path list of paths the file should be searched in + @type list of str + @param isPyFile flag indicating a Python file + @type bool @return the resulting dictionary + @rtype dict """ ext = os.path.splitext(module)[1].lower() path = [] if path is None else path[:] @@ -60,6 +70,10 @@ from . import idlclbr dictionary = idlclbr.readmodule_ex(module, path) idlclbr._modules.clear() + elif ext in __extensions["ProtoBuf"]: + from . import protoclbr + dictionary = protoclbr.readmodule_ex(module, path) + protoclbr._modules.clear() elif ext in __extensions["Ruby"]: from . import rbclbr dictionary = rbclbr.readmodule_ex(module, path) @@ -87,16 +101,20 @@ """ Module function to extend the Python module finding mechanism. - This function searches for files in the given path. If the filename - doesn't have an extension or an extension of .py, the normal search - implemented in the imp module is used. For all other supported files - only path is searched. + This function searches for files in the given list of paths. If the + file name doesn't have an extension or an extension of .py, the normal + Python search implemented in the imp module is used. For all other + supported files only the paths list is searched. - @param name filename or modulename to search for (string) - @param path search path (list of strings) - @param isPyFile flag indicating a Python file (boolean) + @param name file name or module name to search for + @type str + @param path search paths + @type list of str + @param isPyFile flag indicating a Python file + @type bool @return tuple of the open file, pathname and description. Description is a tuple of file suffix, file mode and file type) + @rtype tuple @exception ImportError The file or module wasn't found. """ ext = os.path.splitext(name)[1].lower() @@ -115,6 +133,13 @@ return (open(pathname), pathname, (ext, 'r', IDL_SOURCE)) raise ImportError + elif ext in __extensions["ProtoBuf"]: + for p in path: # only search in path + pathname = os.path.join(p, name) + if os.path.exists(pathname): + return (open(pathname), pathname, (ext, 'r', PROTO_SOURCE)) + raise ImportError + elif ext in __extensions["JavaScript"]: for p in path: # only search in path pathname = os.path.join(p, name)
--- a/Utilities/ClassBrowsers/idlclbr.py Sun Nov 19 13:06:01 2017 +0100 +++ b/Utilities/ClassBrowsers/idlclbr.py Sat Dec 02 12:40:22 2017 +0100 @@ -114,10 +114,14 @@ """ Constructor - @param module name of the module containing this class - @param name name of this class - @param file filename containing this class - @param lineno linenumber of the class definition + @param module name of the module containing this module + @type str + @param name name of this module + @type str + @param file filename containing this module + @type str + @param lineno line number of the module definition + @type int """ ClbrBaseClasses.Module.__init__(self, module, name, file, lineno) VisibilityMixin.__init__(self) @@ -131,12 +135,17 @@ """ Constructor - @param module name of the module containing this class + @param module name of the module containing this interface + @type str @param name name of this interface + @type str @param superClasses list of interface names this interface is inherited from + @type list of str @param file filename containing this interface - @param lineno linenumber of the interface definition + @type str + @param lineno line number of the interface definition + @type int """ ClbrBaseClasses.Class.__init__(self, module, name, superClasses, file, lineno) @@ -153,11 +162,17 @@ Constructor @param module name of the module containing this function + @type str @param name name of this function - @param file filename containing this class - @param lineno linenumber of the class definition - @param signature parameterlist of the method + @type str + @param file filename containing this function + @type str + @param lineno line number of the function definition + @type int + @param signature parameter list of the function + @type str @param separator string separating the parameters + @type str """ ClbrBaseClasses.Function.__init__(self, module, name, file, lineno, signature, separator) @@ -172,10 +187,14 @@ """ Constructor - @param module name of the module containing this class - @param name name of this class + @param module name of the module containing this attribute + @type str + @param name name of this attribute + @type str @param file filename containing this attribute - @param lineno linenumber of the class definition + @type str + @param lineno line number of the attribute definition + @type int """ ClbrBaseClasses.Attribute.__init__(self, module, name, file, lineno) VisibilityMixin.__init__(self) @@ -186,9 +205,12 @@ Read a CORBA IDL file and return a dictionary of classes, functions and modules. - @param module name of the CORBA IDL file (string) - @param path path the file should be searched in (list of strings) + @param module name of the CORBA IDL file + @type str + @param path path the file should be searched in + @type list of str @return the resulting dictionary + @rtype dict """ global _modules
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Utilities/ClassBrowsers/protoclbr.py Sat Dec 02 12:40:22 2017 +0100 @@ -0,0 +1,390 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2017 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Parse a ProtoBuf protocol file and retrieve messages, enums, services and +rpc methods. + +It is based on the Python class browser found in this package. +""" + +from __future__ import unicode_literals + +import re + +import Utilities +import Utilities.ClassBrowsers as ClassBrowsers +from . import ClbrBaseClasses + +SUPPORTED_TYPES = [ClassBrowsers.PROTO_SOURCE] + +_getnext = re.compile( + r""" + (?P<String> + " [^"\\\n]* (?: \\. [^"\\\n]*)* " + ) + +| (?P<Comment> + ^ [ \t]* // .*? $ + | + ^ [ \t]* /\* .*? \*/ + ) + +| (?P<Message> + ^ + (?P<MessageIndent> [ \t]* ) + message [ \t]+ + (?P<MessageName> [a-zA-Z_] [a-zA-Z0-9_]* ) + [ \t]* { + ) + +| (?P<Enum> + ^ + (?P<EnumIndent> [ \t]* ) + enum [ \t]+ + (?P<EnumName> [a-zA-Z_] [a-zA-Z0-9_]* ) + [ \t]* { + ) + +| (?P<Service> + ^ + (?P<ServiceIndent> [ \t]* ) + service [ \t]+ + (?P<ServiceName> [a-zA-Z_] [a-zA-Z0-9_]* ) + [ \t]* { + ) + +| (?P<Method> + ^ + (?P<MethodIndent> [ \t]* ) + rpc [ \t]+ + (?P<MethodName> [a-zA-Z_] [a-zA-Z0-9_]* ) + [ \t]* + \( + (?P<MethodSignature> [^)]+? ) + \) + [ \t]+ + returns + [ \t]* + \( + (?P<MethodReturn> [^)]+? ) + \) + [ \t]* + ) + +| (?P<Begin> + [ \t]* { + ) + +| (?P<End> + [ \t]* } [ \t]* ;? + )""", + re.VERBOSE | re.DOTALL | re.MULTILINE).search + +# function to replace comments +_commentsub = re.compile(r"""//[^\n]*\n|//[^\n]*$""").sub +# function to normalize whitespace +_normalize = re.compile(r"""[ \t]{2,}""").sub + +_modules = {} # cache of modules we've seen + + +class VisibilityMixin(ClbrBaseClasses.ClbrVisibilityMixinBase): + """ + Mixin class implementing the notion of visibility. + """ + def __init__(self): + """ + Constructor + """ + self.setPublic() + + +class Message(ClbrBaseClasses.Module, VisibilityMixin): + """ + Class to represent a ProtoBuf Message. + """ + def __init__(self, module, name, file, lineno): + """ + Constructor + + @param module name of the module containing this message + @type str + @param name name of this message + @type str + @param file filename containing this message + @type str + @param lineno linenumber of the message definition + @type int + """ + ClbrBaseClasses.Module.__init__(self, module, name, file, lineno) + VisibilityMixin.__init__(self) + + +class Enum(ClbrBaseClasses.Enum, VisibilityMixin): + """ + Class to represent a ProtoBuf Enum. + """ + def __init__(self, module, name, file, lineno): + """ + Constructor + + @param module name of the module containing this enum + @type str + @param name name of this enum + @type str + @param file filename containing this enum + @type str + @param lineno linenumber of the message enum + @type int + """ + ClbrBaseClasses.Enum.__init__(self, module, name, file, lineno) + VisibilityMixin.__init__(self) + + +class Service(ClbrBaseClasses.Class, VisibilityMixin): + """ + Class to represent a ProtoBuf Service. + """ + def __init__(self, module, name, file, lineno): + """ + Constructor + + @param module name of the module containing this service + @type str + @param name name of this service + @type str + @param file filename containing this service + @type str + @param lineno linenumber of the service definition + @type int + """ + ClbrBaseClasses.Class.__init__(self, module, name, None, file, + lineno) + VisibilityMixin.__init__(self) + + +class ServiceMethod(ClbrBaseClasses.Function, VisibilityMixin): + """ + Class to represent a ProtoBuf Service Method. + """ + def __init__(self, name, file, lineno, signature, returns): + """ + Constructor + + @param name name of this service method + @type str + @param file filename containing this service method + @type str + @param lineno linenumber of the service method definition + @type int + @param signature parameter list of the service method + @type str + @param returns return type of the service method + @type str + """ + ClbrBaseClasses.Function.__init__(self, None, name, file, lineno, + signature, + annotation="-> {0}".format(returns)) + VisibilityMixin.__init__(self) + + +def readmodule_ex(module, path=None): + """ + Read a ProtoBuf protocol file and return a dictionary of messages, enums, + services and rpc methods. + + @param module name of the ProtoBuf protocol file + @type str + @param path path the file should be searched in + @type list of str + @return the resulting dictionary + @rtype dict + """ + global _modules + + dictionary = {} + + if module in _modules: + # we've seen this file before... + return _modules[module] + + # search the path for the file + f = None + fullpath = [] if path is None else path[:] + f, file, (suff, mode, type) = ClassBrowsers.find_module(module, fullpath) + if f: + f.close() + if type not in SUPPORTED_TYPES: + # not ProtoBuf protocol source, can't do anything with this module + _modules[module] = dictionary + return dictionary + + _modules[module] = dictionary + classstack = [] # stack of (class, indent) pairs + indent = 0 + try: + src = Utilities.readEncodedFile(file)[0] + except (UnicodeError, IOError): + # can't do anything with this module + _modules[module] = dictionary + return dictionary + + lineno, last_lineno_pos = 1, 0 + lastGlobalEntry = None + cur_obj = None + i = 0 + while True: + m = _getnext(src, i) + if not m: + break + start, i = m.span() + + if m.start("Method") >= 0: + # found a method definition or function + thisindent = indent + meth_name = m.group("MethodName") + meth_sig = m.group("MethodSignature") + meth_sig = meth_sig and meth_sig.replace('\\\n', '') or '' + meth_sig = _commentsub('', meth_sig) + meth_sig = _normalize(' ', meth_sig) + meth_return = m.group("MethodReturn") + meth_return = meth_return and meth_return.replace('\\\n', '') or '' + meth_return = _commentsub('', meth_return) + meth_return = _normalize(' ', meth_return) + lineno = lineno + src.count('\n', last_lineno_pos, start) + last_lineno_pos = start + # close all interfaces/modules indented at least as much + while classstack and \ + classstack[-1][1] >= thisindent: + if classstack[-1][0] is not None: + # record the end line + classstack[-1][0].setEndLine(lineno - 1) + del classstack[-1] + if classstack: + # it's an interface/module method + cur_class = classstack[-1][0] + if isinstance(cur_class, Service): + # it's a method + f = ServiceMethod(meth_name, file, lineno, meth_sig, + meth_return) + cur_class._addmethod(meth_name, f) + # else it's a nested def + else: + f = None + else: + # the file is incorrect, ignore the entry + continue + if not classstack: + if lastGlobalEntry: + lastGlobalEntry.setEndLine(lineno - 1) + lastGlobalEntry = f + if cur_obj and isinstance(cur_obj, ServiceMethod): + cur_obj.setEndLine(lineno - 1) + cur_obj = f + classstack.append((f, thisindent)) # Marker for nested fns + + elif m.start("String") >= 0: + pass + + elif m.start("Comment") >= 0: + pass + + elif m.start("Message") >= 0: + # we found a message definition + thisindent = indent + indent += 1 + # close all messages/services indented at least as much + while classstack and \ + classstack[-1][1] >= thisindent: + if classstack[-1][0] is not None: + # record the end line + classstack[-1][0].setEndLine(lineno - 1) + del classstack[-1] + lineno = lineno + src.count('\n', last_lineno_pos, start) + last_lineno_pos = start + message_name = m.group("MessageName") + # remember this message + cur_class = Message(module, message_name, file, lineno) + if not classstack: + dictionary[message_name] = cur_class + else: + msg = classstack[-1][0] + msg._addclass(message_name, cur_class) + if not classstack: + if lastGlobalEntry: + lastGlobalEntry.setEndLine(lineno - 1) + lastGlobalEntry = cur_class + cur_obj = cur_class + classstack.append((cur_class, thisindent)) + + elif m.start("Enum") >= 0: + # we found a message definition + thisindent = indent + indent += 1 + # close all messages/services indented at least as much + while classstack and \ + classstack[-1][1] >= thisindent: + if classstack[-1][0] is not None: + # record the end line + classstack[-1][0].setEndLine(lineno - 1) + del classstack[-1] + lineno = lineno + src.count('\n', last_lineno_pos, start) + last_lineno_pos = start + enum_name = m.group("EnumName") + # remember this Enum + cur_class = Enum(module, enum_name, file, lineno) + if not classstack: + dictionary[enum_name] = cur_class + else: + enum = classstack[-1][0] + enum._addclass(enum_name, cur_class) + if not classstack: + if lastGlobalEntry: + lastGlobalEntry.setEndLine(lineno - 1) + lastGlobalEntry = cur_class + cur_obj = cur_class + classstack.append((cur_class, thisindent)) + + elif m.start("Service") >= 0: + # we found a message definition + thisindent = indent + indent += 1 + # close all messages/services indented at least as much + while classstack and \ + classstack[-1][1] >= thisindent: + if classstack[-1][0] is not None: + # record the end line + classstack[-1][0].setEndLine(lineno - 1) + del classstack[-1] + lineno = lineno + src.count('\n', last_lineno_pos, start) + last_lineno_pos = start + service_name = m.group("ServiceName") + # remember this Service + cur_class = Service(module, service_name, file, lineno) + if not classstack: + dictionary[service_name] = cur_class + else: + service = classstack[-1][0] + service._addclass(service_name, cur_class) + if not classstack: + if lastGlobalEntry: + lastGlobalEntry.setEndLine(lineno - 1) + lastGlobalEntry = cur_class + cur_obj = cur_class + classstack.append((cur_class, thisindent)) + + elif m.start("Begin") >= 0: + # a begin of a block we are not interested in + indent += 1 + + elif m.start("End") >= 0: + # an end of a block + indent -= 1 + + else: + assert 0, "regexp _getnext found something unexpected" + + return dictionary
--- a/WebBrowser/WebBrowserTabWidget.py Sun Nov 19 13:06:01 2017 +0100 +++ b/WebBrowser/WebBrowserTabWidget.py Sat Dec 02 12:40:22 2017 +0100 @@ -185,18 +185,13 @@ self.__tabContextMenu.addAction( self.tr('Close All'), self.closeAllBrowsers) self.__tabContextMenu.addSeparator() - # TODO: re-check this once printing on Windows is reliable -## if qVersionTuple() >= (5, 8, 0) or ( -## not Globals.isWindowsPlatform() and qVersionTuple() < (5, 7, 0)): - if not Globals.isWindowsPlatform() and ( - qVersionTuple() < (5, 7, 0) or qVersionTuple() >= (5, 8, 0)): + if qVersionTuple() >= (5, 8, 0) or ( + not Globals.isWindowsPlatform() and qVersionTuple() < (5, 7, 0)): self.__tabContextMenu.addAction( UI.PixmapCache.getIcon("printPreview.png"), self.tr('Print Preview'), self.__tabContextMenuPrintPreview) - # TODO: re-check this once printing on Windows is reliable -## if qVersionTuple() >= (5, 8, 0) or ( -## not Globals.isWindowsPlatform() or qVersionTuple() >= (5, 7, 0)): - if not Globals.isWindowsPlatform() and qVersionTuple() >= (5, 7, 0): + if qVersionTuple() >= (5, 8, 0) or ( + not Globals.isWindowsPlatform() or qVersionTuple() >= (5, 7, 0)): self.__tabContextMenu.addAction( UI.PixmapCache.getIcon("print.png"), self.tr('Print'), self.__tabContextMenuPrint)
--- a/WebBrowser/WebBrowserWindow.py Sun Nov 19 13:06:01 2017 +0100 +++ b/WebBrowser/WebBrowserWindow.py Sat Dec 02 12:40:22 2017 +0100 @@ -816,10 +816,8 @@ bookmarksManager.exportBookmarks) self.__actions.append(self.exportBookmarksAct) - # TODO: re-check this once printing on Windows is reliable -## if qVersionTuple() >= (5, 8, 0) or ( -## not Globals.isWindowsPlatform() or qVersionTuple() >= (5, 7, 0)): - if not Globals.isWindowsPlatform() and qVersionTuple() >= (5, 7, 0): + if qVersionTuple() >= (5, 8, 0) or ( + not Globals.isWindowsPlatform() or qVersionTuple() >= (5, 7, 0)): self.printAct = E5Action( self.tr('Print'), UI.PixmapCache.getIcon("print.png"), @@ -856,11 +854,8 @@ else: self.printPdfAct = None - # TODO: re-check this once printing on Windows is reliable -## if qVersionTuple() >= (5, 8, 0) or ( -## not Globals.isWindowsPlatform() and qVersionTuple() < (5, 7, 0)): - if not Globals.isWindowsPlatform() and ( - qVersionTuple() < (5, 7, 0) or qVersionTuple() >= (5, 8, 0)): + if qVersionTuple() >= (5, 8, 0) or ( + not Globals.isWindowsPlatform() and qVersionTuple() < (5, 7, 0)): self.printPreviewAct = E5Action( self.tr('Print Preview'), UI.PixmapCache.getIcon("printPreview.png"),
--- a/changelog Sun Nov 19 13:06:01 2017 +0100 +++ b/changelog Sat Dec 02 12:40:22 2017 +0100 @@ -1,5 +1,25 @@ Change Log ---------- +Version 17.12: +- bug fixes +- General + -- added support for Google protobuf protocol files +- Code Documentation Viewer + -- added possibility to show the type of the object info is shown for + -- modified the top row and the search part in order to allow smaller sizes +- Debugger / Variables Viewer + -- introduced a configuration option to limit the variables shown by the + variables viewers depending on their size (in order to avoid overload + situations on low power or low memory machines) +- Styles + -- added a dark style (*.qss and Python lexers) provided by Giuseppe Corbelli +- Third Party packages + -- updated send2trash to version 1.4.2 + +**NOTE**: This release introduces a new project file format that will be +rejected by previous releases. The new format is needed for the Google protobuf +support. + Version 17.11: - bug fixes - Debugger
--- a/eric6.e4p Sun Nov 19 13:06:01 2017 +0100 +++ b/eric6.e4p Sat Dec 02 12:40:22 2017 +0100 @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE Project SYSTEM "Project-5.1.dtd"> +<!DOCTYPE Project SYSTEM "Project-6.0.dtd"> <!-- eric project file for project eric6 --> <!-- Copyright (C) 2017 Detlev Offenbach, detlev@die-offenbachs.de --> -<Project version="5.1"> +<Project version="6.0"> <Language>en_US</Language> <ProjectWordList>Dictionaries/words.dic</ProjectWordList> <ProjectExcludeList>Dictionaries/excludes.dic</ProjectExcludeList> @@ -783,6 +783,7 @@ <Source>Preferences/ConfigurationPages/PrinterPage.py</Source> <Source>Preferences/ConfigurationPages/ProjectBrowserPage.py</Source> <Source>Preferences/ConfigurationPages/ProjectPage.py</Source> + <Source>Preferences/ConfigurationPages/ProtobufPage.py</Source> <Source>Preferences/ConfigurationPages/PythonPage.py</Source> <Source>Preferences/ConfigurationPages/QtPage.py</Source> <Source>Preferences/ConfigurationPages/SecurityPage.py</Source> @@ -825,6 +826,7 @@ <Source>Project/ProjectFormsBrowser.py</Source> <Source>Project/ProjectInterfacesBrowser.py</Source> <Source>Project/ProjectOthersBrowser.py</Source> + <Source>Project/ProjectProtocolsBrowser.py</Source> <Source>Project/ProjectResourcesBrowser.py</Source> <Source>Project/ProjectSourcesBrowser.py</Source> <Source>Project/ProjectTranslationsBrowser.py</Source> @@ -1256,6 +1258,7 @@ <Source>Utilities/ClassBrowsers/__init__.py</Source> <Source>Utilities/ClassBrowsers/idlclbr.py</Source> <Source>Utilities/ClassBrowsers/jsclbr.py</Source> + <Source>Utilities/ClassBrowsers/protoclbr.py</Source> <Source>Utilities/ClassBrowsers/pyclbr.py</Source> <Source>Utilities/ClassBrowsers/rbclbr.py</Source> <Source>Utilities/FtpUtilities.py</Source> @@ -1582,7 +1585,6 @@ <Form>E5Gui/E5ListSelectionDialog.ui</Form> <Form>E5Gui/E5SimpleHelpDialog.ui</Form> <Form>E5Gui/E5StringListEditWidget.ui</Form> - <Form>E5Gui/E5TextEditSearchWidget.ui</Form> <Form>E5Gui/E5ToolBarDialog.ui</Form> <Form>E5Gui/E5ZoomWidget.ui</Form> <Form>E5Network/E5NetworkHeaderDetailsDialog.ui</Form> @@ -1850,6 +1852,7 @@ <Form>Preferences/ConfigurationPages/PrinterPage.ui</Form> <Form>Preferences/ConfigurationPages/ProjectBrowserPage.ui</Form> <Form>Preferences/ConfigurationPages/ProjectPage.ui</Form> + <Form>Preferences/ConfigurationPages/ProtobufPage.ui</Form> <Form>Preferences/ConfigurationPages/PythonPage.ui</Form> <Form>Preferences/ConfigurationPages/QtPage.ui</Form> <Form>Preferences/ConfigurationPages/SecurityPage.ui</Form> @@ -2019,7 +2022,6 @@ <Resource>WebBrowser/data/icons.qrc</Resource> <Resource>WebBrowser/data/javascript.qrc</Resource> </Resources> - <Interfaces/> <Others> <Other>.hgignore</Other> <Other>APIs/Python/zope-2.10.7.api</Other> @@ -2116,7 +2118,7 @@ <Other>ThirdParty/Pygments/pygments/CHANGES</Other> <Other>ThirdParty/Pygments/pygments/LICENSE</Other> <Other>ThirdParty/Pygments/pygments/PKG-INFO</Other> - <Other>ThirdParty/Send2Trash/LICENSE</Other> + <Other>ThirdParty/Send2Trash/PKG-INFO</Other> <Other>ThirdParty/enum/LICENSE</Other> <Other>UI/data/documentViewerStyle.css</Other> <Other>WebBrowser/Bookmarks/DefaultBookmarks.xbel</Other>
--- a/i18n/eric6_cs.ts Sun Nov 19 13:06:01 2017 +0100 +++ b/i18n/eric6_cs.ts Sat Dec 02 12:40:22 2017 +0100 @@ -538,27 +538,27 @@ <translation type="obsolete">Výběr adresáře</translation> </message> <message> - <location filename="../Project/AddDirectoryDialog.py" line="66"/> + <location filename="../Project/AddDirectoryDialog.py" line="69"/> <source>Source Files</source> <translation>Zdrojové soubory</translation> </message> <message> - <location filename="../Project/AddDirectoryDialog.py" line="68"/> + <location filename="../Project/AddDirectoryDialog.py" line="71"/> <source>Forms Files</source> <translation>Soubory s formuláři</translation> </message> <message> - <location filename="../Project/AddDirectoryDialog.py" line="72"/> + <location filename="../Project/AddDirectoryDialog.py" line="75"/> <source>Interface Files</source> <translation>Interface soubory</translation> </message> <message> - <location filename="../Project/AddDirectoryDialog.py" line="74"/> + <location filename="../Project/AddDirectoryDialog.py" line="79"/> <source>Other Files (*)</source> <translation>Jiné soubory (*)</translation> </message> <message> - <location filename="../Project/AddDirectoryDialog.py" line="70"/> + <location filename="../Project/AddDirectoryDialog.py" line="73"/> <source>Resource Files</source> <translation>Resource soubory</translation> </message> @@ -569,6 +569,11 @@ You may select it with a dialog by pressing the button to the right.</p></source> <translation type="unfinished"></translation> </message> + <message> + <location filename="../Project/AddDirectoryDialog.py" line="77"/> + <source>Protocol Files</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>AddFileDialog</name> @@ -655,72 +660,72 @@ <translation type="obsolete">Výběr cílového adresáře</translation> </message> <message> - <location filename="../Project/AddFileDialog.py" line="94"/> + <location filename="../Project/AddFileDialog.py" line="97"/> <source>Select Files</source> <translation>Výběr souborů</translation> </message> <message> - <location filename="../Project/AddFileDialog.py" line="102"/> + <location filename="../Project/AddFileDialog.py" line="105"/> <source>Select user-interface files</source> <translation>Výběr user-interface souborů</translation> </message> <message> - <location filename="../Project/AddFileDialog.py" line="110"/> + <location filename="../Project/AddFileDialog.py" line="113"/> <source>Select resource files</source> <translation>Výběr resource souborů</translation> </message> <message> - <location filename="../Project/AddFileDialog.py" line="136"/> + <location filename="../Project/AddFileDialog.py" line="147"/> <source>All Files (*)</source> <translation>Všechny soubory (*)</translation> </message> <message> - <location filename="../Project/AddFileDialog.py" line="118"/> + <location filename="../Project/AddFileDialog.py" line="121"/> <source>Select source files</source> <translation>Výběr zdrojových souborů</translation> </message> <message> - <location filename="../Project/AddFileDialog.py" line="126"/> + <location filename="../Project/AddFileDialog.py" line="129"/> <source>Select interface files</source> <translation>Výběr interface souborů</translation> </message> <message> - <location filename="../Project/AddFileDialog.py" line="134"/> + <location filename="../Project/AddFileDialog.py" line="145"/> <source>Select translation files</source> <translation>Výběr souborů s překlady</translation> </message> <message> - <location filename="../Project/AddFileDialog.py" line="137"/> + <location filename="../Project/AddFileDialog.py" line="148"/> <source>Select files</source> <translation>Výběr souborů</translation> </message> <message> - <location filename="../Project/AddFileDialog.py" line="81"/> - <source>Source Files ({0});;Forms Files ({1});;Resource Files ({2});;Interface Files ({3});;Translation Files ({4});;All Files (*)</source> - <translation>Zdrojové soubory ({0});;Soubory s formuláři ({1});;Resource soubory ({2});;Interface soubory ({3});; Soubory s překlady ({4});;Všechny soubory (*)</translation> - </message> - <message> - <location filename="../Project/AddFileDialog.py" line="100"/> + <location filename="../Project/AddFileDialog.py" line="82"/> + <source>Source Files ({0});;Forms Files ({1});;Resource Files ({2});;Interface Files ({3});;Protocol Files ({4});;Translation Files ({5});;All Files (*)</source> + <translation type="unfinished">Zdrojové soubory ({0});;Soubory s formuláři ({1});;Resource soubory ({2});;Interface soubory ({3});; Soubory s překlady ({4});;Všechny soubory (*)</translation> + </message> + <message> + <location filename="../Project/AddFileDialog.py" line="103"/> <source>Forms Files ({0})</source> <translation>Soubory s formuláři ({0})</translation> </message> <message> - <location filename="../Project/AddFileDialog.py" line="108"/> + <location filename="../Project/AddFileDialog.py" line="111"/> <source>Resource Files ({0})</source> <translation>Zdrojové soubory {0})</translation> </message> <message> - <location filename="../Project/AddFileDialog.py" line="116"/> + <location filename="../Project/AddFileDialog.py" line="119"/> <source>Source Files ({0});;All Files (*)</source> <translation>Zdrojové soubory ({0});;Všechny soubory (*)</translation> </message> <message> - <location filename="../Project/AddFileDialog.py" line="124"/> + <location filename="../Project/AddFileDialog.py" line="127"/> <source>Interface Files ({0})</source> <translation>Interface soubory ({0})</translation> </message> <message> - <location filename="../Project/AddFileDialog.py" line="132"/> + <location filename="../Project/AddFileDialog.py" line="143"/> <source>Translation Files ({0})</source> <translation>Soubory s překlady ({0})</translation> </message> @@ -737,6 +742,16 @@ the button to the right.</p></source> <translation type="unfinished"></translation> </message> + <message> + <location filename="../Project/AddFileDialog.py" line="135"/> + <source>Protocol Files ({0})</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Project/AddFileDialog.py" line="137"/> + <source>Select protocol files</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>AddFoundFilesDialog</name> @@ -2313,7 +2328,7 @@ <translation>Hledat v tomto adresáři</translation> </message> <message> - <location filename="../UI/Browser.py" line="600"/> + <location filename="../UI/Browser.py" line="602"/> <source>New toplevel directory</source> <translation>Nový toplevel adresář</translation> </message> @@ -2358,22 +2373,22 @@ <translation type="unfinished"></translation> </message> <message> - <location filename="../UI/Browser.py" line="530"/> + <location filename="../UI/Browser.py" line="532"/> <source>Show Mime-Type</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../UI/Browser.py" line="503"/> + <location filename="../UI/Browser.py" line="505"/> <source>The mime type of the file could not be determined.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../UI/Browser.py" line="521"/> + <location filename="../UI/Browser.py" line="523"/> <source>The file has the mime type <b>{0}</b>.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../UI/Browser.py" line="530"/> + <location filename="../UI/Browser.py" line="532"/> <source>The file has the mime type <b>{0}</b>.<br/> Shall it be added to the list of text mime types?</source> <translation type="unfinished"></translation> </message> @@ -3047,7 +3062,7 @@ <context> <name>CodeDocumentationViewer</name> <message> - <location filename="../UI/CodeDocumentationViewer.py" line="232"/> + <location filename="../UI/CodeDocumentationViewer.py" line="231"/> <source>Code Info Provider:</source> <translation type="unfinished"></translation> </message> @@ -3062,67 +3077,82 @@ <translation type="unfinished"></translation> </message> <message> - <location filename="../UI/CodeDocumentationViewer.py" line="258"/> + <location filename="../UI/CodeDocumentationViewer.py" line="275"/> <source>Main Menu</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../UI/CodeDocumentationViewer.py" line="266"/> + <location filename="../UI/CodeDocumentationViewer.py" line="285"/> <source>Rich Text</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../UI/CodeDocumentationViewer.py" line="270"/> + <location filename="../UI/CodeDocumentationViewer.py" line="290"/> <source>Plain Text</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../UI/CodeDocumentationViewer.py" line="442"/> + <location filename="../UI/CodeDocumentationViewer.py" line="446"/> <source>No documentation available</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../UI/CodeDocumentationViewer.py" line="471"/> + <location filename="../UI/CodeDocumentationViewer.py" line="473"/> <source>Definition: {0}{1} </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../UI/CodeDocumentationViewer.py" line="478"/> - <source>Info: {0} - ----- - + <location filename="../UI/CodeDocumentationViewer.py" line="476"/> + <source>Definition: {0} </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../UI/CodeDocumentationViewer.py" line="499"/> + <location filename="../UI/CodeDocumentationViewer.py" line="523"/> <source>No source code documentation provider has been registered. This function has been disabled.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../UI/CodeDocumentationViewer.py" line="504"/> + <location filename="../UI/CodeDocumentationViewer.py" line="528"/> <source>This function has been disabled.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../UI/CodeDocumentationViewerTemplate.py" line="121"/> + <location filename="../UI/CodeDocumentationViewerTemplate.py" line="134"/> <source>No further documentation available</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../UI/CodeDocumentationViewerTemplate.py" line="59"/> + <location filename="../UI/CodeDocumentationViewerTemplate.py" line="60"/> <source><p><b>Definition:</b> <span class="def">@NAME@@ARGSPEC@</span></p></source> <comment>Just translate 'Definition:' and leave the rest intact.</comment> <translation type="unfinished"></translation> </message> <message> - <location filename="../UI/CodeDocumentationViewerTemplate.py" line="64"/> + <location filename="../UI/CodeDocumentationViewerTemplate.py" line="70"/> <source><p><b>Note:</b> @NOTE@</p></source> <comment>Just translate 'Note:' and leave the rest intact.</comment> <translation type="unfinished"></translation> </message> + <message> + <location filename="../UI/CodeDocumentationViewer.py" line="484"/> + <source>Type: {0} +</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../UI/CodeDocumentationViewer.py" line="492"/> + <source>Note: {0} +</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../UI/CodeDocumentationViewerTemplate.py" line="65"/> + <source><p><b>Type:</b> @TYPE@</p></source> + <comment>Just translate 'Type:' and leave the rest intact.</comment> + <translation type="unfinished"></translation> + </message> </context> <context> <name>CodeMetricsDialog</name> @@ -4522,72 +4552,72 @@ <context> <name>ConfigurationWidget</name> <message> - <location filename="../Preferences/ConfigurationDialog.py" line="135"/> + <location filename="../Preferences/ConfigurationDialog.py" line="136"/> <source>Application</source> <translation>Aplikace</translation> </message> <message> - <location filename="../Preferences/ConfigurationDialog.py" line="141"/> + <location filename="../Preferences/ConfigurationDialog.py" line="142"/> <source>CORBA</source> <translation>CORBA</translation> </message> <message> - <location filename="../Preferences/ConfigurationDialog.py" line="147"/> + <location filename="../Preferences/ConfigurationDialog.py" line="148"/> <source>Email</source> <translation>Email</translation> </message> <message> - <location filename="../Preferences/ConfigurationDialog.py" line="150"/> + <location filename="../Preferences/ConfigurationDialog.py" line="151"/> <source>Graphics</source> <translation>Grafika</translation> </message> <message> - <location filename="../Preferences/ConfigurationDialog.py" line="156"/> + <location filename="../Preferences/ConfigurationDialog.py" line="157"/> <source>Icons</source> <translation>Ikony</translation> </message> <message> - <location filename="../Preferences/ConfigurationDialog.py" line="175"/> + <location filename="../Preferences/ConfigurationDialog.py" line="176"/> <source>Plugin Manager</source> <translation>Plugin Manažer</translation> </message> <message> - <location filename="../Preferences/ConfigurationDialog.py" line="446"/> + <location filename="../Preferences/ConfigurationDialog.py" line="450"/> <source>Printer</source> <translation>Tiskárna</translation> </message> <message> - <location filename="../Preferences/ConfigurationDialog.py" line="214"/> + <location filename="../Preferences/ConfigurationDialog.py" line="218"/> <source>Python</source> <translation>Python</translation> </message> <message> - <location filename="../Preferences/ConfigurationDialog.py" line="185"/> + <location filename="../Preferences/ConfigurationDialog.py" line="189"/> <source>Qt</source> <translation>Qt</translation> </message> <message> - <location filename="../Preferences/ConfigurationDialog.py" line="191"/> + <location filename="../Preferences/ConfigurationDialog.py" line="195"/> <source>Shell</source> <translation>Shell</translation> </message> <message> - <location filename="../Preferences/ConfigurationDialog.py" line="194"/> + <location filename="../Preferences/ConfigurationDialog.py" line="198"/> <source>Tasks</source> <translation>Úlohy</translation> </message> <message> - <location filename="../Preferences/ConfigurationDialog.py" line="197"/> + <location filename="../Preferences/ConfigurationDialog.py" line="201"/> <source>Templates</source> <translation>Šablony</translation> </message> <message> - <location filename="../Preferences/ConfigurationDialog.py" line="203"/> + <location filename="../Preferences/ConfigurationDialog.py" line="207"/> <source>Version Control Systems</source> <translation>Version Control Systems</translation> </message> <message> - <location filename="../Preferences/ConfigurationDialog.py" line="208"/> + <location filename="../Preferences/ConfigurationDialog.py" line="212"/> <source>Debugger</source> <translation>Debugger</translation> </message> @@ -4597,251 +4627,256 @@ <translation type="obsolete">Ruby</translation> </message> <message> - <location filename="../Preferences/ConfigurationDialog.py" line="221"/> + <location filename="../Preferences/ConfigurationDialog.py" line="225"/> <source>Editor</source> <translation>Editor</translation> </message> <message> - <location filename="../Preferences/ConfigurationDialog.py" line="224"/> + <location filename="../Preferences/ConfigurationDialog.py" line="228"/> <source>APIs</source> <translation>APIs</translation> </message> <message> - <location filename="../Preferences/ConfigurationDialog.py" line="227"/> + <location filename="../Preferences/ConfigurationDialog.py" line="231"/> <source>Autocompletion</source> <translation>Autodoplňování</translation> </message> <message> - <location filename="../Preferences/ConfigurationDialog.py" line="235"/> + <location filename="../Preferences/ConfigurationDialog.py" line="239"/> <source>Calltips</source> <translation>Rychlé tipy</translation> </message> <message> - <location filename="../Preferences/ConfigurationDialog.py" line="244"/> + <location filename="../Preferences/ConfigurationDialog.py" line="248"/> <source>General</source> <translation>Hlavní</translation> </message> <message> - <location filename="../Preferences/ConfigurationDialog.py" line="264"/> + <location filename="../Preferences/ConfigurationDialog.py" line="268"/> <source>Typing</source> <translation>Psaní</translation> </message> <message> - <location filename="../Preferences/ConfigurationDialog.py" line="267"/> - <source>Exporters</source> - <translation>Exportery</translation> - </message> - <message> <location filename="../Preferences/ConfigurationDialog.py" line="271"/> - <source>Highlighters</source> - <translation>Zvýrazňovače</translation> + <source>Exporters</source> + <translation>Exportery</translation> </message> <message> <location filename="../Preferences/ConfigurationDialog.py" line="275"/> - <source>Filetype Associations</source> - <translation>Asociace typů souborů</translation> + <source>Highlighters</source> + <translation>Zvýrazňovače</translation> </message> <message> <location filename="../Preferences/ConfigurationDialog.py" line="279"/> + <source>Filetype Associations</source> + <translation>Asociace typů souborů</translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="283"/> <source>Styles</source> <translation>Styly</translation> </message> <message> - <location filename="../Preferences/ConfigurationDialog.py" line="295"/> + <location filename="../Preferences/ConfigurationDialog.py" line="299"/> <source>Help</source> <translation>Nápověda</translation> </message> <message> + <location filename="../Preferences/ConfigurationDialog.py" line="457"/> + <source>Help Documentation</source> + <translation>Dokumenty nápovědy</translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="306"/> + <source>Help Viewers</source> + <translation>Prohlížeče nápovědy</translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="317"/> + <source>Project</source> + <translation>Projekt</translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="314"/> + <source>Project Viewer</source> + <translation>Prohlížeč projektu</translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="320"/> + <source>Multiproject</source> + <translation>Multiprojekt</translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="444"/> + <source>Interface</source> + <translation>Interface</translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="331"/> + <source>Viewmanager</source> + <translation>Viewmanager</translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="724"/> + <source>Configuration Page Error</source> + <translation>Chyba na straně konfigurace</translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="251"/> + <source>Filehandling</source> + <translation>Manažer souborů</translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="255"/> + <source>Searching</source> + <translation>Vyhledávání</translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="462"/> + <source>Appearance</source> + <translation>Vzhled</translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="242"/> + <source>QScintilla</source> + <translation>QScintilla</translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="262"/> + <source>Style</source> + <translation>Styl</translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="290"/> + <source>Properties</source> + <translation>Nastavení</translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="646"/> + <source>Preferences</source> + <translation>Předvolby</translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="651"/> + <source>Please select an entry of the list +to display the configuration page.</source> + <translation>Pro zobrazení strany s konfigurací vyberte položku ze seznamu.</translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="447"/> + <source>Network</source> + <translation>Síť</translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="478"/> + <source>Spell checking</source> + <translation>Kontrola pravopisu</translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="221"/> + <source>Python3</source> + <translation></translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="724"/> + <source><p>The configuration page <b>{0}</b> could not be loaded.</p></source> + <translation><p>Konfigurační stranu <b>{0}</b> nelze načíst.</p></translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="287"/> + <source>Keywords</source> + <translation>Klíčová slova</translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="139"/> + <source>Cooperation</source> + <translation>Spolupráce</translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="494"/> + <source>Tray Starter</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="473"/> + <source>VirusTotal Interface</source> + <translation type="unfinished"></translation> + </message> + <message> <location filename="../Preferences/ConfigurationDialog.py" line="453"/> - <source>Help Documentation</source> - <translation>Dokumenty nápovědy</translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="302"/> - <source>Help Viewers</source> - <translation>Prohlížeče nápovědy</translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="313"/> - <source>Project</source> - <translation>Projekt</translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="310"/> - <source>Project Viewer</source> - <translation>Prohlížeč projektu</translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="316"/> - <source>Multiproject</source> - <translation>Multiprojekt</translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="440"/> - <source>Interface</source> - <translation>Interface</translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="327"/> - <source>Viewmanager</source> - <translation>Viewmanager</translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="720"/> - <source>Configuration Page Error</source> - <translation>Chyba na straně konfigurace</translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="247"/> - <source>Filehandling</source> - <translation>Manažer souborů</translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="251"/> - <source>Searching</source> - <translation>Vyhledávání</translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="458"/> - <source>Appearance</source> - <translation>Vzhled</translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="238"/> - <source>QScintilla</source> - <translation>QScintilla</translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="258"/> - <source>Style</source> - <translation>Styl</translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="286"/> - <source>Properties</source> - <translation>Nastavení</translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="642"/> - <source>Preferences</source> - <translation>Předvolby</translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="647"/> - <source>Please select an entry of the list -to display the configuration page.</source> - <translation>Pro zobrazení strany s konfigurací vyberte položku ze seznamu.</translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="443"/> - <source>Network</source> - <translation>Síť</translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="474"/> - <source>Spell checking</source> - <translation>Kontrola pravopisu</translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="217"/> - <source>Python3</source> - <translation></translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="720"/> - <source><p>The configuration page <b>{0}</b> could not be loaded.</p></source> - <translation><p>Konfigurační stranu <b>{0}</b> nelze načíst.</p></translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="283"/> - <source>Keywords</source> - <translation>Klíčová slova</translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="138"/> - <source>Cooperation</source> - <translation>Spolupráce</translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="490"/> - <source>Tray Starter</source> + <source>Security</source> + <translation type="unfinished">Bezpečnost</translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="172"/> + <source>Notifications</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="160"/> + <source>IRC</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="265"/> + <source>Code Checkers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="465"/> + <source>eric6 Web Browser</source> + <translation type="unfinished">eric5 web prohlížeč {6 ?}</translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="163"/> + <source>Log-Viewer</source> + <translation type="unfinished">Prohlížeč logu</translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="166"/> + <source>Mimetypes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="584"/> + <source>Enter search text...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Preferences/ConfigurationDialog.py" line="294"/> + <source>Mouse Click Handlers</source> <translation type="unfinished"></translation> </message> <message> <location filename="../Preferences/ConfigurationDialog.py" line="469"/> - <source>VirusTotal Interface</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="449"/> - <source>Security</source> - <translation type="unfinished">Bezpečnost</translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="171"/> - <source>Notifications</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="159"/> - <source>IRC</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="261"/> - <source>Code Checkers</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="461"/> - <source>eric6 Web Browser</source> - <translation type="unfinished">eric5 web prohlížeč {6 ?}</translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="162"/> - <source>Log-Viewer</source> - <translation type="unfinished">Prohlížeč logu</translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="165"/> - <source>Mimetypes</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="580"/> - <source>Enter search text...</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="290"/> - <source>Mouse Click Handlers</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../Preferences/ConfigurationDialog.py" line="465"/> <source>Flash Cookie Manager</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Preferences/ConfigurationDialog.py" line="503"/> + <location filename="../Preferences/ConfigurationDialog.py" line="507"/> <source>Hex Editor</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Preferences/ConfigurationDialog.py" line="360"/> + <location filename="../Preferences/ConfigurationDialog.py" line="364"/> <source>Web Browser</source> <translation type="unfin