Fix calling multiple time slot VPropertyFormView::dataSubmitted.

--HG--
branch : feature
This commit is contained in:
dismine 2014-08-28 11:17:36 +03:00
parent c48c627682
commit a8a99febf4
9 changed files with 84 additions and 40 deletions

View file

@ -35,6 +35,7 @@
#include "../libs/vpropertyexplorer/plugins/vnumberproperty.h" #include "../libs/vpropertyexplorer/plugins/vnumberproperty.h"
#include "../libs/vpropertyexplorer/plugins/vstringproperty.h" #include "../libs/vpropertyexplorer/plugins/vstringproperty.h"
#include "../libs/vpropertyexplorer/plugins/vpointfproperty.h" #include "../libs/vpropertyexplorer/plugins/vpointfproperty.h"
#include "../libs/vpropertyexplorer/plugins/venumproperty.h"
#include <QDockWidget> #include <QDockWidget>
#include <QHBoxLayout> #include <QHBoxLayout>
@ -138,6 +139,10 @@ void VToolOptionsPropertyBrowser::userChangedData(VProperty *property)
{ {
currentItem->setPos(variant.toPointF()); currentItem->setPos(variant.toPointF());
} }
// else if (id == QLatin1String("list"))
// {
// qDebug()<<prop->data(VProperty::DPC_Data, Qt::DisplayRole);
// }
break; break;
} }
// case VGraphicsSimpleTextItem::Type: // case VGraphicsSimpleTextItem::Type:
@ -206,6 +211,11 @@ void VToolOptionsPropertyBrowser::ShowItemOptions(QGraphicsItem *item)
VPointFProperty* itemPosition = new VPointFProperty(tr("Position")); VPointFProperty* itemPosition = new VPointFProperty(tr("Position"));
itemPosition->setValue(i->pos()); itemPosition->setValue(i->pos());
AddProperty(itemPosition, QLatin1String("position")); AddProperty(itemPosition, QLatin1String("position"));
// VEnumProperty *enumProperty = new VEnumProperty(tr("list"));
// QStringList list = QStringList()<<"a1"<<"a2"<<"a3";
// enumProperty->setLiterals(list);
// AddProperty(enumProperty, QLatin1String("list"));
break; break;
} }
case VGraphicsSimpleTextItem::Type: case VGraphicsSimpleTextItem::Type:

View file

@ -2,14 +2,15 @@
#include "vproperty_p.h" #include "vproperty_p.h"
#include <QComboBox> #include <QComboBox>
#include <QCoreApplication>
using namespace VPE; using namespace VPE;
VEnumProperty::VEnumProperty(const QString& name) VEnumProperty::VEnumProperty(const QString& name)
: VProperty(name, QVariant::Int) : QObject(), VProperty(name, QVariant::Int)
{ {
d_ptr->VariantValue = 0; VProperty::d_ptr->VariantValue = 0;
d_ptr->VariantValue.convert(QVariant::Int); VProperty::d_ptr->VariantValue.convert(QVariant::Int);
} }
@ -19,7 +20,7 @@ QVariant VEnumProperty::data (int column, int role) const
if(EnumerationLiterals.empty()) if(EnumerationLiterals.empty())
return QVariant(); return QVariant();
int tmpIndex = d_ptr->VariantValue.toInt(); int tmpIndex = VProperty::d_ptr->VariantValue.toInt();
if(tmpIndex < 0 || tmpIndex >= EnumerationLiterals.count()) if(tmpIndex < 0 || tmpIndex >= EnumerationLiterals.count())
tmpIndex = 0; tmpIndex = 0;
@ -41,9 +42,12 @@ QWidget* VEnumProperty::createEditor(QWidget * parent, const QStyleOptionViewIte
QComboBox* tmpEditor = new QComboBox(parent); QComboBox* tmpEditor = new QComboBox(parent);
tmpEditor->clear(); tmpEditor->clear();
tmpEditor->addItems(EnumerationLiterals); tmpEditor->addItems(EnumerationLiterals);
tmpEditor->setCurrentIndex(d_ptr->VariantValue.toInt()); tmpEditor->setCurrentIndex(VProperty::d_ptr->VariantValue.toInt());
connect(tmpEditor, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,
&VEnumProperty::currentIndexChanged);
return tmpEditor; VProperty::d_ptr->editor = tmpEditor;
return VProperty::d_ptr->editor;
} }
//! Gets the data from the widget //! Gets the data from the widget
@ -76,7 +80,13 @@ void VEnumProperty::setValue(const QVariant& value)
if(tmpIndex < 0 || tmpIndex >= EnumerationLiterals.count()) if(tmpIndex < 0 || tmpIndex >= EnumerationLiterals.count())
tmpIndex = 0; tmpIndex = 0;
d_ptr->VariantValue.setValue(tmpIndex); VProperty::d_ptr->VariantValue = tmpIndex;
VProperty::d_ptr->VariantValue.convert(QVariant::Int);
if (VProperty::d_ptr->editor != nullptr)
{
setEditorData(VProperty::d_ptr->editor);
}
} }
QString VEnumProperty::type() const QString VEnumProperty::type() const
@ -107,3 +117,10 @@ QStringList VEnumProperty::getSettingKeys() const
{ {
return QStringList("literals"); return QStringList("literals");
} }
void VEnumProperty::currentIndexChanged(int index)
{
Q_UNUSED(index)
UserChangeEvent *event = new UserChangeEvent();
QCoreApplication::postEvent ( VProperty::d_ptr->editor, event );
}

View file

@ -7,8 +7,9 @@
namespace VPE{ namespace VPE{
class VPROPERTYEXPLORERSHARED_EXPORT VEnumProperty : public VProperty class VPROPERTYEXPLORERSHARED_EXPORT VEnumProperty : public QObject, public VProperty
{ {
Q_OBJECT
public: public:
//! Constructor //! Constructor
VEnumProperty(const QString& name); VEnumProperty(const QString& name);
@ -57,6 +58,9 @@ public:
//! Returns the list of keys of the property's settings //! Returns the list of keys of the property's settings
virtual QStringList getSettingKeys() const; virtual QStringList getSettingKeys() const;
public slots:
void currentIndexChanged(int index);
protected: protected:
//! The list of possible options to choose frome //! The list of possible options to choose frome
QStringList EnumerationLiterals; QStringList EnumerationLiterals;

View file

@ -3,6 +3,7 @@
#include <QDoubleSpinBox> #include <QDoubleSpinBox>
#include <QSpinBox> #include <QSpinBox>
#include <QSizePolicy> #include <QSizePolicy>
#include <QCoreApplication>
#include "vproperty_p.h" #include "vproperty_p.h"
@ -13,18 +14,18 @@ const int VIntegerProperty::StandardMin = -1000000;
const int VIntegerProperty::StandardMax = 1000000; const int VIntegerProperty::StandardMax = 1000000;
VIntegerProperty::VIntegerProperty(const QString& name, const QMap<QString, QVariant>& settings) VIntegerProperty::VIntegerProperty(const QString& name, const QMap<QString, QVariant>& settings)
: VProperty(name, QVariant::Int), Min(StandardMin), Max(StandardMax) : QObject(), VProperty(name, QVariant::Int), Min(StandardMin), Max(StandardMax)
{ {
VProperty::setSettings(settings); VProperty::setSettings(settings);
d_ptr->VariantValue.setValue(0); VProperty::d_ptr->VariantValue.setValue(0);
d_ptr->VariantValue.convert(QVariant::Int); VProperty::d_ptr->VariantValue.convert(QVariant::Int);
} }
VIntegerProperty::VIntegerProperty(const QString &name) VIntegerProperty::VIntegerProperty(const QString &name)
: VProperty(name), Min(StandardMin), Max(StandardMax) : QObject(), VProperty(name), Min(StandardMin), Max(StandardMax)
{ {
d_ptr->VariantValue.setValue(0); VProperty::d_ptr->VariantValue.setValue(0);
d_ptr->VariantValue.convert(QVariant::Int); VProperty::d_ptr->VariantValue.convert(QVariant::Int);
} }
//! Returns an editor widget, or NULL if it doesn't supply one //! Returns an editor widget, or NULL if it doesn't supply one
@ -37,10 +38,12 @@ QWidget* VIntegerProperty::createEditor(QWidget * parent, const QStyleOptionView
tmpEditor->setMinimum(Min); tmpEditor->setMinimum(Min);
tmpEditor->setMaximum(Max); tmpEditor->setMaximum(Max);
tmpEditor->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); tmpEditor->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
tmpEditor->setValue(d_ptr->VariantValue.toInt()); tmpEditor->setValue(VProperty::d_ptr->VariantValue.toInt());
connect(tmpEditor, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,
&VIntegerProperty::valueChanged);
d_ptr->editor = tmpEditor; VProperty::d_ptr->editor = tmpEditor;
return d_ptr->editor; return VProperty::d_ptr->editor;
} }
//! Gets the data from the widget //! Gets the data from the widget
@ -92,6 +95,13 @@ VProperty* VIntegerProperty::clone(bool include_children, VProperty* container)
return VProperty::clone(include_children, container ? container : new VIntegerProperty(getName())); return VProperty::clone(include_children, container ? container : new VIntegerProperty(getName()));
} }
void VIntegerProperty::valueChanged(int i)
{
Q_UNUSED(i)
UserChangeEvent *event = new UserChangeEvent();
QCoreApplication::postEvent ( VProperty::d_ptr->editor, event );
}
@ -102,17 +112,17 @@ VDoubleProperty::VDoubleProperty(const QString& name, const QMap<QString, QVaria
: VIntegerProperty(name), Precision(StandardPrecision) : VIntegerProperty(name), Precision(StandardPrecision)
{ {
VProperty::setSettings(settings); VProperty::setSettings(settings);
d_ptr->VariantValue.setValue(0); VProperty::d_ptr->VariantValue.setValue(0);
d_ptr->VariantValue.convert(QVariant::Double); VProperty::d_ptr->VariantValue.convert(QVariant::Double);
d_ptr->PropertyVariantType = QVariant::Double; VProperty::d_ptr->PropertyVariantType = QVariant::Double;
} }
VDoubleProperty::VDoubleProperty(const QString &name) VDoubleProperty::VDoubleProperty(const QString &name)
: VIntegerProperty(name), Precision(StandardPrecision) : VIntegerProperty(name), Precision(StandardPrecision)
{ {
d_ptr->VariantValue.setValue(0); VProperty::d_ptr->VariantValue.setValue(0);
d_ptr->VariantValue.convert(QVariant::Double); VProperty::d_ptr->VariantValue.convert(QVariant::Double);
d_ptr->PropertyVariantType = QVariant::Double; VProperty::d_ptr->PropertyVariantType = QVariant::Double;
} }
//! Returns an editor widget, or NULL if it doesn't supply one //! Returns an editor widget, or NULL if it doesn't supply one
@ -125,10 +135,12 @@ QWidget* VDoubleProperty::createEditor(QWidget * parent, const QStyleOptionViewI
tmpEditor->setMaximum(Max); tmpEditor->setMaximum(Max);
tmpEditor->setDecimals(Precision); tmpEditor->setDecimals(Precision);
tmpEditor->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); tmpEditor->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
tmpEditor->setValue(d_ptr->VariantValue.toDouble()); tmpEditor->setValue(VProperty::d_ptr->VariantValue.toDouble());
connect(tmpEditor, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged), this,
&VIntegerProperty::valueChanged);
d_ptr->editor = tmpEditor; VProperty::d_ptr->editor = tmpEditor;
return d_ptr->editor; return VProperty::d_ptr->editor;
} }
//! Gets the data from the widget //! Gets the data from the widget

View file

@ -8,8 +8,9 @@ namespace VPE {
//! Class for holding an integer property //! Class for holding an integer property
class VPROPERTYEXPLORERSHARED_EXPORT VIntegerProperty : public VProperty class VPROPERTYEXPLORERSHARED_EXPORT VIntegerProperty : public QObject, public VProperty
{ {
Q_OBJECT
public: public:
VIntegerProperty(const QString& name, const QMap<QString, QVariant>& settings); VIntegerProperty(const QString& name, const QMap<QString, QVariant>& settings);
@ -49,7 +50,8 @@ public:
//! \param container If a property is being passed here, no new VProperty is being created but instead it is tried to fill all the data into container. This can also be used when subclassing this function. //! \param container If a property is being passed here, no new VProperty is being created but instead it is tried to fill all the data into container. This can also be used when subclassing this function.
//! \return Returns the newly created property (or container, if it was not NULL) //! \return Returns the newly created property (or container, if it was not NULL)
virtual VProperty* clone(bool include_children = true, VProperty* container = NULL) const; virtual VProperty* clone(bool include_children = true, VProperty* container = NULL) const;
public slots:
void valueChanged(int i);
protected: protected:
int Min, Max; int Min, Max;
@ -61,6 +63,7 @@ protected:
//! Class for holding a double property //! Class for holding a double property
class VPROPERTYEXPLORERSHARED_EXPORT VDoubleProperty : public VIntegerProperty class VPROPERTYEXPLORERSHARED_EXPORT VDoubleProperty : public VIntegerProperty
{ {
Q_OBJECT
public: public:
VDoubleProperty(const QString& name, const QMap<QString, QVariant>& settings); VDoubleProperty(const QString& name, const QMap<QString, QVariant>& settings);

View file

@ -122,8 +122,6 @@ void VPropertyFormView::dataSubmitted(VProperty *property)
if(tmpModel && d_ptr->UpdateEditors) { if(tmpModel && d_ptr->UpdateEditors) {
static_cast<VPropertyFormViewPrivate*>(d_ptr)->IgnoreDataChangedSignal = true; static_cast<VPropertyFormViewPrivate*>(d_ptr)->IgnoreDataChangedSignal = true;
tmpModel->onDataChangedByModel(property); tmpModel->onDataChangedByModel(property);
tmpModel->showDataChangedByEditor(property);
static_cast<VPropertyFormViewPrivate*>(d_ptr)->IgnoreDataChangedSignal = false; static_cast<VPropertyFormViewPrivate*>(d_ptr)->IgnoreDataChangedSignal = false;
} }
} }
@ -171,7 +169,8 @@ void VPropertyFormView::connectPropertyFormWidget(VPropertyFormWidget *widget)
if(!widget) if(!widget)
return; return;
connect(widget, SIGNAL(propertyDataSubmitted(VProperty*)), this, SLOT(dataSubmitted(VProperty*))); connect(widget, &VPropertyFormWidget::propertyDataSubmitted, this, &VPropertyFormView::dataSubmitted,
Qt::UniqueConnection);
QList<VPropertyFormWidget*> tmpList = widget->getChildPropertyFormWidgets(); QList<VPropertyFormWidget*> tmpList = widget->getChildPropertyFormWidgets();
foreach(VPropertyFormWidget* tmpEditorWidget, tmpList) { foreach(VPropertyFormWidget* tmpEditorWidget, tmpList) {

View file

@ -7,6 +7,7 @@
#include <QEvent> #include <QEvent>
#include <QKeyEvent> #include <QKeyEvent>
#include "vproperty.h" #include "vproperty.h"
#include <QDebug>
using namespace VPE; using namespace VPE;
@ -125,10 +126,10 @@ void VPropertyFormWidget::commitData(int row)
tmpEditorWidget.FormWidget->commitData(); tmpEditorWidget.FormWidget->commitData();
else if(tmpEditorWidget.Editor && tmpProperty) { else if(tmpEditorWidget.Editor && tmpProperty) {
QVariant newValue = tmpProperty->getEditorData(tmpEditorWidget.Editor); QVariant newValue = tmpProperty->getEditorData(tmpEditorWidget.Editor);
QVariant oldValue = tmpProperty->data(VProperty::DPC_Data); QVariant oldValue = tmpProperty->data(VProperty::DPC_Data, Qt::EditRole);
if (oldValue != newValue) if (oldValue != newValue)
{ {
tmpProperty->setValue(tmpProperty->getEditorData(tmpEditorWidget.Editor)); tmpProperty->setValue(newValue);
emit propertyDataSubmitted(tmpProperty); emit propertyDataSubmitted(tmpProperty);
} }
} }
@ -205,6 +206,10 @@ bool VPropertyFormWidget::eventFilter(QObject *object, QEvent *event)
event->accept(); event->accept();
return true; return true;
} }
else
{
return QGroupBox::eventFilter(object, event);
}
// Default: // Default:
return false; return false;

View file

@ -230,14 +230,10 @@ void VPropertyModel::onDataChangedByModel(VProperty* property)
if(tmpIndex.isValid()) if(tmpIndex.isValid())
{ {
emit dataChanged(tmpIndex, tmpIndex); emit dataChanged(tmpIndex, tmpIndex);
emit onDataChangedByEditor(property);
} }
} }
void VPropertyModel::showDataChangedByEditor(VProperty *property)
{
emit onDataChangedByEditor(property);
}
const VPropertySet *VPropertyModel::getPropertySet() const const VPropertySet *VPropertyModel::getPropertySet() const
{ {
return d_ptr->Properties; return d_ptr->Properties;

View file

@ -124,8 +124,6 @@ public slots:
//! This function causes the views to update the property //! This function causes the views to update the property
void onDataChangedByModel(VProperty* property); void onDataChangedByModel(VProperty* property);
void showDataChangedByEditor(VProperty* property);
protected: protected:
//! Gets a property by its ModelIndex //! Gets a property by its ModelIndex
virtual QModelIndex getIndexFromProperty(VProperty* property, int column = 0) const; virtual QModelIndex getIndexFromProperty(VProperty* property, int column = 0) const;