Sun, 02 Jun 2019 11:42:48 +0200
Merged with default branch to prepare a new release.
--- a/docs/changelog Sat May 04 12:04:12 2019 +0200 +++ b/docs/changelog Sun Jun 02 11:42:48 2019 +0200 @@ -1,5 +1,46 @@ Change Log ---------- +Version 19.6: +- bug fixes +- Code Style Checker + -- added checks for use of 'gettattr' and 'setattr', bas super() calls and + 'assert False' statements +- Editor + -- Python Typing + --- added support for 'from ... import (...)' + --- changed the indentation when the previous line ends with + '(', '[' or '{' + -- Ruby Typing + --- changed the indentation when the previous line ends with + '(', '[' or '{' +- Mercurial Interface + -- extended the log browser to start with showing all incoming and the + first batch of local changesets + -- show different icons for incoming, outgoing and normal changesets + -- added capability to search and filter based on the changeset phase + -- added support for the 'closehead' extension (as of Mercurial 4.8) + -- added support for the '--keep' flag of the shelve command (as of + Mercurial 5.0) +- Shell + -- added capability to place the Shell window in the left or right side + container +- setup.py Wizard + -- updated the Trove classifiers list + -- added capability to retrieve the Trove classifiers list from PyPI +- Variables Viewer + -- reimplemented Variables Viewer using QTreeView with unlimited access to + big arrays, dicts, etc. because elements are lazy loaded + -- highlighting of still unloaded (default: yellow background) and last + changed variable(s) (default: green background) + -- colors for highlighting are configurable through Debugger->General + -- expand / collapse variables with children on double click on first column, + in all other cases display detail window + -- handling of dict views improved (can be expanded like lists) + -- show tooltips on all elements which don't fit into current column width + -- new options in the context menu, e.g. expand / collapse all child nodes +- Third Party packages + -- updated EditorConfig to 0.12.2 + Version 19.5: - bug fixes - General
--- a/eric6.e4p Sat May 04 12:04:12 2019 +0200 +++ b/eric6.e4p Sun Jun 02 11:42:48 2019 +0200 @@ -626,6 +626,10 @@ <Source>eric6/Plugins/VcsPlugins/vcsGit/ProjectHelper.py</Source> <Source>eric6/Plugins/VcsPlugins/vcsGit/__init__.py</Source> <Source>eric6/Plugins/VcsPlugins/vcsGit/git.py</Source> + <Source>eric6/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/HgCloseHeadSelectionDialog.py</Source> + <Source>eric6/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/ProjectHelper.py</Source> + <Source>eric6/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/__init__.py</Source> + <Source>eric6/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/closehead.py</Source> <Source>eric6/Plugins/VcsPlugins/vcsMercurial/Config.py</Source> <Source>eric6/Plugins/VcsPlugins/vcsMercurial/ConfigurationPage/MercurialPage.py</Source> <Source>eric6/Plugins/VcsPlugins/vcsMercurial/ConfigurationPage/__init__.py</Source> @@ -1734,6 +1738,7 @@ <Source>setup.py</Source> </Sources> <Forms> + <Form>eric6/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/HgCloseHeadSelectionDialog.ui</Form> <Form>eric6/CondaInterface/CondaExecDialog.ui</Form> <Form>eric6/CondaInterface/CondaExportDialog.ui</Form> <Form>eric6/CondaInterface/CondaInfoDialog.ui</Form> @@ -2284,14 +2289,14 @@ <Other>docs/THANKS</Other> <Other>docs/changelog</Other> <Other>eric6.e4p</Other> - <Other>eric6/APIs/Python/zope-2.10.7.api</Other> - <Other>eric6/APIs/Python/zope-2.11.2.api</Other> - <Other>eric6/APIs/Python/zope-3.3.1.api</Other> <Other>eric6/APIs/Python3/PyQt4.bas</Other> <Other>eric6/APIs/Python3/PyQt5.bas</Other> <Other>eric6/APIs/Python3/QScintilla2.bas</Other> <Other>eric6/APIs/Python3/eric6.api</Other> <Other>eric6/APIs/Python3/eric6.bas</Other> + <Other>eric6/APIs/Python/zope-2.10.7.api</Other> + <Other>eric6/APIs/Python/zope-2.11.2.api</Other> + <Other>eric6/APIs/Python/zope-3.3.1.api</Other> <Other>eric6/APIs/QSS/qss.api</Other> <Other>eric6/APIs/Ruby/Ruby-1.8.7.api</Other> <Other>eric6/APIs/Ruby/Ruby-1.8.7.bas</Other> @@ -2428,7 +2433,9 @@ <Other>eric6/Styles</Other> <Other>eric6/ThirdParty/CharDet/LICENSE</Other> <Other>eric6/ThirdParty/CharDet/README.rst</Other> - <Other>eric6/ThirdParty/EditorConfig/LICENSE.txt</Other> + <Other>eric6/ThirdParty/EditorConfig/COPYING</Other> + <Other>eric6/ThirdParty/EditorConfig/LICENSE.BSD</Other> + <Other>eric6/ThirdParty/EditorConfig/LICENSE.PSF</Other> <Other>eric6/ThirdParty/EditorConfig/README.rst</Other> <Other>eric6/ThirdParty/Jasy/jasy/license.md</Other> <Other>eric6/ThirdParty/Pygments/pygments/AUTHORS</Other>
--- a/eric6/APIs/Python3/eric6.api Sat May 04 12:04:12 2019 +0200 +++ b/eric6/APIs/Python3/eric6.api Sun Jun 02 11:42:48 2019 +0200 @@ -290,6 +290,7 @@ eric6.DebugClients.Python.DebugClient.DebugClient?1() eric6.DebugClients.Python.DebugClientBase.DebugClientBase.Indicators?7 eric6.DebugClients.Python.DebugClientBase.DebugClientBase.absPath?4(fn) +eric6.DebugClients.Python.DebugClientBase.DebugClientBase.arrayTypes?7 eric6.DebugClients.Python.DebugClientBase.DebugClientBase.clientCapabilities?7 eric6.DebugClients.Python.DebugClientBase.DebugClientBase.close?4(fd) eric6.DebugClients.Python.DebugClientBase.DebugClientBase.connectDebugger?4(port, remoteAddress=None, redirect=True) @@ -332,6 +333,9 @@ eric6.DebugClients.Python.DebugClientCapabilities.HasProfiler?7 eric6.DebugClients.Python.DebugClientCapabilities.HasShell?7 eric6.DebugClients.Python.DebugClientCapabilities.HasUnittest?7 +eric6.DebugClients.Python.DebugConfig.BatchSize?7 +eric6.DebugClients.Python.DebugConfig.ConfigKnownQtTypes?7 +eric6.DebugClients.Python.DebugConfig.ConfigQtNames?7 eric6.DebugClients.Python.DebugConfig.ConfigVarTypeStrings?7 eric6.DebugClients.Python.DebugUtilities.ArgInfo?7 eric6.DebugClients.Python.DebugUtilities._getfullargs?5(co) @@ -344,26 +348,25 @@ eric6.DebugClients.Python.DebugVariables.BaseResolver.getDictionary?4(var) eric6.DebugClients.Python.DebugVariables.BaseResolver.resolve?4(var, attribute) eric6.DebugClients.Python.DebugVariables.DefaultResolver.getDictionary?4(var) -eric6.DebugClients.Python.DebugVariables.DefaultResolver.resolve?4(var, attribute) eric6.DebugClients.Python.DebugVariables.DictResolver.getDictionary?4(var) eric6.DebugClients.Python.DebugVariables.DictResolver.keyToStr?4(key) eric6.DebugClients.Python.DebugVariables.DictResolver.resolve?4(var, attribute) +eric6.DebugClients.Python.DebugVariables.DictViewResolver.getDictionary?4(var) +eric6.DebugClients.Python.DebugVariables.DictViewResolver.resolve?4(var, attribute) eric6.DebugClients.Python.DebugVariables.ListResolver.getDictionary?4(var) eric6.DebugClients.Python.DebugVariables.ListResolver.resolve?4(var, attribute) -eric6.DebugClients.Python.DebugVariables.MaxItemsToHandle?7 eric6.DebugClients.Python.DebugVariables.MultiValueDictResolver.getDictionary?4(var) eric6.DebugClients.Python.DebugVariables.MultiValueDictResolver.resolve?4(var, attribute) eric6.DebugClients.Python.DebugVariables.NdArrayResolver.getDictionary?4(var) eric6.DebugClients.Python.DebugVariables.NdArrayResolver.resolve?4(var, attribute) eric6.DebugClients.Python.DebugVariables.SetResolver.getDictionary?4(var) eric6.DebugClients.Python.DebugVariables.SetResolver.resolve?4(var, attribute) -eric6.DebugClients.Python.DebugVariables.TooLargeAttribute?7 -eric6.DebugClients.Python.DebugVariables.TooLargeMessage?7 eric6.DebugClients.Python.DebugVariables._TypeMap?8 eric6.DebugClients.Python.DebugVariables._initTypeMap?5() eric6.DebugClients.Python.DebugVariables.arrayResolver?7 eric6.DebugClients.Python.DebugVariables.defaultResolver?7 eric6.DebugClients.Python.DebugVariables.dictResolver?7 +eric6.DebugClients.Python.DebugVariables.dictViewResolver?7 eric6.DebugClients.Python.DebugVariables.getType?4(obj) eric6.DebugClients.Python.DebugVariables.listResolver?7 eric6.DebugClients.Python.DebugVariables.multiValueDictResolver?7 @@ -612,10 +615,11 @@ eric6.Debugger.DebugViewer.DebugViewer.currentWidget?4() eric6.Debugger.DebugViewer.DebugViewer.handleClientStack?4(stack) eric6.Debugger.DebugViewer.DebugViewer.handleDebuggingStarted?4() +eric6.Debugger.DebugViewer.DebugViewer.handlePreferencesChanged?4() eric6.Debugger.DebugViewer.DebugViewer.handleResetUI?4() eric6.Debugger.DebugViewer.DebugViewer.initCallStackViewer?4(projectMode) eric6.Debugger.DebugViewer.DebugViewer.isCallTraceEnabled?4() -eric6.Debugger.DebugViewer.DebugViewer.preferencesChanged?4() +eric6.Debugger.DebugViewer.DebugViewer.preferencesChanged?7 eric6.Debugger.DebugViewer.DebugViewer.setCallTraceToProjectMode?4(enabled) eric6.Debugger.DebugViewer.DebugViewer.setCurrentWidget?4(widget) eric6.Debugger.DebugViewer.DebugViewer.setDebugger?4(debugUI) @@ -756,29 +760,40 @@ eric6.Debugger.VariablesFilterDialog.VariablesFilterDialog.on_buttonBox_clicked?4(button) eric6.Debugger.VariablesFilterDialog.VariablesFilterDialog.setSelection?4(lList, gList) eric6.Debugger.VariablesFilterDialog.VariablesFilterDialog?1(parent=None, name=None, modal=False) -eric6.Debugger.VariablesViewer.ArrayElementVarItem?1(parent, dvar, dvalue, dtype) -eric6.Debugger.VariablesViewer.SpecialArrayElementVarItem?1(parent, dvar, dvalue, dtype, frmnr, globalScope) -eric6.Debugger.VariablesViewer.SpecialVarItem.expand?4() -eric6.Debugger.VariablesViewer.SpecialVarItem?1(parent, dvar, dvalue, dtype, frmnr, globalScope) -eric6.Debugger.VariablesViewer.VariableItem.Indicators?7 +eric6.Debugger.VariablesViewer.SORT_ROLE?7 eric6.Debugger.VariablesViewer.VariableItem.Type2Indicators?7 -eric6.Debugger.VariablesViewer.VariableItem._buildKey?5() -eric6.Debugger.VariablesViewer.VariableItem.attachDummy?4() -eric6.Debugger.VariablesViewer.VariableItem.collapse?4() -eric6.Debugger.VariablesViewer.VariableItem.data?4(column, role) -eric6.Debugger.VariablesViewer.VariableItem.deleteChildren?4() -eric6.Debugger.VariablesViewer.VariableItem.expand?4() -eric6.Debugger.VariablesViewer.VariableItem.extractId?4(var) -eric6.Debugger.VariablesViewer.VariableItem.extractIndicators?4(var) -eric6.Debugger.VariablesViewer.VariableItem.getId?4() -eric6.Debugger.VariablesViewer.VariableItem.getValue?4() -eric6.Debugger.VariablesViewer.VariableItem?1(parent, dvar, dvalue, dtype) -eric6.Debugger.VariablesViewer.VariablesViewer.collapseItem?4(parentItem) -eric6.Debugger.VariablesViewer.VariablesViewer.expandItem?4(parentItem) +eric6.Debugger.VariablesViewer.VariableItem.absolutCount?4() +eric6.Debugger.VariablesViewer.VariableItem.arrayTypes?7 +eric6.Debugger.VariablesViewer.VariableItem.noOfItemsStr?7 +eric6.Debugger.VariablesViewer.VariableItem.nonExpandableTypes?7 +eric6.Debugger.VariablesViewer.VariableItem.populated?4() +eric6.Debugger.VariablesViewer.VariableItem.rx_nonprintable?7 +eric6.Debugger.VariablesViewer.VariableItem?1(parent, dvar, dtype, dvalue) +eric6.Debugger.VariablesViewer.VariablesModel.clear?4(reset=False) +eric6.Debugger.VariablesViewer.VariablesModel.columnCount?4(parent=QModelIndex()) +eric6.Debugger.VariablesViewer.VariablesModel.data?4(index, role=Qt.DisplayRole) +eric6.Debugger.VariablesViewer.VariablesModel.expand?7 +eric6.Debugger.VariablesViewer.VariablesModel.flags?4(index) +eric6.Debugger.VariablesViewer.VariablesModel.getMore?4() +eric6.Debugger.VariablesViewer.VariablesModel.handlePreferencesChanged?4() +eric6.Debugger.VariablesViewer.VariablesModel.hasChildren?4(parent=QModelIndex()) +eric6.Debugger.VariablesViewer.VariablesModel.headerData?4(section, orientation, role=Qt.DisplayRole) +eric6.Debugger.VariablesViewer.VariablesModel.index?4(row, column, parent=QModelIndex()) +eric6.Debugger.VariablesViewer.VariablesModel.parent?4(child) +eric6.Debugger.VariablesViewer.VariablesModel.resetModifiedMarker?4(parentIdx=QModelIndex(), pathlist=()) +eric6.Debugger.VariablesViewer.VariablesModel.rowCount?4(parent=QModelIndex()) +eric6.Debugger.VariablesViewer.VariablesModel.setExpanded?4(index, state) +eric6.Debugger.VariablesViewer.VariablesModel.showVariables?4(vlist, frmnr, pathlist=None) +eric6.Debugger.VariablesViewer.VariablesModel?1(treeView, globalScope) +eric6.Debugger.VariablesViewer.VariablesProxyModel.hasChildren?4(parent) +eric6.Debugger.VariablesViewer.VariablesProxyModel.setExpanded?4(index, state) +eric6.Debugger.VariablesViewer.VariablesProxyModel?1(parent=None) eric6.Debugger.VariablesViewer.VariablesViewer.handleResetUI?4() -eric6.Debugger.VariablesViewer.VariablesViewer.mouseDoubleClickEvent?4(mouseEvent) +eric6.Debugger.VariablesViewer.VariablesViewer.preferencesChanged?7 +eric6.Debugger.VariablesViewer.VariablesViewer.resizeEvent?4(event) eric6.Debugger.VariablesViewer.VariablesViewer.showVariable?4(vlist) eric6.Debugger.VariablesViewer.VariablesViewer.showVariables?4(vlist, frmnr) +eric6.Debugger.VariablesViewer.VariablesViewer.verticalScrollbarValueChanged?4(value) eric6.Debugger.VariablesViewer.VariablesViewer?1(viewer, globalScope, parent=None) eric6.Debugger.WatchPointModel.WatchPointModel.addWatchPoint?4(cond, special, properties) eric6.Debugger.WatchPointModel.WatchPointModel.columnCount?4(parent=None) @@ -4264,10 +4279,12 @@ eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.DocStyleContext?1(source, startLine, contextType) eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.BugBearVisitor.NodeWindowSize?7 eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.BugBearVisitor.visit?4(node) +eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.BugBearVisitor.visit_Assert?4(node) eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.BugBearVisitor.visit_Assign?4(node) eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.BugBearVisitor.visit_Attribute?4(node) eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.BugBearVisitor.visit_Call?4(node) eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.BugBearVisitor.visit_For?4(node) +eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.BugBearVisitor.visit_JoinedStr?4(node) eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.BugBearVisitor.visit_UAdd?4(node) eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.BugBearVisitor?1() eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.LoggingVisitor.LoggingLevels?7 @@ -5695,6 +5712,15 @@ eric6.Plugins.VcsPlugins.vcsGit.git.Git.vcsTag?4(name, revision=None, tagName=None) eric6.Plugins.VcsPlugins.vcsGit.git.Git.vcsUpdate?4(name, noDialog=False, revision=None) eric6.Plugins.VcsPlugins.vcsGit.git.Git?1(plugin, parent=None, name=None) +eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.HgCloseHeadSelectionDialog.getData?4() +eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.HgCloseHeadSelectionDialog.on_headsList_itemSelectionChanged?4() +eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.HgCloseHeadSelectionDialog?1(vcs, ppath, parent=None) +eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.CloseheadProjectHelper.initActions?4() +eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.CloseheadProjectHelper.initMenu?4(mainMenu) +eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.CloseheadProjectHelper.menuTitle?4() +eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.CloseheadProjectHelper?1() +eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead.Closehead.hgCloseheads?4(name, revisions=None) +eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead.Closehead?1(vcs) eric6.Plugins.VcsPlugins.vcsMercurial.Config.ConfigHgSchemes?7 eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.MercurialPage.MercurialPage.on_configButton_clicked?4() eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.MercurialPage.MercurialPage.save?4() @@ -5956,7 +5982,7 @@ eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.on_modeComboBox_currentIndexChanged?4(index) eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.on_nextButton_clicked?4() eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.on_passwordCheckBox_toggled?4(isOn) -eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.on_refreshButton_clicked?4() +eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.on_refreshButton_clicked?4(addNext=False) eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.on_rxEdit_returnPressed?4() eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.on_rxEdit_textChanged?4(txt) eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.on_saveLabel_linkActivated?4(link) @@ -5967,7 +5993,7 @@ eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.on_upButton_clicked?4() eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.show?4() eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.start?4(fn, bundle=None, isFile=False, noEntries=0) -eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog?1(vcs, mode="log", parent=None) +eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog?1(vcs, mode="", parent=None) eric6.Plugins.VcsPlugins.vcsMercurial.HgMergeDialog.HgMergeDialog.getParameters?4() eric6.Plugins.VcsPlugins.vcsMercurial.HgMergeDialog.HgMergeDialog.on_bookmarkButton_toggled?4(checked) eric6.Plugins.VcsPlugins.vcsMercurial.HgMergeDialog.HgMergeDialog.on_bookmarkCombo_editTextChanged?4(txt) @@ -6322,7 +6348,7 @@ eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelveBrowserDialog.HgShelveBrowserDialog.start?4(projectDir) eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelveBrowserDialog.HgShelveBrowserDialog?1(vcs, parent=None) eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelveDataDialog.HgShelveDataDialog.getData?4() -eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelveDataDialog.HgShelveDataDialog?1(parent=None) +eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelveDataDialog.HgShelveDataDialog?1(version, parent=None) eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelvesSelectionDialog.HgShelvesSelectionDialog.getSelectedShelves?4() eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelvesSelectionDialog.HgShelvesSelectionDialog.on_shelvesList_itemSelectionChanged?4() eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelvesSelectionDialog.HgShelvesSelectionDialog?1(message, shelveNames, parent=None) @@ -7263,6 +7289,7 @@ eric6.Plugins.WizardPlugins.QRegularExpressionWizard.QRegularExpressionWizardServer.main?4() eric6.Plugins.WizardPlugins.QRegularExpressionWizard.QRegularExpressionWizardServer.rxExecute?4(regexp, options, text, startpos) eric6.Plugins.WizardPlugins.QRegularExpressionWizard.QRegularExpressionWizardServer.rxValidate?4(regexp, options) +eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.SetupWizardDialog.ClassifiersUrl?7 eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.SetupWizardDialog.getCode?4(indLevel, indString) eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.SetupWizardDialog.on_addExludePatternButton_clicked?4() eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.SetupWizardDialog.on_addModuleButton_clicked?4() @@ -7276,6 +7303,7 @@ eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.SetupWizardDialog.on_excludePatternEdit_returnPressed?4() eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.SetupWizardDialog.on_excludePatternEdit_textChanged?4(txt) eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.SetupWizardDialog.on_excludePatternList_itemSelectionChanged?4() +eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.SetupWizardDialog.on_localClassifiersButton_clicked?4() eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.SetupWizardDialog.on_modulesList_itemSelectionChanged?4() eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.SetupWizardDialog.on_packageDirButton_clicked?4() eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.SetupWizardDialog.on_packageEdit_returnPressed?4() @@ -7336,6 +7364,7 @@ eric6.Preferences.ConfigurationPages.CondaPage.CondaPage.save?4() eric6.Preferences.ConfigurationPages.CondaPage.CondaPage?1() eric6.Preferences.ConfigurationPages.CondaPage.create?4(dlg) +eric6.Preferences.ConfigurationPages.ConfigurationPageBase.ConfigurationPageBase.colourChanged?7 eric6.Preferences.ConfigurationPages.ConfigurationPageBase.ConfigurationPageBase.initColour?4(colourKey, button, prefMethod, byName=False, hasAlpha=False) eric6.Preferences.ConfigurationPages.ConfigurationPageBase.ConfigurationPageBase.polishPage?4() eric6.Preferences.ConfigurationPages.ConfigurationPageBase.ConfigurationPageBase.saveColours?4(prefMethod) @@ -7359,6 +7388,14 @@ eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.DebuggerGeneralPage.on_editAllowedHostButton_clicked?4() eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.DebuggerGeneralPage.save?4() eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.DebuggerGeneralPage?1() +eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.PreviewModel.columnCount?4(parent=QModelIndex()) +eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.PreviewModel.data?4(index, role=Qt.DisplayRole) +eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.PreviewModel.flags?4(index) +eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.PreviewModel.index?4(row, column, parent=QModelIndex()) +eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.PreviewModel.parent?4(child) +eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.PreviewModel.rowCount?4(parent=QModelIndex()) +eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.PreviewModel.setColor?4(key, bgcolour) +eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.PreviewModel?1() eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.create?4(dlg) eric6.Preferences.ConfigurationPages.DebuggerPython2Page.DebuggerPython2Page.on_refreshButton_clicked?4() eric6.Preferences.ConfigurationPages.DebuggerPython2Page.DebuggerPython2Page.on_venvDlgButton_clicked?4() @@ -8095,7 +8132,7 @@ eric6.Project.Project.Project.hasProjectType?4(type_, progLanguage="") eric6.Project.Project.Project.initActions?4() eric6.Project.Project.Project.initFileTypes?4() -eric6.Project.Project.Project.initMenu?4() +eric6.Project.Project.Project.initMenus?4() eric6.Project.Project.Project.initToolbars?4(toolbarManager) eric6.Project.Project.Project.initVCS?4(vcsSystem=None, nooverride=False) eric6.Project.Project.Project.isDebugPropertiesLoaded?4() @@ -10222,6 +10259,7 @@ eric6.UI.UserInterface.UserInterface.masterPasswordChanged?7 eric6.UI.UserInterface.UserInterface.maxFilePathLen?7 eric6.UI.UserInterface.UserInterface.maxMenuFilePathLen?7 +eric6.UI.UserInterface.UserInterface.networkAccessManager?4() eric6.UI.UserInterface.UserInterface.notificationsEnabled?4() eric6.UI.UserInterface.UserInterface.onlineStateChanged?7 eric6.UI.UserInterface.UserInterface.performVersionCheck?4(manual=True, alternative=0, showVersions=False) @@ -10837,6 +10875,7 @@ eric6.ViewManager.ViewManager.ViewManager.initFileMenu?4() eric6.ViewManager.ViewManager.ViewManager.initFileToolbar?4(toolbarManager) eric6.ViewManager.ViewManager.ViewManager.initMacroMenu?4() +eric6.ViewManager.ViewManager.ViewManager.initSearchMenu?4() eric6.ViewManager.ViewManager.ViewManager.initSearchToolbars?4(toolbarManager) eric6.ViewManager.ViewManager.ViewManager.initSpellingToolbar?4(toolbarManager) eric6.ViewManager.ViewManager.ViewManager.initViewMenu?4()
--- a/eric6/APIs/Python3/eric6.bas Sat May 04 12:04:12 2019 +0200 +++ b/eric6/APIs/Python3/eric6.bas Sun Jun 02 11:42:48 2019 +0200 @@ -27,7 +27,6 @@ ApplicationDiagramBuilder UMLDiagramBuilder ApplicationPage ConfigurationPageBase Ui_ApplicationPage ArgumentsError RuntimeError -ArrayElementVarItem VariableItem ArrayResolver BaseResolver AssociationItem E5ArrowItem Attribute ClbrBaseClasses.Attribute VisibilityMixin @@ -80,6 +79,8 @@ ClickToFlashPlugin WebPluginInterface ClickToFlashWhitelistDialog QDialog Ui_ClickToFlashWhitelistDialog ClosedTabsManager QObject +Closehead HgExtension +CloseheadProjectHelper HgExtensionProjectHelper CodeDocumentationViewer QWidget CodeMetricsDialog QDialog Ui_CodeMetricsDialog CodeStyleAddBuiltinIgnoreDialog QDialog Ui_CodeStyleAddBuiltinIgnoreDialog @@ -143,6 +144,7 @@ DelayedFileWatcher QFileSystemWatcher DeleteFilesConfirmationDialog QDialog Ui_DeleteFilesConfirmationDialog DictResolver BaseResolver +DictViewResolver ListResolver DiffColoursPage ConfigurationPageBase Ui_DiffColoursPage DiffDialog QWidget Ui_DiffDialog DiffHighlighter E5GenericDiffHighlighter @@ -435,6 +437,7 @@ HgBundleDialog QDialog Ui_HgBundleDialog HgClient QObject HgClientPromptDialog QDialog Ui_HgClientPromptDialog +HgCloseHeadSelectionDialog QDialog Ui_HgCloseHeadSelectionDialog HgCommandDialog QDialog Ui_HgCommandDialog HgCommitDialog QWidget Ui_HgCommitDialog HgConflictsListDialog QWidget Ui_HgConflictsListDialog @@ -708,6 +711,7 @@ PreferencesLexer QObject PreferencesLexerError Exception PreferencesLexerLanguageError PreferencesLexerError +PreviewModel QAbstractItemModel PreviewProcessingThread QThread Previewer QStackedWidget PreviewerHTML QWidget @@ -840,8 +844,6 @@ SnapshotTimer QWidget SnapshotWaylandGrabber QObject SortOptionsDialog QDialog Ui_SortOptionsDialog -SpecialArrayElementVarItem SpecialVarItem -SpecialVarItem VariableItem SpeedDial QObject SpeedDialReader QXmlStreamReader SpeedDialWriter QXmlStreamWriter @@ -985,9 +987,10 @@ Value str ValueChars str VariableDetailDialog QDialog Ui_VariableDetailDialog -VariableItem QTreeWidgetItem VariablesFilterDialog QDialog Ui_VariablesFilterDialog -VariablesViewer QTreeWidget +VariablesModel QAbstractItemModel +VariablesProxyModel QSortFilterProxyModel +VariablesViewer QTreeView VcsCommandOptionsDialog QDialog Ui_VcsCommandOptionsDialog VcsGitPlugin QObject VcsMercurialPlugin QObject
--- a/eric6/CondaInterface/Conda.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/CondaInterface/Conda.py Sun Jun 02 11:42:48 2019 +0200 @@ -283,7 +283,10 @@ package["build_string"] )) else: - packages.append(tuple(package.rsplit("-", 2))) + parts = package.rsplit("-", 2) + while len(parts) < 3: + parts.append("") + packages.append(tuple(parts)) return packages @@ -349,7 +352,10 @@ )) else: package = linkEntry.split()[0] - packages.append(tuple(package.rsplit("-", 2))) + parts = package.rsplit("-", 2) + while len(parts) < 3: + parts.append("") + packages.append(tuple(parts)) return packages
--- a/eric6/DebugClients/Python/DebugClientBase.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/DebugClients/Python/DebugClientBase.py Sun Jun 02 11:42:48 2019 +0200 @@ -26,7 +26,7 @@ import DebugVariables from DebugBase import setRecursionLimit, printerr # __IGNORE_WARNING__ from AsyncFile import AsyncFile, AsyncPendingWrite -from DebugConfig import ConfigVarTypeStrings +from DebugConfig import ConfigQtNames, ConfigVarTypeStrings from FlexCompleter import Completer from DebugUtilities import prepareJsonCommand from BreakpointWatch import Breakpoint, Watch @@ -181,6 +181,10 @@ # keep these in sync with VariablesViewer.VariableItem.Indicators Indicators = ("()", "[]", "{:}", "{}") # __IGNORE_WARNING_M613__ + arrayTypes = { + 'list', 'tuple', 'dict', 'set', 'frozenset', "class 'dict_items'", + "class 'dict_keys'", "class 'dict_values'" + } def __init__(self): """ @@ -379,14 +383,12 @@ if method == "RequestVariables": self.__dumpVariables( - params["frameNumber"], params["scope"], params["filters"], - params["maxSize"]) + params["frameNumber"], params["scope"], params["filters"]) elif method == "RequestVariable": self.__dumpVariable( params["variable"], params["frameNumber"], - params["scope"], params["filters"], - params["maxSize"]) + params["scope"], params["filters"]) elif method == "RequestThreadList": self.dumpThreadList() @@ -1429,7 +1431,7 @@ # reset coding self.__coding = self.defaultCoding - def __dumpVariables(self, frmnr, scope, filterList, maxSize): + def __dumpVariables(self, frmnr, scope, filterList): """ Private method to return the variables of a frame to the debug server. @@ -1439,14 +1441,11 @@ @type int @param filterList the indices of variable types to be filtered @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 + self.resolverCache = [{}, {}] frmnr += self.currentThread.skipFrames if scope == 0: self.framenr = frmnr @@ -1468,22 +1467,18 @@ scope = -1 else: varDict = f.f_locals - - varlist = [] - if scope != -1: - keylist = varDict.keys() - - vlist = self.__formatVariablesList( - keylist, varDict, scope, filterList, maxSize=maxSize) - varlist.extend(vlist) + if scope == -1: + varlist = [] + else: + varlist = self.__formatVariablesList(varDict, scope, filterList) self.sendJsonCommand("ResponseVariables", { "scope": scope, "variables": varlist, }) - def __dumpVariable(self, var, frmnr, scope, filterList, maxSize): + def __dumpVariable(self, var, frmnr, scope, filterList): """ Private method to return the variables of a frame to the debug server. @@ -1491,13 +1486,10 @@ @type list of strings @param frmnr distance of frame reported on. 0 is the current frame @type int - @param scope 1 to report global variables, 0 for local variables (int) + @param scope 1 to report global variables, 0 for local variables + @type int @param filterList the indices of variable types to be filtered @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 @@ -1523,12 +1515,16 @@ varlist = [] - if scope != -1: + if scope != -1 and str(var) in self.resolverCache[scope]: + varGen = self.resolverCache[scope][str(var)] + idx, varDict = next(varGen) + var.insert(0, idx) + varlist = self.__formatVariablesList(varDict, scope, filterList) + elif scope != -1: variable = varDict + # Lookup the wanted attribute for attribute in var: - attribute = self.__extractIndicators(attribute)[0] - typeObject, typeName, typeStr, resolver = \ - DebugVariables.getType(variable) + _, _, resolver = DebugVariables.getType(variable) if resolver: variable = resolver.resolve(variable, attribute) if variable is None: @@ -1536,26 +1532,35 @@ else: break - + + idx = -3 # Requested variable doesn't exist anymore + # If found, get the details of attribute if variable is not None: - typeObject, typeName, typeStr, resolver = \ - DebugVariables.getType(variable) - if typeStr.startswith(("PyQt5.", "PyQt4.")): - vlist = self.__formatQtVariable(variable, typeName) - varlist.extend(vlist) - elif resolver: - varDict = resolver.getDictionary(variable) - vlist = self.__formatVariablesList( - list(varDict.keys()), varDict, scope, filterList, - maxSize=maxSize) - varlist.extend(vlist) + typeName, typeStr, resolver = DebugVariables.getType(variable) + if resolver: + varGen = resolver.getDictionary(variable) + self.resolverCache[scope][str(var)] = varGen + + idx, varDict = next(varGen) + varlist = self.__formatVariablesList( + varDict, scope, filterList) + else: + # Gently handle exception which could occure as special + # cases, e.g. already deleted C++ objects, str conversion.. + try: + varlist = self.__formatQtVariable(variable, typeName) + except Exception: + varlist = [] + idx = -1 + + var.insert(0, idx) self.sendJsonCommand("ResponseVariable", { "scope": scope, "variable": var, "variables": varlist, }) - + def __extractIndicators(self, var): """ Private method to extract the indicator string from a variable text. @@ -1702,7 +1707,7 @@ varlist.append(("data", "str", "{0}".format(value.data()))) elif qttype == 'QDomComment': varlist.append(("data", "str", "{0}".format(value.data()))) - elif qttype == "QDomDocument": + elif qttype == 'QDomDocument': varlist.append(("text", "str", "{0}".format(value.toString()))) elif qttype == 'QDomElement': varlist.append(("tagName", "str", "{0}".format(value.tagName()))) @@ -1715,10 +1720,14 @@ varlist.append( ("address", "QHostAddress", "{0}".format(value.toString()))) + # PySide specific + elif qttype == 'EnumType': # Not in PyQt possible + for key, value in value.values.items(): + varlist.append((key, qttype, "{0}".format(int(value)))) + return varlist - def __formatVariablesList(self, keylist, dict_, scope, filterList=None, - formatSequences=False, maxSize=0): + def __formatVariablesList(self, dict_, scope, filterList=None): """ Private method to produce a formated variables list. @@ -1728,8 +1737,6 @@ expressions. The formated variables list (a list of tuples of 3 values) is returned. - @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 @@ -1741,14 +1748,6 @@ 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. - @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. @@ -1761,8 +1760,14 @@ patternFilterObjects = self.globalsFilterObjects else: patternFilterObjects = self.localsFilterObjects + if type(dict_) == dict: + dict_ = dict_.items() - for key in keylist: + for key, value in dict_: + # no more elements available + if key == -2: + break + # filter based on the filter pattern matched = False for pat in patternFilterObjects: @@ -1773,95 +1778,80 @@ continue # filter hidden attributes (filter #0) - if 0 in filterList and str(key)[:2] == '__' and not ( - key == "___len___" and - DebugVariables.TooLargeAttribute in keylist): + if 0 in filterList and str(key)[:2] == '__': continue # special handling for '__builtins__' (it's way too big) if key == '__builtins__': rvalue = '<module __builtin__ (built-in)>' valtype = 'module' + if ConfigVarTypeStrings.index(valtype) in filterList: + continue else: - value = dict_[key] + isQt = False + # valtypestr, e.g. class 'PyQt5.QtCore.QPoint' valtypestr = str(type(value))[1:-1] _, valtype = valtypestr.split(' ', 1) + # valtype, e.g. PyQt5.QtCore.QPoint valtype = valtype[1:-1] + # Strip 'instance' to be equal with Python 3 + if valtype == "instancemethod": + valtype = "method" + elif valtype == "type" or valtype == "classobj": + valtype = "class" + + # valtypename, e.g. QPoint valtypename = type(value).__name__ - if valtype not in ConfigVarTypeStrings: - if valtype in ["numpy.ndarray", "array.array"]: + try: + if ConfigVarTypeStrings.index(valtype) in filterList: + continue + except ValueError: + if valtype == "sip.enumtype": + if ConfigVarTypeStrings.index('class') in filterList: + continue + elif (valtype == "sip.methoddescriptor" or + valtype == "method_descriptor"): + if ConfigVarTypeStrings.index('method') in filterList: + continue + elif valtype in ("numpy.ndarray", "array.array"): if ConfigVarTypeStrings.index('list') in filterList: continue elif valtypename == "MultiValueDict": if ConfigVarTypeStrings.index('dict') in filterList: continue - elif valtype == "sip.methoddescriptor": - if ConfigVarTypeStrings.index( - 'method') in filterList: - continue - elif valtype == "sip.enumtype": - if ConfigVarTypeStrings.index('class') in filterList: - continue elif ConfigVarTypeStrings.index('instance') in filterList: continue + isQt = valtype.startswith(ConfigQtNames) if (not valtypestr.startswith('type ') and - valtypename not in - ["ndarray", "MultiValueDict", "array"]): + valtypename not in ("ndarray", "MultiValueDict", + "array", "defaultdict") and + not isQt): valtype = valtypestr - else: - try: - # Strip 'instance' to be equal with Python 3 - if valtype == "instancemethod": - valtype = "method" - - if ConfigVarTypeStrings.index(valtype) in filterList: - continue - except ValueError: - if valtype == "classobj": - if ConfigVarTypeStrings.index( - 'instance') in filterList: - continue - elif valtype == "sip.methoddescriptor": - if ConfigVarTypeStrings.index( - 'method') in filterList: - continue - elif valtype == "sip.enumtype": - if ConfigVarTypeStrings.index('class') in \ - filterList: - continue - elif not valtype.startswith("PySide") and \ - (ConfigVarTypeStrings.index('other') in - filterList): - continue try: - if valtype in ['list', 'tuple', 'dict', 'set', - 'frozenset', 'array.array']: - if valtype == 'dict': - rvalue = "{0:d}".format(len(value.keys())) - else: - rvalue = "{0:d}".format(len(value)) + if valtype in self.arrayTypes: + rvalue = "{0:d}".format(len(value)) + elif valtype == 'array.array': + rvalue = "{0:d}|{1}".format( + len(value), value.typecode) + elif valtype == 'collections.defaultdict': + rvalue = "{0:d}|{1}".format( + len(value), value.default_factory.__name__) elif valtype == "numpy.ndarray": - rvalue = "{0:d}".format(value.size) + rvalue = "x".join(str(x) for x in value.shape) elif valtypename == "MultiValueDict": rvalue = "{0:d}".format(len(value.keys())) valtype = "django.MultiValueDict" # shortened type else: rvalue = repr(value) - if valtype.startswith('class') and \ - rvalue[0] in ['{', '(', '[']: + if valtype.startswith('class') and rvalue[0] in '{([': rvalue = "" - elif maxSize and len(rvalue) > maxSize: - rvalue = "@@TOO_BIG_TO_SHOW@@" + elif (isQt and rvalue.startswith("<class '")): + rvalue = rvalue[8:-2] except Exception: rvalue = '' - if formatSequences: - if str(key) == key: - key = "'{0!s}'".format(key) - else: - key = str(key) varlist.append((key, valtype, rvalue)) return varlist
--- a/eric6/DebugClients/Python/DebugConfig.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/DebugClients/Python/DebugConfig.py Sun Jun 02 11:42:48 2019 +0200 @@ -18,11 +18,24 @@ 'slice', 'buffer', 'class', 'instance', 'method', 'property', 'generator', 'function', 'builtin_function_or_method', 'code', 'module', - 'ellipsis', 'traceback', 'frame', 'other', 'frozenset', + 'ellipsis', 'traceback', 'frame', 'other', 'frozenset', 'bytes', # Special case for Python 2: don't add 'instancemethod' to # ConfigVarTypeFilters and leave it always at last position 'instancemethod' ] +BatchSize = 200 +ConfigQtNames = ( + 'PyQt5.', 'PyQt4.', 'PySide2.', 'PySide.', 'Shiboken.EnumType' +) +ConfigKnownQtTypes = ( + '.QChar', '.QByteArray', '.QString', '.QStringList', '.QPoint', '.QPointF', + '.QRect', '.QRectF', '.QSize', '.QSizeF', '.QColor', '.QDate', '.QTime', + '.QDateTime', '.QDir', '.QFile', '.QFont', '.QUrl', '.QModelIndex', + '.QRegExp', '.QAction', '.QKeySequence', '.QDomAttr', '.QDomCharacterData', + '.QDomComment', '.QDomDocument', '.QDomElement', '.QDomText', + '.QHostAddress', '.EnumType' +) + # # eflag: noqa = M702
--- a/eric6/DebugClients/Python/DebugVariables.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/DebugClients/Python/DebugVariables.py Sun Jun 02 11:42:48 2019 +0200 @@ -7,14 +7,16 @@ Module implementing classes and functions to dump variable contents. """ +import sys + +from DebugConfig import ConfigQtNames, ConfigKnownQtTypes, BatchSize + # # This code was inspired by pydevd. # -MaxItemsToHandle = 300 -TooLargeMessage = ("Too large to show contents. Max items to show: " + - str(MaxItemsToHandle)) -TooLargeAttribute = "Too large to be handled." +if sys.version_info[0] > 2: + basestring = str ############################################################ ## Classes implementing resolvers for various compund types @@ -35,44 +37,6 @@ @type str @return value of the attribute @rtype any - @exception NotImplementedError raised to indicate a missing - implementation - """ # __IGNORE_WARNING_D235__ - raise NotImplementedError - - def getDictionary(self, var): - """ - Public method to get the attributes of a variable as a dictionary. - - @param var variable to be converted - @type any - @return dictionary containing the variable attributes - @rtype dict - @exception NotImplementedError raised to indicate a missing - implementation - """ # __IGNORE_WARNING_D235__ - raise NotImplementedError - - -############################################################ -## Default Resolver -############################################################ - - -class DefaultResolver(BaseResolver): - """ - Class used to resolve the default way. - """ - def resolve(self, var, attribute): - """ - Public method to get an attribute from a variable. - - @param var variable to extract an attribute or value from - @type any - @param attribute name of the attribute to extract - @type str - @return value of the attribute - @rtype any """ return getattr(var, attribute, None) @@ -101,6 +65,41 @@ ############################################################ +## Default Resolver +############################################################ + + +class DefaultResolver(BaseResolver): + """ + Class used to resolve the default way. + """ + def getDictionary(self, var): + """ + Public method to get the attributes of a variable as a dictionary. + + @param var variable to be converted + @type any + @return dictionary containing the variable attributes + @rtype dict + """ + names = dir(var) + if not names and hasattr(var, "__members__"): + names = var.__members__ + + d = {} + for name in names: + try: + attribute = getattr(var, name) + d[name] = attribute + except Exception: + pass # if we can't get it, simply ignore it + + yield -1, d + while True: + yield -2, {} + + +############################################################ ## Resolver for Dictionaries ############################################################ @@ -120,16 +119,13 @@ @return value of the attribute @rtype any """ - if attribute in ('___len___', TooLargeAttribute): - return None - - if "(ID:" not in attribute: + if " (ID:" not in attribute: try: return var[attribute] except Exception: return getattr(var, attribute, None) - expectedID = int(attribute.split("(ID:")[-1][:-1]) + expectedID = int(attribute.split(" (ID:")[-1][:-1]) for key, value in var.items(): if id(key) == expectedID: return value @@ -145,10 +141,14 @@ @return string representation of the given key @rtype str """ - if isinstance(key, str): - return repr(key) - else: - return key + if isinstance(key, basestring): + key = repr(key) + # Special handling for Python2 unicode strings and bytes object + # Raw and f-Strings are always converted to (unicode) str + if key[0] in 'ub': + key = key[1:] + + return key # __IGNORE_WARNING_M834__ def getDictionary(self, var): """ @@ -160,22 +160,34 @@ @rtype dict """ d = {} - count = 0 - for key, value in var.items(): - count += 1 + start = count = 0 + allItems = list(var.items()) + try: + # Fast path: all items from same type + allItems.sort(key=lambda x: x[0]) + except TypeError: + # Slow path: only sort items with same type (Py3 only) + allItems.sort(key=lambda x: (str(x[0]), x[0])) + + for key, value in allItems: key = "{0} (ID:{1})".format(self.keyToStr(key), id(key)) d[key] = value - if count > MaxItemsToHandle: - d[TooLargeAttribute] = TooLargeMessage - break + count += 1 + if count >= BatchSize: + yield start, d + start += count + count = 0 + d = {} - d["___len___"] = len(var) + if d: + yield start, d # in case it has additional fields - additionals = defaultResolver.getDictionary(var) - d.update(additionals) + d = super(DictResolver, self).getDictionary(var) + yield -1, d - return d + while True: + yield -2, {} ############################################################ @@ -198,9 +210,6 @@ @return value of the attribute @rtype any """ - if attribute in ('___len___', TooLargeAttribute): - return None - try: return var[int(attribute)] except Exception: @@ -216,21 +225,59 @@ @rtype dict """ d = {} - count = 0 - for value in var: - d[str(count)] = value + start = count = 0 + for idx, value in enumerate(var): + d[str(idx)] = value count += 1 - if count > MaxItemsToHandle: - d[TooLargeAttribute] = TooLargeMessage - break + if count >= BatchSize: + yield start, d + start = idx + 1 + count = 0 + d = {} - d["___len___"] = len(var) + if d: + yield start, d # in case it has additional fields - additionals = defaultResolver.getDictionary(var) - d.update(additionals) + d = super(ListResolver, self).getDictionary(var) + yield -1, d + + while True: + yield -2, {} + + +############################################################ +## Resolver for dict_items, dict_keys and dict_values +############################################################ + + +class DictViewResolver(ListResolver): + """ + Class used to resolve from dict views. + """ + def resolve(self, var, attribute): + """ + Public method to get an attribute from a variable. - return d + @param var variable to extract an attribute or value from + @type tuple or list + @param attribute id of the value to extract + @type str + @return value of the attribute + @rtype any + """ + return super(DictViewResolver, self).resolve(list(var), attribute) + + def getDictionary(self, var): + """ + Public method to get the attributes of a variable as a dictionary. + + @param var variable to be converted + @type any + @return dictionary containing the variable attributes + @rtype dict + """ + return super(DictViewResolver, self).getDictionary(list(var)) ############################################################ @@ -253,11 +300,8 @@ @return value of the attribute @rtype any """ - if attribute in ('___len___', TooLargeAttribute): - return None - - if attribute.startswith("ID: "): - attribute = attribute.split(None, 1)[1] + if attribute.startswith("'ID: "): + attribute = attribute.split(None, 1)[1][:-1] try: attribute = int(attribute) except Exception: @@ -279,22 +323,26 @@ @rtype dict """ d = {} - count = 0 + start = count = 0 for value in var: count += 1 - d["ID: " + str(id(value))] = value - if count > MaxItemsToHandle: - d[TooLargeAttribute] = TooLargeMessage - break - - d["___len___"] = len(var) + d["'ID: {0}'".format(id(value))] = value + if count >= BatchSize: + yield start, d + start += count + count = 0 + d = {} + + if d: + yield start, d # in case it has additional fields - additionals = defaultResolver.getDictionary(var) - d.update(additionals) + additionals = super(SetResolver, self).getDictionary(var) + yield -1, additionals - return d - + while True: + yield -2, {} + ############################################################ ## Resolver for Numpy Arrays @@ -330,9 +378,6 @@ @return value of the attribute @rtype any """ - if attribute == '__internals__': - return defaultResolver.getDictionary(var) - if attribute == 'min': if self.__isNumeric(var): return var.min() @@ -351,25 +396,10 @@ else: return None - if attribute == 'shape': - return var.shape - - if attribute == 'dtype': - return var.dtype - - if attribute == 'size': - return var.size - - if attribute.startswith('['): - container = NdArrayItemsContainer() - count = 0 - for element in var: - setattr(container, str(count), element) - count += 1 - if count > MaxItemsToHandle: - setattr(container, TooLargeAttribute, TooLargeMessage) - break - return container + try: + return var[int(attribute)] + except Exception: + return getattr(var, attribute, None) return None @@ -383,38 +413,49 @@ @rtype dict """ d = {} - d['__internals__'] = defaultResolver.getDictionary(var) + start = count = 0 + allItems = var.tolist() + + for idx, value in enumerate(allItems): + d[str(idx)] = value + count += 1 + if count >= BatchSize: + yield start, d + start += count + count = 0 + d = {} + + if d: + yield start, d + + # in case it has additional fields + d = super(NdArrayResolver, self).getDictionary(var) + if var.size > 1024 * 1024: d['min'] = 'ndarray too big, calculating min would slow down' \ ' debugging' d['max'] = 'ndarray too big, calculating max would slow down' \ ' debugging' - else: - if self.__isNumeric(var): - if var.size == 0: - d['min'] = 'empty array' - d['max'] = 'empty array' - d['mean'] = 'empty array' - else: - d['min'] = var.min() - d['max'] = var.max() - d['mean'] = var.mean() + d['mean'] = 'ndarray too big, calculating mean would slow down' \ + ' debugging' + elif self.__isNumeric(var): + if var.size == 0: + d['min'] = 'empty array' + d['max'] = 'empty array' + d['mean'] = 'empty array' else: - d['min'] = 'not a numeric object' - d['max'] = 'not a numeric object' - d['mean'] = 'not a numeric object' - d['shape'] = var.shape - d['dtype'] = var.dtype - d['size'] = var.size - d['[0:{0}]'.format(len(var) - 1)] = list(var[0:MaxItemsToHandle]) - return d - - -class NdArrayItemsContainer: - """ - Class to store ndarray items. - """ - pass + d['min'] = var.min() + d['max'] = var.max() + d['mean'] = var.mean() + else: + d['min'] = 'not a numeric object' + d['max'] = 'not a numeric object' + d['mean'] = 'not a numeric object' + + yield -1, d + + while True: + yield -2, {} ############################################################ @@ -437,20 +478,16 @@ @return value of the attribute @rtype any """ - if attribute in ('___len___', TooLargeAttribute): - return None - - if "(ID:" not in attribute: + if " (ID:" not in attribute: try: return var[attribute] except Exception: return getattr(var, attribute, None) - expectedID = int(attribute.split("(ID:")[-1][:-1]) + expectedID = int(attribute.split(" (ID:")[-1][:-1]) for key in var.keys(): if id(key) == expectedID: - value = var.getlist(key) - return value + return var.getlist(key) return None @@ -464,20 +501,35 @@ @rtype dict """ d = {} - count = 0 - for key in var.keys(): + start = count = 0 + allKeys = list(var.keys()) + try: + # Fast path: all items from same type + allKeys.sort() + except TypeError: + # Slow path: only sort items with same type (Py3 only) + allKeys.sort(key=lambda x: (str(x), x)) + + for key in allKeys: + dkey = "{0} (ID:{1})".format(self.keyToStr(key), id(key)) + d[dkey] = var.getlist(key) count += 1 - value = var.getlist(key) - key = "{0} (ID:{1})".format(self.keyToStr(key), id(key)) - d[key] = value - if count > MaxItemsToHandle: - d[TooLargeAttribute] = TooLargeMessage - break + if count >= BatchSize: + yield start, d + start += count + count = 0 + d = {} - d["___len___"] = len(var) + if d: + yield start, d - return d - + # in case it has additional fields + d = super(DictResolver, self).getDictionary(var) + yield -1, d + + while True: + yield -2, {} + ############################################################ ## Resolver for array.array @@ -515,28 +567,10 @@ @return value of the attribute @rtype any """ - if attribute == 'itemsize': - return var.itemsize - - if attribute == 'typecode': - return var.typecode - - if attribute == 'type': - if var.typecode in ArrayResolver.TypeCodeMap: - return ArrayResolver.TypeCodeMap[var.typecode] - else: - return 'illegal type' - - if attribute.startswith('['): - container = ArrayItemsContainer() - count = 0 - for element in var: - setattr(container, str(count), element) - count += 1 - if count > MaxItemsToHandle: - setattr(container, TooLargeAttribute, TooLargeMessage) - break - return container + try: + return var[int(attribute)] + except Exception: + return getattr(var, attribute, None) return None @@ -550,26 +584,37 @@ @rtype dict """ d = {} - d['typecode'] = var.typecode - if var.typecode in ArrayResolver.TypeCodeMap: - d['type'] = ArrayResolver.TypeCodeMap[var.typecode] - else: - d['type'] = 'illegal type' - d['itemsize'] = var.itemsize - d['[0:{0}]'.format(len(var) - 1)] = var.tolist()[0:MaxItemsToHandle] - return d - - -class ArrayItemsContainer: - """ - Class to store array.array items. - """ - pass + start = count = 0 + allItems = var.tolist() + + for idx, value in enumerate(allItems): + d[str(idx)] = value + count += 1 + if count >= BatchSize: + yield start, d + start += count + count = 0 + d = {} + + if d: + yield start, d + + # in case it has additional fields + d = super(ArrayResolver, self).getDictionary(var) + + # Special data for array type: convert typecode to readable text + d['type'] = self.TypeCodeMap.get(var.typecode, 'illegal type') + + yield -1, d + + while True: + yield -2, {} defaultResolver = DefaultResolver() dictResolver = DictResolver() listResolver = ListResolver() +dictViewResolver = DictViewResolver() setResolver = SetResolver() ndarrayResolver = NdArrayResolver() multiValueDictResolver = MultiValueDictResolver() @@ -598,29 +643,21 @@ (tuple, listResolver), (list, listResolver), (dict, dictResolver), + (set, setResolver), + (frozenset, setResolver), ] try: _TypeMap.append((long, None)) # __IGNORE_WARNING__ except Exception: - pass # not available on all python versions + pass # not available on all Python versions try: _TypeMap.append((unicode, None)) # __IGNORE_WARNING__ except Exception: - pass # not available on all python versions + pass # not available on all Python versions try: - _TypeMap.append((set, setResolver)) # __IGNORE_WARNING__ - except Exception: - pass # not available on all python versions - - try: - _TypeMap.append((frozenset, setResolver)) # __IGNORE_WARNING__ - except Exception: - pass # not available on all python versions - - try: import array _TypeMap.append((array.array, arrayResolver)) except ImportError: @@ -634,10 +671,18 @@ try: from django.utils.datastructures import MultiValueDict + # it should go before dict _TypeMap.insert(0, (MultiValueDict, multiValueDictResolver)) - # it should go before dict except ImportError: pass # django may not be installed + + try: + from collections.abc import ItemsView, KeysView, ValuesView + _TypeMap.append((ItemsView, dictViewResolver)) + _TypeMap.append((KeysView, dictViewResolver)) + _TypeMap.append((ValuesView, dictViewResolver)) + except ImportError: + pass # not available on all Python versions def getType(obj): @@ -646,27 +691,29 @@ @param obj object to get type information for @type any - @return tuple containing the type, type name, type string and resolver - @rtype tuple of type, str, str, BaseResolver + @return tuple containing the type name, type string and resolver + @rtype tuple of str, str, BaseResolver """ typeObject = type(obj) typeName = typeObject.__name__ - typeStr = str(typeObject)[8:-2] + # Between PyQt and PySide the returned type is different (class vs. type) + typeStr = str(typeObject).split(' ', 1)[-1] + typeStr = typeStr[1:-2] - if typeStr.startswith(("PyQt5.", "PyQt4.")): + if (typeStr.startswith(ConfigQtNames) and + typeStr.endswith(ConfigKnownQtTypes)): resolver = None else: if _TypeMap is None: _initTypeMap() - for typeData in _TypeMap: - if isinstance(obj, typeData[0]): - resolver = typeData[1] + for typeData, resolver in _TypeMap: # __IGNORE_WARNING_M507__ + if isinstance(obj, typeData): break else: resolver = defaultResolver - return typeObject, typeName, typeStr, resolver + return typeName, typeStr, resolver # # eflag: noqa = M702
--- a/eric6/Debugger/BreakPointModel.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Debugger/BreakPointModel.py Sun Jun 02 11:42:48 2019 +0200 @@ -260,9 +260,10 @@ rows.append(index.row()) rows.sort(reverse=True) for row in rows: - self.beginRemoveRows(QModelIndex(), row, row) - del self.breakpoints[row] - self.endRemoveRows() + if row < len(self.breakpoints): + self.beginRemoveRows(QModelIndex(), row, row) + del self.breakpoints[row] + self.endRemoveRows() def deleteAll(self): """
--- a/eric6/Debugger/Config.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Debugger/Config.py Sun Jun 02 11:42:48 2019 +0200 @@ -48,7 +48,7 @@ 'ellipsis': QT_TRANSLATE_NOOP('Variable Types', 'Ellipsis'), 'traceback': QT_TRANSLATE_NOOP('Variable Types', 'Traceback'), 'frame': QT_TRANSLATE_NOOP('Variable Types', 'Frame'), - 'other': QT_TRANSLATE_NOOP('Variable Types', 'Other'), + 'bytes': QT_TRANSLATE_NOOP('Variable Types', 'Bytes'), } @@ -84,6 +84,7 @@ 'ellipsis': 28, 'traceback': 29, 'frame': 30, - 'other': 31, + 'other': 31, # Not used anymore but keep to avoid reassignment 'frozenset': 32, + 'bytes': 33, }
--- a/eric6/Debugger/DebugUI.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Debugger/DebugUI.py Sun Jun 02 11:42:48 2019 +0200 @@ -1305,7 +1305,7 @@ elif scope == 0: self.debugViewer.showVariables(variables, False) elif scope == -1: - vlist = [('None', '', '')] + vlist = [(self.tr('No locals available.'), '', '')] self.debugViewer.showVariables(vlist, False) def __clientVariable(self, scope, variables):
--- a/eric6/Debugger/DebugViewer.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Debugger/DebugViewer.py Sun Jun 02 11:42:48 2019 +0200 @@ -45,8 +45,10 @@ the exception logger. Additionally a list of all threads is shown. @signal sourceFile(string, int) emitted to open a source file at a line + @signal preferencesChanged() emitted to react on changed preferences """ sourceFile = pyqtSignal(str, int) + preferencesChanged = pyqtSignal() def __init__(self, debugServer, parent=None): """ @@ -166,6 +168,10 @@ self.setLocalsFilterButton.clicked.connect(self.setLocalsFilter) self.localsFilterEdit.returnPressed.connect(self.setLocalsFilter) + self.preferencesChanged.connect(self.handlePreferencesChanged) + self.preferencesChanged.connect(self.globalsViewer.preferencesChanged) + self.preferencesChanged.connect(self.localsViewer.preferencesChanged) + from .CallStackViewer import CallStackViewer # add the call stack viewer self.callStackViewer = CallStackViewer(self.debugServer) @@ -244,7 +250,7 @@ self.__autoViewSource = Preferences.getDebugger("AutoViewSourceCode") self.sourceButton.setVisible(not self.__autoViewSource) - def preferencesChanged(self): + def handlePreferencesChanged(self): """ Public slot to handle the preferencesChanged signal. """
--- a/eric6/Debugger/VariablesViewer.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Debugger/VariablesViewer.py Sun Jun 02 11:42:48 2019 +0200 @@ -4,33 +4,38 @@ # """ -Module implementing the variables viewer widget. +Module implementing the variables viewer view based on QTreeView. """ from __future__ import unicode_literals + try: str = unicode except NameError: pass -from PyQt5.QtCore import Qt, QRegExp, QCoreApplication -from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem, QAbstractItemView, \ - QMenu +import ast + +from PyQt5.QtCore import (Qt, QAbstractItemModel, QModelIndex, QRegExp, + QCoreApplication, QSortFilterProxyModel, pyqtSignal) +from PyQt5.QtGui import QBrush, QFontMetrics +from PyQt5.QtWidgets import QTreeView, QAbstractItemView, QToolTip, QMenu from E5Gui.E5Application import e5App from .Config import ConfigVarTypeDispStrings +from DebugClients.Python.DebugConfig import ConfigQtNames, ConfigKnownQtTypes import Preferences import Utilities -from Globals import qVersionTuple + +SORT_ROLE = Qt.UserRole -class VariableItem(QTreeWidgetItem): +class VariableItem(object): """ - Class implementing the data structure for variable items. + Class implementing the data structure for all variable items. """ - Indicators = ("()", "[]", "{:}", "{}") # __IGNORE_WARNING_M613__ Type2Indicators = { # Python types 'list': '[]', @@ -38,330 +43,918 @@ 'dict': '{:}', # __IGNORE_WARNING_M613__ 'set': '{}', # __IGNORE_WARNING_M613__ 'frozenset': '{}', # __IGNORE_WARNING_M613__ + 'numpy.ndarray': '[ndarray]', # __IGNORE_WARNING_M613__ } - def __init__(self, parent, dvar, dvalue, dtype): + # Initialize regular expression for unprintable strings + rx_nonprintable = QRegExp(r"""(\\x\d\d)+""") + + noOfItemsStr = QCoreApplication.translate("VariablesViewer", "{0} items") + + arrayTypes = { + 'list', 'tuple', 'dict', 'set', 'frozenset', 'numpy.ndarray', + 'django.MultiValueDict', 'array.array', 'collections.defaultdict', + "class 'dict_items'", "class 'dict_keys'", "class 'dict_values'", + } + + nonExpandableTypes = ( + 'method_descriptor', 'wrapper_descriptor', '', 'getset_descriptor', + 'method-wrapper', 'member_descriptor', + ) + + def __init__(self, parent, dvar, dtype, dvalue): """ Constructor @param parent reference to the parent item - @param dvar variable name (string) - @param dvalue value string (string) - @param dtype type string (string) + @type VariableItem + @param dvar variable name + @type str + @param dtype type string + @type str + @param dvalue value string + @type str + """ + self.parent = parent + # Take the additional methods into account for childCount + self.methodCount = 0 + self.childCount = 0 + self.currentCount = -1 # -1 indicates to (re)load children + # Indicator that there are children + self.hasChildren = False + # Indicator that item was at least once fully populated + self.wasPopulated = False + + self.children = [] + # Flag to prevent endless reloading of current item while waiting on + # a response from debugger + self.pendigFetch = False + + # Set of child items, which are displayed the first time or changed + self.newItems = set() + self.changedItems = set() + # Name including its ID if it's a dict, set, etc. + self.nameWithId = dvar + + self.name = '' + self.sort = '' + self.type = '' + self.indicator = '' + self.value = None + self.valueShort = None + self.tooltip = '' + + self.__getName(dvar) + self.__getType(dtype) + self.__getValue(dtype, dvalue) + + def __getName(self, dvar): + """ + Private method to extract the variable name. + + @param dvar name of variable maybe with ID + @type str + """ + try: + idx = dvar.index(" (ID:") + dvar = dvar[:idx] + except ValueError: + pass + + self.name = dvar + try: + # Convert numbers to strings with preceding zeros + sort = int(dvar) + sort = "{0:06}".format(sort) + except ValueError: + sort = dvar.lower() + + self.sort = sort + + def __getType(self, dtype): """ - dvar, self.__varID = VariableItem.extractId(dvar) + Private method to process the type of the variable. + + If type is known to have children, the corresponding flag is set. + + @param dtype type string + @type str + """ + # Python class? + if dtype.startswith('class '): + dtype = dtype[7:-1] + # Qt related stuff? + elif (dtype.startswith(ConfigQtNames) and + dtype.endswith(ConfigKnownQtTypes)): + self.hasChildren = True + + elif dtype in ('instance', 'class'): + self.hasChildren = True + + # Special Qt types should not be expanded infinite + elif ".{0}".format(dtype) in ConfigKnownQtTypes: + self.type = dtype # It's a Qt type, so skipping translation is ok + return + + vtype = ConfigVarTypeDispStrings.get(dtype, dtype) + # Unkown types should be expandable by default + if vtype is dtype and dtype not in self.nonExpandableTypes: + self.hasChildren = True + self.type = QCoreApplication.translate("VariablesViewer", vtype) + + def __getValue(self, dtype, dvalue): + """ + Private method to process the variables value. + + Define and limit value, set tooltip text. If type is known to have + children, the corresponding flag is set. - self.__value = dvalue - if len(dvalue) > 2048: # 1024 * 2 + @param dtype type string + @type str + @param dvalue value of variable encoded as utf-8 + @type str + """ + if dtype == 'collections.defaultdict': + dvalue, default_factory = dvalue.split('|') + self.indicator = '{{:<{0}>}}'.format(default_factory) + elif dtype == 'array.array': + dvalue, typecode = dvalue.split('|') + self.indicator = '[<{0}>]'.format(typecode) + else: + self.indicator = VariableItem.Type2Indicators.get(dtype, '') + + if dtype == 'numpy.ndarray': + self.childCount = int(dvalue.split('x')[0]) + dvalue = VariableItem.noOfItemsStr.format(dvalue) + self.hasChildren = True + elif dtype in VariableItem.arrayTypes: + self.childCount = int(dvalue) + dvalue = VariableItem.noOfItemsStr.format(dvalue) + self.hasChildren = True + + elif dtype == "Shiboken.EnumType": + self.hasChildren = True + + elif dtype in ['str', 'unicode']: + if VariableItem.rx_nonprintable.indexIn(dvalue) == -1: + try: + dvalue = ast.literal_eval(dvalue) + except Exception: + pass + try: + dvalue = str(dvalue) + except UnicodeDecodeError: # Never reached under Python 3 + dvalue = unicode(dvalue, 'utf-8') # __IGNORE_WARNING__ + + self.value = dvalue + + if len(dvalue) > 2048: # 2 kB + self.tooltip = dvalue[:2048] 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) - else: - self.__tooltip = dvalue - lines = dvalue.splitlines() - if len(lines) > 1: - # only show the first non-empty line; - # indicate skipped lines by <...> at the - # beginning and/or end - index = 0 - while index < len(lines) - 1 and lines[index] == "": - index += 1 - dvalue = "" - if index > 0: - dvalue += "<...>" - dvalue += lines[index] - if index < len(lines) - 1: - dvalue += "<...>" - - super(VariableItem, self).__init__(parent, [dvar, dvalue, dtype]) - - self.populated = True - - def getValue(self): - """ - Public method to return the value of the item. + self.tooltip = dvalue - @return value of the item (string) - """ - return self.__value - - def getId(self): - """ - Public method to get the ID string. - - @return ID string - @rtype str - """ - return self.__varID - - @classmethod - def extractId(cls, var): - """ - Class method to extract the ID string from a variable text. - - @param var variable text - @type str - @return tuple containing the variable text without ID and the ID string - @rtype tuple of two str - """ - if " (ID:" in var: - dvar, varID = var.rsplit(None, 1) - if varID.endswith(VariableItem.Indicators): - varID, indicators = VariableItem.extractIndicators(varID) - dvar += indicators - else: - dvar = var - varID = None - - return dvar, varID - - @classmethod - def extractIndicators(cls, var): - """ - Class method to extract the indicator string from a variable text. + lines = dvalue[:2048].splitlines() + if len(lines) > 1: + # only show the first non-empty line; + # indicate skipped lines by <...> at the + # beginning and/or end + index = 0 + while index < len(lines) - 1 and lines[index].strip(' \t') == "": + index += 1 + + dvalue = "" + if index > 0: + dvalue += "<...>" + dvalue += lines[index] + if index < len(lines) - 1 or len(dvalue) > 2048: + dvalue += "<...>" - @param var variable text - @type str - @return tuple containing the variable text without indicators and the - indicator string - @rtype tuple of two str - """ - for indicator in VariableItem.Indicators: - if var.endswith(indicator): - return var[:-len(indicator)], indicator - - return var, "" + self.valueShort = dvalue - def _buildKey(self): + @property + def absolutCount(self): """ - Protected method to build the access key for the variable. - - @return access key - @rtype str - """ - indicators = "" - txt = self.text(0) - if txt.endswith(VariableItem.Indicators): - txt, indicators = VariableItem.extractIndicators(txt) - if self.__varID: - txt = "{0} {1}{2}".format(txt, self.__varID, indicators) - else: - txt = "{0}{1}".format(txt, indicators) - return txt - - def data(self, column, role): - """ - Public method to return the data for the requested role. - - This implementation changes the original behavior in a way, that the - display data is returned as the tooltip for column 1. + Public property to get the total number of children. - @param column column number (integer) - @param role data role (Qt.ItemDataRole) - @return requested data - """ - if column == 1 and role == Qt.ToolTipRole: - return self.__tooltip - return super(VariableItem, self).data(column, role) - - def attachDummy(self): - """ - Public method to attach a dummy sub item to allow for lazy population. - """ - QTreeWidgetItem(self, ["DUMMY"]) - - def deleteChildren(self): - """ - Public method to delete all children (cleaning the subtree). + @return total number of children + @rtype int """ - for itm in self.takeChildren(): - del itm - - def expand(self): - """ - Public method to expand the item. - - Note: This is just a do nothing and should be overwritten. + return self.childCount + self.methodCount + + @property + def populated(self): """ - return + Public property returning a flag indicating if item is fully populated. - def collapse(self): + @return item is fully populated + @rtype bool """ - Public method to collapse the item. - - Note: This is just a do nothing and should be overwritten. - """ - return + return self.currentCount >= (self.childCount + self.methodCount) -class SpecialVarItem(VariableItem): +class VariablesModel(QAbstractItemModel): """ - Class implementing a VariableItem that represents a special variable node. + Class implementing the data model for QTreeView. - These special variable nodes are generated for classes, lists, - tuples and dictionaries. + @signal expand trigger QTreeView to expand given index """ - def __init__(self, parent, dvar, dvalue, dtype, frmnr, globalScope): + expand = pyqtSignal(QModelIndex) + + def __init__(self, treeView, globalScope): """ Constructor - @param parent parent of this item - @param dvar variable name (string) - @param dvalue value string (string) - @param dtype type string (string) - @param frmnr frame number (0 is the current frame) (int) + @param treeView QTreeView showing the data + @type VariablesViewer @param globalScope flag indicating global (True) or local (False) variables + @type bool """ - VariableItem.__init__(self, parent, dvar, dvalue, dtype) - self.attachDummy() - self.populated = False + super(VariablesModel, self).__init__() + self.treeView = treeView + self.proxyModel = treeView.proxyModel + + self.framenr = -1 + self.openItems = [] + self.closedItems = [] + + if globalScope: + visibility = self.tr("Globals") + else: + visibility = self.tr("Locals") + + self.rootNode = VariableItem(None, visibility, self.tr("Type"), + self.tr("Value")) + + self.__globalScope = globalScope + + def clear(self, reset=False): + """ + Public method to clear the complete data model. + + @param reset flag to clear the expanded keys also + @type bool + """ + self.beginResetModel() + self.rootNode.children = [] + self.rootNode.newItems.clear() + self.rootNode.changedItems.clear() + self.rootNode.wasPopulated = False + if reset: + self.openItems = [] + self.closedItems = [] + self.endResetModel() + + def __findVariable(self, pathlist): + """ + Private method to get to the given variable. + + @param pathlist full path to the variable + @type list of str + @return the found variable or None if it doesn't exist + @rtype VariableItem or None + """ + node = self.rootNode + + for childName in pathlist or []: + for item in node.children: + if item.nameWithId == childName: + node = item + break + else: + return None + + return node # __IGNORE_WARNING_M834__ + + def showVariables(self, vlist, frmnr, pathlist=None): + """ + Public method to update the data model of variable in pathlist. + + @param vlist the list of variables to be displayed. Each + list entry is a tuple of three values. + <ul> + <li>the variable name (string)</li> + <li>the variables type (string)</li> + <li>the variables value (string)</li> + </ul> + @type list of str + @param frmnr frame number (0 is the current frame) + @type int + @param pathlist full path to the variable + @type list of str + """ + if pathlist: + itemStartIndex = pathlist.pop(0) + else: + itemStartIndex = -1 + if self.framenr != frmnr: + self.clear() + self.framenr = frmnr + + parent = self.__findVariable(pathlist) + if parent is None: + return + + parent.pendigFetch = False + + if parent == self.rootNode: + parentIdx = QModelIndex() + parent.methodCount = len(vlist) + else: + row = parent.parent.children.index(parent) + parentIdx = self.createIndex(row, 0, parent) + + if itemStartIndex == -3: + # Item doesn't exist any more + parentIdx = self.parent(parentIdx) + self.beginRemoveRows(parentIdx, row, row) + del parent.parent.children[row] + self.endRemoveRows() + parent.parent.childCount -= 1 + return + + elif itemStartIndex == -2: + parent.wasPopulated = True + parent.currentCount = parent.absolutCount + # Remove items which are left over at the end of child list + self.__cleanupParentList(parent, parentIdx) + return + + elif itemStartIndex == -1: + parent.methodCount = len(vlist) + idx = parent.childCount = parent.currentCount + 1 + parent.currentCount += 1 + len(vlist) + else: + idx = parent.currentCount + 1 + parent.currentCount += len(vlist) - self.framenr = frmnr - self.globalScope = globalScope - - def expand(self): + # Sort items for Python versions where dict doesn't retain order + vlist.sort(key=lambda x: x[0]) + # Now update the table + endIndex = idx + len(vlist) + newChild = None + knownChildrenCount = len(parent.children) + while idx < endIndex: + # Fetch next old item from last cycle + try: + child = parent.children[idx] + except IndexError: + child = None + + # Fetch possible new item + if not newChild and vlist: + newChild = vlist.pop(0) + + # Process parameters of new item + newItem = VariableItem(parent, *newChild) + sort = newItem.sort + + # Append or insert before already existing item + if child is None or newChild and sort < child.sort: + self.beginInsertRows(parentIdx, idx, idx) + parent.children.insert(idx, newItem) + if knownChildrenCount <= idx and not parent.wasPopulated: + parent.newItems.add(newItem) + knownChildrenCount += 1 + else: + parent.changedItems.add(newItem) + self.endInsertRows() + + idx += 1 + newChild = None + continue + + # Check if same name, type and afterwards value + elif sort == child.sort and child.type == newItem.type: + # Check if value has changed + if child.value != newItem.value: + child.value = newItem.value + child.valueShort = newItem.valueShort + child.tooltip = newItem.tooltip + + child.currentCount = -1 + child.childCount = newItem.childCount + + # Highlight item because it has changed + parent.changedItems.add(child) + + changedIndexStart = self.index(idx, 0, parentIdx) + changedIndexEnd = self.index(idx, 2, parentIdx) + self.dataChanged.emit(changedIndexStart, changedIndexEnd) + + newChild = None + idx += 1 + continue + + # Remove obsolete item + self.beginRemoveRows(parentIdx, idx, idx) + parent.children.remove(child) + self.endRemoveRows() + # idx stay unchanged + knownChildrenCount -= 1 + + # Remove items which are left over at the end of child list + if itemStartIndex == -1: + parent.wasPopulated = True + self.__cleanupParentList(parent, parentIdx) + + # Request data for any expanded node + self.getMore() + + def __cleanupParentList(self, parent, parentIdx): + """ + Private method to remove items which are left over at the end of the + child list. + + @param parent to clean up + @type VariableItem + @param parentIdx the parent index as QModelIndex + @type QModelIndex """ - Public method to expand the item. + end = len(parent.children) + if end > parent.absolutCount: + self.beginRemoveRows(parentIdx, parent.absolutCount, end) + del parent.children[parent.absolutCount:] + self.endRemoveRows() + + def resetModifiedMarker(self, parentIdx=QModelIndex(), pathlist=()): + """ + Public method to remove the modified marker from changed items. + + @param parentIdx item to reset marker + @type QModelIndex + @param pathlist full path to the variable + @type list of str + """ + if parentIdx.isValid(): + parent = parentIdx.internalPointer() + else: + parent = self.rootNode + + parent.newItems.clear() + parent.changedItems.clear() + + pll = len(pathlist) + posPaths = {x for x in self.openItems if len(x) > pll} + posPaths |= {x for x in self.closedItems if len(x) > pll} + posPaths = {x[pll] for x in posPaths if x[:pll] == pathlist} + + if posPaths: + for child in parent.children: + if child.hasChildren and child.nameWithId in posPaths: + if child.currentCount >= 0: + # Discard loaded elements and refresh if still expanded + child.currentCount = -1 + row = parent.children.index(child) + newParentIdx = self.index(row, 0, parentIdx) + self.resetModifiedMarker( + newParentIdx, pathlist + (child.nameWithId,)) + + self.closedItems = [] + + # Little quirk: Refresh all visible items to clear the changed marker + if parentIdx == QModelIndex(): + self.rootNode.currentCount = -1 + idxStart = self.index(0, 0, QModelIndex()) + idxEnd = self.index(0, 2, QModelIndex()) + self.dataChanged.emit(idxStart, idxEnd) + + def columnCount(self, parent=QModelIndex()): + """ + Public method to get the column count. + + @param parent the model parent + @type QModelIndex + @return number of columns + @rtype int + """ + return 3 + + def rowCount(self, parent=QModelIndex()): + """ + Public method to get the row count. + + @param parent the model parent + @type QModelIndex + @return number of rows + @rtype int + """ + if parent.isValid(): + node = parent.internalPointer() + else: + node = self.rootNode + + return len(node.children) + + def flags(self, index): + """ + Public method to get the item flags. + + @param index of item + @type QModelIndex + @return item flags + @rtype QtCore.Qt.ItemFlag """ - self.deleteChildren() - self.populated = True + if not index.isValid(): + return Qt.NoItemFlags + + return Qt.ItemIsEnabled | Qt.ItemIsSelectable + + def hasChildren(self, parent=QModelIndex()): + """ + Public method to get a flag if parent has children. + + @param parent the model parent + @type QModelIndex + @return flag indicating parent has children + @rtype bool + """ + if not parent.isValid(): + return self.rootNode.children != [] + + return parent.internalPointer().hasChildren + + def index(self, row, column, parent=QModelIndex()): + """ + Public method to get the index of item at row:column of parent. + + @param row number of rows + @type int + @param column number of columns + @type int + @param parent the model parent + @type QModelIndex + @return new model index for child + @rtype QModelIndex + """ + if not self.hasIndex(row, column, parent): + return QModelIndex() + + if not parent.isValid(): + node = self.rootNode + else: + node = parent.internalPointer() + + return self.createIndex(row, column, node.children[row]) + + def parent(self, child): + """ + Public method to get the parent of the given child. + + @param child the model child node + @type QModelIndex + @return new model index for parent + @rtype QModelIndex + """ + if not child.isValid(): + return QModelIndex() + + childNode = child.internalPointer() + if childNode == self.rootNode: + return QModelIndex() + + parentNode = childNode.parent + + if parentNode == self.rootNode: + return QModelIndex() + + row = parentNode.parent.children.index(parentNode) + return self.createIndex(row, 0, parentNode) + + def data(self, index, role=Qt.DisplayRole): + """ + Public method get the role data of item. - pathlist = [self._buildKey()] - par = self.parent() + @param index the model index + @type QModelIndex + @param role the requested data role + @type QtCore.Qt.ItemDataRole + @return role data of item + @rtype Any + """ + if not index.isValid() or index.row() < 0: + return None + + node = index.internalPointer() + column = index.column() + + if role in (Qt.DisplayRole, SORT_ROLE, Qt.EditRole): + try: + if column == 0: + # Sort first column with values from third column + if role == SORT_ROLE: + return node.sort + return node.name + node.indicator + elif column == 1: + return node.valueShort + elif column == 2: + return node.type + elif column == 3: + return node.sort + else: + return None + except AttributeError: + return ['None', '', '', ''][column] + + elif role == Qt.BackgroundRole: + if node in node.parent.changedItems: + return self.__bgColorChanged + elif node in node.parent.newItems: + return self.__bgColorNew + + elif role == Qt.ToolTipRole: + if column == 0: + tooltip = node.name + node.indicator + elif column == 1: + tooltip = node.tooltip + elif column == 2: + tooltip = node.type + elif column == 3: + tooltip = node.sort + else: + return None + + if Qt.mightBeRichText(tooltip): + tooltip = Utilities.html_encode(tooltip) + + if column == 0: + indentation = self.treeView.indentation() + indentCount = 0 + currentNode = node + while currentNode.parent: + indentCount += 1 + currentNode = currentNode.parent + + indentation *= indentCount + else: + indentation = 0 + # Check if text is longer than available space + fontMetrics = QFontMetrics(self.treeView.font()) + textSize = fontMetrics.width(tooltip) + textSize += indentation + 5 # How to determine border size? + header = self.treeView.header() + if textSize >= header.sectionSize(column): + return tooltip + else: + QToolTip.hideText() - # step 1: get a pathlist up to the requested variable - while par is not None: - pathlist.insert(0, par._buildKey()) - par = par.parent() + return None + + def headerData(self, section, orientation, role=Qt.DisplayRole): + """ + Public method get the header names. + + @param section the header section (row/coulumn) + @type int + @param orientation the header's orientation + @type QtCore.Qt.Orientation + @param role the requested data role + @type QtCore.Qt.ItemDataRole + @return header name + @rtype str or None + """ + if role != Qt.DisplayRole or orientation != Qt.Horizontal: + return None + + if section == 0: + return self.rootNode.name + elif section == 1: + return self.rootNode.value + elif section == 2: + return self.rootNode.type + elif section == 3: + return self.rootNode.sort + + return None + + def __findPendingItem(self, parent=None, pathlist=()): + """ + Private method to find the next item to request data from debugger. + + @param parent the model parent + @type VariableItem + @param pathlist full path to the variable + @type list of str + @return next item index to request data from debugger + @rtype QModelIndex + """ + if parent is None: + parent = self.rootNode + + for child in parent.children: + if not child.hasChildren: + continue + + if pathlist + (child.nameWithId,) in self.openItems: + if child.populated: + index = None + else: + idx = parent.children.index(child) + index = self.createIndex(idx, 0, child) + self.expand.emit(index) + + if child.currentCount < 0: + return index + + possibleIndex = self.__findPendingItem( + child, pathlist + (child.nameWithId,)) + + if (possibleIndex or index) is None: + continue + + return possibleIndex or index - # step 2: request the variable from the debugger + return None + + def getMore(self): + """ + Public method to fetch the next variable from debugger. + """ + # step 1: find expanded but not populated items + item = self.__findPendingItem() + if not item or not item.isValid(): + return + + # step 2: check if data has to be retrieved + node = item.internalPointer() + lastVisibleItem = self.index(node.currentCount - 1, 0, item) + lastVisibleItem = self.proxyModel.mapFromSource(lastVisibleItem) + rect = self.treeView.visualRect(lastVisibleItem) + if rect.y() > self.treeView.height() or node.pendigFetch: + return + + node.pendigFetch = True + # step 3: get a pathlist up to the requested variable + pathlist = self.__buildTreePath(node) + # step 4: request the variable from the debugger variablesFilter = e5App().getObject("DebugUI").variablesFilter( - self.globalScope) + self.__globalScope) e5App().getObject("DebugServer").remoteClientVariable( - self.globalScope, variablesFilter, pathlist, self.framenr) + self.__globalScope, variablesFilter, pathlist, self.framenr) + + def setExpanded(self, index, state): + """ + Public method to set the expanded state of item. + + @param index item to change expanded state + @type QModelIndex + @param state state of the item + @type bool + """ + node = index.internalPointer() + pathlist = self.__buildTreePath(node) + if state: + if pathlist not in self.openItems: + self.openItems.append(pathlist) + if pathlist in self.closedItems: + self.closedItems.remove(pathlist) + self.getMore() + else: + self.openItems.remove(pathlist) + self.closedItems.append(pathlist) + + def __buildTreePath(self, parent): + """ + Private method to build up a path from the root to parent. + + @param parent item to build the path for + @type VariableItem + @return list of names denoting the path from the root + @rtype tuple of str + """ + pathlist = [] + + # build up a path from the top to the item + while parent.parent: + pathlist.append(parent.nameWithId) + parent = parent.parent + + pathlist.reverse() + return tuple(pathlist) + + def handlePreferencesChanged(self): + """ + Public slot to handle the preferencesChanged signal. + """ + self.__bgColorNew = QBrush(Preferences.getDebugger("BgColorNew")) + self.__bgColorChanged = QBrush( + Preferences.getDebugger("BgColorChanged")) + + idxStart = self.index(0, 0, QModelIndex()) + idxEnd = self.index(0, 2, QModelIndex()) + self.dataChanged.emit(idxStart, idxEnd) -class ArrayElementVarItem(VariableItem): +class VariablesProxyModel(QSortFilterProxyModel): """ - Class implementing a VariableItem that represents an array element. + Class for handling the sort operations. """ - def __init__(self, parent, dvar, dvalue, dtype): + def __init__(self, parent=None): """ Constructor - @param parent parent of this item - @param dvar variable name (string) - @param dvalue value string (string) - @param dtype type string (string) + @param parent the parent model index + @type QModelIndex """ - VariableItem.__init__(self, parent, dvar, dvalue, dtype) - + super(VariablesProxyModel, self).__init__(parent) + self.setSortRole(SORT_ROLE) + + def hasChildren(self, parent): """ - Array elements have numbers as names, but the key must be - right justified and zero filled to 6 decimal places. Then - element 2 will have a key of '000002' and appear before - element 10 with a key of '000010' + Public method to get a flag if parent has children. + + The given model index has to be transformed to the underlying source + model to get the correct result. + + @param parent the model parent + @type QModelIndex + @return flag if parent has children + @rtype bool """ - col0Str = self.text(0) - self.setText(0, "{0:6d}".format(int(col0Str))) + return self.sourceModel().hasChildren(self.mapToSource(parent)) + + def setExpanded(self, index, state): + """ + Public slot to get a flag if parent has children. + + The given model index has to be transformed to the underlying source + model to get the correct result. + @param index item to change expanded state + @type QModelIndex + @param state state of the item + @type bool + """ + self.sourceModel().setExpanded(self.mapToSource(index), state) -class SpecialArrayElementVarItem(SpecialVarItem): - """ - Class implementing a QTreeWidgetItem that represents a special array - variable node. +class VariablesViewer(QTreeView): """ - def __init__(self, parent, dvar, dvalue, dtype, frmnr, globalScope): - """ - Constructor - - @param parent parent of this item - @param dvar variable name (string) - @param dvalue value string (string) - @param dtype type string (string) - @param frmnr frame number (0 is the current frame) (int) - @param globalScope flag indicating global (True) or local (False) - variables - """ - SpecialVarItem.__init__(self, parent, dvar, dvalue, dtype, frmnr, - globalScope) - - """ - Array elements have numbers as names, but the key must be - right justified and zero filled to 6 decimal places. Then - element 2 will have a key of '000002' and appear before - element 10 with a key of '000010' - """ - # strip off [], () or {} - col0Str, indicators = VariableItem.extractIndicators(self.text(0)) - self.setText(0, "{0:6d}{1}".format(int(col0Str), indicators)) - - -class VariablesViewer(QTreeWidget): - """ - Class implementing the variables viewer widget. + Class implementing the variables viewer view. - This widget is used to display the variables of the program being + This view is used to display the variables of the program being debugged in a tree. Compound types will be shown with their main entry first. Once the subtree has been expanded, the individual entries will be shown. Double clicking an entry will + expand or collapse the item, if it has children and the double click + was performed on the first column of the tree, otherwise it'll popup a dialog showing the variables parameters in a more readable form. This is especially useful for lengthy strings. - This widget has two modes for displaying the global and the local + This view has two modes for displaying the global and the local variables. + + @signal preferencesChanged() to inform model about new background colours """ + preferencesChanged = pyqtSignal() + def __init__(self, viewer, globalScope, parent=None): """ Constructor - @param viewer reference to the debug viewer object (DebugViewer) + @param viewer reference to the debug viewer object + @type DebugViewer @param globalScope flag indicating global (True) or local (False) variables - @param parent the parent (QWidget) + @type bool + @param parent the parent + @type QWidget """ super(VariablesViewer, self).__init__(parent) self.__debugViewer = viewer self.__globalScope = globalScope - - indicatorPattern = "|".join([QRegExp.escape(indicator) - for indicator in VariableItem.Indicators]) - self.rx_class = QRegExp('<.*(instance|object) at 0x.*>') - self.rx_class2 = QRegExp('class .*') - self.rx_class3 = QRegExp('<class .* at 0x.*>') - self.dvar_rx_class1 = QRegExp( - r'<.*(instance|object) at 0x.*>({0})'.format(indicatorPattern)) - self.dvar_rx_class2 = QRegExp( - r'<class .* at 0x.*>({0})'.format(indicatorPattern)) - self.dvar_rx_array_element = QRegExp(r'^\d+$') - self.dvar_rx_special_array_element = QRegExp( - r'^\d+({0})$'.format(indicatorPattern)) - self.rx_nonprintable = QRegExp(r"""(\\x\d\d)+""") - self.framenr = 0 - self.loc = Preferences.getSystem("StringEncoding") + # Massive performance gain + self.setUniformRowHeights(True) + + # Implements sorting and filtering + self.proxyModel = VariablesProxyModel() + # Variable model implements the underlying data model + self.varModel = VariablesModel(self, globalScope) + self.preferencesChanged.connect(self.varModel.handlePreferencesChanged) + self.preferencesChanged.emit() # Force initialization of colors + self.proxyModel.setSourceModel(self.varModel) + self.setModel(self.proxyModel) - self.openItems = [] + self.expanded.connect( + lambda idx: self.proxyModel.setExpanded(idx, True)) + self.collapsed.connect( + lambda idx: self.proxyModel.setExpanded(idx, False)) - self.setRootIsDecorated(True) + self.setExpandsOnDoubleClick(False) + self.doubleClicked.connect(self.__itemDoubleClicked) + + self.varModel.expand.connect(self.__mdlRequestExpand) + + self.setSortingEnabled(True) self.setAlternatingRowColors(True) self.setSelectionBehavior(QAbstractItemView.SelectRows) if self.__globalScope: self.setWindowTitle(self.tr("Global Variables")) - self.setHeaderLabels([ - self.tr("Globals"), - self.tr("Value"), - self.tr("Type")]) self.setWhatsThis(self.tr( """<b>The Global Variables Viewer Window</b>""" """<p>This window displays the global variables""" @@ -369,10 +962,6 @@ )) else: self.setWindowTitle(self.tr("Local Variables")) - self.setHeaderLabels([ - self.tr("Locals"), - self.tr("Value"), - self.tr("Type")]) self.setWhatsThis(self.tr( """<b>The Local Variables Viewer Window</b>""" """<p>This window displays the local variables""" @@ -382,290 +971,171 @@ header = self.header() header.setSortIndicator(0, Qt.AscendingOrder) header.setSortIndicatorShown(True) - if qVersionTuple() >= (5, 0, 0): + + try: header.setSectionsClickable(True) - else: + except Exception: header.setClickable(True) - header.sectionClicked.connect(self.__sectionClicked) - header.resizeSection(0, 120) # variable column - header.resizeSection(1, 150) # value column + + header.resizeSection(0, 130) # variable column + header.resizeSection(1, 180) # value column + header.resizeSection(2, 50) # type column + + header.sortIndicatorChanged.connect(lambda *x: self.varModel.getMore()) self.__createPopupMenus() self.setContextMenuPolicy(Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.__showContextMenu) - self.itemExpanded.connect(self.__expandItemSignal) - self.itemCollapsed.connect(self.collapseItem) - self.resortEnabled = True - - def __createPopupMenus(self): - """ - Private method to generate the popup menus. - """ - self.menu = QMenu() - self.menu.addAction(self.tr("Show Details..."), self.__showDetails) - self.menu.addAction(self.tr("Refresh"), self.__refreshView) - self.menu.addSeparator() - self.menu.addAction(self.tr("Configure..."), self.__configure) - - self.backMenu = QMenu() - self.backMenu.addAction(self.tr("Refresh"), self.__refreshView) - self.backMenu.addSeparator() - self.backMenu.addAction(self.tr("Configure..."), self.__configure) - - def __showContextMenu(self, coord): - """ - Private slot to show the context menu. - - @param coord the position of the mouse pointer (QPoint) - """ - gcoord = self.mapToGlobal(coord) - if self.itemAt(coord) is not None: - self.menu.popup(gcoord) - else: - self.backMenu.popup(gcoord) - - def __findItem(self, slist, column, node=None): - """ - Private method to search for an item. - - It is used to find a specific item in column, - that is a child of node. If node is None, a child of the - QTreeWidget is searched. - - @param slist searchlist (list of strings) - @param column index of column to search in (int) - @param node start point of the search - @return the found item or None - """ - if node is None: - count = self.topLevelItemCount() - else: - count = node.childCount() - - if column == 0: - searchStr = VariableItem.extractId(slist[0])[0] - else: - searchStr = slist[0] - - for index in range(count): - if node is None: - itm = self.topLevelItem(index) - else: - itm = node.child(index) - if itm.text(column) == searchStr: - if len(slist) > 1: - itm = self.__findItem(slist[1:], column, itm) - return itm - - return None - + def showVariables(self, vlist, frmnr): """ Public method to show variables in a list. @param vlist the list of variables to be displayed. Each - listentry is a tuple of three values. + list entry is a tuple of three values. <ul> <li>the variable name (string)</li> <li>the variables type (string)</li> <li>the variables value (string)</li> </ul> - @param frmnr frame number (0 is the current frame) (int) + @type list + @param frmnr frame number (0 is the current frame) + @type int """ - self.current = self.currentItem() - if self.current: - self.curpathlist = self.__buildTreePath(self.current) - self.clear() - self.__scrollToItem = None - self.framenr = frmnr - - if len(vlist): - self.resortEnabled = False - for (var, vtype, value) in vlist: - self.__addItem(None, vtype, var, value) - - # re-expand tree - openItems = sorted(self.openItems[:]) - self.openItems = [] - for itemPath in openItems: - itm = self.__findItem(itemPath, 0) - if itm is not None: - self.expandItem(itm) - else: - self.openItems.append(itemPath) - - if self.current: - citm = self.__findItem(self.curpathlist, 0) - if citm: - self.setCurrentItem(citm) - citm.setSelected(True) - self.scrollToItem(citm, QAbstractItemView.PositionAtTop) - self.current = None - - self.resortEnabled = True - self.__resort() - + self.varModel.resetModifiedMarker() + self.varModel.showVariables(vlist, frmnr) + def showVariable(self, vlist): """ Public method to show variables in a list. @param vlist the list of subitems to be displayed. The first element gives the path of the - parent variable. Each other listentry is + parent variable. Each other list entry is a tuple of three values. <ul> <li>the variable name (string)</li> <li>the variables type (string)</li> <li>the variables value (string)</li> </ul> + @type list """ - resortEnabled = self.resortEnabled - self.resortEnabled = False - if self.current is None: - self.current = self.currentItem() - if self.current: - self.curpathlist = self.__buildTreePath(self.current) + self.varModel.showVariables(vlist[1:], 0, vlist[0]) + + def handleResetUI(self): + """ + Public method to reset the VariablesViewer. + """ + self.varModel.clear(True) + + def verticalScrollbarValueChanged(self, value): + """ + Public slot informing about the scrollbar change. + + @param value current value of the vertical scrollbar + @type int + """ + self.varModel.getMore() + super(VariablesViewer, self).verticalScrollbarValueChanged(value) + + def resizeEvent(self, event): + """ + Protected slot informing about the widget size change. - if vlist: - itm = self.__findItem(vlist[0], 0) - for var, vtype, value in vlist[1:]: - self.__addItem(itm, vtype, var, value) - - # re-expand tree - openItems = sorted(self.openItems[:]) - self.openItems = [] - for itemPath in openItems: - itm = self.__findItem(itemPath, 0) - if itm is not None and not itm.isExpanded(): - if itm.populated: - self.blockSignals(True) - itm.setExpanded(True) - self.blockSignals(False) - else: - self.expandItem(itm) - self.openItems = openItems[:] - - if self.current: - citm = self.__findItem(self.curpathlist, 0) - if citm: - self.setCurrentItem(citm) - citm.setSelected(True) - if self.__scrollToItem: - self.scrollToItem(self.__scrollToItem, - QAbstractItemView.PositionAtTop) - else: - self.scrollToItem(citm, QAbstractItemView.PositionAtTop) - self.current = None - elif self.__scrollToItem: - self.scrollToItem(self.__scrollToItem, - QAbstractItemView.PositionAtTop) + @param event information + @type QResizeEvent + """ + self.varModel.getMore() + super(VariablesViewer, self).resizeEvent(event) + + def __itemDoubleClicked(self, index): + """ + Private method called if an item was double clicked. - self.resortEnabled = resortEnabled - self.__resort() - - def __generateItem(self, parent, dvar, dvalue, dtype, isSpecial=False): + @param index the double clicked item + @type QModelIndex """ - Private method used to generate a VariableItem. - - @param parent parent of the item to be generated - @param dvar variable name (string) - @param dvalue value string (string) - @param dtype type string (string) - @param isSpecial flag indicating that a special node should be - generated (boolean) - @return The item that was generated (VariableItem). + node = self.proxyModel.mapToSource(index).internalPointer() + if node.hasChildren and index.column() == 0: + state = self.isExpanded(index) + self.setExpanded(index, not state) + else: + self.__showVariableDetails(index) + + def __mdlRequestExpand(self, modelIndex): """ - if isSpecial and \ - (self.dvar_rx_class1.exactMatch(dvar) or - self.dvar_rx_class2.exactMatch(dvar)): - isSpecial = False + Private method to inform the view about items to be expand. - if self.rx_class2.exactMatch(dtype): - return SpecialVarItem( - parent, dvar, dvalue, dtype[7:-1], self.framenr, - self.__globalScope) - elif dtype != "void *" and \ - (self.rx_class.exactMatch(dvalue) or - self.rx_class3.exactMatch(dvalue) or - isSpecial): - if self.dvar_rx_special_array_element.exactMatch(dvar): - return SpecialArrayElementVarItem( - parent, dvar, dvalue, dtype, self.framenr, - self.__globalScope) - else: - return SpecialVarItem(parent, dvar, dvalue, dtype, - self.framenr, self.__globalScope) - elif dtype in ["numpy.ndarray", "django.MultiValueDict", - "array.array"]: - return SpecialVarItem( - parent, dvar, self.tr("{0} items").format(dvalue), dtype, - self.framenr, self.__globalScope) - else: - if self.dvar_rx_array_element.exactMatch(dvar): - return ArrayElementVarItem(parent, dvar, dvalue, dtype) - else: - return VariableItem(parent, dvar, dvalue, dtype) + @param modelIndex the model index + @type QModelIndex + """ + index = self.proxyModel.mapFromSource(modelIndex) + self.expand(index) + + def __createPopupMenus(self): + """ + Private method to generate the popup menus. + """ + self.menu = QMenu() + self.menu.addAction(self.tr("Show Details..."), self.__showDetails) + self.menu.addSeparator() + self.menu.addAction(self.tr("Expand"), self.__expandChildren) + self.menu.addAction(self.tr("Collapse"), self.__collapseChildren) + self.menu.addAction(self.tr("Collapse All"), self.collapseAll) + self.menu.addSeparator() + self.menu.addAction(self.tr("Refresh"), self.__refreshView) + self.menu.addSeparator() + self.menu.addAction(self.tr("Configure..."), self.__configure) + self.menu.addAction(self.tr("Variables Type Filter..."), + self.__configureFilter) - def __addItem(self, parent, vtype, var, value): - """ - Private method used to add an item to the list. - - If the item is of a type with subelements (i.e. list, dictionary, - tuple), these subelements are added by calling this method recursively. - - @param parent the parent of the item to be added - (QTreeWidgetItem or None) - @param vtype the type of the item to be added - (string) - @param var the variable name (string) - @param value the value string (string) - @return The item that was added to the listview (QTreeWidgetItem). + self.backMenu = QMenu() + self.backMenu.addAction(self.tr("Refresh"), self.__refreshView) + self.backMenu.addSeparator() + self.backMenu.addAction(self.tr("Configure..."), self.__configure) + self.backMenu.addAction(self.tr("Variables Type Filter..."), + self.__configureFilter) + + def __showContextMenu(self, coord): """ - if parent is None: - parent = self - try: - dvar = '{0}{1}'.format(var, VariableItem.Type2Indicators[vtype]) - except KeyError: - dvar = var - dvtype = self.__getDispType(vtype) - - if vtype in ['list', 'tuple', 'dict', 'set', 'frozenset']: - itm = self.__generateItem(parent, dvar, - self.tr("{0} items").format(value), - dvtype, True) - elif vtype in ['unicode', 'str']: - if self.rx_nonprintable.indexIn(value) != -1: - sval = value - else: - try: - sval = eval(value) - except Exception: - sval = value - itm = self.__generateItem(parent, dvar, str(sval), dvtype) + Private slot to show the context menu. + @param coord the position of the mouse pointer + @type QPoint + """ + gcoord = self.mapToGlobal(coord) + if self.indexAt(coord).isValid(): + self.menu.popup(gcoord) else: - itm = self.__generateItem(parent, dvar, value, dvtype) - - return itm - - def __getDispType(self, vtype): + self.backMenu.popup(gcoord) + + def __expandChildren(self): + """ + Private slot to expand all child items of current parent. """ - Private method used to get the display string for type vtype. - - @param vtype the type, the display string should be looked up for - (string) - @return displaystring (string) + index = self.currentIndex() + node = self.proxyModel.mapToSource(index).internalPointer() + for child in node.children: + if child.hasChildren: + row = node.children.index(child) + idx = self.varModel.createIndex(row, 0, child) + idx = self.proxyModel.mapFromSource(idx) + self.expand(idx) + + def __collapseChildren(self): """ - try: - dvtype = self.tr(ConfigVarTypeDispStrings[vtype]) - except KeyError: - if vtype == 'classobj': - dvtype = self.tr(ConfigVarTypeDispStrings['instance']) - else: - dvtype = vtype - return dvtype + Private slot to collapse all child items of current parent. + """ + index = self.currentIndex() + node = self.proxyModel.mapToSource(index).internalPointer() + for child in node.children: + row = node.children.index(child) + idx = self.varModel.createIndex(row, 0, child) + idx = self.proxyModel.mapFromSource(idx) + if self.isExpanded(idx): + self.collapse(idx) def __refreshView(self): """ @@ -676,63 +1146,42 @@ else: self.__debugViewer.setLocalsFilter() - def mouseDoubleClickEvent(self, mouseEvent): - """ - Protected method of QAbstractItemView. - - Reimplemented to disable expanding/collapsing of items when - double-clicking. Instead the double-clicked entry is opened. - - @param mouseEvent the mouse event object (QMouseEvent) - """ - itm = self.itemAt(mouseEvent.pos()) - self.__showVariableDetails(itm) - def __showDetails(self): """ Private slot to show details about the selected variable. """ - itm = self.currentItem() - self.__showVariableDetails(itm) - - def __showVariableDetails(self, itm): + idx = self.currentIndex() + self.__showVariableDetails(idx) + + def __showVariableDetails(self, index): """ Private method to show details about a variable. - @param itm reference to the variable item + @param index reference to the variable item + @type QModelIndex """ - if itm is None: - return - - val = itm.getValue() + node = self.proxyModel.mapToSource(index).internalPointer() - if not val: - return # do not display anything, if the variable has no value - - vtype = itm.text(2) - name = VariableItem.extractIndicators(itm.text(0).strip())[0] + val = node.value + vtype = node.type + name = node.name - par = itm.parent() - if name.startswith("["): # numpy.ndarray, array.array - nlist = [] - else: - nlist = [name] + par = node.parent + nlist = [name] # build up the fully qualified name - while par is not None: - pname, indicators = VariableItem.extractIndicators( - par.text(0).strip()) - if indicators: + while par.parent is not None: + pname = par.name + if par.indicator: if nlist[0].endswith("."): nlist[0] = '[{0}].'.format(nlist[0][:-1]) else: nlist[0] = '[{0}]'.format(nlist[0]) - if not pname.startswith("["): # numpy.ndarray, array.array - nlist.insert(0, pname) + nlist.insert(0, pname) else: - if par.text(2) == "django.MultiValueDict": + if par.type == "django.MultiValueDict": nlist[0] = 'getlist({0})'.format(nlist[0]) - elif par.text(2) == "numpy.ndarray": + elif par.type == "numpy.ndarray": if nlist and nlist[0][0].isalpha(): if nlist[0] in ["min", "max", "mean"]: nlist[0] = ".{0}()".format(nlist[0]) @@ -741,106 +1190,26 @@ nlist.insert(0, pname) else: nlist.insert(0, '{0}.'.format(pname)) - par = par.parent() - + par = par.parent + name = ''.join(nlist) # now show the dialog from .VariableDetailDialog import VariableDetailDialog dlg = VariableDetailDialog(name, vtype, val) dlg.exec_() - def __buildTreePath(self, itm): - """ - Private method to build up a path from the top to an item. - - @param itm item to build the path for (QTreeWidgetItem) - @return list of names denoting the path from the top (list of strings) - """ - name = itm.text(0) - pathlist = [name] - - par = itm.parent() - # build up a path from the top to the item - while par is not None: - pname = par.text(0) - pathlist.insert(0, pname) - par = par.parent() - - return pathlist[:] - - def __expandItemSignal(self, parentItem): - """ - Private slot to handle the expanded signal. - - @param parentItem reference to the item being expanded - (QTreeWidgetItem) - """ - self.expandItem(parentItem) - self.__scrollToItem = parentItem - - def expandItem(self, parentItem): - """ - Public slot to handle the expanded signal. - - @param parentItem reference to the item being expanded - (QTreeWidgetItem) - """ - pathlist = self.__buildTreePath(parentItem) - self.openItems.append(pathlist) - if parentItem.populated: - return - - try: - parentItem.expand() - except AttributeError: - super(VariablesViewer, self).expandItem(parentItem) - - def collapseItem(self, parentItem): - """ - Public slot to handle the collapsed signal. - - @param parentItem reference to the item being collapsed - (QTreeWidgetItem) - """ - pathlist = self.__buildTreePath(parentItem) - self.openItems.remove(pathlist) - - try: - parentItem.collapse() - except AttributeError: - super(VariablesViewer, self).collapseItem(parentItem) - - def __sectionClicked(self): - """ - Private method handling a click onto a header section. - """ - self.__resort() - - def __resort(self, parent=None): - """ - Private method to resort the tree. - - @param parent reference to a parent item - @type QTreeWidgetItem - """ - if self.resortEnabled: - if parent is not None: - parent.sortChildren(self.sortColumn(), - self.header().sortIndicatorOrder()) - else: - self.sortItems(self.sortColumn(), - self.header().sortIndicatorOrder()) - - def handleResetUI(self): - """ - Public method to reset the VariablesViewer. - """ - self.clear() - self.openItems = [] - def __configure(self): """ Private method to open the configuration dialog. """ e5App().getObject("UserInterface")\ .showPreferences("debuggerGeneralPage") + + def __configureFilter(self): + """ + Private method to open the variables filter dialog. + """ + e5App().getObject("DebugUI").dbgFilterAct.triggered.emit() + +# +# eflag: noqa = M822
--- a/eric6/Debugger/WatchPointModel.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Debugger/WatchPointModel.py Sun Jun 02 11:42:48 2019 +0200 @@ -243,9 +243,10 @@ rows.append(index.row()) rows.sort(reverse=True) for row in rows: - self.beginRemoveRows(QModelIndex(), row, row) - del self.watchpoints[row] - self.endRemoveRows() + if row < len(self.breakpoints): + self.beginRemoveRows(QModelIndex(), row, row) + del self.watchpoints[row] + self.endRemoveRows() def deleteAll(self): """
--- a/eric6/Documentation/Help/source.qhp Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Documentation/Help/source.qhp Sun Jun 02 11:42:48 2019 +0200 @@ -622,6 +622,11 @@ <section title="eric6.Plugins.VcsPlugins.vcsGit.git" ref="eric6.Plugins.VcsPlugins.vcsGit.git.html" /> </section> <section title="eric6.Plugins.VcsPlugins.vcsMercurial" ref="index-eric6.Plugins.VcsPlugins.vcsMercurial.html"> + <section title="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension" ref="index-eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.html"> + <section title="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.html" /> + <section title="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.html" /> + <section title="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead.html" /> + </section> <section title="eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage" ref="index-eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.html"> <section title="eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.MercurialPage" ref="eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.MercurialPage.html" /> </section> @@ -2087,9 +2092,6 @@ <keyword name="ArgumentsError (Constructor)" id="ArgumentsError (Constructor)" ref="eric6.E5Gui.E5Action.html#ArgumentsError.__init__" /> <keyword name="ArgumentsError.__repr__" id="ArgumentsError.__repr__" ref="eric6.E5Gui.E5Action.html#ArgumentsError.__repr__" /> <keyword name="ArgumentsError.__str__" id="ArgumentsError.__str__" ref="eric6.E5Gui.E5Action.html#ArgumentsError.__str__" /> - <keyword name="ArrayElementVarItem" id="ArrayElementVarItem" ref="eric6.Debugger.VariablesViewer.html#ArrayElementVarItem" /> - <keyword name="ArrayElementVarItem (Constructor)" id="ArrayElementVarItem (Constructor)" ref="eric6.Debugger.VariablesViewer.html#ArrayElementVarItem.__init__" /> - <keyword name="ArrayItemsContainer" id="ArrayItemsContainer" ref="eric6.DebugClients.Python.DebugVariables.html#ArrayItemsContainer" /> <keyword name="ArrayResolver" id="ArrayResolver" ref="eric6.DebugClients.Python.DebugVariables.html#ArrayResolver" /> <keyword name="ArrayResolver.getDictionary" id="ArrayResolver.getDictionary" ref="eric6.DebugClients.Python.DebugVariables.html#ArrayResolver.getDictionary" /> <keyword name="ArrayResolver.resolve" id="ArrayResolver.resolve" ref="eric6.DebugClients.Python.DebugVariables.html#ArrayResolver.resolve" /> @@ -2779,10 +2781,12 @@ <keyword name="BugBearVisitor.__checkForM502" id="BugBearVisitor.__checkForM502" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#BugBearVisitor.__checkForM502" /> <keyword name="BugBearVisitor.__checkForM507" id="BugBearVisitor.__checkForM507" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#BugBearVisitor.__checkForM507" /> <keyword name="BugBearVisitor.visit" id="BugBearVisitor.visit" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#BugBearVisitor.visit" /> + <keyword name="BugBearVisitor.visit_Assert" id="BugBearVisitor.visit_Assert" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#BugBearVisitor.visit_Assert" /> <keyword name="BugBearVisitor.visit_Assign" id="BugBearVisitor.visit_Assign" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#BugBearVisitor.visit_Assign" /> <keyword name="BugBearVisitor.visit_Attribute" id="BugBearVisitor.visit_Attribute" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#BugBearVisitor.visit_Attribute" /> <keyword name="BugBearVisitor.visit_Call" id="BugBearVisitor.visit_Call" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#BugBearVisitor.visit_Call" /> <keyword name="BugBearVisitor.visit_For" id="BugBearVisitor.visit_For" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#BugBearVisitor.visit_For" /> + <keyword name="BugBearVisitor.visit_JoinedStr" id="BugBearVisitor.visit_JoinedStr" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#BugBearVisitor.visit_JoinedStr" /> <keyword name="BugBearVisitor.visit_UAdd" id="BugBearVisitor.visit_UAdd" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#BugBearVisitor.visit_UAdd" /> <keyword name="CallStackViewer" id="CallStackViewer" ref="eric6.Debugger.CallStackViewer.html#CallStackViewer" /> <keyword name="CallStackViewer (Constructor)" id="CallStackViewer (Constructor)" ref="eric6.Debugger.CallStackViewer.html#CallStackViewer.__init__" /> @@ -3004,6 +3008,16 @@ <keyword name="ClosedTabsManager.isClosedTabAvailable" id="ClosedTabsManager.isClosedTabAvailable" ref="eric6.WebBrowser.ClosedTabsManager.html#ClosedTabsManager.isClosedTabAvailable" /> <keyword name="ClosedTabsManager.recordBrowser" id="ClosedTabsManager.recordBrowser" ref="eric6.Helpviewer.ClosedTabsManager.html#ClosedTabsManager.recordBrowser" /> <keyword name="ClosedTabsManager.recordBrowser" id="ClosedTabsManager.recordBrowser" ref="eric6.WebBrowser.ClosedTabsManager.html#ClosedTabsManager.recordBrowser" /> + <keyword name="Closehead" id="Closehead" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead.html#Closehead" /> + <keyword name="Closehead (Constructor)" id="Closehead (Constructor)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead.html#Closehead.__init__" /> + <keyword name="Closehead.hgCloseheads" id="Closehead.hgCloseheads" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead.html#Closehead.hgCloseheads" /> + <keyword name="CloseheadExtension (Package)" id="CloseheadExtension (Package)" ref="index-eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.html" /> + <keyword name="CloseheadProjectHelper" id="CloseheadProjectHelper" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.html#CloseheadProjectHelper" /> + <keyword name="CloseheadProjectHelper (Constructor)" id="CloseheadProjectHelper (Constructor)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.html#CloseheadProjectHelper.__init__" /> + <keyword name="CloseheadProjectHelper.__hgClosehead" id="CloseheadProjectHelper.__hgClosehead" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.html#CloseheadProjectHelper.__hgClosehead" /> + <keyword name="CloseheadProjectHelper.initActions" id="CloseheadProjectHelper.initActions" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.html#CloseheadProjectHelper.initActions" /> + <keyword name="CloseheadProjectHelper.initMenu" id="CloseheadProjectHelper.initMenu" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.html#CloseheadProjectHelper.initMenu" /> + <keyword name="CloseheadProjectHelper.menuTitle" id="CloseheadProjectHelper.menuTitle" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.html#CloseheadProjectHelper.menuTitle" /> <keyword name="CodeDocumentationViewer" id="CodeDocumentationViewer" ref="eric6.UI.CodeDocumentationViewer.html#CodeDocumentationViewer" /> <keyword name="CodeDocumentationViewer (Constructor)" id="CodeDocumentationViewer (Constructor)" ref="eric6.UI.CodeDocumentationViewer.html#CodeDocumentationViewer.__init__" /> <keyword name="CodeDocumentationViewer (Module)" id="CodeDocumentationViewer (Module)" ref="eric6.UI.CodeDocumentationViewer.html" /> @@ -3981,10 +3995,10 @@ <keyword name="DebugViewer.currentWidget" id="DebugViewer.currentWidget" ref="eric6.Debugger.DebugViewer.html#DebugViewer.currentWidget" /> <keyword name="DebugViewer.handleClientStack" id="DebugViewer.handleClientStack" ref="eric6.Debugger.DebugViewer.html#DebugViewer.handleClientStack" /> <keyword name="DebugViewer.handleDebuggingStarted" id="DebugViewer.handleDebuggingStarted" ref="eric6.Debugger.DebugViewer.html#DebugViewer.handleDebuggingStarted" /> + <keyword name="DebugViewer.handlePreferencesChanged" id="DebugViewer.handlePreferencesChanged" ref="eric6.Debugger.DebugViewer.html#DebugViewer.handlePreferencesChanged" /> <keyword name="DebugViewer.handleResetUI" id="DebugViewer.handleResetUI" ref="eric6.Debugger.DebugViewer.html#DebugViewer.handleResetUI" /> <keyword name="DebugViewer.initCallStackViewer" id="DebugViewer.initCallStackViewer" ref="eric6.Debugger.DebugViewer.html#DebugViewer.initCallStackViewer" /> <keyword name="DebugViewer.isCallTraceEnabled" id="DebugViewer.isCallTraceEnabled" ref="eric6.Debugger.DebugViewer.html#DebugViewer.isCallTraceEnabled" /> - <keyword name="DebugViewer.preferencesChanged" id="DebugViewer.preferencesChanged" ref="eric6.Debugger.DebugViewer.html#DebugViewer.preferencesChanged" /> <keyword name="DebugViewer.setCallTraceToProjectMode" id="DebugViewer.setCallTraceToProjectMode" ref="eric6.Debugger.DebugViewer.html#DebugViewer.setCallTraceToProjectMode" /> <keyword name="DebugViewer.setCurrentWidget" id="DebugViewer.setCurrentWidget" ref="eric6.Debugger.DebugViewer.html#DebugViewer.setCurrentWidget" /> <keyword name="DebugViewer.setDebugger" id="DebugViewer.setDebugger" ref="eric6.Debugger.DebugViewer.html#DebugViewer.setDebugger" /> @@ -4137,7 +4151,6 @@ <keyword name="DeepLEngine.supportedLanguages" id="DeepLEngine.supportedLanguages" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.DeepLEngine.html#DeepLEngine.supportedLanguages" /> <keyword name="DefaultResolver" id="DefaultResolver" ref="eric6.DebugClients.Python.DebugVariables.html#DefaultResolver" /> <keyword name="DefaultResolver.getDictionary" id="DefaultResolver.getDictionary" ref="eric6.DebugClients.Python.DebugVariables.html#DefaultResolver.getDictionary" /> - <keyword name="DefaultResolver.resolve" id="DefaultResolver.resolve" ref="eric6.DebugClients.Python.DebugVariables.html#DefaultResolver.resolve" /> <keyword name="DefaultSearchEngines (Package)" id="DefaultSearchEngines (Package)" ref="index-eric6.Helpviewer.OpenSearch.DefaultSearchEngines.html" /> <keyword name="DefaultSearchEngines (Package)" id="DefaultSearchEngines (Package)" ref="index-eric6.WebBrowser.OpenSearch.DefaultSearchEngines.html" /> <keyword name="DelayedFileWatcher" id="DelayedFileWatcher" ref="eric6.WebBrowser.Tools.DelayedFileWatcher.html#DelayedFileWatcher" /> @@ -4155,6 +4168,9 @@ <keyword name="DictResolver.getDictionary" id="DictResolver.getDictionary" ref="eric6.DebugClients.Python.DebugVariables.html#DictResolver.getDictionary" /> <keyword name="DictResolver.keyToStr" id="DictResolver.keyToStr" ref="eric6.DebugClients.Python.DebugVariables.html#DictResolver.keyToStr" /> <keyword name="DictResolver.resolve" id="DictResolver.resolve" ref="eric6.DebugClients.Python.DebugVariables.html#DictResolver.resolve" /> + <keyword name="DictViewResolver" id="DictViewResolver" ref="eric6.DebugClients.Python.DebugVariables.html#DictViewResolver" /> + <keyword name="DictViewResolver.getDictionary" id="DictViewResolver.getDictionary" ref="eric6.DebugClients.Python.DebugVariables.html#DictViewResolver.getDictionary" /> + <keyword name="DictViewResolver.resolve" id="DictViewResolver.resolve" ref="eric6.DebugClients.Python.DebugVariables.html#DictViewResolver.resolve" /> <keyword name="DiffColoursPage" id="DiffColoursPage" ref="eric6.Preferences.ConfigurationPages.DiffColoursPage.html#DiffColoursPage" /> <keyword name="DiffColoursPage (Constructor)" id="DiffColoursPage (Constructor)" ref="eric6.Preferences.ConfigurationPages.DiffColoursPage.html#DiffColoursPage.__init__" /> <keyword name="DiffColoursPage (Module)" id="DiffColoursPage (Module)" ref="eric6.Preferences.ConfigurationPages.DiffColoursPage.html" /> @@ -8852,6 +8868,12 @@ <keyword name="HgClientPromptDialog.isPassword" id="HgClientPromptDialog.isPassword" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgClientPromptDialog.html#HgClientPromptDialog.isPassword" /> <keyword name="HgClientPromptDialog.on_inputEdit_textChanged" id="HgClientPromptDialog.on_inputEdit_textChanged" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgClientPromptDialog.html#HgClientPromptDialog.on_inputEdit_textChanged" /> <keyword name="HgClientPromptDialog.on_passwordCheckBox_toggled" id="HgClientPromptDialog.on_passwordCheckBox_toggled" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgClientPromptDialog.html#HgClientPromptDialog.on_passwordCheckBox_toggled" /> + <keyword name="HgCloseHeadSelectionDialog" id="HgCloseHeadSelectionDialog" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.html#HgCloseHeadSelectionDialog" /> + <keyword name="HgCloseHeadSelectionDialog (Constructor)" id="HgCloseHeadSelectionDialog (Constructor)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.html#HgCloseHeadSelectionDialog.__init__" /> + <keyword name="HgCloseHeadSelectionDialog (Module)" id="HgCloseHeadSelectionDialog (Module)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.html" /> + <keyword name="HgCloseHeadSelectionDialog.__getHeads" id="HgCloseHeadSelectionDialog.__getHeads" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.html#HgCloseHeadSelectionDialog.__getHeads" /> + <keyword name="HgCloseHeadSelectionDialog.getData" id="HgCloseHeadSelectionDialog.getData" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.html#HgCloseHeadSelectionDialog.getData" /> + <keyword name="HgCloseHeadSelectionDialog.on_headsList_itemSelectionChanged" id="HgCloseHeadSelectionDialog.on_headsList_itemSelectionChanged" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.html#HgCloseHeadSelectionDialog.on_headsList_itemSelectionChanged" /> <keyword name="HgCommandDialog" id="HgCommandDialog" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgCommandDialog.html#HgCommandDialog" /> <keyword name="HgCommandDialog (Constructor)" id="HgCommandDialog (Constructor)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgCommandDialog.html#HgCommandDialog.__init__" /> <keyword name="HgCommandDialog (Module)" id="HgCommandDialog (Module)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgCommandDialog.html" /> @@ -9083,6 +9105,7 @@ <keyword name="HgLogBrowserDialog.__bookmarkMoveActTriggered" id="HgLogBrowserDialog.__bookmarkMoveActTriggered" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__bookmarkMoveActTriggered" /> <keyword name="HgLogBrowserDialog.__branchColor" id="HgLogBrowserDialog.__branchColor" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__branchColor" /> <keyword name="HgLogBrowserDialog.__bundleActTriggered" id="HgLogBrowserDialog.__bundleActTriggered" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__bundleActTriggered" /> + <keyword name="HgLogBrowserDialog.__closeHeadsActTriggered" id="HgLogBrowserDialog.__closeHeadsActTriggered" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__closeHeadsActTriggered" /> <keyword name="HgLogBrowserDialog.__fetchActTriggered" id="HgLogBrowserDialog.__fetchActTriggered" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__fetchActTriggered" /> <keyword name="HgLogBrowserDialog.__filterLogs" id="HgLogBrowserDialog.__filterLogs" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__filterLogs" /> <keyword name="HgLogBrowserDialog.__findItem" id="HgLogBrowserDialog.__findItem" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__findItem" /> @@ -9095,6 +9118,7 @@ <keyword name="HgLogBrowserDialog.__generatorFinished" id="HgLogBrowserDialog.__generatorFinished" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__generatorFinished" /> <keyword name="HgLogBrowserDialog.__getClosedBranches" id="HgLogBrowserDialog.__getClosedBranches" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__getClosedBranches" /> <keyword name="HgLogBrowserDialog.__getColor" id="HgLogBrowserDialog.__getColor" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__getColor" /> + <keyword name="HgLogBrowserDialog.__getHeads" id="HgLogBrowserDialog.__getHeads" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__getHeads" /> <keyword name="HgLogBrowserDialog.__getLogEntries" id="HgLogBrowserDialog.__getLogEntries" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__getLogEntries" /> <keyword name="HgLogBrowserDialog.__getParents" id="HgLogBrowserDialog.__getParents" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__getParents" /> <keyword name="HgLogBrowserDialog.__getRevisionOfTag" id="HgLogBrowserDialog.__getRevisionOfTag" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html#HgLogBrowserDialog.__getRevisionOfTag" /> @@ -9599,6 +9623,7 @@ <keyword name="HgTagBranchListDialog (Constructor)" id="HgTagBranchListDialog (Constructor)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgTagBranchListDialog.html#HgTagBranchListDialog.__init__" /> <keyword name="HgTagBranchListDialog (Module)" id="HgTagBranchListDialog (Module)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgTagBranchListDialog.html" /> <keyword name="HgTagBranchListDialog.__closeBranch" id="HgTagBranchListDialog.__closeBranch" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgTagBranchListDialog.html#HgTagBranchListDialog.__closeBranch" /> + <keyword name="HgTagBranchListDialog.__closeBranchHeads" id="HgTagBranchListDialog.__closeBranchHeads" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgTagBranchListDialog.html#HgTagBranchListDialog.__closeBranchHeads" /> <keyword name="HgTagBranchListDialog.__finish" id="HgTagBranchListDialog.__finish" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgTagBranchListDialog.html#HgTagBranchListDialog.__finish" /> <keyword name="HgTagBranchListDialog.__generateItem" id="HgTagBranchListDialog.__generateItem" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgTagBranchListDialog.html#HgTagBranchListDialog.__generateItem" /> <keyword name="HgTagBranchListDialog.__highlightCurrentBranch" id="HgTagBranchListDialog.__highlightCurrentBranch" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgTagBranchListDialog.html#HgTagBranchListDialog.__highlightCurrentBranch" /> @@ -10321,6 +10346,7 @@ <keyword name="InterfacePage (Constructor)" id="InterfacePage (Constructor)" ref="eric6.Preferences.ConfigurationPages.InterfacePage.html#InterfacePage.__init__" /> <keyword name="InterfacePage (Module)" id="InterfacePage (Module)" ref="eric6.Preferences.ConfigurationPages.InterfacePage.html" /> <keyword name="InterfacePage.__populateLanguageCombo" id="InterfacePage.__populateLanguageCombo" ref="eric6.Preferences.ConfigurationPages.InterfacePage.html#InterfacePage.__populateLanguageCombo" /> + <keyword name="InterfacePage.__populateShellPositionCombo" id="InterfacePage.__populateShellPositionCombo" ref="eric6.Preferences.ConfigurationPages.InterfacePage.html#InterfacePage.__populateShellPositionCombo" /> <keyword name="InterfacePage.__populateStyleCombo" id="InterfacePage.__populateStyleCombo" ref="eric6.Preferences.ConfigurationPages.InterfacePage.html#InterfacePage.__populateStyleCombo" /> <keyword name="InterfacePage.on_resetLayoutButton_clicked" id="InterfacePage.on_resetLayoutButton_clicked" ref="eric6.Preferences.ConfigurationPages.InterfacePage.html#InterfacePage.on_resetLayoutButton_clicked" /> <keyword name="InterfacePage.save" id="InterfacePage.save" ref="eric6.Preferences.ConfigurationPages.InterfacePage.html#InterfacePage.save" /> @@ -11640,7 +11666,6 @@ <keyword name="NavigationContainer (Constructor)" id="NavigationContainer (Constructor)" ref="eric6.WebBrowser.Navigation.NavigationContainer.html#NavigationContainer.__init__" /> <keyword name="NavigationContainer (Module)" id="NavigationContainer (Module)" ref="eric6.WebBrowser.Navigation.NavigationContainer.html" /> <keyword name="NavigationContainer.addWidget" id="NavigationContainer.addWidget" ref="eric6.WebBrowser.Navigation.NavigationContainer.html#NavigationContainer.addWidget" /> - <keyword name="NdArrayItemsContainer" id="NdArrayItemsContainer" ref="eric6.DebugClients.Python.DebugVariables.html#NdArrayItemsContainer" /> <keyword name="NdArrayResolver" id="NdArrayResolver" ref="eric6.DebugClients.Python.DebugVariables.html#NdArrayResolver" /> <keyword name="NdArrayResolver.__isNumeric" id="NdArrayResolver.__isNumeric" ref="eric6.DebugClients.Python.DebugVariables.html#NdArrayResolver.__isNumeric" /> <keyword name="NdArrayResolver.getDictionary" id="NdArrayResolver.getDictionary" ref="eric6.DebugClients.Python.DebugVariables.html#NdArrayResolver.getDictionary" /> @@ -12749,6 +12774,15 @@ <keyword name="Prefs" id="Prefs" ref="eric6.Preferences.__init__.html#Prefs" /> <keyword name="Prefs.initWebEngineSettingsDefaults" id="Prefs.initWebEngineSettingsDefaults" ref="eric6.Preferences.__init__.html#Prefs.initWebEngineSettingsDefaults" /> <keyword name="Prefs.initWebSettingsDefaults" id="Prefs.initWebSettingsDefaults" ref="eric6.Preferences.__init__.html#Prefs.initWebSettingsDefaults" /> + <keyword name="PreviewModel" id="PreviewModel" ref="eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html#PreviewModel" /> + <keyword name="PreviewModel (Constructor)" id="PreviewModel (Constructor)" ref="eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html#PreviewModel.__init__" /> + <keyword name="PreviewModel.columnCount" id="PreviewModel.columnCount" ref="eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html#PreviewModel.columnCount" /> + <keyword name="PreviewModel.data" id="PreviewModel.data" ref="eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html#PreviewModel.data" /> + <keyword name="PreviewModel.flags" id="PreviewModel.flags" ref="eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html#PreviewModel.flags" /> + <keyword name="PreviewModel.index" id="PreviewModel.index" ref="eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html#PreviewModel.index" /> + <keyword name="PreviewModel.parent" id="PreviewModel.parent" ref="eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html#PreviewModel.parent" /> + <keyword name="PreviewModel.rowCount" id="PreviewModel.rowCount" ref="eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html#PreviewModel.rowCount" /> + <keyword name="PreviewModel.setColor" id="PreviewModel.setColor" ref="eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html#PreviewModel.setColor" /> <keyword name="PreviewProcessingThread" id="PreviewProcessingThread" ref="eric6.UI.Previewers.PreviewerHTML.html#PreviewProcessingThread" /> <keyword name="PreviewProcessingThread (Constructor)" id="PreviewProcessingThread (Constructor)" ref="eric6.UI.Previewers.PreviewerHTML.html#PreviewProcessingThread.__init__" /> <keyword name="PreviewProcessingThread.__convertMarkdown" id="PreviewProcessingThread.__convertMarkdown" ref="eric6.UI.Previewers.PreviewerHTML.html#PreviewProcessingThread.__convertMarkdown" /> @@ -12969,7 +13003,7 @@ <keyword name="Project.hasProjectType" id="Project.hasProjectType" ref="eric6.Project.Project.html#Project.hasProjectType" /> <keyword name="Project.initActions" id="Project.initActions" ref="eric6.Project.Project.html#Project.initActions" /> <keyword name="Project.initFileTypes" id="Project.initFileTypes" ref="eric6.Project.Project.html#Project.initFileTypes" /> - <keyword name="Project.initMenu" id="Project.initMenu" ref="eric6.Project.Project.html#Project.initMenu" /> + <keyword name="Project.initMenus" id="Project.initMenus" ref="eric6.Project.Project.html#Project.initMenus" /> <keyword name="Project.initToolbars" id="Project.initToolbars" ref="eric6.Project.Project.html#Project.initToolbars" /> <keyword name="Project.initVCS" id="Project.initVCS" ref="eric6.Project.Project.html#Project.initVCS" /> <keyword name="Project.isDebugPropertiesLoaded" id="Project.isDebugPropertiesLoaded" ref="eric6.Project.Project.html#Project.isDebugPropertiesLoaded" /> @@ -13185,6 +13219,7 @@ <keyword name="ProjectFormsBrowser.getUiCompiler" id="ProjectFormsBrowser.getUiCompiler" ref="eric6.Project.ProjectFormsBrowser.html#ProjectFormsBrowser.getUiCompiler" /> <keyword name="ProjectFormsBrowser.handlePreferencesChanged" id="ProjectFormsBrowser.handlePreferencesChanged" ref="eric6.Project.ProjectFormsBrowser.html#ProjectFormsBrowser.handlePreferencesChanged" /> <keyword name="ProjectHelper (Module)" id="ProjectHelper (Module)" ref="eric6.Plugins.VcsPlugins.vcsGit.ProjectHelper.html" /> + <keyword name="ProjectHelper (Module)" id="ProjectHelper (Module)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.html" /> <keyword name="ProjectHelper (Module)" id="ProjectHelper (Module)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.FetchExtension.ProjectHelper.html" /> <keyword name="ProjectHelper (Module)" id="ProjectHelper (Module)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.GpgExtension.ProjectHelper.html" /> <keyword name="ProjectHelper (Module)" id="ProjectHelper (Module)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HisteditExtension.ProjectHelper.html" /> @@ -14508,10 +14543,12 @@ <keyword name="SetupWizardDialog (Module)" id="SetupWizardDialog (Module)" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html" /> <keyword name="SetupWizardDialog.__addClassifierEntry" id="SetupWizardDialog.__addClassifierEntry" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.__addClassifierEntry" /> <keyword name="SetupWizardDialog.__addPackage" id="SetupWizardDialog.__addPackage" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.__addPackage" /> + <keyword name="SetupWizardDialog.__classifiersDownloadDone" id="SetupWizardDialog.__classifiersDownloadDone" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.__classifiersDownloadDone" /> <keyword name="SetupWizardDialog.__enableOkButton" id="SetupWizardDialog.__enableOkButton" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.__enableOkButton" /> <keyword name="SetupWizardDialog.__getLicenseText" id="SetupWizardDialog.__getLicenseText" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.__getLicenseText" /> <keyword name="SetupWizardDialog.__getStartDir" id="SetupWizardDialog.__getStartDir" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.__getStartDir" /> - <keyword name="SetupWizardDialog.__populateFromTroveLists" id="SetupWizardDialog.__populateFromTroveLists" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.__populateFromTroveLists" /> + <keyword name="SetupWizardDialog.__loadClassifiersFromPyPI" id="SetupWizardDialog.__loadClassifiersFromPyPI" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.__loadClassifiersFromPyPI" /> + <keyword name="SetupWizardDialog.__populateClassifiers" id="SetupWizardDialog.__populateClassifiers" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.__populateClassifiers" /> <keyword name="SetupWizardDialog.getCode" id="SetupWizardDialog.getCode" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.getCode" /> <keyword name="SetupWizardDialog.on_addExludePatternButton_clicked" id="SetupWizardDialog.on_addExludePatternButton_clicked" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.on_addExludePatternButton_clicked" /> <keyword name="SetupWizardDialog.on_addModuleButton_clicked" id="SetupWizardDialog.on_addModuleButton_clicked" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.on_addModuleButton_clicked" /> @@ -14525,6 +14562,7 @@ <keyword name="SetupWizardDialog.on_excludePatternEdit_returnPressed" id="SetupWizardDialog.on_excludePatternEdit_returnPressed" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.on_excludePatternEdit_returnPressed" /> <keyword name="SetupWizardDialog.on_excludePatternEdit_textChanged" id="SetupWizardDialog.on_excludePatternEdit_textChanged" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.on_excludePatternEdit_textChanged" /> <keyword name="SetupWizardDialog.on_excludePatternList_itemSelectionChanged" id="SetupWizardDialog.on_excludePatternList_itemSelectionChanged" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.on_excludePatternList_itemSelectionChanged" /> + <keyword name="SetupWizardDialog.on_localClassifiersButton_clicked" id="SetupWizardDialog.on_localClassifiersButton_clicked" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.on_localClassifiersButton_clicked" /> <keyword name="SetupWizardDialog.on_modulesList_itemSelectionChanged" id="SetupWizardDialog.on_modulesList_itemSelectionChanged" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.on_modulesList_itemSelectionChanged" /> <keyword name="SetupWizardDialog.on_packageDirButton_clicked" id="SetupWizardDialog.on_packageDirButton_clicked" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.on_packageDirButton_clicked" /> <keyword name="SetupWizardDialog.on_packageEdit_returnPressed" id="SetupWizardDialog.on_packageEdit_returnPressed" ref="eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html#SetupWizardDialog.on_packageEdit_returnPressed" /> @@ -14930,11 +14968,6 @@ <keyword name="SourceStat.inc" id="SourceStat.inc" ref="eric6.DataViews.CodeMetrics.html#SourceStat.inc" /> <keyword name="SourceStat.indent" id="SourceStat.indent" ref="eric6.DataViews.CodeMetrics.html#SourceStat.indent" /> <keyword name="SourceStat.push" id="SourceStat.push" ref="eric6.DataViews.CodeMetrics.html#SourceStat.push" /> - <keyword name="SpecialArrayElementVarItem" id="SpecialArrayElementVarItem" ref="eric6.Debugger.VariablesViewer.html#SpecialArrayElementVarItem" /> - <keyword name="SpecialArrayElementVarItem (Constructor)" id="SpecialArrayElementVarItem (Constructor)" ref="eric6.Debugger.VariablesViewer.html#SpecialArrayElementVarItem.__init__" /> - <keyword name="SpecialVarItem" id="SpecialVarItem" ref="eric6.Debugger.VariablesViewer.html#SpecialVarItem" /> - <keyword name="SpecialVarItem (Constructor)" id="SpecialVarItem (Constructor)" ref="eric6.Debugger.VariablesViewer.html#SpecialVarItem.__init__" /> - <keyword name="SpecialVarItem.expand" id="SpecialVarItem.expand" ref="eric6.Debugger.VariablesViewer.html#SpecialVarItem.expand" /> <keyword name="SpeedDial" id="SpeedDial" ref="eric6.Helpviewer.SpeedDial.SpeedDial.html#SpeedDial" /> <keyword name="SpeedDial" id="SpeedDial" ref="eric6.WebBrowser.SpeedDial.SpeedDial.html#SpeedDial" /> <keyword name="SpeedDial (Constructor)" id="SpeedDial (Constructor)" ref="eric6.Helpviewer.SpeedDial.SpeedDial.html#SpeedDial.__init__" /> @@ -17397,6 +17430,7 @@ <keyword name="UserInterface.handleUrl" id="UserInterface.handleUrl" ref="eric6.UI.UserInterface.html#UserInterface.handleUrl" /> <keyword name="UserInterface.isOnline" id="UserInterface.isOnline" ref="eric6.UI.UserInterface.html#UserInterface.isOnline" /> <keyword name="UserInterface.launchHelpViewer" id="UserInterface.launchHelpViewer" ref="eric6.UI.UserInterface.html#UserInterface.launchHelpViewer" /> + <keyword name="UserInterface.networkAccessManager" id="UserInterface.networkAccessManager" ref="eric6.UI.UserInterface.html#UserInterface.networkAccessManager" /> <keyword name="UserInterface.notificationsEnabled" id="UserInterface.notificationsEnabled" ref="eric6.UI.UserInterface.html#UserInterface.notificationsEnabled" /> <keyword name="UserInterface.performVersionCheck" id="UserInterface.performVersionCheck" ref="eric6.UI.UserInterface.html#UserInterface.performVersionCheck" /> <keyword name="UserInterface.processArgs" id="UserInterface.processArgs" ref="eric6.UI.UserInterface.html#UserInterface.processArgs" /> @@ -17438,45 +17472,60 @@ <keyword name="VariableDetailDialog (Module)" id="VariableDetailDialog (Module)" ref="eric6.Debugger.VariableDetailDialog.html" /> <keyword name="VariableItem" id="VariableItem" ref="eric6.Debugger.VariablesViewer.html#VariableItem" /> <keyword name="VariableItem (Constructor)" id="VariableItem (Constructor)" ref="eric6.Debugger.VariablesViewer.html#VariableItem.__init__" /> - <keyword name="VariableItem._buildKey" id="VariableItem._buildKey" ref="eric6.Debugger.VariablesViewer.html#VariableItem._buildKey" /> - <keyword name="VariableItem.attachDummy" id="VariableItem.attachDummy" ref="eric6.Debugger.VariablesViewer.html#VariableItem.attachDummy" /> - <keyword name="VariableItem.collapse" id="VariableItem.collapse" ref="eric6.Debugger.VariablesViewer.html#VariableItem.collapse" /> - <keyword name="VariableItem.data" id="VariableItem.data" ref="eric6.Debugger.VariablesViewer.html#VariableItem.data" /> - <keyword name="VariableItem.deleteChildren" id="VariableItem.deleteChildren" ref="eric6.Debugger.VariablesViewer.html#VariableItem.deleteChildren" /> - <keyword name="VariableItem.expand" id="VariableItem.expand" ref="eric6.Debugger.VariablesViewer.html#VariableItem.expand" /> - <keyword name="VariableItem.extractId" id="VariableItem.extractId" ref="eric6.Debugger.VariablesViewer.html#VariableItem.extractId" /> - <keyword name="VariableItem.extractIndicators" id="VariableItem.extractIndicators" ref="eric6.Debugger.VariablesViewer.html#VariableItem.extractIndicators" /> - <keyword name="VariableItem.getId" id="VariableItem.getId" ref="eric6.Debugger.VariablesViewer.html#VariableItem.getId" /> - <keyword name="VariableItem.getValue" id="VariableItem.getValue" ref="eric6.Debugger.VariablesViewer.html#VariableItem.getValue" /> + <keyword name="VariableItem.__getName" id="VariableItem.__getName" ref="eric6.Debugger.VariablesViewer.html#VariableItem.__getName" /> + <keyword name="VariableItem.__getType" id="VariableItem.__getType" ref="eric6.Debugger.VariablesViewer.html#VariableItem.__getType" /> + <keyword name="VariableItem.__getValue" id="VariableItem.__getValue" ref="eric6.Debugger.VariablesViewer.html#VariableItem.__getValue" /> + <keyword name="VariableItem.absolutCount" id="VariableItem.absolutCount" ref="eric6.Debugger.VariablesViewer.html#VariableItem.absolutCount" /> + <keyword name="VariableItem.populated" id="VariableItem.populated" ref="eric6.Debugger.VariablesViewer.html#VariableItem.populated" /> <keyword name="VariablesFilterDialog" id="VariablesFilterDialog" ref="eric6.Debugger.VariablesFilterDialog.html#VariablesFilterDialog" /> <keyword name="VariablesFilterDialog (Constructor)" id="VariablesFilterDialog (Constructor)" ref="eric6.Debugger.VariablesFilterDialog.html#VariablesFilterDialog.__init__" /> <keyword name="VariablesFilterDialog (Module)" id="VariablesFilterDialog (Module)" ref="eric6.Debugger.VariablesFilterDialog.html" /> <keyword name="VariablesFilterDialog.getSelection" id="VariablesFilterDialog.getSelection" ref="eric6.Debugger.VariablesFilterDialog.html#VariablesFilterDialog.getSelection" /> <keyword name="VariablesFilterDialog.on_buttonBox_clicked" id="VariablesFilterDialog.on_buttonBox_clicked" ref="eric6.Debugger.VariablesFilterDialog.html#VariablesFilterDialog.on_buttonBox_clicked" /> <keyword name="VariablesFilterDialog.setSelection" id="VariablesFilterDialog.setSelection" ref="eric6.Debugger.VariablesFilterDialog.html#VariablesFilterDialog.setSelection" /> + <keyword name="VariablesModel" id="VariablesModel" ref="eric6.Debugger.VariablesViewer.html#VariablesModel" /> + <keyword name="VariablesModel (Constructor)" id="VariablesModel (Constructor)" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.__init__" /> + <keyword name="VariablesModel.__buildTreePath" id="VariablesModel.__buildTreePath" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.__buildTreePath" /> + <keyword name="VariablesModel.__cleanupParentList" id="VariablesModel.__cleanupParentList" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.__cleanupParentList" /> + <keyword name="VariablesModel.__findPendingItem" id="VariablesModel.__findPendingItem" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.__findPendingItem" /> + <keyword name="VariablesModel.__findVariable" id="VariablesModel.__findVariable" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.__findVariable" /> + <keyword name="VariablesModel.clear" id="VariablesModel.clear" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.clear" /> + <keyword name="VariablesModel.columnCount" id="VariablesModel.columnCount" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.columnCount" /> + <keyword name="VariablesModel.data" id="VariablesModel.data" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.data" /> + <keyword name="VariablesModel.flags" id="VariablesModel.flags" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.flags" /> + <keyword name="VariablesModel.getMore" id="VariablesModel.getMore" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.getMore" /> + <keyword name="VariablesModel.handlePreferencesChanged" id="VariablesModel.handlePreferencesChanged" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.handlePreferencesChanged" /> + <keyword name="VariablesModel.hasChildren" id="VariablesModel.hasChildren" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.hasChildren" /> + <keyword name="VariablesModel.headerData" id="VariablesModel.headerData" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.headerData" /> + <keyword name="VariablesModel.index" id="VariablesModel.index" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.index" /> + <keyword name="VariablesModel.parent" id="VariablesModel.parent" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.parent" /> + <keyword name="VariablesModel.resetModifiedMarker" id="VariablesModel.resetModifiedMarker" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.resetModifiedMarker" /> + <keyword name="VariablesModel.rowCount" id="VariablesModel.rowCount" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.rowCount" /> + <keyword name="VariablesModel.setExpanded" id="VariablesModel.setExpanded" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.setExpanded" /> + <keyword name="VariablesModel.showVariables" id="VariablesModel.showVariables" ref="eric6.Debugger.VariablesViewer.html#VariablesModel.showVariables" /> + <keyword name="VariablesProxyModel" id="VariablesProxyModel" ref="eric6.Debugger.VariablesViewer.html#VariablesProxyModel" /> + <keyword name="VariablesProxyModel (Constructor)" id="VariablesProxyModel (Constructor)" ref="eric6.Debugger.VariablesViewer.html#VariablesProxyModel.__init__" /> + <keyword name="VariablesProxyModel.hasChildren" id="VariablesProxyModel.hasChildren" ref="eric6.Debugger.VariablesViewer.html#VariablesProxyModel.hasChildren" /> + <keyword name="VariablesProxyModel.setExpanded" id="VariablesProxyModel.setExpanded" ref="eric6.Debugger.VariablesViewer.html#VariablesProxyModel.setExpanded" /> <keyword name="VariablesViewer" id="VariablesViewer" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer" /> <keyword name="VariablesViewer (Constructor)" id="VariablesViewer (Constructor)" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__init__" /> <keyword name="VariablesViewer (Module)" id="VariablesViewer (Module)" ref="eric6.Debugger.VariablesViewer.html" /> - <keyword name="VariablesViewer.__addItem" id="VariablesViewer.__addItem" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__addItem" /> - <keyword name="VariablesViewer.__buildTreePath" id="VariablesViewer.__buildTreePath" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__buildTreePath" /> + <keyword name="VariablesViewer.__collapseChildren" id="VariablesViewer.__collapseChildren" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__collapseChildren" /> <keyword name="VariablesViewer.__configure" id="VariablesViewer.__configure" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__configure" /> + <keyword name="VariablesViewer.__configureFilter" id="VariablesViewer.__configureFilter" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__configureFilter" /> <keyword name="VariablesViewer.__createPopupMenus" id="VariablesViewer.__createPopupMenus" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__createPopupMenus" /> - <keyword name="VariablesViewer.__expandItemSignal" id="VariablesViewer.__expandItemSignal" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__expandItemSignal" /> - <keyword name="VariablesViewer.__findItem" id="VariablesViewer.__findItem" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__findItem" /> - <keyword name="VariablesViewer.__generateItem" id="VariablesViewer.__generateItem" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__generateItem" /> - <keyword name="VariablesViewer.__getDispType" id="VariablesViewer.__getDispType" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__getDispType" /> + <keyword name="VariablesViewer.__expandChildren" id="VariablesViewer.__expandChildren" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__expandChildren" /> + <keyword name="VariablesViewer.__itemDoubleClicked" id="VariablesViewer.__itemDoubleClicked" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__itemDoubleClicked" /> + <keyword name="VariablesViewer.__mdlRequestExpand" id="VariablesViewer.__mdlRequestExpand" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__mdlRequestExpand" /> <keyword name="VariablesViewer.__refreshView" id="VariablesViewer.__refreshView" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__refreshView" /> - <keyword name="VariablesViewer.__resort" id="VariablesViewer.__resort" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__resort" /> - <keyword name="VariablesViewer.__sectionClicked" id="VariablesViewer.__sectionClicked" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__sectionClicked" /> <keyword name="VariablesViewer.__showContextMenu" id="VariablesViewer.__showContextMenu" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__showContextMenu" /> <keyword name="VariablesViewer.__showDetails" id="VariablesViewer.__showDetails" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__showDetails" /> <keyword name="VariablesViewer.__showVariableDetails" id="VariablesViewer.__showVariableDetails" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.__showVariableDetails" /> - <keyword name="VariablesViewer.collapseItem" id="VariablesViewer.collapseItem" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.collapseItem" /> - <keyword name="VariablesViewer.expandItem" id="VariablesViewer.expandItem" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.expandItem" /> <keyword name="VariablesViewer.handleResetUI" id="VariablesViewer.handleResetUI" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.handleResetUI" /> - <keyword name="VariablesViewer.mouseDoubleClickEvent" id="VariablesViewer.mouseDoubleClickEvent" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.mouseDoubleClickEvent" /> + <keyword name="VariablesViewer.resizeEvent" id="VariablesViewer.resizeEvent" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.resizeEvent" /> <keyword name="VariablesViewer.showVariable" id="VariablesViewer.showVariable" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.showVariable" /> <keyword name="VariablesViewer.showVariables" id="VariablesViewer.showVariables" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.showVariables" /> + <keyword name="VariablesViewer.verticalScrollbarValueChanged" id="VariablesViewer.verticalScrollbarValueChanged" ref="eric6.Debugger.VariablesViewer.html#VariablesViewer.verticalScrollbarValueChanged" /> <keyword name="VcsCommandOptionsDialog" id="VcsCommandOptionsDialog" ref="eric6.VCS.CommandOptionsDialog.html#VcsCommandOptionsDialog" /> <keyword name="VcsCommandOptionsDialog (Constructor)" id="VcsCommandOptionsDialog (Constructor)" ref="eric6.VCS.CommandOptionsDialog.html#VcsCommandOptionsDialog.__init__" /> <keyword name="VcsCommandOptionsDialog.getOptions" id="VcsCommandOptionsDialog.getOptions" ref="eric6.VCS.CommandOptionsDialog.html#VcsCommandOptionsDialog.getOptions" /> @@ -17862,6 +17911,7 @@ <keyword name="ViewManager.initFileMenu" id="ViewManager.initFileMenu" ref="eric6.ViewManager.ViewManager.html#ViewManager.initFileMenu" /> <keyword name="ViewManager.initFileToolbar" id="ViewManager.initFileToolbar" ref="eric6.ViewManager.ViewManager.html#ViewManager.initFileToolbar" /> <keyword name="ViewManager.initMacroMenu" id="ViewManager.initMacroMenu" ref="eric6.ViewManager.ViewManager.html#ViewManager.initMacroMenu" /> + <keyword name="ViewManager.initSearchMenu" id="ViewManager.initSearchMenu" ref="eric6.ViewManager.ViewManager.html#ViewManager.initSearchMenu" /> <keyword name="ViewManager.initSearchToolbars" id="ViewManager.initSearchToolbars" ref="eric6.ViewManager.ViewManager.html#ViewManager.initSearchToolbars" /> <keyword name="ViewManager.initSpellingToolbar" id="ViewManager.initSpellingToolbar" ref="eric6.ViewManager.ViewManager.html#ViewManager.initSpellingToolbar" /> <keyword name="ViewManager.initViewMenu" id="ViewManager.initViewMenu" ref="eric6.ViewManager.ViewManager.html#ViewManager.initViewMenu" /> @@ -19050,6 +19100,7 @@ <keyword name="cleanupSource (Module)" id="cleanupSource (Module)" ref="cleanupSource.html" /> <keyword name="clearPrivateData" id="clearPrivateData" ref="eric6.Plugins.PluginVcsGit.html#clearPrivateData" /> <keyword name="clearPrivateData" id="clearPrivateData" ref="eric6.Plugins.PluginVcsMercurial.html#clearPrivateData" /> + <keyword name="closehead (Module)" id="closehead (Module)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead.html" /> <keyword name="codeStyleBatchCheck" id="codeStyleBatchCheck" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleChecker.html#codeStyleBatchCheck" /> <keyword name="codeStyleCheck" id="codeStyleCheck" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleChecker.html#codeStyleCheck" /> <keyword name="compactPath" id="compactPath" ref="eric6.Utilities.__init__.html#compactPath" /> @@ -20399,6 +20450,9 @@ <file>eric6.Plugins.VcsPlugins.vcsGit.ProjectBrowserHelper.html</file> <file>eric6.Plugins.VcsPlugins.vcsGit.ProjectHelper.html</file> <file>eric6.Plugins.VcsPlugins.vcsGit.git.html</file> + <file>eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.html</file> + <file>eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.html</file> + <file>eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead.html</file> <file>eric6.Plugins.VcsPlugins.vcsMercurial.Config.html</file> <file>eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.MercurialPage.html</file> <file>eric6.Plugins.VcsPlugins.vcsMercurial.FetchExtension.HgFetchDialog.html</file> @@ -21168,6 +21222,7 @@ <file>index-eric6.Plugins.VcsPlugins.html</file> <file>index-eric6.Plugins.VcsPlugins.vcsGit.ConfigurationPage.html</file> <file>index-eric6.Plugins.VcsPlugins.vcsGit.html</file> + <file>index-eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.html</file> <file>index-eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.html</file> <file>index-eric6.Plugins.VcsPlugins.vcsMercurial.FetchExtension.html</file> <file>index-eric6.Plugins.VcsPlugins.vcsMercurial.GpgExtension.html</file>
--- a/eric6/Documentation/Source/eric6.DebugClients.Python.DebugClientBase.html Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Documentation/Source/eric6.DebugClients.Python.DebugClientBase.html Sun Jun 02 11:42:48 2019 +0200 @@ -77,7 +77,7 @@ object <h3>Class Attributes</h3> <table> -<tr><td>Indicators</td></tr><tr><td>clientCapabilities</td></tr> +<tr><td>Indicators</td></tr><tr><td>arrayTypes</td></tr><tr><td>clientCapabilities</td></tr> </table> <h3>Class Methods</h3> <table> @@ -299,7 +299,7 @@ </dd> </dl><a NAME="DebugClientBase.__dumpVariable" ID="DebugClientBase.__dumpVariable"></a> <h4>DebugClientBase.__dumpVariable</h4> -<b>__dumpVariable</b>(<i>var, frmnr, scope, filterList, maxSize</i>) +<b>__dumpVariable</b>(<i>var, frmnr, scope, filterList</i>) <p> Private method to return the variables of a frame to the debug server. </p><dl> @@ -309,21 +309,16 @@ </dd><dt><i>frmnr</i> (int)</dt> <dd> distance of frame reported on. 0 is the current frame -</dd><dt><i>scope</i></dt> +</dd><dt><i>scope</i> (int)</dt> <dd> -1 to report global variables, 0 for local variables (int) +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 -</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, maxSize</i>) +<b>__dumpVariables</b>(<i>frmnr, scope, filterList</i>) <p> Private method to return the variables of a frame to the debug server. </p><dl> @@ -336,11 +331,6 @@ </dd><dt><i>filterList</i> (list of int)</dt> <dd> the indices of variable types to be filtered -</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> @@ -385,7 +375,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, maxSize=0</i>) +<b>__formatVariablesList</b>(<i>dict_, scope, filterList=None</i>) <p> Private method to produce a formated variables list. </p><p> @@ -395,10 +385,7 @@ expressions. The formated variables list (a list of tuples of 3 values) is returned. </p><dl> -<dt><i>keylist</i> (list of str)</dt> -<dd> -keys of the dictionary to be formatted -</dd><dt><i>dict_</i> (dict)</dt> +<dt><i>dict_</i> (dict)</dt> <dd> the dictionary to be scanned </dd><dt><i>scope</i> (int)</dt> @@ -412,16 +399,6 @@ 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> (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. -</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>
--- a/eric6/Documentation/Source/eric6.DebugClients.Python.DebugConfig.html Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Documentation/Source/eric6.DebugClients.Python.DebugConfig.html Sun Jun 02 11:42:48 2019 +0200 @@ -25,7 +25,7 @@ </p> <h3>Global Attributes</h3> <table> -<tr><td>ConfigVarTypeStrings</td></tr> +<tr><td>BatchSize</td></tr><tr><td>ConfigKnownQtTypes</td></tr><tr><td>ConfigQtNames</td></tr><tr><td>ConfigVarTypeStrings</td></tr> </table> <h3>Classes</h3> <table>
--- a/eric6/Documentation/Source/eric6.DebugClients.Python.DebugVariables.html Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Documentation/Source/eric6.DebugClients.Python.DebugVariables.html Sun Jun 02 11:42:48 2019 +0200 @@ -25,14 +25,11 @@ </p> <h3>Global Attributes</h3> <table> -<tr><td>MaxItemsToHandle</td></tr><tr><td>TooLargeAttribute</td></tr><tr><td>TooLargeMessage</td></tr><tr><td>_TypeMap</td></tr><tr><td>arrayResolver</td></tr><tr><td>defaultResolver</td></tr><tr><td>dictResolver</td></tr><tr><td>listResolver</td></tr><tr><td>multiValueDictResolver</td></tr><tr><td>ndarrayResolver</td></tr><tr><td>setResolver</td></tr> +<tr><td>_TypeMap</td></tr><tr><td>arrayResolver</td></tr><tr><td>defaultResolver</td></tr><tr><td>dictResolver</td></tr><tr><td>dictViewResolver</td></tr><tr><td>listResolver</td></tr><tr><td>multiValueDictResolver</td></tr><tr><td>ndarrayResolver</td></tr><tr><td>setResolver</td></tr> </table> <h3>Classes</h3> <table> <tr> -<td><a href="#ArrayItemsContainer">ArrayItemsContainer</a></td> -<td>Class to store array.array items.</td> -</tr><tr> <td><a href="#ArrayResolver">ArrayResolver</a></td> <td>Class used to resolve from array.array including some meta data.</td> </tr><tr> @@ -45,15 +42,15 @@ <td><a href="#DictResolver">DictResolver</a></td> <td>Class used to resolve from a dictionary.</td> </tr><tr> +<td><a href="#DictViewResolver">DictViewResolver</a></td> +<td>Class used to resolve from dict views.</td> +</tr><tr> <td><a href="#ListResolver">ListResolver</a></td> <td>Class used to resolve from a tuple or list.</td> </tr><tr> <td><a href="#MultiValueDictResolver">MultiValueDictResolver</a></td> <td>Class used to resolve from Django multi value dictionaries.</td> </tr><tr> -<td><a href="#NdArrayItemsContainer">NdArrayItemsContainer</a></td> -<td>Class to store ndarray items.</td> -</tr><tr> <td><a href="#NdArrayResolver">NdArrayResolver</a></td> <td>Class used to resolve from numpy ndarray including some meta data.</td> </tr><tr> @@ -72,32 +69,6 @@ </tr> </table> <hr /><hr /> -<a NAME="ArrayItemsContainer" ID="ArrayItemsContainer"></a> -<h2>ArrayItemsContainer</h2> -<p> - Class to store array.array items. -</p> -<h3>Derived from</h3> -None -<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>None</td></tr> -</table> -<h3>Static Methods</h3> -<table> -<tr><td>None</td></tr> -</table> - -<div align="right"><a href="#top">Up</a></div> -<hr /><hr /> <a NAME="ArrayResolver" ID="ArrayResolver"></a> <h2>ArrayResolver</h2> <p> @@ -222,12 +193,6 @@ <dd> dict </dd> -</dl><dl> -<dt>Raises <b>NotImplementedError</b>:</dt> -<dd> -raised to indicate a missing - implementation -</dd> </dl><a NAME="BaseResolver.resolve" ID="BaseResolver.resolve"></a> <h4>BaseResolver.resolve</h4> <b>resolve</b>(<i>var, attribute</i>) @@ -251,12 +216,6 @@ <dd> any </dd> -</dl><dl> -<dt>Raises <b>NotImplementedError</b>:</dt> -<dd> -raised to indicate a missing - implementation -</dd> </dl> <div align="right"><a href="#top">Up</a></div> <hr /><hr /> @@ -280,9 +239,6 @@ <tr> <td><a href="#DefaultResolver.getDictionary">getDictionary</a></td> <td>Public method to get the attributes of a variable as a dictionary.</td> -</tr><tr> -<td><a href="#DefaultResolver.resolve">resolve</a></td> -<td>Public method to get an attribute from a variable.</td> </tr> </table> <h3>Static Methods</h3> @@ -309,29 +265,6 @@ <dd> dict </dd> -</dl><a NAME="DefaultResolver.resolve" ID="DefaultResolver.resolve"></a> -<h4>DefaultResolver.resolve</h4> -<b>resolve</b>(<i>var, attribute</i>) -<p> - Public method to get an attribute from a variable. -</p><dl> -<dt><i>var</i> (any)</dt> -<dd> -variable to extract an attribute or value from -</dd><dt><i>attribute</i> (str)</dt> -<dd> -name of the attribute to extract -</dd> -</dl><dl> -<dt>Returns:</dt> -<dd> -value of the attribute -</dd> -</dl><dl> -<dt>Return Type:</dt> -<dd> -any -</dd> </dl> <div align="right"><a href="#top">Up</a></div> <hr /><hr /> @@ -433,6 +366,81 @@ </dl> <div align="right"><a href="#top">Up</a></div> <hr /><hr /> +<a NAME="DictViewResolver" ID="DictViewResolver"></a> +<h2>DictViewResolver</h2> +<p> + Class used to resolve from dict views. +</p> +<h3>Derived from</h3> +ListResolver +<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="#DictViewResolver.getDictionary">getDictionary</a></td> +<td>Public method to get the attributes of a variable as a dictionary.</td> +</tr><tr> +<td><a href="#DictViewResolver.resolve">resolve</a></td> +<td>Public method to get an attribute from a variable.</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="DictViewResolver.getDictionary" ID="DictViewResolver.getDictionary"></a> +<h4>DictViewResolver.getDictionary</h4> +<b>getDictionary</b>(<i>var</i>) +<p> + Public method to get the attributes of a variable as a dictionary. +</p><dl> +<dt><i>var</i> (any)</dt> +<dd> +variable to be converted +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +dictionary containing the variable attributes +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +dict +</dd> +</dl><a NAME="DictViewResolver.resolve" ID="DictViewResolver.resolve"></a> +<h4>DictViewResolver.resolve</h4> +<b>resolve</b>(<i>var, attribute</i>) +<p> + Public method to get an attribute from a variable. +</p><dl> +<dt><i>var</i> (tuple or list)</dt> +<dd> +variable to extract an attribute or value from +</dd><dt><i>attribute</i> (str)</dt> +<dd> +id of the value to extract +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +value of the attribute +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +any +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /><hr /> <a NAME="ListResolver" ID="ListResolver"></a> <h2>ListResolver</h2> <p> @@ -583,32 +591,6 @@ </dl> <div align="right"><a href="#top">Up</a></div> <hr /><hr /> -<a NAME="NdArrayItemsContainer" ID="NdArrayItemsContainer"></a> -<h2>NdArrayItemsContainer</h2> -<p> - Class to store ndarray items. -</p> -<h3>Derived from</h3> -None -<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>None</td></tr> -</table> -<h3>Static Methods</h3> -<table> -<tr><td>None</td></tr> -</table> - -<div align="right"><a href="#top">Up</a></div> -<hr /><hr /> <a NAME="NdArrayResolver" ID="NdArrayResolver"></a> <h2>NdArrayResolver</h2> <p> @@ -803,12 +785,12 @@ </dl><dl> <dt>Returns:</dt> <dd> -tuple containing the type, type name, type string and resolver +tuple containing the type name, type string and resolver </dd> </dl><dl> <dt>Return Type:</dt> <dd> -tuple of type, str, str, BaseResolver +tuple of str, str, BaseResolver </dd> </dl> <div align="right"><a href="#top">Up</a></div>
--- a/eric6/Documentation/Source/eric6.Debugger.DebugViewer.html Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Documentation/Source/eric6.Debugger.DebugViewer.html Sun Jun 02 11:42:48 2019 +0200 @@ -63,7 +63,10 @@ the exception logger. Additionally a list of all threads is shown. </p><h3>Signals</h3> <dl> -<dt>sourceFile(string, int)</dt> +<dt>preferencesChanged()</dt> +<dd> +emitted to react on changed preferences +</dd><dt>sourceFile(string, int)</dt> <dd> emitted to open a source file at a line </dd> @@ -108,6 +111,9 @@ <td><a href="#DebugViewer.handleDebuggingStarted">handleDebuggingStarted</a></td> <td>Public slot to handle the start of a debugging session.</td> </tr><tr> +<td><a href="#DebugViewer.handlePreferencesChanged">handlePreferencesChanged</a></td> +<td>Public slot to handle the preferencesChanged signal.</td> +</tr><tr> <td><a href="#DebugViewer.handleResetUI">handleResetUI</a></td> <td>Public method to reset the SBVviewer.</td> </tr><tr> @@ -117,9 +123,6 @@ <td><a href="#DebugViewer.isCallTraceEnabled">isCallTraceEnabled</a></td> <td>Public method to get the state of the call trace function.</td> </tr><tr> -<td><a href="#DebugViewer.preferencesChanged">preferencesChanged</a></td> -<td>Public slot to handle the preferencesChanged signal.</td> -</tr><tr> <td><a href="#DebugViewer.setCallTraceToProjectMode">setCallTraceToProjectMode</a></td> <td>Public slot to set the call trace viewer to project mode.</td> </tr><tr> @@ -242,6 +245,11 @@ Public slot to handle the start of a debugging session. </p><p> This slot sets the variables filter expressions. +</p><a NAME="DebugViewer.handlePreferencesChanged" ID="DebugViewer.handlePreferencesChanged"></a> +<h4>DebugViewer.handlePreferencesChanged</h4> +<b>handlePreferencesChanged</b>(<i></i>) +<p> + Public slot to handle the preferencesChanged signal. </p><a NAME="DebugViewer.handleResetUI" ID="DebugViewer.handleResetUI"></a> <h4>DebugViewer.handleResetUI</h4> <b>handleResetUI</b>(<i></i>) @@ -267,12 +275,7 @@ <dd> flag indicating the state of the call trace function (boolean) </dd> -</dl><a NAME="DebugViewer.preferencesChanged" ID="DebugViewer.preferencesChanged"></a> -<h4>DebugViewer.preferencesChanged</h4> -<b>preferencesChanged</b>(<i></i>) -<p> - Public slot to handle the preferencesChanged signal. -</p><a NAME="DebugViewer.setCallTraceToProjectMode" ID="DebugViewer.setCallTraceToProjectMode"></a> +</dl><a NAME="DebugViewer.setCallTraceToProjectMode" ID="DebugViewer.setCallTraceToProjectMode"></a> <h4>DebugViewer.setCallTraceToProjectMode</h4> <b>setCallTraceToProjectMode</b>(<i>enabled</i>) <p>
--- a/eric6/Documentation/Source/eric6.Debugger.VariablesViewer.html Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Documentation/Source/eric6.Debugger.VariablesViewer.html Sun Jun 02 11:42:48 2019 +0200 @@ -21,29 +21,26 @@ <body><a NAME="top" ID="top"></a> <h1>eric6.Debugger.VariablesViewer</h1> <p> -Module implementing the variables viewer widget. +Module implementing the variables viewer view based on QTreeView. </p> <h3>Global Attributes</h3> <table> -<tr><td>None</td></tr> +<tr><td>SORT_ROLE</td></tr> </table> <h3>Classes</h3> <table> <tr> -<td><a href="#ArrayElementVarItem">ArrayElementVarItem</a></td> -<td>Class implementing a VariableItem that represents an array element.</td> -</tr><tr> -<td><a href="#SpecialArrayElementVarItem">SpecialArrayElementVarItem</a></td> -<td>Class implementing a QTreeWidgetItem that represents a special array variable node.</td> +<td><a href="#VariableItem">VariableItem</a></td> +<td>Class implementing the data structure for all variable items.</td> </tr><tr> -<td><a href="#SpecialVarItem">SpecialVarItem</a></td> -<td>Class implementing a VariableItem that represents a special variable node.</td> +<td><a href="#VariablesModel">VariablesModel</a></td> +<td>Class implementing the data model for QTreeView.</td> </tr><tr> -<td><a href="#VariableItem">VariableItem</a></td> -<td>Class implementing the data structure for variable items.</td> +<td><a href="#VariablesProxyModel">VariablesProxyModel</a></td> +<td>Class for handling the sort operations.</td> </tr><tr> <td><a href="#VariablesViewer">VariablesViewer</a></td> -<td>Class implementing the variables viewer widget.</td> +<td>Class implementing the variables viewer view.</td> </tr> </table> <h3>Functions</h3> @@ -51,16 +48,16 @@ <tr><td>None</td></tr> </table> <hr /><hr /> -<a NAME="ArrayElementVarItem" ID="ArrayElementVarItem"></a> -<h2>ArrayElementVarItem</h2> +<a NAME="VariableItem" ID="VariableItem"></a> +<h2>VariableItem</h2> <p> - Class implementing a VariableItem that represents an array element. + Class implementing the data structure for all variable items. </p> <h3>Derived from</h3> -VariableItem +object <h3>Class Attributes</h3> <table> -<tr><td>None</td></tr> +<tr><td>Type2Indicators</td></tr><tr><td>arrayTypes</td></tr><tr><td>noOfItemsStr</td></tr><tr><td>nonExpandableTypes</td></tr><tr><td>rx_nonprintable</td></tr> </table> <h3>Class Methods</h3> <table> @@ -69,102 +66,132 @@ <h3>Methods</h3> <table> <tr> -<td><a href="#ArrayElementVarItem.__init__">ArrayElementVarItem</a></td> +<td><a href="#VariableItem.__init__">VariableItem</a></td> <td>Constructor</td> +</tr><tr> +<td><a href="#VariableItem.__getName">__getName</a></td> +<td>Private method to extract the variable name.</td> +</tr><tr> +<td><a href="#VariableItem.__getType">__getType</a></td> +<td>Private method to process the type of the variable.</td> +</tr><tr> +<td><a href="#VariableItem.__getValue">__getValue</a></td> +<td>Private method to process the variables value.</td> +</tr><tr> +<td><a href="#VariableItem.absolutCount">absolutCount</a></td> +<td>Public property to get the total number of children.</td> +</tr><tr> +<td><a href="#VariableItem.populated">populated</a></td> +<td>Public property returning a flag indicating if item is fully populated.</td> </tr> </table> <h3>Static Methods</h3> <table> <tr><td>None</td></tr> </table> -<a NAME="ArrayElementVarItem.__init__" ID="ArrayElementVarItem.__init__"></a> -<h4>ArrayElementVarItem (Constructor)</h4> -<b>ArrayElementVarItem</b>(<i>parent, dvar, dvalue, dtype</i>) +<a NAME="VariableItem.__init__" ID="VariableItem.__init__"></a> +<h4>VariableItem (Constructor)</h4> +<b>VariableItem</b>(<i>parent, dvar, dtype, dvalue</i>) <p> Constructor </p><dl> -<dt><i>parent</i></dt> +<dt><i>parent</i> (VariableItem)</dt> +<dd> +reference to the parent item +</dd><dt><i>dvar</i> (str)</dt> +<dd> +variable name +</dd><dt><i>dtype</i> (str)</dt> +<dd> +type string +</dd><dt><i>dvalue</i> (str)</dt> <dd> -parent of this item -</dd><dt><i>dvar</i></dt> +value string +</dd> +</dl><a NAME="VariableItem.__getName" ID="VariableItem.__getName"></a> +<h4>VariableItem.__getName</h4> +<b>__getName</b>(<i>dvar</i>) +<p> + Private method to extract the variable name. +</p><dl> +<dt><i>dvar</i> (str)</dt> +<dd> +name of variable maybe with ID +</dd> +</dl><a NAME="VariableItem.__getType" ID="VariableItem.__getType"></a> +<h4>VariableItem.__getType</h4> +<b>__getType</b>(<i>dtype</i>) +<p> + Private method to process the type of the variable. +</p><p> + If type is known to have children, the corresponding flag is set. +</p><dl> +<dt><i>dtype</i> (str)</dt> <dd> -variable name (string) -</dd><dt><i>dvalue</i></dt> +type string +</dd> +</dl><a NAME="VariableItem.__getValue" ID="VariableItem.__getValue"></a> +<h4>VariableItem.__getValue</h4> +<b>__getValue</b>(<i>dtype, dvalue</i>) +<p> + Private method to process the variables value. +</p><p> + Define and limit value, set tooltip text. If type is known to have + children, the corresponding flag is set. +</p><dl> +<dt><i>dtype</i> (str)</dt> +<dd> +type string +</dd><dt><i>dvalue</i> (str)</dt> <dd> -value string (string) -</dd><dt><i>dtype</i></dt> +value of variable encoded as utf-8 +</dd> +</dl><a NAME="VariableItem.absolutCount" ID="VariableItem.absolutCount"></a> +<h4>VariableItem.absolutCount</h4> +<b>absolutCount</b>(<i></i>) +<p> + Public property to get the total number of children. +</p><dl> +<dt>Returns:</dt> +<dd> +total number of children +</dd> +</dl><dl> +<dt>Return Type:</dt> <dd> -type string (string) +int +</dd> +</dl><a NAME="VariableItem.populated" ID="VariableItem.populated"></a> +<h4>VariableItem.populated</h4> +<b>populated</b>(<i></i>) +<p> + Public property returning a flag indicating if item is fully populated. +</p><dl> +<dt>Returns:</dt> +<dd> +item is fully populated +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +bool </dd> </dl> <div align="right"><a href="#top">Up</a></div> <hr /><hr /> -<a NAME="SpecialArrayElementVarItem" ID="SpecialArrayElementVarItem"></a> -<h2>SpecialArrayElementVarItem</h2> +<a NAME="VariablesModel" ID="VariablesModel"></a> +<h2>VariablesModel</h2> <p> - Class implementing a QTreeWidgetItem that represents a special array - variable node. -</p> -<h3>Derived from</h3> -SpecialVarItem -<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="#SpecialArrayElementVarItem.__init__">SpecialArrayElementVarItem</a></td> -<td>Constructor</td> -</tr> -</table> -<h3>Static Methods</h3> -<table> -<tr><td>None</td></tr> -</table> -<a NAME="SpecialArrayElementVarItem.__init__" ID="SpecialArrayElementVarItem.__init__"></a> -<h4>SpecialArrayElementVarItem (Constructor)</h4> -<b>SpecialArrayElementVarItem</b>(<i>parent, dvar, dvalue, dtype, frmnr, globalScope</i>) -<p> - Constructor -</p><dl> -<dt><i>parent</i></dt> + Class implementing the data model for QTreeView. +</p><h3>Signals</h3> +<dl> +<dt>expand</dt> <dd> -parent of this item -</dd><dt><i>dvar</i></dt> -<dd> -variable name (string) -</dd><dt><i>dvalue</i></dt> -<dd> -value string (string) -</dd><dt><i>dtype</i></dt> -<dd> -type string (string) -</dd><dt><i>frmnr</i></dt> -<dd> -frame number (0 is the current frame) (int) -</dd><dt><i>globalScope</i></dt> -<dd> -flag indicating global (True) or local (False) - variables +trigger QTreeView to expand given index </dd> </dl> -<div align="right"><a href="#top">Up</a></div> -<hr /><hr /> -<a NAME="SpecialVarItem" ID="SpecialVarItem"></a> -<h2>SpecialVarItem</h2> -<p> - Class implementing a VariableItem that represents a special variable node. -</p><p> - These special variable nodes are generated for classes, lists, - tuples and dictionaries. -</p> <h3>Derived from</h3> -VariableItem +QAbstractItemModel <h3>Class Attributes</h3> <table> <tr><td>None</td></tr> @@ -176,251 +203,485 @@ <h3>Methods</h3> <table> <tr> -<td><a href="#SpecialVarItem.__init__">SpecialVarItem</a></td> +<td><a href="#VariablesModel.__init__">VariablesModel</a></td> <td>Constructor</td> </tr><tr> -<td><a href="#SpecialVarItem.expand">expand</a></td> -<td>Public method to expand the item.</td> -</tr> -</table> -<h3>Static Methods</h3> -<table> -<tr><td>None</td></tr> -</table> -<a NAME="SpecialVarItem.__init__" ID="SpecialVarItem.__init__"></a> -<h4>SpecialVarItem (Constructor)</h4> -<b>SpecialVarItem</b>(<i>parent, dvar, dvalue, dtype, frmnr, globalScope</i>) -<p> - Constructor -</p><dl> -<dt><i>parent</i></dt> -<dd> -parent of this item -</dd><dt><i>dvar</i></dt> -<dd> -variable name (string) -</dd><dt><i>dvalue</i></dt> -<dd> -value string (string) -</dd><dt><i>dtype</i></dt> -<dd> -type string (string) -</dd><dt><i>frmnr</i></dt> -<dd> -frame number (0 is the current frame) (int) -</dd><dt><i>globalScope</i></dt> -<dd> -flag indicating global (True) or local (False) - variables -</dd> -</dl><a NAME="SpecialVarItem.expand" ID="SpecialVarItem.expand"></a> -<h4>SpecialVarItem.expand</h4> -<b>expand</b>(<i></i>) -<p> - Public method to expand the item. -</p> -<div align="right"><a href="#top">Up</a></div> -<hr /><hr /> -<a NAME="VariableItem" ID="VariableItem"></a> -<h2>VariableItem</h2> -<p> - Class implementing the data structure for variable items. -</p> -<h3>Derived from</h3> -QTreeWidgetItem -<h3>Class Attributes</h3> -<table> -<tr><td>Indicators</td></tr><tr><td>Type2Indicators</td></tr> -</table> -<h3>Class Methods</h3> -<table> -<tr> -<td><a href="#VariableItem.extractId">extractId</a></td> -<td>Class method to extract the ID string from a variable text.</td> +<td><a href="#VariablesModel.__buildTreePath">__buildTreePath</a></td> +<td>Private method to build up a path from the root to parent.</td> +</tr><tr> +<td><a href="#VariablesModel.__cleanupParentList">__cleanupParentList</a></td> +<td>Private method to remove items which are left over at the end of the child list.</td> +</tr><tr> +<td><a href="#VariablesModel.__findPendingItem">__findPendingItem</a></td> +<td>Private method to find the next item to request data from debugger.</td> +</tr><tr> +<td><a href="#VariablesModel.__findVariable">__findVariable</a></td> +<td>Private method to get to the given variable.</td> +</tr><tr> +<td><a href="#VariablesModel.clear">clear</a></td> +<td>Public method to clear the complete data model.</td> +</tr><tr> +<td><a href="#VariablesModel.columnCount">columnCount</a></td> +<td>Public method to get the column count.</td> +</tr><tr> +<td><a href="#VariablesModel.data">data</a></td> +<td>Public method get the role data of item.</td> +</tr><tr> +<td><a href="#VariablesModel.flags">flags</a></td> +<td>Public method to get the item flags.</td> +</tr><tr> +<td><a href="#VariablesModel.getMore">getMore</a></td> +<td>Public method to fetch the next variable from debugger.</td> </tr><tr> -<td><a href="#VariableItem.extractIndicators">extractIndicators</a></td> -<td>Class method to extract the indicator string from a variable text.</td> -</tr> -</table> -<h3>Methods</h3> -<table> -<tr> -<td><a href="#VariableItem.__init__">VariableItem</a></td> -<td>Constructor</td> +<td><a href="#VariablesModel.handlePreferencesChanged">handlePreferencesChanged</a></td> +<td>Public slot to handle the preferencesChanged signal.</td> +</tr><tr> +<td><a href="#VariablesModel.hasChildren">hasChildren</a></td> +<td>Public method to get a flag if parent has children.</td> </tr><tr> -<td><a href="#VariableItem._buildKey">_buildKey</a></td> -<td>Protected method to build the access key for the variable.</td> +<td><a href="#VariablesModel.headerData">headerData</a></td> +<td>Public method get the header names.</td> </tr><tr> -<td><a href="#VariableItem.attachDummy">attachDummy</a></td> -<td>Public method to attach a dummy sub item to allow for lazy population.</td> +<td><a href="#VariablesModel.index">index</a></td> +<td>Public method to get the index of item at row:column of parent.</td> </tr><tr> -<td><a href="#VariableItem.collapse">collapse</a></td> -<td>Public method to collapse the item.</td> +<td><a href="#VariablesModel.parent">parent</a></td> +<td>Public method to get the parent of the given child.</td> </tr><tr> -<td><a href="#VariableItem.data">data</a></td> -<td>Public method to return the data for the requested role.</td> -</tr><tr> -<td><a href="#VariableItem.deleteChildren">deleteChildren</a></td> -<td>Public method to delete all children (cleaning the subtree).</td> +<td><a href="#VariablesModel.resetModifiedMarker">resetModifiedMarker</a></td> +<td>Public method to remove the modified marker from changed items.</td> </tr><tr> -<td><a href="#VariableItem.expand">expand</a></td> -<td>Public method to expand the item.</td> +<td><a href="#VariablesModel.rowCount">rowCount</a></td> +<td>Public method to get the row count.</td> </tr><tr> -<td><a href="#VariableItem.getId">getId</a></td> -<td>Public method to get the ID string.</td> +<td><a href="#VariablesModel.setExpanded">setExpanded</a></td> +<td>Public method to set the expanded state of item.</td> </tr><tr> -<td><a href="#VariableItem.getValue">getValue</a></td> -<td>Public method to return the value of the item.</td> +<td><a href="#VariablesModel.showVariables">showVariables</a></td> +<td>Public method to update the data model of variable in pathlist.</td> </tr> </table> <h3>Static Methods</h3> <table> <tr><td>None</td></tr> </table> -<a NAME="VariableItem.extractId" ID="VariableItem.extractId"></a> -<h4>VariableItem.extractId (class method)</h4> -<b>extractId</b>(<i>var</i>) +<a NAME="VariablesModel.__init__" ID="VariablesModel.__init__"></a> +<h4>VariablesModel (Constructor)</h4> +<b>VariablesModel</b>(<i>treeView, globalScope</i>) <p> - Class method to extract the ID string from a variable text. + Constructor </p><dl> -<dt><i>var</i> (str)</dt> +<dt><i>treeView</i> (VariablesViewer)</dt> +<dd> +QTreeView showing the data +</dd><dt><i>globalScope</i> (bool)</dt> <dd> -variable text +flag indicating global (True) or local (False) + variables +</dd> +</dl><a NAME="VariablesModel.__buildTreePath" ID="VariablesModel.__buildTreePath"></a> +<h4>VariablesModel.__buildTreePath</h4> +<b>__buildTreePath</b>(<i>parent</i>) +<p> + Private method to build up a path from the root to parent. +</p><dl> +<dt><i>parent</i> (VariableItem)</dt> +<dd> +item to build the path for </dd> </dl><dl> <dt>Returns:</dt> <dd> -tuple containing the variable text without ID and the ID string +list of names denoting the path from the root +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +tuple of str +</dd> +</dl><a NAME="VariablesModel.__cleanupParentList" ID="VariablesModel.__cleanupParentList"></a> +<h4>VariablesModel.__cleanupParentList</h4> +<b>__cleanupParentList</b>(<i>parent, parentIdx</i>) +<p> + Private method to remove items which are left over at the end of the + child list. +</p><dl> +<dt><i>parent</i> (VariableItem)</dt> +<dd> +to clean up +</dd><dt><i>parentIdx</i> (QModelIndex)</dt> +<dd> +the parent index as QModelIndex +</dd> +</dl><a NAME="VariablesModel.__findPendingItem" ID="VariablesModel.__findPendingItem"></a> +<h4>VariablesModel.__findPendingItem</h4> +<b>__findPendingItem</b>(<i>parent=None, pathlist=()</i>) +<p> + Private method to find the next item to request data from debugger. +</p><dl> +<dt><i>parent</i> (VariableItem)</dt> +<dd> +the model parent +</dd><dt><i>pathlist</i> (list of str)</dt> +<dd> +full path to the variable +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +next item index to request data from debugger +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +QModelIndex +</dd> +</dl><a NAME="VariablesModel.__findVariable" ID="VariablesModel.__findVariable"></a> +<h4>VariablesModel.__findVariable</h4> +<b>__findVariable</b>(<i>pathlist</i>) +<p> + Private method to get to the given variable. +</p><dl> +<dt><i>pathlist</i> (list of str)</dt> +<dd> +full path to the variable +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +the found variable or None if it doesn't exist </dd> </dl><dl> <dt>Return Type:</dt> <dd> -tuple of two str +VariableItem or None </dd> -</dl><a NAME="VariableItem.extractIndicators" ID="VariableItem.extractIndicators"></a> -<h4>VariableItem.extractIndicators (class method)</h4> -<b>extractIndicators</b>(<i>var</i>) +</dl><a NAME="VariablesModel.clear" ID="VariablesModel.clear"></a> +<h4>VariablesModel.clear</h4> +<b>clear</b>(<i>reset=False</i>) +<p> + Public method to clear the complete data model. +</p><dl> +<dt><i>reset</i> (bool)</dt> +<dd> +flag to clear the expanded keys also +</dd> +</dl><a NAME="VariablesModel.columnCount" ID="VariablesModel.columnCount"></a> +<h4>VariablesModel.columnCount</h4> +<b>columnCount</b>(<i>parent=QModelIndex()</i>) <p> - Class method to extract the indicator string from a variable text. + Public method to get the column count. </p><dl> -<dt><i>var</i> (str)</dt> +<dt><i>parent</i> (QModelIndex)</dt> +<dd> +the model parent +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +number of columns +</dd> +</dl><dl> +<dt>Return Type:</dt> <dd> -variable text +int +</dd> +</dl><a NAME="VariablesModel.data" ID="VariablesModel.data"></a> +<h4>VariablesModel.data</h4> +<b>data</b>(<i>index, role=Qt.DisplayRole</i>) +<p> + Public method get the role data of item. +</p><dl> +<dt><i>index</i> (QModelIndex)</dt> +<dd> +the model index +</dd><dt><i>role</i> (QtCore.Qt.ItemDataRole)</dt> +<dd> +the requested data role </dd> </dl><dl> <dt>Returns:</dt> <dd> -tuple containing the variable text without indicators and the - indicator string +role data of item +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +Any +</dd> +</dl><a NAME="VariablesModel.flags" ID="VariablesModel.flags"></a> +<h4>VariablesModel.flags</h4> +<b>flags</b>(<i>index</i>) +<p> + Public method to get the item flags. +</p><dl> +<dt><i>index</i> (QModelIndex)</dt> +<dd> +of item +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +item flags +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +QtCore.Qt.ItemFlag +</dd> +</dl><a NAME="VariablesModel.getMore" ID="VariablesModel.getMore"></a> +<h4>VariablesModel.getMore</h4> +<b>getMore</b>(<i></i>) +<p> + Public method to fetch the next variable from debugger. +</p><a NAME="VariablesModel.handlePreferencesChanged" ID="VariablesModel.handlePreferencesChanged"></a> +<h4>VariablesModel.handlePreferencesChanged</h4> +<b>handlePreferencesChanged</b>(<i></i>) +<p> + Public slot to handle the preferencesChanged signal. +</p><a NAME="VariablesModel.hasChildren" ID="VariablesModel.hasChildren"></a> +<h4>VariablesModel.hasChildren</h4> +<b>hasChildren</b>(<i>parent=QModelIndex()</i>) +<p> + Public method to get a flag if parent has children. +</p><dl> +<dt><i>parent</i> (QModelIndex)</dt> +<dd> +the model parent +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +flag indicating parent has children </dd> </dl><dl> <dt>Return Type:</dt> <dd> -tuple of two str +bool </dd> -</dl><a NAME="VariableItem.__init__" ID="VariableItem.__init__"></a> -<h4>VariableItem (Constructor)</h4> -<b>VariableItem</b>(<i>parent, dvar, dvalue, dtype</i>) +</dl><a NAME="VariablesModel.headerData" ID="VariablesModel.headerData"></a> +<h4>VariablesModel.headerData</h4> +<b>headerData</b>(<i>section, orientation, role=Qt.DisplayRole</i>) <p> - Constructor + Public method get the header names. </p><dl> -<dt><i>parent</i></dt> +<dt><i>section</i> (int)</dt> +<dd> +the header section (row/coulumn) +</dd><dt><i>orientation</i> (QtCore.Qt.Orientation)</dt> <dd> -reference to the parent item -</dd><dt><i>dvar</i></dt> +the header's orientation +</dd><dt><i>role</i> (QtCore.Qt.ItemDataRole)</dt> +<dd> +the requested data role +</dd> +</dl><dl> +<dt>Returns:</dt> <dd> -variable name (string) -</dd><dt><i>dvalue</i></dt> -<dd> -value string (string) -</dd><dt><i>dtype</i></dt> +header name +</dd> +</dl><dl> +<dt>Return Type:</dt> <dd> -type string (string) +str or None </dd> -</dl><a NAME="VariableItem._buildKey" ID="VariableItem._buildKey"></a> -<h4>VariableItem._buildKey</h4> -<b>_buildKey</b>(<i></i>) +</dl><a NAME="VariablesModel.index" ID="VariablesModel.index"></a> +<h4>VariablesModel.index</h4> +<b>index</b>(<i>row, column, parent=QModelIndex()</i>) <p> - Protected method to build the access key for the variable. + Public method to get the index of item at row:column of parent. </p><dl> +<dt><i>row</i> (int)</dt> +<dd> +number of rows +</dd><dt><i>column</i> (int)</dt> +<dd> +number of columns +</dd><dt><i>parent</i> (QModelIndex)</dt> +<dd> +the model parent +</dd> +</dl><dl> <dt>Returns:</dt> <dd> -access key +new model index for child +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +QModelIndex +</dd> +</dl><a NAME="VariablesModel.parent" ID="VariablesModel.parent"></a> +<h4>VariablesModel.parent</h4> +<b>parent</b>(<i>child</i>) +<p> + Public method to get the parent of the given child. +</p><dl> +<dt><i>child</i> (QModelIndex)</dt> +<dd> +the model child node +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +new model index for parent +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +QModelIndex +</dd> +</dl><a NAME="VariablesModel.resetModifiedMarker" ID="VariablesModel.resetModifiedMarker"></a> +<h4>VariablesModel.resetModifiedMarker</h4> +<b>resetModifiedMarker</b>(<i>parentIdx=QModelIndex(), pathlist=()</i>) +<p> + Public method to remove the modified marker from changed items. +</p><dl> +<dt><i>parentIdx</i> (QModelIndex)</dt> +<dd> +item to reset marker +</dd><dt><i>pathlist</i> (list of str)</dt> +<dd> +full path to the variable +</dd> +</dl><a NAME="VariablesModel.rowCount" ID="VariablesModel.rowCount"></a> +<h4>VariablesModel.rowCount</h4> +<b>rowCount</b>(<i>parent=QModelIndex()</i>) +<p> + Public method to get the row count. +</p><dl> +<dt><i>parent</i> (QModelIndex)</dt> +<dd> +the model parent +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +number of rows </dd> </dl><dl> <dt>Return Type:</dt> <dd> -str +int +</dd> +</dl><a NAME="VariablesModel.setExpanded" ID="VariablesModel.setExpanded"></a> +<h4>VariablesModel.setExpanded</h4> +<b>setExpanded</b>(<i>index, state</i>) +<p> + Public method to set the expanded state of item. +</p><dl> +<dt><i>index</i> (QModelIndex)</dt> +<dd> +item to change expanded state +</dd><dt><i>state</i> (bool)</dt> +<dd> +state of the item </dd> -</dl><a NAME="VariableItem.attachDummy" ID="VariableItem.attachDummy"></a> -<h4>VariableItem.attachDummy</h4> -<b>attachDummy</b>(<i></i>) +</dl><a NAME="VariablesModel.showVariables" ID="VariablesModel.showVariables"></a> +<h4>VariablesModel.showVariables</h4> +<b>showVariables</b>(<i>vlist, frmnr, pathlist=None</i>) +<p> + Public method to update the data model of variable in pathlist. +</p><dl> +<dt><i>vlist</i> (list of str)</dt> +<dd> +the list of variables to be displayed. Each + list entry is a tuple of three values. + <ul> + <li>the variable name (string)</li> + <li>the variables type (string)</li> + <li>the variables value (string)</li> + </ul> +</dd><dt><i>frmnr</i> (int)</dt> +<dd> +frame number (0 is the current frame) +</dd><dt><i>pathlist</i> (list of str)</dt> +<dd> +full path to the variable +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /><hr /> +<a NAME="VariablesProxyModel" ID="VariablesProxyModel"></a> +<h2>VariablesProxyModel</h2> <p> - Public method to attach a dummy sub item to allow for lazy population. -</p><a NAME="VariableItem.collapse" ID="VariableItem.collapse"></a> -<h4>VariableItem.collapse</h4> -<b>collapse</b>(<i></i>) + Class for handling the sort operations. +</p> +<h3>Derived from</h3> +QSortFilterProxyModel +<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="#VariablesProxyModel.__init__">VariablesProxyModel</a></td> +<td>Constructor</td> +</tr><tr> +<td><a href="#VariablesProxyModel.hasChildren">hasChildren</a></td> +<td>Public method to get a flag if parent has children.</td> +</tr><tr> +<td><a href="#VariablesProxyModel.setExpanded">setExpanded</a></td> +<td>Public slot to get a flag if parent has children.</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="VariablesProxyModel.__init__" ID="VariablesProxyModel.__init__"></a> +<h4>VariablesProxyModel (Constructor)</h4> +<b>VariablesProxyModel</b>(<i>parent=None</i>) <p> - Public method to collapse the item. + Constructor +</p><dl> +<dt><i>parent</i> (QModelIndex)</dt> +<dd> +the parent model index +</dd> +</dl><a NAME="VariablesProxyModel.hasChildren" ID="VariablesProxyModel.hasChildren"></a> +<h4>VariablesProxyModel.hasChildren</h4> +<b>hasChildren</b>(<i>parent</i>) +<p> + Public method to get a flag if parent has children. </p><p> - Note: This is just a do nothing and should be overwritten. -</p><a NAME="VariableItem.data" ID="VariableItem.data"></a> -<h4>VariableItem.data</h4> -<b>data</b>(<i>column, role</i>) -<p> - Public method to return the data for the requested role. -</p><p> - This implementation changes the original behavior in a way, that the - display data is returned as the tooltip for column 1. + The given model index has to be transformed to the underlying source + model to get the correct result. </p><dl> -<dt><i>column</i></dt> +<dt><i>parent</i> (QModelIndex)</dt> <dd> -column number (integer) -</dd><dt><i>role</i></dt> -<dd> -data role (Qt.ItemDataRole) +the model parent </dd> </dl><dl> <dt>Returns:</dt> <dd> -requested data -</dd> -</dl><a NAME="VariableItem.deleteChildren" ID="VariableItem.deleteChildren"></a> -<h4>VariableItem.deleteChildren</h4> -<b>deleteChildren</b>(<i></i>) -<p> - Public method to delete all children (cleaning the subtree). -</p><a NAME="VariableItem.expand" ID="VariableItem.expand"></a> -<h4>VariableItem.expand</h4> -<b>expand</b>(<i></i>) -<p> - Public method to expand the item. -</p><p> - Note: This is just a do nothing and should be overwritten. -</p><a NAME="VariableItem.getId" ID="VariableItem.getId"></a> -<h4>VariableItem.getId</h4> -<b>getId</b>(<i></i>) -<p> - Public method to get the ID string. -</p><dl> -<dt>Returns:</dt> -<dd> -ID string +flag if parent has children </dd> </dl><dl> <dt>Return Type:</dt> <dd> -str +bool </dd> -</dl><a NAME="VariableItem.getValue" ID="VariableItem.getValue"></a> -<h4>VariableItem.getValue</h4> -<b>getValue</b>(<i></i>) +</dl><a NAME="VariablesProxyModel.setExpanded" ID="VariablesProxyModel.setExpanded"></a> +<h4>VariablesProxyModel.setExpanded</h4> +<b>setExpanded</b>(<i>index, state</i>) <p> - Public method to return the value of the item. + Public slot to get a flag if parent has children. +</p><p> + The given model index has to be transformed to the underlying source + model to get the correct result. </p><dl> -<dt>Returns:</dt> +<dt><i>index</i> (QModelIndex)</dt> <dd> -value of the item (string) +item to change expanded state +</dd><dt><i>state</i> (bool)</dt> +<dd> +state of the item </dd> </dl> <div align="right"><a href="#top">Up</a></div> @@ -428,20 +689,28 @@ <a NAME="VariablesViewer" ID="VariablesViewer"></a> <h2>VariablesViewer</h2> <p> - Class implementing the variables viewer widget. + Class implementing the variables viewer view. </p><p> - This widget is used to display the variables of the program being + This view is used to display the variables of the program being debugged in a tree. Compound types will be shown with their main entry first. Once the subtree has been expanded, the individual entries will be shown. Double clicking an entry will + expand or collapse the item, if it has children and the double click + was performed on the first column of the tree, otherwise it'll popup a dialog showing the variables parameters in a more readable form. This is especially useful for lengthy strings. </p><p> - This widget has two modes for displaying the global and the local + This view has two modes for displaying the global and the local variables. -</p> +</p><h3>Signals</h3> +<dl> +<dt>preferencesChanged()</dt> +<dd> +to inform model about new background colours +</dd> +</dl> <h3>Derived from</h3> -QTreeWidget +QTreeView <h3>Class Attributes</h3> <table> <tr><td>None</td></tr> @@ -456,39 +725,30 @@ <td><a href="#VariablesViewer.__init__">VariablesViewer</a></td> <td>Constructor</td> </tr><tr> -<td><a href="#VariablesViewer.__addItem">__addItem</a></td> -<td>Private method used to add an item to the list.</td> -</tr><tr> -<td><a href="#VariablesViewer.__buildTreePath">__buildTreePath</a></td> -<td>Private method to build up a path from the top to an item.</td> +<td><a href="#VariablesViewer.__collapseChildren">__collapseChildren</a></td> +<td>Private slot to collapse all child items of current parent.</td> </tr><tr> <td><a href="#VariablesViewer.__configure">__configure</a></td> <td>Private method to open the configuration dialog.</td> </tr><tr> +<td><a href="#VariablesViewer.__configureFilter">__configureFilter</a></td> +<td>Private method to open the variables filter dialog.</td> +</tr><tr> <td><a href="#VariablesViewer.__createPopupMenus">__createPopupMenus</a></td> <td>Private method to generate the popup menus.</td> </tr><tr> -<td><a href="#VariablesViewer.__expandItemSignal">__expandItemSignal</a></td> -<td>Private slot to handle the expanded signal.</td> -</tr><tr> -<td><a href="#VariablesViewer.__findItem">__findItem</a></td> -<td>Private method to search for an item.</td> +<td><a href="#VariablesViewer.__expandChildren">__expandChildren</a></td> +<td>Private slot to expand all child items of current parent.</td> </tr><tr> -<td><a href="#VariablesViewer.__generateItem">__generateItem</a></td> -<td>Private method used to generate a VariableItem.</td> +<td><a href="#VariablesViewer.__itemDoubleClicked">__itemDoubleClicked</a></td> +<td>Private method called if an item was double clicked.</td> </tr><tr> -<td><a href="#VariablesViewer.__getDispType">__getDispType</a></td> -<td>Private method used to get the display string for type vtype.</td> +<td><a href="#VariablesViewer.__mdlRequestExpand">__mdlRequestExpand</a></td> +<td>Private method to inform the view about items to be expand.</td> </tr><tr> <td><a href="#VariablesViewer.__refreshView">__refreshView</a></td> <td>Private slot to refresh the view.</td> </tr><tr> -<td><a href="#VariablesViewer.__resort">__resort</a></td> -<td>Private method to resort the tree.</td> -</tr><tr> -<td><a href="#VariablesViewer.__sectionClicked">__sectionClicked</a></td> -<td>Private method handling a click onto a header section.</td> -</tr><tr> <td><a href="#VariablesViewer.__showContextMenu">__showContextMenu</a></td> <td>Private slot to show the context menu.</td> </tr><tr> @@ -498,23 +758,20 @@ <td><a href="#VariablesViewer.__showVariableDetails">__showVariableDetails</a></td> <td>Private method to show details about a variable.</td> </tr><tr> -<td><a href="#VariablesViewer.collapseItem">collapseItem</a></td> -<td>Public slot to handle the collapsed signal.</td> -</tr><tr> -<td><a href="#VariablesViewer.expandItem">expandItem</a></td> -<td>Public slot to handle the expanded signal.</td> -</tr><tr> <td><a href="#VariablesViewer.handleResetUI">handleResetUI</a></td> <td>Public method to reset the VariablesViewer.</td> </tr><tr> -<td><a href="#VariablesViewer.mouseDoubleClickEvent">mouseDoubleClickEvent</a></td> -<td>Protected method of QAbstractItemView.</td> +<td><a href="#VariablesViewer.resizeEvent">resizeEvent</a></td> +<td>Protected slot informing about the widget size change.</td> </tr><tr> <td><a href="#VariablesViewer.showVariable">showVariable</a></td> <td>Public method to show variables in a list.</td> </tr><tr> <td><a href="#VariablesViewer.showVariables">showVariables</a></td> <td>Public method to show variables in a list.</td> +</tr><tr> +<td><a href="#VariablesViewer.verticalScrollbarValueChanged">verticalScrollbarValueChanged</a></td> +<td>Public slot informing about the scrollbar change.</td> </tr> </table> <h3>Static Methods</h3> @@ -527,180 +784,76 @@ <p> Constructor </p><dl> -<dt><i>viewer</i></dt> +<dt><i>viewer</i> (DebugViewer)</dt> <dd> -reference to the debug viewer object (DebugViewer) -</dd><dt><i>globalScope</i></dt> +reference to the debug viewer object +</dd><dt><i>globalScope</i> (bool)</dt> <dd> flag indicating global (True) or local (False) variables -</dd><dt><i>parent</i></dt> -<dd> -the parent (QWidget) -</dd> -</dl><a NAME="VariablesViewer.__addItem" ID="VariablesViewer.__addItem"></a> -<h4>VariablesViewer.__addItem</h4> -<b>__addItem</b>(<i>parent, vtype, var, value</i>) -<p> - Private method used to add an item to the list. -</p><p> - If the item is of a type with subelements (i.e. list, dictionary, - tuple), these subelements are added by calling this method recursively. -</p><dl> -<dt><i>parent</i></dt> -<dd> -the parent of the item to be added - (QTreeWidgetItem or None) -</dd><dt><i>vtype</i></dt> -<dd> -the type of the item to be added - (string) -</dd><dt><i>var</i></dt> +</dd><dt><i>parent</i> (QWidget)</dt> <dd> -the variable name (string) -</dd><dt><i>value</i></dt> -<dd> -the value string (string) -</dd> -</dl><dl> -<dt>Returns:</dt> -<dd> -The item that was added to the listview (QTreeWidgetItem). +the parent </dd> -</dl><a NAME="VariablesViewer.__buildTreePath" ID="VariablesViewer.__buildTreePath"></a> -<h4>VariablesViewer.__buildTreePath</h4> -<b>__buildTreePath</b>(<i>itm</i>) +</dl><a NAME="VariablesViewer.__collapseChildren" ID="VariablesViewer.__collapseChildren"></a> +<h4>VariablesViewer.__collapseChildren</h4> +<b>__collapseChildren</b>(<i></i>) <p> - Private method to build up a path from the top to an item. -</p><dl> -<dt><i>itm</i></dt> -<dd> -item to build the path for (QTreeWidgetItem) -</dd> -</dl><dl> -<dt>Returns:</dt> -<dd> -list of names denoting the path from the top (list of strings) -</dd> -</dl><a NAME="VariablesViewer.__configure" ID="VariablesViewer.__configure"></a> + Private slot to collapse all child items of current parent. +</p><a NAME="VariablesViewer.__configure" ID="VariablesViewer.__configure"></a> <h4>VariablesViewer.__configure</h4> <b>__configure</b>(<i></i>) <p> Private method to open the configuration dialog. +</p><a NAME="VariablesViewer.__configureFilter" ID="VariablesViewer.__configureFilter"></a> +<h4>VariablesViewer.__configureFilter</h4> +<b>__configureFilter</b>(<i></i>) +<p> + Private method to open the variables filter dialog. </p><a NAME="VariablesViewer.__createPopupMenus" ID="VariablesViewer.__createPopupMenus"></a> <h4>VariablesViewer.__createPopupMenus</h4> <b>__createPopupMenus</b>(<i></i>) <p> Private method to generate the popup menus. -</p><a NAME="VariablesViewer.__expandItemSignal" ID="VariablesViewer.__expandItemSignal"></a> -<h4>VariablesViewer.__expandItemSignal</h4> -<b>__expandItemSignal</b>(<i>parentItem</i>) -<p> - Private slot to handle the expanded signal. -</p><dl> -<dt><i>parentItem</i></dt> -<dd> -reference to the item being expanded - (QTreeWidgetItem) -</dd> -</dl><a NAME="VariablesViewer.__findItem" ID="VariablesViewer.__findItem"></a> -<h4>VariablesViewer.__findItem</h4> -<b>__findItem</b>(<i>slist, column, node=None</i>) +</p><a NAME="VariablesViewer.__expandChildren" ID="VariablesViewer.__expandChildren"></a> +<h4>VariablesViewer.__expandChildren</h4> +<b>__expandChildren</b>(<i></i>) <p> - Private method to search for an item. -</p><p> - It is used to find a specific item in column, - that is a child of node. If node is None, a child of the - QTreeWidget is searched. -</p><dl> -<dt><i>slist</i></dt> -<dd> -searchlist (list of strings) -</dd><dt><i>column</i></dt> -<dd> -index of column to search in (int) -</dd><dt><i>node</i></dt> -<dd> -start point of the search -</dd> -</dl><dl> -<dt>Returns:</dt> -<dd> -the found item or None -</dd> -</dl><a NAME="VariablesViewer.__generateItem" ID="VariablesViewer.__generateItem"></a> -<h4>VariablesViewer.__generateItem</h4> -<b>__generateItem</b>(<i>parent, dvar, dvalue, dtype, isSpecial=False</i>) + Private slot to expand all child items of current parent. +</p><a NAME="VariablesViewer.__itemDoubleClicked" ID="VariablesViewer.__itemDoubleClicked"></a> +<h4>VariablesViewer.__itemDoubleClicked</h4> +<b>__itemDoubleClicked</b>(<i>index</i>) <p> - Private method used to generate a VariableItem. + Private method called if an item was double clicked. </p><dl> -<dt><i>parent</i></dt> -<dd> -parent of the item to be generated -</dd><dt><i>dvar</i></dt> +<dt><i>index</i> (QModelIndex)</dt> <dd> -variable name (string) -</dd><dt><i>dvalue</i></dt> -<dd> -value string (string) -</dd><dt><i>dtype</i></dt> -<dd> -type string (string) -</dd><dt><i>isSpecial</i></dt> -<dd> -flag indicating that a special node should be - generated (boolean) +the double clicked item </dd> -</dl><dl> -<dt>Returns:</dt> -<dd> -The item that was generated (VariableItem). -</dd> -</dl><a NAME="VariablesViewer.__getDispType" ID="VariablesViewer.__getDispType"></a> -<h4>VariablesViewer.__getDispType</h4> -<b>__getDispType</b>(<i>vtype</i>) +</dl><a NAME="VariablesViewer.__mdlRequestExpand" ID="VariablesViewer.__mdlRequestExpand"></a> +<h4>VariablesViewer.__mdlRequestExpand</h4> +<b>__mdlRequestExpand</b>(<i>modelIndex</i>) <p> - Private method used to get the display string for type vtype. + Private method to inform the view about items to be expand. </p><dl> -<dt><i>vtype</i></dt> +<dt><i>modelIndex</i> (QModelIndex)</dt> <dd> -the type, the display string should be looked up for - (string) -</dd> -</dl><dl> -<dt>Returns:</dt> -<dd> -displaystring (string) +the model index </dd> </dl><a NAME="VariablesViewer.__refreshView" ID="VariablesViewer.__refreshView"></a> <h4>VariablesViewer.__refreshView</h4> <b>__refreshView</b>(<i></i>) <p> Private slot to refresh the view. -</p><a NAME="VariablesViewer.__resort" ID="VariablesViewer.__resort"></a> -<h4>VariablesViewer.__resort</h4> -<b>__resort</b>(<i>parent=None</i>) -<p> - Private method to resort the tree. -</p><dl> -<dt><i>parent</i> (QTreeWidgetItem)</dt> -<dd> -reference to a parent item -</dd> -</dl><a NAME="VariablesViewer.__sectionClicked" ID="VariablesViewer.__sectionClicked"></a> -<h4>VariablesViewer.__sectionClicked</h4> -<b>__sectionClicked</b>(<i></i>) -<p> - Private method handling a click onto a header section. </p><a NAME="VariablesViewer.__showContextMenu" ID="VariablesViewer.__showContextMenu"></a> <h4>VariablesViewer.__showContextMenu</h4> <b>__showContextMenu</b>(<i>coord</i>) <p> Private slot to show the context menu. </p><dl> -<dt><i>coord</i></dt> +<dt><i>coord</i> (QPoint)</dt> <dd> -the position of the mouse pointer (QPoint) +the position of the mouse pointer </dd> </dl><a NAME="VariablesViewer.__showDetails" ID="VariablesViewer.__showDetails"></a> <h4>VariablesViewer.__showDetails</h4> @@ -709,53 +862,28 @@ Private slot to show details about the selected variable. </p><a NAME="VariablesViewer.__showVariableDetails" ID="VariablesViewer.__showVariableDetails"></a> <h4>VariablesViewer.__showVariableDetails</h4> -<b>__showVariableDetails</b>(<i>itm</i>) +<b>__showVariableDetails</b>(<i>index</i>) <p> Private method to show details about a variable. </p><dl> -<dt><i>itm</i></dt> +<dt><i>index</i> (QModelIndex)</dt> <dd> reference to the variable item </dd> -</dl><a NAME="VariablesViewer.collapseItem" ID="VariablesViewer.collapseItem"></a> -<h4>VariablesViewer.collapseItem</h4> -<b>collapseItem</b>(<i>parentItem</i>) -<p> - Public slot to handle the collapsed signal. -</p><dl> -<dt><i>parentItem</i></dt> -<dd> -reference to the item being collapsed - (QTreeWidgetItem) -</dd> -</dl><a NAME="VariablesViewer.expandItem" ID="VariablesViewer.expandItem"></a> -<h4>VariablesViewer.expandItem</h4> -<b>expandItem</b>(<i>parentItem</i>) -<p> - Public slot to handle the expanded signal. -</p><dl> -<dt><i>parentItem</i></dt> -<dd> -reference to the item being expanded - (QTreeWidgetItem) -</dd> </dl><a NAME="VariablesViewer.handleResetUI" ID="VariablesViewer.handleResetUI"></a> <h4>VariablesViewer.handleResetUI</h4> <b>handleResetUI</b>(<i></i>) <p> Public method to reset the VariablesViewer. -</p><a NAME="VariablesViewer.mouseDoubleClickEvent" ID="VariablesViewer.mouseDoubleClickEvent"></a> -<h4>VariablesViewer.mouseDoubleClickEvent</h4> -<b>mouseDoubleClickEvent</b>(<i>mouseEvent</i>) +</p><a NAME="VariablesViewer.resizeEvent" ID="VariablesViewer.resizeEvent"></a> +<h4>VariablesViewer.resizeEvent</h4> +<b>resizeEvent</b>(<i>event</i>) <p> - Protected method of QAbstractItemView. -</p><p> - Reimplemented to disable expanding/collapsing of items when - double-clicking. Instead the double-clicked entry is opened. + Protected slot informing about the widget size change. </p><dl> -<dt><i>mouseEvent</i></dt> +<dt><i>event</i> (QResizeEvent)</dt> <dd> -the mouse event object (QMouseEvent) +information </dd> </dl><a NAME="VariablesViewer.showVariable" ID="VariablesViewer.showVariable"></a> <h4>VariablesViewer.showVariable</h4> @@ -763,11 +891,11 @@ <p> Public method to show variables in a list. </p><dl> -<dt><i>vlist</i></dt> +<dt><i>vlist</i> (list)</dt> <dd> the list of subitems to be displayed. The first element gives the path of the - parent variable. Each other listentry is + parent variable. Each other list entry is a tuple of three values. <ul> <li>the variable name (string)</li> @@ -781,18 +909,28 @@ <p> Public method to show variables in a list. </p><dl> -<dt><i>vlist</i></dt> +<dt><i>vlist</i> (list)</dt> <dd> the list of variables to be displayed. Each - listentry is a tuple of three values. + list entry is a tuple of three values. <ul> <li>the variable name (string)</li> <li>the variables type (string)</li> <li>the variables value (string)</li> </ul> -</dd><dt><i>frmnr</i></dt> +</dd><dt><i>frmnr</i> (int)</dt> <dd> -frame number (0 is the current frame) (int) +frame number (0 is the current frame) +</dd> +</dl><a NAME="VariablesViewer.verticalScrollbarValueChanged" ID="VariablesViewer.verticalScrollbarValueChanged"></a> +<h4>VariablesViewer.verticalScrollbarValueChanged</h4> +<b>verticalScrollbarValueChanged</b>(<i>value</i>) +<p> + Public slot informing about the scrollbar change. +</p><dl> +<dt><i>value</i> (int)</dt> +<dd> +current value of the vertical scrollbar </dd> </dl> <div align="right"><a href="#top">Up</a></div>
--- a/eric6/Documentation/Source/eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Documentation/Source/eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html Sun Jun 02 11:42:48 2019 +0200 @@ -87,6 +87,9 @@ <td><a href="#BugBearVisitor.visit">visit</a></td> <td>Public method to traverse a given AST node.</td> </tr><tr> +<td><a href="#BugBearVisitor.visit_Assert">visit_Assert</a></td> +<td>Public method to handle 'assert' statements.</td> +</tr><tr> <td><a href="#BugBearVisitor.visit_Assign">visit_Assign</a></td> <td>Public method to handle assignments.</td> </tr><tr> @@ -99,6 +102,9 @@ <td><a href="#BugBearVisitor.visit_For">visit_For</a></td> <td>Public method to handle 'for' statements.</td> </tr><tr> +<td><a href="#BugBearVisitor.visit_JoinedStr">visit_JoinedStr</a></td> +<td>Public method to handle f-string arguments.</td> +</tr><tr> <td><a href="#BugBearVisitor.visit_UAdd">visit_UAdd</a></td> <td>Public method to handle unary additions.</td> </tr> @@ -142,6 +148,16 @@ <dd> AST node to be traversed </dd> +</dl><a NAME="BugBearVisitor.visit_Assert" ID="BugBearVisitor.visit_Assert"></a> +<h4>BugBearVisitor.visit_Assert</h4> +<b>visit_Assert</b>(<i>node</i>) +<p> + Public method to handle 'assert' statements. +</p><dl> +<dt><i>node</i> (ast.Assert)</dt> +<dd> +reference to the node to be processed +</dd> </dl><a NAME="BugBearVisitor.visit_Assign" ID="BugBearVisitor.visit_Assign"></a> <h4>BugBearVisitor.visit_Assign</h4> <b>visit_Assign</b>(<i>node</i>) @@ -182,6 +198,16 @@ <dd> reference to the node to be processed </dd> +</dl><a NAME="BugBearVisitor.visit_JoinedStr" ID="BugBearVisitor.visit_JoinedStr"></a> +<h4>BugBearVisitor.visit_JoinedStr</h4> +<b>visit_JoinedStr</b>(<i>node</i>) +<p> + Public method to handle f-string arguments. +</p><dl> +<dt><i>node</i> (ast.JoinedStr)</dt> +<dd> +reference to the node to be processed +</dd> </dl><a NAME="BugBearVisitor.visit_UAdd" ID="BugBearVisitor.visit_UAdd"></a> <h4>BugBearVisitor.visit_UAdd</h4> <b>visit_UAdd</b>(<i>node</i>) @@ -399,7 +425,7 @@ <td>Constructor</td> </tr><tr> <td><a href="#MiscellaneousChecker.__checkBugBear">__checkBugBear</a></td> -<td>Private method to bugbear checks.</td> +<td>Private method for bugbear checks.</td> </tr><tr> <td><a href="#MiscellaneousChecker.__checkBuiltins">__checkBuiltins</a></td> <td>Private method to check, if built-ins are shadowed.</td> @@ -501,7 +527,7 @@ <h4>MiscellaneousChecker.__checkBugBear</h4> <b>__checkBugBear</b>(<i></i>) <p> - Private method to bugbear checks. + Private method for bugbear checks. </p><a NAME="MiscellaneousChecker.__checkBuiltins" ID="MiscellaneousChecker.__checkBuiltins"></a> <h4>MiscellaneousChecker.__checkBuiltins</h4> <b>__checkBuiltins</b>(<i></i>)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric6/Documentation/Source/eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.html Sun Jun 02 11:42:48 2019 +0200 @@ -0,0 +1,141 @@ +<!DOCTYPE html> +<html><head> +<title>eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog</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.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog</h1> +<p> +Module implementing a dialog to select the heads to be closed. +</p> +<h3>Global Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Classes</h3> +<table> +<tr> +<td><a href="#HgCloseHeadSelectionDialog">HgCloseHeadSelectionDialog</a></td> +<td>Class implementing a dialog to select the heads to be closed.</td> +</tr> +</table> +<h3>Functions</h3> +<table> +<tr><td>None</td></tr> +</table> +<hr /><hr /> +<a NAME="HgCloseHeadSelectionDialog" ID="HgCloseHeadSelectionDialog"></a> +<h2>HgCloseHeadSelectionDialog</h2> +<p> + Class implementing a dialog to select the heads to be closed. +</p> +<h3>Derived from</h3> +QDialog, Ui_HgCloseHeadSelectionDialog +<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="#HgCloseHeadSelectionDialog.__init__">HgCloseHeadSelectionDialog</a></td> +<td>Constructor</td> +</tr><tr> +<td><a href="#HgCloseHeadSelectionDialog.__getHeads">__getHeads</a></td> +<td>Private method to get the open heads.</td> +</tr><tr> +<td><a href="#HgCloseHeadSelectionDialog.getData">getData</a></td> +<td>Public method to retrieve the entered data.</td> +</tr><tr> +<td><a href="#HgCloseHeadSelectionDialog.on_headsList_itemSelectionChanged">on_headsList_itemSelectionChanged</a></td> +<td>Private slot handling changes of the selection.</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="HgCloseHeadSelectionDialog.__init__" ID="HgCloseHeadSelectionDialog.__init__"></a> +<h4>HgCloseHeadSelectionDialog (Constructor)</h4> +<b>HgCloseHeadSelectionDialog</b>(<i>vcs, ppath, parent=None</i>) +<p> + Constructor +</p><dl> +<dt><i>vcs</i> (Hg)</dt> +<dd> +reference to the VCS object +</dd><dt><i>ppath</i> (str)</dt> +<dd> +directory containing the repository +</dd><dt><i>parent</i> (QWidget)</dt> +<dd> +reference to the parent widget +</dd> +</dl><a NAME="HgCloseHeadSelectionDialog.__getHeads" ID="HgCloseHeadSelectionDialog.__getHeads"></a> +<h4>HgCloseHeadSelectionDialog.__getHeads</h4> +<b>__getHeads</b>(<i>vcs, ppath</i>) +<p> + Private method to get the open heads. +</p><dl> +<dt><i>vcs</i> (Hg)</dt> +<dd> +reference to the VCS object +</dd><dt><i>ppath</i> (str)</dt> +<dd> +directory containing the repository +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +list of tuples containing the revision and the corresponding + branch name +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +list of tuples of (str, str) +</dd> +</dl><a NAME="HgCloseHeadSelectionDialog.getData" ID="HgCloseHeadSelectionDialog.getData"></a> +<h4>HgCloseHeadSelectionDialog.getData</h4> +<b>getData</b>(<i></i>) +<p> + Public method to retrieve the entered data. +</p><dl> +<dt>Returns:</dt> +<dd> +tuple containing a list of selected revisions and the commit + message +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +tuple of (list of str, str) +</dd> +</dl><a NAME="HgCloseHeadSelectionDialog.on_headsList_itemSelectionChanged" ID="HgCloseHeadSelectionDialog.on_headsList_itemSelectionChanged"></a> +<h4>HgCloseHeadSelectionDialog.on_headsList_itemSelectionChanged</h4> +<b>on_headsList_itemSelectionChanged</b>(<i></i>) +<p> + Private slot handling changes of the selection. +</p> +<div align="right"><a href="#top">Up</a></div> +<hr /> +</body></html> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric6/Documentation/Source/eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.html Sun Jun 02 11:42:48 2019 +0200 @@ -0,0 +1,128 @@ +<!DOCTYPE html> +<html><head> +<title>eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper</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.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper</h1> +<p> +Module implementing the closehead extension project helper. +</p> +<h3>Global Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Classes</h3> +<table> +<tr> +<td><a href="#CloseheadProjectHelper">CloseheadProjectHelper</a></td> +<td>Class implementing the closehead extension project helper.</td> +</tr> +</table> +<h3>Functions</h3> +<table> +<tr><td>None</td></tr> +</table> +<hr /><hr /> +<a NAME="CloseheadProjectHelper" ID="CloseheadProjectHelper"></a> +<h2>CloseheadProjectHelper</h2> +<p> + Class implementing the closehead extension project helper. +</p> +<h3>Derived from</h3> +HgExtensionProjectHelper +<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="#CloseheadProjectHelper.__init__">CloseheadProjectHelper</a></td> +<td>Constructor</td> +</tr><tr> +<td><a href="#CloseheadProjectHelper.__hgClosehead">__hgClosehead</a></td> +<td>Private slot used to close arbitrary heads.</td> +</tr><tr> +<td><a href="#CloseheadProjectHelper.initActions">initActions</a></td> +<td>Public method to generate the action objects.</td> +</tr><tr> +<td><a href="#CloseheadProjectHelper.initMenu">initMenu</a></td> +<td>Public method to generate the extension menu.</td> +</tr><tr> +<td><a href="#CloseheadProjectHelper.menuTitle">menuTitle</a></td> +<td>Public method to get the menu title.</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="CloseheadProjectHelper.__init__" ID="CloseheadProjectHelper.__init__"></a> +<h4>CloseheadProjectHelper (Constructor)</h4> +<b>CloseheadProjectHelper</b>(<i></i>) +<p> + Constructor +</p><a NAME="CloseheadProjectHelper.__hgClosehead" ID="CloseheadProjectHelper.__hgClosehead"></a> +<h4>CloseheadProjectHelper.__hgClosehead</h4> +<b>__hgClosehead</b>(<i></i>) +<p> + Private slot used to close arbitrary heads. +</p><a NAME="CloseheadProjectHelper.initActions" ID="CloseheadProjectHelper.initActions"></a> +<h4>CloseheadProjectHelper.initActions</h4> +<b>initActions</b>(<i></i>) +<p> + Public method to generate the action objects. +</p><a NAME="CloseheadProjectHelper.initMenu" ID="CloseheadProjectHelper.initMenu"></a> +<h4>CloseheadProjectHelper.initMenu</h4> +<b>initMenu</b>(<i>mainMenu</i>) +<p> + Public method to generate the extension menu. +</p><dl> +<dt><i>mainMenu</i> (QMenu)</dt> +<dd> +reference to the main menu +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +populated menu (QMenu) +</dd> +</dl><a NAME="CloseheadProjectHelper.menuTitle" ID="CloseheadProjectHelper.menuTitle"></a> +<h4>CloseheadProjectHelper.menuTitle</h4> +<b>menuTitle</b>(<i></i>) +<p> + Public method to get the menu title. +</p><dl> +<dt>Returns:</dt> +<dd> +title of the menu +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +str +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /> +</body></html> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric6/Documentation/Source/eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead.html Sun Jun 02 11:42:48 2019 +0200 @@ -0,0 +1,97 @@ +<!DOCTYPE html> +<html><head> +<title>eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead</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.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead</h1> +<p> +Module implementing the closehead extension interface. +</p> +<h3>Global Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Classes</h3> +<table> +<tr> +<td><a href="#Closehead">Closehead</a></td> +<td>Class implementing the strip extension interface.</td> +</tr> +</table> +<h3>Functions</h3> +<table> +<tr><td>None</td></tr> +</table> +<hr /><hr /> +<a NAME="Closehead" ID="Closehead"></a> +<h2>Closehead</h2> +<p> + Class implementing the strip extension interface. +</p> +<h3>Derived from</h3> +HgExtension +<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="#Closehead.__init__">Closehead</a></td> +<td>Constructor</td> +</tr><tr> +<td><a href="#Closehead.hgCloseheads">hgCloseheads</a></td> +<td>Public method to close arbitrary heads.</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="Closehead.__init__" ID="Closehead.__init__"></a> +<h4>Closehead (Constructor)</h4> +<b>Closehead</b>(<i>vcs</i>) +<p> + Constructor +</p><dl> +<dt><i>vcs</i> (Hg)</dt> +<dd> +reference to the Mercurial vcs object +</dd> +</dl><a NAME="Closehead.hgCloseheads" ID="Closehead.hgCloseheads"></a> +<h4>Closehead.hgCloseheads</h4> +<b>hgCloseheads</b>(<i>name, revisions=None</i>) +<p> + Public method to close arbitrary heads. +</p><dl> +<dt><i>name</i> (str)</dt> +<dd> +file/directory name +</dd><dt><i>revisions</i> (str)</dt> +<dd> +revisions of branch heads to be closed +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /> +</body></html> \ No newline at end of file
--- a/eric6/Documentation/Source/eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Documentation/Source/eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.html Sun Jun 02 11:42:48 2019 +0200 @@ -81,6 +81,9 @@ <td><a href="#HgLogBrowserDialog.__bundleActTriggered">__bundleActTriggered</a></td> <td>Private slot to create a changegroup file.</td> </tr><tr> +<td><a href="#HgLogBrowserDialog.__closeHeadsActTriggered">__closeHeadsActTriggered</a></td> +<td>Private slot to close the selected head revisions.</td> +</tr><tr> <td><a href="#HgLogBrowserDialog.__fetchActTriggered">__fetchActTriggered</a></td> <td>Private slot to fetch changes from a remote repository.</td> </tr><tr> @@ -117,6 +120,9 @@ <td><a href="#HgLogBrowserDialog.__getColor">__getColor</a></td> <td>Private method to get the (rotating) name of the color given an index.</td> </tr><tr> +<td><a href="#HgLogBrowserDialog.__getHeads">__getHeads</a></td> +<td>Private method to get the list of all heads.</td> +</tr><tr> <td><a href="#HgLogBrowserDialog.__getLogEntries">__getLogEntries</a></td> <td>Private method to retrieve log entries from the repository.</td> </tr><tr> @@ -325,19 +331,19 @@ </table> <a NAME="HgLogBrowserDialog.__init__" ID="HgLogBrowserDialog.__init__"></a> <h4>HgLogBrowserDialog (Constructor)</h4> -<b>HgLogBrowserDialog</b>(<i>vcs, mode="log", parent=None</i>) +<b>HgLogBrowserDialog</b>(<i>vcs, mode="", parent=None</i>) <p> Constructor </p><dl> -<dt><i>vcs</i></dt> +<dt><i>vcs</i> (Hg)</dt> <dd> reference to the vcs object -</dd><dt><i>mode</i></dt> +</dd><dt><i>mode</i> (str (one of log, full_log, incoming, outgoing))</dt> <dd> -mode of the dialog (string; one of log, incoming, outgoing) -</dd><dt><i>parent</i></dt> +mode of the dialog +</dd><dt><i>parent</i> (QWidget)</dt> <dd> -parent widget (QWidget) +parent widget </dd> </dl><a NAME="HgLogBrowserDialog.__actionMode" ID="HgLogBrowserDialog.__actionMode"></a> <h4>HgLogBrowserDialog.__actionMode</h4> @@ -402,6 +408,11 @@ <b>__bundleActTriggered</b>(<i></i>) <p> Private slot to create a changegroup file. +</p><a NAME="HgLogBrowserDialog.__closeHeadsActTriggered" ID="HgLogBrowserDialog.__closeHeadsActTriggered"></a> +<h4>HgLogBrowserDialog.__closeHeadsActTriggered</h4> +<b>__closeHeadsActTriggered</b>(<i></i>) +<p> + Private slot to close the selected head revisions. </p><a NAME="HgLogBrowserDialog.__fetchActTriggered" ID="HgLogBrowserDialog.__fetchActTriggered"></a> <h4>HgLogBrowserDialog.__fetchActTriggered</h4> <b>__fetchActTriggered</b>(<i></i>) @@ -485,41 +496,47 @@ </dd> </dl><a NAME="HgLogBrowserDialog.__generateIcon" ID="HgLogBrowserDialog.__generateIcon"></a> <h4>HgLogBrowserDialog.__generateIcon</h4> -<b>__generateIcon</b>(<i>column, color, bottomedges, topedges, dotColor, currentRev, closed</i>) +<b>__generateIcon</b>(<i>column, color, bottomedges, topedges, dotColor, currentRev, closed, isDraft</i>) <p> Private method to generate an icon containing the revision tree for the given data. </p><dl> -<dt><i>column</i></dt> +<dt><i>column</i> (int)</dt> <dd> -column index of the revision (integer) -</dd><dt><i>color</i></dt> +column index of the revision +</dd><dt><i>color</i> (int)</dt> <dd> -color of the node (integer) -</dd><dt><i>bottomedges</i></dt> +color of the node +</dd><dt><i>bottomedges</i> (list of tuples of (int, int, int))</dt> <dd> list of edges for the bottom of the node - (list of tuples of three integers) -</dd><dt><i>topedges</i></dt> +</dd><dt><i>topedges</i> (list of tuples of (int, int, int))</dt> <dd> list of edges for the top of the node - (list of tuples of three integers) -</dd><dt><i>dotColor</i></dt> +</dd><dt><i>dotColor</i> (QColor)</dt> <dd> -color to be used for the dot (QColor) -</dd><dt><i>currentRev</i></dt> +color to be used for the dot +</dd><dt><i>currentRev</i> (bool)</dt> <dd> flag indicating to draw the icon for the - current revision (boolean) -</dd><dt><i>closed</i></dt> + current revision +</dd><dt><i>closed</i> (bool)</dt> <dd> flag indicating to draw an icon for a closed - branch (boolean) + branch +</dd><dt><i>isDraft</i> (bool)</dt> +<dd> +flag indicating an entry of phase 'draft' </dd> </dl><dl> <dt>Returns:</dt> <dd> -icon for the node (QIcon) +icon for the node +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +QIcon </dd> </dl><a NAME="HgLogBrowserDialog.__generateLogItem" ID="HgLogBrowserDialog.__generateLogItem"></a> <h4>HgLogBrowserDialog.__generateLogItem</h4> @@ -593,7 +610,12 @@ <dd> color name (string) </dd> -</dl><a NAME="HgLogBrowserDialog.__getLogEntries" ID="HgLogBrowserDialog.__getLogEntries"></a> +</dl><a NAME="HgLogBrowserDialog.__getHeads" ID="HgLogBrowserDialog.__getHeads"></a> +<h4>HgLogBrowserDialog.__getHeads</h4> +<b>__getHeads</b>(<i></i>) +<p> + Private method to get the list of all heads. +</p><a NAME="HgLogBrowserDialog.__getLogEntries" ID="HgLogBrowserDialog.__getLogEntries"></a> <h4>HgLogBrowserDialog.__getLogEntries</h4> <b>__getLogEntries</b>(<i>startRev=None, noEntries=0</i>) <p> @@ -1035,10 +1057,16 @@ </dd> </dl><a NAME="HgLogBrowserDialog.on_refreshButton_clicked" ID="HgLogBrowserDialog.on_refreshButton_clicked"></a> <h4>HgLogBrowserDialog.on_refreshButton_clicked</h4> -<b>on_refreshButton_clicked</b>(<i></i>) +<b>on_refreshButton_clicked</b>(<i>addNext=False</i>) <p> Private slot to refresh the log. -</p><a NAME="HgLogBrowserDialog.on_rxEdit_returnPressed" ID="HgLogBrowserDialog.on_rxEdit_returnPressed"></a> +</p><dl> +<dt><i>addNext</i> (bool)</dt> +<dd> +flag indicating to get a second batch of log entries as + well +</dd> +</dl><a NAME="HgLogBrowserDialog.on_rxEdit_returnPressed" ID="HgLogBrowserDialog.on_rxEdit_returnPressed"></a> <h4>HgLogBrowserDialog.on_rxEdit_returnPressed</h4> <b>on_rxEdit_returnPressed</b>(<i></i>) <p>
--- a/eric6/Documentation/Source/eric6.Plugins.VcsPlugins.vcsMercurial.HgTagBranchListDialog.html Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Documentation/Source/eric6.Plugins.VcsPlugins.vcsMercurial.HgTagBranchListDialog.html Sun Jun 02 11:42:48 2019 +0200 @@ -63,6 +63,9 @@ <td><a href="#HgTagBranchListDialog.__closeBranch">__closeBranch</a></td> <td>Private slot to close the selected branch.</td> </tr><tr> +<td><a href="#HgTagBranchListDialog.__closeBranchHeads">__closeBranchHeads</a></td> +<td>Private slot to close the selected branches.</td> +</tr><tr> <td><a href="#HgTagBranchListDialog.__finish">__finish</a></td> <td>Private slot called when the process finished or the user pressed the button.</td> </tr><tr> @@ -146,6 +149,11 @@ <b>__closeBranch</b>(<i></i>) <p> Private slot to close the selected branch. +</p><a NAME="HgTagBranchListDialog.__closeBranchHeads" ID="HgTagBranchListDialog.__closeBranchHeads"></a> +<h4>HgTagBranchListDialog.__closeBranchHeads</h4> +<b>__closeBranchHeads</b>(<i></i>) +<p> + Private slot to close the selected branches. </p><a NAME="HgTagBranchListDialog.__finish" ID="HgTagBranchListDialog.__finish"></a> <h4>HgTagBranchListDialog.__finish</h4> <b>__finish</b>(<i></i>)
--- a/eric6/Documentation/Source/eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelveDataDialog.html Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Documentation/Source/eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelveDataDialog.html Sun Jun 02 11:42:48 2019 +0200 @@ -70,13 +70,16 @@ </table> <a NAME="HgShelveDataDialog.__init__" ID="HgShelveDataDialog.__init__"></a> <h4>HgShelveDataDialog (Constructor)</h4> -<b>HgShelveDataDialog</b>(<i>parent=None</i>) +<b>HgShelveDataDialog</b>(<i>version, parent=None</i>) <p> Constructor </p><dl> -<dt><i>parent</i></dt> +<dt><i>version</i> (tuple of three int)</dt> <dd> -reference to the parent widget (QWidget) +Mercurial version +</dd><dt><i>parent</i> (QWidget)</dt> +<dd> +reference to the parent widget </dd> </dl><a NAME="HgShelveDataDialog.getData" ID="HgShelveDataDialog.getData"></a> <h4>HgShelveDataDialog.getData</h4> @@ -86,9 +89,14 @@ </p><dl> <dt>Returns:</dt> <dd> -tuple containing the name (string), date (QDateTime), - message (string) and a flag indicating to add/remove - new/missing files (boolean) +tuple containing the name, date, message, a flag indicating + to add/remove new/missing files and a flag indicating to keep the + shelved changes in the working directory +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +tuple of (str, QDateTime, str, bool, bool) </dd> </dl> <div align="right"><a href="#top">Up</a></div>
--- a/eric6/Documentation/Source/eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Documentation/Source/eric6.Plugins.WizardPlugins.SetupWizard.SetupWizardDialog.html Sun Jun 02 11:42:48 2019 +0200 @@ -51,7 +51,7 @@ QDialog, Ui_SetupWizardDialog <h3>Class Attributes</h3> <table> -<tr><td>None</td></tr> +<tr><td>ClassifiersUrl</td></tr> </table> <h3>Class Methods</h3> <table> @@ -69,6 +69,9 @@ <td><a href="#SetupWizardDialog.__addPackage">__addPackage</a></td> <td>Private method to add a package to the list.</td> </tr><tr> +<td><a href="#SetupWizardDialog.__classifiersDownloadDone">__classifiersDownloadDone</a></td> +<td>Private slot called, after the classifiers file has been downloaded from the internet.</td> +</tr><tr> <td><a href="#SetupWizardDialog.__enableOkButton">__enableOkButton</a></td> <td>Private slot to set the state of the OK button.</td> </tr><tr> @@ -78,8 +81,11 @@ <td><a href="#SetupWizardDialog.__getStartDir">__getStartDir</a></td> <td>Private method to get the start directory for selection dialogs.</td> </tr><tr> -<td><a href="#SetupWizardDialog.__populateFromTroveLists">__populateFromTroveLists</a></td> -<td>Private method to populate lists from the Trove list file.</td> +<td><a href="#SetupWizardDialog.__loadClassifiersFromPyPI">__loadClassifiersFromPyPI</a></td> +<td>Private method to populate the classifiers list with data retrieved from PyPI.</td> +</tr><tr> +<td><a href="#SetupWizardDialog.__populateClassifiers">__populateClassifiers</a></td> +<td>Private method to populate the classifiers.</td> </tr><tr> <td><a href="#SetupWizardDialog.getCode">getCode</a></td> <td>Public method to get the source code.</td> @@ -120,6 +126,9 @@ <td><a href="#SetupWizardDialog.on_excludePatternList_itemSelectionChanged">on_excludePatternList_itemSelectionChanged</a></td> <td>Private slot to handle a change of selected items of the exclude pattern list.</td> </tr><tr> +<td><a href="#SetupWizardDialog.on_localClassifiersButton_clicked">on_localClassifiersButton_clicked</a></td> +<td>Private method to populate lists from the Trove list file.</td> +</tr><tr> <td><a href="#SetupWizardDialog.on_modulesList_itemSelectionChanged">on_modulesList_itemSelectionChanged</a></td> <td>Private slot to handle a change of selected items of the modules list.</td> </tr><tr> @@ -188,6 +197,17 @@ <dd> name of the package directory (string) </dd> +</dl><a NAME="SetupWizardDialog.__classifiersDownloadDone" ID="SetupWizardDialog.__classifiersDownloadDone"></a> +<h4>SetupWizardDialog.__classifiersDownloadDone</h4> +<b>__classifiersDownloadDone</b>(<i>reply</i>) +<p> + Private slot called, after the classifiers file has been downloaded + from the internet. +</p><dl> +<dt><i>reply</i> (QNetworkReply)</dt> +<dd> +reference to the network reply +</dd> </dl><a NAME="SetupWizardDialog.__enableOkButton" ID="SetupWizardDialog.__enableOkButton"></a> <h4>SetupWizardDialog.__enableOkButton</h4> <b>__enableOkButton</b>(<i></i>) @@ -213,12 +233,24 @@ <dd> start directory (string) </dd> -</dl><a NAME="SetupWizardDialog.__populateFromTroveLists" ID="SetupWizardDialog.__populateFromTroveLists"></a> -<h4>SetupWizardDialog.__populateFromTroveLists</h4> -<b>__populateFromTroveLists</b>(<i></i>) +</dl><a NAME="SetupWizardDialog.__loadClassifiersFromPyPI" ID="SetupWizardDialog.__loadClassifiersFromPyPI"></a> +<h4>SetupWizardDialog.__loadClassifiersFromPyPI</h4> +<b>__loadClassifiersFromPyPI</b>(<i></i>) <p> - Private method to populate lists from the Trove list file. -</p><a NAME="SetupWizardDialog.getCode" ID="SetupWizardDialog.getCode"></a> + Private method to populate the classifiers list with data retrieved + from PyPI. +</p><a NAME="SetupWizardDialog.__populateClassifiers" ID="SetupWizardDialog.__populateClassifiers"></a> +<h4>SetupWizardDialog.__populateClassifiers</h4> +<b>__populateClassifiers</b>(<i>classifiers</i>) +<p> + Private method to populate the classifiers. +</p><dl> +<dt><i>classifiers</i> (list of str)</dt> +<dd> +list of classifiers read from a local file or + retrieved from PyPI +</dd> +</dl><a NAME="SetupWizardDialog.getCode" ID="SetupWizardDialog.getCode"></a> <h4>SetupWizardDialog.getCode</h4> <b>getCode</b>(<i>indLevel, indString</i>) <p> @@ -303,6 +335,14 @@ <p> Private slot to handle a change of selected items of the exclude pattern list. +</p><a NAME="SetupWizardDialog.on_localClassifiersButton_clicked" ID="SetupWizardDialog.on_localClassifiersButton_clicked"></a> +<h4>SetupWizardDialog.on_localClassifiersButton_clicked</h4> +<b>on_localClassifiersButton_clicked</b>(<i></i>) +<p> + Private method to populate lists from the Trove list file. +</p><p> + Note: The trove list file was created from querying + "https://pypi.org/pypi?%3Aaction=list_classifiers". </p><a NAME="SetupWizardDialog.on_modulesList_itemSelectionChanged" ID="SetupWizardDialog.on_modulesList_itemSelectionChanged"></a> <h4>SetupWizardDialog.on_modulesList_itemSelectionChanged</h4> <b>on_modulesList_itemSelectionChanged</b>(<i></i>)
--- a/eric6/Documentation/Source/eric6.Preferences.ConfigurationPages.ConfigurationPageBase.html Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Documentation/Source/eric6.Preferences.ConfigurationPages.ConfigurationPageBase.html Sun Jun 02 11:42:48 2019 +0200 @@ -43,7 +43,13 @@ <h2>ConfigurationPageBase</h2> <p> Class implementing the base class for all configuration pages. -</p> +</p><h3>Signals</h3> +<dl> +<dt>colourChanged(str, QColor)</dt> +<dd> +To inform about a new colour selection +</dd> +</dl> <h3>Derived from</h3> QWidget <h3>Class Attributes</h3>
--- a/eric6/Documentation/Source/eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Documentation/Source/eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html Sun Jun 02 11:42:48 2019 +0200 @@ -32,6 +32,9 @@ <tr> <td><a href="#DebuggerGeneralPage">DebuggerGeneralPage</a></td> <td>Class implementing the Debugger General configuration page.</td> +</tr><tr> +<td><a href="#PreviewModel">PreviewModel</a></td> +<td>Class to show an example of the selected background colours for the debug viewer.</td> </tr> </table> <h3>Functions</h3> @@ -124,6 +127,204 @@ </p> <div align="right"><a href="#top">Up</a></div> <hr /><hr /> +<a NAME="PreviewModel" ID="PreviewModel"></a> +<h2>PreviewModel</h2> +<p> + Class to show an example of the selected background colours for the debug + viewer. +</p> +<h3>Derived from</h3> +QAbstractItemModel +<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="#PreviewModel.__init__">PreviewModel</a></td> +<td>Constructor</td> +</tr><tr> +<td><a href="#PreviewModel.columnCount">columnCount</a></td> +<td>Public Qt slot to get the column count.</td> +</tr><tr> +<td><a href="#PreviewModel.data">data</a></td> +<td>Public Qt slot get the role data of item.</td> +</tr><tr> +<td><a href="#PreviewModel.flags">flags</a></td> +<td>Public Qt slot to get the item flags.</td> +</tr><tr> +<td><a href="#PreviewModel.index">index</a></td> +<td>Public Qt slot to get the index of item at row:column of parent.</td> +</tr><tr> +<td><a href="#PreviewModel.parent">parent</a></td> +<td>Public Qt slot to get the parent of the given child.</td> +</tr><tr> +<td><a href="#PreviewModel.rowCount">rowCount</a></td> +<td>Public Qt slot to get the row count.</td> +</tr><tr> +<td><a href="#PreviewModel.setColor">setColor</a></td> +<td>Public slot to update the background colour indexed by key.</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="PreviewModel.__init__" ID="PreviewModel.__init__"></a> +<h4>PreviewModel (Constructor)</h4> +<b>PreviewModel</b>(<i></i>) +<p> + Constructor +</p><a NAME="PreviewModel.columnCount" ID="PreviewModel.columnCount"></a> +<h4>PreviewModel.columnCount</h4> +<b>columnCount</b>(<i>parent=QModelIndex()</i>) +<p> + Public Qt slot to get the column count. +</p><dl> +<dt><i>parent</i> (QModelIndex)</dt> +<dd> +the model parent +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +number of columns +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +int +</dd> +</dl><a NAME="PreviewModel.data" ID="PreviewModel.data"></a> +<h4>PreviewModel.data</h4> +<b>data</b>(<i>index, role=Qt.DisplayRole</i>) +<p> + Public Qt slot get the role data of item. +</p><dl> +<dt><i>index</i> (QModelIndex)</dt> +<dd> +the model index +</dd><dt><i>role</i> (QtCore.Qt.ItemDataRole)</dt> +<dd> +the requested data role +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +role data of item +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +str, QBrush or None +</dd> +</dl><a NAME="PreviewModel.flags" ID="PreviewModel.flags"></a> +<h4>PreviewModel.flags</h4> +<b>flags</b>(<i>index</i>) +<p> + Public Qt slot to get the item flags. +</p><dl> +<dt><i>index</i> (QModelIndex)</dt> +<dd> +of item +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +item flags +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +QtCore.Qt.ItemFlag +</dd> +</dl><a NAME="PreviewModel.index" ID="PreviewModel.index"></a> +<h4>PreviewModel.index</h4> +<b>index</b>(<i>row, column, parent=QModelIndex()</i>) +<p> + Public Qt slot to get the index of item at row:column of parent. +</p><dl> +<dt><i>row</i> (int)</dt> +<dd> +number of rows +</dd><dt><i>column</i> (int)</dt> +<dd> +number of columns +</dd><dt><i>parent</i> (QModelIndex)</dt> +<dd> +the model parent +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +new model index for child +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +QModelIndex +</dd> +</dl><a NAME="PreviewModel.parent" ID="PreviewModel.parent"></a> +<h4>PreviewModel.parent</h4> +<b>parent</b>(<i>child</i>) +<p> + Public Qt slot to get the parent of the given child. +</p><dl> +<dt><i>child</i> (QModelIndex)</dt> +<dd> +the model child node +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +new model index for parent +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +QModelIndex +</dd> +</dl><a NAME="PreviewModel.rowCount" ID="PreviewModel.rowCount"></a> +<h4>PreviewModel.rowCount</h4> +<b>rowCount</b>(<i>parent=QModelIndex()</i>) +<p> + Public Qt slot to get the row count. +</p><dl> +<dt><i>parent</i> (QModelIndex)</dt> +<dd> +the model parent +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +number of rows +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +int +</dd> +</dl><a NAME="PreviewModel.setColor" ID="PreviewModel.setColor"></a> +<h4>PreviewModel.setColor</h4> +<b>setColor</b>(<i>key, bgcolour</i>) +<p> + Public slot to update the background colour indexed by key. +</p><dl> +<dt><i>key</i> (str)</dt> +<dd> +the name of background +</dd><dt><i>bgcolour</i> (QColor)</dt> +<dd> +the new background colour +</dd> +</dl> +<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>)
--- a/eric6/Documentation/Source/eric6.Preferences.ConfigurationPages.InterfacePage.html Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Documentation/Source/eric6.Preferences.ConfigurationPages.InterfacePage.html Sun Jun 02 11:42:48 2019 +0200 @@ -64,7 +64,10 @@ <td>Constructor</td> </tr><tr> <td><a href="#InterfacePage.__populateLanguageCombo">__populateLanguageCombo</a></td> -<td>Private method to initialize the language combobox of the Interface configuration page.</td> +<td>Private method to initialize the language combo box.</td> +</tr><tr> +<td><a href="#InterfacePage.__populateShellPositionCombo">__populateShellPositionCombo</a></td> +<td>Private method to initialize the shell position combo box.</td> </tr><tr> <td><a href="#InterfacePage.__populateStyleCombo">__populateStyleCombo</a></td> <td>Private method to populate the style combo box.</td> @@ -89,8 +92,12 @@ <h4>InterfacePage.__populateLanguageCombo</h4> <b>__populateLanguageCombo</b>(<i></i>) <p> - Private method to initialize the language combobox of the Interface - configuration page. + Private method to initialize the language combo box. +</p><a NAME="InterfacePage.__populateShellPositionCombo" ID="InterfacePage.__populateShellPositionCombo"></a> +<h4>InterfacePage.__populateShellPositionCombo</h4> +<b>__populateShellPositionCombo</b>(<i></i>) +<p> + Private method to initialize the shell position combo box. </p><a NAME="InterfacePage.__populateStyleCombo" ID="InterfacePage.__populateStyleCombo"></a> <h4>InterfacePage.__populateStyleCombo</h4> <b>__populateStyleCombo</b>(<i></i>)
--- a/eric6/Documentation/Source/eric6.Project.Project.html Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Documentation/Source/eric6.Project.Project.html Sun Jun 02 11:42:48 2019 +0200 @@ -635,8 +635,8 @@ <td><a href="#Project.initFileTypes">initFileTypes</a></td> <td>Public method to initialize the filetype associations with default values.</td> </tr><tr> -<td><a href="#Project.initMenu">initMenu</a></td> -<td>Public slot to initialize the project menu.</td> +<td><a href="#Project.initMenus">initMenus</a></td> +<td>Public slot to initialize the project menus.</td> </tr><tr> <td><a href="#Project.initToolbars">initToolbars</a></td> <td>Public slot to initialize the project toolbar and the basic VCS toolbar.</td> @@ -2271,15 +2271,20 @@ <p> Public method to initialize the filetype associations with default values. -</p><a NAME="Project.initMenu" ID="Project.initMenu"></a> -<h4>Project.initMenu</h4> -<b>initMenu</b>(<i></i>) +</p><a NAME="Project.initMenus" ID="Project.initMenus"></a> +<h4>Project.initMenus</h4> +<b>initMenus</b>(<i></i>) <p> - Public slot to initialize the project menu. + Public slot to initialize the project menus. </p><dl> <dt>Returns:</dt> <dd> -the menu generated (QMenu) +tuple of generated menus +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +tuple of (QMenu, QMenu) </dd> </dl><a NAME="Project.initToolbars" ID="Project.initToolbars"></a> <h4>Project.initToolbars</h4>
--- a/eric6/Documentation/Source/eric6.QScintilla.Editor.html Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Documentation/Source/eric6.QScintilla.Editor.html Sun Jun 02 11:42:48 2019 +0200 @@ -1808,8 +1808,8 @@ Private method to get the requested option via EditorConfig. </p><p> If there is no EditorConfig defined, the equivalent built-in option - will be used (Preferences.getEditor(). The option must be given as the - Preferences option key. The mapping to the EditorConfig option name + will be used (Preferences.getEditor() ). The option must be given as + the Preferences option key. The mapping to the EditorConfig option name will be done within this method. </p><dl> <dt><i>option</i> (str)</dt>
--- a/eric6/Documentation/Source/eric6.UI.UserInterface.html Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Documentation/Source/eric6.UI.UserInterface.html Sun Jun 02 11:42:48 2019 +0200 @@ -780,6 +780,9 @@ <td><a href="#UserInterface.launchHelpViewer">launchHelpViewer</a></td> <td>Public slot to start the help viewer/web browser.</td> </tr><tr> +<td><a href="#UserInterface.networkAccessManager">networkAccessManager</a></td> +<td>Public method to get a reference to the network access manager object.</td> +</tr><tr> <td><a href="#UserInterface.notificationsEnabled">notificationsEnabled</a></td> <td>Public method to check, if notifications are enabled.</td> </tr><tr> @@ -2522,6 +2525,21 @@ <dd> flag indicating to use a single browser window </dd> +</dl><a NAME="UserInterface.networkAccessManager" ID="UserInterface.networkAccessManager"></a> +<h4>UserInterface.networkAccessManager</h4> +<b>networkAccessManager</b>(<i></i>) +<p> + Public method to get a reference to the network access manager object. +</p><dl> +<dt>Returns:</dt> +<dd> +reference to the network access manager object +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +QNetworkAccessManager +</dd> </dl><a NAME="UserInterface.notificationsEnabled" ID="UserInterface.notificationsEnabled"></a> <h4>UserInterface.notificationsEnabled</h4> <b>notificationsEnabled</b>(<i></i>)
--- a/eric6/Documentation/Source/eric6.ViewManager.ViewManager.html Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Documentation/Source/eric6.ViewManager.ViewManager.html Sun Jun 02 11:42:48 2019 +0200 @@ -696,7 +696,7 @@ <td>Public method used to split the current view.</td> </tr><tr> <td><a href="#ViewManager.addToExtrasMenu">addToExtrasMenu</a></td> -<td>Public method to add some actions to the extras menu.</td> +<td>Public method to add some actions to the Extras menu.</td> </tr><tr> <td><a href="#ViewManager.addToRecentList">addToRecentList</a></td> <td>Public slot to add a filename to the list of recently opened files.</td> @@ -833,6 +833,9 @@ <td><a href="#ViewManager.initMacroMenu">initMacroMenu</a></td> <td>Public method to create the Macro menu.</td> </tr><tr> +<td><a href="#ViewManager.initSearchMenu">initSearchMenu</a></td> +<td>Public method to create the Search menu.</td> +</tr><tr> <td><a href="#ViewManager.initSearchToolbars">initSearchToolbars</a></td> <td>Public method to create the Search toolbars.</td> </tr><tr> @@ -2181,7 +2184,7 @@ <h4>ViewManager.addToExtrasMenu</h4> <b>addToExtrasMenu</b>(<i>menu</i>) <p> - Public method to add some actions to the extras menu. + Public method to add some actions to the Extras menu. </p><dl> <dt><i>menu</i></dt> <dd> @@ -2778,6 +2781,21 @@ <dd> the generated menu </dd> +</dl><a NAME="ViewManager.initSearchMenu" ID="ViewManager.initSearchMenu"></a> +<h4>ViewManager.initSearchMenu</h4> +<b>initSearchMenu</b>(<i></i>) +<p> + Public method to create the Search menu. +</p><dl> +<dt>Returns:</dt> +<dd> +the generated menu +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +QMenu +</dd> </dl><a NAME="ViewManager.initSearchToolbars" ID="ViewManager.initSearchToolbars"></a> <h4>ViewManager.initSearchToolbars</h4> <b>initSearchToolbars</b>(<i>toolbarManager</i>)
--- a/eric6/Documentation/Source/index-eric6.Debugger.html Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Documentation/Source/index-eric6.Debugger.html Sun Jun 02 11:42:48 2019 +0200 @@ -89,7 +89,7 @@ <td>Module implementing the variables filter dialog.</td> </tr><tr> <td><a href="eric6.Debugger.VariablesViewer.html">VariablesViewer</a></td> -<td>Module implementing the variables viewer widget.</td> +<td>Module implementing the variables viewer view based on QTreeView.</td> </tr><tr> <td><a href="eric6.Debugger.WatchPointModel.html">WatchPointModel</a></td> <td>Module implementing the Watch expression model.</td>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric6/Documentation/Source/index-eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.html Sun Jun 02 11:42:48 2019 +0200 @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<html><head> +<title>eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension</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> +<h1>eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension</h1> +<p> +Package implementing the closehead extension support interface. +</p> + + +<h3>Modules</h3> +<table> +<tr> +<td><a href="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.html">HgCloseHeadSelectionDialog</a></td> +<td>Module implementing a dialog to select the heads to be closed.</td> +</tr><tr> +<td><a href="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.html">ProjectHelper</a></td> +<td>Module implementing the closehead extension project helper.</td> +</tr><tr> +<td><a href="eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead.html">closehead</a></td> +<td>Module implementing the closehead extension interface.</td> +</tr> +</table> +</body></html> \ No newline at end of file
--- a/eric6/Documentation/Source/index-eric6.Plugins.VcsPlugins.vcsMercurial.html Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Documentation/Source/index-eric6.Plugins.VcsPlugins.vcsMercurial.html Sun Jun 02 11:42:48 2019 +0200 @@ -30,6 +30,9 @@ <h3>Packages</h3> <table> <tr> +<td><a href="index-eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.html">CloseheadExtension</a></td> +<td>Package implementing the closehead extension support interface.</td> +</tr><tr> <td><a href="index-eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.html">ConfigurationPage</a></td> <td>Package implementing the the Mercurial configuration page.</td> </tr><tr>
--- a/eric6/E5Gui/E5ModelMenu.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/E5Gui/E5ModelMenu.py Sun Jun 02 11:42:48 2019 +0200 @@ -370,6 +370,10 @@ super(E5ModelMenu, self).mouseMoveEvent(evt) return + if self.__dragStartPosition.isNull(): + super(E5ModelMenu, self).mouseMoveEvent(evt) + return + manhattanLength = (evt.pos() - self.__dragStartPosition).manhattanLength() if manhattanLength <= QApplication.startDragDistance(): @@ -413,6 +417,10 @@ """ self._mouseButton = evt.button() self._keyboardModifiers = evt.modifiers() + + if evt.button() == Qt.LeftButton: + self.__dragStartPosition = QPoint() + super(E5ModelMenu, self).mouseReleaseEvent(evt) def resetFlags(self):
--- a/eric6/Helpviewer/HelpTabWidget.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Helpviewer/HelpTabWidget.py Sun Jun 02 11:42:48 2019 +0200 @@ -116,20 +116,8 @@ self.__closedTabsButton.setEnabled(False) self.__rightCornerWidgetLayout.addWidget(self.__closedTabsButton) - self.__closeButton = QToolButton(self) - self.__closeButton.setIcon(UI.PixmapCache.getIcon("close.png")) - self.__closeButton.setToolTip( - self.tr("Close the current help window")) - self.__closeButton.setEnabled(False) - self.__closeButton.clicked.connect(self.closeBrowser) - self.__rightCornerWidgetLayout.addWidget(self.__closeButton) - if Preferences.getUI("SingleCloseButton") or \ - not hasattr(self, 'setTabsClosable'): - self.__closeButton.show() - else: - self.setTabsClosable(True) - self.tabCloseRequested.connect(self.closeBrowserAt) - self.__closeButton.hide() + self.setTabsClosable(True) + self.tabCloseRequested.connect(self.closeBrowserAt) self.setCornerWidget(self.__rightCornerWidget, Qt.TopRightCorner) @@ -367,7 +355,6 @@ self.__mainWindow.closeAct.setEnabled(True) self.__mainWindow.closeAllAct.setEnabled(True) - self.__closeButton.setEnabled(True) self.__navigationButton.setEnabled(True) if not linkName and not requestData: @@ -737,20 +724,6 @@ for urlbar in self.__stackedUrlBar.urlBars(): urlbar.preferencesChanged() - - if Preferences.getUI("SingleCloseButton") or \ - not hasattr(self, 'setTabsClosable'): - if hasattr(self, 'setTabsClosable'): - self.setTabsClosable(False) - try: - self.tabCloseRequested.disconnect(self.closeBrowserAt) - except TypeError: - pass - self.__closeButton.show() - else: - self.setTabsClosable(True) - self.tabCloseRequested.connect(self.closeBrowserAt) - self.__closeButton.hide() def __loadStarted(self, browser): """
--- a/eric6/PluginManager/PluginManager.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/PluginManager/PluginManager.py Sun Jun 02 11:42:48 2019 +0200 @@ -399,7 +399,7 @@ "Module is missing the Python2 compatibility flag." " Please update.") compatible = False - elif not getattr(module, "python2Compatible"): + elif not getattr(module, "python2Compatible", True): module.error = self.tr( "Module is not Python2 compatible.") compatible = False @@ -408,7 +408,7 @@ if not compatible: self.__failedModules[name] = module raise PluginPy2IncompatibleError(name) - if getattr(module, "autoactivate"): + if getattr(module, "autoactivate", False): self.__inactiveModules[name] = module else: if not hasattr(module, "pluginType") or \ @@ -538,8 +538,8 @@ if not self.__canActivatePlugin(module): raise PluginActivationError(module.eric6PluginModuleName) - version = getattr(module, "version") - className = getattr(module, "className") + version = getattr(module, "version", "0.0.0") + className = getattr(module, "className", "") pluginClass = getattr(module, className) pluginObject = None if name not in self.__onDemandInactivePlugins: @@ -608,8 +608,8 @@ if not self.__canActivatePlugin(module): raise PluginActivationError(module.eric6PluginModuleName) - version = getattr(module, "version") - className = getattr(module, "className") + version = getattr(module, "version", "0.0.0") + className = getattr(module, "className", "") pluginClass = getattr(module, className) pluginObject = None if onDemand and name in self.__onDemandInactivePlugins: @@ -677,8 +677,8 @@ if not hasattr(module, "className"): raise PluginModuleFormatError( module.eric6PluginModuleName, "className") - className = getattr(module, "className") - if not hasattr(module, className): + className = getattr(module, "className", "") + if not className or not hasattr(module, className): raise PluginModuleFormatError( module.eric6PluginModuleName, className) pluginClass = getattr(module, className) @@ -765,14 +765,14 @@ @return reference to the initialized plugin object """ for name, module in list(self.__onDemandInactiveModules.items()): - if getattr(module, "pluginType") == type_ and \ - getattr(module, "pluginTypename") == typename: + if getattr(module, "pluginType", "") == type_ and \ + getattr(module, "pluginTypename", "") == typename: return self.activatePlugin(name, onDemand=True) if maybeActive: for name, module in list(self.__onDemandActiveModules.items()): - if getattr(module, "pluginType") == type_ and \ - getattr(module, "pluginTypename") == typename: + if getattr(module, "pluginType", "") == type_ and \ + getattr(module, "pluginTypename", "") == typename: self.deactivatePlugin(name, onDemand=True) return self.activatePlugin(name, onDemand=True) @@ -930,18 +930,19 @@ for module in list(self.__onDemandActiveModules.values()) + \ list(self.__onDemandInactiveModules.values()): - if getattr(module, "pluginType") == type_ and \ + if getattr(module, "pluginType", "") == type_ and \ getattr(module, "error", "") == "": - plugin_name = getattr(module, "pluginTypename") - if hasattr(module, "displayString"): - try: - disp = module.displayString() - except TypeError: - disp = getattr(module, "displayString") - if disp != "": - pluginDict[plugin_name] = disp - else: - pluginDict[plugin_name] = plugin_name + plugin_name = getattr(module, "pluginTypename", "") + if plugin_name: + if hasattr(module, "displayString"): + try: + disp = module.displayString() + except TypeError: + disp = getattr(module, "displayString", "") + if disp != "": + pluginDict[plugin_name] = disp + else: + pluginDict[plugin_name] = plugin_name return pluginDict @@ -955,8 +956,8 @@ """ for module in list(self.__onDemandActiveModules.values()) + \ list(self.__onDemandInactiveModules.values()): - if getattr(module, "pluginType") == type_ and \ - getattr(module, "pluginTypename") == name: + if getattr(module, "pluginType", "") == type_ and \ + getattr(module, "pluginTypename", "") == name: if hasattr(module, "previewPix"): return module.previewPix() else: @@ -1134,7 +1135,7 @@ for module in list(self.__onDemandActiveModules.values()) + \ list(self.__onDemandInactiveModules.values()): - if getattr(module, "pluginType") == "version_control": + if getattr(module, "pluginType", "") == "version_control": if hasattr(module, "getVcsSystemIndicator"): res = module.getVcsSystemIndicator() for indicator, vcsData in list(res.items()): @@ -1150,7 +1151,7 @@ Public method to deactivated all activated VCS plugins. """ for name, module in list(self.__onDemandActiveModules.items()): - if getattr(module, "pluginType") == "version_control": + if getattr(module, "pluginType", "") == "version_control": self.deactivatePlugin(name, True) ########################################################################
--- a/eric6/PluginManager/PluginUninstallDialog.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/PluginManager/PluginUninstallDialog.py Sun Jun 02 11:42:48 2019 +0200 @@ -127,7 +127,7 @@ """ attribute. Aborting...</p>""").format(pluginName)) return False - package = getattr(module, "packageName") + package = getattr(module, "packageName", None) if package is None: package = "None" packageDir = ""
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/MiscellaneousChecker.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/MiscellaneousChecker.py Sun Jun 02 11:42:48 2019 +0200 @@ -46,8 +46,10 @@ "M201", - "M501", "M502", "M503", "M504", "M505", "M506", "M507", - "M511", "M512", "M513", "M514", + "M501", "M502", "M503", "M504", "M505", "M506", "M507", "M508", + "M509", + "M511", "M512", "M513", + "M521", "M522", "M523", "M524", "M601", "M611", "M612", "M613", @@ -133,8 +135,9 @@ "M621", "M622", "M623", "M624", "M625", "M631", "M632")), (self.__checkBugBear, ("M501", "M502", "M503", "M504", "M505", - "M506", "M507", - "M511", "M512", "M513", "M514")), + "M506", "M507", "M508", "M509", + "M511", "M512", "M513", + "M521", "M522", "M523", "M524")), (self.__checkLogging, ("M651", "M652", "M653", "M654", "M655")), (self.__checkFuture, ("M701", "M702")), (self.__checkGettext, ("M711",)), @@ -653,6 +656,10 @@ "list", "set", ) + immutableCalls = ( + "tuple", + "frozenset", + ) functionDefs = [ast.FunctionDef] try: functionDefs.append(ast.AsyncFunctionDef) @@ -662,7 +669,7 @@ for node in ast.walk(self.__tree): if any(isinstance(node, functionDef) for functionDef in functionDefs): - for default in node.args.defaults: + for default in node.args.defaults + node.args.kw_defaults: if any(isinstance(default, mutableType) for mutableType in mutableTypes): typeName = type(default).__name__ @@ -672,7 +679,7 @@ self.__error(default.lineno - 1, default.col_offset, "M823", callPath + "()") - else: + elif callPath not in immutableCalls: self.__error(default.lineno - 1, default.col_offset, "M822", typeName) @@ -731,7 +738,7 @@ def __checkBugBear(self): """ - Private method to bugbear checks. + Private method for bugbear checks. """ visitor = BugBearVisitor() visitor.visit(self.__tree) @@ -1079,7 +1086,7 @@ Class implementing a node visitor to check for various topics. """ # - # This class was implemented along the BugBear flake8 extension (v 18.2.0). + # This class was implemented along the BugBear flake8 extension (v 19.3.0). # Original: Copyright (c) 2016 Łukasz Langa # @@ -1135,9 +1142,9 @@ if sys.version_info >= (3, 0): validPaths = ("six", "future.utils", "builtins") methodsDict = { - "M511": ("iterkeys", "itervalues", "iteritems", "iterlists"), - "M512": ("viewkeys", "viewvalues", "viewitems", "viewlists"), - "M513": ("next",), + "M521": ("iterkeys", "itervalues", "iteritems", "iterlists"), + "M522": ("viewkeys", "viewvalues", "viewitems", "viewlists"), + "M523": ("next",), } else: validPaths = () @@ -1154,11 +1161,36 @@ self.__checkForM502(node) else: try: + # bad super() call + if isinstance(node.func, ast.Name) and node.func.id == "super": + args = node.args + if ( + len(args) == 2 and + isinstance(args[0], ast.Attribute) and + isinstance(args[0].value, ast.Name) and + args[0].value.id == 'self' and + args[0].attr == '__class__' + ): + self.violations.append((node, "M509")) + + # bad getattr and setattr if ( node.func.id in ("getattr", "hasattr") and node.args[1].s == "__call__" ): - self.violations.append((node, "M503")) + self.violations.append((node, "M511")) + if ( + node.func.id == "getattr" and + len(node.args) == 2 and + isinstance(node.args[1], ast.Str) + ): + self.violations.append((node, "M512")) + elif ( + node.func.id == "setattr" and + len(node.args) == 3 and + isinstance(node.args[1], ast.Str) + ): + self.violations.append((node, "M513")) except (AttributeError, IndexError): pass @@ -1196,7 +1228,7 @@ # and tuples for simplicity. assignTargets = {t.id for t in node.targets if hasattr(t, 'id')} if '__metaclass__' in assignTargets and sys.version_info >= (3, 0): - self.violations.append((node, "M514")) + self.violations.append((node, "M524")) elif len(node.targets) == 1: target = node.targets[0] @@ -1218,6 +1250,33 @@ self.generic_visit(node) + def visit_Assert(self, node): + """ + Public method to handle 'assert' statements. + + @param node reference to the node to be processed + @type ast.Assert + """ + if isinstance(node.test, ast.NameConstant) and \ + node.test.value is False: + self.violations.append((node, "M503")) + + self.generic_visit(node) + + def visit_JoinedStr(self, node): + """ + Public method to handle f-string arguments. + + @param node reference to the node to be processed + @type ast.JoinedStr + """ + if sys.version_info >= (3, 6): + for value in node.values: + if isinstance(value, ast.FormattedValue): + return + + self.violations.append((node, "M508")) + def __checkForM502(self, node): """ Private method to check the use of *strip().
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/translations.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/translations.py Sun Jun 02 11:42:48 2019 +0200 @@ -534,8 +534,7 @@ "using .strip() with multi-character strings is misleading"), "M503": QCoreApplication.translate( "MiscellaneousChecker", - """using 'hasattr(x, "__call__")' to test if 'x' is callable is""" - """ unreliable"""), + "do not call assert False since python -O removes these calls"), "M504": QCoreApplication.translate( "MiscellaneousChecker", "'sys.maxint' is not defined in Python 3 - use 'sys.maxsize'"), @@ -551,16 +550,32 @@ "MiscellaneousChecker", "loop control variable {0} not used within the loop body -" " start the name with an underscore"), + "M508": QCoreApplication.translate( + "MiscellaneousChecker", + "unncessary f-string"), + "M509": QCoreApplication.translate( + "MiscellaneousChecker", + "cannot use 'self.__class__' as first argument of 'super()' call"), "M511": QCoreApplication.translate( "MiscellaneousChecker", - "Python 3 does not include '.iter*' methods on dictionaries"), + """using 'hasattr(x, "__call__")' to test if 'x' is callable is""" + """ unreliable"""), "M512": QCoreApplication.translate( "MiscellaneousChecker", - "Python 3 does not include '.view*' methods on dictionaries"), + "do not call getattr with a constant attribute value"), "M513": QCoreApplication.translate( "MiscellaneousChecker", + "do not call setattr with a constant attribute value"), + "M521": QCoreApplication.translate( + "MiscellaneousChecker", + "Python 3 does not include '.iter*' methods on dictionaries"), + "M522": QCoreApplication.translate( + "MiscellaneousChecker", + "Python 3 does not include '.view*' methods on dictionaries"), + "M523": QCoreApplication.translate( + "MiscellaneousChecker", "'.next()' does not exist in Python 3"), - "M514": QCoreApplication.translate( + "M524": QCoreApplication.translate( "MiscellaneousChecker", "'__metaclass__' does nothing on Python 3 -" " use 'class MyClass(BaseClass, metaclass=...)'"),
--- a/eric6/Plugins/PluginVcsMercurial.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Plugins/PluginVcsMercurial.py Sun Jun 02 11:42:48 2019 +0200 @@ -175,6 +175,7 @@ "EncodingMode": "strict", "ConsiderHidden": False, "LogMessageColumnWidth": 30, + "LogBrowserShowFullLog": True, "LogBrowserGeometry": QByteArray(), "LogBrowserSplitterStates": [QByteArray(), QByteArray(), QByteArray()], @@ -266,7 +267,8 @@ @return the requested setting """ if key in ["StopLogOnCopy", "PullUpdate", "PreferUnbundle", - "CreateBackup", "InternalMerge", "ConsiderHidden"]: + "CreateBackup", "InternalMerge", "ConsiderHidden", + "LogBrowserShowFullLog"]: return Preferences.toBool(Preferences.Prefs.settings.value( "Mercurial/" + key, cls.MercurialDefaults[key])) elif key in ["LogLimit", "CommitMessages", "CommitAuthorsLimit",
--- a/eric6/Plugins/VcsPlugins/vcsGit/git.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Plugins/VcsPlugins/vcsGit/git.py Sun Jun 02 11:42:48 2019 +0200 @@ -109,6 +109,8 @@ self.__commitDialog = None self.__patchCheckData = None + + self.__projectHelper = None def getPlugin(self): """ @@ -158,7 +160,8 @@ self.submoduleStatusDialog.close() # shut down the project helpers - self.__projectHelper.shutdown() + if self.__projectHelper is not None: + self.__projectHelper.shutdown() def initCommand(self, command): """
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric6/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/HgCloseHeadSelectionDialog.py Sun Jun 02 11:42:48 2019 +0200 @@ -0,0 +1,113 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2019 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a dialog to select the heads to be closed. +""" + +from __future__ import unicode_literals + +import os + +from PyQt5.QtCore import pyqtSlot, QProcess +from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QTreeWidgetItem + +from .Ui_HgCloseHeadSelectionDialog import Ui_HgCloseHeadSelectionDialog + + +class HgCloseHeadSelectionDialog(QDialog, Ui_HgCloseHeadSelectionDialog): + """ + Class implementing a dialog to select the heads to be closed. + """ + def __init__(self, vcs, ppath, parent=None): + """ + Constructor + + @param vcs reference to the VCS object + @type Hg + @param ppath directory containing the repository + @type str + @param parent reference to the parent widget + @type QWidget + """ + super(HgCloseHeadSelectionDialog, self).__init__(parent) + self.setupUi(self) + + self.buttonBox.button(QDialogButtonBox.Cancel).setDefault(True) + self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(False) + + heads = self.__getHeads(vcs, ppath) + for revision, branch in heads: + QTreeWidgetItem(self.headsList, [revision, branch]) + + def __getHeads(self, vcs, ppath): + """ + Private method to get the open heads. + + @param vcs reference to the VCS object + @type Hg + @param ppath directory containing the repository + @type str + @return list of tuples containing the revision and the corresponding + branch name + @rtype list of tuples of (str, str) + """ + args = vcs.initCommand("heads") + args.append('--template') + args.append('{node|short}@@@{branches}\n') + + output = "" + client = vcs.getClient() + if client is None: + # find the root of the repo + repodir = self.splitPath(ppath)[0] + while not os.path.isdir(os.path.join(repodir, self.adminDir)): + repodir = os.path.dirname(repodir) + if os.path.splitdrive(repodir)[1] == os.sep: + return [] + + process = QProcess() + process.setWorkingDirectory(repodir) + process.start('hg', args) + procStarted = process.waitForStarted(5000) + if procStarted: + finished = process.waitForFinished(30000) + if finished and process.exitCode() == 0: + output = str(process.readAllStandardOutput(), + self.getEncoding(), 'replace') + else: + output, error = client.runcommand(args) + + heads = [] + if output: + for line in output.splitlines(): + line = line.strip() + if line: + revision, branch = line.split("@@@") + heads.append((revision, branch)) + + return heads + + @pyqtSlot() + def on_headsList_itemSelectionChanged(self): + """ + Private slot handling changes of the selection. + """ + self.buttonBox.button(QDialogButtonBox.Ok).setEnabled( + len(self.headsList.selectedItems()) > 0 + ) + + def getData(self): + """ + Public method to retrieve the entered data. + + @return tuple containing a list of selected revisions and the commit + message + @rtype tuple of (list of str, str) + """ + revisions = [itm.text(0) for itm in self.headsList.selectedItems()] + message = self.logEdit.toPlainText().strip() + + return revisions, message
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric6/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/HgCloseHeadSelectionDialog.ui Sun Jun 02 11:42:48 2019 +0200 @@ -0,0 +1,130 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>HgCloseHeadSelectionDialog</class> + <widget class="QDialog" name="HgCloseHeadSelectionDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>532</width> + <height>402</height> + </rect> + </property> + <property name="windowTitle"> + <string>Close Heads</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Select heads to be closed:</string> + </property> + </widget> + </item> + <item> + <widget class="QTreeWidget" name="headsList"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>2</verstretch> + </sizepolicy> + </property> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + <property name="selectionMode"> + <enum>QAbstractItemView::ExtendedSelection</enum> + </property> + <property name="rootIsDecorated"> + <bool>false</bool> + </property> + <column> + <property name="text"> + <string>Revision</string> + </property> + </column> + <column> + <property name="text"> + <string>Branch</string> + </property> + </column> + </widget> + </item> + <item> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Commit Message:</string> + </property> + </widget> + </item> + <item> + <widget class="QTextEdit" name="logEdit"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>1</verstretch> + </sizepolicy> + </property> + <property name="tabChangesFocus"> + <bool>true</bool> + </property> + <property name="acceptRichText"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <tabstops> + <tabstop>headsList</tabstop> + <tabstop>logEdit</tabstop> + </tabstops> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>HgCloseHeadSelectionDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>HgCloseHeadSelectionDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric6/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/ProjectHelper.py Sun Jun 02 11:42:48 2019 +0200 @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2019 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing the closehead extension project helper. +""" + +from __future__ import unicode_literals + +from PyQt5.QtWidgets import QMenu + +from E5Gui.E5Action import E5Action + +from ..HgExtensionProjectHelper import HgExtensionProjectHelper + +import UI.PixmapCache + + +class CloseheadProjectHelper(HgExtensionProjectHelper): + """ + Class implementing the closehead extension project helper. + """ + def __init__(self): + """ + Constructor + """ + super(CloseheadProjectHelper, self).__init__() + + def initActions(self): + """ + Public method to generate the action objects. + """ + self.hgCloseheadAct = E5Action( + self.tr('Close Heads'), + UI.PixmapCache.getIcon("closehead"), + self.tr('Close Heads'), + 0, 0, self, 'mercurial_closehead') + self.hgCloseheadAct.setStatusTip(self.tr( + 'Close arbitrary heads without checking them out first' + )) + self.hgCloseheadAct.setWhatsThis(self.tr( + """<b>Close Heads</b>""" + """<p>This closes arbitrary heads without the need to check them""" + """ out first.</p>""" + )) + self.hgCloseheadAct.triggered.connect(self.__hgClosehead) + self.actions.append(self.hgCloseheadAct) + + def initMenu(self, mainMenu): + """ + Public method to generate the extension menu. + + @param mainMenu reference to the main menu + @type QMenu + @return populated menu (QMenu) + """ + menu = QMenu(self.menuTitle(), mainMenu) + menu.setIcon(UI.PixmapCache.getIcon("closehead")) + menu.setTearOffEnabled(True) + + menu.addAction(self.hgCloseheadAct) + + return menu + + def menuTitle(self): + """ + Public method to get the menu title. + + @return title of the menu + @rtype str + """ + return self.tr("Close Heads") + + def __hgClosehead(self): + """ + Private slot used to close arbitrary heads. + """ + self.vcs.getExtensionObject("closehead")\ + .hgCloseheads(self.project.getProjectPath())
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric6/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/__init__.py Sun Jun 02 11:42:48 2019 +0200 @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2019 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Package implementing the closehead extension support interface. +"""
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric6/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/closehead.py Sun Jun 02 11:42:48 2019 +0200 @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2019 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing the closehead extension interface. +""" + +from __future__ import unicode_literals + +import os + +from PyQt5.QtWidgets import QDialog + +from ..HgExtension import HgExtension +from ..HgDialog import HgDialog + + +class Closehead(HgExtension): + """ + Class implementing the strip extension interface. + """ + def __init__(self, vcs): + """ + Constructor + + @param vcs reference to the Mercurial vcs object + @type Hg + """ + super(Closehead, self).__init__(vcs) + + def hgCloseheads(self, name, revisions=None): + """ + Public method to close arbitrary heads. + + @param name file/directory name + @type str + @param revisions revisions of branch heads to be closed + @type str + """ + # find the root of the repo + repodir = self.vcs.splitPath(name)[0] + while not os.path.isdir(os.path.join(repodir, self.vcs.adminDir)): + repodir = os.path.dirname(repodir) + if os.path.splitdrive(repodir)[1] == os.sep: + return + + message = "" + if not revisions: + from .HgCloseHeadSelectionDialog import HgCloseHeadSelectionDialog + dlg = HgCloseHeadSelectionDialog(self.vcs, name) + if dlg.exec_() == QDialog.Accepted: + revisions, message = dlg.getData() + + if not revisions: + # still no revisions given; abort... + return + + args = self.vcs.initCommand("close-head") + if not message: + if len(revisions) == 1: + message = self.tr("Revision <{0}> closed.").format( + revisions[0]) + else: + message = self.tr("Revisions <{0}> closed.").format( + ", ".join(revisions)) + args += ["--message", message] + for revision in revisions: + args += ["--rev", revision] + + dia = HgDialog(self.tr("Closing Heads"), self.vcs) + res = dia.startProcess(args, repodir) + if res: + dia.exec_()
--- a/eric6/Plugins/VcsPlugins/vcsMercurial/ConfigurationPage/MercurialPage.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Plugins/VcsPlugins/vcsMercurial/ConfigurationPage/MercurialPage.py Sun Jun 02 11:42:48 2019 +0200 @@ -52,6 +52,8 @@ self.__plugin.getPreferences("LogLimit")) self.logWidthSpinBox.setValue( self.__plugin.getPreferences("LogMessageColumnWidth")) + self.startFullLogCheckBox.setChecked( + self.__plugin.getPreferences("LogBrowserShowFullLog")) # commit self.commitSpinBox.setValue( self.__plugin.getPreferences("CommitMessages")) @@ -88,6 +90,8 @@ "LogLimit", self.logSpinBox.value()) self.__plugin.setPreferences( "LogMessageColumnWidth", self.logWidthSpinBox.value()) + self.__plugin.setPreferences( + "LogBrowserShowFullLog", self.startFullLogCheckBox.isChecked()) # commit self.__plugin.setPreferences( "CommitMessages", self.commitSpinBox.value())
--- a/eric6/Plugins/VcsPlugins/vcsMercurial/ConfigurationPage/MercurialPage.ui Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Plugins/VcsPlugins/vcsMercurial/ConfigurationPage/MercurialPage.ui Sun Jun 02 11:42:48 2019 +0200 @@ -93,6 +93,19 @@ <string>Log</string> </property> <layout class="QGridLayout" name="gridLayout_3"> + <item row="1" column="1"> + <widget class="QSpinBox" name="logWidthSpinBox"> + <property name="toolTip"> + <string>Enter the number of characters of the commit message to be shown in the list</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + <property name="minimum"> + <number>10</number> + </property> + </widget> + </item> <item row="0" column="0"> <widget class="QLabel" name="label"> <property name="text"> @@ -113,6 +126,13 @@ </property> </widget> </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_7"> + <property name="text"> + <string>No. of message characters shown in list:</string> + </property> + </widget> + </item> <item row="0" column="2"> <spacer> <property name="orientation"> @@ -126,23 +146,13 @@ </property> </spacer> </item> - <item row="1" column="0"> - <widget class="QLabel" name="label_7"> - <property name="text"> - <string>No. of message characters shown in list:</string> + <item row="2" column="0" colspan="3"> + <widget class="QCheckBox" name="startFullLogCheckBox"> + <property name="toolTip"> + <string>Select to show all incoming and the first batch of local changesets</string> </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QSpinBox" name="logWidthSpinBox"> - <property name="toolTip"> - <string>Enter the number of characters of the commit message to be shown in the list</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - <property name="minimum"> - <number>10</number> + <property name="text"> + <string>Start showing incoming and local changesets</string> </property> </widget> </item> @@ -359,6 +369,7 @@ <tabstop>hiddenChangesetsCheckBox</tabstop> <tabstop>logSpinBox</tabstop> <tabstop>logWidthSpinBox</tabstop> + <tabstop>startFullLogCheckBox</tabstop> <tabstop>commitSpinBox</tabstop> <tabstop>commitAuthorsSpinBox</tabstop> <tabstop>pullUpdateCheckBox</tabstop>
--- a/eric6/Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py Sun Jun 02 11:42:48 2019 +0200 @@ -63,13 +63,16 @@ ClosedIndicator = " \u2612" - def __init__(self, vcs, mode="log", parent=None): + def __init__(self, vcs, mode="", parent=None): """ Constructor @param vcs reference to the vcs object - @param mode mode of the dialog (string; one of log, incoming, outgoing) - @param parent parent widget (QWidget) + @type Hg + @param mode mode of the dialog + @type str (one of log, full_log, incoming, outgoing) + @param parent parent widget + @type QWidget """ super(HgLogBrowserDialog, self).__init__(parent) self.setupUi(self) @@ -84,12 +87,20 @@ self.diffSplitter.setStretchFactor(0, 1) self.diffSplitter.setStretchFactor(1, 2) + if not mode: + if vcs.getPlugin().getPreferences("LogBrowserShowFullLog"): + mode = "full_log" + else: + mode = "log" + if mode == "log": self.setWindowTitle(self.tr("Mercurial Log")) elif mode == "incoming": self.setWindowTitle(self.tr("Mercurial Log (Incoming)")) elif mode == "outgoing": self.setWindowTitle(self.tr("Mercurial Log (Outgoing)")) + elif mode == "full_log": + self.setWindowTitle(self.tr("Mercurial Full Log")) self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False) self.buttonBox.button(QDialogButtonBox.Cancel).setDefault(True) @@ -117,6 +128,7 @@ self.fieldCombo.addItem(self.tr("Author"), "author") self.fieldCombo.addItem(self.tr("Message"), "message") self.fieldCombo.addItem(self.tr("File"), "file") + self.fieldCombo.addItem(self.tr("Phase"), "phase") font = Preferences.getEditorOtherFonts("MonospacedFont") self.diffEdit.setFontFamily(font.family()) @@ -127,8 +139,11 @@ self.__diffGenerator.finished.connect(self.__generatorFinished) self.vcs = vcs - if mode in ("log", "incoming", "outgoing"): - self.commandMode = mode + if mode in ("log", "incoming", "outgoing", "full_log"): + if mode == "full_log": + self.commandMode = "incoming" + else: + self.commandMode = mode self.initialCommandMode = mode else: self.commandMode = "log" @@ -181,6 +196,7 @@ self.__edgesRole = Qt.UserRole + 2 self.__parentsRole = Qt.UserRole + 3 self.__latestTagRole = Qt.UserRole + 4 + self.__incomingRole = Qt.UserRole + 5 # roles used in the file tree self.__diffFileLineRole = Qt.UserRole @@ -224,6 +240,8 @@ self.__initActionsMenu() self.__finishCallbacks = [] + if self.initialCommandMode == "full_log": + self.__addFinishCallback(self.on_nextButton_clicked) def __addFinishCallback(self, callback): """ @@ -275,6 +293,11 @@ self.__tagActTriggered) self.__tagAct.setToolTip(self.tr("Tag the selected revision")) + self.__closeHeadsAct = self.__actionsMenu.addAction( + UI.PixmapCache.getIcon("closehead"), self.tr("Close Heads"), + self.__closeHeadsActTriggered) + self.__closeHeadsAct.setToolTip(self.tr("Close the selected heads")) + self.__switchAct = self.__actionsMenu.addAction( UI.PixmapCache.getIcon("vcsSwitch.png"), self.tr("Switch"), self.__switchActTriggered) @@ -499,7 +522,10 @@ self.logTree.clear() - self.commandMode = self.initialCommandMode + if self.initialCommandMode == "full_log": + self.commandMode = "incoming" + else: + self.commandMode = self.initialCommandMode def __resizeColumnsLog(self): """ @@ -595,23 +621,31 @@ return col, color, edges def __generateIcon(self, column, color, bottomedges, topedges, dotColor, - currentRev, closed): + currentRev, closed, isDraft): """ Private method to generate an icon containing the revision tree for the given data. - @param column column index of the revision (integer) - @param color color of the node (integer) + @param column column index of the revision + @type int + @param color color of the node + @type int @param bottomedges list of edges for the bottom of the node - (list of tuples of three integers) + @type list of tuples of (int, int, int) @param topedges list of edges for the top of the node - (list of tuples of three integers) - @param dotColor color to be used for the dot (QColor) + @type list of tuples of (int, int, int) + @param dotColor color to be used for the dot + @type QColor @param currentRev flag indicating to draw the icon for the - current revision (boolean) + current revision + @type bool @param closed flag indicating to draw an icon for a closed - branch (boolean) - @return icon for the node (QIcon) + branch + @type bool + @param isDraft flag indicating an entry of phase 'draft' + @type bool + @return icon for the node + @rtype QIcon """ def col2x(col, radius): """ @@ -678,21 +712,30 @@ elif self.commandMode in ("incoming", "outgoing"): offset = radius // 2 if self.commandMode == "incoming": - # incoming, draw a down arrow + # incoming: draw a down arrow painter.drawConvexPolygon( QPoint(dot_x, dot_y), QPoint(dot_x + 2 * offset, dot_y), QPoint(dot_x + offset, dot_y + 2 * offset) ) else: - # outgoing, draw an up arrow + # outgoing: draw an up arrow painter.drawConvexPolygon( QPoint(dot_x + offset, dot_y), QPoint(dot_x, dot_y + 2 * offset), QPoint(dot_x + 2 * offset, dot_y + 2 * offset) ) else: - painter.drawEllipse(dot_x, dot_y, radius, radius) + if isDraft: + # 'draft' phase: draw an up arrow like outgoing + offset = radius // 2 + painter.drawConvexPolygon( + QPoint(dot_x + offset, dot_y), + QPoint(dot_x, dot_y + 2 * offset), + QPoint(dot_x + 2 * offset, dot_y + 2 * offset) + ) + else: + painter.drawEllipse(dot_x, dot_y, radius, radius) painter.end() return QIcon(pix) @@ -841,6 +884,50 @@ self.__closedBranchesRevs.append( parts[-2].split(":", 1)[0]) + def __getHeads(self): + """ + Private method to get the list of all heads. + """ + self.__headRevisions = [] + errMsg = "" + + args = self.vcs.initCommand("heads") + args.append("--closed") + args.append("--template") + args.append("{rev}\n") + + output = "" + if self.__hgClient: + output, errMsg = self.__hgClient.runcommand(args) + else: + process = QProcess() + process.setWorkingDirectory(self.repodir) + process.start('hg', args) + procStarted = process.waitForStarted(5000) + if procStarted: + finished = process.waitForFinished(30000) + if finished and process.exitCode() == 0: + output = str(process.readAllStandardOutput(), + self.vcs.getEncoding(), 'replace') + else: + if not finished: + errMsg = self.tr( + "The hg process did not finish within 30s.") + else: + errMsg = self.tr("Could not start the hg executable.") + + if errMsg: + E5MessageBox.critical( + self, + self.tr("Mercurial Error"), + errMsg) + + if output: + for line in output.splitlines(): + line = line.strip() + if line: + self.__headRevisions.append(line) + def __getRevisionOfTag(self, tag): """ Private method to get the revision of a tag. @@ -970,6 +1057,7 @@ itm.setData(0, self.__parentsRole, parents) for parent in parents: self.__childrenInfo[parent].append(int(rev)) + itm.setData(0, self.__incomingRole, self.commandMode == "incoming") if self.logTree.topLevelItemCount() > 1: topedges = \ @@ -982,7 +1070,8 @@ icon = self.__generateIcon(column, color, edges, topedges, QColor(self.__branchColor(branches[0])), rev == self.__projectRevision, - rev in self.__closedBranchesRevs) + rev in self.__closedBranchesRevs, + phase == "draft") itm.setIcon(0, icon) try: @@ -1064,7 +1153,12 @@ else: err = "" if err: - self.__showError(err) + if self.commandMode == "incoming" and \ + self.initialCommandMode == "full_log": + # ignore the error + self.commandMode = "log" + else: + self.__showError(err) elif self.commandMode != "incoming" or \ (self.vcs.bundleFile and os.path.exists(self.vcs.bundleFile)) or \ @@ -1074,6 +1168,10 @@ if err: self.__showError(err) self.__processBuffer() + elif self.commandMode == "incoming" and \ + self.initialCommandMode == "full_log": + # no incoming changesets, just switch to log mode + self.commandMode = "log" self.__finish() else: self.process.kill() @@ -1120,9 +1218,18 @@ self.__bundle = bundle self.__isFile = isFile + if self.initialCommandMode == "full_log": + if isFile: + self.commandMode = "log" + self.__finishCallbacks = [] + else: + self.commandMode = "incoming" + self.__addFinishCallback(self.on_nextButton_clicked) + self.sbsSelectLabel.clear() self.errorGroup.hide() + self.errors.clear() QApplication.processEvents() self.__initData() @@ -1146,6 +1253,7 @@ self.__started = True self.__identifyProject() self.__getClosedBranches() + self.__getHeads() self.__getLogEntries(noEntries=noEntries) def __procFinished(self, exitCode, exitStatus): @@ -1311,17 +1419,20 @@ self.__resizeColumnsLog() if self.__started: - if self.__selectedRevisions: - foundItems = self.logTree.findItems( - self.__selectedRevisions[0], Qt.MatchExactly, - self.RevisionColumn) - if foundItems: - self.logTree.setCurrentItem(foundItems[0]) + if not self.__finishCallbacks: + # we are really done + if self.__selectedRevisions: + foundItems = self.logTree.findItems( + self.__selectedRevisions[0], Qt.MatchExactly, + self.RevisionColumn) + if foundItems: + self.logTree.setCurrentItem(foundItems[0]) + else: + self.logTree.setCurrentItem( + self.logTree.topLevelItem(0)) else: self.logTree.setCurrentItem(self.logTree.topLevelItem(0)) - else: - self.logTree.setCurrentItem(self.logTree.topLevelItem(0)) - self.__started = False + self.__started = False if self.commandMode in ("incoming", "outgoing"): self.commandMode = "log" # switch to log mode @@ -1356,8 +1467,9 @@ self.__filterLogs() self.__updateToolMenuActions() - # restore current item - if self.__selectedRevisions: + # restore selected item + if self.__selectedRevisions and not self.__finishCallbacks: + # we are really done for revision in self.__selectedRevisions: items = self.logTree.findItems( revision, Qt.MatchExactly, self.RevisionColumn) @@ -1460,13 +1572,15 @@ Private slot to update the status of the tool menu actions and the tool menu button. """ - if self.initialCommandMode == "log" and self.projectMode: + if self.initialCommandMode in ("log", "full_log") and self.projectMode: # do the phase action # step 1: count entries with changeable phases secret = 0 draft = 0 public = 0 - for itm in self.logTree.selectedItems(): + for itm in [item for item in self.logTree.selectedItems() + if not item.data(0, self.__incomingRole)]: + # count phase for local items only phase = itm.text(self.PhaseColumn) if phase == self.phases["draft"]: draft += 1 @@ -1487,7 +1601,9 @@ # step 1: count selected entries not belonging to the # current branch otherBranches = 0 - for itm in self.logTree.selectedItems(): + for itm in [item for item in self.logTree.selectedItems() + if not item.data(0, self.__incomingRole)]: + # for local items only branch = itm.text(self.BranchColumn) if branch != self.__projectBranch: otherBranches += 1 @@ -1495,15 +1611,27 @@ # step 2: set the status of the graft action self.__graftAct.setEnabled(otherBranches > 0) - selectedItemsCount = len(self.logTree.selectedItems()) + selectedItemsCount = len([ + itm for itm in self.logTree.selectedItems() + if not itm.data(0, self.__incomingRole) + ]) + selectedIncomingItemsCount = len([ + itm for itm in self.logTree.selectedItems() + if itm.data(0, self.__incomingRole) + ]) + self.__mergeAct.setEnabled(selectedItemsCount == 1) self.__tagAct.setEnabled(selectedItemsCount == 1) self.__switchAct.setEnabled(selectedItemsCount == 1) self.__bookmarkAct.setEnabled(selectedItemsCount == 1) self.__bookmarkMoveAct.setEnabled(selectedItemsCount == 1) - self.__pullAct.setText(self.tr("Pull Changes")) - self.__fetchAct.setText(self.tr("Fetch Changes")) + if selectedIncomingItemsCount > 0: + self.__pullAct.setText(self.tr("Pull Selected Changes")) + self.__fetchAct.setText(self.tr("Fetch Selected Changes")) + else: + self.__pullAct.setText(self.tr("Pull Changes")) + self.__fetchAct.setText(self.tr("Fetch Changes")) if self.vcs.canPull(): self.__pullAct.setEnabled(True) self.__lfPullAct.setEnabled( @@ -1519,6 +1647,8 @@ if self.vcs.canPush(): self.__pushAct.setEnabled( selectedItemsCount == 1 and + not self.logTree.selectedItems()[0].data( + 0, self.__incomingRole) and self.logTree.selectedItems()[0].text(self.PhaseColumn) == self.phases["draft"]) self.__pushAllAct.setEnabled(True) @@ -1530,7 +1660,20 @@ self.vcs.isExtensionActive("strip") and selectedItemsCount == 1) - self.__bundleAct.setEnabled(self.logTree.topLevelItemCount() > 0) + # count incoming items for 'full_log' + if self.initialCommandMode == "full_log": + # incoming items are at the top + incomingCount = 0 + for row in range(self.logTree.topLevelItemCount()): + if self.logTree.topLevelItem(row).data( + 0, self.__incomingRole): + incomingCount += 1 + else: + break + localCount = self.logTree.topLevelItemCount() - incomingCount + else: + localCount = self.logTree.topLevelItemCount() + self.__bundleAct.setEnabled(localCount > 0) self.__unbundleAct.setEnabled(False) self.__gpgSignAct.setEnabled( @@ -1540,33 +1683,39 @@ self.vcs.isExtensionActive("gpg") and selectedItemsCount == 1) + if self.vcs.isExtensionActive("closehead"): + revs = [itm.text(self.RevisionColumn).strip().split(":", 1)[0] + for itm in self.logTree.selectedItems() + if not itm.data(0, self.__incomingRole)] + revs = [rev for rev in revs if rev in self.__headRevisions] + self.__closeHeadsAct.setEnabled(len(revs) > 0) + else: + self.__closeHeadsAct.setEnabled(False) self.actionsButton.setEnabled(True) elif self.initialCommandMode == "incoming" and self.projectMode: for act in [self.__phaseAct, self.__graftAct, self.__mergeAct, - self.__tagAct, self.__switchAct, self.__bookmarkAct, - self.__bookmarkMoveAct, self.__pushAct, - self.__pushAllAct, self.__stripAct, self.__bundleAct, - self.__gpgSignAct, self.__gpgVerifyAct]: + self.__tagAct, self.__closeHeadsAct, self.__switchAct, + self.__bookmarkAct, self.__bookmarkMoveAct, + self.__pushAct, self.__pushAllAct, self.__stripAct, + self.__bundleAct, self.__gpgSignAct, + self.__gpgVerifyAct]: act.setEnabled(False) self.__pullAct.setText(self.tr("Pull Selected Changes")) self.__fetchAct.setText(self.tr("Fetch Selected Changes")) if self.vcs.canPull() and not bool(self.__bundle): - # step 1: determine number of selected draft changesets - # i.e. those that can be pulled - selectedDraftItemsCount = 0 - for itm in self.logTree.selectedItems(): - phase = itm.text(self.PhaseColumn) - if phase == self.phases["draft"]: - selectedDraftItemsCount += 1 - self.__pullAct.setEnabled(selectedDraftItemsCount > 0) + selectedIncomingItemsCount = len([ + itm for itm in self.logTree.selectedItems() + if itm.data(0, self.__incomingRole) + ]) + self.__pullAct.setEnabled(selectedIncomingItemsCount > 0) self.__lfPullAct.setEnabled( self.vcs.isExtensionActive("largefiles") and selectedItemsCount > 0) self.__fetchAct.setEnabled( self.vcs.isExtensionActive("fetch") and - selectedDraftItemsCount > 0) + selectedIncomingItemsCount > 0) else: self.__pullAct.setEnabled(False) self.__lfPullAct.setEnabled(False) @@ -1578,11 +1727,11 @@ elif self.initialCommandMode == "outgoing" and self.projectMode: for act in [self.__phaseAct, self.__graftAct, self.__mergeAct, - self.__tagAct, self.__switchAct, self.__bookmarkAct, - self.__bookmarkMoveAct, self.__pullAct, - self.__lfPullAct, self.__fetchAct, self.__stripAct, - self.__gpgSignAct, self.__gpgVerifyAct, - self.__unbundleAct]: + self.__tagAct, self.__closeHeadsAct, self.__switchAct, + self.__bookmarkAct, self.__bookmarkMoveAct, + self.__pullAct, self.__lfPullAct, self.__fetchAct, + self.__stripAct, self.__gpgSignAct, + self.__gpgVerifyAct, self.__unbundleAct]: act.setEnabled(False) selectedItemsCount = len(self.logTree.selectedItems()) @@ -1789,8 +1938,11 @@ """ Private slot to handle the Next button. """ - if self.__lastRev > 0 and self.nextButton.isEnabled(): - self.__getLogEntries(startRev=self.__lastRev - 1) + if self.nextButton.isEnabled(): + if self.__lastRev > 0: + self.__getLogEntries(startRev=self.__lastRev - 1) + else: + self.__getLogEntries() @pyqtSlot(QDate) def on_fromDate_dateChanged(self, date): @@ -1921,6 +2073,9 @@ fieldIndex = self.__changesRole searchRx = QRegExp(self.rxEdit.text(), Qt.CaseInsensitive) indexIsRole = True + elif txt == "phase": + fieldIndex = self.PhaseColumn + searchRx = QRegExp(self.rxEdit.text(), Qt.CaseInsensitive) else: fieldIndex = self.__messageRole searchRx = QRegExp(self.rxEdit.text(), Qt.CaseInsensitive) @@ -1941,9 +2096,13 @@ self.limitSpinBox.setEnabled(True) @pyqtSlot() - def on_refreshButton_clicked(self): + def on_refreshButton_clicked(self, addNext=False): """ Private slot to refresh the log. + + @param addNext flag indicating to get a second batch of log entries as + well + @type bool """ self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False) self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(True) @@ -1959,12 +2118,18 @@ if self.initialCommandMode in ("incoming", "outgoing"): self.nextButton.setEnabled(False) self.limitSpinBox.setEnabled(False) + if addNext: + self.__addFinishCallback(self.on_nextButton_clicked) else: self.nextButton.setEnabled(True) self.limitSpinBox.setEnabled(True) - self.commandMode = self.initialCommandMode - self.start(self.__filename, isFile=self.__isFile, + if self.initialCommandMode == "full_log": + self.commandMode = "incoming" + self.__addFinishCallback(self.on_nextButton_clicked) + else: + self.commandMode = self.initialCommandMode + self.start(self.__filename, bundle=self.__bundle, isFile=self.__isFile, noEntries=self.logTree.topLevelItemCount()) def on_passwordCheckBox_toggled(self, isOn): @@ -2022,27 +2187,29 @@ """ Private slot to handle the Change Phase action. """ - currentPhase = self.logTree.selectedItems()[0].text(self.PhaseColumn) - revs = [] - for itm in self.logTree.selectedItems(): - if itm.text(self.PhaseColumn) == currentPhase: - revs.append( - itm.text(self.RevisionColumn).split(":")[0].strip()) - - if not revs: - self.__phaseAct.setEnabled(False) - return - - if currentPhase == self.phases["draft"]: - newPhase = self.phases["secret"] - data = (revs, "s", True) - else: - newPhase = self.phases["draft"] - data = (revs, "d", False) - res = self.vcs.hgPhase(self.repodir, data) - if res: + itm = self.logTree.selectedItems()[0] + if not itm.data(0, self.__incomingRole): + currentPhase = itm.text(self.PhaseColumn) + revs = [] for itm in self.logTree.selectedItems(): - itm.setText(self.PhaseColumn, newPhase) + if itm.text(self.PhaseColumn) == currentPhase: + revs.append( + itm.text(self.RevisionColumn).split(":")[0].strip()) + + if not revs: + self.__phaseAct.setEnabled(False) + return + + if currentPhase == self.phases["draft"]: + newPhase = self.phases["secret"] + data = (revs, "s", True) + else: + newPhase = self.phases["draft"] + data = (revs, "d", False) + res = self.vcs.hgPhase(self.repodir, data) + if res: + for itm in self.logTree.selectedItems(): + itm.setText(self.PhaseColumn, newPhase) @pyqtSlot() def __graftActTriggered(self): @@ -2051,7 +2218,8 @@ """ revs = [] - for itm in self.logTree.selectedItems(): + for itm in [item for item in self.logTree.selectedItems() + if not item.data(0, self.__incomingRole)]: branch = itm.text(self.BranchColumn) if branch != self.__projectBranch: revs.append( @@ -2077,7 +2245,8 @@ """ Private slot to tag the selected revision. """ - if len(self.logTree.selectedItems()) == 1: + if len([itm for itm in self.logTree.selectedItems() + if not itm.data(0, self.__incomingRole)]) == 1: itm = self.logTree.selectedItems()[0] rev = itm.text(self.RevisionColumn).strip().split(":", 1)[0] tag = itm.text(self.TagsColumn).strip().split(", ", 1)[0] @@ -2086,12 +2255,31 @@ self.on_refreshButton_clicked() @pyqtSlot() + def __closeHeadsActTriggered(self): + """ + Private slot to close the selected head revisions. + """ + if self.vcs.isExtensionActive("closehead"): + revs = [itm.text(self.RevisionColumn).strip().split(":", 1)[0] + for itm in self.logTree.selectedItems() + if not itm.data(0, self.__incomingRole)] + revs = [rev for rev in revs if rev in self.__headRevisions] + if revs: + closeheadExtension = self.vcs.getExtensionObject("closehead") + if closeheadExtension is not None: + closeheadExtension.hgCloseheads( + self.repodir, revisions=revs) + + self.on_refreshButton_clicked() + + @pyqtSlot() def __switchActTriggered(self): """ Private slot to switch the working directory to the selected revision. """ - if len(self.logTree.selectedItems()) == 1: + if len([itm for itm in self.logTree.selectedItems() + if not itm.data(0, self.__incomingRole)]) == 1: itm = self.logTree.selectedItems()[0] rev = itm.text(self.RevisionColumn).strip().split(":", 1)[0] bookmarks = [bm.strip() for bm in @@ -2129,7 +2317,8 @@ """ Private slot to bookmark the selected revision. """ - if len(self.logTree.selectedItems()) == 1: + if len([itm for itm in self.logTree.selectedItems() + if not itm.data(0, self.__incomingRole)]) == 1: itm = self.logTree.selectedItems()[0] rev, changeset = \ itm.text(self.RevisionColumn).strip().split(":", 1) @@ -2150,7 +2339,8 @@ """ Private slot to move a bookmark to the selected revision. """ - if len(self.logTree.selectedItems()) == 1: + if len([itm for itm in self.logTree.selectedItems() + if not itm.data(0, self.__incomingRole)]) == 1: itm = self.logTree.selectedItems()[0] rev, changeset = \ itm.text(self.RevisionColumn).strip().split(":", 1) @@ -2174,7 +2364,8 @@ Private slot to pull large files of selected revisions. """ revs = [] - for itm in self.logTree.selectedItems(): + for itm in [item for item in self.logTree.selectedItems() + if not item.data(0, self.__incomingRole)]: rev = itm.text(self.RevisionColumn).strip().split(":", 1)[0] if rev: revs.append(rev) @@ -2190,22 +2381,20 @@ """ shouldReopen = False refresh = False + addNext = False - if self.initialCommandMode == "log": - shouldReopen = self.vcs.getExtensionObject("fetch").hgFetch( - self.repodir) - refresh = True - elif self.initialCommandMode == "incoming": + if self.initialCommandMode in ("log", "full_log", "incoming"): revs = [] - for itm in self.logTree.selectedItems(): + for itm in [item for item in self.logTree.selectedItems() + if item.data(0, self.__incomingRole)]: rev = itm.text(self.RevisionColumn).split(":")[1].strip() - phase = itm.text(self.PhaseColumn).strip() - if rev and phase == self.phases["draft"]: + if rev: revs.append(rev) - if revs: - shouldReopen = self.vcs.getExtensionObject("fetch").hgFetch( - self.repodir, ) - refresh = True + shouldReopen = self.vcs.getExtensionObject("fetch").hgFetch( + self.repodir, revisions=revs) + refresh = True + if self.initialCommandMode == "incoming": + addNext = True if shouldReopen: res = E5MessageBox.yesNo( None, @@ -2218,7 +2407,7 @@ return if refresh: - self.on_refreshButton_clicked() + self.on_refreshButton_clicked(addNext=addNext) @pyqtSlot() def __pullActTriggered(self): @@ -2227,20 +2416,19 @@ """ shouldReopen = False refresh = False + addNext = False - if self.initialCommandMode == "log": - shouldReopen = self.vcs.hgPull(self.repodir) - refresh = True - elif self.initialCommandMode == "incoming": + if self.initialCommandMode in ("log", "full_log", "incoming"): revs = [] - for itm in self.logTree.selectedItems(): + for itm in [item for item in self.logTree.selectedItems() + if item.data(0, self.__incomingRole)]: rev = itm.text(self.RevisionColumn).split(":")[1].strip() - phase = itm.text(self.PhaseColumn).strip() - if rev and phase == self.phases["draft"]: + if rev: revs.append(rev) - if revs: - shouldReopen = self.vcs.hgPull(self.repodir, revisions=revs) - refresh = True + shouldReopen = self.vcs.hgPull(self.repodir, revisions=revs) + refresh = True + if self.initialCommandMode == "incoming": + addNext = True if shouldReopen: res = E5MessageBox.yesNo( @@ -2254,7 +2442,7 @@ return if refresh: - self.on_refreshButton_clicked() + self.on_refreshButton_clicked(addNext=addNext) @pyqtSlot() def __pushActTriggered(self): @@ -2263,10 +2451,12 @@ changeset. """ itm = self.logTree.selectedItems()[0] - rev = itm.text(self.RevisionColumn).strip().split(":", 1)[0] - if rev: - self.vcs.hgPush(self.repodir, rev=rev) - self.on_refreshButton_clicked() + if not itm.data(0, self.__incomingRole): + rev = itm.text(self.RevisionColumn).strip().split(":", 1)[0] + if rev: + self.vcs.hgPush(self.repodir, rev=rev) + self.on_refreshButton_clicked( + addNext=self.initialCommandMode == "outgoing") @pyqtSlot() def __pushAllActTriggered(self): @@ -2282,20 +2472,21 @@ Private slot to strip changesets from the repository. """ itm = self.logTree.selectedItems()[0] - rev = itm.text(self.RevisionColumn).strip().split(":", 1)[1] - shouldReopen = self.vcs.getExtensionObject("strip").hgStrip( - self.repodir, rev=rev) - if shouldReopen: - res = E5MessageBox.yesNo( - None, - self.tr("Strip Changesets"), - self.tr( - """The project should be reread. Do this now?"""), - yesDefault=True) - if res: - e5App().getObject("Project").reopenProject() - return - + if not itm.data(0, self.__incomingRole): + rev = itm.text(self.RevisionColumn).strip().split(":", 1)[1] + shouldReopen = self.vcs.getExtensionObject("strip").hgStrip( + self.repodir, rev=rev) + if shouldReopen: + res = E5MessageBox.yesNo( + None, + self.tr("Strip Changesets"), + self.tr( + """The project should be reread. Do this now?"""), + yesDefault=True) + if res: + e5App().getObject("Project").reopenProject() + return + self.on_refreshButton_clicked() @pyqtSlot() @@ -2305,17 +2496,19 @@ changeset. """ itm = self.logTree.selectedItems()[0] - rev = "rev({0})".format( - itm.text(self.RevisionColumn).strip().split(":", 1)[0]) - self.vcs.vcsMerge(self.repodir, rev=rev) + if not itm.data(0, self.__incomingRole): + rev = "rev({0})".format( + itm.text(self.RevisionColumn).strip().split(":", 1)[0]) + self.vcs.vcsMerge(self.repodir, rev=rev) @pyqtSlot() def __bundleActTriggered(self): """ Private slot to create a changegroup file. """ - if self.initialCommandMode == "log": - selectedItems = self.logTree.selectedItems() + if self.initialCommandMode in ("log", "full_log"): + selectedItems = [itm for itm in self.logTree.selectedItems() + if not itm.data(0, self.__incomingRole)] if len(selectedItems) == 0: # all revisions of the local repository will be bundled bundleData = { @@ -2394,7 +2587,8 @@ Private slot to sign the selected revisions. """ revs = [] - for itm in self.logTree.selectedItems(): + for itm in [item for item in self.logTree.selectedItems() + if not item.data(0, self.__incomingRole)]: rev = itm.text(self.RevisionColumn).split(":", 1)[0].strip() if rev: revs.append(rev) @@ -2408,11 +2602,12 @@ """ Private slot to verify the signatures of a selected revisions. """ - rev = self.logTree.selectedItems()[0].text(self.RevisionColumn)\ - .split(":", 1)[0].strip() - if rev: - self.vcs.getExtensionObject("gpg").hgGpgVerifySignatures( - self.repodir, rev=rev) + itm = self.logTree.selectedItems()[0] + if not itm.data(0, self.__incomingRole): + rev = itm.text(self.RevisionColumn).split(":", 1)[0].strip() + if rev: + self.vcs.getExtensionObject("gpg").hgGpgVerifySignatures( + self.repodir, rev=rev) def __selectAllActTriggered(self, select=True): """
--- a/eric6/Plugins/VcsPlugins/vcsMercurial/HgTagBranchListDialog.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Plugins/VcsPlugins/vcsMercurial/HgTagBranchListDialog.py Sun Jun 02 11:42:48 2019 +0200 @@ -18,7 +18,7 @@ from PyQt5.QtCore import pyqtSlot, QProcess, Qt, QTimer, QCoreApplication, \ QPoint from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QHeaderView, \ - QTreeWidgetItem, QLineEdit, QMenu + QTreeWidgetItem, QLineEdit, QMenu, QAbstractItemView from E5Gui.E5Application import e5App from E5Gui import E5MessageBox @@ -58,6 +58,7 @@ self.allTagsList = None self.__hgClient = vcs.getClient() self.__currentRevision = "" + self.__currentBranch = "" self.tagList.headerItem().setText(self.tagList.columnCount(), "") self.tagList.header().setSortIndicator(3, Qt.AscendingOrder) @@ -110,6 +111,9 @@ if not tags: self.setWindowTitle(self.tr("Mercurial Branches List")) self.tagList.headerItem().setText(2, self.tr("Status")) + if self.vcs.isExtensionActive("closehead"): + self.tagList.setSelectionMode( + QAbstractItemView.ExtendedSelection) self.activateWindow() self.tagsList = tagsList @@ -377,10 +381,10 @@ """ Private method to highlight the current branch with a bold font. """ - currentBranch = self.vcs.hgGetCurrentBranch(self.__repoDir) - if currentBranch: + self.__currentBranch = self.vcs.hgGetCurrentBranch(self.__repoDir) + if self.__currentBranch: items = self.tagList.findItems( - currentBranch, Qt.MatchCaseSensitive, 3) + self.__currentBranch, Qt.MatchCaseSensitive, 3) if len(items) == 1: font = items[0].font(3) font.setBold(True) @@ -427,13 +431,24 @@ UI.PixmapCache.getIcon("vcsSwitch.png"), self.tr("Switch to"), self.__switchTo) else: - menu.addAction( + act = menu.addAction( UI.PixmapCache.getIcon("vcsSwitch.png"), self.tr("Switch to"), self.__switchTo) + act.setEnabled(itm.text(3) != self.__currentBranch) menu.addSeparator() - act = menu.addAction(self.tr("Close Branch"), - self.__closeBranch) - act.setEnabled(itm.text(3) != "default") + if self.vcs.isExtensionActive("closehead"): + act = menu.addAction( + UI.PixmapCache.getIcon("closehead"), + self.tr("Close Branches"), self.__closeBranchHeads) + act.setEnabled(len([ + itm for itm in self.tagList.selectedItems() + if itm.text(3) != "default" + ]) > 0) + else: + act = menu.addAction( + UI.PixmapCache.getIcon("closehead"), + self.tr("Close Branch"), self.__closeBranch) + act.setEnabled(itm.text(3) != "default") menu.popup(self.tagList.mapToGlobal(pos)) def __switchTo(self): @@ -493,3 +508,23 @@ revision=currentBranch) self.on_refreshButton_clicked() + + def __closeBranchHeads(self): + """ + Private slot to close the selected branches. + """ + branches = [itm.text(3) for itm in self.tagsList.selectedItems() + if itm.text(3) != "default"] + + from UI.DeleteFilesConfirmationDialog import \ + DeleteFilesConfirmationDialog + dlg = DeleteFilesConfirmationDialog( + self.parent(), + self.tr("Close Branches"), + self.tr( + "Do you really want to close all listed branches?"), + branches) + yes = dlg.exec_() == QDialog.Accepted + if yes: + self.vcs.getExtensionObject("closehead").hgCloseheads( + self.__repoDir, branches)
--- a/eric6/Plugins/VcsPlugins/vcsMercurial/HgUserConfigDialog.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Plugins/VcsPlugins/vcsMercurial/HgUserConfigDialog.py Sun Jun 02 11:42:48 2019 +0200 @@ -199,6 +199,13 @@ if "largefiles" in self.__config["extensions"]: del self.__config["extensions"]["largefiles"] self.__config["extensions"]["#largefiles"] = "" + + if self.closeheadCheckBox.isChecked() and self.__version >= (4, 8, 0): + self.__config["extensions"]["closehead"] = "" + else: + if "closehead" in self.__config["extensions"]: + del self.__config["extensions"]["closehead"] + self.__config["extensions"]["#closehead"] = "" ################################################################### ## http_proxy section ################################################################### @@ -335,6 +342,9 @@ "strip" in self.__config["extensions"]) self.histeditCheckBox.setChecked( "histedit" in self.__config["extensions"]) + self.closeheadCheckBox.setChecked( + "closehead" in self.__config["extensions"]) + self.closeheadCheckBox.setEnabled(self.__version >= (4, 8, 0)) # step 3: extract large files information if "largefiles" in self.__config:
--- a/eric6/Plugins/VcsPlugins/vcsMercurial/HgUserConfigDialog.ui Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Plugins/VcsPlugins/vcsMercurial/HgUserConfigDialog.ui Sun Jun 02 11:42:48 2019 +0200 @@ -20,7 +20,7 @@ <item> <widget class="QTabWidget" name="tabWidget"> <property name="currentIndex"> - <number>3</number> + <number>1</number> </property> <widget class="QWidget" name="tab"> <attribute name="title"> @@ -121,6 +121,16 @@ </property> <layout class="QGridLayout" name="gridLayout_2"> <item row="0" column="0"> + <widget class="QCheckBox" name="closeheadCheckBox"> + <property name="toolTip"> + <string>Select to activate the closehead extension</string> + </property> + <property name="text"> + <string>Close Head</string> + </property> + </widget> + </item> + <item row="0" column="1"> <widget class="QCheckBox" name="fetchCheckBox"> <property name="toolTip"> <string>Select to activate the fetch extension</string> @@ -130,7 +140,7 @@ </property> </widget> </item> - <item row="0" column="1"> + <item row="1" column="0"> <widget class="QCheckBox" name="gpgCheckBox"> <property name="toolTip"> <string>Select to activate the GPG extension</string> @@ -140,7 +150,7 @@ </property> </widget> </item> - <item row="1" column="0"> + <item row="1" column="1"> <widget class="QCheckBox" name="histeditCheckBox"> <property name="toolTip"> <string>Select to activate the histedit extension</string> @@ -150,7 +160,7 @@ </property> </widget> </item> - <item row="1" column="1"> + <item row="2" column="0"> <widget class="QCheckBox" name="largefilesCheckBox"> <property name="toolTip"> <string>Select to activate the largefiles extension</string> @@ -160,7 +170,7 @@ </property> </widget> </item> - <item row="2" column="0"> + <item row="2" column="1"> <widget class="QCheckBox" name="purgeCheckBox"> <property name="toolTip"> <string>Select to activate the Purge extension</string> @@ -170,7 +180,7 @@ </property> </widget> </item> - <item row="2" column="1"> + <item row="3" column="0"> <widget class="QCheckBox" name="queuesCheckBox"> <property name="toolTip"> <string>Select to activate the queues extension</string> @@ -180,7 +190,7 @@ </property> </widget> </item> - <item row="3" column="0"> + <item row="3" column="1"> <widget class="QCheckBox" name="rebaseCheckBox"> <property name="toolTip"> <string>Select to activate the rebase extension</string> @@ -190,7 +200,7 @@ </property> </widget> </item> - <item row="3" column="1"> + <item row="4" column="0"> <widget class="QCheckBox" name="shelveCheckBox"> <property name="toolTip"> <string>Select to activate the shelve extension</string> @@ -200,7 +210,7 @@ </property> </widget> </item> - <item row="4" column="0"> + <item row="4" column="1"> <widget class="QCheckBox" name="stripCheckBox"> <property name="toolTip"> <string>Select to activate the strip extension</string> @@ -672,6 +682,7 @@ <tabstop>tabWidget</tabstop> <tabstop>userNameEdit</tabstop> <tabstop>emailEdit</tabstop> + <tabstop>closeheadCheckBox</tabstop> <tabstop>fetchCheckBox</tabstop> <tabstop>gpgCheckBox</tabstop> <tabstop>histeditCheckBox</tabstop>
--- a/eric6/Plugins/VcsPlugins/vcsMercurial/ProjectHelper.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Plugins/VcsPlugins/vcsMercurial/ProjectHelper.py Sun Jun 02 11:42:48 2019 +0200 @@ -49,6 +49,7 @@ from .LargefilesExtension.ProjectHelper import LargefilesProjectHelper from .StripExtension.ProjectHelper import StripProjectHelper from .HisteditExtension.ProjectHelper import HisteditProjectHelper + from .CloseheadExtension.ProjectHelper import CloseheadProjectHelper self.__extensions = { "mq": QueuesProjectHelper(), "fetch": FetchProjectHelper(), @@ -59,6 +60,7 @@ "largefiles": LargefilesProjectHelper(), "strip": StripProjectHelper(), "histedit": HisteditProjectHelper(), + "closehead": CloseheadProjectHelper(), } self.__extensionMenuTitles = {} @@ -554,6 +556,7 @@ self.hgPushBranchAct = E5Action( self.tr('Push new branch'), + UI.PixmapCache.getIcon("vcsCommit.png"), self.tr('Push new branch'), 0, 0, self, 'mercurial_push_branch') self.hgPushBranchAct.setStatusTip(self.tr( @@ -570,6 +573,7 @@ self.hgCloseBranchAct = E5Action( self.tr('Close branch'), + UI.PixmapCache.getIcon("closehead"), self.tr('Close branch'), 0, 0, self, 'mercurial_close_branch') self.hgCloseBranchAct.setStatusTip(self.tr( @@ -1620,6 +1624,8 @@ self.extensionMenus[extensionName].menu()\ .isTearOffMenuVisible(): self.extensionMenus[extensionName].menu().hideTearOffMenu() + if self.vcs.version < (4, 8, 0): + self.extensionMenus["closehead"].setEnabled(False) def __hgExtendedDiff(self): """
--- a/eric6/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgShelveDataDialog.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgShelveDataDialog.py Sun Jun 02 11:42:48 2019 +0200 @@ -19,11 +19,14 @@ """ Class implementing a dialog to enter the data for a shelve operation. """ - def __init__(self, parent=None): + def __init__(self, version, parent=None): """ Constructor - @param parent reference to the parent widget (QWidget) + @param version Mercurial version + @type tuple of three int + @param parent reference to the parent widget + @type QWidget """ super(HgShelveDataDialog, self).__init__(parent) self.setupUi(self) @@ -31,6 +34,10 @@ self.__initialDateTime = QDateTime.currentDateTime() self.dateTimeEdit.setDateTime(self.__initialDateTime) + if version < (5, 0, 0): + self.keepCheckBox.setChecked(False) + self.keepCheckBox.hide() + msh = self.minimumSizeHint() self.resize(max(self.width(), msh.width()), msh.height()) @@ -38,9 +45,10 @@ """ Public method to get the user data. - @return tuple containing the name (string), date (QDateTime), - message (string) and a flag indicating to add/remove - new/missing files (boolean) + @return tuple containing the name, date, message, a flag indicating + to add/remove new/missing files and a flag indicating to keep the + shelved changes in the working directory + @rtype tuple of (str, QDateTime, str, bool, bool) """ if self.dateTimeEdit.dateTime() != self.__initialDateTime: dateTime = self.dateTimeEdit.dateTime() @@ -51,4 +59,5 @@ dateTime, self.messageEdit.text(), self.addRemoveCheckBox.isChecked(), + self.keepCheckBox.isChecked(), )
--- a/eric6/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgShelveDataDialog.ui Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgShelveDataDialog.ui Sun Jun 02 11:42:48 2019 +0200 @@ -7,7 +7,7 @@ <x>0</x> <y>0</y> <width>500</width> - <height>170</height> + <height>167</height> </rect> </property> <property name="windowTitle"> @@ -93,6 +93,16 @@ </widget> </item> <item row="4" column="0" colspan="2"> + <widget class="QCheckBox" name="keepCheckBox"> + <property name="toolTip"> + <string>Select to shelve, but keep the changes in the working directory</string> + </property> + <property name="text"> + <string>Shelve, but keep changes</string> + </property> + </widget> + </item> + <item row="5" column="0" colspan="2"> <widget class="QDialogButtonBox" name="buttonBox"> <property name="orientation"> <enum>Qt::Horizontal</enum>
--- a/eric6/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/shelve.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/shelve.py Sun Jun 02 11:42:48 2019 +0200 @@ -101,9 +101,9 @@ res = False from .HgShelveDataDialog import HgShelveDataDialog - dlg = HgShelveDataDialog() + dlg = HgShelveDataDialog(self.vcs.version) if dlg.exec_() == QDialog.Accepted: - shelveName, dateTime, message, addRemove = dlg.getData() + shelveName, dateTime, message, addRemove, keep = dlg.getData() args = self.vcs.initCommand("shelve") if shelveName: @@ -117,6 +117,8 @@ if dateTime.isValid(): args.append("--date") args.append(dateTime.toString("yyyy-MM-dd hh:mm:ss")) + if self.vcs.version >= (5, 0, 0) and keep: + args.append("--keep") args.append("-v") if isinstance(name, list):
--- a/eric6/Plugins/VcsPlugins/vcsMercurial/hg.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Plugins/VcsPlugins/vcsMercurial/hg.py Sun Jun 02 11:42:48 2019 +0200 @@ -131,6 +131,7 @@ self.__iniWatcher.addPath(cfgFile) self.__client = None + self.__projectHelper = None self.__repoDir = "" self.__repoIniFile = "" @@ -147,6 +148,7 @@ from .LargefilesExtension.largefiles import Largefiles from .StripExtension.strip import Strip from .HisteditExtension.histedit import Histedit + from .CloseheadExtension.closehead import Closehead self.__extensions = { "mq": Queues(self), "fetch": Fetch(self), @@ -157,6 +159,7 @@ "largefiles": Largefiles(self), "strip": Strip(self), "histedit": Histedit(self), + "closehead": Closehead(self), } def getPlugin(self): @@ -212,7 +215,8 @@ os.remove(self.bundleFile) # shut down the project helpers - self.__projectHelper.shutdown() + if self.__projectHelper is not None: + self.__projectHelper.shutdown() # shut down the extensions for extension in self.__extensions.values(): @@ -3441,6 +3445,8 @@ extensionName = \ line.split("=", 1)[0].strip().split(".")[-1].strip() self.__activeExtensions.append(extensionName) + if self.version < (4, 8, 0) and "closehead" in self.__activeExtensions: + self.__activeExtensions.remove["closehead"] if activeExtensions != sorted(self.__activeExtensions): self.activeExtensionsChanged.emit()
--- a/eric6/Plugins/ViewManagerPlugins/Tabview/Tabview.py Sat May 04 12:04:12 2019 +0200 +++ b/eric6/Plugins/ViewManagerPlugins/Tabview/Tabview.py Sun Jun 02 11:42:48 2019 +0200 @@ -209,18 +209,7 @@ self.navigationButton.setEnabled(False) self.rightCornerWidgetLayout.addWidget(self.navigationButton) - if Preferences.getUI("SingleCloseButton") or \ - not hasattr(self, 'setTabsClosable'): - self.closeButton = QToolButton(self) - self.closeButton.setIcon(UI.PixmapCache.getIcon("close.png")) - self.closeButton.setToolTip( - self.tr("Close the current editor")) - self.closeButton.setEnabled(False) - self.closeButton.clicked[bool].connect(self.__closeButtonClicked) - self.rightCornerWidgetLayout.addWidget(self.closeButton) - else: - self.tabCloseRequested.connect(self.__closeRequested) - self.closeButton = None + self.tabCloseRequested.connect(self.__closeRequested) self.setCornerWidget(self.rightCornerWidget, Qt.TopRightCorner) @@ -370,10 +359,7 @@ editor = assembly.getEditor() super(TabWidget, self).addTab( assembly, UI.PixmapCache.getIcon("empty.png"), title) - if self.closeButton: - self.closeButton.setEnabled(True) - else: - self.setTabsClosable(True) + self.setTabsClosable(True) self.navigationButton.setEnabled(True) if editor not in self.editors: @@ -404,10 +390,7 @@ index, assembly, UI.PixmapCache.ge