Debugger eric7

Thu, 24 Nov 2022 19:42:13 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Thu, 24 Nov 2022 19:42:13 +0100
branch
eric7
changeset 9532
39a1ebff6b4e
parent 9531
155b2646799a
child 9533
e017c0df9ef1

Debugger
- added a stack frame selector to the global variables viewer (synchronized with the one of the local variables viewer)

docs/changelog.md file | annotate | diff | comparison | revisions
src/eric7/Debugger/DebugViewer.py file | annotate | diff | comparison | revisions
src/eric7/Documentation/Help/source.qch file | annotate | diff | comparison | revisions
src/eric7/Documentation/Help/source.qhp file | annotate | diff | comparison | revisions
src/eric7/Documentation/Source/eric7.Debugger.DebugViewer.html file | annotate | diff | comparison | revisions
--- 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)
Binary file src/eric7/Documentation/Help/source.qch has changed
--- 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>)

eric ide

mercurial