diff --git a/notes/README.varobjs b/notes/README.varobjs index d14ea5c..05d98d9 100644 --- a/notes/README.varobjs +++ b/notes/README.varobjs @@ -45,8 +45,10 @@ ^done,name="x2112",numchild="1",value="{...}",type="Person",thread-id="1",has_more="0" "-var-info-type x2112" + "-var-info-type x2112.public.location" ^done,type="Person" + ^done,type="Location" "-var-info-num-children x2112" @@ -107,11 +109,26 @@ ^done,value="0.25" ^done,value="{...}" + "-var-info-expression x2112" + "-var-info-expression x2112.public" + "-var-info-expression x2112.public.age" + + ^done,lang="C++",exp="me" + ^done,lang="C++",exp="public" + ^done,lang="C++",exp="age" + + "-var-info-path-expression x2112" + "-var-info-path-expression x2112.public" + "-var-info-path-expression x2112.public.age" + + ^done,path_expr="me" + ^done,path_expr="" + ^done,path_expr="((me).age)" + "-var-delete x2112" ^done,ndeleted="1" - # # 'me.name' # diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 44db88f..98fd39b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -56,6 +56,7 @@ set(HEADER_FILES SeerArrayVisualizerWidget.h SeerMemoryVisualizerWidget.h SeerStructVisualizerWidget.h + SeerVarVisualizerWidget.h SeerRegisterValuesBrowserWidget.h SeerRegisterEditValueDialog.h SeerRunStatusIndicator.h @@ -136,6 +137,7 @@ set(SOURCE_FILES SeerArrayVisualizerWidget.cpp SeerMemoryVisualizerWidget.cpp SeerStructVisualizerWidget.cpp + SeerVarVisualizerWidget.cpp SeerRegisterValuesBrowserWidget.cpp SeerRegisterEditValueDialog.cpp SeerRunStatusIndicator.cpp diff --git a/src/SeerGdbWidget.cpp b/src/SeerGdbWidget.cpp index 72c4de6..50c5a1c 100644 --- a/src/SeerGdbWidget.cpp +++ b/src/SeerGdbWidget.cpp @@ -3,6 +3,7 @@ #include "SeerMemoryVisualizerWidget.h" #include "SeerArrayVisualizerWidget.h" #include "SeerStructVisualizerWidget.h" +#include "SeerVarVisualizerWidget.h" #include "SeerBreakpointsOptionsBarWidget.h" #include "SeerUtl.h" #include @@ -1691,6 +1692,27 @@ void SeerGdbWidget::handleGdbStructAddExpression (QString expression) { w->setVariableName(expression); } +void SeerGdbWidget::handleGdbVarAddExpression (QString expression) { + + if (executableLaunchMode() == "") { + return; + } + + SeerVarVisualizerWidget* w = new SeerVarVisualizerWidget(0); + w->show(); + + // Connect things. + QObject::connect(_gdbMonitor, &GdbMonitor::astrixTextOutput, w, &SeerVarVisualizerWidget::handleText); + QObject::connect(_gdbMonitor, &GdbMonitor::caretTextOutput, w, &SeerVarVisualizerWidget::handleText); + QObject::connect(w, &SeerVarVisualizerWidget::evaluateVariableExpression, this, &SeerGdbWidget::handleGdbDataEvaluateExpression); + QObject::connect(w, &SeerVarVisualizerWidget::addMemoryVisualize, this, &SeerGdbWidget::handleGdbMemoryAddExpression); + QObject::connect(w, &SeerVarVisualizerWidget::addArrayVisualize, this, &SeerGdbWidget::handleGdbArrayAddExpression); + QObject::connect(w, &SeerVarVisualizerWidget::addStructVisualize, this, &SeerGdbWidget::handleGdbStructAddExpression); + + // Tell the visualizer what variable to use. + w->setVariableName(expression); +} + void SeerGdbWidget::handleGdbMemoryEvaluateExpression (int expressionid, QString address, int count) { if (executableLaunchMode() == "") { @@ -1743,6 +1765,10 @@ void SeerGdbWidget::handleGdbStructVisualizer () { handleGdbStructAddExpression(""); } +void SeerGdbWidget::handleGdbVarVisualizer () { + handleGdbVarAddExpression(""); +} + void SeerGdbWidget::handleSplitterMoved (int pos, int index) { Q_UNUSED(pos); diff --git a/src/SeerGdbWidget.h b/src/SeerGdbWidget.h index 3e42c1c..17ebd84 100644 --- a/src/SeerGdbWidget.h +++ b/src/SeerGdbWidget.h @@ -209,6 +209,7 @@ class SeerGdbWidget : public QWidget, protected Ui::SeerGdbWidgetForm { void handleGdbMemoryAddExpression (QString expression); void handleGdbArrayAddExpression (QString expression); void handleGdbStructAddExpression (QString expression); + void handleGdbVarAddExpression (QString expression); void handleGdbMemoryEvaluateExpression (int expressionid, QString address, int count); void handleGdbAsmEvaluateExpression (int expressionid, QString address, int count, int mode); void handleGdbArrayEvaluateExpression (int expressionid, QString address, int count); @@ -216,6 +217,7 @@ class SeerGdbWidget : public QWidget, protected Ui::SeerGdbWidgetForm { void handleGdbMemoryVisualizer (); void handleGdbArrayVisualizer (); void handleGdbStructVisualizer (); + void handleGdbVarVisualizer (); void handleSplitterMoved (int pos, int index); void handleManualCommandChanged (); void handleLogOuputChanged (); diff --git a/src/SeerMainWindow.cpp b/src/SeerMainWindow.cpp index 588c1fe..3a9030d 100644 --- a/src/SeerMainWindow.cpp +++ b/src/SeerMainWindow.cpp @@ -78,6 +78,11 @@ SeerMainWindow::SeerMainWindow(QWidget* parent) : QMainWindow(parent) { // Set the inital key settings. setKeySettings(SeerKeySettings::populate()); + // Setup hidden Var Visualizer. + QShortcut* varVisualizerShotcut = new QShortcut(QKeySequence(tr("Alt+V")), this); + + QObject::connect(varVisualizerShotcut, &QShortcut::activated, this, &SeerMainWindow::handleViewVarVisualizer); + // // Set up signals/slots. // @@ -401,6 +406,11 @@ void SeerMainWindow::handleViewStructVisualizer () { gdbWidget->handleGdbStructVisualizer(); } +void SeerMainWindow::handleViewVarVisualizer () { + + gdbWidget->handleGdbVarVisualizer(); +} + void SeerMainWindow::handleViewAssembly () { gdbWidget->editorManager()->showAssembly(); diff --git a/src/SeerMainWindow.h b/src/SeerMainWindow.h index 4799445..d05e122 100644 --- a/src/SeerMainWindow.h +++ b/src/SeerMainWindow.h @@ -57,6 +57,7 @@ class SeerMainWindow : public QMainWindow, protected Ui::SeerMainWindowForm { void handleViewMemoryVisualizer (); void handleViewArrayVisualizer (); void handleViewStructVisualizer (); + void handleViewVarVisualizer (); void handleViewAssembly (); void handleViewConsoleNormal (); void handleViewConsoleHidden (); diff --git a/src/SeerVarVisualizerWidget.cpp b/src/SeerVarVisualizerWidget.cpp index 25f606b..9b05405 100644 --- a/src/SeerVarVisualizerWidget.cpp +++ b/src/SeerVarVisualizerWidget.cpp @@ -29,7 +29,8 @@ SeerVarVisualizerWidget::SeerVarVisualizerWidget (QWidget* parent) : QWidget(par variableTreeWidget->setRootIsDecorated(true); variableTreeWidget->setItemsExpandable(true); variableTreeWidget->resizeColumnToContents(0); // name - variableTreeWidget->resizeColumnToContents(1); // value + variableTreeWidget->resizeColumnToContents(1); // type + variableTreeWidget->resizeColumnToContents(2); // value variableTreeWidget->clear(); // Connect things. @@ -60,6 +61,7 @@ void SeerVarVisualizerWidget::setVariableName (const QString& name) { QTreeWidgetItem* item = new QTreeWidgetItem; item->setText(0, name); item->setText(1, ""); + item->setText(2, ""); variableTreeWidget->addTopLevelItem(item); } @@ -67,6 +69,7 @@ void SeerVarVisualizerWidget::setVariableName (const QString& name) { // Resize columns. variableTreeWidget->resizeColumnToContents(0); variableTreeWidget->resizeColumnToContents(1); + variableTreeWidget->resizeColumnToContents(2); // Send signal to get variable result. if (variableNameLineEdit->text() != "") { @@ -121,7 +124,8 @@ void SeerVarVisualizerWidget::handleText (const QString& text) { foreach (auto item, topItem->takeChildren()) delete item; // Set the error text. - topItem->setText(1, Seer::filterEscapes(msg_text)); + topItem->setText(1, ""); + topItem->setText(2, Seer::filterEscapes(msg_text)); } @@ -142,6 +146,7 @@ void SeerVarVisualizerWidget::handleText (const QString& text) { // Resize columns. variableTreeWidget->resizeColumnToContents(0); variableTreeWidget->resizeColumnToContents(1); + variableTreeWidget->resizeColumnToContents(2); // Set the cursor back. QApplication::restoreOverrideCursor(); @@ -155,7 +160,8 @@ void SeerVarVisualizerWidget::handleItemCreate (QTreeWidgetItem* parentItem, con QString text = Seer::filterBookends(value_text, '{', '}'); // Set the flatvalue text. - parentItem->setText(1, Seer::filterEscapes(text)); + parentItem->setText(1, ""); + parentItem->setText(2, Seer::filterEscapes(text)); // Convert to a list of name/value pairs. QStringList nv_pairs = Seer::parseCommaList(text, '{', '}'); @@ -174,6 +180,7 @@ void SeerVarVisualizerWidget::handleItemCreate (QTreeWidgetItem* parentItem, con if (prevItem) { prevItem->setText(0, prevItem->text(0) + pair.first); prevItem->setText(1, ""); + prevItem->setText(2, ""); } // Normal case of "name = value". @@ -182,6 +189,7 @@ void SeerVarVisualizerWidget::handleItemCreate (QTreeWidgetItem* parentItem, con QTreeWidgetItem* item = new QTreeWidgetItem; item->setText(0, pair.first); item->setText(1, ""); + item->setText(2, ""); parentItem->addChild(item); @@ -189,7 +197,8 @@ void SeerVarVisualizerWidget::handleItemCreate (QTreeWidgetItem* parentItem, con if (Seer::hasBookends(pair.second, '{', '}')) { handleItemCreate(item, pair.second); }else{ - item->setText(1, Seer::filterEscapes(pair.second)); + item->setText(1, ""); + item->setText(2, Seer::filterEscapes(pair.second)); } prevItem = item; @@ -199,7 +208,8 @@ void SeerVarVisualizerWidget::handleItemCreate (QTreeWidgetItem* parentItem, con parentItem->setExpanded(true); }else{ - parentItem->setText(1, Seer::filterEscapes(value_text)); + parentItem->setText(1, ""); + parentItem->setText(2, Seer::filterEscapes(value_text)); } } @@ -212,7 +222,7 @@ void SeerVarVisualizerWidget::handleContextMenu (const QPoint& pos) { } // Create the variable name. - // It's a struct so include its parent names. + // If it's a struct, include its parent names. QString variable; while (item) { @@ -397,7 +407,7 @@ void SeerVarVisualizerWidget::handleItemEntered (QTreeWidgetItem* item, int colu Q_UNUSED(column); - item->setToolTip(0, item->text(0) + " : " + item->text(1)); + item->setToolTip(0, item->text(0) + " : " + item->text(1) + " : " + item->text(2)); for (int i=1; icolumnCount(); i++) { // Copy tooltip to other columns. item->setToolTip(i, item->toolTip(0)); @@ -411,6 +421,7 @@ void SeerVarVisualizerWidget::handleItemExpanded (QTreeWidgetItem* item) { // Resize columns. variableTreeWidget->resizeColumnToContents(0); variableTreeWidget->resizeColumnToContents(1); + variableTreeWidget->resizeColumnToContents(2); } void SeerVarVisualizerWidget::handleRefreshButton () { @@ -436,7 +447,7 @@ void SeerVarVisualizerWidget::writeSettings () { QSettings settings; - settings.beginGroup("structvisualizerwindow"); + settings.beginGroup("varvisualizerwindow"); settings.setValue("size", size()); settings.endGroup(); } @@ -445,7 +456,7 @@ void SeerVarVisualizerWidget::readSettings () { QSettings settings; - settings.beginGroup("structvisualizerwindow"); + settings.beginGroup("varvisualizerwindow"); resize(settings.value("size", QSize(800, 400)).toSize()); settings.endGroup(); } diff --git a/src/SeerVarVisualizerWidget.ui b/src/SeerVarVisualizerWidget.ui index 1e823a7..5eb8bf5 100644 --- a/src/SeerVarVisualizerWidget.ui +++ b/src/SeerVarVisualizerWidget.ui @@ -68,6 +68,11 @@ Variable + + + Type + + Value