From 3203a9b7817ba20d78b7f0ee748883f2e5e71fc2 Mon Sep 17 00:00:00 2001 From: Ernie Pasveer Date: Sun, 16 Jan 2022 09:55:17 -0600 Subject: [PATCH] Add saving and remembering of manual gdb commands. --- src/SeerCaretAsteriskLogWidget.cpp | 4 + src/SeerConfigDialog.cpp | 64 +++++---- src/SeerConfigDialog.h | 5 + src/SeerGdbWidget.cpp | 129 ++++++++++++++--- src/SeerGdbWidget.h | 9 ++ src/SeerLogWidget.ui | 98 ++++++++----- src/SeerMainWindow.cpp | 10 ++ src/SeerSeerConfigPage.cpp | 22 +++ src/SeerSeerConfigPage.h | 6 + src/SeerSeerConfigPage.ui | 175 ++++++++++++++--------- src/SeerTildeEqualAmpersandLogWidget.cpp | 4 + src/SeerTildeLogWidget.cpp | 4 + 12 files changed, 379 insertions(+), 151 deletions(-) diff --git a/src/SeerCaretAsteriskLogWidget.cpp b/src/SeerCaretAsteriskLogWidget.cpp index 026f281..4f36ead 100644 --- a/src/SeerCaretAsteriskLogWidget.cpp +++ b/src/SeerCaretAsteriskLogWidget.cpp @@ -12,6 +12,10 @@ SeerCaretAsteriskLogWidget::~SeerCaretAsteriskLogWidget () { void SeerCaretAsteriskLogWidget::processText (const QString& text) { + if (enableCheckBox->isChecked() == false) { + return; + } + // Only log '^' and '*' records. if (text.front() != '^' && text.front() != '*' && text.contains(QRegExp("^([0-9]+)\\^")) == false) { return; diff --git a/src/SeerConfigDialog.cpp b/src/SeerConfigDialog.cpp index 3c257e3..c91fc3d 100644 --- a/src/SeerConfigDialog.cpp +++ b/src/SeerConfigDialog.cpp @@ -145,6 +145,26 @@ QString SeerConfigDialog::seerConsoleMode () const { return _seerConfigPage->consoleMode(); } +void SeerConfigDialog::setSeerRememberManualCommandCount (int count) { + + _seerConfigPage->setRememberManualCommandCount(count); +} + +int SeerConfigDialog::seerRememberManualCommandCount () const { + + return _seerConfigPage->rememberManualCommandCount(); +} + +void SeerConfigDialog::setSeerClearManualCommandHistory (bool flag) { + + _seerConfigPage->setClearManualCommandHistory(flag); +} + +bool SeerConfigDialog::seerClearManualCommandHistory () const { + + return _seerConfigPage->clearManualCommandHistory(); +} + void SeerConfigDialog::handleChangePage(QListWidgetItem* current, QListWidgetItem* previous) { //qDebug() << __PRETTY_FUNCTION__ << ":" << current << previous; @@ -163,42 +183,34 @@ void SeerConfigDialog::handleButtonClicked (QAbstractButton* button) { QString itemLabel = contentsListWidget->currentItem()->text(); + int result = QMessageBox::warning(this, "Seer", + QString("Reset settings for '") + itemLabel + "'?", + QMessageBox::Ok|QMessageBox::Cancel, QMessageBox::Cancel); + + if (result != QMessageBox::Ok) { + return; + } + if (itemLabel == "GDB") { - int result = QMessageBox::warning(this, "Seer", - QString("Reset settings for '") + itemLabel + "'?", - QMessageBox::Ok|QMessageBox::Cancel, QMessageBox::Cancel); - - if (result == QMessageBox::Ok) { - setGdbProgram("/usr/bin/gdb"); - setGdbArguments("--interpreter=mi"); - setGdbAsyncMode(true); - } + setGdbProgram("/usr/bin/gdb"); + setGdbArguments("--interpreter=mi"); + setGdbAsyncMode(true); }else if (itemLabel == "Editor") { - int result = QMessageBox::warning(this, "Seer", - QString("Reset settings for '") + itemLabel + "'?", - QMessageBox::Ok|QMessageBox::Cancel, QMessageBox::Cancel); - - if (result == QMessageBox::Ok) { - setEditorFont(QFont("Source Code Pro", 10)); - setEditorHighlighterSettings(SeerHighlighterSettings::populateForCPP()); - setEditorHighlighterEnabled(true); - } + setEditorFont(QFont("Source Code Pro", 10)); + setEditorHighlighterSettings(SeerHighlighterSettings::populateForCPP()); + setEditorHighlighterEnabled(true); }else if (itemLabel == "Source") { }else if (itemLabel == "Seer") { - int result = QMessageBox::warning(this, "Seer", - QString("Reset settings for '") + itemLabel + "'?", - QMessageBox::Ok|QMessageBox::Cancel, QMessageBox::Cancel); - - if (result == QMessageBox::Ok) { - setSeerRememberWindowSizes(true); - setSeerConsoleMode("normal"); - } + setSeerConsoleMode("normal"); + setSeerRememberWindowSizes(true); + setSeerRememberManualCommandCount(10); + setSeerClearManualCommandHistory(false); }else{ } diff --git a/src/SeerConfigDialog.h b/src/SeerConfigDialog.h index 5ebd915..59bbe42 100644 --- a/src/SeerConfigDialog.h +++ b/src/SeerConfigDialog.h @@ -48,6 +48,11 @@ class SeerConfigDialog : public QDialog, protected Ui::SeerConfigDialogForm { void setSeerConsoleMode (const QString& mode); QString seerConsoleMode () const; + void setSeerRememberManualCommandCount (int count); + int seerRememberManualCommandCount () const; + void setSeerClearManualCommandHistory (bool flag); + bool seerClearManualCommandHistory () const; + public slots: void handleChangePage (QListWidgetItem* current, QListWidgetItem* previous); void handleButtonClicked (QAbstractButton* button); diff --git a/src/SeerGdbWidget.cpp b/src/SeerGdbWidget.cpp index dd6bb5b..156fa98 100644 --- a/src/SeerGdbWidget.cpp +++ b/src/SeerGdbWidget.cpp @@ -33,6 +33,8 @@ SeerGdbWidget::SeerGdbWidget (QWidget* parent) : QWidget(parent) { _gdbProgram = "/usr/bin/gdb"; _gdbArguments = "--interpreter=mi"; _gdbASyncMode = true; + _consoleMode = ""; + _rememberManualCommandCount = 10; setNewExecutableFlag(true); @@ -178,6 +180,7 @@ SeerGdbWidget::SeerGdbWidget (QWidget* parent) : QWidget(parent) { QObject::connect(sourceLibraryVariableManagerSplitter, &QSplitter::splitterMoved, this, &SeerGdbWidget::handleSplitterMoved); QObject::connect(codeManagerLogTabsSplitter, &QSplitter::splitterMoved, this, &SeerGdbWidget::handleSplitterMoved); QObject::connect(stackThreadManagersplitter, &QSplitter::splitterMoved, this, &SeerGdbWidget::handleSplitterMoved); + QObject::connect(manualCommandComboBox, &QComboBox::editTextChanged, this, &SeerGdbWidget::handleManualCommandChanged); // Restore window settings. setConsoleMode("normal"); @@ -1217,6 +1220,13 @@ void SeerGdbWidget::handleSplitterMoved (int pos, int index) { writeSettings(); } +void SeerGdbWidget::handleManualCommandChanged () { + + //qDebug() << __PRETTY_FUNCTION__ << ":" << "Manual Command ComboBox changed"; + + writeSettings(); +} + void SeerGdbWidget::handleGdbProcessFinished (int exitCode, QProcess::ExitStatus exitStatus) { Q_UNUSED(exitCode); @@ -1243,32 +1253,58 @@ void SeerGdbWidget::writeSettings () { QSettings settings; - settings.beginGroup("mainwindowsplitters"); - settings.setValue("leftCenterRightSplitter", leftCenterRightSplitter->saveState()); - settings.setValue("codeManagerLogTabsSplitter", codeManagerLogTabsSplitter->saveState()); - settings.setValue("sourceLibraryVariableManagerSplitter", sourceLibraryVariableManagerSplitter->saveState()); - settings.setValue("stackThreadManagersplitter", stackThreadManagersplitter->saveState()); - settings.endGroup(); + settings.beginGroup("mainwindowsplitters"); { + settings.setValue("leftCenterRightSplitter", leftCenterRightSplitter->saveState()); + settings.setValue("codeManagerLogTabsSplitter", codeManagerLogTabsSplitter->saveState()); + settings.setValue("sourceLibraryVariableManagerSplitter", sourceLibraryVariableManagerSplitter->saveState()); + settings.setValue("stackThreadManagersplitter", stackThreadManagersplitter->saveState()); + } settings.endGroup(); - settings.beginGroup("consolewindow"); - settings.setValue("start", consoleMode()); - settings.endGroup(); + settings.beginGroup("consolewindow"); { + settings.setValue("start", consoleMode()); + }settings.endGroup(); + + settings.beginWriteArray("manualgdbcommands"); { + + QStringList commands = manualCommands(rememberManualCommandCount()); + + //qDebug() << __PRETTY_FUNCTION__ << ":" << "Commands =" << commands; + + for (int i = 0; i < commands.size(); ++i) { + settings.setArrayIndex(i); + settings.setValue("command", commands[i]); + } + + } settings.endArray(); } void SeerGdbWidget::readSettings () { QSettings settings; - settings.beginGroup("mainwindowsplitters"); - leftCenterRightSplitter->restoreState(settings.value("leftCenterRightSplitter").toByteArray()); - codeManagerLogTabsSplitter->restoreState(settings.value("codeManagerLogTabsSplitter").toByteArray()); - sourceLibraryVariableManagerSplitter->restoreState(settings.value("sourceLibraryVariableManagerSplitter").toByteArray()); - stackThreadManagersplitter->restoreState(settings.value("stackThreadManagersplitter").toByteArray()); - settings.endGroup(); + settings.beginGroup("mainwindowsplitters"); { + leftCenterRightSplitter->restoreState(settings.value("leftCenterRightSplitter").toByteArray()); + codeManagerLogTabsSplitter->restoreState(settings.value("codeManagerLogTabsSplitter").toByteArray()); + sourceLibraryVariableManagerSplitter->restoreState(settings.value("sourceLibraryVariableManagerSplitter").toByteArray()); + stackThreadManagersplitter->restoreState(settings.value("stackThreadManagersplitter").toByteArray()); + } settings.endGroup(); - settings.beginGroup("consolewindow"); - setConsoleMode(settings.value("start", "normal").toString()); - settings.endGroup(); + settings.beginGroup("consolewindow"); { + setConsoleMode(settings.value("start", "normal").toString()); + } settings.endGroup(); + + int size = settings.beginReadArray("manualgdbcommands"); { + + QStringList commands; + + for (int i = 0; i < size; ++i) { + settings.setArrayIndex(i); + + commands << settings.value("command").toString(); + } + + setManualCommands(commands); + } settings.endArray(); } bool SeerGdbWidget::isGdbRuning () const { @@ -1368,10 +1404,6 @@ void SeerGdbWidget::setConsoleMode (const QString& mode) { }else{ } } - - //_consoleWidget->hide(); // Hide the console. Use show() to restore it. - //_consoleWidget->setWindowState(Qt::WindowNoState); // Show it normally. - //_consoleWidget->setWindowState(Qt::WindowMinimized); // Show it minimized. } QString SeerGdbWidget::consoleMode () const { @@ -1383,6 +1415,59 @@ QString SeerGdbWidget::consoleMode () const { return _consoleMode; } +void SeerGdbWidget::setManualCommands (const QStringList& commands) { + + manualCommandComboBox->clear(); + + manualCommandComboBox->addItems(commands); +} + +QStringList SeerGdbWidget::manualCommands(int count) const { + + //qDebug() << __PRETTY_FUNCTION__ << "Count =" << count; + + // Select all if a zero. + if (count == 0) { + count = manualCommandComboBox->count(); + } + + // No more than count. + if (count > manualCommandComboBox->count()) { + count = manualCommandComboBox->count(); + } + + // Calculate starting position in list. + int index = manualCommandComboBox->count() - count; + + // Get the list. + QStringList list; + + for (; indexitemText(index); + } + + return list; +} + +void SeerGdbWidget::setRememberManualCommandCount (int count) { + + _rememberManualCommandCount = count; +} + +int SeerGdbWidget::rememberManualCommandCount () const { + + return _rememberManualCommandCount; +} + +void SeerGdbWidget::clearManualCommandHistory () { + + // Zap the entries in the combobox. + manualCommandComboBox->clear(); + + // Write the settings. + writeSettings(); +} + void SeerGdbWidget::sendGdbInterrupt (int signal) { //qDebug() << __PRETTY_FUNCTION__ << "Sending an interrupt to the program. Signal =" << signal; diff --git a/src/SeerGdbWidget.h b/src/SeerGdbWidget.h index 05621cb..33a933d 100644 --- a/src/SeerGdbWidget.h +++ b/src/SeerGdbWidget.h @@ -61,6 +61,13 @@ class SeerGdbWidget : public QWidget, protected Ui::SeerGdbWidgetForm { void setConsoleMode (const QString& mode); QString consoleMode () const; + void setManualCommands (const QStringList& commands); + QStringList manualCommands (int count) const; + + void setRememberManualCommandCount (int count); + int rememberManualCommandCount () const; + void clearManualCommandHistory (); + // Editor manager. SeerEditorManagerWidget* editorManager (); @@ -131,6 +138,7 @@ class SeerGdbWidget : public QWidget, protected Ui::SeerGdbWidgetForm { void handleGdbArrayAddExpression (QString expression); void handleGdbArrayVisualizer (); void handleSplitterMoved (int pos, int index); + void handleManualCommandChanged (); void handleGdbProcessFinished (int exitCode, QProcess::ExitStatus exitStatus); void handleGdbProcessErrored (QProcess::ProcessError errorStatus); @@ -163,6 +171,7 @@ class SeerGdbWidget : public QWidget, protected Ui::SeerGdbWidgetForm { SeerConsoleWidget* _consoleWidget; QString _consoleMode; + int _rememberManualCommandCount; SeerBreakpointsBrowserWidget* _breakpointsBrowserWidget; SeerWatchpointsBrowserWidget* _watchpointsBrowserWidget; SeerCatchpointsBrowserWidget* _catchpointsBrowserWidget; diff --git a/src/SeerLogWidget.ui b/src/SeerLogWidget.ui index 4e18b65..e361613 100644 --- a/src/SeerLogWidget.ui +++ b/src/SeerLogWidget.ui @@ -14,19 +14,22 @@ Seer Log - - - - Save the log output to a file. + + + + + 100 + 0 + - - + + QTextEdit::NoWrap - - + + false - - + + [gdb output] @@ -42,36 +45,11 @@ - + + .. - - - - QTextEdit::NoWrap - - - false - - - [gdb output] - - - - - - - Qt::Vertical - - - - 20 - 266 - - - - @@ -84,7 +62,25 @@ - + + .. + + + + + + + Save the log output to a file. + + + + + + + + + + .. @@ -101,6 +97,32 @@ + + + + Enable/Disable output to this log. + + + Enable + + + true + + + + + + + Qt::Vertical + + + + 20 + 266 + + + + diff --git a/src/SeerMainWindow.cpp b/src/SeerMainWindow.cpp index 123d582..ff93b3c 100644 --- a/src/SeerMainWindow.cpp +++ b/src/SeerMainWindow.cpp @@ -307,6 +307,7 @@ void SeerMainWindow::handleSettingsConfiguration () { dlg.setEditorHighlighterSettings(gdbWidget->editorManager()->editorHighlighterSettings()); dlg.setEditorHighlighterEnabled(gdbWidget->editorManager()->editorHighlighterEnabled()); dlg.setSeerConsoleMode(gdbWidget->consoleMode()); + dlg.setSeerRememberManualCommandCount(gdbWidget->rememberManualCommandCount()); int ret = dlg.exec(); @@ -314,6 +315,7 @@ void SeerMainWindow::handleSettingsConfiguration () { return; } + // Update the GdbWidget with the new settings. gdbWidget->setGdbProgram(dlg.gdbProgram()); gdbWidget->setGdbArguments(dlg.gdbArguments()); gdbWidget->setGdbAsyncMode(dlg.gdbAsyncMode()); @@ -321,6 +323,14 @@ void SeerMainWindow::handleSettingsConfiguration () { gdbWidget->editorManager()->setEditorHighlighterSettings(dlg.editorHighlighterSettings()); gdbWidget->editorManager()->setEditorHighlighterEnabled(dlg.editorHighlighterEnabled()); gdbWidget->setConsoleMode(dlg.seerConsoleMode()); + gdbWidget->setRememberManualCommandCount(dlg.seerRememberManualCommandCount()); + + // Clear history, if we need to. + bool clearManualCommandHistory = dlg.seerClearManualCommandHistory(); + + if (clearManualCommandHistory) { + gdbWidget->clearManualCommandHistory(); + } } void SeerMainWindow::handleSettingsSaveConfiguration () { diff --git a/src/SeerSeerConfigPage.cpp b/src/SeerSeerConfigPage.cpp index f22fd97..3b0ef45 100644 --- a/src/SeerSeerConfigPage.cpp +++ b/src/SeerSeerConfigPage.cpp @@ -9,6 +9,8 @@ SeerSeerConfigPage::SeerSeerConfigPage(QWidget* parent) : QWidget(parent) { // Setup the widgets setConsoleMode("normal"); setRememberWindowSizes(true); + setRememberManualCommandCount(10); + setClearManualCommandHistory(false); // Connect things. } @@ -58,3 +60,23 @@ bool SeerSeerConfigPage::rememberWindowSizes () const { return rememberSizescheckBox->isChecked(); } +void SeerSeerConfigPage::setRememberManualCommandCount (int count) { + + rememberGdbCommandsSpinBox->setValue(count); +} + +int SeerSeerConfigPage::rememberManualCommandCount () const { + + return rememberGdbCommandsSpinBox->value(); +} + +void SeerSeerConfigPage::setClearManualCommandHistory (bool flag) { + + clearHistoryCheckBox->setChecked(flag); +} + +bool SeerSeerConfigPage::clearManualCommandHistory () const { + + return clearHistoryCheckBox->isChecked(); +} + diff --git a/src/SeerSeerConfigPage.h b/src/SeerSeerConfigPage.h index f449c68..c51e6e0 100644 --- a/src/SeerSeerConfigPage.h +++ b/src/SeerSeerConfigPage.h @@ -17,5 +17,11 @@ class SeerSeerConfigPage : public QWidget, public Ui::SeerSeerConfigPage { void setRememberWindowSizes (bool flag); bool rememberWindowSizes () const; + + void setRememberManualCommandCount (int count); + int rememberManualCommandCount () const; + + void setClearManualCommandHistory (bool flag); + bool clearManualCommandHistory () const; }; diff --git a/src/SeerSeerConfigPage.ui b/src/SeerSeerConfigPage.ui index 6aac174..a14c657 100644 --- a/src/SeerSeerConfigPage.ui +++ b/src/SeerSeerConfigPage.ui @@ -13,44 +13,124 @@ SeerSeerConfigPage - + 0 0 - - - - Number of manual gdb/mi commands to remember + + + + Console mode on startup + + + + + The console is shown normally. + + + Normal + + + modeButtonGroup + + + + + + + The console is shown minimized in the task bar. + + + Minimized + + + modeButtonGroup + + + + + + + The console is totally hidden. Can be reshown with: View->Console->Normal + + + Hidden + + + modeButtonGroup + + + + + + + + + + Window sizes + + + + + + Remember window sizes. + + + + - - - Remember window sizes. + + + Manual Gdb commands + + + + + Number of manual commands to rememvber. 0 means all. + + + + + + + Clear all manual gdb commands. + + + Clear history + + + + + + + Number of manual gdb/mi commands to remember + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> @@ -63,51 +143,16 @@ p, li { white-space: pre-wrap; } <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The window sizes can be remembered if they get changed. On startup, Seer will start with the rembered sizes.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Also, 'N' number of the most recent gdb/mi commands will be remembered.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Also, 'N' number of the most recent gdb/mi commands will be remembered. 0 means all.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> - - - - Console mode on startup - - - - - - Normal - - - modeButtonGroup - - - - - - - Minimized - - - modeButtonGroup - - - - - - - Hidden - - - modeButtonGroup - - - - - - + windowSizesGroupBox + textBrowser + consoleModeGroupBox + manualGdbCommandsGroupBox diff --git a/src/SeerTildeEqualAmpersandLogWidget.cpp b/src/SeerTildeEqualAmpersandLogWidget.cpp index 88c5729..213d90d 100644 --- a/src/SeerTildeEqualAmpersandLogWidget.cpp +++ b/src/SeerTildeEqualAmpersandLogWidget.cpp @@ -11,6 +11,10 @@ SeerTildeEqualAmpersandLogWidget::~SeerTildeEqualAmpersandLogWidget () { void SeerTildeEqualAmpersandLogWidget::processText (const QString& text) { + if (enableCheckBox->isChecked() == false) { + return; + } + QString str; // Remove leading "~" diff --git a/src/SeerTildeLogWidget.cpp b/src/SeerTildeLogWidget.cpp index 2c0aa7b..390fd8c 100644 --- a/src/SeerTildeLogWidget.cpp +++ b/src/SeerTildeLogWidget.cpp @@ -10,6 +10,10 @@ SeerTildeLogWidget::~SeerTildeLogWidget () { void SeerTildeLogWidget::processText (const QString& text) { + if (enableCheckBox->isChecked() == false) { + return; + } + QString str = text.mid(1); // Remove leading "~" if (str.front() == '"') { // Remove leading """