From e20cea221b3171966636a4ae0431e9fab044ff90 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 5 May 2026 19:59:51 +1000 Subject: [PATCH] Interface mockup 4 --- src/interface/CMakeLists.txt | 6 +- src/interface/MainWindow.cpp | 52 +++---- .../components/CollapsibleSection.cpp | 113 --------------- src/interface/components/PanelChrome.cpp | 17 --- src/interface/components/PanelChrome.h | 1 - src/interface/components/Section.cpp | 133 ++++++++++++++++++ .../{CollapsibleSection.h => Section.h} | 22 +-- .../properties/PropertiesPanelWidget.cpp | 21 ++- .../SpatialHierarchyPanelWidget.cpp | 8 +- src/interface/panels/todo/TodoPanelWidget.cpp | 60 ++++++++ src/interface/panels/todo/TodoPanelWidget.h | 36 +++++ 11 files changed, 288 insertions(+), 181 deletions(-) delete mode 100644 src/interface/components/CollapsibleSection.cpp create mode 100644 src/interface/components/Section.cpp rename src/interface/components/{CollapsibleSection.h => Section.h} (78%) create mode 100644 src/interface/panels/todo/TodoPanelWidget.cpp create mode 100644 src/interface/panels/todo/TodoPanelWidget.h diff --git a/src/interface/CMakeLists.txt b/src/interface/CMakeLists.txt index db55d16807..015aac0da6 100644 --- a/src/interface/CMakeLists.txt +++ b/src/interface/CMakeLists.txt @@ -29,8 +29,8 @@ set(INTERFACE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/MainWindow.h ${CMAKE_CURRENT_SOURCE_DIR}/components/SvgIcon.cpp ${CMAKE_CURRENT_SOURCE_DIR}/components/SvgIcon.h - ${CMAKE_CURRENT_SOURCE_DIR}/components/CollapsibleSection.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/components/CollapsibleSection.h + ${CMAKE_CURRENT_SOURCE_DIR}/components/Section.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/components/Section.h ${CMAKE_CURRENT_SOURCE_DIR}/components/PanelChrome.cpp ${CMAKE_CURRENT_SOURCE_DIR}/components/PanelChrome.h ${CMAKE_CURRENT_SOURCE_DIR}/panels/models/ModelsPanelTypes.h @@ -38,6 +38,8 @@ set(INTERFACE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/panels/models/ModelsPanelWidget.h ${CMAKE_CURRENT_SOURCE_DIR}/panels/models/ModelsPanelView.cpp ${CMAKE_CURRENT_SOURCE_DIR}/panels/models/ModelsPanelView.h + ${CMAKE_CURRENT_SOURCE_DIR}/panels/todo/TodoPanelWidget.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/panels/todo/TodoPanelWidget.h ${CMAKE_CURRENT_SOURCE_DIR}/panels/properties/PropertiesPanelTypes.h ${CMAKE_CURRENT_SOURCE_DIR}/panels/properties/PropertiesPanelWidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/panels/properties/PropertiesPanelWidget.h diff --git a/src/interface/MainWindow.cpp b/src/interface/MainWindow.cpp index 212b552a49..1f0fb7b021 100644 --- a/src/interface/MainWindow.cpp +++ b/src/interface/MainWindow.cpp @@ -25,6 +25,7 @@ #include "../ifcviewer/ViewportWindow.h" #include "components/PanelChrome.h" #include "components/SvgIcon.h" +#include "panels/todo/TodoPanelWidget.h" #include "panels/models/ModelsPanelView.h" #include "panels/models/ModelsPanelWidget.h" #include "panels/properties/PropertiesPanelView.h" @@ -155,6 +156,9 @@ void MainWindow::setupChrome() { border: 1px solid #3e444e; border-radius: 3px; } + QWidget#panelBody { + background: #2b2f36; + } QTreeWidget, QListWidget, QTableWidget, QAbstractScrollArea { background: #2b2f36; border: none; @@ -268,10 +272,10 @@ void MainWindow::setupChrome() { QGroupBox#propertySetCard > QWidget { background: #26292f; } - QWidget#inspectorSection { + QWidget#panelSection { background: transparent; } - QWidget#inspectorFilterWrapper { + QWidget#panelSectionFilterWrapper { background: transparent; } QWidget#relationshipRow { @@ -283,7 +287,10 @@ void MainWindow::setupChrome() { QWidget#inspectorPanel { background: #2b2f36; } - QToolButton#inspectorSectionButton { + QFrame#panelSectionHeader { + background: #26292f; + } + QToolButton#panelSectionHeaderButton { background: transparent; border: none; color: #e1e7f0; @@ -292,25 +299,22 @@ void MainWindow::setupChrome() { padding: 2px; margin: 0; } - QToolButton#inspectorSectionButton:hover { + QToolButton#panelSectionHeaderButton:hover { color: #ffffff; } - QToolButton#inspectorSectionButton::menu-indicator { + QToolButton#panelSectionHeaderButton::menu-indicator { image: none; width: 0; } - QFrame#inspectorSectionHeader { - background: #26292f; - } - QToolButton#inspectorFilterToggle { + QToolButton#panelSectionFilterToggle { background: transparent; border: none; padding: 2px; } - QToolButton#inspectorFilterToggle:hover { + QToolButton#panelSectionFilterToggle:hover { background: #353a42; } - QWidget#inspectorSectionBody { + QWidget#panelSectionBody { background: transparent; } QLabel#propertyKeyLabel { @@ -325,6 +329,16 @@ void MainWindow::setupChrome() { color: #dce2eb; background: transparent; } + QLabel#todoPanelTitle { + font-size: 14px; + font-weight: 600; + color: #e1e6ee; + background: transparent; + } + QLabel#todoPanelBody { + color: #8f98a6; + background: transparent; + } )"); } @@ -363,19 +377,7 @@ QWidget* MainWindow::makeRibbonGroup(const QString& title, const QListsetContentsMargins(12, 12, 12, 12); - auto* heading = new QLabel(title, widget); - heading->setStyleSheet("font-size:14px; font-weight:600; color:#e1e6ee;"); - auto* body = new QLabel("Coming soon", widget); - body->setAlignment(Qt::AlignCenter); - body->setStyleSheet("color:#8f98a6;"); - layout->addWidget(heading); - layout->addStretch(1); - layout->addWidget(body); - layout->addStretch(1); - return widget; + return new panels::todo::TodoPanelWidget(title, this); } void MainWindow::setStatusMessage(const QString& mode, const QString& detail) { @@ -661,7 +663,7 @@ void MainWindow::setupDocks() { spatial_dock_ = components::panel::makeDock( "Spatial Hierarchy", components::panel::wrapPanel(spatial_panel), this); properties_dock_ = components::panel::makeDock( - "Properties", components::panel::wrapInspectorPanel(properties_panel), this); + "Properties", components::panel::wrapPanel(properties_panel), this); layers_dock_ = components::panel::makeDock( "Layers", components::panel::wrapPanel(makeComingSoonPanel("Layers")), this); stored_views_dock_ = components::panel::makeDock( diff --git a/src/interface/components/CollapsibleSection.cpp b/src/interface/components/CollapsibleSection.cpp deleted file mode 100644 index 3d21d00c99..0000000000 --- a/src/interface/components/CollapsibleSection.cpp +++ /dev/null @@ -1,113 +0,0 @@ -// This file was generated with the assistance of an AI coding tool. -/******************************************************************************** - * * - * This file is part of IfcOpenShell. * - * * - * IfcOpenShell is free software: you can redistribute it and/or modify * - * it under the terms of the Lesser GNU General Public License as published by * - * the Free Software Foundation, either version 3.0 of the License, or * - * (at your option) any later version. * - * * - * IfcOpenShell is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * Lesser GNU General Public License for more details. * - * * - * You should have received a copy of the Lesser GNU General Public License * - * along with this program. If not, see . * - * * - ********************************************************************************/ - -#include "CollapsibleSection.h" - -#include "SvgIcon.h" - -#include -#include -#include -#include -#include - -namespace ifcinterface::components::inspector { - -namespace { - -QWidget* makeInspectorFilterField(const QString& placeholder, QWidget* parent = nullptr) { - auto* field = new QLineEdit(parent); - field->setPlaceholderText(placeholder); - field->setClearButtonEnabled(true); - field->addAction(icons::makePanelSvgIcon(":/icons/filter.svg"), QLineEdit::LeadingPosition); - return field; -} - -} // namespace - -CollapsibleSection::CollapsibleSection(const QString& title, const QString& filter_placeholder, QWidget* parent) - : QWidget(parent) -{ - setObjectName("inspectorSection"); - auto* layout = new QVBoxLayout(this); - layout->setContentsMargins(0, 0, 0, 0); - layout->setSpacing(6); - - auto* header = new QFrame(this); - header->setObjectName("inspectorSectionHeader"); - auto* header_layout = new QHBoxLayout(header); - header_layout->setContentsMargins(0, 0, 0, 0); - header_layout->setSpacing(6); - - auto* toggle = new QToolButton(header); - toggle->setObjectName("inspectorSectionButton"); - toggle->setText(title); - toggle->setCheckable(true); - toggle->setChecked(true); - toggle->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); - toggle->setArrowType(Qt::DownArrow); - header_layout->addWidget(toggle); - header_layout->addStretch(1); - - if (!filter_placeholder.isEmpty()) { - auto* filter_toggle = new QToolButton(header); - filter_toggle->setObjectName("inspectorFilterToggle"); - filter_toggle->setCheckable(true); - filter_toggle->setIcon(icons::makePanelSvgIcon(":/icons/filter.svg")); - filter_toggle->setAutoRaise(true); - header_layout->addWidget(filter_toggle); - - filter_field_ = qobject_cast(makeInspectorFilterField(filter_placeholder, this)); - filter_field_->setVisible(false); - connect(filter_toggle, &QToolButton::toggled, filter_field_, [this](bool visible) { - filter_field_->setVisible(visible); - if (visible) filter_field_->setFocus(); - }); - } - - body_ = new QWidget(this); - body_->setObjectName("inspectorSectionBody"); - body_layout_ = new QVBoxLayout(body_); - body_layout_->setContentsMargins(10, 6, 10, 0); - body_layout_->setSpacing(6); - - connect(toggle, &QToolButton::toggled, body_, [toggle, this](bool expanded) { - toggle->setArrowType(expanded ? Qt::DownArrow : Qt::RightArrow); - body_->setVisible(expanded); - }); - - layout->addWidget(header); - if (filter_field_) { - auto* filter_wrapper = new QWidget(this); - filter_wrapper->setObjectName("inspectorFilterWrapper"); - auto* filter_wrapper_layout = new QVBoxLayout(filter_wrapper); - filter_wrapper_layout->setContentsMargins(10, 0, 10, 0); - filter_wrapper_layout->setSpacing(0); - filter_wrapper_layout->addWidget(filter_field_); - layout->addWidget(filter_wrapper); - } - layout->addWidget(body_); -} - -void CollapsibleSection::addBodyWidget(QWidget* widget) { - body_layout_->addWidget(widget); -} - -} // namespace ifcinterface::components::inspector diff --git a/src/interface/components/PanelChrome.cpp b/src/interface/components/PanelChrome.cpp index 4c970096ea..4e49219788 100644 --- a/src/interface/components/PanelChrome.cpp +++ b/src/interface/components/PanelChrome.cpp @@ -86,23 +86,6 @@ QFrame* wrapPanel(QWidget* inner) { outer_layout->setContentsMargins(6, 6, 6, 6); outer_layout->setSpacing(0); - auto* frame = new QFrame(outer); - frame->setObjectName("panelFrame"); - auto* layout = new QVBoxLayout(frame); - layout->setContentsMargins(8, 8, 8, 8); - layout->setSpacing(0); - layout->addWidget(inner); - - outer_layout->addWidget(frame); - return outer; -} - -QFrame* wrapInspectorPanel(QWidget* inner) { - auto* outer = new QFrame(); - auto* outer_layout = new QVBoxLayout(outer); - outer_layout->setContentsMargins(6, 6, 6, 6); - outer_layout->setSpacing(0); - auto* frame = new QFrame(outer); frame->setObjectName("panelFrame"); auto* layout = new QVBoxLayout(frame); diff --git a/src/interface/components/PanelChrome.h b/src/interface/components/PanelChrome.h index cb1a405e16..806dfeefcd 100644 --- a/src/interface/components/PanelChrome.h +++ b/src/interface/components/PanelChrome.h @@ -31,7 +31,6 @@ namespace ifcinterface::components::panel { QDockWidget* makeDock(const QString& title, QWidget* content, QWidget* parent, bool has_settings = false); QFrame* wrapPanel(QWidget* inner); -QFrame* wrapInspectorPanel(QWidget* inner); } // namespace ifcinterface::components::panel diff --git a/src/interface/components/Section.cpp b/src/interface/components/Section.cpp new file mode 100644 index 0000000000..34790e7960 --- /dev/null +++ b/src/interface/components/Section.cpp @@ -0,0 +1,133 @@ +// This file was generated with the assistance of an AI coding tool. +/******************************************************************************** + * * + * This file is part of IfcOpenShell. * + * * + * IfcOpenShell is free software: you can redistribute it and/or modify * + * it under the terms of the Lesser GNU General Public License as published by * + * the Free Software Foundation, either version 3.0 of the License, or * + * (at your option) any later version. * + * * + * IfcOpenShell is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * Lesser GNU General Public License for more details. * + * * + * You should have received a copy of the Lesser GNU General Public License * + * along with this program. If not, see . * + * * + ********************************************************************************/ + +#include "Section.h" + +#include "SvgIcon.h" + +#include +#include +#include +#include +#include + +namespace ifcinterface::components { + +namespace { + +QWidget* makeSectionFilterField(const QString& placeholder, QWidget* parent = nullptr) { + auto* field = new QLineEdit(parent); + field->setPlaceholderText(placeholder); + field->setClearButtonEnabled(true); + field->addAction(icons::makePanelSvgIcon(":/icons/filter.svg"), QLineEdit::LeadingPosition); + return field; +} + +} // namespace + +Section::Section(const QString& title, SectionHeaderMode header_mode, + const QString& filter_placeholder, QWidget* parent) + : QWidget(parent) +{ + setObjectName("panelSection"); + auto* layout = new QVBoxLayout(this); + layout->setContentsMargins(0, 0, 0, 0); + layout->setSpacing(6); + + if (header_mode == SectionHeaderMode::Visible) { + auto* header = new QFrame(this); + header->setObjectName("panelSectionHeader"); + auto* header_layout = new QHBoxLayout(header); + header_layout->setContentsMargins(0, 0, 0, 0); + header_layout->setSpacing(6); + + auto* toggle = new QToolButton(header); + toggle->setObjectName("panelSectionHeaderButton"); + toggle->setText(title); + toggle->setCheckable(true); + toggle->setChecked(true); + toggle->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + toggle->setArrowType(Qt::DownArrow); + header_layout->addWidget(toggle); + header_layout->addStretch(1); + + if (!filter_placeholder.isEmpty()) { + auto* filter_toggle = new QToolButton(header); + filter_toggle->setObjectName("panelSectionFilterToggle"); + filter_toggle->setCheckable(true); + filter_toggle->setIcon(icons::makePanelSvgIcon(":/icons/filter.svg")); + filter_toggle->setAutoRaise(true); + header_layout->addWidget(filter_toggle); + + filter_field_ = qobject_cast(makeSectionFilterField(filter_placeholder, this)); + filter_field_->setVisible(false); + connect(filter_toggle, &QToolButton::toggled, filter_field_, [this](bool visible) { + filter_field_->setVisible(visible); + if (visible) filter_field_->setFocus(); + }); + } + + layout->addWidget(header); + if (filter_field_) { + auto* filter_wrapper = new QWidget(this); + filter_wrapper->setObjectName("panelSectionFilterWrapper"); + auto* filter_wrapper_layout = new QVBoxLayout(filter_wrapper); + filter_wrapper_layout->setContentsMargins(10, 0, 10, 0); + filter_wrapper_layout->setSpacing(0); + filter_wrapper_layout->addWidget(filter_field_); + layout->addWidget(filter_wrapper); + } + + connect(toggle, &QToolButton::toggled, this, [this, toggle](bool expanded) { + toggle->setArrowType(expanded ? Qt::DownArrow : Qt::RightArrow); + body_->setVisible(expanded); + if (filter_field_) { + auto* wrapper = filter_field_->parentWidget(); + if (wrapper) wrapper->setVisible(expanded && filter_field_->isVisible()); + } + }); + } else if (!filter_placeholder.isEmpty()) { + filter_field_ = qobject_cast(makeSectionFilterField(filter_placeholder, this)); + auto* filter_wrapper = new QWidget(this); + filter_wrapper->setObjectName("panelSectionFilterWrapper"); + auto* filter_wrapper_layout = new QVBoxLayout(filter_wrapper); + filter_wrapper_layout->setContentsMargins(8, 0, 8, 0); + filter_wrapper_layout->setSpacing(0); + filter_wrapper_layout->addWidget(filter_field_); + layout->addWidget(filter_wrapper); + } + + body_ = new QWidget(this); + body_->setObjectName("panelSectionBody"); + body_layout_ = new QVBoxLayout(body_); + if (header_mode == SectionHeaderMode::Visible) { + body_layout_->setContentsMargins(10, 6, 10, 0); + } else { + body_layout_->setContentsMargins(8, 0, 8, 0); + } + body_layout_->setSpacing(6); + layout->addWidget(body_); +} + +void Section::addBodyWidget(QWidget* widget) { + body_layout_->addWidget(widget); +} + +} // namespace ifcinterface::components diff --git a/src/interface/components/CollapsibleSection.h b/src/interface/components/Section.h similarity index 78% rename from src/interface/components/CollapsibleSection.h rename to src/interface/components/Section.h index 7e9431f7fb..4dacae514d 100644 --- a/src/interface/components/CollapsibleSection.h +++ b/src/interface/components/Section.h @@ -18,22 +18,28 @@ * * ********************************************************************************/ -#ifndef IFCINTERFACE_COMPONENTS_INSPECTOR_COLLAPSIBLESECTION_H -#define IFCINTERFACE_COMPONENTS_INSPECTOR_COLLAPSIBLESECTION_H +#ifndef IFCINTERFACE_COMPONENTS_SECTION_H +#define IFCINTERFACE_COMPONENTS_SECTION_H #include class QLineEdit; class QVBoxLayout; -namespace ifcinterface::components::inspector { +namespace ifcinterface::components { -class CollapsibleSection : public QWidget { +enum class SectionHeaderMode { + Visible, + Hidden, +}; + +class Section : public QWidget { Q_OBJECT public: - explicit CollapsibleSection(const QString& title, - const QString& filter_placeholder = {}, - QWidget* parent = nullptr); + explicit Section(const QString& title, + SectionHeaderMode header_mode = SectionHeaderMode::Visible, + const QString& filter_placeholder = {}, + QWidget* parent = nullptr); void addBodyWidget(QWidget* widget); @@ -43,6 +49,6 @@ private: QLineEdit* filter_field_ = nullptr; }; -} // namespace ifcinterface::components::inspector +} // namespace ifcinterface::components #endif diff --git a/src/interface/panels/properties/PropertiesPanelWidget.cpp b/src/interface/panels/properties/PropertiesPanelWidget.cpp index c6ef61355b..2c17e4c176 100644 --- a/src/interface/panels/properties/PropertiesPanelWidget.cpp +++ b/src/interface/panels/properties/PropertiesPanelWidget.cpp @@ -20,7 +20,7 @@ #include "PropertiesPanelWidget.h" -#include "../../components/CollapsibleSection.h" +#include "../../components/Section.h" #include "../../components/SvgIcon.h" #include @@ -157,13 +157,6 @@ void PropertiesPanelWidget::setState(const PropertiesPanelState& state) { entity_layout->addWidget(entity_icon, 0, Qt::AlignVCenter); entity_layout->addWidget(entity_text, 1, Qt::AlignVCenter); - auto* entity_wrapper = new QWidget(content); - entity_wrapper->setObjectName("inspectorSectionBody"); - auto* entity_wrapper_layout = new QVBoxLayout(entity_wrapper); - entity_wrapper_layout->setContentsMargins(10, 0, 10, 0); - entity_wrapper_layout->setSpacing(0); - entity_wrapper_layout->addWidget(entity_card); - QList property_set_widgets; for (const auto& property_set : state.property_sets) { property_set_widgets.append(makePropertySetPanel(property_set, content)); @@ -174,16 +167,18 @@ void PropertiesPanelWidget::setState(const PropertiesPanelState& state) { quantity_set_widgets.append(makePropertySetPanel(property_set, content)); } - auto* attributes_section = new components::inspector::CollapsibleSection("Attributes", "", content); + auto* entity_section = new components::Section("", components::SectionHeaderMode::Hidden, "", content); + entity_section->addBodyWidget(entity_card); + auto* attributes_section = new components::Section("Attributes", components::SectionHeaderMode::Visible, "", content); attributes_section->addBodyWidget(makeAttributeList(state.attributes, content)); - auto* relationships_section = new components::inspector::CollapsibleSection("Relationships", "", content); + auto* relationships_section = new components::Section("Relationships", components::SectionHeaderMode::Visible, "", content); relationships_section->addBodyWidget(makeRelationshipList(state.relationships, content)); - auto* properties_section = new components::inspector::CollapsibleSection("Properties", "Filter properties or sets", content); + auto* properties_section = new components::Section("Properties", components::SectionHeaderMode::Visible, "Filter properties or sets", content); for (auto* widget : property_set_widgets) properties_section->addBodyWidget(widget); - auto* quantities_section = new components::inspector::CollapsibleSection("Quantities", "Filter quantities or sets", content); + auto* quantities_section = new components::Section("Quantities", components::SectionHeaderMode::Visible, "Filter quantities or sets", content); for (auto* widget : quantity_set_widgets) quantities_section->addBodyWidget(widget); - content_layout->addWidget(entity_wrapper); + content_layout->addWidget(entity_section); content_layout->addWidget(attributes_section); content_layout->addWidget(relationships_section); content_layout->addWidget(properties_section); diff --git a/src/interface/panels/spatial_hierarchy/SpatialHierarchyPanelWidget.cpp b/src/interface/panels/spatial_hierarchy/SpatialHierarchyPanelWidget.cpp index d682c56500..5c48a1b24a 100644 --- a/src/interface/panels/spatial_hierarchy/SpatialHierarchyPanelWidget.cpp +++ b/src/interface/panels/spatial_hierarchy/SpatialHierarchyPanelWidget.cpp @@ -20,6 +20,7 @@ #include "SpatialHierarchyPanelWidget.h" +#include "../../components/Section.h" #include "../../components/SvgIcon.h" #include @@ -36,7 +37,9 @@ SpatialHierarchyPanelWidget::SpatialHierarchyPanelWidget(QWidget* parent) layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); - tree_ = new QTreeWidget(this); + auto* section = new components::Section("", components::SectionHeaderMode::Hidden, "", this); + + tree_ = new QTreeWidget(section); tree_->setColumnCount(2); tree_->setHeaderLabels({"Spatial Item", ""}); tree_->setIconSize(QSize(16, 16)); @@ -47,7 +50,8 @@ SpatialHierarchyPanelWidget::SpatialHierarchyPanelWidget(QWidget* parent) tree_->header()->setSectionResizeMode(1, QHeaderView::Fixed); tree_->header()->resizeSection(1, 28); tree_->header()->hide(); - layout->addWidget(tree_); + section->addBodyWidget(tree_); + layout->addWidget(section); connect(tree_, &QTreeWidget::itemClicked, this, [this](QTreeWidgetItem* item, int column) { if (!item || column != 1) return; diff --git a/src/interface/panels/todo/TodoPanelWidget.cpp b/src/interface/panels/todo/TodoPanelWidget.cpp new file mode 100644 index 0000000000..36104e7b6d --- /dev/null +++ b/src/interface/panels/todo/TodoPanelWidget.cpp @@ -0,0 +1,60 @@ +// This file was generated with the assistance of an AI coding tool. +/******************************************************************************** + * * + * This file is part of IfcOpenShell. * + * * + * IfcOpenShell is free software: you can redistribute it and/or modify * + * it under the terms of the Lesser GNU General Public License as published by * + * the Free Software Foundation, either version 3.0 of the License, or * + * (at your option) any later version. * + * * + * IfcOpenShell is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * Lesser GNU General Public License for more details. * + * * + * You should have received a copy of the Lesser GNU General Public License * + * along with this program. If not, see . * + * * + ********************************************************************************/ + +#include "TodoPanelWidget.h" + +#include "../../components/Section.h" + +#include +#include + +namespace ifcinterface::panels::todo { + +TodoPanelWidget::TodoPanelWidget(const QString& title, QWidget* parent) + : QWidget(parent) +{ + auto* layout = new QVBoxLayout(this); + layout->setContentsMargins(0, 0, 0, 0); + layout->setSpacing(0); + + auto* section = new components::Section("", components::SectionHeaderMode::Hidden, "", this); + + auto* body = new QWidget(section); + auto* body_layout = new QVBoxLayout(body); + body_layout->setContentsMargins(0, 12, 0, 12); + body_layout->setSpacing(12); + + auto* heading = new QLabel(title, body); + heading->setObjectName("todoPanelTitle"); + + auto* content = new QLabel("Coming soon", body); + content->setObjectName("todoPanelBody"); + content->setAlignment(Qt::AlignCenter); + + body_layout->addWidget(heading); + body_layout->addStretch(1); + body_layout->addWidget(content); + body_layout->addStretch(1); + + section->addBodyWidget(body); + layout->addWidget(section); +} + +} // namespace ifcinterface::panels::todo diff --git a/src/interface/panels/todo/TodoPanelWidget.h b/src/interface/panels/todo/TodoPanelWidget.h new file mode 100644 index 0000000000..7ab3bba29b --- /dev/null +++ b/src/interface/panels/todo/TodoPanelWidget.h @@ -0,0 +1,36 @@ +// This file was generated with the assistance of an AI coding tool. +/******************************************************************************** + * * + * This file is part of IfcOpenShell. * + * * + * IfcOpenShell is free software: you can redistribute it and/or modify * + * it under the terms of the Lesser GNU General Public License as published by * + * the Free Software Foundation, either version 3.0 of the License, or * + * (at your option) any later version. * + * * + * IfcOpenShell is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * Lesser GNU General Public License for more details. * + * * + * You should have received a copy of the Lesser GNU General Public License * + * along with this program. If not, see . * + * * + ********************************************************************************/ + +#ifndef IFCINTERFACE_PANELS_TODO_TODOPANELWIDGET_H +#define IFCINTERFACE_PANELS_TODO_TODOPANELWIDGET_H + +#include + +namespace ifcinterface::panels::todo { + +class TodoPanelWidget : public QWidget { + Q_OBJECT +public: + explicit TodoPanelWidget(const QString& title, QWidget* parent = nullptr); +}; + +} // namespace ifcinterface::panels::todo + +#endif