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