Initial collapsible group layout

This commit is contained in:
Dan Paulat 2023-06-25 00:58:51 -05:00
parent b198dc53ca
commit 300091dbe1
6 changed files with 253 additions and 0 deletions

View file

@ -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<CollapsibleGroupImpl>(this)},
ui(new Ui::CollapsibleGroup)
{
ui->setupUi(this);
p->Initialize();
}
CollapsibleGroup::CollapsibleGroup(const QString& title, QWidget* parent) :
QFrame(parent),
p {std::make_unique<CollapsibleGroupImpl>(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

View file

@ -0,0 +1,43 @@
#pragma once
#include <QFrame>
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<CollapsibleGroupImpl> p;
Ui::CollapsibleGroup* ui;
};
} // namespace ui
} // namespace qt
} // namespace scwx

View file

@ -0,0 +1,117 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>CollapsibleGroup</class>
<widget class="QFrame" name="CollapsibleGroup">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Frame</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QFrame" name="titleFrame">
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>1</number>
</property>
<property name="topMargin">
<number>1</number>
</property>
<property name="rightMargin">
<number>1</number>
</property>
<property name="bottomMargin">
<number>1</number>
</property>
<item>
<widget class="QLabel" name="arrowLabel">
<property name="minimumSize">
<size>
<width>16</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>8</width>
<height>16</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="../../../../scwx-qt.qrc">:/res/icons/font-awesome-6/angle-down-solid.svg</pixmap>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="titleLabel">
<property name="text">
<string>Title</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QFrame" name="contentsFrame">
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
</layout>
</widget>
<resources>
<include location="../../../../scwx-qt.qrc"/>
</resources>
<connections/>
</ui>