From 300091dbe1584dabb4deede5d4d8e0f19f87fb51 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Sun, 25 Jun 2023 00:58:51 -0500 Subject: [PATCH 01/13] Initial collapsible group layout --- .../icons/font-awesome-6/angle-down-solid.svg | 1 + scwx-qt/scwx-qt.cmake | 3 + scwx-qt/scwx-qt.qrc | 1 + .../source/scwx/qt/ui/collapsible_group.cpp | 88 +++++++++++++ .../source/scwx/qt/ui/collapsible_group.hpp | 43 +++++++ .../source/scwx/qt/ui/collapsible_group.ui | 117 ++++++++++++++++++ 6 files changed, 253 insertions(+) create mode 100644 scwx-qt/res/icons/font-awesome-6/angle-down-solid.svg create mode 100644 scwx-qt/source/scwx/qt/ui/collapsible_group.cpp create mode 100644 scwx-qt/source/scwx/qt/ui/collapsible_group.hpp create mode 100644 scwx-qt/source/scwx/qt/ui/collapsible_group.ui diff --git a/scwx-qt/res/icons/font-awesome-6/angle-down-solid.svg b/scwx-qt/res/icons/font-awesome-6/angle-down-solid.svg new file mode 100644 index 00000000..c877d491 --- /dev/null +++ b/scwx-qt/res/icons/font-awesome-6/angle-down-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/scwx-qt/scwx-qt.cmake b/scwx-qt/scwx-qt.cmake index 4b32eeb3..45d23b93 100644 --- a/scwx-qt/scwx-qt.cmake +++ b/scwx-qt/scwx-qt.cmake @@ -147,6 +147,7 @@ set(HDR_UI source/scwx/qt/ui/about_dialog.hpp source/scwx/qt/ui/alert_dialog.hpp source/scwx/qt/ui/alert_dock_widget.hpp source/scwx/qt/ui/animation_dock_widget.hpp + source/scwx/qt/ui/collapsible_group.hpp source/scwx/qt/ui/flow_layout.hpp source/scwx/qt/ui/imgui_debug_dialog.hpp source/scwx/qt/ui/imgui_debug_widget.hpp @@ -160,6 +161,7 @@ set(SRC_UI source/scwx/qt/ui/about_dialog.cpp source/scwx/qt/ui/alert_dialog.cpp source/scwx/qt/ui/alert_dock_widget.cpp source/scwx/qt/ui/animation_dock_widget.cpp + source/scwx/qt/ui/collapsible_group.cpp source/scwx/qt/ui/flow_layout.cpp source/scwx/qt/ui/imgui_debug_dialog.cpp source/scwx/qt/ui/imgui_debug_widget.cpp @@ -173,6 +175,7 @@ set(UI_UI source/scwx/qt/ui/about_dialog.ui source/scwx/qt/ui/alert_dialog.ui source/scwx/qt/ui/alert_dock_widget.ui source/scwx/qt/ui/animation_dock_widget.ui + source/scwx/qt/ui/collapsible_group.ui source/scwx/qt/ui/imgui_debug_dialog.ui source/scwx/qt/ui/radar_site_dialog.ui source/scwx/qt/ui/settings_dialog.ui diff --git a/scwx-qt/scwx-qt.qrc b/scwx-qt/scwx-qt.qrc index 36618bee..2e217ca0 100644 --- a/scwx-qt/scwx-qt.qrc +++ b/scwx-qt/scwx-qt.qrc @@ -15,6 +15,7 @@ res/fonts/din1451alt_g.ttf res/icons/scwx-256.ico res/icons/scwx-256.png + res/icons/font-awesome-6/angle-down-solid.svg res/icons/font-awesome-6/angle-left-solid.svg res/icons/font-awesome-6/angle-right-solid.svg res/icons/font-awesome-6/backward-step-solid.svg diff --git a/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp b/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp new file mode 100644 index 00000000..3a6ca750 --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp @@ -0,0 +1,88 @@ +#include "collapsible_group.hpp" +#include "ui_collapsible_group.h" + +namespace scwx +{ +namespace qt +{ +namespace ui +{ + +class CollapsibleGroupImpl +{ +public: + explicit CollapsibleGroupImpl(CollapsibleGroup* self) : self_ {self} {} + ~CollapsibleGroupImpl() = default; + + void Initialize(); + + const QIcon kCollapsedIcon_ { + ":/res/icons/font-awesome-6/angle-right-solid.svg"}; + const QIcon kExpandedIcon_ { + ":/res/icons/font-awesome-6/angle-down-solid.svg"}; + + CollapsibleGroup* self_; +}; + +CollapsibleGroup::CollapsibleGroup(QWidget* parent) : + QFrame(parent), + p {std::make_unique(this)}, + ui(new Ui::CollapsibleGroup) +{ + ui->setupUi(this); + p->Initialize(); +} + +CollapsibleGroup::CollapsibleGroup(const QString& title, QWidget* parent) : + QFrame(parent), + p {std::make_unique(this)}, + ui(new Ui::CollapsibleGroup) +{ + ui->setupUi(this); + ui->titleLabel->setText(title); + p->Initialize(); +} + +CollapsibleGroup::~CollapsibleGroup() +{ + delete ui; +} + +void CollapsibleGroupImpl::Initialize() +{ + self_->Expand(); +} + +void CollapsibleGroup::SetContentsLayout(QLayout* layout) +{ + ui->contentsFrame->setLayout(layout); +} + +void CollapsibleGroup::SetTitle(const QString& title) +{ + ui->titleLabel->setText(title); +} + +void CollapsibleGroup::Collapse() +{ + // Update the title frame + ui->arrowLabel->setMaximumSize(8, 16); + ui->arrowLabel->setPixmap(p->kCollapsedIcon_.pixmap(8, 16)); + + // Hide the group contents + ui->contentsFrame->setVisible(false); +} + +void CollapsibleGroup::Expand() +{ + // Update the title frame + ui->arrowLabel->setMaximumSize(16, 16); + ui->arrowLabel->setPixmap(p->kExpandedIcon_.pixmap(16, 16)); + + // Show the group contents + ui->contentsFrame->setVisible(true); +} + +} // namespace ui +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/ui/collapsible_group.hpp b/scwx-qt/source/scwx/qt/ui/collapsible_group.hpp new file mode 100644 index 00000000..1c9d246f --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/collapsible_group.hpp @@ -0,0 +1,43 @@ +#pragma once + +#include + +namespace Ui +{ +class CollapsibleGroup; +} + +namespace scwx +{ +namespace qt +{ +namespace ui +{ + +class CollapsibleGroupImpl; + +class CollapsibleGroup : public QFrame +{ + Q_OBJECT + +public: + explicit CollapsibleGroup(QWidget* parent = nullptr); + explicit CollapsibleGroup(const QString& title, QWidget* parent = nullptr); + ~CollapsibleGroup(); + + void SetContentsLayout(QLayout* contents); + void SetTitle(const QString& title); + +public slots: + void Collapse(); + void Expand(); + +private: + friend class CollapsibleGroupImpl; + std::unique_ptr p; + Ui::CollapsibleGroup* ui; +}; + +} // namespace ui +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/ui/collapsible_group.ui b/scwx-qt/source/scwx/qt/ui/collapsible_group.ui new file mode 100644 index 00000000..fae529df --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/collapsible_group.ui @@ -0,0 +1,117 @@ + + + CollapsibleGroup + + + + 0 + 0 + 400 + 300 + + + + Frame + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QFrame::Box + + + QFrame::Sunken + + + + 1 + + + 1 + + + 1 + + + 1 + + + + + + 16 + 0 + + + + + 8 + 16 + + + + + + + :/res/icons/font-awesome-6/angle-down-solid.svg + + + true + + + + + + + Title + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + QFrame::Box + + + QFrame::Sunken + + + + + + + + + + From 7ff9feba253f1c0c000e0075a7b4670771a4c8e5 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Mon, 26 Jun 2023 22:51:32 -0500 Subject: [PATCH 02/13] Change collapsible title from labels to buttons, connect toggled signal to expand/collapse --- .../source/scwx/qt/ui/collapsible_group.cpp | 31 ++++++++-- .../source/scwx/qt/ui/collapsible_group.ui | 61 ++++--------------- 2 files changed, 36 insertions(+), 56 deletions(-) diff --git a/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp b/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp index 3a6ca750..63f23024 100644 --- a/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp +++ b/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp @@ -39,7 +39,7 @@ CollapsibleGroup::CollapsibleGroup(const QString& title, QWidget* parent) : ui(new Ui::CollapsibleGroup) { ui->setupUi(this); - ui->titleLabel->setText(title); + ui->titleButton->setText(title); p->Initialize(); } @@ -51,6 +51,21 @@ CollapsibleGroup::~CollapsibleGroup() void CollapsibleGroupImpl::Initialize() { self_->Expand(); + + QObject::connect(self_->ui->titleButton, + &QAbstractButton::toggled, + self_, + [this](bool checked) + { + if (checked) + { + self_->Expand(); + } + else + { + self_->Collapse(); + } + }); } void CollapsibleGroup::SetContentsLayout(QLayout* layout) @@ -60,14 +75,16 @@ void CollapsibleGroup::SetContentsLayout(QLayout* layout) void CollapsibleGroup::SetTitle(const QString& title) { - ui->titleLabel->setText(title); + ui->titleButton->setText(title); } void CollapsibleGroup::Collapse() { // Update the title frame - ui->arrowLabel->setMaximumSize(8, 16); - ui->arrowLabel->setPixmap(p->kCollapsedIcon_.pixmap(8, 16)); + if (ui->titleButton->isChecked()) + { + ui->titleButton->setChecked(false); + } // Hide the group contents ui->contentsFrame->setVisible(false); @@ -76,8 +93,10 @@ void CollapsibleGroup::Collapse() void CollapsibleGroup::Expand() { // Update the title frame - ui->arrowLabel->setMaximumSize(16, 16); - ui->arrowLabel->setPixmap(p->kExpandedIcon_.pixmap(16, 16)); + if (!ui->titleButton->isChecked()) + { + ui->titleButton->setChecked(true); + } // Show the group contents ui->contentsFrame->setVisible(true); diff --git a/scwx-qt/source/scwx/qt/ui/collapsible_group.ui b/scwx-qt/source/scwx/qt/ui/collapsible_group.ui index fae529df..3c2656d5 100644 --- a/scwx-qt/source/scwx/qt/ui/collapsible_group.ui +++ b/scwx-qt/source/scwx/qt/ui/collapsible_group.ui @@ -17,18 +17,6 @@ 0 - - 0 - - - 0 - - - 0 - - - 0 - @@ -51,50 +39,23 @@ 1 - - - - 16 - 0 - + + + background: transparent; border: none; color: palette(window-text); text-align: left; - - - 8 - 16 - - - - - - - :/res/icons/font-awesome-6/angle-down-solid.svg - - - true - - - - - Title + + + :/res/icons/font-awesome-6/angle-right-solid.svg + :/res/icons/font-awesome-6/angle-down-solid.svg:/res/icons/font-awesome-6/angle-right-solid.svg + + + true + - - - - Qt::Horizontal - - - - 40 - 20 - - - - From 04a539b93dc8aa064e010f33b414e3d75be51540 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Tue, 27 Jun 2023 22:29:23 -0500 Subject: [PATCH 03/13] Update collapsible expansion logic, and change icons --- .../icons/font-awesome-6/angle-down-solid.svg | 1 - .../square-caret-down-regular.svg | 1 + .../square-caret-right-regular.svg | 1 + scwx-qt/scwx-qt.qrc | 3 +- .../source/scwx/qt/ui/collapsible_group.cpp | 36 +++++++------------ .../source/scwx/qt/ui/collapsible_group.ui | 16 +++++++-- 6 files changed, 30 insertions(+), 28 deletions(-) delete mode 100644 scwx-qt/res/icons/font-awesome-6/angle-down-solid.svg create mode 100644 scwx-qt/res/icons/font-awesome-6/square-caret-down-regular.svg create mode 100644 scwx-qt/res/icons/font-awesome-6/square-caret-right-regular.svg diff --git a/scwx-qt/res/icons/font-awesome-6/angle-down-solid.svg b/scwx-qt/res/icons/font-awesome-6/angle-down-solid.svg deleted file mode 100644 index c877d491..00000000 --- a/scwx-qt/res/icons/font-awesome-6/angle-down-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/scwx-qt/res/icons/font-awesome-6/square-caret-down-regular.svg b/scwx-qt/res/icons/font-awesome-6/square-caret-down-regular.svg new file mode 100644 index 00000000..98e322ef --- /dev/null +++ b/scwx-qt/res/icons/font-awesome-6/square-caret-down-regular.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/scwx-qt/res/icons/font-awesome-6/square-caret-right-regular.svg b/scwx-qt/res/icons/font-awesome-6/square-caret-right-regular.svg new file mode 100644 index 00000000..06e4c955 --- /dev/null +++ b/scwx-qt/res/icons/font-awesome-6/square-caret-right-regular.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/scwx-qt/scwx-qt.qrc b/scwx-qt/scwx-qt.qrc index 2e217ca0..3939ddf4 100644 --- a/scwx-qt/scwx-qt.qrc +++ b/scwx-qt/scwx-qt.qrc @@ -15,7 +15,6 @@ res/fonts/din1451alt_g.ttf res/icons/scwx-256.ico res/icons/scwx-256.png - res/icons/font-awesome-6/angle-down-solid.svg res/icons/font-awesome-6/angle-left-solid.svg res/icons/font-awesome-6/angle-right-solid.svg res/icons/font-awesome-6/backward-step-solid.svg @@ -29,6 +28,8 @@ res/icons/font-awesome-6/play-solid.svg res/icons/font-awesome-6/rotate-left-solid.svg res/icons/font-awesome-6/sliders-solid.svg + res/icons/font-awesome-6/square-caret-down-regular.svg + res/icons/font-awesome-6/square-caret-right-regular.svg res/icons/font-awesome-6/square-minus-regular.svg res/icons/font-awesome-6/square-plus-regular.svg res/palettes/wct/CC.pal diff --git a/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp b/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp index 63f23024..4cf1c543 100644 --- a/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp +++ b/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp @@ -15,11 +15,7 @@ public: ~CollapsibleGroupImpl() = default; void Initialize(); - - const QIcon kCollapsedIcon_ { - ":/res/icons/font-awesome-6/angle-right-solid.svg"}; - const QIcon kExpandedIcon_ { - ":/res/icons/font-awesome-6/angle-down-solid.svg"}; + void SetExpanded(bool expanded); CollapsibleGroup* self_; }; @@ -52,20 +48,12 @@ void CollapsibleGroupImpl::Initialize() { self_->Expand(); - QObject::connect(self_->ui->titleButton, - &QAbstractButton::toggled, - self_, - [this](bool checked) - { - if (checked) - { - self_->Expand(); - } - else - { - self_->Collapse(); - } - }); + QObject::connect( + self_->ui->titleButton, + &QAbstractButton::toggled, + self_, + [this](bool checked) { SetExpanded(checked); }, + Qt::DirectConnection); } void CollapsibleGroup::SetContentsLayout(QLayout* layout) @@ -85,9 +73,6 @@ void CollapsibleGroup::Collapse() { ui->titleButton->setChecked(false); } - - // Hide the group contents - ui->contentsFrame->setVisible(false); } void CollapsibleGroup::Expand() @@ -97,9 +82,12 @@ void CollapsibleGroup::Expand() { ui->titleButton->setChecked(true); } +} - // Show the group contents - ui->contentsFrame->setVisible(true); +void CollapsibleGroupImpl::SetExpanded(bool expanded) +{ + // Update contents visibility + self_->ui->contentsFrame->setVisible(expanded); } } // namespace ui diff --git a/scwx-qt/source/scwx/qt/ui/collapsible_group.ui b/scwx-qt/source/scwx/qt/ui/collapsible_group.ui index 3c2656d5..c6607178 100644 --- a/scwx-qt/source/scwx/qt/ui/collapsible_group.ui +++ b/scwx-qt/source/scwx/qt/ui/collapsible_group.ui @@ -17,6 +17,18 @@ 0 + + 0 + + + 0 + + + 0 + + + 0 + @@ -48,8 +60,8 @@ - :/res/icons/font-awesome-6/angle-right-solid.svg - :/res/icons/font-awesome-6/angle-down-solid.svg:/res/icons/font-awesome-6/angle-right-solid.svg + :/res/icons/font-awesome-6/square-caret-right-regular.svg + :/res/icons/font-awesome-6/square-caret-down-regular.svg:/res/icons/font-awesome-6/square-caret-right-regular.svg true From 106542e28a87c3df1b872ba1603baaced4fe19b6 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Tue, 27 Jun 2023 22:53:13 -0500 Subject: [PATCH 04/13] Reorder collapsible group initialization --- scwx-qt/source/scwx/qt/ui/collapsible_group.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp b/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp index 4cf1c543..c3f600a8 100644 --- a/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp +++ b/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp @@ -46,14 +46,14 @@ CollapsibleGroup::~CollapsibleGroup() void CollapsibleGroupImpl::Initialize() { - self_->Expand(); - QObject::connect( self_->ui->titleButton, &QAbstractButton::toggled, self_, [this](bool checked) { SetExpanded(checked); }, Qt::DirectConnection); + + self_->Expand(); } void CollapsibleGroup::SetContentsLayout(QLayout* layout) From 396f64f0d4fc9f45c5ba67b0aefaa91ea1a003c6 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Tue, 27 Jun 2023 23:35:09 -0500 Subject: [PATCH 05/13] Add default layout to collapsible group --- scwx-qt/source/scwx/qt/ui/collapsible_group.cpp | 5 +++++ scwx-qt/source/scwx/qt/ui/collapsible_group.hpp | 5 +++-- scwx-qt/source/scwx/qt/ui/collapsible_group.ui | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp b/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp index c3f600a8..5bf3c12e 100644 --- a/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp +++ b/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp @@ -56,6 +56,11 @@ void CollapsibleGroupImpl::Initialize() self_->Expand(); } +QLayout* CollapsibleGroup::GetContentsLayout() +{ + return ui->contentsFrame->layout(); +} + void CollapsibleGroup::SetContentsLayout(QLayout* layout) { ui->contentsFrame->setLayout(layout); diff --git a/scwx-qt/source/scwx/qt/ui/collapsible_group.hpp b/scwx-qt/source/scwx/qt/ui/collapsible_group.hpp index 1c9d246f..f10893b1 100644 --- a/scwx-qt/source/scwx/qt/ui/collapsible_group.hpp +++ b/scwx-qt/source/scwx/qt/ui/collapsible_group.hpp @@ -25,8 +25,9 @@ public: explicit CollapsibleGroup(const QString& title, QWidget* parent = nullptr); ~CollapsibleGroup(); - void SetContentsLayout(QLayout* contents); - void SetTitle(const QString& title); + QLayout* GetContentsLayout(); + void SetContentsLayout(QLayout* contents); + void SetTitle(const QString& title); public slots: void Collapse(); diff --git a/scwx-qt/source/scwx/qt/ui/collapsible_group.ui b/scwx-qt/source/scwx/qt/ui/collapsible_group.ui index c6607178..f36af2e3 100644 --- a/scwx-qt/source/scwx/qt/ui/collapsible_group.ui +++ b/scwx-qt/source/scwx/qt/ui/collapsible_group.ui @@ -79,6 +79,7 @@ QFrame::Sunken + From 6d9d92308118c3e1b2a63845edaf5f5ce8a494c7 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Tue, 27 Jun 2023 23:36:15 -0500 Subject: [PATCH 06/13] Add radar toolbox items to collapsible widgets --- scwx-qt/source/scwx/qt/main/main_window.cpp | 64 ++++++++++++++++----- scwx-qt/source/scwx/qt/main/main_window.ui | 58 +------------------ 2 files changed, 51 insertions(+), 71 deletions(-) diff --git a/scwx-qt/source/scwx/qt/main/main_window.cpp b/scwx-qt/source/scwx/qt/main/main_window.cpp index 23fd0785..57d0dffc 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.cpp +++ b/scwx-qt/source/scwx/qt/main/main_window.cpp @@ -13,10 +13,11 @@ #include #include #include -#include -#include #include +#include #include +#include +#include #include #include #include @@ -61,6 +62,10 @@ public: mainWindow_ {mainWindow}, settings_ {}, activeMap_ {nullptr}, + mapSettingsGroup_ {nullptr}, + level2ProductsGroup_ {nullptr}, + level2SettingsGroup_ {nullptr}, + level3ProductsGroup_ {nullptr}, level2ProductsWidget_ {nullptr}, level2SettingsWidget_ {nullptr}, level3ProductsWidget_ {nullptr}, @@ -142,6 +147,10 @@ public: map::MapProvider mapProvider_; map::MapWidget* activeMap_; + ui::CollapsibleGroup* mapSettingsGroup_; + ui::CollapsibleGroup* level2ProductsGroup_; + ui::CollapsibleGroup* level2SettingsGroup_; + ui::CollapsibleGroup* level3ProductsGroup_; ui::Level2ProductsWidget* level2ProductsWidget_; ui::Level2SettingsWidget* level2SettingsWidget_; @@ -240,24 +249,49 @@ MainWindow::MainWindow(QWidget* parent) : // Settings Dialog p->settingsDialog_ = new ui::SettingsDialog(this); + // Map Settings + p->mapSettingsGroup_ = new ui::CollapsibleGroup(tr("Map Settings"), this); + p->mapSettingsGroup_->GetContentsLayout()->addWidget(ui->mapStyleLabel); + p->mapSettingsGroup_->GetContentsLayout()->addWidget(ui->mapStyleComboBox); + ui->radarToolboxScrollAreaContents->layout()->replaceWidget( + ui->mapSettingsGroupBox, p->mapSettingsGroup_); + ui->mapSettingsGroupBox->setVisible(false); + // Add Level 2 Products + p->level2ProductsGroup_ = + new ui::CollapsibleGroup(tr("Level 2 Products"), this); p->level2ProductsWidget_ = new ui::Level2ProductsWidget(this); - ui->radarProductGroupBox->layout()->replaceWidget(ui->level2ProductFrame, - p->level2ProductsWidget_); - delete ui->level2ProductFrame; - ui->level2ProductFrame = p->level2ProductsWidget_; + p->level2ProductsGroup_->GetContentsLayout()->addWidget( + p->level2ProductsWidget_); + ui->radarToolboxScrollAreaContents->layout()->addWidget( + p->level2ProductsGroup_); // Add Level 3 Products + p->level3ProductsGroup_ = + new ui::CollapsibleGroup(tr("Level 3 Products"), this); p->level3ProductsWidget_ = new ui::Level3ProductsWidget(this); - ui->radarProductGroupBox->layout()->replaceWidget(ui->level3ProductFrame, - p->level3ProductsWidget_); - delete ui->level3ProductFrame; - ui->level3ProductFrame = p->level3ProductsWidget_; + p->level3ProductsGroup_->GetContentsLayout()->addWidget( + p->level3ProductsWidget_); + ui->radarToolboxScrollAreaContents->layout()->addWidget( + p->level3ProductsGroup_); // Add Level 2 Settings - p->level2SettingsWidget_ = new ui::Level2SettingsWidget(ui->settingsFrame); - ui->settingsFrame->layout()->addWidget(p->level2SettingsWidget_); - p->level2SettingsWidget_->setVisible(false); + p->level2SettingsGroup_ = + new ui::CollapsibleGroup(tr("Level 2 Settings"), this); + p->level2SettingsWidget_ = new ui::Level2SettingsWidget(this); + p->level2SettingsGroup_->GetContentsLayout()->addWidget( + p->level2SettingsWidget_); + ui->radarToolboxScrollAreaContents->layout()->addWidget( + p->level2SettingsGroup_); + p->level2SettingsGroup_->setVisible(false); + ui->radarToolboxScrollAreaContents->layout()->addWidget( + p->level2SettingsGroup_); + + // Reset toolbox spacer at the bottom + ui->radarToolboxScrollAreaContents->layout()->removeItem( + ui->radarToolboxSpacer); + ui->radarToolboxScrollAreaContents->layout()->addItem( + ui->radarToolboxSpacer); // ImGui Debug Dialog p->imGuiDebugDialog_ = new ui::ImGuiDebugDialog(this); @@ -1011,11 +1045,11 @@ void MainWindowImpl::UpdateRadarProductSettings() if (activeMap_->GetRadarProductGroup() == common::RadarProductGroup::Level2) { level2SettingsWidget_->UpdateSettings(activeMap_); - level2SettingsWidget_->setVisible(true); + level2SettingsGroup_->setVisible(true); } else { - level2SettingsWidget_->setVisible(false); + level2SettingsGroup_->setVisible(false); } } diff --git a/scwx-qt/source/scwx/qt/main/main_window.ui b/scwx-qt/source/scwx/qt/main/main_window.ui index 64cab927..6acd4e33 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.ui +++ b/scwx-qt/source/scwx/qt/main/main_window.ui @@ -134,8 +134,8 @@ 0 0 - 175 - 696 + 157 + 702 @@ -240,60 +240,6 @@ - - - - Radar Products - - - - - - Level 2 - - - - - - - - - - Qt::Horizontal - - - - - - - Level 3 - - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - From 6a92e7601e210861a6a90bd24480f2e9669843ca Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Wed, 28 Jun 2023 21:44:47 -0500 Subject: [PATCH 07/13] Update collapsible icon styling to use native buttons for the header/title --- .../source/scwx/qt/ui/collapsible_group.cpp | 30 ++++++++---- .../source/scwx/qt/ui/collapsible_group.ui | 47 ++++--------------- 2 files changed, 30 insertions(+), 47 deletions(-) diff --git a/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp b/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp index 5bf3c12e..6207d4c5 100644 --- a/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp +++ b/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp @@ -17,7 +17,17 @@ public: void Initialize(); void SetExpanded(bool expanded); + const QIcon kCollapsedIcon_ { + ":/res/icons/font-awesome-6/square-caret-right-regular.svg"}; + const QIcon kExpandedIcon_ { + ":/res/icons/font-awesome-6/square-caret-down-regular.svg"}; + + const std::map kIcon_ {{false, kCollapsedIcon_}, + {true, kExpandedIcon_}}; + CollapsibleGroup* self_; + + bool expanded_ {true}; }; CollapsibleGroup::CollapsibleGroup(QWidget* parent) : @@ -48,9 +58,9 @@ void CollapsibleGroupImpl::Initialize() { QObject::connect( self_->ui->titleButton, - &QAbstractButton::toggled, + &QAbstractButton::clicked, self_, - [this](bool checked) { SetExpanded(checked); }, + [this]() { SetExpanded(!expanded_); }, Qt::DirectConnection); self_->Expand(); @@ -74,25 +84,25 @@ void CollapsibleGroup::SetTitle(const QString& title) void CollapsibleGroup::Collapse() { // Update the title frame - if (ui->titleButton->isChecked()) - { - ui->titleButton->setChecked(false); - } + p->SetExpanded(false); } void CollapsibleGroup::Expand() { // Update the title frame - if (!ui->titleButton->isChecked()) - { - ui->titleButton->setChecked(true); - } + p->SetExpanded(true); } void CollapsibleGroupImpl::SetExpanded(bool expanded) { + // Update icon + self_->ui->titleButton->setIcon(kIcon_.at(expanded)); + // Update contents visibility self_->ui->contentsFrame->setVisible(expanded); + + // Update internal state + expanded_ = expanded; } } // namespace ui diff --git a/scwx-qt/source/scwx/qt/ui/collapsible_group.ui b/scwx-qt/source/scwx/qt/ui/collapsible_group.ui index f36af2e3..1c7f670e 100644 --- a/scwx-qt/source/scwx/qt/ui/collapsible_group.ui +++ b/scwx-qt/source/scwx/qt/ui/collapsible_group.ui @@ -30,45 +30,18 @@ 0 - - - QFrame::Box + + + text-align: left; - - QFrame::Sunken + + Title + + + + :/res/icons/font-awesome-6/square-caret-right-regular.svg + :/res/icons/font-awesome-6/square-caret-down-regular.svg:/res/icons/font-awesome-6/square-caret-right-regular.svg - - - 1 - - - 1 - - - 1 - - - 1 - - - - - background: transparent; border: none; color: palette(window-text); text-align: left; - - - Title - - - - :/res/icons/font-awesome-6/square-caret-right-regular.svg - :/res/icons/font-awesome-6/square-caret-down-regular.svg:/res/icons/font-awesome-6/square-caret-right-regular.svg - - - true - - - - From 35ac8bb55b0e6fb0010ff69d6d0a538a6902feea Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Wed, 28 Jun 2023 22:07:19 -0500 Subject: [PATCH 08/13] Move timeline to Radar Toolbox --- scwx-qt/source/scwx/qt/main/main_window.cpp | 18 +- .../scwx/qt/ui/animation_dock_widget.cpp | 2 +- .../scwx/qt/ui/animation_dock_widget.hpp | 4 +- .../scwx/qt/ui/animation_dock_widget.ui | 615 ++++++++---------- 4 files changed, 295 insertions(+), 344 deletions(-) diff --git a/scwx-qt/source/scwx/qt/main/main_window.cpp b/scwx-qt/source/scwx/qt/main/main_window.cpp index 57d0dffc..3712cb5f 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.cpp +++ b/scwx-qt/source/scwx/qt/main/main_window.cpp @@ -66,6 +66,7 @@ public: level2ProductsGroup_ {nullptr}, level2SettingsGroup_ {nullptr}, level3ProductsGroup_ {nullptr}, + timelineGroup_ {nullptr}, level2ProductsWidget_ {nullptr}, level2SettingsWidget_ {nullptr}, level3ProductsWidget_ {nullptr}, @@ -151,6 +152,7 @@ public: ui::CollapsibleGroup* level2ProductsGroup_; ui::CollapsibleGroup* level2SettingsGroup_; ui::CollapsibleGroup* level3ProductsGroup_; + ui::CollapsibleGroup* timelineGroup_; ui::Level2ProductsWidget* level2ProductsWidget_; ui::Level2SettingsWidget* level2SettingsWidget_; @@ -202,21 +204,13 @@ MainWindow::MainWindow(QWidget* parent) : p->alertDockWidget_->setVisible(false); addDockWidget(Qt::BottomDockWidgetArea, p->alertDockWidget_); - // Animation Dock Widget - p->animationDockWidget_ = new ui::AnimationDockWidget(this); - p->animationDockWidget_->setVisible(true); - addDockWidget(Qt::LeftDockWidgetArea, p->animationDockWidget_); - // Configure Menu ui->menuView->insertAction(ui->actionRadarToolbox, ui->radarToolboxDock->toggleViewAction()); ui->radarToolboxDock->toggleViewAction()->setText(tr("Radar &Toolbox")); ui->actionRadarToolbox->setVisible(false); - ui->menuView->insertAction(ui->actionAnimationToolbox, - p->animationDockWidget_->toggleViewAction()); - p->animationDockWidget_->toggleViewAction()->setText( - tr("A&nimation Toolbox")); + // Deprecated: Hide Animation Toolbox Selection ui->actionAnimationToolbox->setVisible(false); ui->menuView->insertAction(ui->actionResourceExplorer, @@ -287,6 +281,12 @@ MainWindow::MainWindow(QWidget* parent) : ui->radarToolboxScrollAreaContents->layout()->addWidget( p->level2SettingsGroup_); + // Timeline + p->timelineGroup_ = new ui::CollapsibleGroup(tr("Timeline"), this); + p->animationDockWidget_ = new ui::AnimationDockWidget(this); + p->timelineGroup_->GetContentsLayout()->addWidget(p->animationDockWidget_); + ui->radarToolboxScrollAreaContents->layout()->addWidget(p->timelineGroup_); + // Reset toolbox spacer at the bottom ui->radarToolboxScrollAreaContents->layout()->removeItem( ui->radarToolboxSpacer); diff --git a/scwx-qt/source/scwx/qt/ui/animation_dock_widget.cpp b/scwx-qt/source/scwx/qt/ui/animation_dock_widget.cpp index 3d391407..34b1001a 100644 --- a/scwx-qt/source/scwx/qt/ui/animation_dock_widget.cpp +++ b/scwx-qt/source/scwx/qt/ui/animation_dock_widget.cpp @@ -51,7 +51,7 @@ public: }; AnimationDockWidget::AnimationDockWidget(QWidget* parent) : - QDockWidget(parent), + QFrame(parent), p {std::make_unique(this)}, ui(new Ui::AnimationDockWidget) { diff --git a/scwx-qt/source/scwx/qt/ui/animation_dock_widget.hpp b/scwx-qt/source/scwx/qt/ui/animation_dock_widget.hpp index 8b64d0c6..abc79c88 100644 --- a/scwx-qt/source/scwx/qt/ui/animation_dock_widget.hpp +++ b/scwx-qt/source/scwx/qt/ui/animation_dock_widget.hpp @@ -4,7 +4,7 @@ #include -#include +#include namespace Ui { @@ -20,7 +20,7 @@ namespace ui class AnimationDockWidgetImpl; -class AnimationDockWidget : public QDockWidget +class AnimationDockWidget : public QFrame { Q_OBJECT diff --git a/scwx-qt/source/scwx/qt/ui/animation_dock_widget.ui b/scwx-qt/source/scwx/qt/ui/animation_dock_widget.ui index 33485032..1c79eb48 100644 --- a/scwx-qt/source/scwx/qt/ui/animation_dock_widget.ui +++ b/scwx-qt/source/scwx/qt/ui/animation_dock_widget.ui @@ -1,353 +1,304 @@ AnimationDockWidget - + 0 0 - 200 - 543 + 189 + 264 - - Animation Toolbox + + QFrame::StyledPanel - - - - - - QFrame::NoFrame - - + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Auto Update: Enabled + + + + + + + Live View + + + true + + + + + + + Archive View + + + + + + + QAbstractSpinBox::CorrectToNearestValue + + + + 0 + 0 + 0 + 1991 + 6 + 1 + + + + yyyy-MM-dd + + + true + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + 0 - - Qt::ScrollBarAlwaysOff + + 0 - - true + + 0 - - - - 0 - 0 - 182 - 506 - - - - - 0 + + 0 + + + + + QAbstractSpinBox::CorrectToNearestValue - - 0 + + HH:mm - - 0 + + + + + + UTC - - 0 + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QAbstractSpinBox::CorrectToNearestValue - - - - Timeline - - - - - - Auto Update: Enabled - - - - - - - Live View - - - true - - - - - - - Archive View - - - - - - - QAbstractSpinBox::CorrectToNearestValue - - - - 0 - 0 - 0 - 1991 - 6 - 1 - - - - yyyy-MM-dd - - - true - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - QAbstractSpinBox::CorrectToNearestValue - - - HH:mm - - - - - - - UTC - - - - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - QAbstractSpinBox::CorrectToNearestValue - - - min - - - 1 - - - 1440 - - - 30 - - - - - - - Loop Time - - - - - - - Loop Speed - - - - - - - QAbstractSpinBox::CorrectToNearestValue - - - x - - - 1.000000000000000 - - - 1.000000000000000 - - - - - - - Loop Delay - - - - - - - sec - - - 1 - - - 15.000000000000000 - - - 0.100000000000000 - - - 2.500000000000000 - - - - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 1 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - ... - - - - :/res/icons/font-awesome-6/backward-step-solid.svg:/res/icons/font-awesome-6/backward-step-solid.svg - - - - - - - ... - - - - :/res/icons/font-awesome-6/angle-left-solid.svg:/res/icons/font-awesome-6/angle-left-solid.svg - - - - - - - ... - - - - :/res/icons/font-awesome-6/play-solid.svg:/res/icons/font-awesome-6/play-solid.svg - - - - - - - ... - - - - :/res/icons/font-awesome-6/angle-right-solid.svg:/res/icons/font-awesome-6/angle-right-solid.svg - - - - - - - ... - - - - :/res/icons/font-awesome-6/forward-step-solid.svg:/res/icons/font-awesome-6/forward-step-solid.svg - - - - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - + + min + + + 1 + + + 1440 + + + 30 + + + + + + + Loop Speed + + + + + + + Loop Delay + + + + + + + sec + + + 1 + + + 15.000000000000000 + + + 0.100000000000000 + + + 2.500000000000000 + + + + + + + QAbstractSpinBox::CorrectToNearestValue + + + x + + + 1.000000000000000 + + + 1.000000000000000 + + + + + + + Loop Time + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 1 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + ... + + + + :/res/icons/font-awesome-6/backward-step-solid.svg:/res/icons/font-awesome-6/backward-step-solid.svg + + + + + + + ... + + + + :/res/icons/font-awesome-6/angle-left-solid.svg:/res/icons/font-awesome-6/angle-left-solid.svg + + + + + + + ... + + + + :/res/icons/font-awesome-6/play-solid.svg:/res/icons/font-awesome-6/play-solid.svg + + + + + + + ... + + + + :/res/icons/font-awesome-6/angle-right-solid.svg:/res/icons/font-awesome-6/angle-right-solid.svg + + + + + + + ... + + + + :/res/icons/font-awesome-6/forward-step-solid.svg:/res/icons/font-awesome-6/forward-step-solid.svg + + + + + + + From af650c6687f58e654c061d43c1bb68dc456fc198 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Wed, 28 Jun 2023 23:03:17 -0500 Subject: [PATCH 09/13] Add a horizontal scroll bar to the radar toolbox dock if needed --- scwx-qt/source/scwx/qt/main/main_window.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scwx-qt/source/scwx/qt/main/main_window.ui b/scwx-qt/source/scwx/qt/main/main_window.ui index 6acd4e33..4c7e12ad 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.ui +++ b/scwx-qt/source/scwx/qt/main/main_window.ui @@ -121,7 +121,7 @@ QFrame::NoFrame - Qt::ScrollBarAlwaysOff + Qt::ScrollBarAsNeeded QAbstractScrollArea::AdjustToContents From 1e4e2ba1b4a0718fed1eabfb8f70f47e9878e498 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Fri, 30 Jun 2023 00:11:43 -0500 Subject: [PATCH 10/13] Add UI settings for collapsible groups --- scwx-qt/scwx-qt.cmake | 6 +- .../scwx/qt/manager/settings_manager.cpp | 5 + .../source/scwx/qt/settings/ui_settings.cpp | 104 ++++++++++++++++++ .../source/scwx/qt/settings/ui_settings.hpp | 48 ++++++++ test/data | 2 +- 5 files changed, 162 insertions(+), 3 deletions(-) create mode 100644 scwx-qt/source/scwx/qt/settings/ui_settings.cpp create mode 100644 scwx-qt/source/scwx/qt/settings/ui_settings.hpp diff --git a/scwx-qt/scwx-qt.cmake b/scwx-qt/scwx-qt.cmake index 45d23b93..225d2b19 100644 --- a/scwx-qt/scwx-qt.cmake +++ b/scwx-qt/scwx-qt.cmake @@ -121,7 +121,8 @@ set(HDR_SETTINGS source/scwx/qt/settings/general_settings.hpp source/scwx/qt/settings/settings_interface.hpp source/scwx/qt/settings/settings_interface_base.hpp source/scwx/qt/settings/settings_variable.hpp - source/scwx/qt/settings/settings_variable_base.hpp) + source/scwx/qt/settings/settings_variable_base.hpp + source/scwx/qt/settings/ui_settings.hpp) set(SRC_SETTINGS source/scwx/qt/settings/general_settings.cpp source/scwx/qt/settings/map_settings.cpp source/scwx/qt/settings/palette_settings.cpp @@ -130,7 +131,8 @@ set(SRC_SETTINGS source/scwx/qt/settings/general_settings.cpp source/scwx/qt/settings/settings_interface.cpp source/scwx/qt/settings/settings_interface_base.cpp source/scwx/qt/settings/settings_variable.cpp - source/scwx/qt/settings/settings_variable_base.cpp) + source/scwx/qt/settings/settings_variable_base.cpp + source/scwx/qt/settings/ui_settings.cpp) set(HDR_TYPES source/scwx/qt/types/alert_types.hpp source/scwx/qt/types/font_types.hpp source/scwx/qt/types/github_types.hpp diff --git a/scwx-qt/source/scwx/qt/manager/settings_manager.cpp b/scwx-qt/source/scwx/qt/manager/settings_manager.cpp index 2572ed2a..c504e15e 100644 --- a/scwx-qt/source/scwx/qt/manager/settings_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/settings_manager.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -96,6 +97,7 @@ void Shutdown() dataChanged |= general_settings().Shutdown(); dataChanged |= map_settings().Shutdown(); + dataChanged |= settings::UiSettings::Instance().Shutdown(); if (dataChanged) { @@ -128,6 +130,7 @@ static boost::json::value ConvertSettingsToJson() general_settings().WriteJson(settingsJson); map_settings().WriteJson(settingsJson); palette_settings().WriteJson(settingsJson); + settings::UiSettings::Instance().WriteJson(settingsJson); return settingsJson; } @@ -139,6 +142,7 @@ static void GenerateDefaultSettings() general_settings().SetDefaults(); map_settings().SetDefaults(); palette_settings().SetDefaults(); + settings::UiSettings::Instance().SetDefaults(); } static bool LoadSettings(const boost::json::object& settingsJson) @@ -150,6 +154,7 @@ static bool LoadSettings(const boost::json::object& settingsJson) jsonDirty |= !general_settings().ReadJson(settingsJson); jsonDirty |= !map_settings().ReadJson(settingsJson); jsonDirty |= !palette_settings().ReadJson(settingsJson); + jsonDirty |= !settings::UiSettings::Instance().ReadJson(settingsJson); return jsonDirty; } diff --git a/scwx-qt/source/scwx/qt/settings/ui_settings.cpp b/scwx-qt/source/scwx/qt/settings/ui_settings.cpp new file mode 100644 index 00000000..dc131d96 --- /dev/null +++ b/scwx-qt/source/scwx/qt/settings/ui_settings.cpp @@ -0,0 +1,104 @@ +#include + +namespace scwx +{ +namespace qt +{ +namespace settings +{ + +static const std::string logPrefix_ = "scwx::qt::settings::ui_settings"; + +class UiSettingsImpl +{ +public: + explicit UiSettingsImpl() + { + level2ProductsExpanded_.SetDefault(false); + level2SettingsExpanded_.SetDefault(true); + level3ProductsExpanded_.SetDefault(true); + mapSettingsExpanded_.SetDefault(true); + timelineExpanded_.SetDefault(true); + } + + ~UiSettingsImpl() {} + + SettingsVariable level2ProductsExpanded_ {"level2_products_expanded"}; + SettingsVariable level2SettingsExpanded_ {"level2_settings_expanded"}; + SettingsVariable level3ProductsExpanded_ {"level3_products_expanded"}; + SettingsVariable mapSettingsExpanded_ {"map_settings_expanded"}; + SettingsVariable timelineExpanded_ {"timeline_expanded"}; +}; + +UiSettings::UiSettings() : + SettingsCategory("ui"), p(std::make_unique()) +{ + RegisterVariables({&p->level2ProductsExpanded_, + &p->level2SettingsExpanded_, + &p->level3ProductsExpanded_, + &p->mapSettingsExpanded_, + &p->timelineExpanded_}); + SetDefaults(); +} +UiSettings::~UiSettings() = default; + +UiSettings::UiSettings(UiSettings&&) noexcept = default; +UiSettings& UiSettings::operator=(UiSettings&&) noexcept = default; + +SettingsVariable& UiSettings::level2_products_expanded() const +{ + return p->level2ProductsExpanded_; +} + +SettingsVariable& UiSettings::level2_settings_expanded() const +{ + return p->level2SettingsExpanded_; +} + +SettingsVariable& UiSettings::level3_products_expanded() const +{ + return p->level3ProductsExpanded_; +} + +SettingsVariable& UiSettings::map_settings_expanded() const +{ + return p->mapSettingsExpanded_; +} + +SettingsVariable& UiSettings::timeline_expanded() const +{ + return p->timelineExpanded_; +} + +bool UiSettings::Shutdown() +{ + bool dataChanged = false; + + // Commit settings that are managed separate from the settings dialog + dataChanged |= p->level2ProductsExpanded_.Commit(); + dataChanged |= p->level2SettingsExpanded_.Commit(); + dataChanged |= p->level3ProductsExpanded_.Commit(); + dataChanged |= p->mapSettingsExpanded_.Commit(); + dataChanged |= p->timelineExpanded_.Commit(); + + return dataChanged; +} + +UiSettings& UiSettings::Instance() +{ + static UiSettings uiSettings_; + return uiSettings_; +} + +bool operator==(const UiSettings& lhs, const UiSettings& rhs) +{ + return (lhs.p->level2ProductsExpanded_ == rhs.p->level2ProductsExpanded_ && + lhs.p->level2SettingsExpanded_ == rhs.p->level2SettingsExpanded_ && + lhs.p->level3ProductsExpanded_ == rhs.p->level3ProductsExpanded_ && + lhs.p->mapSettingsExpanded_ == rhs.p->mapSettingsExpanded_ && + lhs.p->timelineExpanded_ == rhs.p->timelineExpanded_); +} + +} // namespace settings +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/settings/ui_settings.hpp b/scwx-qt/source/scwx/qt/settings/ui_settings.hpp new file mode 100644 index 00000000..e3045bcb --- /dev/null +++ b/scwx-qt/source/scwx/qt/settings/ui_settings.hpp @@ -0,0 +1,48 @@ +#pragma once + +#include +#include + +#include +#include + +namespace scwx +{ +namespace qt +{ +namespace settings +{ + +class UiSettingsImpl; + +class UiSettings : public SettingsCategory +{ +public: + explicit UiSettings(); + ~UiSettings(); + + UiSettings(const UiSettings&) = delete; + UiSettings& operator=(const UiSettings&) = delete; + + UiSettings(UiSettings&&) noexcept; + UiSettings& operator=(UiSettings&&) noexcept; + + SettingsVariable& level2_products_expanded() const; + SettingsVariable& level2_settings_expanded() const; + SettingsVariable& level3_products_expanded() const; + SettingsVariable& map_settings_expanded() const; + SettingsVariable& timeline_expanded() const; + + bool Shutdown(); + + static UiSettings& Instance(); + + friend bool operator==(const UiSettings& lhs, const UiSettings& rhs); + +private: + std::unique_ptr p; +}; + +} // namespace settings +} // namespace qt +} // namespace scwx diff --git a/test/data b/test/data index 875afa5e..b2fa7d86 160000 --- a/test/data +++ b/test/data @@ -1 +1 @@ -Subproject commit 875afa5ead329536f802096ca1d2ef1010a7cc6b +Subproject commit b2fa7d866800902f4c092c567017c832bcdbe702 From b0375c47907c07b0f34234dc0e93c30f7eba279a Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Fri, 30 Jun 2023 00:12:46 -0500 Subject: [PATCH 11/13] Update collapsible group interface for signals/slots --- .../source/scwx/qt/ui/collapsible_group.cpp | 30 +++++++------------ .../source/scwx/qt/ui/collapsible_group.hpp | 6 ++-- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp b/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp index 6207d4c5..a66d9703 100644 --- a/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp +++ b/scwx-qt/source/scwx/qt/ui/collapsible_group.cpp @@ -15,7 +15,6 @@ public: ~CollapsibleGroupImpl() = default; void Initialize(); - void SetExpanded(bool expanded); const QIcon kCollapsedIcon_ { ":/res/icons/font-awesome-6/square-caret-right-regular.svg"}; @@ -60,10 +59,10 @@ void CollapsibleGroupImpl::Initialize() self_->ui->titleButton, &QAbstractButton::clicked, self_, - [this]() { SetExpanded(!expanded_); }, + [this]() { self_->SetExpanded(!expanded_); }, Qt::DirectConnection); - self_->Expand(); + self_->SetExpanded(true); } QLayout* CollapsibleGroup::GetContentsLayout() @@ -81,28 +80,21 @@ void CollapsibleGroup::SetTitle(const QString& title) ui->titleButton->setText(title); } -void CollapsibleGroup::Collapse() -{ - // Update the title frame - p->SetExpanded(false); -} - -void CollapsibleGroup::Expand() -{ - // Update the title frame - p->SetExpanded(true); -} - -void CollapsibleGroupImpl::SetExpanded(bool expanded) +void CollapsibleGroup::SetExpanded(bool expanded) { // Update icon - self_->ui->titleButton->setIcon(kIcon_.at(expanded)); + ui->titleButton->setIcon(p->kIcon_.at(expanded)); // Update contents visibility - self_->ui->contentsFrame->setVisible(expanded); + ui->contentsFrame->setVisible(expanded); // Update internal state - expanded_ = expanded; + if (p->expanded_ != expanded) + { + p->expanded_ = expanded; + + Q_EMIT StateChanged(expanded); + } } } // namespace ui diff --git a/scwx-qt/source/scwx/qt/ui/collapsible_group.hpp b/scwx-qt/source/scwx/qt/ui/collapsible_group.hpp index f10893b1..65966b48 100644 --- a/scwx-qt/source/scwx/qt/ui/collapsible_group.hpp +++ b/scwx-qt/source/scwx/qt/ui/collapsible_group.hpp @@ -30,8 +30,10 @@ public: void SetTitle(const QString& title); public slots: - void Collapse(); - void Expand(); + void SetExpanded(bool expanded); + +signals: + void StateChanged(bool expanded); private: friend class CollapsibleGroupImpl; From 0f5950db587928afc6435f1e36c11f9269f939ef Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Fri, 30 Jun 2023 00:13:24 -0500 Subject: [PATCH 12/13] Add UI settings for collapsible groups in radar toolbox --- scwx-qt/source/scwx/qt/main/main_window.cpp | 39 +++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/scwx-qt/source/scwx/qt/main/main_window.cpp b/scwx-qt/source/scwx/qt/main/main_window.cpp index 3712cb5f..cbbfb0d0 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.cpp +++ b/scwx-qt/source/scwx/qt/main/main_window.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -121,6 +122,7 @@ public: void AsyncSetup(); void ConfigureMapLayout(); void ConfigureMapStyles(); + void ConfigureUiSettings(); void ConnectAnimationSignals(); void ConnectMapSignals(); void ConnectOtherSignals(); @@ -314,6 +316,7 @@ MainWindow::MainWindow(QWidget* parent) : p->PopulateMapStyles(); p->ConfigureMapStyles(); + p->ConfigureUiSettings(); p->ConnectMapSignals(); p->ConnectAnimationSignals(); p->ConnectOtherSignals(); @@ -671,6 +674,42 @@ void MainWindowImpl::ConfigureMapStyles() } } +void MainWindowImpl::ConfigureUiSettings() +{ + auto& uiSettings = settings::UiSettings::Instance(); + + level2ProductsGroup_->SetExpanded( + uiSettings.level2_products_expanded().GetValue()); + level2SettingsGroup_->SetExpanded( + uiSettings.level2_settings_expanded().GetValue()); + level3ProductsGroup_->SetExpanded( + uiSettings.level3_products_expanded().GetValue()); + mapSettingsGroup_->SetExpanded( + uiSettings.map_settings_expanded().GetValue()); + timelineGroup_->SetExpanded(uiSettings.timeline_expanded().GetValue()); + + connect(level2ProductsGroup_, + &ui::CollapsibleGroup::StateChanged, + [&](bool expanded) + { uiSettings.level2_products_expanded().StageValue(expanded); }); + connect(level2SettingsGroup_, + &ui::CollapsibleGroup::StateChanged, + [&](bool expanded) + { uiSettings.level2_settings_expanded().StageValue(expanded); }); + connect(level3ProductsGroup_, + &ui::CollapsibleGroup::StateChanged, + [&](bool expanded) + { uiSettings.level3_products_expanded().StageValue(expanded); }); + connect(mapSettingsGroup_, + &ui::CollapsibleGroup::StateChanged, + [&](bool expanded) + { uiSettings.map_settings_expanded().StageValue(expanded); }); + connect(timelineGroup_, + &ui::CollapsibleGroup::StateChanged, + [&](bool expanded) + { uiSettings.timeline_expanded().StageValue(expanded); }); +} + void MainWindowImpl::ConnectMapSignals() { for (const auto& mapWidget : maps_) From 1c621f76653fdcfec0064ba66d5d8edf053497b6 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Fri, 30 Jun 2023 00:15:22 -0500 Subject: [PATCH 13/13] Remove animation toolbox dock menu --- scwx-qt/source/scwx/qt/main/main_window.cpp | 3 --- scwx-qt/source/scwx/qt/main/main_window.ui | 6 ------ 2 files changed, 9 deletions(-) diff --git a/scwx-qt/source/scwx/qt/main/main_window.cpp b/scwx-qt/source/scwx/qt/main/main_window.cpp index cbbfb0d0..225f439b 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.cpp +++ b/scwx-qt/source/scwx/qt/main/main_window.cpp @@ -212,9 +212,6 @@ MainWindow::MainWindow(QWidget* parent) : ui->radarToolboxDock->toggleViewAction()->setText(tr("Radar &Toolbox")); ui->actionRadarToolbox->setVisible(false); - // Deprecated: Hide Animation Toolbox Selection - ui->actionAnimationToolbox->setVisible(false); - ui->menuView->insertAction(ui->actionResourceExplorer, ui->resourceExplorerDock->toggleViewAction()); ui->resourceExplorerDock->toggleViewAction()->setText( diff --git a/scwx-qt/source/scwx/qt/main/main_window.ui b/scwx-qt/source/scwx/qt/main/main_window.ui index 4c7e12ad..369c8d28 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.ui +++ b/scwx-qt/source/scwx/qt/main/main_window.ui @@ -76,7 +76,6 @@ &View - @@ -416,11 +415,6 @@ &Check for Updates - - - A&nimation Toolbox - -