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