diff --git a/src/declarativeimports/core/colorscope.h b/src/declarativeimports/core/colorscope.h --- a/src/declarativeimports/core/colorscope.h +++ b/src/declarativeimports/core/colorscope.h @@ -109,20 +109,26 @@ /// @endcond - ColorScope *findParentScope() const; + ColorScope *findParentScope(); void itemChange(ItemChange change, const ItemChangeData &value) Q_DECL_OVERRIDE; + bool eventFilter(QObject * watched, QEvent * event) override; + Q_SIGNALS: void colorGroupChanged(); void colorsChanged(); void inheritChanged(); private: + void checkColorGroupChanged(); + void setParentScope(ColorScope * parentScope); + bool m_inherit; Plasma::Theme m_theme; Plasma::Theme::ColorGroup m_group; QPointer m_parentScope; - QObject *m_parent; + QObject *const m_parent; + Plasma::Theme::ColorGroup m_actualGroup; static QHash s_attachedScopes; }; diff --git a/src/declarativeimports/core/colorscope.cpp b/src/declarativeimports/core/colorscope.cpp --- a/src/declarativeimports/core/colorscope.cpp +++ b/src/declarativeimports/core/colorscope.cpp @@ -34,11 +34,13 @@ m_parent(parentObject) { connect(&m_theme, &Plasma::Theme::themeChanged, this, &ColorScope::colorsChanged); + connect(this, &ColorScope::colorGroupChanged, this, &ColorScope::colorsChanged); QQuickItem *parentItem = qobject_cast(parentObject); if (parentItem) { - connect(parentItem, &QQuickItem::parentChanged, this, &ColorScope::colorGroupChanged); - connect(parentItem, &QQuickItem::parentChanged, this, &ColorScope::colorsChanged); + connect(parentItem, &QQuickItem::parentChanged, this, &ColorScope::checkColorGroupChanged); + } else if (m_parent) { + m_parent->installEventFilter(this); } } @@ -56,14 +58,41 @@ ColorScope *s = new ColorScope(0, object); s_attachedScopes[object] = s; - + s->m_inherit = true; s->setParent(object); + s->checkColorGroupChanged(); - s->m_inherit = true; return s; } -ColorScope *ColorScope::findParentScope() const +bool ColorScope::eventFilter(QObject* watched, QEvent* event) +{ + Q_ASSERT(watched == m_parent && !qobject_cast(watched)); + if (event->type() == QEvent::ParentChange) { + checkColorGroupChanged(); + } + return QQuickItem::eventFilter(watched, event); +} + +void ColorScope::setParentScope(ColorScope* parentScope) +{ + if (parentScope == m_parentScope) + return; + + if (m_parentScope) { + disconnect(m_parentScope.data(), &ColorScope::colorGroupChanged, + this, &ColorScope::checkColorGroupChanged); + } + + m_parentScope = parentScope; + + if (parentScope) { + connect(parentScope, &ColorScope::colorGroupChanged, + this, &ColorScope::checkColorGroupChanged); + } +} + +ColorScope *ColorScope::findParentScope() { QObject *p = 0; if (m_parent) { @@ -76,37 +105,16 @@ } if (!p || !m_parent) { - if (m_parentScope) { - disconnect(m_parentScope.data(), &ColorScope::colorGroupChanged, - this, &ColorScope::colorGroupChanged); - disconnect(m_parentScope.data(), &ColorScope::colorsChanged, - this, &ColorScope::colorsChanged); - } + setParentScope(nullptr); return 0; } ColorScope *c = qobject_cast(p); if (!c) { c = qmlAttachedProperties(p); } - if (c != m_parentScope) { - if (m_parentScope) { - disconnect(m_parentScope.data(), &ColorScope::colorGroupChanged, - this, &ColorScope::colorGroupChanged); - disconnect(m_parentScope.data(), &ColorScope::colorsChanged, - this, &ColorScope::colorsChanged); - } - if (c) { - connect(c, &ColorScope::colorGroupChanged, - this, &ColorScope::colorGroupChanged); - connect(c, &ColorScope::colorsChanged, - this, &ColorScope::colorsChanged); - } - //HACK - const_cast(this)->m_parentScope = c; - } - + setParentScope(c); return m_parentScope; } @@ -119,19 +127,12 @@ m_group = group; - emit colorGroupChanged(); - emit colorsChanged(); + checkColorGroupChanged(); } Plasma::Theme::ColorGroup ColorScope::colorGroup() const { - if (m_inherit) { - ColorScope *s = findParentScope(); - if (s) { - return s->colorGroup(); - } - } - return m_group; + return m_actualGroup; } QColor ColorScope::textColor() const @@ -181,21 +182,34 @@ } m_inherit = inherit; emit inheritChanged(); - emit colorsChanged(); + checkColorGroupChanged(); } void ColorScope::itemChange(ItemChange change, const ItemChangeData &value) { if (change == QQuickItem::ItemSceneChange) { //we have a window: create the representations if needed if (value.window) { - emit colorGroupChanged(); - emit colorsChanged(); + checkColorGroupChanged(); } } QQuickItem::itemChange(change, value); } +void ColorScope::checkColorGroupChanged() +{ + const auto last = m_actualGroup; + if (m_inherit) { + findParentScope(); + m_actualGroup = m_parentScope ? m_parentScope->colorGroup() : m_group; + } else { + m_actualGroup = m_group; + } + + if (m_actualGroup != last) { + Q_EMIT colorGroupChanged(); + } +} #include "moc_colorscope.cpp"