diff options
author | Vitaly Fanaskov <vitaly.fanaskov@qt.io> | 2019-08-06 15:47:50 +0200 |
---|---|---|
committer | Vitaly Fanaskov <vitaly.fanaskov@qt.io> | 2020-03-16 14:33:24 +0100 |
commit | 1875ad7f92cad270cc5857d71096a4b46c27c562 (patch) | |
tree | f8bfa68c889ea602e14d017e26030401ae7c1dc9 /src/quick/items/qquickpalettecolorprovider.cpp | |
parent | ea592334fdf12ce6625106c3f06bb57333690942 (diff) |
Introduce new mechanism to manage palette functionality in QML
Main goals of these changes:
1) Add an ability to work with disabled and inactive palettes from QML
2) Eliminate massive code duplication in qtquickcontrols2 module
3) Provide easily extensible architecture for this piece of
functionality
Architectural part.
Palette
It was decided to not change existing QPalette, but add thin wrappers
around it to provide all required functionality. These wrappers are
highly coupled with QPalette class because of using some enum values
from it.
There are two new classes QQuickPalette and QQuickColorGroup.
QQuickPalette class inherits QQuickColorGroup class and represents
Active/All color group. QQuickPalette also provides an access to three
color groups: Active, Inactive, and Disabled.
In order to access colors the special class QQuickPaletteColorProvider
is used. This is a wrapper around QPalette that provides some
convenience functions.
Interface
The private property "palette" should be exposed.
Implementation
All private parts of classes that implement
QQuickAbstractPaletteProvider have to inherit
QQuickPaletteProviderPrivateBase class. This template class implement
all functionality: create palette, resolve dependencies, connect objects
etc. This is important to mention that related data is lazily
allocatable on demand only. Hence, there is no memory overhead for
regular items.
Change-Id: I911424b730451b1ad47f68fd8007953b66eddb28
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'src/quick/items/qquickpalettecolorprovider.cpp')
-rw-r--r-- | src/quick/items/qquickpalettecolorprovider.cpp | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/src/quick/items/qquickpalettecolorprovider.cpp b/src/quick/items/qquickpalettecolorprovider.cpp new file mode 100644 index 0000000000..6808e8843a --- /dev/null +++ b/src/quick/items/qquickpalettecolorprovider.cpp @@ -0,0 +1,149 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtQuick module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "qquickpalettecolorprovider_p.h" + +#include <QtQuick/private/qquickabstractpaletteprovider_p.h> + +QT_BEGIN_NAMESPACE + +static bool notEq(const QPalette &p1, const QPalette &p2) +{ + return p1.resolve() != p2.resolve() || p1 != p2; +} + +static QPalette::ColorGroup adjustCg(QPalette::ColorGroup group) +{ + return group == QPalette::All ? QPalette::Active : group; +} + +class DefaultPalettesProvider : public QQuickAbstractPaletteProvider +{ +public: + QPalette defaultPalette() const override { static QPalette p; return p; } + QPalette parentPalette() const override { return defaultPalette(); } +}; + +static std::default_delete<const QQuickAbstractPaletteProvider> defaultDeleter() { return {}; } + +QQuickPaletteColorProvider::QQuickPaletteColorProvider() + : m_paletteProvider(ProviderPtr(new DefaultPalettesProvider, defaultDeleter())) +{ +} + +const QColor &QQuickPaletteColorProvider::color(QPalette::ColorGroup group, QPalette::ColorRole role) const +{ + return m_resolvedPalette.color(adjustCg(group), role); +} + +bool QQuickPaletteColorProvider::setColor(QPalette::ColorGroup g, QPalette::ColorRole r, QColor c) +{ + m_requestedPalette.value() = m_resolvedPalette; + m_requestedPalette->setColor(g, r, c); + + return inheritPalette(paletteProvider()->parentPalette()); +} + +bool QQuickPaletteColorProvider::resetColor(QPalette::ColorGroup group, QPalette::ColorRole role) +{ + const auto &defaultPalette = paletteProvider()->defaultPalette() ; + const auto &defaultColor = defaultPalette.color(adjustCg(group), role); + + return setColor(group, role, defaultColor); +} + +bool QQuickPaletteColorProvider::fromQPalette(QPalette p) +{ + m_requestedPalette.value() = std::move(p); + return inheritPalette(paletteProvider()->parentPalette()); +} + +QPalette QQuickPaletteColorProvider::palette() const +{ + return m_resolvedPalette; +} + +const QQuickAbstractPaletteProvider *QQuickPaletteColorProvider::paletteProvider() const +{ + Q_ASSERT(m_paletteProvider); + return m_paletteProvider.get(); +} + +void QQuickPaletteColorProvider::setPaletteProvider(const QQuickAbstractPaletteProvider *paletteProvider) +{ + static const auto emptyDeleter = [](auto &&){}; + m_paletteProvider = ProviderPtr(paletteProvider, emptyDeleter); +} + +bool QQuickPaletteColorProvider::copyColorGroup(QPalette::ColorGroup cg, + const QQuickPaletteColorProvider &p) +{ + m_requestedPalette.value() = m_resolvedPalette; + + auto srcPalette = p.palette(); + for (int roleIndex = QPalette::WindowText; roleIndex < QPalette::NColorRoles; ++roleIndex) { + const auto cr = QPalette::ColorRole(roleIndex); + if (srcPalette.isBrushSet(cg, cr)) { + m_requestedPalette->setBrush(cg, cr, srcPalette.brush(cg, cr)); + } + } + + return inheritPalette(paletteProvider()->parentPalette()); +} + +bool QQuickPaletteColorProvider::reset() +{ + return fromQPalette(QPalette()); +} + +bool QQuickPaletteColorProvider::inheritPalette(const QPalette &p) +{ + QPalette parentPalette = m_requestedPalette.isAllocated() ? m_requestedPalette->resolve(p) : p; + parentPalette.resolve(m_requestedPalette.isAllocated() ? m_requestedPalette->resolve() | p.resolve() : p.resolve()); + + auto tmpResolvedPalette = parentPalette.resolve(paletteProvider()->defaultPalette()); + + bool changed = notEq(tmpResolvedPalette, m_resolvedPalette); + if (changed) { + std::swap(tmpResolvedPalette, m_resolvedPalette); + } + + return changed; +} + +QT_END_NAMESPACE |