From ef372a9630ca05ff115932cc95cd262e1ac68954 Mon Sep 17 00:00:00 2001 From: parker Date: Tue, 5 Aug 2025 19:48:22 +0100 Subject: [PATCH] feat: add geometry spreadsheet widget --- CMakeLists.txt | 2 + .../GeometrySpreadsheetMenuBar.cpp | 132 ++++++++++++++++++ .../GeometrySpreadsheetMenuBar.h | 39 ++++++ .../GeometrySpreadsheetPanel.cpp | 43 ++++++ .../GeometrySpreadsheetPanel.h | 20 +++ src/Gui/Interface.cpp | 18 ++- src/Gui/Interface.h | 1 + 7 files changed, 249 insertions(+), 6 deletions(-) create mode 100644 src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.cpp create mode 100644 src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.h create mode 100644 src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetPanel.cpp create mode 100644 src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetPanel.h diff --git a/CMakeLists.txt b/CMakeLists.txt index ad55f02..ff59e0a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,6 +31,8 @@ set(GUI_SOURCES src/Gui/main.cpp src/Gui/Interface.cpp src/Gui/UtilWidgets/Splitter.cpp + src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetPanel.cpp + src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.cpp src/Gui/Viewport/Viewport.cpp src/Gui/Viewport/ViewportGLWidget.cpp src/Gui/Viewport/GLCamera.cpp diff --git a/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.cpp b/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.cpp new file mode 100644 index 0000000..966d202 --- /dev/null +++ b/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.cpp @@ -0,0 +1,132 @@ +#include "Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.h" +#include +#include +#include +#include +#include +#include +#include +#include + +GeoSheetModeButton::GeoSheetModeButton(QWidget* parent) +: QPushButton(parent) +{ + setFixedSize(QSize(23,23)); + setObjectName("GeoSheetModeButton"); + setCheckable(true); + // setStyleSheet( + // R"( + // #GeoSheetModeButton + // { + // background: transparent; + // border: none; + // } + // #GeoSheetModeButton::checked + // { + // opacity: 50; + // border: none; + // } + // )"); + + setIcon(QIcon(":/node-icons/grid.svg")); +} + +void GeoSheetModeButton::enterEvent(QEnterEvent *event) +{ + hovered_=true; + QPushButton::enterEvent(event); + +} + +void GeoSheetModeButton::leaveEvent(QEvent *event) +{ + hovered_=false; + QPushButton::leaveEvent(event); +} + +void GeoSheetModeButton::paintEvent(QPaintEvent* event) +{ + const QIcon buttonIcon = icon(); + + if(!buttonIcon.isNull()) + { + QPainter painter(this); + + QSize size = iconSize(); + + if(!isChecked()) + { + painter.setOpacity(0.5); + } + if(hovered_) + { + size*=1.1; + } + + + + QPixmap pixmap = buttonIcon.pixmap(size); + QPoint center = event->rect().center() - QPoint(size.width() / 2, size.height() / 2); + // QPoint center = QPoint(0,0); + painter.drawPixmap(center, pixmap); + + } + +} + + +GeoSheetMenuBarModeSelection::GeoSheetMenuBarModeSelection(QWidget *parent, Qt::WindowFlags f) +: QWidget(parent, f) +{ + mainLayout_ = new QHBoxLayout(); + QWidget* buttonBg = new QWidget(); + buttonBg->setObjectName("GeoSheetMenuBarButtonBg"); + buttonBg->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); + constexpr int bgSizeMargin = 5; + buttonBg->setContentsMargins(bgSizeMargin,0,bgSizeMargin,0); + buttonBg->setStyleSheet( + R"( + #GeoSheetMenuBarButtonBg + { + background-color: #383838; + border-radius: 8px; + } + + )"); + QHBoxLayout* buttonBgLayout = new QHBoxLayout(); + constexpr int margin = 0; + buttonBgLayout->setContentsMargins(margin,margin,margin,margin); + + modeButtonGroup_.setExclusive(true); + + auto newButton = [this, &buttonBgLayout]() + { + auto newButton = new GeoSheetModeButton(); + modeButtonGroup_.addButton(newButton); + buttonBgLayout->addWidget(newButton); + return newButton; + }; + + auto pointButton = newButton(); + auto vertButton = newButton(); + auto primButton = newButton(); + auto globalButton = newButton(); + + pointButton->setChecked(true); + + buttonBg->setLayout(buttonBgLayout); + + mainLayout_->addWidget(buttonBg); + + setLayout(mainLayout_); +} + +GeometrySpreadsheetMenuBar::GeometrySpreadsheetMenuBar(QWidget *parent, Qt::WindowFlags f) +: QWidget(parent, f) +{ + mainLayout_ = new QHBoxLayout(); + mainLayout_->addWidget(new QLabel("Node: testGeometryRat")); + mainLayout_->addWidget(new GeoSheetMenuBarModeSelection()); + + setLayout(mainLayout_); +} diff --git a/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.h b/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.h new file mode 100644 index 0000000..4b4e433 --- /dev/null +++ b/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.h @@ -0,0 +1,39 @@ +#pragma once + +#include +#include +#include +#include + +class GeoSheetModeButton +: public QPushButton +{ +public: + GeoSheetModeButton(QWidget *parent = nullptr); +private: + QHBoxLayout* mainLayout_; +protected: + void paintEvent(QPaintEvent *) override; + void enterEvent(QEnterEvent *event) override; + void leaveEvent(QEvent *event) override; + bool hovered_ = false; +}; + +class GeometrySpreadsheetMenuBar +: public QWidget +{ +public: + GeometrySpreadsheetMenuBar(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); +private: + QHBoxLayout* mainLayout_; +}; + +class GeoSheetMenuBarModeSelection +: public QWidget +{ +public: + GeoSheetMenuBarModeSelection(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); +private: + QHBoxLayout* mainLayout_; + QButtonGroup modeButtonGroup_; +}; diff --git a/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetPanel.cpp b/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetPanel.cpp new file mode 100644 index 0000000..4a31c26 --- /dev/null +++ b/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetPanel.cpp @@ -0,0 +1,43 @@ +#include "Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetPanel.h" +#include "Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.h" +#include +#include +#include +#include +#include +#include + +GeometrySpreadsheetPanel::GeometrySpreadsheetPanel(QWidget *parent, Qt::WindowFlags f) +: QWidget(parent, f) +{ + mainLayout_ = new QVBoxLayout(); + + + auto *t = new QTreeView(parent); + t->setRootIsDecorated(false); + t->setAlternatingRowColors(true); + t->setStyleSheet(R"( + QTreeView { + background-color: #282828; + alternate-background-color: #242424; + paint-alternating-row-colors-for-empty-area: 1; + } + )"); + t->setFrameStyle(QFrame::NoFrame); + + + mainLayout_->addWidget(new GeometrySpreadsheetMenuBar()); + mainLayout_->addWidget(t); + + setLayout(mainLayout_); +} + +void GeometrySpreadsheetPanel::resizeEvent(QResizeEvent *event) +{ + QPainterPath path; + constexpr float radius = 10; + path.addRoundedRect(mainLayout_->contentsRect(), radius, radius); + QRegion region = QRegion(path.toFillPolygon().toPolygon()); + this->setMask(region); +} + diff --git a/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetPanel.h b/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetPanel.h new file mode 100644 index 0000000..6a9fc75 --- /dev/null +++ b/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetPanel.h @@ -0,0 +1,20 @@ +#pragma once + +#include +#include + +class GeometrySpreadsheetPanel +: public QWidget +{ +public: + GeometrySpreadsheetPanel(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); +public Q_SLOTS: + void selectionChanged(); +private: + QVBoxLayout* mainLayout_; + QWidget* bgWidget_; +protected: + void resizeEvent(QResizeEvent *event) override; + + +}; diff --git a/src/Gui/Interface.cpp b/src/Gui/Interface.cpp index 66baf14..a298093 100644 --- a/src/Gui/Interface.cpp +++ b/src/Gui/Interface.cpp @@ -1,5 +1,6 @@ #include "Gui/Interface.h" #include "Engine/Network/NetworkManager.h" +#include "Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetPanel.h" #include "Gui/ParametersPanel/ParametersPanel.h" #include "Gui/Viewport/Viewport.h" #include "Gui/Network/Network.h" @@ -26,30 +27,35 @@ EnzoUI::EnzoUI() Viewport* viewport = new Viewport(); Network* network = new Network(); ParametersPanel* parametersPanel = new ParametersPanel(); + GeometrySpreadsheetPanel* geometrySpreadsheetPanel = new GeometrySpreadsheetPanel(); constexpr int margin = 2; viewport->layout()->setContentsMargins(margin, margin, margin, margin); network->layout()->setContentsMargins(margin, margin, margin, margin); parametersPanel->layout()->setContentsMargins(margin, margin, margin, margin); + geometrySpreadsheetPanel->layout()->setContentsMargins(margin, margin, margin, margin); mainLayout_->setContentsMargins(margin, margin, margin, margin); + // TODO: dynamic splitters viewportSplitter_ = new Splitter(this); networkSplitter_ = new Splitter(this); + spreadsheetSplitter_ = new Splitter(this); networkSplitter_->setOrientation(Qt::Vertical); + spreadsheetSplitter_->setOrientation(Qt::Vertical); + spreadsheetSplitter_->addWidget(viewport); + spreadsheetSplitter_->addWidget(geometrySpreadsheetPanel); + spreadsheetSplitter_->setSizes({200,100}); - - viewportSplitter_->addWidget(viewport); + viewportSplitter_->addWidget(spreadsheetSplitter_); viewportSplitter_->addWidget(networkSplitter_); - viewportSplitter_->setStretchFactor(0, 4); - viewportSplitter_->setStretchFactor(1, 1); + viewportSplitter_->setSizes({100,100}); networkSplitter_->addWidget(parametersPanel); networkSplitter_->addWidget(network); - networkSplitter_->setStretchFactor(0, 10); - networkSplitter_->setStretchFactor(1, 1); + networkSplitter_->setSizes({40,100}); mainLayout_->addWidget(viewportSplitter_); diff --git a/src/Gui/Interface.h b/src/Gui/Interface.h index f84180e..7355022 100644 --- a/src/Gui/Interface.h +++ b/src/Gui/Interface.h @@ -15,6 +15,7 @@ class EnzoUI QVBoxLayout* viewportSplitLayout_; Splitter* viewportSplitter_; Splitter* networkSplitter_; + Splitter* spreadsheetSplitter_; };