Fix and unit test QPalette::resolve
The function is setting the brushes correctly in the return value, but without updating the resolve_mask, making it return wrong results in functions like isBrushSet or the debug operator. Added a unit test for the member function, since the class is still mostly untested, and clarified the reference documentation of what the function is supposed to do. Change-Id: Iaa820dc44f095e125f9375cb00da5569986803c6 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
parent
7ef0b575b3
commit
7f34e8b58c
@ -941,7 +941,8 @@ qint64 QPalette::cacheKey() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Returns a new QPalette that has attributes copied from \a other.
|
Returns a new QPalette that is a union of this instance and \a other.
|
||||||
|
Color roles set in this instance take precedence.
|
||||||
*/
|
*/
|
||||||
QPalette QPalette::resolve(const QPalette &other) const
|
QPalette QPalette::resolve(const QPalette &other) const
|
||||||
{
|
{
|
||||||
@ -959,6 +960,7 @@ QPalette QPalette::resolve(const QPalette &other) const
|
|||||||
if (!(data.resolve_mask & (1<<role)))
|
if (!(data.resolve_mask & (1<<role)))
|
||||||
for(int grp = 0; grp < (int)NColorGroups; grp++)
|
for(int grp = 0; grp < (int)NColorGroups; grp++)
|
||||||
palette.d->br[grp][role] = other.d->br[grp][role];
|
palette.d->br[grp][role] = other.d->br[grp][role];
|
||||||
|
palette.data.resolve_mask |= other.data.resolve_mask;
|
||||||
|
|
||||||
return palette;
|
return palette;
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,7 @@ class tst_QPalette : public QObject
|
|||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void roleValues_data();
|
void roleValues_data();
|
||||||
void roleValues();
|
void roleValues();
|
||||||
|
void resolve();
|
||||||
void copySemantics();
|
void copySemantics();
|
||||||
void moveSemantics();
|
void moveSemantics();
|
||||||
void setBrush();
|
void setBrush();
|
||||||
@ -80,6 +81,43 @@ void tst_QPalette::roleValues()
|
|||||||
QCOMPARE(role, value);
|
QCOMPARE(role, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_QPalette::resolve()
|
||||||
|
{
|
||||||
|
QPalette p1;
|
||||||
|
p1.setBrush(QPalette::WindowText, Qt::green);
|
||||||
|
p1.setBrush(QPalette::Button, Qt::green);
|
||||||
|
|
||||||
|
QVERIFY(p1.isBrushSet(QPalette::Active, QPalette::WindowText));
|
||||||
|
QVERIFY(p1.isBrushSet(QPalette::Active, QPalette::Button));
|
||||||
|
|
||||||
|
QPalette p2;
|
||||||
|
p2.setBrush(QPalette::WindowText, Qt::red);
|
||||||
|
|
||||||
|
QVERIFY(p2.isBrushSet(QPalette::Active, QPalette::WindowText));
|
||||||
|
QVERIFY(!p2.isBrushSet(QPalette::Active, QPalette::Button));
|
||||||
|
|
||||||
|
QPalette p1ResolvedTo2 = p1.resolve(p2);
|
||||||
|
// p1ResolvedTo2 gets everything from p1 and nothing copied from p2 because
|
||||||
|
// it already has a WindowText. That is two brushes, and to the same value
|
||||||
|
// as p1.
|
||||||
|
QCOMPARE(p1ResolvedTo2, p1);
|
||||||
|
QVERIFY(p1ResolvedTo2.isBrushSet(QPalette::Active, QPalette::WindowText));
|
||||||
|
QCOMPARE(p1.windowText(), p1ResolvedTo2.windowText());
|
||||||
|
QVERIFY(p1ResolvedTo2.isBrushSet(QPalette::Active, QPalette::Button));
|
||||||
|
QCOMPARE(p1.button(), p1ResolvedTo2.button());
|
||||||
|
|
||||||
|
QPalette p2ResolvedTo1 = p2.resolve(p1);
|
||||||
|
// p2ResolvedTo1 gets the WindowText set, and to the same value as the
|
||||||
|
// original p2, however, Button gets set from p1.
|
||||||
|
QVERIFY(p2ResolvedTo1.isBrushSet(QPalette::Active, QPalette::WindowText));
|
||||||
|
QCOMPARE(p2.windowText(), p2ResolvedTo1.windowText());
|
||||||
|
QVERIFY(p2ResolvedTo1.isBrushSet(QPalette::Active, QPalette::Button));
|
||||||
|
QCOMPARE(p1.button(), p2ResolvedTo1.button());
|
||||||
|
|
||||||
|
QVERIFY(p2ResolvedTo1 != p1);
|
||||||
|
QVERIFY(p2ResolvedTo1 != p2);
|
||||||
|
}
|
||||||
|
|
||||||
void tst_QPalette::copySemantics()
|
void tst_QPalette::copySemantics()
|
||||||
{
|
{
|
||||||
QPalette src(Qt::red), dst;
|
QPalette src(Qt::red), dst;
|
||||||
|
Loading…
Reference in New Issue
Block a user