feat: add geometry spreadsheet widget
This commit is contained in:
132
src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.cpp
Normal file
132
src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.cpp
Normal 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_);
|
||||
}
|
||||
@@ -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_;
|
||||
};
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
20
src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetPanel.h
Normal file
20
src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetPanel.h
Normal 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;
|
||||
|
||||
|
||||
};
|
||||
@@ -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_);
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@ class EnzoUI
|
||||
QVBoxLayout* viewportSplitLayout_;
|
||||
Splitter* viewportSplitter_;
|
||||
Splitter* networkSplitter_;
|
||||
Splitter* spreadsheetSplitter_;
|
||||
|
||||
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user