diff --git a/src/Engine/Operator/GeometryOperator.cpp b/src/Engine/Operator/GeometryOperator.cpp index cbfd0d7..b2ad040 100644 --- a/src/Engine/Operator/GeometryOperator.cpp +++ b/src/Engine/Operator/GeometryOperator.cpp @@ -124,6 +124,12 @@ std::vector> nt::GeometryOperator::getParameters() return {parameters_.begin(), parameters_.end()}; } +std::string nt::GeometryOperator::getLabel() +{ + return getTypeName(); +} + + std::vector> nt::GeometryOperator::getOutputConnections() const { return {outputConnections_.begin(), outputConnections_.end()}; diff --git a/src/Engine/Operator/GeometryOperator.h b/src/Engine/Operator/GeometryOperator.h index ea4c364..9dddca0 100644 --- a/src/Engine/Operator/GeometryOperator.h +++ b/src/Engine/Operator/GeometryOperator.h @@ -30,6 +30,7 @@ public: std::vector> getParameters(); std::weak_ptr getParameter(std::string parameterName); + std::string getLabel(); // TODO: implement node labels std::string getTypeName(); void dirtyNode(bool dirtyDescendents=true); diff --git a/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.cpp b/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.cpp index 966d202..fa3dd8d 100644 --- a/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.cpp +++ b/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.cpp @@ -1,4 +1,6 @@ #include "Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.h" +#include "Engine/Network/NetworkManager.h" +#include "Engine/Operator/GeometryOperator.h" #include #include #include @@ -99,18 +101,19 @@ GeoSheetMenuBarModeSelection::GeoSheetMenuBarModeSelection(QWidget *parent, Qt:: modeButtonGroup_.setExclusive(true); - auto newButton = [this, &buttonBgLayout]() + auto newButton = [this, &buttonBgLayout](const char* tooltip="") { auto newButton = new GeoSheetModeButton(); + newButton->setToolTip(tooltip); modeButtonGroup_.addButton(newButton); buttonBgLayout->addWidget(newButton); return newButton; }; - auto pointButton = newButton(); - auto vertButton = newButton(); - auto primButton = newButton(); - auto globalButton = newButton(); + pointButton = newButton("Point Attributes"); + vertexButton = newButton("Vertex Attributes"); + primitiveButton = newButton("Primitive Attributes"); + globalButton = newButton("Global Attributes"); pointButton->setChecked(true); @@ -121,12 +124,22 @@ GeoSheetMenuBarModeSelection::GeoSheetMenuBarModeSelection(QWidget *parent, Qt:: 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()); + nodeLabel_ = new QLabel(); + mainLayout_->addWidget(nodeLabel_); + modeSelection = new GeoSheetMenuBarModeSelection(); + mainLayout_->addWidget(modeSelection); setLayout(mainLayout_); } + +void GeometrySpreadsheetMenuBar::setNode(enzo::nt::OpId opId) +{ + enzo::nt::GeometryOperator& geoOp = enzo::nt::nm().getGeoOperator(opId); + nodeLabel_->setText("Node: " + QString::fromStdString(geoOp.getLabel())); +} diff --git a/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.h b/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.h index 4b4e433..094e756 100644 --- a/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.h +++ b/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.h @@ -1,9 +1,12 @@ #pragma once +#include "Engine/Operator/OpInfo.h" +#include "Engine/Types.h" #include #include #include #include +#include class GeoSheetModeButton : public QPushButton @@ -19,21 +22,30 @@ protected: 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()); + + GeoSheetModeButton* pointButton; + GeoSheetModeButton* vertexButton; + GeoSheetModeButton* primitiveButton; + GeoSheetModeButton* globalButton; private: QHBoxLayout* mainLayout_; QButtonGroup modeButtonGroup_; }; + +class GeometrySpreadsheetMenuBar +: public QWidget +{ +public: + GeometrySpreadsheetMenuBar(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); + GeoSheetMenuBarModeSelection* modeSelection; + void setNode(enzo::nt::OpId opId); +private: + QHBoxLayout* mainLayout_; + QLabel* nodeLabel_; +}; + diff --git a/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetModel.cpp b/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetModel.cpp index 80a5280..81654fa 100644 --- a/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetModel.cpp +++ b/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetModel.cpp @@ -1,5 +1,4 @@ #include "Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetModel.h" -#include "Engine/Network/NetworkManager.h" #include "Engine/Operator/Attribute.h" #include "Engine/Operator/AttributeHandle.h" #include "Engine/Operator/Geometry.h" @@ -7,10 +6,11 @@ #include #include #include +#include -GeometrySpreadsheetModel::GeometrySpreadsheetModel(const QStringList &strings, QObject *parent) -: QAbstractListModel(parent), stringList(strings) +GeometrySpreadsheetModel::GeometrySpreadsheetModel(QObject *parent) +: QAbstractListModel(parent) { } @@ -19,11 +19,18 @@ void GeometrySpreadsheetModel::geometryChanged(enzo::geo::Geometry& geometry) { beginResetModel(); geometry_ = geometry; + initBuffers(); + endResetModel(); +} + +void GeometrySpreadsheetModel::initBuffers() +{ // get sizes const auto attribCount = geometry_.getNumAttributes(attributeOwner_); attribSizes_.clear(); + sectionAttribMap_.clear(); attribSizes_.reserve(attribCount); for(size_t i=0; igetName()); + if(attribSizes_[attributeIndex]>1) + { + const unsigned int valueIndex = section-attributeIndex; + + std::string valueIndexString; + if(attrib->getType()==enzo::ga::AttrType::vectorT) + { + valueIndexString = std::array{".x", ".y", ".z", ".w"}.at(valueIndex); + } + else + { + valueIndexString = "["+std::to_string(valueIndex)+"]"; + } + + return QString::fromStdString(attrib->getName() + valueIndexString); + } + else + { + return QString::fromStdString(attrib->getName()); + } } else { diff --git a/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetModel.h b/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetModel.h index e067017..debff55 100644 --- a/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetModel.h +++ b/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetModel.h @@ -9,7 +9,7 @@ class GeometrySpreadsheetModel : public QAbstractListModel Q_OBJECT public: - GeometrySpreadsheetModel(const QStringList &strings, QObject *parent = nullptr); + GeometrySpreadsheetModel(QObject *parent = nullptr); int rowCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override; @@ -19,14 +19,15 @@ public: int indexFromSection(unsigned int section) const; void geometryChanged(enzo::geo::Geometry& geometry); + void setOwner(const enzo::ga::AttributeOwner owner); + void initBuffers(); private: - QStringList stringList; enzo::nt::OpId opId_; enzo::geo::Geometry geometry_; std::vector attribSizes_; std::vector sectionAttribMap_; - enzo::ga::AttributeOwner attributeOwner_=enzo::ga::AttributeOwner::PRIMITIVE; + enzo::ga::AttributeOwner attributeOwner_=enzo::ga::AttributeOwner::POINT; }; diff --git a/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetPanel.cpp b/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetPanel.cpp index 1226b42..9aea7f7 100644 --- a/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetPanel.cpp +++ b/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetPanel.cpp @@ -1,10 +1,12 @@ #include "Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetPanel.h" #include "Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.h" #include "Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetModel.h" +#include "Engine/Network/NetworkManager.h" #include #include #include #include +#include #include #include @@ -26,16 +28,31 @@ GeometrySpreadsheetPanel::GeometrySpreadsheetPanel(QWidget *parent, Qt::WindowFl )"); view_->setFrameStyle(QFrame::NoFrame); - model_ = new GeometrySpreadsheetModel({"hello", "world"}); + model_ = new GeometrySpreadsheetModel(); view_->setModel(model_); + menuBar_ = new GeometrySpreadsheetMenuBar(); + // connect buttons + connect(menuBar_->modeSelection->pointButton, &QPushButton::clicked, this, [this](){model_->setOwner(enzo::ga::AttributeOwner::POINT);}); + connect(menuBar_->modeSelection->vertexButton, &QPushButton::clicked, this, [this](){model_->setOwner(enzo::ga::AttributeOwner::VERTEX);}); + connect(menuBar_->modeSelection->primitiveButton, &QPushButton::clicked, this, [this](){model_->setOwner(enzo::ga::AttributeOwner::PRIMITIVE);}); + connect(menuBar_->modeSelection->globalButton, &QPushButton::clicked, this, [this](){model_->setOwner(enzo::ga::AttributeOwner::GLOBAL);}); + // set default + menuBar_->modeSelection->pointButton->click(); - mainLayout_->addWidget(new GeometrySpreadsheetMenuBar()); + + mainLayout_->addWidget(menuBar_); mainLayout_->addWidget(view_); setLayout(mainLayout_); } +void GeometrySpreadsheetPanel::setNode(enzo::nt::OpId opId) +{ + menuBar_->setNode(opId); +} + + void GeometrySpreadsheetPanel::geometryChanged(enzo::geo::Geometry& geometry) { model_->geometryChanged(geometry); diff --git a/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetPanel.h b/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetPanel.h index 18714ca..f89285d 100644 --- a/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetPanel.h +++ b/src/Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetPanel.h @@ -5,6 +5,7 @@ #include #include "Engine/Types.h" #include "Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetModel.h" +#include "Gui/GeometrySpreadsheetPanel/GeometrySpreadsheetMenuBar.h" class GeometrySpreadsheetPanel : public QWidget @@ -13,11 +14,13 @@ public: GeometrySpreadsheetPanel(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); public Q_SLOTS: void geometryChanged(enzo::geo::Geometry& geometry); + void setNode(enzo::nt::OpId opId); private: QVBoxLayout* mainLayout_; QWidget* bgWidget_; GeometrySpreadsheetModel* model_; QTreeView* view_; + GeometrySpreadsheetMenuBar* menuBar_; protected: void resizeEvent(QResizeEvent *event) override; diff --git a/src/Gui/Interface.cpp b/src/Gui/Interface.cpp index e640d18..cdc8c6f 100644 --- a/src/Gui/Interface.cpp +++ b/src/Gui/Interface.cpp @@ -63,6 +63,7 @@ EnzoUI::EnzoUI() // connect signals enzo::nt::nm().displayNodeChanged.connect([parametersPanel](enzo::nt::OpId opId){parametersPanel->selectionChanged(opId);}); + enzo::nt::nm().displayNodeChanged.connect([geometrySpreadsheetPanel](enzo::nt::OpId opId){geometrySpreadsheetPanel->setNode(opId);}); enzo::nt::nm().displayGeoChanged.connect([geometrySpreadsheetPanel](enzo::geo::Geometry& geometry){geometrySpreadsheetPanel->geometryChanged(geometry);}); enzo::nt::nm().displayGeoChanged.connect([viewport](enzo::geo::Geometry& geometry){viewport->setGeometry(geometry);}); }