From 18dc573e7ae8fb9def2835ac291cf54dff9ef987 Mon Sep 17 00:00:00 2001 From: Ernie Pasveer Date: Mon, 21 Mar 2022 17:37:53 -0500 Subject: [PATCH] Checkpoint: ArrayVisualizer. --- src/QZoomChartView.cpp | 11 +++ src/SeerArrayVisualizerWidget.cpp | 72 ++++++++++++---- src/SeerArrayVisualizerWidget.h | 6 +- src/SeerArrayVisualizerWidget.ui | 131 ++++++++++++++++++++++++------ src/SeerGdbWidget.cpp | 6 +- src/SeerGdbWidget.ui | 2 +- 6 files changed, 181 insertions(+), 47 deletions(-) diff --git a/src/QZoomChartView.cpp b/src/QZoomChartView.cpp index 0c39144..76b8a7b 100644 --- a/src/QZoomChartView.cpp +++ b/src/QZoomChartView.cpp @@ -20,6 +20,17 @@ QZoomChartView::QZoomChartView (QChart* chart, QWidget* parent) : QChartView(cha bool QZoomChartView::viewportEvent (QEvent* event) { + // Disable ToolTip events in the ChartView. They interfer with the 'length' arguments + // of the QToolTip::showText() function. + // https://bugreports.qt.io/browse/QTBUG-56427 + + switch (event->type()) { + case QEvent::ToolTip: + return false; + default: + break; + } + return QChartView::viewportEvent(event); } diff --git a/src/SeerArrayVisualizerWidget.cpp b/src/SeerArrayVisualizerWidget.cpp index a1520e7..dcfa387 100644 --- a/src/SeerArrayVisualizerWidget.cpp +++ b/src/SeerArrayVisualizerWidget.cpp @@ -2,6 +2,7 @@ #include "SeerUtl.h" #include #include +#include #include #include #include @@ -25,16 +26,16 @@ SeerArrayVisualizerWidget::SeerArrayVisualizerWidget (QWidget* parent) : QWidget setWindowTitle("Seer Array Visualizer"); arrayLengthLineEdit->setValidator(new QIntValidator(1, 9999999, this)); - columnCountSpinBox->setValue(arrayTableWidget->elementsPerLine()); + arrayOffsetLineEdit->setValidator(new QIntValidator(0, 9999999, this)); + arrayStrideLineEdit->setValidator(new QIntValidator(1, 9999999, this)); arrayDisplayFormatComboBox->setCurrentIndex(0); handleArrayDisplayFormatComboBox(0); - // XXX Test + // A single series chart. QChart* chart = new QChart; chart->legend()->hide(); chart->createDefaultAxes(); - chart->setTitle("Simple line chart example"); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); @@ -46,8 +47,11 @@ SeerArrayVisualizerWidget::SeerArrayVisualizerWidget (QWidget* parent) : QWidget QObject::connect(arrayLengthLineEdit, &QLineEdit::returnPressed, this, &SeerArrayVisualizerWidget::handleRefreshButton); QObject::connect(variableNameLineEdit, &QLineEdit::returnPressed, this, &SeerArrayVisualizerWidget::handleVariableNameLineEdit); QObject::connect(arrayDisplayFormatComboBox, QOverload::of(&QComboBox::currentIndexChanged), this, &SeerArrayVisualizerWidget::handleArrayDisplayFormatComboBox); - QObject::connect(columnCountSpinBox, QOverload::of(&QSpinBox::valueChanged), this, &SeerArrayVisualizerWidget::handleColumnCountSpinBox); QObject::connect(arrayTableWidget, &SeerArrayWidget::dataChanged, this, &SeerArrayVisualizerWidget::handleDataChanged); + QObject::connect(splitter, &QSplitter::splitterMoved, this, &SeerArrayVisualizerWidget::handleSplitterMoved); + QObject::connect(titleLineEdit, &QLineEdit::returnPressed, this, &SeerArrayVisualizerWidget::handleTitleLineEdit); + QObject::connect(pointsCheckBox, &QCheckBox::clicked, this, &SeerArrayVisualizerWidget::handlePointsCheckBox); + QObject::connect(labelsCheckBox, &QCheckBox::clicked, this, &SeerArrayVisualizerWidget::handleLabelsCheckBox); // Restore window settings. readSettings(); @@ -252,11 +256,6 @@ void SeerArrayVisualizerWidget::handleArrayDisplayFormatComboBox (int index) { } } -void SeerArrayVisualizerWidget::handleColumnCountSpinBox (int value) { - - arrayTableWidget->setElementsPerLine(value); -} - void SeerArrayVisualizerWidget::handleDataChanged () { if (_series) { @@ -267,6 +266,8 @@ void SeerArrayVisualizerWidget::handleDataChanged () { _series = new QLineSeries; _series->setName(variableName()); + _series->setPointsVisible(false); + _series->setPointLabelsVisible(false); const QVector& values = arrayTableWidget->arrayValues(); @@ -274,6 +275,8 @@ void SeerArrayVisualizerWidget::handleDataChanged () { _series->append(i, values[i]); } + QObject::connect(_series, &QLineSeries::hovered, this, &SeerArrayVisualizerWidget::handleSeriesHovered); + arrayChartView->chart()->addSeries(_series); arrayChartView->chart()->createDefaultAxes(); } @@ -282,9 +285,10 @@ void SeerArrayVisualizerWidget::writeSettings() { QSettings settings; - settings.beginGroup("arrayvisualizerwindow"); - settings.setValue("size", size()); - settings.endGroup(); + settings.beginGroup("arrayvisualizerwindow"); { + settings.setValue("size", size()); + settings.setValue("splitter", splitter->saveState()); + } settings.endGroup(); //qDebug() << size(); } @@ -293,9 +297,10 @@ void SeerArrayVisualizerWidget::readSettings() { QSettings settings; - settings.beginGroup("arrayvisualizerwindow"); - resize(settings.value("size", QSize(800, 400)).toSize()); - settings.endGroup(); + settings.beginGroup("arrayvisualizerwindow"); { + resize(settings.value("size", QSize(800, 400)).toSize()); + splitter->restoreState(settings.value("splitter").toByteArray()); + } settings.endGroup(); //qDebug() << size(); } @@ -307,3 +312,40 @@ void SeerArrayVisualizerWidget::resizeEvent (QResizeEvent* event) { QWidget::resizeEvent(event); } +void SeerArrayVisualizerWidget::handleSplitterMoved (int pos, int index) { + + writeSettings(); +} + +void SeerArrayVisualizerWidget::handleSeriesHovered (const QPointF& point, bool state) { + + //qDebug() << "QPointF=" << point << "State=" << state << "MapToPosition=" << arrayChartView->chart()->mapToPosition(point) << "MapFromScene=" << arrayChartView->mapFromScene(arrayChartView->chart()->mapToPosition(point)); + + if (state) { + QToolTip::showText(arrayChartView->mapToGlobal(arrayChartView->mapFromScene(arrayChartView->chart()->mapToPosition(point))), QString("%1 / %2").arg(point.x()).arg(point.y()), this, QRect(), 10000); + }else{ + QToolTip::hideText(); + } +} + +void SeerArrayVisualizerWidget::handleTitleLineEdit () { + + arrayChartView->chart()->setTitle(titleLineEdit->text()); + + titleLineEdit->setText(""); +} + +void SeerArrayVisualizerWidget::handlePointsCheckBox () { + + if (_series) { + _series->setPointsVisible(pointsCheckBox->isChecked()); + } +} + +void SeerArrayVisualizerWidget::handleLabelsCheckBox () { + + if (_series) { + _series->setPointLabelsVisible(labelsCheckBox->isChecked()); + } +} + diff --git a/src/SeerArrayVisualizerWidget.h b/src/SeerArrayVisualizerWidget.h index 600bad5..9eb306b 100644 --- a/src/SeerArrayVisualizerWidget.h +++ b/src/SeerArrayVisualizerWidget.h @@ -28,8 +28,12 @@ class SeerArrayVisualizerWidget : public QWidget, protected Ui::SeerArrayVisuali void handleRefreshButton (); void handleVariableNameLineEdit (); void handleArrayDisplayFormatComboBox (int index); - void handleColumnCountSpinBox (int value); void handleDataChanged (); + void handleSplitterMoved (int pos, int index); + void handleSeriesHovered (const QPointF& point, bool state); + void handleTitleLineEdit (); + void handlePointsCheckBox (); + void handleLabelsCheckBox (); protected: void writeSettings (); diff --git a/src/SeerArrayVisualizerWidget.ui b/src/SeerArrayVisualizerWidget.ui index af59781..326d663 100644 --- a/src/SeerArrayVisualizerWidget.ui +++ b/src/SeerArrayVisualizerWidget.ui @@ -25,7 +25,7 @@ variable name - false + true @@ -40,21 +40,59 @@ variable address + + false + - Number of elements to display. + Total number of elements in array. - # Elements + # elements - false + true + + + + + + + Element offset into array. + + + + + + + + + array offset + + + true + + + + + + + Element stride between array values.. + + + + + + array stride + + + true @@ -105,19 +143,6 @@ - - - - Number of columns in display. - - - 1 - - - 10 - - - @@ -137,9 +162,9 @@ - + 0 - 100 + 0 @@ -148,18 +173,70 @@ - 25 + 1 0 - - - - 75 - 0 - - + + + + QLayout::SetDefaultConstraint + + + + + + 100 + 0 + + + + + + + + + + + 0 + 0 + + + + Set chart title. + + + chart title + + + true + + + + + + + Show chart data points. + + + Points + + + + + + + Show chart data labels. + + + Labels + + + + + + diff --git a/src/SeerGdbWidget.cpp b/src/SeerGdbWidget.cpp index be828cd..6cedf73 100644 --- a/src/SeerGdbWidget.cpp +++ b/src/SeerGdbWidget.cpp @@ -199,7 +199,7 @@ SeerGdbWidget::SeerGdbWidget (QWidget* parent) : QWidget(parent) { QObject::connect(leftCenterRightSplitter, &QSplitter::splitterMoved, this, &SeerGdbWidget::handleSplitterMoved); 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(stackThreadManagerSplitter, &QSplitter::splitterMoved, this, &SeerGdbWidget::handleSplitterMoved); QObject::connect(manualCommandComboBox, QOverload::of(&QComboBox::activated), this, &SeerGdbWidget::handleManualCommandChanged); QObject::connect(_gdbOutputLog, &SeerLogWidget::logEnabledChanged, this, &SeerGdbWidget::handleLogOuputChanged); QObject::connect(_seerOutputLog, &SeerLogWidget::logEnabledChanged, this, &SeerGdbWidget::handleLogOuputChanged); @@ -1543,7 +1543,7 @@ void SeerGdbWidget::writeSettings () { settings.setValue("leftCenterRightSplitter", leftCenterRightSplitter->saveState()); settings.setValue("codeManagerLogTabsSplitter", codeManagerLogTabsSplitter->saveState()); settings.setValue("sourceLibraryVariableManagerSplitter", sourceLibraryVariableManagerSplitter->saveState()); - settings.setValue("stackThreadManagersplitter", stackThreadManagersplitter->saveState()); + settings.setValue("stackThreadManagerSplitter", stackThreadManagerSplitter->saveState()); } settings.endGroup(); settings.beginGroup("consolewindow"); { @@ -1589,7 +1589,7 @@ void SeerGdbWidget::readSettings () { leftCenterRightSplitter->restoreState(settings.value("leftCenterRightSplitter").toByteArray()); codeManagerLogTabsSplitter->restoreState(settings.value("codeManagerLogTabsSplitter").toByteArray()); sourceLibraryVariableManagerSplitter->restoreState(settings.value("sourceLibraryVariableManagerSplitter").toByteArray()); - stackThreadManagersplitter->restoreState(settings.value("stackThreadManagersplitter").toByteArray()); + stackThreadManagerSplitter->restoreState(settings.value("stackThreadManagerSplitter").toByteArray()); } settings.endGroup(); settings.beginGroup("consolewindow"); { diff --git a/src/SeerGdbWidget.ui b/src/SeerGdbWidget.ui index 09b7a35..69660f4 100644 --- a/src/SeerGdbWidget.ui +++ b/src/SeerGdbWidget.ui @@ -92,7 +92,7 @@ - + 20