diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2017-03-10 14:39:49 +0100 |
---|---|---|
committer | Mitch Curtis <mitch.curtis@qt.io> | 2017-07-31 14:01:58 +0000 |
commit | 846a908b73ed3392c3f80a5c425c9ccf3c1e6a04 (patch) | |
tree | 6dcfe7a1623e04499db860dd22a4060573d5a975 /src/imports/controls/imagine/qquickimaginestyle.cpp | |
parent | c065436755aedcb50bca7f5c1977fc8f5dc6b39f (diff) |
Add Imagine style
The Imagine style is based on image assets. The style comes with a
default set of images, but the images can be easily changed by
providing a directory with images using a predefined naming convention.
[ChangeLog][Controls] Added the Imagine style, which is based on
image assets that can be provided using a predefined naming convention.
Task-number: QTPM-517
Change-Id: I550d7dac9a9686d60bec15655ac92dea9f36149c
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src/imports/controls/imagine/qquickimaginestyle.cpp')
-rw-r--r-- | src/imports/controls/imagine/qquickimaginestyle.cpp | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/src/imports/controls/imagine/qquickimaginestyle.cpp b/src/imports/controls/imagine/qquickimaginestyle.cpp new file mode 100644 index 00000000..e103421e --- /dev/null +++ b/src/imports/controls/imagine/qquickimaginestyle.cpp @@ -0,0 +1,147 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** 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 http://www.qt.io/terms-conditions. For further +** information use the contact form at http://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.LGPLv3 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.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 later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qquickimaginestyle_p.h" + +#include <QtCore/qsettings.h> +#include <QtQuickControls2/private/qquickstyle_p.h> + +QT_BEGIN_NAMESPACE + +Q_GLOBAL_STATIC_WITH_ARGS(QString, GlobalPath, (QLatin1String("qrc:/qt-project.org/imports/QtQuick/Controls.2/Imagine/images/"))) + +static const QString ensureSlash(const QString &path) +{ + const QChar slash = QLatin1Char('/'); + return path.endsWith(slash) ? path : path + slash; +} + +QQuickImagineStyle::QQuickImagineStyle(QObject *parent) + : QQuickAttachedObject(parent), + m_explicitPath(false), + m_path(*GlobalPath()) +{ + init(); +} + +QQuickImagineStyle *QQuickImagineStyle::qmlAttachedProperties(QObject *object) +{ + return new QQuickImagineStyle(object); +} + +QString QQuickImagineStyle::path() const +{ + return m_path; // ### TODO: url? +} + +void QQuickImagineStyle::setPath(const QString &path) +{ + QString p = ensureSlash(path); + m_explicitPath = true; + if (m_path == p) + return; + + m_path = p; + propagatePath(); + + emit pathChanged(); +} + +void QQuickImagineStyle::inheritPath(const QString &path) +{ + if (m_explicitPath || m_path == path) + return; + + m_path = path; + propagatePath(); + emit pathChanged(); +} + +void QQuickImagineStyle::propagatePath() +{ + const auto styles = attachedChildren(); + for (QQuickAttachedObject *child : styles) { + QQuickImagineStyle *imagine = qobject_cast<QQuickImagineStyle *>(child); + if (imagine) + imagine->inheritPath(m_path); + } +} + +void QQuickImagineStyle::resetPath() +{ + if (!m_explicitPath) + return; + + m_explicitPath = false; + QQuickImagineStyle *imagine = qobject_cast<QQuickImagineStyle *>(attachedParent()); + inheritPath(imagine ? imagine->path() : *GlobalPath()); +} + +void QQuickImagineStyle::attachedParentChange(QQuickAttachedObject *newParent, QQuickAttachedObject *oldParent) +{ + Q_UNUSED(oldParent); + QQuickImagineStyle *imagine = qobject_cast<QQuickImagineStyle *>(newParent); + if (imagine) + inheritPath(imagine->path()); +} + +static QByteArray resolveSetting(const QByteArray &env, const QSharedPointer<QSettings> &settings, const QString &name) +{ + QByteArray value = qgetenv(env); +#if QT_CONFIG(settings) + if (value.isNull() && !settings.isNull()) + value = settings->value(name).toByteArray(); +#endif + return value; +} + +void QQuickImagineStyle::init() +{ + static bool globalsInitialized = false; + if (!globalsInitialized) { + QSharedPointer<QSettings> settings = QQuickStylePrivate::settings(QStringLiteral("Imagine")); + + QString path = QString::fromUtf8(resolveSetting("QT_QUICK_CONTROLS_IMAGINE_PATH", settings, QStringLiteral("Path"))); + if (!path.isEmpty()) + *GlobalPath() = m_path = ensureSlash(path); + + globalsInitialized = true; + } + + QQuickAttachedObject::init(); // TODO: lazy init? +} + +QT_END_NAMESPACE |