feat: add geometry spreadsheet widget

This commit is contained in:
parker
2025-08-05 19:48:22 +01:00
parent 2a0afc7c24
commit ef372a9630
7 changed files with 249 additions and 6 deletions

View File

@@ -0,0 +1,132 @@
#include "Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.h"
#include <QLabel>
#include <qpainter.h>
#include <qpushbutton.h>
#include <qwidget.h>
#include <QButtonGroup>
#include <QPainter>
#include <QPaintEvent>
#include <icecream.hpp>
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_);
}

View File

@@ -0,0 +1,39 @@
#pragma once
#include <QWidget>
#include <QHBoxLayout>
#include <qbuttongroup.h>
#include <qpushbutton.h>
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_;
};

View File

@@ -0,0 +1,43 @@
#include "Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetPanel.h"
#include "Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.h"
#include <QTableWidget>
#include <QTreeWidget>
#include <QLabel>
#include <qframe.h>
#include <qtablewidget.h>
#include <QPainterPath>
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);
}

View File

@@ -0,0 +1,20 @@
#pragma once
#include <QWidget>
#include <QVBoxLayout>
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;
};

View File

@@ -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_);

View File

@@ -15,6 +15,7 @@ class EnzoUI
QVBoxLayout* viewportSplitLayout_;
Splitter* viewportSplitter_;
Splitter* networkSplitter_;
Splitter* spreadsheetSplitter_;
};