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 + + + + + + + + + +