From 30d21fe2dc7e11e8c16ffd7afafbeb304769886d Mon Sep 17 00:00:00 2001 From: Ernie Pasveer Date: Sat, 30 Mar 2024 12:43:30 -0500 Subject: [PATCH] Add context menu to create breakpoints on Function browser. --- src/SeerFunctionBrowserWidget.cpp | 49 ++++++++++++++++++++++-- src/SeerFunctionBrowserWidget.h | 2 + src/SeerGdbWidget.cpp | 1 + src/SeerRegisterValuesBrowserWidget.cpp | 15 +++++--- src/SeerStackLocalsBrowserWidget.cpp | 2 +- src/SeerVariableLoggerBrowserWidget.cpp | 2 +- src/SeerVariableTrackerBrowserWidget.cpp | 2 +- 7 files changed, 61 insertions(+), 12 deletions(-) diff --git a/src/SeerFunctionBrowserWidget.cpp b/src/SeerFunctionBrowserWidget.cpp index 4de83092..d6a66f1c 100644 --- a/src/SeerFunctionBrowserWidget.cpp +++ b/src/SeerFunctionBrowserWidget.cpp @@ -4,7 +4,8 @@ #include #include #include -#include +#include +#include #include #include #include @@ -20,6 +21,7 @@ SeerFunctionBrowserWidget::SeerFunctionBrowserWidget (QWidget* parent) : QWidget // Setup the widgets functionSearchLineEdit->setPlaceholderText("Search regex..."); functionSearchLineEdit->setClearButtonEnabled(true); + functionTreeWidget->setContextMenuPolicy(Qt::CustomContextMenu); functionTreeWidget->setMouseTracking(true); //functionTreeWidget->resizeColumnToContents(0); functionTreeWidget->resizeColumnToContents(1); @@ -31,9 +33,10 @@ SeerFunctionBrowserWidget::SeerFunctionBrowserWidget (QWidget* parent) : QWidget functionTreeWidget->setSortingEnabled(false); // Connect things. - QObject::connect(functionTreeWidget, &QTreeWidget::itemDoubleClicked, this, &SeerFunctionBrowserWidget::handleItemDoubleClicked); - QObject::connect(functionTreeWidget, &QTreeWidget::itemEntered, this, &SeerFunctionBrowserWidget::handleItemEntered); - QObject::connect(functionSearchLineEdit, &QLineEdit::returnPressed, this, &SeerFunctionBrowserWidget::handleSearchLineEdit); + QObject::connect(functionTreeWidget, &QTreeWidget::customContextMenuRequested, this, &SeerFunctionBrowserWidget::handleContextMenu); + QObject::connect(functionTreeWidget, &QTreeWidget::itemDoubleClicked, this, &SeerFunctionBrowserWidget::handleItemDoubleClicked); + QObject::connect(functionTreeWidget, &QTreeWidget::itemEntered, this, &SeerFunctionBrowserWidget::handleItemEntered); + QObject::connect(functionSearchLineEdit, &QLineEdit::returnPressed, this, &SeerFunctionBrowserWidget::handleSearchLineEdit); } SeerFunctionBrowserWidget::~SeerFunctionBrowserWidget () { @@ -171,6 +174,44 @@ void SeerFunctionBrowserWidget::handleSearchLineEdit () { } } +void SeerFunctionBrowserWidget::handleContextMenu (const QPoint& pos) { + + // Get the item at the cursor. + QTreeWidgetItem* item = functionTreeWidget->itemAt(pos); + + if (item == 0) { + return; + } + + // Construct the menu. + QMenu menu ("Options", this); + QAction* openAction = menu.addAction(QString("Open '%1'").arg(item->text(1))); + QAction* breakpointSourceAction = menu.addAction(QString("Create breakpoint on '%1:%2'").arg(item->text(1)).arg(item->text(2))); + QAction* breakpointFunctionAction = menu.addAction(QString("Create breakpoint in '%1'").arg(item->text(0))); + + // Execute the menu. Return if nothing. + QAction* action = menu.exec(functionTreeWidget->viewport()->mapToGlobal(pos)); + + if (action == 0) { + return; + } + + if (action == openAction) { + emit selectedFile(item->text(1), item->text(3), item->text(2).toInt()); + return; + } + + if (action == breakpointSourceAction) { + emit insertBreakpoint(QString("--source %1 --line %2").arg(item->text(3)).arg(item->text(2))); + return; + } + + if (action == breakpointFunctionAction) { + emit insertBreakpoint(QString("--function \"%1\"").arg(item->text(0))); + return; + } +} + void SeerFunctionBrowserWidget::refresh () { handleSearchLineEdit(); } diff --git a/src/SeerFunctionBrowserWidget.h b/src/SeerFunctionBrowserWidget.h index e7ac63da..45c1fea4 100644 --- a/src/SeerFunctionBrowserWidget.h +++ b/src/SeerFunctionBrowserWidget.h @@ -14,6 +14,7 @@ class SeerFunctionBrowserWidget : public QWidget, protected Ui::SeerFunctionBrow public slots: void handleText (const QString& text); + void handleContextMenu (const QPoint& pos); void refresh (); protected slots: @@ -24,6 +25,7 @@ class SeerFunctionBrowserWidget : public QWidget, protected Ui::SeerFunctionBrow signals: void refreshFunctionList (int id, const QString& functionRegex); void selectedFile (QString file, QString fullname, int lineno); + void insertBreakpoint (QString breakpoint); protected: private: diff --git a/src/SeerGdbWidget.cpp b/src/SeerGdbWidget.cpp index 9e8a5187..2ce781aa 100644 --- a/src/SeerGdbWidget.cpp +++ b/src/SeerGdbWidget.cpp @@ -209,6 +209,7 @@ SeerGdbWidget::SeerGdbWidget (QWidget* parent) : QWidget(parent) { QObject::connect(sourceLibraryManagerWidget->sourceBrowserWidget(), &SeerSourceBrowserWidget::selectedFile, editorManagerWidget, &SeerEditorManagerWidget::handleOpenFile); QObject::connect(sourceLibraryManagerWidget->functionBrowserWidget(), &SeerFunctionBrowserWidget::refreshFunctionList, this, &SeerGdbWidget::handleGdbExecutableFunctions); QObject::connect(sourceLibraryManagerWidget->functionBrowserWidget(), &SeerFunctionBrowserWidget::selectedFile, editorManagerWidget, &SeerEditorManagerWidget::handleOpenFile); + QObject::connect(sourceLibraryManagerWidget->functionBrowserWidget(), &SeerFunctionBrowserWidget::insertBreakpoint, this, &SeerGdbWidget::handleGdbBreakpointInsert); QObject::connect(sourceLibraryManagerWidget->typeBrowserWidget(), &SeerTypeBrowserWidget::refreshTypeList, this, &SeerGdbWidget::handleGdbExecutableTypes); QObject::connect(sourceLibraryManagerWidget->typeBrowserWidget(), &SeerTypeBrowserWidget::selectedFile, editorManagerWidget, &SeerEditorManagerWidget::handleOpenFile); QObject::connect(sourceLibraryManagerWidget->staticBrowserWidget(), &SeerStaticBrowserWidget::refreshVariableList, this, &SeerGdbWidget::handleGdbExecutableVariables); diff --git a/src/SeerRegisterValuesBrowserWidget.cpp b/src/SeerRegisterValuesBrowserWidget.cpp index a4a0ab7d..f85ff576 100644 --- a/src/SeerRegisterValuesBrowserWidget.cpp +++ b/src/SeerRegisterValuesBrowserWidget.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -286,11 +287,15 @@ void SeerRegisterValuesBrowserWidget::handleContextMenu (const QPoint& pos) { // Get the item at the cursor. QTreeWidgetItem* item = registersTreeWidget->itemAt(pos); + if (item == 0) { + return; + } + // Construct the menu. - QMenu* menu = new QMenu("Options", this); - QAction* editAction = menu->addAction("Edit selected"); - QAction* copyAction = menu->addAction("Copy selected"); - QAction* copyAllAction = menu->addAction("Copy all"); + QMenu menu("Options", this); + QAction* editAction = menu.addAction("Edit selected"); + QAction* copyAction = menu.addAction("Copy selected"); + QAction* copyAllAction = menu.addAction("Copy all"); // If no selected item, disable 'selected' copy but allow 'all'. if (item == 0) { @@ -299,7 +304,7 @@ void SeerRegisterValuesBrowserWidget::handleContextMenu (const QPoint& pos) { } // Execute the menu. Return if nothing. - QAction* action = menu->exec(registersTreeWidget->mapToGlobal(pos)); + QAction* action = menu.exec(registersTreeWidget->viewport()->mapToGlobal(pos)); if (action == 0) { return; diff --git a/src/SeerStackLocalsBrowserWidget.cpp b/src/SeerStackLocalsBrowserWidget.cpp index 6cc91d6a..d6d1bfd7 100644 --- a/src/SeerStackLocalsBrowserWidget.cpp +++ b/src/SeerStackLocalsBrowserWidget.cpp @@ -5,8 +5,8 @@ #include #include #include +#include #include -#include #include #include diff --git a/src/SeerVariableLoggerBrowserWidget.cpp b/src/SeerVariableLoggerBrowserWidget.cpp index d8783c60..b6eb4a43 100644 --- a/src/SeerVariableLoggerBrowserWidget.cpp +++ b/src/SeerVariableLoggerBrowserWidget.cpp @@ -350,7 +350,7 @@ void SeerVariableLoggerBrowserWidget::handleContextMenu (const QPoint& pos) { } // Execute the menu. Return if nothing. - QAction* action = menu.exec(variablesTreeWidget->mapToGlobal(pos)); + QAction* action = menu.exec(variablesTreeWidget->viewport()->mapToGlobal(pos)); if (action == 0) { return; diff --git a/src/SeerVariableTrackerBrowserWidget.cpp b/src/SeerVariableTrackerBrowserWidget.cpp index 4c8a0377..58d368df 100644 --- a/src/SeerVariableTrackerBrowserWidget.cpp +++ b/src/SeerVariableTrackerBrowserWidget.cpp @@ -489,7 +489,7 @@ void SeerVariableTrackerBrowserWidget::handleContextMenu (const QPoint& pos) { } // Execute the menu. Return if nothing. - QAction* action = menu.exec(variablesTreeWidget->mapToGlobal(pos)); + QAction* action = menu.exec(variablesTreeWidget->viewport()->mapToGlobal(pos)); if (action == 0) { return;