diff --git a/src/SeerGdbWidget.cpp b/src/SeerGdbWidget.cpp index 7851ce4..afb5427 100644 --- a/src/SeerGdbWidget.cpp +++ b/src/SeerGdbWidget.cpp @@ -260,8 +260,8 @@ SeerGdbWidget::SeerGdbWidget (QWidget* parent) : QWidget(parent) { QObject::connect(stackManagerWidget->stackDumpBrowserWidget(), &SeerStackDumpBrowserWidget::addMemoryVisualize, this, &SeerGdbWidget::handleGdbMemoryAddExpression); QObject::connect(stackManagerWidget, &SeerStackManagerWidget::refreshThreadFrames, this, &SeerGdbWidget::handleGdbThreadListFrames); - QObject::connect(variableManagerWidget->variableTrackerBrowserWidget(), &SeerVariableTrackerBrowserWidget::refreshVariableTrackerValues, this, &SeerGdbWidget::handleGdbDataListExpressions); - QObject::connect(variableManagerWidget->variableTrackerBrowserWidget(), &SeerVariableTrackerBrowserWidget::refreshVariableTrackerNames, this, &SeerGdbWidget::handleGdbDataListValues); + QObject::connect(variableManagerWidget->variableTrackerBrowserWidget(), &SeerVariableTrackerBrowserWidget::refreshVariableTrackerNames, this, &SeerGdbWidget::handleGdbDataListExpressions); + QObject::connect(variableManagerWidget->variableTrackerBrowserWidget(), &SeerVariableTrackerBrowserWidget::refreshVariableTrackerValues, this, &SeerGdbWidget::handleGdbDataListValues); QObject::connect(variableManagerWidget->variableTrackerBrowserWidget(), &SeerVariableTrackerBrowserWidget::addVariableExpression, this, &SeerGdbWidget::handleGdbDataAddExpression); QObject::connect(variableManagerWidget->variableTrackerBrowserWidget(), &SeerVariableTrackerBrowserWidget::deleteVariableExpressions, this, &SeerGdbWidget::handleGdbDataDeleteExpressions); QObject::connect(variableManagerWidget->variableTrackerBrowserWidget(), &SeerVariableTrackerBrowserWidget::addMemoryVisualize, this, &SeerGdbWidget::handleGdbMemoryAddExpression); diff --git a/src/SeerVariableLoggerBrowserWidget.cpp b/src/SeerVariableLoggerBrowserWidget.cpp index 30fd874..82e89ce 100644 --- a/src/SeerVariableLoggerBrowserWidget.cpp +++ b/src/SeerVariableLoggerBrowserWidget.cpp @@ -45,68 +45,75 @@ void SeerVariableLoggerBrowserWidget::handleText (const QString& text) { QApplication::setOverrideCursor(Qt::BusyCursor); - if (text.contains(QRegularExpression("^([0-9]+)\\^done,value="))) { + while (1) { + if (text.contains(QRegularExpression("^([0-9]+)\\^done,value="))) { - // "6^done,value=\"\\\"abc\\\"\"" + // "6^done,value=\"\\\"abc\\\"\"" - QString id_text = text.section('^', 0,0); - QString value_text = Seer::parseFirst(text, "value=", '"', '"', false); + QString id_text = text.section('^', 0,0); + QString value_text = Seer::parseFirst(text, "value=", '"', '"', false); - if (_ids.contains(id_text.toInt()) == false) { - QApplication::restoreOverrideCursor(); - return; - } - - QList matches = variablesTreeWidget->findItems(id_text, Qt::MatchExactly, 3); - - if (matches.size() > 0) { - - QTreeWidgetItem* match = matches[0]; - - Q_ASSERT(match->parent() == NULL); - - QString timestamp_text = match->text(0); - QString name_text = match->text(1); - - // Populate the tree. - handleItemCreate(match, id_text, timestamp_text, name_text, value_text); - } - - }else if (text.contains(QRegularExpression("^([0-9]+)\\^error,msg="))) { - - // "1^error,msg=\"No symbol \\\"j\\\" in current context.\"" - - QString id_text = text.section('^', 0,0); - QString msg_text = Seer::parseFirst(text, "msg=", '"', '"', false); - - if (_ids.contains(id_text.toInt()) == true) { + if (_ids.contains(id_text.toInt()) == false) { + break; + } QList matches = variablesTreeWidget->findItems(id_text, Qt::MatchExactly, 3); if (matches.size() > 0) { - matches.first()->setText(1, ""); // Overwrite "name" with "" because it's not a valid "name". - matches.first()->setText(2, Seer::filterEscapes(msg_text)); + + QTreeWidgetItem* match = matches[0]; + + Q_ASSERT(match->parent() == NULL); + + QString timestamp_text = match->text(0); + QString name_text = match->text(1); + + // Populate the tree. + handleItemCreate(match, id_text, timestamp_text, name_text, value_text); + + emit raiseTab(); } + + }else if (text.contains(QRegularExpression("^([0-9]+)\\^error,msg="))) { + + // "1^error,msg=\"No symbol \\\"j\\\" in current context.\"" + + QString id_text = text.section('^', 0,0); + QString msg_text = Seer::parseFirst(text, "msg=", '"', '"', false); + + if (_ids.contains(id_text.toInt()) == true) { + + QList matches = variablesTreeWidget->findItems(id_text, Qt::MatchExactly, 3); + + if (matches.size() > 0) { + matches.first()->setText(1, ""); // Overwrite "name" with "" because it's not a valid "name". + matches.first()->setText(2, Seer::filterEscapes(msg_text)); + } + + emit raiseTab(); + } + + }else if (text.startsWith("^error,msg=\"No registers.\"")) { + + variablesTreeWidget->clear(); + + }else{ + // Ignore others. } - }else if (text.startsWith("^error,msg=\"No registers.\"")) { + // Resize columns. + variablesTreeWidget->resizeColumnToContents(0); + variablesTreeWidget->resizeColumnToContents(1); + variablesTreeWidget->resizeColumnToContents(2); + variablesTreeWidget->resizeColumnToContents(3); - variablesTreeWidget->clear(); + // Scroll to the bottom. + QTreeWidgetItem* lastItem = variablesTreeWidget->topLevelItem(variablesTreeWidget->topLevelItemCount()-1); + if (lastItem) { + variablesTreeWidget->scrollToItem(lastItem); + } - }else{ - // Ignore others. - } - - // Resize columns. - variablesTreeWidget->resizeColumnToContents(0); - variablesTreeWidget->resizeColumnToContents(1); - variablesTreeWidget->resizeColumnToContents(2); - variablesTreeWidget->resizeColumnToContents(3); - - // Scroll to the bottom. - QTreeWidgetItem* lastItem = variablesTreeWidget->topLevelItem(variablesTreeWidget->topLevelItemCount()-1); - if (lastItem) { - variablesTreeWidget->scrollToItem(lastItem); + break; } // Set the cursor back. diff --git a/src/SeerVariableLoggerBrowserWidget.h b/src/SeerVariableLoggerBrowserWidget.h index 9f74ff3..779e6eb 100644 --- a/src/SeerVariableLoggerBrowserWidget.h +++ b/src/SeerVariableLoggerBrowserWidget.h @@ -33,6 +33,7 @@ class SeerVariableLoggerBrowserWidget : public QWidget, protected Ui::SeerVariab void addMemoryVisualize (QString expression); void addArrayVisualize (QString expression); void addStructVisualize (QString expression); + void raiseTab (); protected: void handleItemCreate (QTreeWidgetItem* parentItem, const QString& id_text, const QString& timestamp_text, const QString& name_text, const QString& value_text); diff --git a/src/SeerVariableManagerWidget.cpp b/src/SeerVariableManagerWidget.cpp index f8754ac..7a212db 100644 --- a/src/SeerVariableManagerWidget.cpp +++ b/src/SeerVariableManagerWidget.cpp @@ -44,10 +44,12 @@ SeerVariableManagerWidget::SeerVariableManagerWidget (QWidget* parent) : QWidget readSettings(); // Connect things. - QObject::connect(refreshToolButton, &QToolButton::clicked, this, &SeerVariableManagerWidget::handleRefreshToolButtonClicked); - QObject::connect(helpToolButton, &QToolButton::clicked, this, &SeerVariableManagerWidget::handleHelpToolButtonClicked); - QObject::connect(tabWidget->tabBar(), &QTabBar::tabMoved, this, &SeerVariableManagerWidget::handleTabMoved); - QObject::connect(tabWidget->tabBar(), &QTabBar::currentChanged, this, &SeerVariableManagerWidget::handleTabChanged); + QObject::connect(refreshToolButton, &QToolButton::clicked, this, &SeerVariableManagerWidget::handleRefreshToolButtonClicked); + QObject::connect(helpToolButton, &QToolButton::clicked, this, &SeerVariableManagerWidget::handleHelpToolButtonClicked); + QObject::connect(tabWidget->tabBar(), &QTabBar::tabMoved, this, &SeerVariableManagerWidget::handleTabMoved); + QObject::connect(tabWidget->tabBar(), &QTabBar::currentChanged, this, &SeerVariableManagerWidget::handleTabChanged); + QObject::connect(_variableLoggerBrowserWidget, &SeerVariableLoggerBrowserWidget::raiseTab, this, &SeerVariableManagerWidget::handleRaiseLoggerTab); + QObject::connect(_variableTrackerBrowserWidget, &SeerVariableTrackerBrowserWidget::raiseTab, this, &SeerVariableManagerWidget::handleRaiseTrackerTab); } SeerVariableManagerWidget::~SeerVariableManagerWidget () { @@ -94,6 +96,28 @@ void SeerVariableManagerWidget::handleTabChanged (int index) { writeSettings(); } +void SeerVariableManagerWidget::handleRaiseLoggerTab () { + + int idx = tabWidget->indexOf(_variableLoggerBrowserWidget); + + if (idx < 0) { + return; + } + + tabWidget->setCurrentIndex(idx); +} + +void SeerVariableManagerWidget::handleRaiseTrackerTab () { + + int idx = tabWidget->indexOf(_variableTrackerBrowserWidget); + + if (idx < 0) { + return; + } + + tabWidget->setCurrentIndex(idx); +} + void SeerVariableManagerWidget::writeSettings () { // Write tab order to settings. diff --git a/src/SeerVariableManagerWidget.h b/src/SeerVariableManagerWidget.h index d6b9525..e2e6c3a 100644 --- a/src/SeerVariableManagerWidget.h +++ b/src/SeerVariableManagerWidget.h @@ -29,6 +29,8 @@ class SeerVariableManagerWidget : public QWidget, protected Ui::SeerVariableMana void handleHelpToolButtonClicked (); void handleTabMoved (int from, int to); void handleTabChanged (int index); + void handleRaiseLoggerTab (); + void handleRaiseTrackerTab (); private: SeerVariableTrackerBrowserWidget* _variableTrackerBrowserWidget; diff --git a/src/SeerVariableTrackerBrowserWidget.cpp b/src/SeerVariableTrackerBrowserWidget.cpp index 568f3d5..4e35fc0 100644 --- a/src/SeerVariableTrackerBrowserWidget.cpp +++ b/src/SeerVariableTrackerBrowserWidget.cpp @@ -43,31 +43,53 @@ SeerVariableTrackerBrowserWidget::~SeerVariableTrackerBrowserWidget () { void SeerVariableTrackerBrowserWidget::handleText (const QString& text) { - // Don't do any work if the widget is hidden. - if (isHidden()) { - return; - } - QApplication::setOverrideCursor(Qt::BusyCursor); - if (text.startsWith("^done,DataExpressionTable={") && text.endsWith("}")) { + while (1) { + if (text.startsWith("^done,DataExpressionTable={") && text.endsWith("}")) { - // "^done,DataExpressionTable={ - // entry={id=\"1\",expression=\"s\"}, - // entry={id=\"2\",expression=\"v\"}, - // entry={id=\"4\",expression=\"l\"}, - // entry={id=\"5\",expression=\"m\"} - // }" + // "^done,DataExpressionTable={ + // entry={id=\"1\",expression=\"s\"}, + // entry={id=\"2\",expression=\"v\"}, + // entry={id=\"4\",expression=\"l\"}, + // entry={id=\"5\",expression=\"m\"} + // }" - QString frame_text = Seer::parseFirst(text, "DataExpressionTable=", '{', '}', false); + QString frame_text = Seer::parseFirst(text, "DataExpressionTable=", '{', '}', false); - QStringList entries_list = Seer::parse(frame_text, "entry=", '{', '}', false); + QStringList entries_list = Seer::parse(frame_text, "entry=", '{', '}', false); - for (int i=0; i matches = variablesTreeWidget->findItems(id_text, Qt::MatchExactly, 2); + + if (matches.count() == 0) { + + QTreeWidgetItem* topItem = new QTreeWidgetItem; + topItem->setText(0, expression_text); + topItem->setText(1, ""); + topItem->setFont(1, QFontDatabase::systemFont(QFontDatabase::FixedFont)); + topItem->setText(2, id_text); + topItem->setText(3, "new"); + + variablesTreeWidget->addTopLevelItem(topItem); + } + } + + }else if (text.startsWith("^done,DataExpressionAdded={") && text.endsWith("}")) { + + // "^done,DataExpressionAdded={ + // id=\"5\", + // expression=\"m\" + // }" + + QString frame_text = Seer::parseFirst(text, "DataExpressionAdded=", '{', '}', false); + QString id_text = Seer::parseFirst(frame_text, "id=", '"', '"', false); + QString expression_text = Seer::parseFirst(frame_text, "expression=", '"', '"', false); QList matches = variablesTreeWidget->findItems(id_text, Qt::MatchExactly, 2); @@ -81,126 +103,109 @@ void SeerVariableTrackerBrowserWidget::handleText (const QString& text) { topItem->setText(3, "new"); variablesTreeWidget->addTopLevelItem(topItem); + + refreshValues(); + + emit raiseTab(); } - } - }else if (text.startsWith("^done,DataExpressionAdded={") && text.endsWith("}")) { + }else if (text.startsWith("^done,DataExpressionDeleted={") && text.endsWith("}")) { - // "^done,DataExpressionAdded={ - // id=\"5\", - // expression=\"m\" - // }" + // "^done,DataExpressionDeleted={ + // entry={id=\"1\",expression=\"s\"}, + // entry={id=\"3\",expression=\"vb\"} + // }" - QString frame_text = Seer::parseFirst(text, "DataExpressionAdded=", '{', '}', false); - QString id_text = Seer::parseFirst(frame_text, "id=", '"', '"', false); - QString expression_text = Seer::parseFirst(frame_text, "expression=", '"', '"', false); + QString frame_text = Seer::parseFirst(text, "DataExpressionDeleted=", '{', '}', false); - QList matches = variablesTreeWidget->findItems(id_text, Qt::MatchExactly, 2); + QStringList entries_list = Seer::parse(frame_text, "entry=", '{', '}', false); - if (matches.count() == 0) { + for (int i=0; isetText(0, expression_text); - topItem->setText(1, ""); - topItem->setFont(1, QFontDatabase::systemFont(QFontDatabase::FixedFont)); - topItem->setText(2, id_text); - topItem->setText(3, "new"); + QString entry_text = entries_list[i]; + QString id_text = Seer::parseFirst(entry_text, "id=", '"', '"', false); + QString expression_text = Seer::parseFirst(entry_text, "expression=", '"', '"', false); - variablesTreeWidget->addTopLevelItem(topItem); - } + QList matches = variablesTreeWidget->findItems(id_text, Qt::MatchExactly, 2); - }else if (text.startsWith("^done,DataExpressionDeleted={") && text.endsWith("}")) { + qDeleteAll(matches); + } - // "^done,DataExpressionDeleted={ - // entry={id=\"1\",expression=\"s\"}, - // entry={id=\"3\",expression=\"vb\"} - // }" + }else if (text.contains(QRegularExpression("^([0-9]+)\\^done,value="))) { - QString frame_text = Seer::parseFirst(text, "DataExpressionDeleted=", '{', '}', false); + // "6^done,value=\"\\\"abc\\\"\"" - QStringList entries_list = Seer::parse(frame_text, "entry=", '{', '}', false); - - for (int i=0; i matches = variablesTreeWidget->findItems(id_text, Qt::MatchExactly, 2); - qDeleteAll(matches); - } + if (matches.count() == 1) { - }else if (text.contains(QRegularExpression("^([0-9]+)\\^done,value="))) { + Q_ASSERT(matches.count() == 1); - // "6^done,value=\"\\\"abc\\\"\"" + // There should be only one. + QTreeWidgetItem* item = matches[0]; - QString id_text = text.section('^', 0,0); - QString value_text = Seer::parseFirst(text, "value=", '"', '"', false); + // Mark each entry initially as "unused". + // Later, some will be marked as "reused" or "new". Then the "unused" ones will + // be deleted. + QTreeWidgetItemIterator itmark(item); + while (*itmark) { + (*itmark)->setText(3, "unused"); + ++itmark; + } - // Find the ones that match our 'id'. - QList matches = variablesTreeWidget->findItems(id_text, Qt::MatchExactly, 2); + // Set the value. + handleItemCreate (item, value_text); - if (matches.count() == 1) { + emit raiseTab(); - Q_ASSERT(matches.count() == 1); - - // There should be only one. - QTreeWidgetItem* item = matches[0]; - - // Mark each entry initially as "unused". - // Later, some will be marked as "reused" or "new". Then the "unused" ones will - // be deleted. - QTreeWidgetItemIterator itmark(item); - while (*itmark) { - (*itmark)->setText(3, "unused"); - ++itmark; + // At this point, there are some new entries, some reused entries, and some unused ones. + // For now, don't bother deleting 'unused' ones. } - // Set the value. - handleItemCreate (item, value_text); + }else if (text.contains(QRegularExpression("^([0-9]+)\\^error,msg="))) { - // At this point, there are some new entries, some reused entries, and some unused ones. - // For now, don't bother deleting 'unused' ones. + // "1^error,msg=\"No symbol \\\"j\\\" in current context.\"" + + QString id_text = text.section('^', 0,0); + QString msg_text = Seer::parseFirst(text, "msg=", '"', '"', false); + + // Find the ones that match our 'id'. + QList matches = variablesTreeWidget->findItems(id_text, Qt::MatchExactly, 2); + + if (matches.count() == 1) { + + // There should be only one. + QTreeWidgetItem* item = matches[0]; + + // Remove any children. + QList children = item->takeChildren(); + + qDeleteAll(children); + + // Set the text with the error message. + item->setText(1, Seer::filterEscapes(msg_text)); + item->setText(3, "used"); + } + + }else if (text.startsWith("^error,msg=\"No registers.\"")) { + variablesTreeWidget->clear(); + + }else{ + // Ignore others. } - }else if (text.contains(QRegularExpression("^([0-9]+)\\^error,msg="))) { + variablesTreeWidget->resizeColumnToContents(0); + variablesTreeWidget->resizeColumnToContents(1); + variablesTreeWidget->resizeColumnToContents(2); + variablesTreeWidget->resizeColumnToContents(3); - // "1^error,msg=\"No symbol \\\"j\\\" in current context.\"" - - QString id_text = text.section('^', 0,0); - QString msg_text = Seer::parseFirst(text, "msg=", '"', '"', false); - - // Find the ones that match our 'id'. - QList matches = variablesTreeWidget->findItems(id_text, Qt::MatchExactly, 2); - - if (matches.count() == 1) { - - // There should be only one. - QTreeWidgetItem* item = matches[0]; - - // Remove any children. - QList children = item->takeChildren(); - - qDeleteAll(children); - - // Set the text with the error message. - item->setText(1, Seer::filterEscapes(msg_text)); - item->setText(3, "used"); - } - - }else if (text.startsWith("^error,msg=\"No registers.\"")) { - variablesTreeWidget->clear(); - - }else{ - // Ignore others. + break; } - variablesTreeWidget->resizeColumnToContents(0); - variablesTreeWidget->resizeColumnToContents(1); - variablesTreeWidget->resizeColumnToContents(2); - variablesTreeWidget->resizeColumnToContents(3); - QApplication::restoreOverrideCursor(); } diff --git a/src/SeerVariableTrackerBrowserWidget.h b/src/SeerVariableTrackerBrowserWidget.h index 0cb0ca0..5b2e287 100644 --- a/src/SeerVariableTrackerBrowserWidget.h +++ b/src/SeerVariableTrackerBrowserWidget.h @@ -36,6 +36,7 @@ class SeerVariableTrackerBrowserWidget : public QWidget, protected Ui::SeerVaria void addMemoryVisualize (QString expression); void addArrayVisualize (QString expression); void addStructVisualize (QString expression); + void raiseTab (); protected: void handleItemCreate (QTreeWidgetItem* item, const QString& value_text);