From 949b618da20405a74df70aae09ceee1e9fb7ed89 Mon Sep 17 00:00:00 2001 From: tobiglaser <76131623+tobiglaser@users.noreply.github.com> Date: Thu, 8 May 2025 16:27:30 +0200 Subject: [PATCH] added Reset Button to Chart Menu + some refactoring --- src/chartMenu.cpp | 125 +++++++++++++++++++++++++++++----------------- src/chartMenu.h | 11 ++-- src/control.cpp | 1 + 3 files changed, 86 insertions(+), 51 deletions(-) diff --git a/src/chartMenu.cpp b/src/chartMenu.cpp index 0f13c4a..d9d888d 100644 --- a/src/chartMenu.cpp +++ b/src/chartMenu.cpp @@ -2,61 +2,64 @@ #include "cute.h" +#include <QAction.h> #include <QCheckBox> +#include <QDialog> +#include <QDialogButtonBox> +#include <QLabel> #include <QLogValueAxis> +#include <QVBoxLayout> #include <QValueAxis> -#include <qaction.h> -#include <string> ChartMenu::ChartMenu(std::vector<QWidget*>& graphingWidgets, QWidget* parent) : QMenu(parent) { - cv = graphingWidgets; + this->graphingWidgets = graphingWidgets; - for (size_t i = 0; i < cv.size(); ++i) + for (size_t i = 0; i < graphingWidgets.size(); ++i) { - QString name = "Plot "; - name += std::to_string(i).c_str(); - QAction* checkboxAction = new QAction(name, this); - vis.push_back(checkboxAction); - QAction* menuCheck = new QAction(name, this); + QString name = "Plot "; + name += std::to_string(i).c_str(); titles.push_back(name); - visMenu.push_back(menuCheck); - menuCheck->setCheckable(true); - menuCheck->setChecked(!cv[i]->isHidden()); - checkboxAction->setCheckable(true); // Make it checkable - checkboxAction->setChecked(!cv[i]->isHidden()); - - QtCharts::QChartView* chartView = dynamic_cast<QtCharts::QChartView*>(cv[i]); - if (!chartView) - { - addAction(checkboxAction); - connect(checkboxAction, &QAction::triggered, this, &ChartMenu::onOptionSelected); - } - else + + QAction* menuAction = new QAction(name, this); + menuActions.push_back(menuAction); + menuAction->setCheckable(true); + menuAction->setChecked(!graphingWidgets[i]->isHidden()); + addAction(menuAction); + + QMenu* menu = new QMenu(name); + menuAction->setMenu(menu); + + QAction* visibilityAction = new QAction(name, this); + visibilityAction->setCheckable(true); // Make it checkable + visibilityAction->setChecked(!graphingWidgets[i]->isHidden()); + visibiliyActions.push_back(visibilityAction); + menu->addAction(visibilityAction); + connect(visibilityAction, &QAction::triggered, this, &ChartMenu::onVisibility); + + QAction* resetAction = new QAction("Reset", this); + menu->addAction(resetAction); + resetActions.push_back(resetAction); + connect(resetAction, &QAction::triggered, this, &ChartMenu::onReset); + + QtCharts::QChartView* chartView = dynamic_cast<QtCharts::QChartView*>(graphingWidgets[i]); + if (chartView) { - QString name = "Plot "; - name += std::to_string(i).c_str(); - addAction(menuCheck); - QMenu* scaleMenu = new QMenu(name); - menuCheck->setMenu(scaleMenu); - - scaleMenu->addAction(checkboxAction); - connect(checkboxAction, &QAction::triggered, this, &ChartMenu::onOptionSelected); - scaleMenu->addSeparator(); + menu->addSeparator(); QAction* xlinAction = new QAction("X - linear"); xlinAction->setCheckable(true); - scaleMenu->addAction(xlinAction); + menu->addAction(xlinAction); QAction* xlogAction = new QAction("X - logarithmic"); xlogAction->setCheckable(true); - scaleMenu->addAction(xlogAction); - scaleMenu->addSeparator(); + menu->addAction(xlogAction); + menu->addSeparator(); QAction* ylinAction = new QAction("Y - linear"); ylinAction->setCheckable(true); - scaleMenu->addAction(ylinAction); + menu->addAction(ylinAction); QAction* ylogAction = new QAction("Y - logarithmic"); ylogAction->setCheckable(true); - scaleMenu->addAction(ylogAction); + menu->addAction(ylogAction); scaleBundles.push_back({xlinAction, xlogAction, ylinAction, ylogAction, chartView}); connect(xlinAction, &QAction::triggered, this, &ChartMenu::onScale); connect(xlogAction, &QAction::triggered, this, &ChartMenu::onScale); @@ -71,12 +74,12 @@ ChartMenu::ChartMenu(std::vector<QWidget*>& graphingWidgets, QWidget* parent) : void ChartMenu::onShow() { - for (size_t i = 0; i < cv.size(); ++i) + for (size_t i = 0; i < graphingWidgets.size(); ++i) { - vis[i]->setChecked(!cv[i]->isHidden()); - vis[i]->setText(titles[i]); - visMenu[i]->setChecked(!cv[i]->isHidden()); - visMenu[i]->setText(titles[i]); + visibiliyActions[i]->setChecked(!graphingWidgets[i]->isHidden()); + visibiliyActions[i]->setText(graphingWidgets[i]->isHidden() ? "show" : "hide"); + menuActions[i]->setChecked(!graphingWidgets[i]->isHidden()); + menuActions[i]->setText(titles[i]); } for (auto&& sB : scaleBundles) @@ -116,16 +119,44 @@ void ChartMenu::onShow() } } -void ChartMenu::onOptionSelected() +void ChartMenu::onVisibility() +{ + QAction* senderAction = qobject_cast<QAction*>(sender()); + if (senderAction) + { + for (size_t i = 0; i < visibiliyActions.size(); ++i) + { + if (senderAction == visibiliyActions[i]) + { + graphingWidgets[i]->setHidden(!senderAction->isChecked()); + } + } + } +} + +void ChartMenu::onReset() { QAction* senderAction = qobject_cast<QAction*>(sender()); if (senderAction) { - for (size_t i = 0; i < vis.size(); ++i) + for (size_t i = 0; i < resetActions.size(); ++i) { - if (senderAction == vis[i]) + if (senderAction == resetActions[i]) { - cv[i]->setHidden(!senderAction->isChecked()); + QDialog dialog; + dialog.setWindowTitle("Confirm Reset"); + dialog.setWindowFlags(Qt::Dialog | Qt::WindowTitleHint | Qt::WindowCloseButtonHint); + QVBoxLayout layout(&dialog); + QLabel label("Reset " + titles[i] + '?'); + layout.addWidget(&label); + QDialogButtonBox buttonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + layout.addWidget(&buttonBox); + QObject::connect(&buttonBox, &QDialogButtonBox::accepted, &dialog, &QDialog::accept); + QObject::connect(&buttonBox, &QDialogButtonBox::rejected, &dialog, &QDialog::reject); + // modal execution + int result = dialog.exec(); + if (result == QDialog::Accepted) + emit s_resetPlot(i); } } } @@ -182,9 +213,9 @@ void ChartMenu::onScale() } } int plotIndex = -1; - for (size_t i = 0; i < cv.size(); ++i) + for (size_t i = 0; i < graphingWidgets.size(); ++i) { - if (cv[i] == bundle.chartView) + if (graphingWidgets[i] == bundle.chartView) plotIndex = i; } int newX = oldXlin ? cute::Scale::linear : cute::Scale::logarithmic; diff --git a/src/chartMenu.h b/src/chartMenu.h index d8d9405..7bdd5aa 100644 --- a/src/chartMenu.h +++ b/src/chartMenu.h @@ -21,9 +21,10 @@ private: }; private: - std::vector<QWidget*> cv; - std::vector<QAction*> vis; - std::vector<QAction*> visMenu; + std::vector<QWidget*> graphingWidgets; + std::vector<QAction*> visibiliyActions; + std::vector<QAction*> resetActions; + std::vector<QAction*> menuActions; int chartTheme; std::vector<scaleBundle> scaleBundles; @@ -36,14 +37,16 @@ public: private slots: void onShow(); void onScale(); + void onReset(); public slots: - void onOptionSelected(); + void onVisibility(); void chartThemeChanged(int themeNumber); void titleChanged(int plot, const QString& title); signals: void s_setPlotScale(int plot, int x, int y); + void s_resetPlot(int plot); }; diff --git a/src/control.cpp b/src/control.cpp index d58979e..c3f9fd1 100644 --- a/src/control.cpp +++ b/src/control.cpp @@ -49,6 +49,7 @@ void Control::makeConnections() connect(w->configPanel, &ConfigPanel::lockButtonClicked, this, &Control::onLockButton); connect(w, &MainWindow::saveProblem, this, &Control::saveProblem); connect(w->cm, &ChartMenu::s_setPlotScale, this, &Control::setPlotScale); + connect(w->cm, &ChartMenu::s_resetPlot, this, &Control::resetPlot); connect(cc, &CuteControl::s_verbosityChanged, w, &MainWindow::changeVerbosity); connect(w->configPanel->verbosityBox, QOverload<int>::of(&QComboBox::currentIndexChanged), -- GitLab