Gui: cleanup of PR #5516

* instead of breaking encapsulation of PropertyItem apply the attorney idiom
* refactoring of PropertyItemDelegate::createEditor by moving the code to PropertyItem::createPropertyEditorWidget
This commit is contained in:
wmayer
2022-03-01 17:15:41 +01:00
parent 739804b511
commit 5430c986f8
3 changed files with 51 additions and 22 deletions

View File

@@ -91,6 +91,14 @@ PropertyItem* PropertyItemFactory::createPropertyItem (const char* sName) const
}
// ----------------------------------------------------
QVariant PropertyItemAttorney::toString(PropertyItem* item, const QVariant& v)
{
return item->toString(v);
}
// ----------------------------------------------------
Q_DECLARE_METATYPE(Py::Object)
PROPERTYITEM_SOURCE(Gui::PropertyEditor::PropertyItem)
@@ -476,6 +484,22 @@ QVariant PropertyItem::expressionEditorData(QWidget *editor) const
return QVariant();
}
PropertyEditorWidget* PropertyItem::createPropertyEditorWidget(QWidget* parent) const
{
PropertyEditorWidget* editor = new PropertyEditorWidget(parent);
connect(editor, &PropertyEditorWidget::buttonClick, this, [this]() {
const auto &props = this->getPropertyData();
if (!props.empty()
&& props[0]->getName()
&& props[0]->testStatus(App::Property::UserEdit)
&& props[0]->getContainer())
{
props[0]->getContainer()->editProperty(props[0]->getName());
}
});
return editor;
}
QString PropertyItem::propertyName() const
{
if (propName.isEmpty())
@@ -1540,7 +1564,8 @@ void PropertyEditorWidget::setValue(const QVariant& val)
// ---------------------------------------------------------------
VectorListWidget::VectorListWidget(int decimals, QWidget *parent)
:PropertyEditorWidget(parent), decimals(decimals)
: PropertyEditorWidget(parent)
, decimals(decimals)
{
connect(button, SIGNAL(clicked()), this, SLOT(buttonClicked()));
}

View File

@@ -77,6 +77,7 @@ namespace PropertyEditor {
class PropertyItem;
class PropertyModel;
class PropertyEditorWidget;
/**
* The PropertyItemFactory provides methods for the dynamic creation of property items.
@@ -111,6 +112,11 @@ public:
}
};
class PropertyItemAttorney {
public:
static QVariant toString(PropertyItem* item, const QVariant& v);
};
class GuiExport PropertyItem : public QObject, public ExpressionBinding
{
Q_OBJECT
@@ -139,6 +145,8 @@ public:
void setExpressionEditorData(QWidget *editor, const QVariant& data) const;
QVariant expressionEditorData(QWidget *editor) const;
PropertyEditorWidget* createPropertyEditorWidget(QWidget* parent) const;
/**override the bind functions to ensure we issue the propertyBound() call, which is then overloaded by
childs which like to be informed of a binding*/
virtual void bind(const App::Property& prop);
@@ -180,14 +188,13 @@ public:
bool hasAnyExpression() const;
virtual QVariant toString(const QVariant&) const;
protected:
PropertyItem();
virtual QVariant displayName() const;
virtual QVariant decoration(const QVariant&) const;
virtual QVariant toolTip(const App::Property*) const;
virtual QVariant toString(const QVariant&) const;
virtual QVariant value(const App::Property*) const;
virtual void setValue(const QVariant&);
virtual void initialize();
@@ -205,6 +212,8 @@ protected:
int precision;
bool linked;
bool expanded;
friend class PropertyItemAttorney;
};
/**

View File

@@ -182,30 +182,25 @@ QWidget * PropertyItemDelegate::createEditor (QWidget * parent, const QStyleOpti
QWidget* editor;
expressionEditor = 0;
userEditor = nullptr;
if(parentEditor && parentEditor->isBinding())
if (parentEditor && parentEditor->isBinding()) {
expressionEditor = editor = childItem->createExpressionEditor(parent, this, SLOT(valueChanged()));
}
else {
const auto &props = childItem->getPropertyData();
if (props.size() && props[0]->testStatus(App::Property::UserEdit)) {
editor = userEditor = new PropertyEditorWidget(parent);
QObject::connect(userEditor, &PropertyEditorWidget::buttonClick, childItem,
[childItem]() {
const auto &props = childItem->getPropertyData();
if (props.size()
&& props[0]->getName()
&& props[0]->testStatus(App::Property::UserEdit)
&& props[0]->getContainer())
{
props[0]->getContainer()->editProperty(props[0]->getName());
}
});
} else
if (!props.empty() && props[0]->testStatus(App::Property::UserEdit)) {
editor = userEditor = childItem->createPropertyEditorWidget(parent);
}
else {
editor = childItem->createEditor(parent, this, SLOT(valueChanged()));
}
}
if (editor) // Make sure the editor background is painted so the cell content doesn't show through
if (editor) {
// Make sure the editor background is painted so the cell content doesn't show through
editor->setAutoFillBackground(true);
if (editor && childItem->isReadOnly())
}
if (editor && childItem->isReadOnly()) {
editor->setDisabled(true);
}
else if (editor /*&& this->pressed*/) {
// We changed the way editor is activated in PropertyEditor (in response
// of signal activated and clicked), so now we should grab focus
@@ -246,10 +241,10 @@ void PropertyItemDelegate::setEditorData(QWidget *editor, const QModelIndex &ind
QVariant data = index.data(Qt::EditRole);
PropertyItem *childItem = static_cast<PropertyItem*>(index.internalPointer());
editor->blockSignals(true);
if(expressionEditor == editor)
if (expressionEditor == editor)
childItem->setExpressionEditorData(editor, data);
else if (userEditor == editor)
userEditor->setValue(childItem->toString(data));
userEditor->setValue(PropertyItemAttorney::toString(childItem, data));
else
childItem->setEditorData(editor, data);
editor->blockSignals(false);