135 self.gvvWidgetVLayout = QVBoxLayout(self.gvvWidget) |
135 self.gvvWidgetVLayout = QVBoxLayout(self.gvvWidget) |
136 self.gvvWidgetVLayout.setContentsMargins(0, 0, 0, 0) |
136 self.gvvWidgetVLayout.setContentsMargins(0, 0, 0, 0) |
137 self.gvvWidgetVLayout.setSpacing(3) |
137 self.gvvWidgetVLayout.setSpacing(3) |
138 self.gvvWidget.setLayout(self.gvvWidgetVLayout) |
138 self.gvvWidget.setLayout(self.gvvWidgetVLayout) |
139 |
139 |
|
140 self.gvvWidgetHLayout1 = QHBoxLayout() |
|
141 self.gvvWidgetHLayout1.setContentsMargins(3, 3, 3, 3) |
|
142 |
|
143 self.gvvStackComboBox = QComboBox(self.gvvWidget) |
|
144 self.gvvStackComboBox.setSizePolicy( |
|
145 QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed |
|
146 ) |
|
147 self.gvvWidgetHLayout1.addWidget(self.gvvStackComboBox) |
|
148 |
|
149 self.gvvSourceButton = QPushButton(self.tr("Source"), self.gvvWidget) |
|
150 self.gvvWidgetHLayout1.addWidget(self.gvvSourceButton) |
|
151 self.gvvSourceButton.setEnabled(False) |
|
152 self.gvvWidgetVLayout.addLayout(self.gvvWidgetHLayout1) |
|
153 |
140 self.globalsViewer = VariablesViewer(self, True, self.gvvWidget) |
154 self.globalsViewer = VariablesViewer(self, True, self.gvvWidget) |
141 self.gvvWidgetVLayout.addWidget(self.globalsViewer) |
155 self.gvvWidgetVLayout.addWidget(self.globalsViewer) |
142 |
156 |
143 self.gvvWidgetHLayout = QHBoxLayout() |
157 self.gvvWidgetHLayout = QHBoxLayout() |
144 self.gvvWidgetHLayout.setContentsMargins(3, 3, 3, 3) |
158 self.gvvWidgetHLayout.setContentsMargins(3, 3, 3, 3) |
182 ) |
196 ) |
183 self.__tabWidget.setTabToolTip( |
197 self.__tabWidget.setTabToolTip( |
184 index, self.tr("Shows the list of global variables and their values.") |
198 index, self.tr("Shows the list of global variables and their values.") |
185 ) |
199 ) |
186 |
200 |
|
201 self.gvvSourceButton.clicked.connect(self.__showSource) |
187 self.setGlobalsFilterButton.clicked.connect(self.setGlobalsFilter) |
202 self.setGlobalsFilterButton.clicked.connect(self.setGlobalsFilter) |
188 self.globalsFilterEdit.returnPressed.connect(self.setGlobalsFilter) |
203 self.globalsFilterEdit.returnPressed.connect(self.setGlobalsFilter) |
189 |
204 |
190 # add the local variables viewer |
205 # add the local variables viewer |
191 self.lvvWidget = QWidget() |
206 self.lvvWidget = QWidget() |
195 self.lvvWidget.setLayout(self.lvvWidgetVLayout) |
210 self.lvvWidget.setLayout(self.lvvWidgetVLayout) |
196 |
211 |
197 self.lvvWidgetHLayout1 = QHBoxLayout() |
212 self.lvvWidgetHLayout1 = QHBoxLayout() |
198 self.lvvWidgetHLayout1.setContentsMargins(3, 3, 3, 3) |
213 self.lvvWidgetHLayout1.setContentsMargins(3, 3, 3, 3) |
199 |
214 |
200 self.stackComboBox = QComboBox(self.lvvWidget) |
215 self.lvvStackComboBox = QComboBox(self.lvvWidget) |
201 self.stackComboBox.setSizePolicy( |
216 self.lvvStackComboBox.setSizePolicy( |
202 QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed |
217 QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed |
203 ) |
218 ) |
204 self.lvvWidgetHLayout1.addWidget(self.stackComboBox) |
219 self.lvvWidgetHLayout1.addWidget(self.lvvStackComboBox) |
205 |
220 |
206 self.sourceButton = QPushButton(self.tr("Source"), self.lvvWidget) |
221 self.lvvSourceButton = QPushButton(self.tr("Source"), self.lvvWidget) |
207 self.lvvWidgetHLayout1.addWidget(self.sourceButton) |
222 self.lvvWidgetHLayout1.addWidget(self.lvvSourceButton) |
208 self.sourceButton.setEnabled(False) |
223 self.lvvSourceButton.setEnabled(False) |
209 self.lvvWidgetVLayout.addLayout(self.lvvWidgetHLayout1) |
224 self.lvvWidgetVLayout.addLayout(self.lvvWidgetHLayout1) |
210 |
225 |
211 self.localsViewer = VariablesViewer(self, False, self.lvvWidget) |
226 self.localsViewer = VariablesViewer(self, False, self.lvvWidget) |
212 self.lvvWidgetVLayout.addWidget(self.localsViewer) |
227 self.lvvWidgetVLayout.addWidget(self.localsViewer) |
213 |
228 |
252 ) |
267 ) |
253 self.__tabWidget.setTabToolTip( |
268 self.__tabWidget.setTabToolTip( |
254 index, self.tr("Shows the list of local variables and their values.") |
269 index, self.tr("Shows the list of local variables and their values.") |
255 ) |
270 ) |
256 |
271 |
257 self.sourceButton.clicked.connect(self.__showSource) |
272 self.lvvSourceButton.clicked.connect(self.__showSource) |
258 self.stackComboBox.currentIndexChanged[int].connect(self.__frameSelected) |
273 self.lvvStackComboBox.currentIndexChanged[int].connect(self.__frameSelected) |
259 self.setLocalsFilterButton.clicked.connect(self.setLocalsFilter) |
274 self.setLocalsFilterButton.clicked.connect(self.setLocalsFilter) |
260 self.localsFilterEdit.returnPressed.connect(self.setLocalsFilter) |
275 self.localsFilterEdit.returnPressed.connect(self.setLocalsFilter) |
261 |
276 |
262 self.preferencesChanged.connect(self.handlePreferencesChanged) |
277 self.preferencesChanged.connect(self.handlePreferencesChanged) |
263 self.preferencesChanged.connect(self.globalsViewer.preferencesChanged) |
278 self.preferencesChanged.connect(self.globalsViewer.preferencesChanged) |
264 self.preferencesChanged.connect(self.localsViewer.preferencesChanged) |
279 self.preferencesChanged.connect(self.localsViewer.preferencesChanged) |
|
280 |
|
281 # interconnect the stack selectors of the variable viewers |
|
282 self.gvvStackComboBox.setModel(self.lvvStackComboBox.model()) |
|
283 self.lvvStackComboBox.currentIndexChanged[int].connect( |
|
284 self.gvvStackComboBox.setCurrentIndex |
|
285 ) |
|
286 self.gvvStackComboBox.currentIndexChanged[int].connect( |
|
287 self.lvvStackComboBox.setCurrentIndex |
|
288 ) |
265 |
289 |
266 # add the call stack viewer |
290 # add the call stack viewer |
267 self.callStackViewer = CallStackViewer(self.debugServer) |
291 self.callStackViewer = CallStackViewer(self.debugServer) |
268 index = self.__tabWidget.addTab( |
292 index = self.__tabWidget.addTab( |
269 self.callStackViewer, EricPixmapCache.getIcon("callStack"), "" |
293 self.callStackViewer, EricPixmapCache.getIcon("callStack"), "" |
331 |
355 |
332 self.currentStack = None |
356 self.currentStack = None |
333 self.framenr = 0 |
357 self.framenr = 0 |
334 |
358 |
335 self.__autoViewSource = Preferences.getDebugger("AutoViewSourceCode") |
359 self.__autoViewSource = Preferences.getDebugger("AutoViewSourceCode") |
336 self.sourceButton.setVisible(not self.__autoViewSource) |
360 self.lvvSourceButton.setVisible(not self.__autoViewSource) |
|
361 self.gvvSourceButton.setVisible(not self.__autoViewSource) |
337 |
362 |
338 # connect some debug server signals |
363 # connect some debug server signals |
339 self.debugServer.clientStack.connect(self.handleClientStack) |
364 self.debugServer.clientStack.connect(self.handleClientStack) |
340 self.debugServer.clientThreadList.connect(self.__addThreadList) |
365 self.debugServer.clientThreadList.connect(self.__addThreadList) |
341 self.debugServer.clientDebuggerId.connect(self.__clientDebuggerId) |
366 self.debugServer.clientDebuggerId.connect(self.__clientDebuggerId) |
351 self.exceptionLogger.debuggingStarted |
376 self.exceptionLogger.debuggingStarted |
352 ) |
377 ) |
353 |
378 |
354 self.debugServer.clientLine.connect(self.breakpointViewer.highlightBreakpoint) |
379 self.debugServer.clientLine.connect(self.breakpointViewer.highlightBreakpoint) |
355 |
380 |
|
381 def __clearStackComboBox(self, comboBox): |
|
382 """ |
|
383 Private method to clear the given stack combo box. |
|
384 |
|
385 @param comboBox reference to the combo box to be cleared |
|
386 @type QComboBox |
|
387 """ |
|
388 block = comboBox.blockSignals(True) |
|
389 comboBox.clear() |
|
390 comboBox.blockSignals(block) |
|
391 |
356 def handlePreferencesChanged(self): |
392 def handlePreferencesChanged(self): |
357 """ |
393 """ |
358 Public slot to handle the preferencesChanged signal. |
394 Public slot to handle the preferencesChanged signal. |
359 """ |
395 """ |
360 self.__autoViewSource = Preferences.getDebugger("AutoViewSourceCode") |
396 self.__autoViewSource = Preferences.getDebugger("AutoViewSourceCode") |
361 self.sourceButton.setVisible(not self.__autoViewSource) |
397 self.lvvSourceButton.setVisible(not self.__autoViewSource) |
|
398 self.gvvSourceButton.setVisible(not self.__autoViewSource) |
362 |
399 |
363 def setDebugger(self, debugUI): |
400 def setDebugger(self, debugUI): |
364 """ |
401 """ |
365 Public method to set a reference to the Debug UI. |
402 Public method to set a reference to the Debug UI. |
366 |
403 |
384 """ |
421 """ |
385 self.globalsViewer.handleResetUI() |
422 self.globalsViewer.handleResetUI() |
386 self.localsViewer.handleResetUI() |
423 self.localsViewer.handleResetUI() |
387 self.setGlobalsFilter() |
424 self.setGlobalsFilter() |
388 self.setLocalsFilter() |
425 self.setLocalsFilter() |
389 self.sourceButton.setEnabled(False) |
426 self.lvvSourceButton.setEnabled(False) |
|
427 self.gvvSourceButton.setEnabled(False) |
390 self.currentStack = None |
428 self.currentStack = None |
391 self.stackComboBox.clear() |
429 self.__clearStackComboBox(self.lvvStackComboBox) |
392 self.__tabWidget.setCurrentWidget(self.gvvWidget) |
430 self.__tabWidget.setCurrentWidget(self.gvvWidget) |
393 self.breakpointViewer.handleResetUI() |
431 self.breakpointViewer.handleResetUI() |
394 if fullReset: |
432 if fullReset: |
395 self.__debuggersList.clear() |
433 self.__debuggersList.clear() |
396 self.disassemblyViewer.clear() |
434 self.disassemblyViewer.clear() |
481 @type list of tuples of (str, str, str, str) |
519 @type list of tuples of (str, str, str, str) |
482 @param debuggerId ID of the debugger backend |
520 @param debuggerId ID of the debugger backend |
483 @type str |
521 @type str |
484 """ |
522 """ |
485 if debuggerId == self.getSelectedDebuggerId(): |
523 if debuggerId == self.getSelectedDebuggerId(): |
486 block = self.stackComboBox.blockSignals(True) |
|
487 self.framenr = 0 |
524 self.framenr = 0 |
488 self.stackComboBox.clear() |
525 self.lvvSourceButton.setEnabled(len(stack) > 0) |
|
526 self.gvvSourceButton.setEnabled(len(stack) > 0) |
489 self.currentStack = stack |
527 self.currentStack = stack |
490 self.sourceButton.setEnabled(len(stack) > 0) |
528 |
|
529 block = self.lvvStackComboBox.blockSignals(True) |
|
530 self.lvvStackComboBox.clear() |
491 for s in stack: |
531 for s in stack: |
492 # just show base filename to make it readable |
532 # just show base filename to make it readable |
493 s = (os.path.basename(s[0]), s[1], s[2]) |
533 s = (os.path.basename(s[0]), s[1], s[2]) |
494 self.stackComboBox.addItem("{0}:{1}:{2}".format(*s)) |
534 self.lvvStackComboBox.addItem("{0}:{1}:{2}".format(*s)) |
495 self.stackComboBox.blockSignals(block) |
535 self.lvvStackComboBox.blockSignals(block) |
496 |
536 |
497 def __clientLine(self, fn, line, debuggerId, threadName): |
537 def __clientLine(self, fn, line, debuggerId, threadName): |
498 """ |
538 """ |
499 Private method to handle a change to the current line. |
539 Private method to handle a change to the current line. |
500 |
540 |
533 # the current client has exited |
573 # the current client has exited |
534 self.globalsViewer.handleResetUI() |
574 self.globalsViewer.handleResetUI() |
535 self.localsViewer.handleResetUI() |
575 self.localsViewer.handleResetUI() |
536 self.setGlobalsFilter() |
576 self.setGlobalsFilter() |
537 self.setLocalsFilter() |
577 self.setLocalsFilter() |
538 self.sourceButton.setEnabled(False) |
578 self.lvvSourceButton.setEnabled(False) |
|
579 self.gvvSourceButton.setEnabled(False) |
539 self.currentStack = None |
580 self.currentStack = None |
540 self.stackComboBox.clear() |
581 self.__clearStackComboBox(self.lvvStackComboBox) |
541 |
582 |
542 self.__removeDebugger(debuggerId) |
583 self.__removeDebugger(debuggerId) |
543 |
584 |
544 def __clientSyntaxError( |
585 def __clientSyntaxError( |
545 self, message, filename, lineNo, characterNo, debuggerId, threadName |
586 self, message, filename, lineNo, characterNo, debuggerId, threadName |
598 def __showSource(self): |
639 def __showSource(self): |
599 """ |
640 """ |
600 Private slot to handle the source button press to show the selected |
641 Private slot to handle the source button press to show the selected |
601 file. |
642 file. |
602 """ |
643 """ |
603 index = self.stackComboBox.currentIndex() |
644 index = self.lvvStackComboBox.currentIndex() |
604 if index > -1 and self.currentStack: |
645 if index > -1 and self.currentStack: |
605 s = self.currentStack[index] |
646 s = self.currentStack[index] |
606 self.sourceFile.emit(s[0], int(s[1])) |
647 self.sourceFile.emit(s[0], int(s[1])) |
607 |
648 |
608 def __frameSelected(self, frmnr): |
649 def __frameSelected(self, frmnr): |
705 |
746 |
706 @param frameNo frame number (index) of the selected entry |
747 @param frameNo frame number (index) of the selected entry |
707 @type int |
748 @type int |
708 """ |
749 """ |
709 if frameNo >= 0: |
750 if frameNo >= 0: |
710 self.stackComboBox.setCurrentIndex(frameNo) |
751 self.lvvStackComboBox.setCurrentIndex(frameNo) |
711 |
752 |
712 def __debuggerSelected(self, current, previous): |
753 def __debuggerSelected(self, current, previous): |
713 """ |
754 """ |
714 Private slot to handle the selection of a debugger backend in the |
755 Private slot to handle the selection of a debugger backend in the |
715 debuggers list. |
756 debuggers list. |
724 # it is a debugger item |
765 # it is a debugger item |
725 debuggerId = current.text(0) |
766 debuggerId = current.text(0) |
726 self.globalsViewer.handleResetUI() |
767 self.globalsViewer.handleResetUI() |
727 self.localsViewer.handleResetUI() |
768 self.localsViewer.handleResetUI() |
728 self.currentStack = None |
769 self.currentStack = None |
729 self.stackComboBox.clear() |
770 self.__clearStackComboBox(self.lvvStackComboBox) |
730 self.callStackViewer.clear() |
771 self.callStackViewer.clear() |
731 |
772 |
732 self.debugServer.remoteSetThread(debuggerId, -1) |
773 self.debugServer.remoteSetThread(debuggerId, -1) |
733 self.__showSource() |
774 self.__showSource() |
734 else: |
775 else: |