diff -r e9e7eca7efee -r bf71ee032bb4 src/eric7/Debugger/CallTraceViewer.py --- a/src/eric7/Debugger/CallTraceViewer.py Wed Jul 13 11:16:20 2022 +0200 +++ b/src/eric7/Debugger/CallTraceViewer.py Wed Jul 13 14:55:47 2022 +0200 @@ -25,16 +25,17 @@ class CallTraceViewer(QWidget, Ui_CallTraceViewer): """ Class implementing the Call Trace viewer widget. - + @signal sourceFile(str, int) emitted to show the source of a call/return point """ + sourceFile = pyqtSignal(str, int) - + def __init__(self, debugServer, debugViewer, parent=None): """ Constructor - + @param debugServer reference to the debug server object @type DebugServer @param debugViewer reference to the debug viewer object @@ -44,93 +45,92 @@ """ super().__init__(parent) self.setupUi(self) - + self.__dbs = debugServer self.__debugViewer = debugViewer - - self.startTraceButton.setIcon( - UI.PixmapCache.getIcon("callTraceStart")) - self.stopTraceButton.setIcon( - UI.PixmapCache.getIcon("callTraceStop")) + + self.startTraceButton.setIcon(UI.PixmapCache.getIcon("callTraceStart")) + self.stopTraceButton.setIcon(UI.PixmapCache.getIcon("callTraceStop")) self.resizeButton.setIcon(UI.PixmapCache.getIcon("resizeColumns")) self.clearButton.setIcon(UI.PixmapCache.getIcon("editDelete")) self.saveButton.setIcon(UI.PixmapCache.getIcon("fileSave")) - - self.__headerItem = QTreeWidgetItem( - ["", self.tr("From"), self.tr("To")]) + + self.__headerItem = QTreeWidgetItem(["", self.tr("From"), self.tr("To")]) self.__headerItem.setIcon(0, UI.PixmapCache.getIcon("callReturn")) self.callTrace.setHeaderItem(self.__headerItem) - + self.__callStack = [] - + self.__entryFormat = "{0}:{1} ({2})" self.__entryRe = re.compile(r"""(.+):(\d+)\s\((.*)\)""") - + self.__projectMode = False self.__project = None self.__tracedDebuggerId = "" - + stopOnExit = Preferences.toBool( - Preferences.getSettings().value("CallTrace/StopOnExit", True)) + Preferences.getSettings().value("CallTrace/StopOnExit", True) + ) self.stopCheckBox.setChecked(stopOnExit) - - self.__callTraceEnabled = (Preferences.toBool( - Preferences.getSettings().value("CallTrace/Enabled", False)) and - not stopOnExit) - + + self.__callTraceEnabled = ( + Preferences.toBool( + Preferences.getSettings().value("CallTrace/Enabled", False) + ) + and not stopOnExit + ) + if self.__callTraceEnabled: self.startTraceButton.setEnabled(False) else: self.stopTraceButton.setEnabled(False) - + self.__dbs.callTraceInfo.connect(self.__addCallTraceInfo) self.__dbs.clientExit.connect(self.__clientExit) - + def __setCallTraceEnabled(self, enabled): """ Private slot to set the call trace enabled status. - + @param enabled flag indicating the new state @type bool """ if enabled: - self.__tracedDebuggerId = ( - self.__debugViewer.getSelectedDebuggerId() - ) + self.__tracedDebuggerId = self.__debugViewer.getSelectedDebuggerId() self.__dbs.setCallTraceEnabled(self.__tracedDebuggerId, enabled) self.stopTraceButton.setEnabled(enabled) self.startTraceButton.setEnabled(not enabled) self.__callTraceEnabled = enabled Preferences.getSettings().setValue("CallTrace/Enabled", enabled) - + if not enabled: for column in range(self.callTrace.columnCount()): self.callTrace.resizeColumnToContents(column) - + @pyqtSlot(bool) def on_stopCheckBox_clicked(self, checked): """ Private slot to handle a click on the stop check box. - + @param checked state of the check box @type bool """ Preferences.getSettings().setValue("CallTrace/StopOnExit", checked) - + @pyqtSlot() def on_startTraceButton_clicked(self): """ Private slot to start call tracing. """ self.__setCallTraceEnabled(True) - + @pyqtSlot() def on_stopTraceButton_clicked(self): """ Private slot to start call tracing. """ self.__setCallTraceEnabled(False) - + @pyqtSlot() def on_resizeButton_clicked(self): """ @@ -138,14 +138,14 @@ """ for column in range(self.callTrace.columnCount()): self.callTrace.resizeColumnToContents(column) - + @pyqtSlot() def on_clearButton_clicked(self): """ Private slot to clear the call trace. """ self.clear() - + @pyqtSlot() def on_saveButton_clicked(self): """ @@ -158,7 +158,8 @@ "", self.tr("Text Files (*.txt);;All Files (*)"), None, - EricFileDialog.DontConfirmOverwrite) + EricFileDialog.DontConfirmOverwrite, + ) if fname: fpath = pathlib.Path(fname) if not fpath.suffix: @@ -169,15 +170,19 @@ res = EricMessageBox.yesNo( self, self.tr("Save Call Trace Info"), - self.tr("<p>The file <b>{0}</b> already exists." - " Overwrite it?</p>").format(fpath), - icon=EricMessageBox.Warning) + self.tr( + "<p>The file <b>{0}</b> already exists." + " Overwrite it?</p>" + ).format(fpath), + icon=EricMessageBox.Warning, + ) if not res: return - + try: title = self.tr("Call Trace Info of '{0}'").format( - self.__tracedDebuggerId) + self.__tracedDebuggerId + ) with fpath.open("w", encoding="utf-8") as f: f.write("{0}\n".format(title)) f.write("{0}\n\n".format(len(title) * "=")) @@ -185,24 +190,28 @@ while itm is not None: isCall = itm.data(0, Qt.ItemDataRole.UserRole) call = "->" if isCall else "<-" - f.write("{0} {1} || {2}\n".format( - call, - itm.text(1), itm.text(2))) + f.write( + "{0} {1} || {2}\n".format( + call, itm.text(1), itm.text(2) + ) + ) itm = self.callTrace.itemBelow(itm) except OSError as err: EricMessageBox.critical( self, self.tr("Error saving Call Trace Info"), - self.tr("""<p>The call trace info could not""" - """ be written to <b>{0}</b></p>""" - """<p>Reason: {1}</p>""") - .format(fpath, str(err))) - + self.tr( + """<p>The call trace info could not""" + """ be written to <b>{0}</b></p>""" + """<p>Reason: {1}</p>""" + ).format(fpath, str(err)), + ) + @pyqtSlot(QTreeWidgetItem, int) def on_callTrace_itemDoubleClicked(self, item, column): """ Private slot to open the double clicked file in an editor. - + @param item reference to the double clicked item @type QTreeWidgetItem @param column column that was double clicked @@ -221,33 +230,42 @@ if self.__projectMode: filename = self.__project.getAbsolutePath(filename) self.sourceFile.emit(filename, lineno) - + def clear(self): """ Public slot to clear the call trace info. """ self.callTrace.clear() self.__callStack = [] - + def setProjectMode(self, enabled): """ Public slot to set the call trace viewer to project mode. - + In project mode the call trace info is shown with project relative path names. - + @param enabled flag indicating to enable the project mode @type bool """ self.__projectMode = enabled if enabled and self.__project is None: self.__project = ericApp().getObject("Project") - - def __addCallTraceInfo(self, isCall, fromFile, fromLine, fromFunction, - toFile, toLine, toFunction, debuggerId): + + def __addCallTraceInfo( + self, + isCall, + fromFile, + fromLine, + fromFunction, + toFile, + toLine, + toFunction, + debuggerId, + ): """ Private method to add an entry to the call trace viewer. - + @param isCall flag indicating a 'call' @type bool @param fromFile name of the originating file @@ -270,42 +288,44 @@ icon = UI.PixmapCache.getIcon("forward") else: icon = UI.PixmapCache.getIcon("back") - parentItem = ( - self.__callStack[-1] if self.__callStack else self.callTrace) - + parentItem = self.__callStack[-1] if self.__callStack else self.callTrace + if self.__projectMode: fromFile = self.__project.getRelativePath(fromFile) toFile = self.__project.getRelativePath(toFile) - + itm = QTreeWidgetItem( parentItem, - ["", - self.__entryFormat.format(fromFile, fromLine, fromFunction), - self.__entryFormat.format(toFile, toLine, toFunction)]) + [ + "", + self.__entryFormat.format(fromFile, fromLine, fromFunction), + self.__entryFormat.format(toFile, toLine, toFunction), + ], + ) itm.setIcon(0, icon) itm.setData(0, Qt.ItemDataRole.UserRole, isCall) itm.setExpanded(True) - + if isCall: self.__callStack.append(itm) else: if self.__callStack: self.__callStack.pop(-1) - + def isCallTraceEnabled(self): """ Public method to get the state of the call trace function. - + @return flag indicating the state of the call trace function @rtype bool """ return self.__callTraceEnabled - + @pyqtSlot(str, int, str, bool, str) def __clientExit(self, program, status, message, quiet, debuggerId): """ Private slot to handle a debug client terminating. - + @param program name of the exited program @type str @param status exit code of the debugged program