Gui: Add support for renaming properties

This commit is contained in:
Pieter Hijma
2025-07-17 11:25:19 +02:00
committed by Kacper Donat
parent fbc4f450be
commit 5a842e93f5
8 changed files with 105 additions and 0 deletions

View File

@@ -116,6 +116,9 @@ PropertyView::PropertyView(QWidget *parent)
this->connectPropRemove =
App::GetApplication().signalRemoveDynamicProperty.connect(std::bind
(&PropertyView::slotRemoveDynamicProperty, this, sp::_1));
this->connectPropRename =
App::GetApplication().signalRenameDynamicProperty.connect(std::bind
(&PropertyView::slotRenameDynamicProperty, this, sp::_1, sp::_2));
this->connectPropChange =
App::GetApplication().signalChangePropertyEditor.connect(std::bind
(&PropertyView::slotChangePropertyEditor, this, sp::_1, sp::_2));
@@ -258,6 +261,23 @@ void PropertyView::slotRemoveDynamicProperty(const App::Property& prop)
timer->start(ViewParams::instance()->getPropertyViewTimer());
}
void PropertyView::slotRenameDynamicProperty(const App::Property& prop,
const char* /*oldName*/)
{
App::PropertyContainer* parent = prop.getContainer();
if (propertyEditorData->propOwners.contains(parent)) {
propertyEditorData->renameProperty(prop);
}
else if (propertyEditorView->propOwners.contains(parent)) {
propertyEditorView->renameProperty(prop);
}
else {
return;
}
clearPropertyItemSelection();
timer->start(ViewParams::instance()->getPropertyViewTimer());
}
void PropertyView::slotChangePropertyEditor(const App::Document &, const App::Property& prop)
{
App::PropertyContainer* parent = prop.getContainer();

View File

@@ -82,6 +82,7 @@ private:
void slotChangePropertyView(const Gui::ViewProvider&, const App::Property&);
void slotAppendDynamicProperty(const App::Property&);
void slotRemoveDynamicProperty(const App::Property&);
void slotRenameDynamicProperty(const App::Property&, const char* oldName);
void slotChangePropertyEditor(const App::Document&, const App::Property&);
void slotRollback();
void slotActiveDocument(const Gui::Document&);
@@ -99,6 +100,7 @@ private:
Connection connectPropView;
Connection connectPropAppend;
Connection connectPropRemove;
Connection connectPropRename;
Connection connectPropChange;
Connection connectUndoDocument;
Connection connectRedoDocument;

View File

@@ -694,12 +694,25 @@ void PropertyEditor::removeProperty(const App::Property& prop)
}
}
void PropertyEditor::renameProperty(const App::Property& prop)
{
for (auto & it : propList) {
// find the given property in the list and rename it if it's there
auto pos = std::ranges::find(it.second, &prop);
if (pos != it.second.end()) {
propertyModel->renameProperty(prop);
break;
}
}
}
enum MenuAction
{
MA_AutoExpand,
MA_ShowHidden,
MA_Expression,
MA_RemoveProp,
MA_RenameProp,
MA_AddProp,
MA_EditPropGroup,
MA_Transient,
@@ -755,6 +768,15 @@ void PropertyEditor::contextMenuEvent(QContextMenuEvent*)
menu.addAction(tr("Rename Property Group"))->setData(QVariant(MA_EditPropGroup));
}
// rename property
if (props.size() == 1) {
auto prop = *props.begin();
if (prop->testStatus(App::Property::PropDynamic)
&& !prop->testStatus(App::Property::LockDynamic)) {
menu.addAction(tr("Rename property"))->setData(QVariant(MA_RenameProp));
}
}
// remove property
bool canRemove = !props.empty();
unsigned long propType = 0;
@@ -911,6 +933,38 @@ void PropertyEditor::contextMenuEvent(QContextMenuEvent*)
dlg.exec();
return;
}
case MA_RenameProp: {
if (props.size() != 1) {
break;
}
App::Property* prop = *props.begin();
if (!prop->testStatus(App::Property::PropDynamic)
|| prop->testStatus(App::Property::LockDynamic)) {
break;
}
App::AutoTransaction committer("Rename property");
const char* oldName = prop->getName();
QString res = QInputDialog::getText(Gui::getMainWindow(),
tr("Rename property"),
tr("Property name"),
QLineEdit::Normal,
QString::fromUtf8(oldName));
if (res.isEmpty()) {
break;
}
std::string newName = res.toUtf8().constData();
try {
prop->getContainer()->renameDynamicProperty(prop, newName.c_str());
}
catch (Base::Exception& e) {
e.reportException();
break;
}
break;
}
case MA_EditPropGroup: {
// This operation is not undoable yet.
const char* groupName = (*props.begin())->getGroup();

View File

@@ -78,6 +78,7 @@ public:
bool checkDocument = false);
void updateProperty(const App::Property&);
void removeProperty(const App::Property&);
void renameProperty(const App::Property&);
void setAutomaticExpand(bool);
bool isAutomaticExpand(bool) const;
void setAutomaticDocumentUpdate(bool);

View File

@@ -221,6 +221,14 @@ bool PropertyItem::removeProperty(const App::Property* prop)
return propertyItems.empty();
}
bool PropertyItem::renameProperty(const App::Property* prop)
{
setPropertyData({const_cast<App::Property*>(prop)});
QString name = QString::fromLatin1(prop->getName());
setPropertyName(name, name);
return true;
}
App::Property* PropertyItem::getFirstProperty()
{
if (propertyItems.empty()) {

View File

@@ -149,6 +149,7 @@ public:
bool hasProperty(const App::Property*) const;
virtual void assignProperty(const App::Property*);
bool removeProperty(const App::Property*);
bool renameProperty(const App::Property*);
App::Property* getFirstProperty();
const App::Property* getFirstProperty() const;

View File

@@ -572,6 +572,24 @@ void PropertyModel::removeProperty(const App::Property& _prop)
}
}
void PropertyModel::renameProperty(const App::Property& _prop)
{
auto prop = const_cast<App::Property*>(&_prop);
auto it = itemMap.find(prop);
if (it == itemMap.end() || !it->second) {
return;
}
PropertyItem* item = it->second;
item->renameProperty(prop);
QModelIndex parent = this->index(item->parent()->row(), 0, QModelIndex());
QModelIndex nameIndex = this->index(item->row(), 0, parent);
QModelIndex dataIndex = this->index(item->row(), 1, parent);
QVector<int> roles;
roles << Qt::DisplayRole;
Q_EMIT dataChanged(nameIndex, dataIndex, roles);
}
void PropertyModel::updateChildren(PropertyItem* item, int column, const QModelIndex& parent)
{
int numChild = item->childCount();

View File

@@ -65,6 +65,7 @@ public:
void updateProperty(const App::Property&);
void appendProperty(const App::Property&);
void removeProperty(const App::Property&);
void renameProperty(const App::Property&);
QStringList propertyPathFromIndex(const QModelIndex&) const;
QModelIndex propertyIndexFromPath(const QStringList&) const;