Gui: Generalize add property VarSet dialog
This commit ensures that the adding properties does not work only for VarSets, but also for generic property containers.
This commit is contained in:
@@ -129,11 +129,26 @@ const std::string DlgAddPropertyVarSet::GroupBase = "Base";
|
||||
* situation.
|
||||
*/
|
||||
|
||||
DlgAddPropertyVarSet::DlgAddPropertyVarSet(QWidget* parent,
|
||||
App::PropertyContainer* container)
|
||||
: DlgAddPropertyVarSet(parent, container, nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
DlgAddPropertyVarSet::DlgAddPropertyVarSet(QWidget* parent,
|
||||
ViewProviderVarSet* viewProvider)
|
||||
: DlgAddPropertyVarSet(parent,
|
||||
viewProvider ? viewProvider->getObject<App::PropertyContainer>() : nullptr,
|
||||
viewProvider)
|
||||
{
|
||||
}
|
||||
|
||||
DlgAddPropertyVarSet::DlgAddPropertyVarSet(QWidget* parent,
|
||||
App::PropertyContainer* container,
|
||||
ViewProviderVarSet* viewProvider)
|
||||
: QDialog(parent),
|
||||
varSet(viewProvider->getObject<App::VarSet>()),
|
||||
container(container),
|
||||
ui(new Ui_DlgAddPropertyVarSet),
|
||||
comboBoxGroup(this),
|
||||
completerType(this),
|
||||
@@ -194,14 +209,14 @@ void DlgAddPropertyVarSet::setWidgetForLabel(const char* labelName, QWidget* wid
|
||||
}
|
||||
|
||||
void DlgAddPropertyVarSet::populateGroup(EditFinishedComboBox& comboBox,
|
||||
const App::DocumentObject* varSet)
|
||||
const App::PropertyContainer* container)
|
||||
{
|
||||
std::vector<App::Property*> properties;
|
||||
varSet->getPropertyList(properties);
|
||||
container->getPropertyList(properties);
|
||||
|
||||
std::unordered_set<std::string> groupNames;
|
||||
for (const auto* prop : properties) {
|
||||
const char* groupName = varSet->getPropertyGroup(prop);
|
||||
const char* groupName = container->getPropertyGroup(prop);
|
||||
groupNames.insert(groupName ? groupName : GroupBase);
|
||||
}
|
||||
|
||||
@@ -231,7 +246,7 @@ void DlgAddPropertyVarSet::initializeGroup()
|
||||
comboBoxGroup.setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
|
||||
|
||||
setWidgetForLabel("labelGroup", &comboBoxGroup, layout());
|
||||
populateGroup(comboBoxGroup, varSet);
|
||||
populateGroup(comboBoxGroup, container);
|
||||
|
||||
connComboBoxGroup = connect(&comboBoxGroup, &EditFinishedComboBox::editFinished,
|
||||
this, &DlgAddPropertyVarSet::onGroupFinished);
|
||||
@@ -416,7 +431,7 @@ void DlgAddPropertyVarSet::createEditorForType(const Base::Type& type)
|
||||
std::unique_ptr<App::Property, void(*)(App::Property*)> prop(
|
||||
static_cast<App::Property*>(propInstance),
|
||||
[](App::Property* p) { delete p; });
|
||||
prop->setContainer(varSet);
|
||||
prop->setContainer(container);
|
||||
|
||||
propertyItem.reset(createPropertyItem(prop.get()));
|
||||
|
||||
@@ -462,8 +477,10 @@ void DlgAddPropertyVarSet::initializeWidgets(ViewProviderVarSet* viewProvider)
|
||||
initializeTypes();
|
||||
initializeValue();
|
||||
|
||||
connect(this, &QDialog::finished,
|
||||
this, [viewProvider](int result) { viewProvider->onFinished(result); });
|
||||
if (viewProvider) {
|
||||
connect(this, &QDialog::finished,
|
||||
this, [viewProvider](int result) { viewProvider->onFinished(result); });
|
||||
}
|
||||
connLineEditNameTextChanged = connect(ui->lineEditName, &QLineEdit::textChanged,
|
||||
this, &DlgAddPropertyVarSet::onNameChanged);
|
||||
|
||||
@@ -478,9 +495,9 @@ void DlgAddPropertyVarSet::initializeWidgets(ViewProviderVarSet* viewProvider)
|
||||
|
||||
bool DlgAddPropertyVarSet::propertyExists(const std::string& name)
|
||||
{
|
||||
App::Property* prop = varSet->getPropertyByName(name.c_str());
|
||||
return prop && prop->getContainer() == varSet &&
|
||||
!(propertyItem && propertyItem->getFirstProperty() == prop);
|
||||
App::Property* prop = container->getPropertyByName(name.c_str());
|
||||
return prop && prop->getContainer() == container &&
|
||||
!(propertyItem && propertyItem->getFirstProperty() == prop);
|
||||
}
|
||||
|
||||
bool DlgAddPropertyVarSet::isNameValid()
|
||||
@@ -658,7 +675,7 @@ bool DlgAddPropertyVarSet::clearBoundProperty()
|
||||
if (App::Property* prop = propertyItem->getFirstProperty()) {
|
||||
propertyItem->unbind();
|
||||
propertyItem->removeProperty(prop);
|
||||
varSet->removeDynamicProperty(prop->getName());
|
||||
container->removeDynamicProperty(prop->getName());
|
||||
closeTransaction(TransactionOption::Abort);
|
||||
}
|
||||
return valueNeedsReset;
|
||||
@@ -705,7 +722,7 @@ void DlgAddPropertyVarSet::onGroupFinished()
|
||||
std::string doc = ui->lineEditToolTip->text().toStdString();
|
||||
if (App::Property* prop = propertyItem->getFirstProperty();
|
||||
prop && prop->getGroup() != group) {
|
||||
varSet->changeDynamicProperty(prop, group.c_str(), doc.c_str());
|
||||
container->changeDynamicProperty(prop, group.c_str(), doc.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -790,14 +807,14 @@ App::Property* DlgAddPropertyVarSet::createProperty()
|
||||
std::string doc = ui->lineEditToolTip->text().toStdString();
|
||||
|
||||
try {
|
||||
return varSet->addDynamicProperty(type.c_str(), name.c_str(),
|
||||
return container->addDynamicProperty(type.c_str(), name.c_str(),
|
||||
group.c_str(), doc.c_str());
|
||||
}
|
||||
catch (Base::Exception& e) {
|
||||
e.reportException();
|
||||
critical(QObject::tr("Add property"),
|
||||
QObject::tr("Failed to add property to '%1': %2").arg(
|
||||
QString::fromLatin1(varSet->getFullName().c_str()),
|
||||
QString::fromLatin1(container->getFullName().c_str()),
|
||||
QString::fromUtf8(e.what())));
|
||||
return nullptr;
|
||||
}
|
||||
@@ -844,13 +861,16 @@ void DlgAddPropertyVarSet::addDocumentation() {
|
||||
return;
|
||||
}
|
||||
|
||||
varSet->changeDynamicProperty(prop, group.c_str(), doc.c_str());
|
||||
container->changeDynamicProperty(prop, group.c_str(), doc.c_str());
|
||||
}
|
||||
|
||||
void DlgAddPropertyVarSet::accept()
|
||||
{
|
||||
addDocumentation();
|
||||
varSet->ExpressionEngine.execute();
|
||||
auto* object = freecad_cast<App::DocumentObject*>(container);
|
||||
if (object) {
|
||||
object->ExpressionEngine.execute();
|
||||
}
|
||||
closeTransaction(TransactionOption::Commit);
|
||||
std::string group = comboBoxGroup.currentText().toStdString();
|
||||
std::string type = ui->comboBoxType->currentText().toStdString();
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
#include <FCGlobal.h>
|
||||
|
||||
#include <App/VarSet.h>
|
||||
#include <App/PropertyContainer.h>
|
||||
|
||||
#include "propertyeditor/PropertyItem.h"
|
||||
|
||||
@@ -75,6 +75,7 @@ public:
|
||||
|
||||
public:
|
||||
DlgAddPropertyVarSet(QWidget* parent, ViewProviderVarSet* viewProvider);
|
||||
DlgAddPropertyVarSet(QWidget* parent, App::PropertyContainer* container);
|
||||
|
||||
DlgAddPropertyVarSet(const DlgAddPropertyVarSet&) = delete;
|
||||
DlgAddPropertyVarSet(DlgAddPropertyVarSet&&) = delete;
|
||||
@@ -86,7 +87,8 @@ public:
|
||||
void changeEvent(QEvent* e) override;
|
||||
void accept() override;
|
||||
void reject() override;
|
||||
static void populateGroup(EditFinishedComboBox& comboBox, const App::DocumentObject* varSet);
|
||||
static void populateGroup(EditFinishedComboBox& comboBox,
|
||||
const App::PropertyContainer* container);
|
||||
static void setWidgetForLabel(const char* labelName, QWidget* widget, QLayout* layout);
|
||||
|
||||
public Q_SLOTS:
|
||||
@@ -104,6 +106,9 @@ private:
|
||||
Type
|
||||
};
|
||||
|
||||
DlgAddPropertyVarSet(QWidget* parent, App::PropertyContainer* container,
|
||||
ViewProviderVarSet* viewProvider);
|
||||
|
||||
void initializeGroup();
|
||||
|
||||
std::vector<Base::Type> getSupportedTypes();
|
||||
@@ -156,7 +161,7 @@ private:
|
||||
static int findLabelRow(const char* labelName, QFormLayout* layout);
|
||||
|
||||
private:
|
||||
App::VarSet* varSet;
|
||||
App::PropertyContainer* container;
|
||||
std::unique_ptr<Ui_DlgAddPropertyVarSet> ui;
|
||||
|
||||
EditFinishedComboBox comboBoxGroup;
|
||||
|
||||
Reference in New Issue
Block a user