From c19b42883001b09bd7a1b0a92181a186c6e396bd Mon Sep 17 00:00:00 2001 From: maelstrom Date: Sun, 13 Apr 2025 16:15:29 +0200 Subject: [PATCH] feat(editor): editing properties in new widget --- editor/panes/propertiesview.cpp | 45 ++++++++++++++++++++++++++++++--- editor/panes/propertiesview.h | 4 +++ 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/editor/panes/propertiesview.cpp b/editor/panes/propertiesview.cpp index 28c915c..93fc735 100644 --- a/editor/panes/propertiesview.cpp +++ b/editor/panes/propertiesview.cpp @@ -1,9 +1,7 @@ #include "propertiesview.h" +#include "datatypes/base.h" #include "datatypes/meta.h" #include "objects/base/member.h" -#include "propertiesmodel.h" -#include "qaction.h" -#include #include #include #include @@ -48,6 +46,15 @@ PropertiesView::PropertiesView(QWidget* parent): setColumnCount(2); setAlternatingRowColors(true); setItemDelegate(new CustomItemDelegate(this)); + + connect(this, &QTreeWidget::itemChanged, this, &PropertiesView::propertyChanged); + connect(this, &QTreeWidget::itemActivated, this, [&](auto* item, int column) { + // Prevent editing the first column + if (column == 0) + item->setFlags(item->flags() & ~Qt::ItemIsEditable); + else if (item->parent()) + item->setFlags(item->flags() | Qt::ItemIsEditable); + }); } PropertiesView::~PropertiesView() { @@ -61,6 +68,11 @@ QStringList PROPERTY_CATEGORY_NAMES { "Surface" }; + +QModelIndex PropertiesView::indexAt(const QPoint &point) const { + return QTreeWidget::indexAt(point + QPoint(indentation(), 0)); +} + void PropertiesView::drawBranches(QPainter *painter, const QRect &rect, const QModelIndex &index) const { // https://codebrowser.dev/qt5/qtbase/src/widgets/itemviews/qtreeview.cpp.html#312opt Q_D(const QTreeView); @@ -99,6 +111,7 @@ void PropertiesView::setSelected(std::optional instance) { clear(); if (!instance) return; InstanceRef inst = instance.value(); + currentInstance = inst; std::map propertyCategories; @@ -123,8 +136,14 @@ void PropertiesView::setSelected(std::optional instance) { Data::Variant currentValue = inst->GetPropertyValue(property).value(); QTreeWidgetItem* item = new QTreeWidgetItem; + item->setFlags(item->flags() | Qt::ItemIsEditable | Qt::ItemIsSelectable); item->setData(0, Qt::DisplayRole, QString::fromStdString(property)); - item->setData(1, Qt::DisplayRole, QString::fromStdString(currentValue.ToString())); + + if (meta.type == &Data::Bool::TYPE) { + item->setCheckState(1, (bool)currentValue.get() ? Qt::CheckState::Checked : Qt::CheckState::Unchecked); + } else { + item->setData(1, Qt::DisplayRole, QString::fromStdString(currentValue.ToString())); + } propertyCategories[meta.category]->addChild(item); propertyCategories[meta.category]->setExpanded(true); @@ -138,4 +157,22 @@ void PropertiesView::setSelected(std::optional instance) { } resizeColumnToContents(0); +} + +void PropertiesView::propertyChanged(QTreeWidgetItem *item, int column) { + if (!item->parent() || !currentInstance || currentInstance->expired()) return; + InstanceRef inst = currentInstance->lock(); + + std::string propertyName = item->data(0, Qt::DisplayRole).toString().toStdString(); + PropertyMeta meta = inst->GetPropertyMeta(propertyName).value(); + + if (meta.type == &Data::String::TYPE) { + inst->SetPropertyValue(propertyName, Data::String(item->data(1, Qt::EditRole).toString().toStdString())); + } else if (meta.type == &Data::Bool::TYPE) { + inst->SetPropertyValue(propertyName, Data::Bool(item->checkState(1))); + } else { + inst->SetPropertyValue(propertyName, meta.type->fromString(item->data(1, Qt::EditRole).toString().toStdString())); + } + + update(indexFromItem(item, column)); } \ No newline at end of file diff --git a/editor/panes/propertiesview.h b/editor/panes/propertiesview.h index 8748cea..a283b26 100644 --- a/editor/panes/propertiesview.h +++ b/editor/panes/propertiesview.h @@ -7,8 +7,12 @@ class Ui_MainWindow; class PropertiesView : public QTreeWidget { Q_DECLARE_PRIVATE(QTreeView) + + std::optional currentInstance; + void propertyChanged(QTreeWidgetItem *item, int column); protected: void drawBranches(QPainter *painter, const QRect &rect, const QModelIndex &index) const override; + QModelIndex indexAt(const QPoint &point) const override; public: PropertiesView(QWidget* parent = nullptr); ~PropertiesView() override;