feat: add geometry spreadsheet widget
This commit is contained in:
@@ -31,6 +31,8 @@ set(GUI_SOURCES
|
|||||||
src/Gui/main.cpp
|
src/Gui/main.cpp
|
||||||
src/Gui/Interface.cpp
|
src/Gui/Interface.cpp
|
||||||
src/Gui/UtilWidgets/Splitter.cpp
|
src/Gui/UtilWidgets/Splitter.cpp
|
||||||
|
src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetPanel.cpp
|
||||||
|
src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.cpp
|
||||||
src/Gui/Viewport/Viewport.cpp
|
src/Gui/Viewport/Viewport.cpp
|
||||||
src/Gui/Viewport/ViewportGLWidget.cpp
|
src/Gui/Viewport/ViewportGLWidget.cpp
|
||||||
src/Gui/Viewport/GLCamera.cpp
|
src/Gui/Viewport/GLCamera.cpp
|
||||||
|
|||||||
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 "Gui/Interface.h"
|
||||||
#include "Engine/Network/NetworkManager.h"
|
#include "Engine/Network/NetworkManager.h"
|
||||||
|
#include "Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetPanel.h"
|
||||||
#include "Gui/ParametersPanel/ParametersPanel.h"
|
#include "Gui/ParametersPanel/ParametersPanel.h"
|
||||||
#include "Gui/Viewport/Viewport.h"
|
#include "Gui/Viewport/Viewport.h"
|
||||||
#include "Gui/Network/Network.h"
|
#include "Gui/Network/Network.h"
|
||||||
@@ -26,30 +27,35 @@ EnzoUI::EnzoUI()
|
|||||||
Viewport* viewport = new Viewport();
|
Viewport* viewport = new Viewport();
|
||||||
Network* network = new Network();
|
Network* network = new Network();
|
||||||
ParametersPanel* parametersPanel = new ParametersPanel();
|
ParametersPanel* parametersPanel = new ParametersPanel();
|
||||||
|
GeometrySpreadsheetPanel* geometrySpreadsheetPanel = new GeometrySpreadsheetPanel();
|
||||||
|
|
||||||
constexpr int margin = 2;
|
constexpr int margin = 2;
|
||||||
viewport->layout()->setContentsMargins(margin, margin, margin, margin);
|
viewport->layout()->setContentsMargins(margin, margin, margin, margin);
|
||||||
network->layout()->setContentsMargins(margin, margin, margin, margin);
|
network->layout()->setContentsMargins(margin, margin, margin, margin);
|
||||||
parametersPanel->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);
|
mainLayout_->setContentsMargins(margin, margin, margin, margin);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// TODO: dynamic splitters
|
||||||
viewportSplitter_ = new Splitter(this);
|
viewportSplitter_ = new Splitter(this);
|
||||||
networkSplitter_ = new Splitter(this);
|
networkSplitter_ = new Splitter(this);
|
||||||
|
spreadsheetSplitter_ = new Splitter(this);
|
||||||
networkSplitter_->setOrientation(Qt::Vertical);
|
networkSplitter_->setOrientation(Qt::Vertical);
|
||||||
|
spreadsheetSplitter_->setOrientation(Qt::Vertical);
|
||||||
|
|
||||||
|
spreadsheetSplitter_->addWidget(viewport);
|
||||||
|
spreadsheetSplitter_->addWidget(geometrySpreadsheetPanel);
|
||||||
|
spreadsheetSplitter_->setSizes({200,100});
|
||||||
|
|
||||||
|
viewportSplitter_->addWidget(spreadsheetSplitter_);
|
||||||
viewportSplitter_->addWidget(viewport);
|
|
||||||
viewportSplitter_->addWidget(networkSplitter_);
|
viewportSplitter_->addWidget(networkSplitter_);
|
||||||
viewportSplitter_->setStretchFactor(0, 4);
|
viewportSplitter_->setSizes({100,100});
|
||||||
viewportSplitter_->setStretchFactor(1, 1);
|
|
||||||
|
|
||||||
networkSplitter_->addWidget(parametersPanel);
|
networkSplitter_->addWidget(parametersPanel);
|
||||||
networkSplitter_->addWidget(network);
|
networkSplitter_->addWidget(network);
|
||||||
networkSplitter_->setStretchFactor(0, 10);
|
networkSplitter_->setSizes({40,100});
|
||||||
networkSplitter_->setStretchFactor(1, 1);
|
|
||||||
|
|
||||||
mainLayout_->addWidget(viewportSplitter_);
|
mainLayout_->addWidget(viewportSplitter_);
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ class EnzoUI
|
|||||||
QVBoxLayout* viewportSplitLayout_;
|
QVBoxLayout* viewportSplitLayout_;
|
||||||
Splitter* viewportSplitter_;
|
Splitter* viewportSplitter_;
|
||||||
Splitter* networkSplitter_;
|
Splitter* networkSplitter_;
|
||||||
|
Splitter* spreadsheetSplitter_;
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user