Thu, 24 Nov 2022 19:42:13 +0100
Debugger
- added a stack frame selector to the global variables viewer (synchronized with the one of the local variables viewer)
--- a/docs/changelog.md Thu Nov 24 16:21:10 2022 +0100 +++ b/docs/changelog.md Thu Nov 24 19:42:13 2022 +0100 @@ -15,6 +15,8 @@ server listens on - added the capability to configure the debug server of the IDE to listen at a fixed network port (default 35000) + - added a stack frame selector to the global variables viewer (synchronized with + the one of the local variables viewer) - MicroPython - introduced a configuration option to enable manual selection of devices (e.g. for unknown devices or inside the Linux container of ChromeOS)
--- a/src/eric7/Debugger/DebugViewer.py Thu Nov 24 16:21:10 2022 +0100 +++ b/src/eric7/Debugger/DebugViewer.py Thu Nov 24 19:42:13 2022 +0100 @@ -137,6 +137,20 @@ self.gvvWidgetVLayout.setSpacing(3) self.gvvWidget.setLayout(self.gvvWidgetVLayout) + self.gvvWidgetHLayout1 = QHBoxLayout() + self.gvvWidgetHLayout1.setContentsMargins(3, 3, 3, 3) + + self.gvvStackComboBox = QComboBox(self.gvvWidget) + self.gvvStackComboBox.setSizePolicy( + QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed + ) + self.gvvWidgetHLayout1.addWidget(self.gvvStackComboBox) + + self.gvvSourceButton = QPushButton(self.tr("Source"), self.gvvWidget) + self.gvvWidgetHLayout1.addWidget(self.gvvSourceButton) + self.gvvSourceButton.setEnabled(False) + self.gvvWidgetVLayout.addLayout(self.gvvWidgetHLayout1) + self.globalsViewer = VariablesViewer(self, True, self.gvvWidget) self.gvvWidgetVLayout.addWidget(self.globalsViewer) @@ -184,6 +198,7 @@ index, self.tr("Shows the list of global variables and their values.") ) + self.gvvSourceButton.clicked.connect(self.__showSource) self.setGlobalsFilterButton.clicked.connect(self.setGlobalsFilter) self.globalsFilterEdit.returnPressed.connect(self.setGlobalsFilter) @@ -197,15 +212,15 @@ self.lvvWidgetHLayout1 = QHBoxLayout() self.lvvWidgetHLayout1.setContentsMargins(3, 3, 3, 3) - self.stackComboBox = QComboBox(self.lvvWidget) - self.stackComboBox.setSizePolicy( + self.lvvStackComboBox = QComboBox(self.lvvWidget) + self.lvvStackComboBox.setSizePolicy( QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed ) - self.lvvWidgetHLayout1.addWidget(self.stackComboBox) + self.lvvWidgetHLayout1.addWidget(self.lvvStackComboBox) - self.sourceButton = QPushButton(self.tr("Source"), self.lvvWidget) - self.lvvWidgetHLayout1.addWidget(self.sourceButton) - self.sourceButton.setEnabled(False) + self.lvvSourceButton = QPushButton(self.tr("Source"), self.lvvWidget) + self.lvvWidgetHLayout1.addWidget(self.lvvSourceButton) + self.lvvSourceButton.setEnabled(False) self.lvvWidgetVLayout.addLayout(self.lvvWidgetHLayout1) self.localsViewer = VariablesViewer(self, False, self.lvvWidget) @@ -254,8 +269,8 @@ index, self.tr("Shows the list of local variables and their values.") ) - self.sourceButton.clicked.connect(self.__showSource) - self.stackComboBox.currentIndexChanged[int].connect(self.__frameSelected) + self.lvvSourceButton.clicked.connect(self.__showSource) + self.lvvStackComboBox.currentIndexChanged[int].connect(self.__frameSelected) self.setLocalsFilterButton.clicked.connect(self.setLocalsFilter) self.localsFilterEdit.returnPressed.connect(self.setLocalsFilter) @@ -263,6 +278,15 @@ self.preferencesChanged.connect(self.globalsViewer.preferencesChanged) self.preferencesChanged.connect(self.localsViewer.preferencesChanged) + # interconnect the stack selectors of the variable viewers + self.gvvStackComboBox.setModel(self.lvvStackComboBox.model()) + self.lvvStackComboBox.currentIndexChanged[int].connect( + self.gvvStackComboBox.setCurrentIndex + ) + self.gvvStackComboBox.currentIndexChanged[int].connect( + self.lvvStackComboBox.setCurrentIndex + ) + # add the call stack viewer self.callStackViewer = CallStackViewer(self.debugServer) index = self.__tabWidget.addTab( @@ -333,7 +357,8 @@ self.framenr = 0 self.__autoViewSource = Preferences.getDebugger("AutoViewSourceCode") - self.sourceButton.setVisible(not self.__autoViewSource) + self.lvvSourceButton.setVisible(not self.__autoViewSource) + self.gvvSourceButton.setVisible(not self.__autoViewSource) # connect some debug server signals self.debugServer.clientStack.connect(self.handleClientStack) @@ -353,12 +378,24 @@ self.debugServer.clientLine.connect(self.breakpointViewer.highlightBreakpoint) + def __clearStackComboBox(self, comboBox): + """ + Private method to clear the given stack combo box. + + @param comboBox reference to the combo box to be cleared + @type QComboBox + """ + block = comboBox.blockSignals(True) + comboBox.clear() + comboBox.blockSignals(block) + def handlePreferencesChanged(self): """ Public slot to handle the preferencesChanged signal. """ self.__autoViewSource = Preferences.getDebugger("AutoViewSourceCode") - self.sourceButton.setVisible(not self.__autoViewSource) + self.lvvSourceButton.setVisible(not self.__autoViewSource) + self.gvvSourceButton.setVisible(not self.__autoViewSource) def setDebugger(self, debugUI): """ @@ -386,9 +423,10 @@ self.localsViewer.handleResetUI() self.setGlobalsFilter() self.setLocalsFilter() - self.sourceButton.setEnabled(False) + self.lvvSourceButton.setEnabled(False) + self.gvvSourceButton.setEnabled(False) self.currentStack = None - self.stackComboBox.clear() + self.__clearStackComboBox(self.lvvStackComboBox) self.__tabWidget.setCurrentWidget(self.gvvWidget) self.breakpointViewer.handleResetUI() if fullReset: @@ -483,16 +521,18 @@ @type str """ if debuggerId == self.getSelectedDebuggerId(): - block = self.stackComboBox.blockSignals(True) self.framenr = 0 - self.stackComboBox.clear() + self.lvvSourceButton.setEnabled(len(stack) > 0) + self.gvvSourceButton.setEnabled(len(stack) > 0) self.currentStack = stack - self.sourceButton.setEnabled(len(stack) > 0) + + block = self.lvvStackComboBox.blockSignals(True) + self.lvvStackComboBox.clear() for s in stack: # just show base filename to make it readable s = (os.path.basename(s[0]), s[1], s[2]) - self.stackComboBox.addItem("{0}:{1}:{2}".format(*s)) - self.stackComboBox.blockSignals(block) + self.lvvStackComboBox.addItem("{0}:{1}:{2}".format(*s)) + self.lvvStackComboBox.blockSignals(block) def __clientLine(self, fn, line, debuggerId, threadName): """ @@ -535,9 +575,10 @@ self.localsViewer.handleResetUI() self.setGlobalsFilter() self.setLocalsFilter() - self.sourceButton.setEnabled(False) + self.lvvSourceButton.setEnabled(False) + self.gvvSourceButton.setEnabled(False) self.currentStack = None - self.stackComboBox.clear() + self.__clearStackComboBox(self.lvvStackComboBox) self.__removeDebugger(debuggerId) @@ -600,7 +641,7 @@ Private slot to handle the source button press to show the selected file. """ - index = self.stackComboBox.currentIndex() + index = self.lvvStackComboBox.currentIndex() if index > -1 and self.currentStack: s = self.currentStack[index] self.sourceFile.emit(s[0], int(s[1])) @@ -707,7 +748,7 @@ @type int """ if frameNo >= 0: - self.stackComboBox.setCurrentIndex(frameNo) + self.lvvStackComboBox.setCurrentIndex(frameNo) def __debuggerSelected(self, current, previous): """ @@ -726,7 +767,7 @@ self.globalsViewer.handleResetUI() self.localsViewer.handleResetUI() self.currentStack = None - self.stackComboBox.clear() + self.__clearStackComboBox(self.lvvStackComboBox) self.callStackViewer.clear() self.debugServer.remoteSetThread(debuggerId, -1)
--- a/src/eric7/Documentation/Help/source.qhp Thu Nov 24 16:21:10 2022 +0100 +++ b/src/eric7/Documentation/Help/source.qhp Thu Nov 24 19:42:13 2022 +0100 @@ -3719,6 +3719,7 @@ <keyword name="DebugViewer (Module)" id="DebugViewer (Module)" ref="eric7.Debugger.DebugViewer.html" /> <keyword name="DebugViewer.__addThreadList" id="DebugViewer.__addThreadList" ref="eric7.Debugger.DebugViewer.html#DebugViewer.__addThreadList" /> <keyword name="DebugViewer.__callStackFrameSelected" id="DebugViewer.__callStackFrameSelected" ref="eric7.Debugger.DebugViewer.html#DebugViewer.__callStackFrameSelected" /> + <keyword name="DebugViewer.__clearStackComboBox" id="DebugViewer.__clearStackComboBox" ref="eric7.Debugger.DebugViewer.html#DebugViewer.__clearStackComboBox" /> <keyword name="DebugViewer.__clientDebuggerId" id="DebugViewer.__clientDebuggerId" ref="eric7.Debugger.DebugViewer.html#DebugViewer.__clientDebuggerId" /> <keyword name="DebugViewer.__clientException" id="DebugViewer.__clientException" ref="eric7.Debugger.DebugViewer.html#DebugViewer.__clientException" /> <keyword name="DebugViewer.__clientExit" id="DebugViewer.__clientExit" ref="eric7.Debugger.DebugViewer.html#DebugViewer.__clientExit" />
--- a/src/eric7/Documentation/Source/eric7.Debugger.DebugViewer.html Thu Nov 24 16:21:10 2022 +0100 +++ b/src/eric7/Documentation/Source/eric7.Debugger.DebugViewer.html Thu Nov 24 19:42:13 2022 +0100 @@ -100,6 +100,10 @@ <td>Private slot to handle the selection of a call stack entry of the call stack viewer.</td> </tr> <tr> +<td><a href="#DebugViewer.__clearStackComboBox">__clearStackComboBox</a></td> +<td>Private method to clear the given stack combo box.</td> +</tr> +<tr> <td><a href="#DebugViewer.__clientDebuggerId">__clientDebuggerId</a></td> <td>Private slot to receive the ID of a newly connected debugger backend.</td> </tr> @@ -293,6 +297,20 @@ frame number (index) of the selected entry </dd> </dl> +<a NAME="DebugViewer.__clearStackComboBox" ID="DebugViewer.__clearStackComboBox"></a> +<h4>DebugViewer.__clearStackComboBox</h4> +<b>__clearStackComboBox</b>(<i>comboBox</i>) + +<p> + Private method to clear the given stack combo box. +</p> +<dl> + +<dt><i>comboBox</i> (QComboBox)</dt> +<dd> +reference to the combo box to be cleared +</dd> +</dl> <a NAME="DebugViewer.__clientDebuggerId" ID="DebugViewer.__clientDebuggerId"></a> <h4>DebugViewer.__clientDebuggerId</h4> <b>__clientDebuggerId</b>(<i>debuggerId</i>)