From 0e75ce697dc3ebff956b7a321ef421849cea54f7 Mon Sep 17 00:00:00 2001 From: JC Luna Date: Sat, 25 Apr 2026 10:50:38 -0500 Subject: [PATCH 01/17] Consolidate and clean up many sources --- CMakeLists.txt | 18 ++--- cmake/cpp.cmake | 11 +-- cmake/qml.cmake | 0 src/App/Main.cpp | 6 +- src/App/Recreation.cpp | 13 ---- src/App/testMultiplot.cpp | 14 ---- src/Windowing/DevWindow.cpp | 117 ---------------------------- src/Windowing/DevWindow.hpp | 78 ------------------- src/Windowing/NumericTestWidget.cpp | 42 ---------- src/Windowing/NumericTestWidget.hpp | 26 ------- 10 files changed, 11 insertions(+), 314 deletions(-) delete mode 100644 cmake/qml.cmake delete mode 100644 src/App/Recreation.cpp delete mode 100644 src/App/testMultiplot.cpp delete mode 100644 src/Windowing/DevWindow.cpp delete mode 100644 src/Windowing/DevWindow.hpp delete mode 100644 src/Windowing/NumericTestWidget.cpp delete mode 100644 src/Windowing/NumericTestWidget.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 0192228..4991d92 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,7 +14,6 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") include(FetchContent) include("./cmake/cpp.cmake") -include("./cmake/qml.cmake") qt_standard_project_setup(REQUIRES 6.10) find_package(yaml-cpp) @@ -22,15 +21,12 @@ find_package(yaml-cpp) add_subdirectory("${UTIL_SRC_DIR}/Filesystem") add_subdirectory("${PLOTTING_SRC_DIR}") -# Widgets Recreation -qt_add_executable(widgets_recreation WIN32 MACOSX_BUNDLE - "${WINDOWING_SRC_DIR}/WidgetsRecreation.cpp" - ${OTHER_APP_SOURCES} ${WIDGET_SOURCES}) - -target_include_directories(widgets_recreation PRIVATE ${STD_APP_INCLUDES}) -target_compile_warn_all(widgets_recreation) - -target_link_libraries(widgets_recreation PRIVATE ${STD_APP_QT6_DEPS}) -target_link_libraries(widgets_recreation PRIVATE VSCL::Plot::QChart) +qt_add_executable(testrig_gui WIN32 + ${APP_SOURCES} ${WIDGET_SOURCES}) +target_include_directories(testrig_gui PRIVATE ${STD_APP_INCLUDES}) +target_compile_warn_all(testrig_gui) +target_link_libraries(testrig_gui PRIVATE VSCL::Plot::QChart) +target_link_libraries(testrig_gui PRIVATE ${STD_APP_QT6_DEPS}) +add_executable(VSCL::TestrigGUI ALIAS testrig_gui) add_subdirectory("${CMAKE_SOURCE_DIR}/test") diff --git a/cmake/cpp.cmake b/cmake/cpp.cmake index 364fd90..e6fccab 100644 --- a/cmake/cpp.cmake +++ b/cmake/cpp.cmake @@ -11,15 +11,8 @@ set(PLOTTING_SRC_DIR "${CMAKE_SOURCE_DIR}/src/Plotting") set(UTIL_SRC_DIR "${CMAKE_SOURCE_DIR}/src/Util") set(APP_SOURCES - "${CMAKE_SOURCE_DIR}/src/App/Main.cpp") - -# sorry -set(OTHER_APP_SOURCES - "${CMAKE_SOURCE_DIR}/src/App/testMultiplot.cpp") - -set(WINDOWING_SOURCES - "${WINDOWING_SRC_DIR}/DevWindow.cpp" - "${WINDOWING_SRC_DIR}/NumericTestWidget.cpp") + "${CMAKE_SOURCE_DIR}/src/App/Main.cpp" + "${WINDOWING_SRC_DIR}/WidgetsRecreation.cpp") set(DIAL_SOURCES "${WIDGETS_SRC_DIR}/Dial/Attitude.cpp" diff --git a/cmake/qml.cmake b/cmake/qml.cmake deleted file mode 100644 index e69de29..0000000 diff --git a/src/App/Main.cpp b/src/App/Main.cpp index 6536d7d..b0d3f38 100644 --- a/src/App/Main.cpp +++ b/src/App/Main.cpp @@ -2,14 +2,12 @@ #include #include -#include "Windowing/DevWindow.hpp" +#include "Windowing/WidgetsRecreation.hpp" int main(int argc, char** argv) { QApplication app(argc, argv); - VSCL::DevWindow window; - if (argc > 1) { window.SetQMLFromPath(QUrl::fromLocalFile(argv[1])); } - + VSCL::FromPpt::Widgets window; window.show(); return app.exec(); } diff --git a/src/App/Recreation.cpp b/src/App/Recreation.cpp deleted file mode 100644 index b0d3f38..0000000 --- a/src/App/Recreation.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include -#include - -#include "Windowing/WidgetsRecreation.hpp" - -int main(int argc, char** argv) { - QApplication app(argc, argv); - - VSCL::FromPpt::Widgets window; - window.show(); - return app.exec(); -} diff --git a/src/App/testMultiplot.cpp b/src/App/testMultiplot.cpp deleted file mode 100644 index fa514f8..0000000 --- a/src/App/testMultiplot.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include -#include - -#include "Windowing/WidgetsRecreation.hpp" - -int main(int argc, char** argv) { - QApplication app(argc, argv); - - VSCL::FromPpt::Widgets window; - - window.show(); - return app.exec(); -} diff --git a/src/Windowing/DevWindow.cpp b/src/Windowing/DevWindow.cpp deleted file mode 100644 index 097786c..0000000 --- a/src/Windowing/DevWindow.cpp +++ /dev/null @@ -1,117 +0,0 @@ -#include - -#include - -#include "DevWindow.hpp" -#include "Dial/Attitude.hpp" - -namespace VSCL { -DevWindow::DevWindow() - : QMainWindow() - , Stacker(new QStackedWidget(this)) - , MainQuick(new QQuickWidget(this)) - { - - AttitudeDial* dial = new AttitudeDial(this); - NumericDisplaysTest = new NumericTestWidget(this, dial, [dial](int new_value) { dial->SetDialAngle(new_value); }); - - setCentralWidget(Stacker); - Stacker->addWidget(MainQuick); - Stacker->addWidget(NumericDisplaysTest); - - QLayout* layout = Stacker->layout(); - layout->setContentsMargins(5, 5, 5, 5); - - CreateActions(); - CreateMenus(); - - QString message = tr("Howdy"); - statusBar()->showMessage(message); - - setWindowTitle(tr("VSCL Gyroscopic Test Rig")); - setMinimumSize(160, 160); - resize(720, 480); -} // void DevWindow::DevWindow() - -void DevWindow::SetQMLFromPath(const QUrl& path) { - MainQuick->setSource(path); - CurrentQML = path; -} - -void DevWindow::SwapSetting() { - switch (CurrentSetting) { - case DevWindow::NUMERIC_TESTING: - Stacker->setCurrentIndex(1); - CurrentSetting = DevWindow::QML_VIEW; - break; - case DevWindow::QML_VIEW: - Stacker->setCurrentIndex(0); - CurrentSetting = DevWindow::NUMERIC_TESTING; - break; - } -} - -void DevWindow::OpenQML() { - std::string currentWd = std::filesystem::current_path().string(); - const char* cwd = currentWd.c_str(); - QUrl qmlPath = QFileDialog::getOpenFileUrl(this, - tr("Open QML Source"), QUrl::fromLocalFile(cwd), - tr("QML Sources (*.qml)")); - - SetQMLFromPath(qmlPath); -} // void DevWindow::OpenQML() - -void DevWindow::ReloadQML() { - SetQMLFromPath(CurrentQML); -} // void DevWindow::ReloadQML() - -void DevWindow::About() { - QMessageBox::about(this, tr("About"), - tr("Currently in development mode.")); -} // void DevWindow::About() - -void DevWindow::CreateMenus() { - FileMenu = menuBar()->addMenu(tr("&File")); - FileMenu->addAction(QMLLoadAct); - FileMenu->addAction(SwapSettingAct); - FileMenu->addSeparator(); - FileMenu->addAction(ExitAct); - - EditMenu = menuBar()->addMenu(tr("&Edit")); - EditMenu->addAction(ReloadAct); - - HelpMenu = menuBar()->addMenu(tr("&Help")); - HelpMenu->addAction(AboutAct); -} // void DevWindow::CreateMenus() - -void DevWindow::CreateActions() { - QMLLoadAct = new QAction(QIcon::fromTheme(QIcon::ThemeIcon::DocumentOpen), - tr("Load QML"), this); - QMLLoadAct->setShortcuts(QKeySequence::Open); - QMLLoadAct->setStatusTip(tr("Load QML into the viewport.")); - connect(QMLLoadAct, &QAction::triggered, this, &DevWindow::OpenQML); - - SwapSettingAct = new QAction(QIcon::fromTheme(QIcon::ThemeIcon::DocumentOpen), - tr("Change Setting"), this); - SwapSettingAct->setShortcuts(QKeySequence::NextChild); - SwapSettingAct->setStatusTip(tr("Change between QML viewport and numeric testing modes")); - connect(SwapSettingAct, &QAction::triggered, this, &DevWindow::SwapSetting); - - ExitAct = new QAction(QIcon::fromTheme(QIcon::ThemeIcon::ApplicationExit), - tr("Exit"), this); - ExitAct->setShortcuts(QKeySequence::Quit); - ExitAct->setStatusTip(tr("Exit the application")); - connect(ExitAct, &QAction::triggered, this, &QWidget::close); - - ReloadAct = new QAction(QIcon::fromTheme(QIcon::ThemeIcon::EditRedo), - tr("Reload"), this); - ReloadAct->setShortcuts(QKeySequence::Redo); - ReloadAct->setStatusTip(tr("Reload QML sources")); - connect(ReloadAct, &QAction::triggered, this, &DevWindow::ReloadQML); - - AboutAct = new QAction(QIcon::fromTheme(QIcon::ThemeIcon::HelpAbout), - tr("&About"), this); - AboutAct->setStatusTip(tr("Show the application's About box")); - connect(AboutAct, &QAction::triggered, this, &DevWindow::About); -} // void DevWindow::CreateActions() -} // namespace VSCL diff --git a/src/Windowing/DevWindow.hpp b/src/Windowing/DevWindow.hpp deleted file mode 100644 index a232cca..0000000 --- a/src/Windowing/DevWindow.hpp +++ /dev/null @@ -1,78 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include - -#include "NumericTestWidget.hpp" - -namespace VSCL { -class DevWindow : public QMainWindow { - -public: - DevWindow(); - - enum Setting { - QML_VIEW, - NUMERIC_TESTING - }; - - void SetQMLFromPath(const QUrl& path); - void SwapSetting(); - QStackedWidget* GetStackedWidget(); - -protected: - -private slots: - void OpenQML(); - void ReloadQML(); - void About(); - -private: - Setting CurrentSetting = Setting::NUMERIC_TESTING; - QStackedWidget* Stacker; - - /* - * QML Viewer - */ - - // The Main Viewport - QQuickWidget* MainQuick; - - // Path to the currently loaded QML - QUrl CurrentQML; - - /* - * Numeric widget display testing - */ - - // The main tester view - NumericTestWidget* NumericDisplaysTest; - - /* - * Actions - */ - - void CreateActions(); - void CreateMenus(); - - QMenu* FileMenu; - QMenu* EditMenu; - QMenu* HelpMenu; - - QAction* QMLLoadAct; - QAction* ExitAct; - QAction* ReloadAct; - QAction* AboutAct; - QAction* SwapSettingAct; -}; // class DevWindow -} // namespace VSCL diff --git a/src/Windowing/NumericTestWidget.cpp b/src/Windowing/NumericTestWidget.cpp deleted file mode 100644 index e9a2899..0000000 --- a/src/Windowing/NumericTestWidget.cpp +++ /dev/null @@ -1,42 +0,0 @@ -#include - -#include "NumericTestWidget.hpp" - -namespace VSCL { - -NumericTestWidget::NumericTestWidget( - QWidget* parent, QWidget* what_to_test, - std::function method) - : QWidget(parent) - , TesterSpinbox(new QDoubleSpinBox(this)) - , WidgetBeingTested(what_to_test) { - - QGridLayout* grid = new QGridLayout(this); - grid->setContentsMargins(25, 25, 25, 25); - grid->addWidget(TesterSpinbox, 0, 0); - grid->addWidget(WidgetBeingTested, 0, 1); - setLayout(grid); - - TesterSpinbox->setRange(0.0, 360.0); - TesterSpinbox->setSuffix("°"); - TesterSpinbox->setWrapping(true); - - QSizePolicy sizePolicy; - sizePolicy.setHorizontalPolicy(QSizePolicy::Expanding); - sizePolicy.setVerticalPolicy(QSizePolicy::Expanding); - - WidgetBeingTested->setSizePolicy(sizePolicy); - - connect(TesterSpinbox, &QDoubleSpinBox::valueChanged, WidgetBeingTested, method); -} // NumericTestWidget ctor - -void NumericTestWidget::setVisible(bool visible) { - TesterSpinbox->setVisible(visible); - WidgetBeingTested->setVisible(visible); - QWidget::setVisible(visible); -} - -QDoubleSpinBox* NumericTestWidget::GetSpinbox() const { return TesterSpinbox; } -QWidget* NumericTestWidget::GetTestedWidget() const { return WidgetBeingTested; } - -} // namespace VSCL diff --git a/src/Windowing/NumericTestWidget.hpp b/src/Windowing/NumericTestWidget.hpp deleted file mode 100644 index 6c8da67..0000000 --- a/src/Windowing/NumericTestWidget.hpp +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once - -#include -#include - -namespace VSCL { -class NumericTestWidget : public QWidget { - - Q_OBJECT; - -public: - NumericTestWidget(QWidget* parent, QWidget* what_to_test, - std::function method); - - virtual void setVisible(bool visible) override; - -private: - QDoubleSpinBox* TesterSpinbox; - QWidget* WidgetBeingTested; - -public: - QDoubleSpinBox* GetSpinbox() const; - QWidget* GetTestedWidget() const; - -}; // class NumericTestWidget -} // namespace VSCL From d96c29c5403a5b649e7a5ce06a653ddff374e629 Mon Sep 17 00:00:00 2001 From: JC Luna Date: Sat, 25 Apr 2026 15:09:23 -0500 Subject: [PATCH 02/17] FromPpt::Widget -> MainWindow --- cmake/cpp.cmake | 2 +- src/App/Main.cpp | 5 +- .../{WidgetsRecreation.cpp => MainWindow.cpp} | 84 +++++++++---------- .../{WidgetsRecreation.hpp => MainWindow.hpp} | 8 +- 4 files changed, 50 insertions(+), 49 deletions(-) rename src/Windowing/{WidgetsRecreation.cpp => MainWindow.cpp} (83%) rename src/Windowing/{WidgetsRecreation.hpp => MainWindow.hpp} (95%) diff --git a/cmake/cpp.cmake b/cmake/cpp.cmake index e6fccab..b56c712 100644 --- a/cmake/cpp.cmake +++ b/cmake/cpp.cmake @@ -12,7 +12,7 @@ set(UTIL_SRC_DIR "${CMAKE_SOURCE_DIR}/src/Util") set(APP_SOURCES "${CMAKE_SOURCE_DIR}/src/App/Main.cpp" - "${WINDOWING_SRC_DIR}/WidgetsRecreation.cpp") + "${WINDOWING_SRC_DIR}/MainWindow.cpp") set(DIAL_SOURCES "${WIDGETS_SRC_DIR}/Dial/Attitude.cpp" diff --git a/src/App/Main.cpp b/src/App/Main.cpp index b0d3f38..0892a3e 100644 --- a/src/App/Main.cpp +++ b/src/App/Main.cpp @@ -2,12 +2,13 @@ #include #include -#include "Windowing/WidgetsRecreation.hpp" +#include "Windowing/MainWindow.hpp" int main(int argc, char** argv) { QApplication app(argc, argv); - VSCL::FromPpt::Widgets window; + VSCL::MainWindow window; + window.show(); return app.exec(); } diff --git a/src/Windowing/WidgetsRecreation.cpp b/src/Windowing/MainWindow.cpp similarity index 83% rename from src/Windowing/WidgetsRecreation.cpp rename to src/Windowing/MainWindow.cpp index 7b71200..2b5c1a0 100644 --- a/src/Windowing/WidgetsRecreation.cpp +++ b/src/Windowing/MainWindow.cpp @@ -2,7 +2,7 @@ #include #include -#include "WidgetsRecreation.hpp" +#include "Windowing/MainWindow.hpp" #include "Plotting/Backend/CoreQChart.hpp" #include "Widgets/Displays/StatusCollector.hpp" @@ -27,8 +27,8 @@ static void StupidMakeData(VSCL::Plot::EmbeddablePlot2D* plot) { } // }}} -namespace VSCL::FromPpt { -Widgets::Widgets() { +namespace VSCL { +MainWindow::MainWindow() { // Set up menubar and statusbar CreateActions(); CreateMenus(); @@ -55,45 +55,45 @@ Widgets::Widgets() { SetRoll(-32); SetPitch(5); SetYaw(100); -} // void Widgets::Widgets() +} // void MainWindow::Widgets() -void Widgets::resizeEvent(QResizeEvent* event) { +void MainWindow::resizeEvent(QResizeEvent* event) { QMainWindow::resizeEvent(event); SetGridColumnsMinimums(); SetGridRowsMinimums(); SetAllButtonTextSize(); -} // void Widgets::resizeEvent() +} // void MainWindow::resizeEvent() -void Widgets::SetRoll(double roll) { +void MainWindow::SetRoll(double roll) { RollDial->SetDialAngle(roll); // RollQtyRate->SetQuantity(roll); } -void Widgets::SetPitch(double pitch) { +void MainWindow::SetPitch(double pitch) { PitchDial->SetDialAngle(pitch); // PitchQtyRate->SetQuantity(pitch); } -void Widgets::SetYaw(double yaw) { +void MainWindow::SetYaw(double yaw) { YawDial->SetDialAngle(yaw); // YawQtyRate->SetQuantity(yaw); } -void Widgets::SetRollRate(double roll) { +void MainWindow::SetRollRate(double roll) { RollQtyRate->SetRate(roll); } -void Widgets::SetPitchRate(double pitch) { +void MainWindow::SetPitchRate(double pitch) { PitchQtyRate->SetRate(pitch); } -void Widgets::SetYawRate(double yaw) { +void MainWindow::SetYawRate(double yaw) { YawQtyRate->SetRate(yaw); } // Layout and Widgets Setup {{{ -void Widgets::SetupCentralWidget() { +void MainWindow::SetupCentralWidget() { MajorContainer = new QWidget(this); QSizePolicy majorPolicy; @@ -106,9 +106,9 @@ void Widgets::SetupCentralWidget() { MajorContainer->setLayout(MajorLayout); setCentralWidget(MajorContainer); -} // void Widgets::SetupCentralWidget() +} // void MainWindow::SetupCentralWidget() -void Widgets::SetupAttitudeDials() { +void MainWindow::SetupAttitudeDials() { AttitudeDialRow = new QFrame(MajorContainer); MajorLayout->addWidget(AttitudeDialRow, 0, 1); @@ -131,24 +131,24 @@ void Widgets::SetupAttitudeDials() { AttitudeDialOrganizer->addWidget(YawDial); Dials = { RollDial, PitchDial, YawDial }; -} // void Widgets::SetupCentralWidget() +} // void MainWindow::SetupCentralWidget() -void Widgets::SetGridColumnsMinimums() { +void MainWindow::SetGridColumnsMinimums() { if (!MajorLayout) { return; }; const QRect& dims = centralWidget()->geometry(); MajorLayout->setColumnMinimumWidth(0, 4 * dims.width() / 5); MajorLayout->setColumnMinimumWidth(1, 1 * dims.width() / 5); -} // void Widgets::SetGridColumnsMinimums() +} // void MainWindow::SetGridColumnsMinimums() -void Widgets::SetGridRowsMinimums() { +void MainWindow::SetGridRowsMinimums() { if (!MajorLayout) { return; } const QRect& dims = centralWidget()->geometry(); MajorLayout->setRowMinimumHeight(0, 4 * dims.height() / 5); MajorLayout->setRowMinimumHeight(1, 1 * dims.height() / 5); -} // void Widgets::SetGridRowsMinimums() +} // void MainWindow::SetGridRowsMinimums() // Buttons {{{ -void Widgets::SetupButtons() { +void MainWindow::SetupButtons() { StandbyIndicator = new QPushButton(this); StandbyIndicator->setText(tr("Standby")); SetButtonStatus(StandbyIndicator, Status::STANDBY); @@ -157,7 +157,7 @@ void Widgets::SetupButtons() { ArmedIndicator->setText(tr("Disarmed")); SetButtonStatus(ArmedIndicator, Status::DISARMED); // testing below - // connect(ArmedIndicator, &QPushButton::clicked, this, &Widgets::OnArmedButtonPressed); + // connect(ArmedIndicator, &QPushButton::clicked, this, &MainWindow::OnArmedButtonPressed); InitiateButton = new QPushButton(this); InitiateButton->setText(tr("Initiate")); @@ -167,9 +167,9 @@ void Widgets::SetupButtons() { AbortButton->setStyleSheet("color: red"); AbortFont.setBold(true); -} // void Widgets::SetupButtons() +} // void MainWindow::SetupButtons() -void Widgets::SetupStatusColumn() { +void MainWindow::SetupStatusColumn() { StatusColumn = new QGroupBox(tr("Operate"), this); StatusColumn->setObjectName("statusColumn"); @@ -195,9 +195,9 @@ void Widgets::SetupStatusColumn() { StatusColumnOrganizer->addWidget(AbortButton); StatusColumn->setLayout(StatusColumnOrganizer); -} // void Widgets::SetupStatusColumn() +} // void MainWindow::SetupStatusColumn() -void Widgets::SetAllButtonTextSize() { +void MainWindow::SetAllButtonTextSize() { ButtonFont.setPixelSize(ButtonFontAdjustment.AdjustPxSize(window())); StandbyIndicator->setFont(ButtonFont); ArmedIndicator->setFont(ButtonFont); @@ -206,10 +206,10 @@ void Widgets::SetAllButtonTextSize() { AbortFont.setPixelSize(AbortFontAdjustment.AdjustPxSize(window())); AbortButton->setFont(AbortFont); -} // void Widgets::SetAllButtonTextSize() +} // void MainWindow::SetAllButtonTextSize() // }}} -void Widgets::SetupMultiPlot() { +void MainWindow::SetupMultiPlot() { Plots = new MultiPlotContainer(this, 3); MajorLayout->addWidget(Plots, 0, 0); QList allPlots = Plots->GetPlots(); @@ -244,7 +244,7 @@ void Widgets::SetupMultiPlot() { } } -void Widgets::SetupTimeHistoryPlotQChart() { +void MainWindow::SetupTimeHistoryPlotQChart() { Plot = new Plot::PlotQChart(this); MajorLayout->addWidget(Plot, 1, 0); @@ -271,9 +271,9 @@ void Widgets::SetupTimeHistoryPlotQChart() { Plot->AddSeries(yawInfo); StupidMakeData(Plot); -} // void Widgets::SetupTimeHistoryPlotQChart() +} // void MainWindow::SetupTimeHistoryPlotQChart() -void Widgets::SetupAttQtysRatesDisplay() { +void MainWindow::SetupAttQtysRatesDisplay() { AttQtysRates = new QtyRateDisplay(tr(""), this); MajorLayout->addWidget(AttQtysRates, 1, 0); @@ -286,16 +286,16 @@ void Widgets::SetupAttQtysRatesDisplay() { YawQtyRate = new QtyRateRow(tr("Yaw"), AttQtysRates); YawQtyRate->SetQuantityUnits("°"); YawQtyRate->SetRateUnits("°/s"); -} // void Widgets::SetupAttQtyRatesDisplay() +} // void MainWindow::SetupAttQtyRatesDisplay() // }}} // Menubar and Actions {{{ -void Widgets::About() { +void MainWindow::About() { QMessageBox::about(this, tr("About"), tr("This is a recreation of the original UI layout provided.")); -} // void Widgets::About() +} // void MainWindow::About() -void Widgets::CreateMenus() { +void MainWindow::CreateMenus() { FileMenu = menuBar()->addMenu(tr("&File")); FileMenu->addSeparator(); FileMenu->addAction(ExitAct); @@ -304,9 +304,9 @@ void Widgets::CreateMenus() { HelpMenu = menuBar()->addMenu(tr("&Help")); HelpMenu->addAction(AboutAct); -} // void Widgets::CreateMenus() +} // void MainWindow::CreateMenus() -void Widgets::CreateActions() { +void MainWindow::CreateActions() { ExitAct = new QAction(QIcon::fromTheme(QIcon::ThemeIcon::ApplicationExit), tr("Exit"), this); ExitAct->setShortcuts(QKeySequence::Quit); @@ -316,10 +316,10 @@ void Widgets::CreateActions() { AboutAct = new QAction(QIcon::fromTheme(QIcon::ThemeIcon::HelpAbout), tr("&About"), this); AboutAct->setStatusTip(tr("Show the application's About box")); - connect(AboutAct, &QAction::triggered, this, &Widgets::About); -} // void Widgets::CreateActions() + connect(AboutAct, &QAction::triggered, this, &MainWindow::About); +} // void MainWindow::CreateActions() -void Widgets::OnArmedButtonPressed() { +void MainWindow::OnArmedButtonPressed() { ArmedButtonActive = !ArmedButtonActive; if (ArmedButtonActive) { @@ -333,7 +333,7 @@ void Widgets::OnArmedButtonPressed() { SetButtonStatus(ArmedIndicator, Status::DISARMED); SetGroupBoxStatus(StatusColumn, Status::DISARMED); } -} // void Widgets::OnArmedButtonPressed() +} // void MainWindow::OnArmedButtonPressed() // }}} -} // namespace VSCL::FromPpt +} // namespace VSCL // vim: foldmethod=marker diff --git a/src/Windowing/WidgetsRecreation.hpp b/src/Windowing/MainWindow.hpp similarity index 95% rename from src/Windowing/WidgetsRecreation.hpp rename to src/Windowing/MainWindow.hpp index bde32bd..6a2320b 100644 --- a/src/Windowing/WidgetsRecreation.hpp +++ b/src/Windowing/MainWindow.hpp @@ -10,11 +10,11 @@ #include "Util/Sizing.hpp" #include "Widgets/Displays/MultiPlotContainer.hpp" -namespace VSCL::FromPpt { -class Widgets : public QMainWindow { +namespace VSCL { +class MainWindow : public QMainWindow { public: - Widgets(); + MainWindow(); virtual void resizeEvent(QResizeEvent* event) override; void SetRoll(double roll); @@ -87,5 +87,5 @@ private slots: QAction* AboutAct; // }}} }; // class Widgets -} // namespace VSCL::FromPpt +} // namespace VSCL // vim: foldmethod=marker From 6090af49627f2b6ec541ae2bfc1f5bc76c992d3f Mon Sep 17 00:00:00 2001 From: JC Luna Date: Sat, 25 Apr 2026 22:17:49 -0500 Subject: [PATCH 03/17] Use initializer lists four our mainwindow --- src/Windowing/MainWindow.cpp | 111 +++++++++++------------------------ src/Windowing/MainWindow.hpp | 26 ++------ 2 files changed, 39 insertions(+), 98 deletions(-) diff --git a/src/Windowing/MainWindow.cpp b/src/Windowing/MainWindow.cpp index 2b5c1a0..9d804f5 100644 --- a/src/Windowing/MainWindow.cpp +++ b/src/Windowing/MainWindow.cpp @@ -28,7 +28,24 @@ static void StupidMakeData(VSCL::Plot::EmbeddablePlot2D* plot) { // }}} namespace VSCL { -MainWindow::MainWindow() { +MainWindow::MainWindow() + : MajorContainer(new QWidget) + + , AttitudeDialRow(new QFrame(MajorContainer)) + , RollDial(new CompositeDial(AttitudeDialRow)) + , PitchDial(new CompositeDial(AttitudeDialRow)) + , YawDial(new CompositeDial(AttitudeDialRow)) + + , ActionsRow(new QGroupBox(tr("Operate"), MajorContainer)) + , StandbyIndicator(new QPushButton(ActionsRow)) + , ArmedIndicator(new QPushButton(ActionsRow)) + , InitiateButton(new QPushButton(ActionsRow)) + , AbortButton(new QPushButton(ActionsRow)) + + , MajorLayout(new QGridLayout(this)) + , AttitudeDialOrganizer(new QVBoxLayout(AttitudeDialRow)) + , ActionsRowOrganizer(new QHBoxLayout(ActionsRow)) +{ // Set up menubar and statusbar CreateActions(); CreateMenus(); @@ -46,15 +63,11 @@ MainWindow::MainWindow() { SetupAttitudeDials(); SetupMultiPlot(); // <-new multiplot SetupButtons(); - SetupStatusColumn(); + SetupActionsRow(); SetGridColumnsMinimums(); SetGridRowsMinimums(); SetAllButtonTextSize(); - - SetRoll(-32); - SetPitch(5); - SetYaw(100); } // void MainWindow::Widgets() void MainWindow::resizeEvent(QResizeEvent* event) { @@ -65,43 +78,13 @@ void MainWindow::resizeEvent(QResizeEvent* event) { SetAllButtonTextSize(); } // void MainWindow::resizeEvent() -void MainWindow::SetRoll(double roll) { - RollDial->SetDialAngle(roll); - // RollQtyRate->SetQuantity(roll); -} - -void MainWindow::SetPitch(double pitch) { - PitchDial->SetDialAngle(pitch); - // PitchQtyRate->SetQuantity(pitch); -} - -void MainWindow::SetYaw(double yaw) { - YawDial->SetDialAngle(yaw); - // YawQtyRate->SetQuantity(yaw); -} - -void MainWindow::SetRollRate(double roll) { - RollQtyRate->SetRate(roll); -} - -void MainWindow::SetPitchRate(double pitch) { - PitchQtyRate->SetRate(pitch); -} - -void MainWindow::SetYawRate(double yaw) { - YawQtyRate->SetRate(yaw); -} - // Layout and Widgets Setup {{{ void MainWindow::SetupCentralWidget() { - MajorContainer = new QWidget(this); - QSizePolicy majorPolicy; majorPolicy.setHorizontalPolicy(QSizePolicy::MinimumExpanding); majorPolicy.setVerticalPolicy(QSizePolicy::MinimumExpanding); MajorContainer->setSizePolicy(majorPolicy); - MajorLayout = new QGridLayout(MajorContainer); MajorLayout->setContentsMargins(35, 35, 35, 35); MajorContainer->setLayout(MajorLayout); @@ -109,10 +92,8 @@ void MainWindow::SetupCentralWidget() { } // void MainWindow::SetupCentralWidget() void MainWindow::SetupAttitudeDials() { - AttitudeDialRow = new QFrame(MajorContainer); MajorLayout->addWidget(AttitudeDialRow, 0, 1); - AttitudeDialOrganizer = new QVBoxLayout(AttitudeDialRow); AttitudeDialOrganizer->setContentsMargins(20, 20, 20, 20); AttitudeDialRow->setLayout(AttitudeDialOrganizer); @@ -121,13 +102,8 @@ void MainWindow::SetupAttitudeDials() { dialsPolicy.setVerticalPolicy(QSizePolicy::MinimumExpanding); AttitudeDialRow->setSizePolicy(dialsPolicy); - RollDial = new CompositeDial(QString("Roll"), AttitudeDialRow); AttitudeDialOrganizer->addWidget(RollDial); - - PitchDial = new CompositeDial(QString("Pitch"), AttitudeDialRow); AttitudeDialOrganizer->addWidget(PitchDial); - - YawDial = new CompositeDial(QString("Yaw"), AttitudeDialRow); AttitudeDialOrganizer->addWidget(YawDial); Dials = { RollDial, PitchDial, YawDial }; @@ -149,60 +125,55 @@ void MainWindow::SetGridRowsMinimums() { // Buttons {{{ void MainWindow::SetupButtons() { - StandbyIndicator = new QPushButton(this); StandbyIndicator->setText(tr("Standby")); SetButtonStatus(StandbyIndicator, Status::STANDBY); - ArmedIndicator = new QPushButton(this); ArmedIndicator->setText(tr("Disarmed")); SetButtonStatus(ArmedIndicator, Status::DISARMED); // testing below // connect(ArmedIndicator, &QPushButton::clicked, this, &MainWindow::OnArmedButtonPressed); - InitiateButton = new QPushButton(this); InitiateButton->setText(tr("Initiate")); - AbortButton = new QPushButton(this); AbortButton->setText(tr("Abort")); AbortButton->setStyleSheet("color: red"); AbortFont.setBold(true); } // void MainWindow::SetupButtons() -void MainWindow::SetupStatusColumn() { - StatusColumn = new QGroupBox(tr("Operate"), this); - StatusColumn->setObjectName("statusColumn"); +void MainWindow::SetupActionsRow() { + ActionsRow = new QGroupBox(); + ActionsRow->setObjectName("statusColumn"); - SetGroupBoxStatus(StatusColumn, Status::DISARMED); + SetGroupBoxStatus(ActionsRow, Status::DISARMED); - MajorLayout->addWidget(StatusColumn, 1, 0, 1, 2); + MajorLayout->addWidget(ActionsRow, 1, 0, 1, 2); QSizePolicy vhexpanding; vhexpanding.setVerticalPolicy(QSizePolicy::MinimumExpanding); vhexpanding.setHorizontalPolicy(QSizePolicy::MinimumExpanding); - StatusColumnOrganizer = new QHBoxLayout(StatusColumn); StandbyIndicator->setSizePolicy(vhexpanding); - StatusColumnOrganizer->addWidget(StandbyIndicator); + ActionsRowOrganizer->addWidget(StandbyIndicator); ArmedIndicator->setSizePolicy(vhexpanding); - StatusColumnOrganizer->addWidget(ArmedIndicator); + ActionsRowOrganizer->addWidget(ArmedIndicator); InitiateButton->setSizePolicy(vhexpanding); - StatusColumnOrganizer->addWidget(InitiateButton); + ActionsRowOrganizer->addWidget(InitiateButton); AbortButton->setSizePolicy(vhexpanding); - StatusColumnOrganizer->addWidget(AbortButton); + ActionsRowOrganizer->addWidget(AbortButton); - StatusColumn->setLayout(StatusColumnOrganizer); -} // void MainWindow::SetupStatusColumn() + ActionsRow->setLayout(ActionsRowOrganizer); +} // void MainWindow::SetupActionsRow() void MainWindow::SetAllButtonTextSize() { ButtonFont.setPixelSize(ButtonFontAdjustment.AdjustPxSize(window())); StandbyIndicator->setFont(ButtonFont); ArmedIndicator->setFont(ButtonFont); InitiateButton->setFont(ButtonFont); - StatusColumn->setFont(ButtonFont); + ActionsRow->setFont(ButtonFont); AbortFont.setPixelSize(AbortFontAdjustment.AdjustPxSize(window())); AbortButton->setFont(AbortFont); @@ -272,22 +243,6 @@ void MainWindow::SetupTimeHistoryPlotQChart() { StupidMakeData(Plot); } // void MainWindow::SetupTimeHistoryPlotQChart() - -void MainWindow::SetupAttQtysRatesDisplay() { - AttQtysRates = new QtyRateDisplay(tr(""), this); - MajorLayout->addWidget(AttQtysRates, 1, 0); - - RollQtyRate = new QtyRateRow(tr("Roll"), AttQtysRates); - RollQtyRate->SetQuantityUnits("°"); - RollQtyRate->SetRateUnits("°/s"); - PitchQtyRate = new QtyRateRow(tr("Pitch"), AttQtysRates); - PitchQtyRate->SetQuantityUnits("°"); - PitchQtyRate->SetRateUnits("°/s"); - YawQtyRate = new QtyRateRow(tr("Yaw"), AttQtysRates); - YawQtyRate->SetQuantityUnits("°"); - YawQtyRate->SetRateUnits("°/s"); -} // void MainWindow::SetupAttQtyRatesDisplay() - // }}} // Menubar and Actions {{{ void MainWindow::About() { @@ -326,12 +281,12 @@ void MainWindow::OnArmedButtonPressed() { // Armed state - Red ArmedIndicator->setText(tr("Armed")); SetButtonStatus(ArmedIndicator, Status::ARMED); - SetGroupBoxStatus(StatusColumn, Status::ARMED); + SetGroupBoxStatus(ActionsRow, Status::ARMED); } else { // Disarmed state - Yellow ArmedIndicator->setText(tr("Disarmed")); SetButtonStatus(ArmedIndicator, Status::DISARMED); - SetGroupBoxStatus(StatusColumn, Status::DISARMED); + SetGroupBoxStatus(ActionsRow, Status::DISARMED); } } // void MainWindow::OnArmedButtonPressed() // }}} diff --git a/src/Windowing/MainWindow.hpp b/src/Windowing/MainWindow.hpp index 6a2320b..fe9af33 100644 --- a/src/Windowing/MainWindow.hpp +++ b/src/Windowing/MainWindow.hpp @@ -17,13 +17,6 @@ class MainWindow : public QMainWindow { MainWindow(); virtual void resizeEvent(QResizeEvent* event) override; - void SetRoll(double roll); - void SetPitch(double pitch); - void SetYaw(double yaw); - void SetRollRate(double roll); - void SetPitchRate(double pitch); - void SetYawRate(double yaw); - private: QFont ButtonFont{ }; Util::FontAdjustment ButtonFontAdjustment{ .PxSizeAtMinimum=12 }; @@ -31,13 +24,11 @@ class MainWindow : public QMainWindow { Util::FontAdjustment AbortFontAdjustment{ .PxSizeAtMinimum=12 }; QWidget* MajorContainer; - QGridLayout* MajorLayout; void SetupCentralWidget(); void SetGridColumnsMinimums(); void SetGridRowsMinimums(); QFrame* AttitudeDialRow; - QVBoxLayout* AttitudeDialOrganizer; CompositeDial* RollDial; CompositeDial* PitchDial; @@ -51,24 +42,19 @@ class MainWindow : public QMainWindow { void SetupTimeHistoryPlotQChart(); - QtyRateDisplay* AttQtysRates; - QtyRateRow* RollQtyRate; - QtyRateRow* PitchQtyRate; - QtyRateRow* YawQtyRate; - void SetupAttQtysRatesDisplay(); - - // im not entirely sure of this part - QGroupBox* StatusColumn; - QHBoxLayout* StatusColumnOrganizer; + QGroupBox* ActionsRow; QPushButton* StandbyIndicator; QPushButton* ArmedIndicator; QPushButton* InitiateButton; - QPushButton* LogOpenButton; QPushButton* AbortButton; bool ArmedButtonActive = false; // Track armed button state + QGridLayout* MajorLayout; + QVBoxLayout* AttitudeDialOrganizer; + QHBoxLayout* ActionsRowOrganizer; + void SetupButtons(); - void SetupStatusColumn(); + void SetupActionsRow(); void SetAllButtonTextSize(); private slots: From 014cd7fd1ab4da2a2d4ba69e96df791d63c3a134 Mon Sep 17 00:00:00 2001 From: JC Luna Date: Sat, 25 Apr 2026 22:37:51 -0500 Subject: [PATCH 04/17] Also Init the Plots --- src/App/Main.cpp | 9 ++++ src/Windowing/MainWindow.cpp | 80 ++++-------------------------------- src/Windowing/MainWindow.hpp | 16 +++----- 3 files changed, 22 insertions(+), 83 deletions(-) diff --git a/src/App/Main.cpp b/src/App/Main.cpp index 0892a3e..1672e49 100644 --- a/src/App/Main.cpp +++ b/src/App/Main.cpp @@ -9,6 +9,15 @@ int main(int argc, char** argv) { VSCL::MainWindow window; + QString message = window.tr("Test Rig Operations"); + window.statusBar()->showMessage(message); + + window.setWindowTitle(window.tr("VSCL Gyroscopic Test Rig")); + window.setMinimumSize( + VSCL::Util::MINIMUM_WIDTH, VSCL::Util::MINIMUM_HEIGHT); + + window.resize(VSCL::Util::MINIMUM_WIDTH, VSCL::Util::MINIMUM_HEIGHT); + window.show(); return app.exec(); } diff --git a/src/Windowing/MainWindow.cpp b/src/Windowing/MainWindow.cpp index 9d804f5..ac580db 100644 --- a/src/Windowing/MainWindow.cpp +++ b/src/Windowing/MainWindow.cpp @@ -1,32 +1,7 @@ -#include -#include -#include - #include "Windowing/MainWindow.hpp" #include "Plotting/Backend/CoreQChart.hpp" #include "Widgets/Displays/StatusCollector.hpp" -// stupid temp thing {{{ -static void StupidMakeData(VSCL::Plot::EmbeddablePlot2D* plot) { - double ph1, ph2, ph3; - - std::srand(std::chrono::system_clock::now().time_since_epoch().count() + 1); - ph1 = std::rand() % 12; - std::srand(std::chrono::system_clock::now().time_since_epoch().count() + 3); - ph2 = std::rand() % 12; - std::srand(std::chrono::system_clock::now().time_since_epoch().count() + 2); - ph3 = std::rand() % 12; - - for (int i = 0; i < 100; i++) { - plot->AddPoint(0, i/10.0, std::cos(0.1 * i + ph1/12) / 2.0 + 0.5); - plot->AddPoint(1, i/10.0, std::sin(0.1 * i - ph2/12) / 2.0 + 0.5); - plot->AddPoint(2, i/10.0, std::cos(0.1 * i + ph3/12) / 2.0 + 0.5); - } - - plot->Plot(); -} -// }}} - namespace VSCL { MainWindow::MainWindow() : MajorContainer(new QWidget) @@ -36,6 +11,8 @@ MainWindow::MainWindow() , PitchDial(new CompositeDial(AttitudeDialRow)) , YawDial(new CompositeDial(AttitudeDialRow)) + , Plots(new MultiPlotContainer(MajorContainer, 3)) + , ActionsRow(new QGroupBox(tr("Operate"), MajorContainer)) , StandbyIndicator(new QPushButton(ActionsRow)) , ArmedIndicator(new QPushButton(ActionsRow)) @@ -46,28 +23,21 @@ MainWindow::MainWindow() , AttitudeDialOrganizer(new QVBoxLayout(AttitudeDialRow)) , ActionsRowOrganizer(new QHBoxLayout(ActionsRow)) { - // Set up menubar and statusbar - CreateActions(); - CreateMenus(); - - QString message = tr("Test Rig Operations"); - statusBar()->showMessage(message); - - // Geometry and window characteristics - setWindowTitle(tr("VSCL Gyroscopic Test Rig")); - setMinimumSize(Util::MINIMUM_WIDTH, Util::MINIMUM_HEIGHT); - resize(Util::MINIMUM_WIDTH, Util::MINIMUM_HEIGHT); // Set up the static layout SetupCentralWidget(); SetupAttitudeDials(); - SetupMultiPlot(); // <-new multiplot + SetupMultiPlot(); SetupButtons(); SetupActionsRow(); SetGridColumnsMinimums(); SetGridRowsMinimums(); SetAllButtonTextSize(); + + // Set up menubar and statusbar + CreateActions(); + CreateMenus(); } // void MainWindow::Widgets() void MainWindow::resizeEvent(QResizeEvent* event) { @@ -105,19 +75,15 @@ void MainWindow::SetupAttitudeDials() { AttitudeDialOrganizer->addWidget(RollDial); AttitudeDialOrganizer->addWidget(PitchDial); AttitudeDialOrganizer->addWidget(YawDial); - - Dials = { RollDial, PitchDial, YawDial }; } // void MainWindow::SetupCentralWidget() void MainWindow::SetGridColumnsMinimums() { - if (!MajorLayout) { return; }; const QRect& dims = centralWidget()->geometry(); MajorLayout->setColumnMinimumWidth(0, 4 * dims.width() / 5); MajorLayout->setColumnMinimumWidth(1, 1 * dims.width() / 5); } // void MainWindow::SetGridColumnsMinimums() void MainWindow::SetGridRowsMinimums() { - if (!MajorLayout) { return; } const QRect& dims = centralWidget()->geometry(); MajorLayout->setRowMinimumHeight(0, 4 * dims.height() / 5); MajorLayout->setRowMinimumHeight(1, 1 * dims.height() / 5); @@ -142,11 +108,9 @@ void MainWindow::SetupButtons() { } // void MainWindow::SetupButtons() void MainWindow::SetupActionsRow() { - ActionsRow = new QGroupBox(); ActionsRow->setObjectName("statusColumn"); SetGroupBoxStatus(ActionsRow, Status::DISARMED); - MajorLayout->addWidget(ActionsRow, 1, 0, 1, 2); QSizePolicy vhexpanding; @@ -181,7 +145,6 @@ void MainWindow::SetAllButtonTextSize() { // }}} void MainWindow::SetupMultiPlot() { - Plots = new MultiPlotContainer(this, 3); MajorLayout->addWidget(Plots, 0, 0); QList allPlots = Plots->GetPlots(); @@ -214,35 +177,6 @@ void MainWindow::SetupMultiPlot() { color++; } } - -void MainWindow::SetupTimeHistoryPlotQChart() { - Plot = new Plot::PlotQChart(this); - MajorLayout->addWidget(Plot, 1, 0); - - Plot::AxisInfo axInfo; - axInfo.Range = { 0, 10 }; - axInfo.MajorSpacing = 1; - axInfo.MinorSpacing = 0.5; - Plot->SetAxis(Plot::Axis::TIME, axInfo); - - Plot::SeriesInfo rollInfo; - rollInfo.Name = "Roll"; - rollInfo.Color = Plot::STANDARD_COLOR.at("Red"); - - Plot::SeriesInfo pitchInfo; - pitchInfo.Name = "Pitch"; - pitchInfo.Color = Plot::STANDARD_COLOR.at("Green"); - - Plot::SeriesInfo yawInfo; - yawInfo.Name = "Yaw"; - yawInfo.Color = Plot::STANDARD_COLOR.at("Blue"); - - Plot->AddSeries(rollInfo); - Plot->AddSeries(pitchInfo); - Plot->AddSeries(yawInfo); - - StupidMakeData(Plot); -} // void MainWindow::SetupTimeHistoryPlotQChart() // }}} // Menubar and Actions {{{ void MainWindow::About() { diff --git a/src/Windowing/MainWindow.hpp b/src/Windowing/MainWindow.hpp index fe9af33..061ca35 100644 --- a/src/Windowing/MainWindow.hpp +++ b/src/Windowing/MainWindow.hpp @@ -24,23 +24,13 @@ class MainWindow : public QMainWindow { Util::FontAdjustment AbortFontAdjustment{ .PxSizeAtMinimum=12 }; QWidget* MajorContainer; - void SetupCentralWidget(); - void SetGridColumnsMinimums(); - void SetGridRowsMinimums(); QFrame* AttitudeDialRow; - CompositeDial* RollDial; CompositeDial* PitchDial; CompositeDial* YawDial; - std::array Dials; - void SetupAttitudeDials(); - Plot::EmbeddablePlot2D* Plot; MultiPlotContainer* Plots; - void SetupMultiPlot(); - - void SetupTimeHistoryPlotQChart(); QGroupBox* ActionsRow; QPushButton* StandbyIndicator; @@ -53,6 +43,12 @@ class MainWindow : public QMainWindow { QVBoxLayout* AttitudeDialOrganizer; QHBoxLayout* ActionsRowOrganizer; + void SetupCentralWidget(); + void SetGridColumnsMinimums(); + void SetGridRowsMinimums(); + void SetupAttitudeDials(); + void SetupMultiPlot(); + void SetupTimeHistoryPlotQChart(); void SetupButtons(); void SetupActionsRow(); void SetAllButtonTextSize(); From 28976b5e9ba536aa471fea82ca07e1c098284158 Mon Sep 17 00:00:00 2001 From: JC Luna Date: Sat, 25 Apr 2026 23:01:08 -0500 Subject: [PATCH 05/17] Major layout don't parent in initializer lsit --- src/Windowing/MainWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Windowing/MainWindow.cpp b/src/Windowing/MainWindow.cpp index ac580db..91df020 100644 --- a/src/Windowing/MainWindow.cpp +++ b/src/Windowing/MainWindow.cpp @@ -19,7 +19,7 @@ MainWindow::MainWindow() , InitiateButton(new QPushButton(ActionsRow)) , AbortButton(new QPushButton(ActionsRow)) - , MajorLayout(new QGridLayout(this)) + , MajorLayout(new QGridLayout) // Parented when SetupCentralWidget() , AttitudeDialOrganizer(new QVBoxLayout(AttitudeDialRow)) , ActionsRowOrganizer(new QHBoxLayout(ActionsRow)) { From 4636286bf292cdaebb5cbba592acd6659723a7c8 Mon Sep 17 00:00:00 2001 From: JC Luna Date: Sat, 25 Apr 2026 23:05:53 -0500 Subject: [PATCH 06/17] Remove unused rate displayers --- cmake/cpp.cmake | 2 - .../Displays/QuantitiesRatesDisplay.cpp | 16 ----- .../Displays/QuantitiesRatesDisplay.hpp | 28 --------- src/Widgets/Displays/QuantitiesRatesRow.cpp | 61 ------------------- src/Widgets/Displays/QuantitiesRatesRow.hpp | 53 ---------------- src/Windowing/MainWindow.cpp | 1 - src/Windowing/MainWindow.hpp | 5 +- 7 files changed, 1 insertion(+), 165 deletions(-) delete mode 100644 src/Widgets/Displays/QuantitiesRatesDisplay.cpp delete mode 100644 src/Widgets/Displays/QuantitiesRatesDisplay.hpp delete mode 100644 src/Widgets/Displays/QuantitiesRatesRow.cpp delete mode 100644 src/Widgets/Displays/QuantitiesRatesRow.hpp diff --git a/cmake/cpp.cmake b/cmake/cpp.cmake index b56c712..31e432e 100644 --- a/cmake/cpp.cmake +++ b/cmake/cpp.cmake @@ -19,8 +19,6 @@ set(DIAL_SOURCES "${WIDGETS_SRC_DIR}/Dial/Composite.cpp") set(DISPLAYER_SOURCES - "${WIDGETS_SRC_DIR}/Displays/QuantitiesRatesDisplay.cpp" - "${WIDGETS_SRC_DIR}/Displays/QuantitiesRatesRow.cpp" "${WIDGETS_SRC_DIR}/Displays/RateLabel.cpp" "${WIDGETS_SRC_DIR}/Displays/MultiPlotContainer.cpp" "${WIDGETS_SRC_DIR}/Displays/StatusCollector.cpp") diff --git a/src/Widgets/Displays/QuantitiesRatesDisplay.cpp b/src/Widgets/Displays/QuantitiesRatesDisplay.cpp deleted file mode 100644 index 10ac802..0000000 --- a/src/Widgets/Displays/QuantitiesRatesDisplay.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "QuantitiesRatesDisplay.hpp" -#include "QuantitiesRatesRow.hpp" - -namespace VSCL { - -QtyRateDisplay::QtyRateDisplay(const QString& title, QWidget* parent) - : QGroupBox(title, parent) - , Organizer(new QVBoxLayout(this)) { - Organizer->setContentsMargins(10, 10, 10, 10); - setLayout(Organizer); -}; - -const QList& QtyRateDisplay::GetRowsView() const { return Rows; } -void QtyRateDisplay::AddRow(QtyRateRow* new_row) { Rows.append(new_row); Organizer->addWidget(new_row); } - -} // namespace VSCL diff --git a/src/Widgets/Displays/QuantitiesRatesDisplay.hpp b/src/Widgets/Displays/QuantitiesRatesDisplay.hpp deleted file mode 100644 index 20f7164..0000000 --- a/src/Widgets/Displays/QuantitiesRatesDisplay.hpp +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once - -#include - -namespace VSCL { - -class QtyRateRow; - -class QtyRateDisplay : public QGroupBox { - - Q_OBJECT; - friend class QtyRateRow; - -public: - QtyRateDisplay(const QString& title, QWidget* parent = nullptr); - - const QList& GetRowsView() const; - -protected: - void AddRow(QtyRateRow* new_row); - -private: - QList Rows; - - QVBoxLayout* Organizer; - -}; // class QtyRateDisplay -} // namespace VSCL diff --git a/src/Widgets/Displays/QuantitiesRatesRow.cpp b/src/Widgets/Displays/QuantitiesRatesRow.cpp deleted file mode 100644 index bfdb72c..0000000 --- a/src/Widgets/Displays/QuantitiesRatesRow.cpp +++ /dev/null @@ -1,61 +0,0 @@ -#include "QuantitiesRatesRow.hpp" -#include "QuantitiesRatesDisplay.hpp" - -namespace VSCL { -QtyRateRow::QtyRateRow(const QString& title, QtyRateDisplay* parent) - : QGroupBox(title, parent) - , Title(title) - , Organizer(new QHBoxLayout(this)) - , QuantityLabel(new QLabel(this)) - , RateLabel(new QLabel(this)) { - - parent->AddRow(this); - setLayout(Organizer); - - Organizer->setContentsMargins(5, 5, 5, 5); - Organizer->addWidget(QuantityLabel); - Organizer->addWidget(RateLabel); - - QuantityLabel->setText(QString::number(Quantity) + QuantityUnits); - RateLabel->setText(QString::number(Rate) + RateUnits); - - AdjustFontSize(); -} - -void QtyRateRow::resizeEvent(QResizeEvent* event) { - QGroupBox::resizeEvent(event); - AdjustFontSize(); -} - -void QtyRateRow::AdjustFontSize() { - uint32_t tpt = static_cast(TITLE_FONT_ADJUSTMENT.AdjustPxSize(window())); - if (tpt <= TITLE_FONT_ADJUSTMENT.PxSizeAtMinimum) { - setTitle(tr("")); - TitleFont.setPixelSize(1); - } - else { - setTitle(Title); - TitleFont.setPixelSize(tpt); - } - - setFont(TitleFont); - - LabelFont.setPixelSize(NUMERIC_FONT_ADJUSTMENT.AdjustPxSize(window())); - QuantityLabel->setFont(LabelFont); - RateLabel->setFont(LabelFont); -} - -void QtyRateRow::SetQuantity(double new_quantity) { - Quantity = new_quantity; - QuantityLabel->setText(QString::number(Quantity) + QuantityUnits); -} -void QtyRateRow::SetRate(double new_rate) { - Rate = new_rate; - RateLabel->setText(QString::number(Rate) + RateUnits); -} - -void QtyRateRow::SetQuantityUnits(const QString& units) { QuantityUnits = units; } -void QtyRateRow::SetRateUnits(const QString& units) { RateUnits = units; } - -} // namespace VSCL - diff --git a/src/Widgets/Displays/QuantitiesRatesRow.hpp b/src/Widgets/Displays/QuantitiesRatesRow.hpp deleted file mode 100644 index ea5f607..0000000 --- a/src/Widgets/Displays/QuantitiesRatesRow.hpp +++ /dev/null @@ -1,53 +0,0 @@ -#pragma once - -#include -#include "Util/Sizing.hpp" - -namespace VSCL { - -class QtyRateDisplay; - -class QtyRateRow : public QGroupBox { - - Q_OBJECT; - friend class QtyRateDisplay; - -public: - QtyRateRow(const QString& title, QtyRateDisplay* parent); - virtual void resizeEvent(QResizeEvent* event); - - void SetQuantity(double new_quantity); - void SetRate(double new_rate); - - void SetQuantityUnits(const QString& units); - void SetRateUnits(const QString& units); - -private: - - double Quantity = 0.0; - double Rate = 0.0; - - QString QuantityUnits = tr(""); - QString RateUnits = tr("/s"); - - QString Title; - QFont TitleFont{ }; - QFont LabelFont{ }; - - QHBoxLayout* Organizer; - QLabel* QuantityLabel; - QLabel* RateLabel; - - void AdjustFontSize(); - static constexpr Util::FontAdjustment TITLE_FONT_ADJUSTMENT { - .PxSizeAtMinimum = 8, - .AdjustToWidth = false - }; - - static constexpr Util::FontAdjustment NUMERIC_FONT_ADJUSTMENT { - .PxSizeAtMinimum = 8, - .AdjustToWidth = false - }; - -}; // class QtyRateDisplay -} // namespace VSCL diff --git a/src/Windowing/MainWindow.cpp b/src/Windowing/MainWindow.cpp index 91df020..4a17133 100644 --- a/src/Windowing/MainWindow.cpp +++ b/src/Windowing/MainWindow.cpp @@ -23,7 +23,6 @@ MainWindow::MainWindow() , AttitudeDialOrganizer(new QVBoxLayout(AttitudeDialRow)) , ActionsRowOrganizer(new QHBoxLayout(ActionsRow)) { - // Set up the static layout SetupCentralWidget(); SetupAttitudeDials(); diff --git a/src/Windowing/MainWindow.hpp b/src/Windowing/MainWindow.hpp index 061ca35..3a20c6e 100644 --- a/src/Windowing/MainWindow.hpp +++ b/src/Windowing/MainWindow.hpp @@ -1,11 +1,8 @@ #pragma once -#include #include #include "Widgets/Dial/Composite.hpp" -#include "Widgets/Displays/QuantitiesRatesDisplay.hpp" -#include "Widgets/Displays/QuantitiesRatesRow.hpp" #include "Plotting/Plot2D.hpp" #include "Util/Sizing.hpp" #include "Widgets/Displays/MultiPlotContainer.hpp" @@ -37,7 +34,7 @@ class MainWindow : public QMainWindow { QPushButton* ArmedIndicator; QPushButton* InitiateButton; QPushButton* AbortButton; - bool ArmedButtonActive = false; // Track armed button state + bool ArmedButtonActive = false; QGridLayout* MajorLayout; QVBoxLayout* AttitudeDialOrganizer; From 3c32902f68707afa9cc8f224cedaefeb6e195aac Mon Sep 17 00:00:00 2001 From: JC Luna Date: Sat, 25 Apr 2026 23:12:32 -0500 Subject: [PATCH 07/17] Dials names when initing --- src/Windowing/MainWindow.cpp | 60 +++++++++++++++--------------------- src/Windowing/MainWindow.hpp | 18 +++++------ 2 files changed, 31 insertions(+), 47 deletions(-) diff --git a/src/Windowing/MainWindow.cpp b/src/Windowing/MainWindow.cpp index 4a17133..fadcfc3 100644 --- a/src/Windowing/MainWindow.cpp +++ b/src/Windowing/MainWindow.cpp @@ -1,5 +1,4 @@ #include "Windowing/MainWindow.hpp" -#include "Plotting/Backend/CoreQChart.hpp" #include "Widgets/Displays/StatusCollector.hpp" namespace VSCL { @@ -7,9 +6,9 @@ MainWindow::MainWindow() : MajorContainer(new QWidget) , AttitudeDialRow(new QFrame(MajorContainer)) - , RollDial(new CompositeDial(AttitudeDialRow)) - , PitchDial(new CompositeDial(AttitudeDialRow)) - , YawDial(new CompositeDial(AttitudeDialRow)) + , RollDial(new CompositeDial(tr("Roll"), AttitudeDialRow)) + , PitchDial(new CompositeDial(tr("Pitch"), AttitudeDialRow)) + , YawDial(new CompositeDial(tr("Yaw"), AttitudeDialRow)) , Plots(new MultiPlotContainer(MajorContainer, 3)) @@ -29,8 +28,6 @@ MainWindow::MainWindow() SetupMultiPlot(); SetupButtons(); SetupActionsRow(); - SetGridColumnsMinimums(); - SetGridRowsMinimums(); SetAllButtonTextSize(); @@ -42,8 +39,12 @@ MainWindow::MainWindow() void MainWindow::resizeEvent(QResizeEvent* event) { QMainWindow::resizeEvent(event); - SetGridColumnsMinimums(); - SetGridRowsMinimums(); + const QRect& dims = centralWidget()->geometry(); + MajorLayout->setColumnMinimumWidth( 0, 4 * dims.width() / 5); + MajorLayout->setColumnMinimumWidth( 1, 1 * dims.width() / 5); + MajorLayout->setRowMinimumHeight( 0, 4 * dims.height() / 5); + MajorLayout->setRowMinimumHeight( 1, 1 * dims.height() / 5); + SetAllButtonTextSize(); } // void MainWindow::resizeEvent() @@ -76,18 +77,6 @@ void MainWindow::SetupAttitudeDials() { AttitudeDialOrganizer->addWidget(YawDial); } // void MainWindow::SetupCentralWidget() -void MainWindow::SetGridColumnsMinimums() { - const QRect& dims = centralWidget()->geometry(); - MajorLayout->setColumnMinimumWidth(0, 4 * dims.width() / 5); - MajorLayout->setColumnMinimumWidth(1, 1 * dims.width() / 5); -} // void MainWindow::SetGridColumnsMinimums() - -void MainWindow::SetGridRowsMinimums() { - const QRect& dims = centralWidget()->geometry(); - MajorLayout->setRowMinimumHeight(0, 4 * dims.height() / 5); - MajorLayout->setRowMinimumHeight(1, 1 * dims.height() / 5); -} // void MainWindow::SetGridRowsMinimums() - // Buttons {{{ void MainWindow::SetupButtons() { StandbyIndicator->setText(tr("Standby")); @@ -133,6 +122,7 @@ void MainWindow::SetupActionsRow() { void MainWindow::SetAllButtonTextSize() { ButtonFont.setPixelSize(ButtonFontAdjustment.AdjustPxSize(window())); + StandbyIndicator->setFont(ButtonFont); ArmedIndicator->setFont(ButtonFont); InitiateButton->setFont(ButtonFont); @@ -141,6 +131,20 @@ void MainWindow::SetAllButtonTextSize() { AbortFont.setPixelSize(AbortFontAdjustment.AdjustPxSize(window())); AbortButton->setFont(AbortFont); } // void MainWindow::SetAllButtonTextSize() + +void MainWindow::OnArmedButtonPressed() { + ArmedButtonActive = !ArmedButtonActive; + + if (ArmedButtonActive) { + ArmedIndicator->setText(tr("Armed")); + SetButtonStatus(ArmedIndicator, Status::ARMED); + SetGroupBoxStatus(ActionsRow, Status::ARMED); + } else { + ArmedIndicator->setText(tr("Disarmed")); + SetButtonStatus(ArmedIndicator, Status::DISARMED); + SetGroupBoxStatus(ActionsRow, Status::DISARMED); + } +} // void MainWindow::OnArmedButtonPressed() // }}} void MainWindow::SetupMultiPlot() { @@ -206,22 +210,6 @@ void MainWindow::CreateActions() { AboutAct->setStatusTip(tr("Show the application's About box")); connect(AboutAct, &QAction::triggered, this, &MainWindow::About); } // void MainWindow::CreateActions() - -void MainWindow::OnArmedButtonPressed() { - ArmedButtonActive = !ArmedButtonActive; - - if (ArmedButtonActive) { - // Armed state - Red - ArmedIndicator->setText(tr("Armed")); - SetButtonStatus(ArmedIndicator, Status::ARMED); - SetGroupBoxStatus(ActionsRow, Status::ARMED); - } else { - // Disarmed state - Yellow - ArmedIndicator->setText(tr("Disarmed")); - SetButtonStatus(ArmedIndicator, Status::DISARMED); - SetGroupBoxStatus(ActionsRow, Status::DISARMED); - } -} // void MainWindow::OnArmedButtonPressed() // }}} } // namespace VSCL // vim: foldmethod=marker diff --git a/src/Windowing/MainWindow.hpp b/src/Windowing/MainWindow.hpp index 3a20c6e..77e6cb8 100644 --- a/src/Windowing/MainWindow.hpp +++ b/src/Windowing/MainWindow.hpp @@ -3,9 +3,8 @@ #include #include "Widgets/Dial/Composite.hpp" -#include "Plotting/Plot2D.hpp" -#include "Util/Sizing.hpp" #include "Widgets/Displays/MultiPlotContainer.hpp" +#include "Util/Sizing.hpp" namespace VSCL { class MainWindow : public QMainWindow { @@ -15,11 +14,6 @@ class MainWindow : public QMainWindow { virtual void resizeEvent(QResizeEvent* event) override; private: - QFont ButtonFont{ }; - Util::FontAdjustment ButtonFontAdjustment{ .PxSizeAtMinimum=12 }; - QFont AbortFont{ }; - Util::FontAdjustment AbortFontAdjustment{ .PxSizeAtMinimum=12 }; - QWidget* MajorContainer; QFrame* AttitudeDialRow; @@ -40,9 +34,12 @@ class MainWindow : public QMainWindow { QVBoxLayout* AttitudeDialOrganizer; QHBoxLayout* ActionsRowOrganizer; + QFont ButtonFont{ }; + Util::FontAdjustment ButtonFontAdjustment{ .PxSizeAtMinimum=12 }; + QFont AbortFont{ }; + Util::FontAdjustment AbortFontAdjustment{ .PxSizeAtMinimum=12 }; + void SetupCentralWidget(); - void SetGridColumnsMinimums(); - void SetGridRowsMinimums(); void SetupAttitudeDials(); void SetupMultiPlot(); void SetupTimeHistoryPlotQChart(); @@ -64,7 +61,6 @@ private slots: QAction* ExitAct; QAction* AboutAct; -// }}} -}; // class Widgets +}; // class MainWindow }}} } // namespace VSCL // vim: foldmethod=marker From 4454cade3d2a56de49d44186ca967797a6018dbf Mon Sep 17 00:00:00 2001 From: JC Luna Date: Sat, 25 Apr 2026 23:38:37 -0500 Subject: [PATCH 08/17] Test routine opening --- CMakeLists.txt | 3 ++- src/Windowing/MainWindow.cpp | 26 +++++++++++++++++++++----- src/Windowing/MainWindow.hpp | 4 +++- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4991d92..0a00c98 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,8 +25,9 @@ qt_add_executable(testrig_gui WIN32 ${APP_SOURCES} ${WIDGET_SOURCES}) target_include_directories(testrig_gui PRIVATE ${STD_APP_INCLUDES}) target_compile_warn_all(testrig_gui) -target_link_libraries(testrig_gui PRIVATE VSCL::Plot::QChart) target_link_libraries(testrig_gui PRIVATE ${STD_APP_QT6_DEPS}) +target_link_libraries(testrig_gui PRIVATE VSCL::Plot::QChart) +target_link_libraries(testrig_gui PRIVATE VSCL::FS) add_executable(VSCL::TestrigGUI ALIAS testrig_gui) add_subdirectory("${CMAKE_SOURCE_DIR}/test") diff --git a/src/Windowing/MainWindow.cpp b/src/Windowing/MainWindow.cpp index fadcfc3..aaf2d5c 100644 --- a/src/Windowing/MainWindow.cpp +++ b/src/Windowing/MainWindow.cpp @@ -1,4 +1,5 @@ #include "Windowing/MainWindow.hpp" +#include "Util/Filesystem/UserPaths.hpp" #include "Widgets/Displays/StatusCollector.hpp" namespace VSCL { @@ -26,15 +27,16 @@ MainWindow::MainWindow() SetupCentralWidget(); SetupAttitudeDials(); SetupMultiPlot(); - SetupButtons(); - SetupActionsRow(); + SetupActionsRow(); + SetupButtons(); SetAllButtonTextSize(); // Set up menubar and statusbar CreateActions(); CreateMenus(); -} // void MainWindow::Widgets() + +} // void MainWindow::MainWindow() void MainWindow::resizeEvent(QResizeEvent* event) { QMainWindow::resizeEvent(event); @@ -47,7 +49,6 @@ void MainWindow::resizeEvent(QResizeEvent* event) { SetAllButtonTextSize(); } // void MainWindow::resizeEvent() - // Layout and Widgets Setup {{{ void MainWindow::SetupCentralWidget() { QSizePolicy majorPolicy; @@ -184,11 +185,20 @@ void MainWindow::SetupMultiPlot() { // Menubar and Actions {{{ void MainWindow::About() { QMessageBox::about(this, tr("About"), - tr("This is a recreation of the original UI layout provided.")); + tr("Operations of the test rig are performed graphically through this application. " + "For more information, check the README.")); } // void MainWindow::About() +void MainWindow::LoadTestRoutine() { + QString fname = QFileDialog::getOpenFileName(this, + tr("Load Routine"), + QString::fromStdString(FS::GetUserAppData().string()), + tr("Python Files (*.py)")); +} + void MainWindow::CreateMenus() { FileMenu = menuBar()->addMenu(tr("&File")); + FileMenu->addAction(LoadAct); FileMenu->addSeparator(); FileMenu->addAction(ExitAct); @@ -199,6 +209,12 @@ void MainWindow::CreateMenus() { } // void MainWindow::CreateMenus() void MainWindow::CreateActions() { + LoadAct = new QAction(QIcon::fromTheme(QIcon::ThemeIcon::DocumentOpen), + tr("Load Routine"), this); + LoadAct->setShortcuts(QKeySequence::Open); + LoadAct->setStatusTip(tr("Load a test routine from Python")); + connect(LoadAct, &QAction::triggered, this, &MainWindow::LoadTestRoutine); + ExitAct = new QAction(QIcon::fromTheme(QIcon::ThemeIcon::ApplicationExit), tr("Exit"), this); ExitAct->setShortcuts(QKeySequence::Quit); diff --git a/src/Windowing/MainWindow.hpp b/src/Windowing/MainWindow.hpp index 77e6cb8..5eee2bc 100644 --- a/src/Windowing/MainWindow.hpp +++ b/src/Windowing/MainWindow.hpp @@ -43,12 +43,13 @@ class MainWindow : public QMainWindow { void SetupAttitudeDials(); void SetupMultiPlot(); void SetupTimeHistoryPlotQChart(); - void SetupButtons(); void SetupActionsRow(); + void SetupButtons(); void SetAllButtonTextSize(); private slots: void About(); + void LoadTestRoutine(); void OnArmedButtonPressed(); private: @@ -59,6 +60,7 @@ private slots: QMenu* EditMenu; QMenu* HelpMenu; + QAction* LoadAct; QAction* ExitAct; QAction* AboutAct; }; // class MainWindow }}} From 00be337a178b8eb4c424b96a612865fa82044976 Mon Sep 17 00:00:00 2001 From: JC Luna Date: Sat, 25 Apr 2026 23:43:36 -0500 Subject: [PATCH 09/17] Remove the unused tester --- src/Windowing/MainWindow.cpp | 18 +----------------- src/Windowing/MainWindow.hpp | 4 +++- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/src/Windowing/MainWindow.cpp b/src/Windowing/MainWindow.cpp index aaf2d5c..092b0e1 100644 --- a/src/Windowing/MainWindow.cpp +++ b/src/Windowing/MainWindow.cpp @@ -85,11 +85,8 @@ void MainWindow::SetupButtons() { ArmedIndicator->setText(tr("Disarmed")); SetButtonStatus(ArmedIndicator, Status::DISARMED); - // testing below - // connect(ArmedIndicator, &QPushButton::clicked, this, &MainWindow::OnArmedButtonPressed); InitiateButton->setText(tr("Initiate")); - AbortButton->setText(tr("Abort")); AbortButton->setStyleSheet("color: red"); @@ -132,20 +129,6 @@ void MainWindow::SetAllButtonTextSize() { AbortFont.setPixelSize(AbortFontAdjustment.AdjustPxSize(window())); AbortButton->setFont(AbortFont); } // void MainWindow::SetAllButtonTextSize() - -void MainWindow::OnArmedButtonPressed() { - ArmedButtonActive = !ArmedButtonActive; - - if (ArmedButtonActive) { - ArmedIndicator->setText(tr("Armed")); - SetButtonStatus(ArmedIndicator, Status::ARMED); - SetGroupBoxStatus(ActionsRow, Status::ARMED); - } else { - ArmedIndicator->setText(tr("Disarmed")); - SetButtonStatus(ArmedIndicator, Status::DISARMED); - SetGroupBoxStatus(ActionsRow, Status::DISARMED); - } -} // void MainWindow::OnArmedButtonPressed() // }}} void MainWindow::SetupMultiPlot() { @@ -194,6 +177,7 @@ void MainWindow::LoadTestRoutine() { tr("Load Routine"), QString::fromStdString(FS::GetUserAppData().string()), tr("Python Files (*.py)")); + // TODO: IMPL ME } void MainWindow::CreateMenus() { diff --git a/src/Windowing/MainWindow.hpp b/src/Windowing/MainWindow.hpp index 5eee2bc..9712952 100644 --- a/src/Windowing/MainWindow.hpp +++ b/src/Windowing/MainWindow.hpp @@ -9,6 +9,8 @@ namespace VSCL { class MainWindow : public QMainWindow { + Q_OBJECT; + public: MainWindow(); virtual void resizeEvent(QResizeEvent* event) override; @@ -47,10 +49,10 @@ class MainWindow : public QMainWindow { void SetupButtons(); void SetAllButtonTextSize(); +// Actions private slots: void About(); void LoadTestRoutine(); - void OnArmedButtonPressed(); private: void CreateActions(); From 0e60d38983f3914cbeec4fab6fbc42abf0d9fdbe Mon Sep 17 00:00:00 2001 From: JC Luna Date: Sat, 25 Apr 2026 23:50:43 -0500 Subject: [PATCH 10/17] Slight refactor and modernize of multiplot setup --- src/Windowing/MainWindow.cpp | 40 +++++++++++++++++------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/src/Windowing/MainWindow.cpp b/src/Windowing/MainWindow.cpp index 092b0e1..377582b 100644 --- a/src/Windowing/MainWindow.cpp +++ b/src/Windowing/MainWindow.cpp @@ -133,36 +133,34 @@ void MainWindow::SetAllButtonTextSize() { void MainWindow::SetupMultiPlot() { MajorLayout->addWidget(Plots, 0, 0); - QList allPlots = Plots->GetPlots(); + QList all_plts = Plots->GetPlots(); - Plot::AxisInfo axInfo; - axInfo.Range = { 0, 10 }; + Plot::AxisInfo time_info; + time_info.Range = { 0, 10 }; - Plot::AxisInfo justWtv; - justWtv.Range = {-180, 180}; - justWtv.MajorSpacing = 180; - justWtv.MinorSpacing = 45; + Plot::AxisInfo ang_info; + ang_info.Range = {-180, 180}; + ang_info.MajorSpacing = 180; + ang_info.MinorSpacing = 45; - std::array RPY = {"Roll", "Pitch", "Yaw"}; - auto angle = RPY.begin(); + std::array angels = {"Roll", "Pitch", "Yaw"}; + auto angle = angels.begin(); auto color = Plot::STANDARD_COLOR.begin(); - for (Plot::EmbeddablePlot2D* p : allPlots) { - std::string name = *angle; - Plot::ColorRGB rgb = color->second; - Plot::SeriesInfo info; - info.Name = name; - info.Color = rgb; + std::ranges::for_each(all_plts, + [&](Plot::EmbeddablePlot2D* plt) { + Plot::SeriesInfo info { + .Name = std::string(*angle), + .Color = color->second + }; - p->AddSeries(info); - - justWtv.Title = name; - p->SetAxis(Plot::Axis::QUANTITY, justWtv); - p->SetAxis(Plot::Axis::TIME, axInfo); + plt->AddSeries(info); + plt->SetAxis(Plot::Axis::QUANTITY, ang_info); + plt->SetAxis(Plot::Axis::TIME, time_info); angle++; color++; - } + }); } // }}} // Menubar and Actions {{{ From f2a90e7c67be3281762b8f677391f1272dfaf2ae Mon Sep 17 00:00:00 2001 From: JC Luna Date: Sat, 25 Apr 2026 23:59:44 -0500 Subject: [PATCH 11/17] Rename StatusColumn -> StatusRow --- src/Widgets/Displays/StatusCollector.cpp | 2 +- src/Windowing/MainWindow.cpp | 23 ++++++++++++++--------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/Widgets/Displays/StatusCollector.cpp b/src/Widgets/Displays/StatusCollector.cpp index 2a4041e..fe62a0d 100644 --- a/src/Widgets/Displays/StatusCollector.cpp +++ b/src/Widgets/Displays/StatusCollector.cpp @@ -11,7 +11,7 @@ QString BuildStatusStyleSheet(const QString& object_name, Status status) { " border-radius: 5px;" " margin-top: 20px;" "}" - " QGroupBox#statusColumn::title {" + " QGroupBox#StatusRow::title {" " subcontrol-origin: margin;" " subcontrol-position: top left;" " padding: 0 0px;" diff --git a/src/Windowing/MainWindow.cpp b/src/Windowing/MainWindow.cpp index 377582b..16e3821 100644 --- a/src/Windowing/MainWindow.cpp +++ b/src/Windowing/MainWindow.cpp @@ -51,20 +51,22 @@ void MainWindow::resizeEvent(QResizeEvent* event) { } // void MainWindow::resizeEvent() // Layout and Widgets Setup {{{ void MainWindow::SetupCentralWidget() { + setCentralWidget(MajorContainer); + + MajorContainer->setLayout(MajorLayout); + MajorLayout->setContentsMargins(35, 35, 35, 35); + QSizePolicy majorPolicy; majorPolicy.setHorizontalPolicy(QSizePolicy::MinimumExpanding); majorPolicy.setVerticalPolicy(QSizePolicy::MinimumExpanding); MajorContainer->setSizePolicy(majorPolicy); - MajorLayout->setContentsMargins(35, 35, 35, 35); - MajorContainer->setLayout(MajorLayout); - - setCentralWidget(MajorContainer); + MajorLayout->addWidget(Plots, 0, 0); + MajorLayout->addWidget(AttitudeDialRow, 0, 1); + MajorLayout->addWidget(ActionsRow, 1, 0, 1, 2); } // void MainWindow::SetupCentralWidget() void MainWindow::SetupAttitudeDials() { - MajorLayout->addWidget(AttitudeDialRow, 0, 1); - AttitudeDialOrganizer->setContentsMargins(20, 20, 20, 20); AttitudeDialRow->setLayout(AttitudeDialOrganizer); @@ -94,10 +96,9 @@ void MainWindow::SetupButtons() { } // void MainWindow::SetupButtons() void MainWindow::SetupActionsRow() { - ActionsRow->setObjectName("statusColumn"); + ActionsRow->setObjectName("StatusRow"); SetGroupBoxStatus(ActionsRow, Status::DISARMED); - MajorLayout->addWidget(ActionsRow, 1, 0, 1, 2); QSizePolicy vhexpanding; vhexpanding.setVerticalPolicy(QSizePolicy::MinimumExpanding); @@ -132,7 +133,6 @@ void MainWindow::SetAllButtonTextSize() { // }}} void MainWindow::SetupMultiPlot() { - MajorLayout->addWidget(Plots, 0, 0); QList all_plts = Plots->GetPlots(); Plot::AxisInfo time_info; @@ -191,6 +191,7 @@ void MainWindow::CreateMenus() { } // void MainWindow::CreateMenus() void MainWindow::CreateActions() { + // File Menu LoadAct = new QAction(QIcon::fromTheme(QIcon::ThemeIcon::DocumentOpen), tr("Load Routine"), this); LoadAct->setShortcuts(QKeySequence::Open); @@ -203,6 +204,10 @@ void MainWindow::CreateActions() { ExitAct->setStatusTip(tr("Exit the application")); connect(ExitAct, &QAction::triggered, this, &QWidget::close); + // Edit Menu + + + // Help Menu AboutAct = new QAction(QIcon::fromTheme(QIcon::ThemeIcon::HelpAbout), tr("&About"), this); AboutAct->setStatusTip(tr("Show the application's About box")); From 8ead9e712cf7716240241a855bc21c1cdb05b2e8 Mon Sep 17 00:00:00 2001 From: JC Luna Date: Sun, 26 Apr 2026 01:04:43 -0500 Subject: [PATCH 12/17] Config and states loaders --- src/App/Main.cpp | 23 +++++++++++++++++++++++ src/Util/Filesystem/Config.cpp | 23 ++++++++++++++++++++++- src/Util/Filesystem/Config.hpp | 3 +++ src/Util/Filesystem/State.cpp | 4 ++++ src/Util/Filesystem/State.hpp | 1 + 5 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/App/Main.cpp b/src/App/Main.cpp index 1672e49..50921e0 100644 --- a/src/App/Main.cpp +++ b/src/App/Main.cpp @@ -1,12 +1,35 @@ #include #include #include +#include #include "Windowing/MainWindow.hpp" +#include "Util/Filesystem/Config.hpp" +#include "Util/Filesystem/State.hpp" + +namespace fs = std::filesystem; + +static VSCL::Settings settings{}; +static VSCL::State state{}; int main(int argc, char** argv) { QApplication app(argc, argv); + fs::path cfg = VSCL::FS::GetConfigFile(); + if (!fs::is_regular_file(cfg)) { + std::ofstream streem(cfg.string()); + streem << VSCL::FS::SerializeConfigToYAML(settings); + } + else { + settings = VSCL::FS::ReadConfig(cfg); + } + + fs::path stat = VSCL::FS::GetStateFile(); + if (!fs::is_regular_file(stat)) { + std::ofstream streem(stat.string()); + streem << VSCL::FS::SerializeStateToYAML(state); + } + VSCL::MainWindow window; QString message = window.tr("Test Rig Operations"); diff --git a/src/Util/Filesystem/Config.cpp b/src/Util/Filesystem/Config.cpp index 0bcd289..28a5909 100644 --- a/src/Util/Filesystem/Config.cpp +++ b/src/Util/Filesystem/Config.cpp @@ -8,7 +8,6 @@ namespace stdfs = std::filesystem; namespace VSCL::FS { - stdfs::path GetConfigFile() { constexpr std::string_view cfgwhere = GetStandardPath("config"); return GetUserAppData() / cfgwhere / "config.yaml"; @@ -32,6 +31,24 @@ YAML::Node SerializeConfigToYAML(const VSCL::Settings& settings) { return top_lvl; } +VSCL::Settings DeserializeConfigFromYAML(const YAML::Node& serialized) { + if (!serialized["Data"] && !serialized["Connection"]) return VSCL::Settings{}; + + const YAML::Node& data = serialized["Data"]; + const YAML::Node& conn = serialized["Connection"]; + + return VSCL::Settings { + .Data { + .OutputDirectory = stdfs::path(data["OutputDirectory"].as()), + .LogPrefix = data["LogPrefix"].as(), + }, + .Connect { + .DefaultInterface = conn["DefaultInterface"].as(), + .DefaultGatewayPort = conn["DefaultGatewayPort"].as(), + }, + }; +} + void WriteConfig(const VSCL::Settings& settings) { YAML::Node yamlized = SerializeConfigToYAML(settings); @@ -40,4 +57,8 @@ void WriteConfig(const VSCL::Settings& settings) { cfg << yamlized; } +VSCL::Settings ReadConfig(const std::filesystem::path& path) { + YAML::Node yamlized = YAML::LoadFile(path.string()); + return DeserializeConfigFromYAML(yamlized); +} } // namespace VSCL::FS diff --git a/src/Util/Filesystem/Config.hpp b/src/Util/Filesystem/Config.hpp index 675fa8a..8c2a966 100644 --- a/src/Util/Filesystem/Config.hpp +++ b/src/Util/Filesystem/Config.hpp @@ -7,6 +7,9 @@ namespace VSCL::FS { std::filesystem::path GetConfigFile(); YAML::Node SerializeConfigToYAML(const VSCL::Settings& settings); +VSCL::Settings DeserializeConfigFromYAML(const YAML::Node& serialized); + void WriteConfig(const VSCL::Settings& settings); +VSCL::Settings ReadConfig(const std::filesystem::path& path); } // namespace VSCL::FS diff --git a/src/Util/Filesystem/State.cpp b/src/Util/Filesystem/State.cpp index beb7b79..a0b81bb 100644 --- a/src/Util/Filesystem/State.cpp +++ b/src/Util/Filesystem/State.cpp @@ -1,4 +1,7 @@ #include +#include +#include + #include "UserPaths.hpp" #include "State.hpp" @@ -17,6 +20,7 @@ stdfs::path GetStateFile() { YAML::Node SerializeStateToYAML(const VSCL::State& state) { YAML::Node top_lvl; top_lvl["LatestSocket"] = state.LatestSocket.string(); + top_lvl["LatestRecord"] = std::format("{}", std::chrono::utc_clock::now()); return top_lvl; } diff --git a/src/Util/Filesystem/State.hpp b/src/Util/Filesystem/State.hpp index 2bc931f..a75c2ac 100644 --- a/src/Util/Filesystem/State.hpp +++ b/src/Util/Filesystem/State.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include "yaml-cpp/yaml.h" namespace VSCL { From af40c4fdc793e8ab19a44b7e4e86441c0f69bb05 Mon Sep 17 00:00:00 2001 From: JC Luna Date: Sun, 26 Apr 2026 01:06:00 -0500 Subject: [PATCH 13/17] The default is actually data --- src/Util/Filesystem/Settings.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Util/Filesystem/Settings.hpp b/src/Util/Filesystem/Settings.hpp index da2264b..87dbb8d 100644 --- a/src/Util/Filesystem/Settings.hpp +++ b/src/Util/Filesystem/Settings.hpp @@ -5,7 +5,7 @@ namespace VSCL { struct DataSettings { // Where to output recorded data std::filesystem::path OutputDirectory = - FS::GetUserAppData() / FS::GetStandardPath("config"); + FS::GetUserAppData() / FS::GetStandardPath("data"); // Data csv log prefix std::string LogPrefix = "run"; From b24d5f1e275eb095eab74bb88935a5a36ae0babb Mon Sep 17 00:00:00 2001 From: JC Luna Date: Sun, 26 Apr 2026 13:16:36 -0500 Subject: [PATCH 14/17] Slight reorg of Main.cpp and CMake --- CMakeLists.txt | 2 ++ cmake/cpp.cmake | 32 +---------------------------- cmake/target_compile_warn_all.cmake | 7 +++++++ cmake/target_copy_dll.cmake | 8 ++++++++ src/{App => }/Main.cpp | 0 src/Util/Filesystem/State.hpp | 1 - 6 files changed, 18 insertions(+), 32 deletions(-) create mode 100644 cmake/target_compile_warn_all.cmake create mode 100644 cmake/target_copy_dll.cmake rename src/{App => }/Main.cpp (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0a00c98..9d53b1a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,6 +14,8 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") include(FetchContent) include("./cmake/cpp.cmake") +include(target_compile_warn_all) +include(target_copy_dll) qt_standard_project_setup(REQUIRES 6.10) find_package(yaml-cpp) diff --git a/cmake/cpp.cmake b/cmake/cpp.cmake index 31e432e..472ec2e 100644 --- a/cmake/cpp.cmake +++ b/cmake/cpp.cmake @@ -11,7 +11,7 @@ set(PLOTTING_SRC_DIR "${CMAKE_SOURCE_DIR}/src/Plotting") set(UTIL_SRC_DIR "${CMAKE_SOURCE_DIR}/src/Util") set(APP_SOURCES - "${CMAKE_SOURCE_DIR}/src/App/Main.cpp" + "${CMAKE_SOURCE_DIR}/src/Main.cpp" "${WINDOWING_SRC_DIR}/MainWindow.cpp") set(DIAL_SOURCES @@ -45,33 +45,3 @@ set(STD_APP_QT6_DEPS Qt6::Quick Qt6::Widgets Qt6::QuickWidgets) - -function(target_compile_warn_all IN_TARGET_NAME) - if (MSVC) - target_compile_options(${IN_TARGET_NAME} PRIVATE "/W4") - else() - target_compile_options(${IN_TARGET_NAME} PRIVATE "-Wall") - endif() -endfunction(target_compile_warn_all) - -function(add_subdirectory_silence_warnings IN_DIRECTORY) - get_directory_property(oldCompileOpts COMPILE_OPTIONS) - - if (MSVC) - add_compile_options("/W0") - else() - add_compile_options("-w") - endif() - add_subdirectory("${IN_DIRECTORY}" EXCLUDE_FROM_ALL) - - set_directory_properties(PROPERTIES COMPILE_OPTIONS "${oldCompileOpts}") -endfunction(add_subdirectory_silence_warnings IN_DIRECTORY) - -function(target_copy_dll IN_TARGET) - if (WIN32) - add_custom_command(TARGET ${IN_TARGET} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different - $ $ - COMMAND_EXPAND_LISTS) - endif() -endfunction(target_copy_dll IN_TARGET) diff --git a/cmake/target_compile_warn_all.cmake b/cmake/target_compile_warn_all.cmake new file mode 100644 index 0000000..250e1ae --- /dev/null +++ b/cmake/target_compile_warn_all.cmake @@ -0,0 +1,7 @@ +function(target_compile_warn_all IN_TARGET_NAME) + if (MSVC) + target_compile_options(${IN_TARGET_NAME} PRIVATE "/W4") + else() + target_compile_options(${IN_TARGET_NAME} PRIVATE "-Wall") + endif() +endfunction(target_compile_warn_all) diff --git a/cmake/target_copy_dll.cmake b/cmake/target_copy_dll.cmake new file mode 100644 index 0000000..0fbb2e4 --- /dev/null +++ b/cmake/target_copy_dll.cmake @@ -0,0 +1,8 @@ +function(target_copy_dll IN_TARGET) + if (WIN32) + add_custom_command(TARGET ${IN_TARGET} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + $ $ + COMMAND_EXPAND_LISTS) + endif() +endfunction(target_copy_dll IN_TARGET) diff --git a/src/App/Main.cpp b/src/Main.cpp similarity index 100% rename from src/App/Main.cpp rename to src/Main.cpp diff --git a/src/Util/Filesystem/State.hpp b/src/Util/Filesystem/State.hpp index a75c2ac..2bc931f 100644 --- a/src/Util/Filesystem/State.hpp +++ b/src/Util/Filesystem/State.hpp @@ -1,7 +1,6 @@ #pragma once #include -#include #include "yaml-cpp/yaml.h" namespace VSCL { From 2979acf689b45df7856ffea292795a50c602a8ec Mon Sep 17 00:00:00 2001 From: JC Luna Date: Sun, 26 Apr 2026 13:17:14 -0500 Subject: [PATCH 15/17] Attempt to silence FetchContent warnings --- cmake/Findyaml-cpp.cmake | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/cmake/Findyaml-cpp.cmake b/cmake/Findyaml-cpp.cmake index f3c2d5e..9d14f9f 100644 --- a/cmake/Findyaml-cpp.cmake +++ b/cmake/Findyaml-cpp.cmake @@ -1,6 +1,20 @@ +get_directory_property(_old_compile_opts COMPILE_OPTIONS) + +if (MSVC) + add_compile_options("/W0") +else() + add_compile_options("-w") +endif() + FetchContent_Declare( yaml-cpp GIT_REPOSITORY https://github.com/jbeder/yaml-cpp.git GIT_TAG yaml-cpp-0.9.0 ) FetchContent_MakeAvailable(yaml-cpp) + +if (MSVC) + target_compile_options(yaml-cpp PRIVATE /W0) +else() + add_compile_options(yaml-cpp PRIVATE -w) +endif() From 8fb6b2601d540e1ebac91aae68659bea0fe86af4 Mon Sep 17 00:00:00 2001 From: JC Luna Date: Sun, 26 Apr 2026 13:29:26 -0500 Subject: [PATCH 16/17] Revert Attempt to silence FetchContent warnings --- cmake/Findyaml-cpp.cmake | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/cmake/Findyaml-cpp.cmake b/cmake/Findyaml-cpp.cmake index 9d14f9f..f3c2d5e 100644 --- a/cmake/Findyaml-cpp.cmake +++ b/cmake/Findyaml-cpp.cmake @@ -1,20 +1,6 @@ -get_directory_property(_old_compile_opts COMPILE_OPTIONS) - -if (MSVC) - add_compile_options("/W0") -else() - add_compile_options("-w") -endif() - FetchContent_Declare( yaml-cpp GIT_REPOSITORY https://github.com/jbeder/yaml-cpp.git GIT_TAG yaml-cpp-0.9.0 ) FetchContent_MakeAvailable(yaml-cpp) - -if (MSVC) - target_compile_options(yaml-cpp PRIVATE /W0) -else() - add_compile_options(yaml-cpp PRIVATE -w) -endif() From 405571c2ea5489f8c6d5a4eb53b70c67364587a0 Mon Sep 17 00:00:00 2001 From: JC Luna Date: Sun, 26 Apr 2026 22:37:09 -0500 Subject: [PATCH 17/17] Remove Operate title from action row --- src/Widgets/Displays/StatusCollector.cpp | 5 ----- src/Windowing/MainWindow.cpp | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/Widgets/Displays/StatusCollector.cpp b/src/Widgets/Displays/StatusCollector.cpp index fe62a0d..2eea1e0 100644 --- a/src/Widgets/Displays/StatusCollector.cpp +++ b/src/Widgets/Displays/StatusCollector.cpp @@ -11,11 +11,6 @@ QString BuildStatusStyleSheet(const QString& object_name, Status status) { " border-radius: 5px;" " margin-top: 20px;" "}" - " QGroupBox#StatusRow::title {" - " subcontrol-origin: margin;" - " subcontrol-position: top left;" - " padding: 0 0px;" - "}" ).arg(object_name).arg(QString::fromStdString(color)); } diff --git a/src/Windowing/MainWindow.cpp b/src/Windowing/MainWindow.cpp index 16e3821..4f53d2d 100644 --- a/src/Windowing/MainWindow.cpp +++ b/src/Windowing/MainWindow.cpp @@ -13,7 +13,7 @@ MainWindow::MainWindow() , Plots(new MultiPlotContainer(MajorContainer, 3)) - , ActionsRow(new QGroupBox(tr("Operate"), MajorContainer)) + , ActionsRow(new QGroupBox(tr(""), MajorContainer)) , StandbyIndicator(new QPushButton(ActionsRow)) , ArmedIndicator(new QPushButton(ActionsRow)) , InitiateButton(new QPushButton(ActionsRow))