QObjectCompatProperty: Require explicit notify

For QObjectCompatProperty, which allows to do basically anything in its
setter, it is actually easier to manually specify when the change should
become visible. This is in line with manually writing emit calls in the
old property system, and allows the preservation of class invariants.

Change-Id: I585bd3f25d722ca3fd721ead85fe73dbee26c5f6
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
bb10
Fabian Kosmale 2021-02-03 12:02:29 +01:00
parent aa84de1afa
commit 2ffb91ac59
5 changed files with 13 additions and 18 deletions

View File

@ -130,6 +130,7 @@ void QPauseAnimation::setDuration(int msecs)
}
Q_D(QPauseAnimation);
d->duration.setValue(msecs);
d->duration.notify();
}
QBindable<int> QPauseAnimation::bindableDuration()

View File

@ -467,12 +467,7 @@ public:
const bool inWrapper = inBindingWrapper(storage);
if (bd && !inWrapper)
bd->removeBinding();
if constexpr (QTypeTraits::has_operator_equal_v<T>)
if (this->val == t)
return;
this->val = t;
if (!inWrapper)
notify(bd);
}
QPropertyBinding<T> setBinding(const QPropertyBinding<T> &newBinding)

View File

@ -257,10 +257,9 @@ void QTimer::start()
void QTimer::start(int msec)
{
Q_D(QTimer);
d->inter.removeBindingUnlessInWrapper();
d->inter.setValueBypassingBindings(msec);
d->inter.setValue(msec);
start();
d->inter.markDirty();
d->inter.notify();
}
@ -754,9 +753,7 @@ QBindable<bool> QTimer::bindableSingleShot()
void QTimer::setInterval(int msec)
{
Q_D(QTimer);
d->inter.removeBindingUnlessInWrapper();
d->inter.setValueBypassingBindings(msec);
d->inter.setValue(msec);
if (d->id != INV_TIMER) { // create new timer
QObject::killTimer(d->id); // restart timer
d->id = QObject::startTimer(msec, d->type);

View File

@ -930,6 +930,7 @@ void QMovie::setSpeed(int percentSpeed)
if (!d->speed && d->movieState == Running)
d->nextImageTimer.start(nextFrameDelay());
d->speed.setValue(percentSpeed);
d->speed.notify();
}
int QMovie::speed() const

View File

@ -469,12 +469,12 @@ class BindingLoopTester : public QObject
BindingLoopTester() {}
int eagerProp() {return eagerData.value();}
void setEagerProp(int i) { eagerData.setValue(i); }
void setEagerProp(int i) { eagerData.setValue(i); eagerData.notify(); }
QBindable<int> bindableEagerProp() {return QBindable<int>(&eagerData);}
Q_OBJECT_COMPAT_PROPERTY(BindingLoopTester, int, eagerData, &BindingLoopTester::setEagerProp)
int eagerProp2() {return eagerData2.value();}
void setEagerProp2(int i) { eagerData2.setValue(i); }
void setEagerProp2(int i) { eagerData2.setValue(i); eagerData2.notify(); }
QBindable<int> bindableEagerProp2() {return QBindable<int>(&eagerData2);}
Q_OBJECT_COMPAT_PROPERTY(BindingLoopTester, int, eagerData2, &BindingLoopTester::setEagerProp2)
};
@ -536,7 +536,7 @@ public:
#define GEN(N) \
int prop##N() {return propData##N.value();} \
void setProp##N(int i) { propData##N.setValue(i); } \
void setProp##N(int i) { if (i == propData##N) return; propData##N.setValue(i); propData##N.notify(); } \
QBindable<int> bindableProp##N() {return QBindable<int>(&propData##N);} \
Q_OBJECT_COMPAT_PROPERTY(ReallocTester, int, propData##N, &ReallocTester::setProp##N)
GEN(1)
@ -1064,6 +1064,7 @@ public:
if (i < 0)
i = 0;
compatData.setValue(i);
compatData.notify();
emit compatChanged();
}
@ -1390,7 +1391,7 @@ class CompatPropertyTester : public QObject
CompatPropertyTester(QObject *parent = nullptr) : QObject(parent) { }
int prop1() {return prop1Data.value();}
void setProp1(int i) { prop1Data.setValue(i); }
void setProp1(int i) { if (i == prop1Data) return; prop1Data.setValue(i); prop1Data.notify(); }
QBindable<int> bindableProp1() {return QBindable<int>(&prop1Data);}
Q_OBJECT_COMPAT_PROPERTY(CompatPropertyTester, int, prop1Data, &CompatPropertyTester::setProp1)
@ -1421,9 +1422,9 @@ signals:
void prop3Changed();
public:
void setProp1(int val) { prop1Data.setValue(val); emit prop1Changed();}
void setProp2(int val) { prop2Data.setValue(val); emit prop2Changed();}
void setProp3(int val) { prop3Data.setValue(val); emit prop3Changed();}
void setProp1(int val) { prop1Data.setValue(val); prop1Data.notify(); emit prop1Changed();}
void setProp2(int val) { prop2Data.setValue(val); prop2Data.notify(); emit prop2Changed();}
void setProp3(int val) { prop3Data.setValue(val); prop3Data.notify(); emit prop3Changed();}
int prop1() { return prop1Data; }
int prop2() { return prop2Data; }