~ubuntu-branches/ubuntu/wily/ubuntu-ui-toolkit/wily-proposed

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/*
 * Copyright 2015 Canonical Ltd.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; version 3.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Authors: Zsombor Egri <zsombor.egri@canonical.com>
 */

#include "ucnamespace.h"
#include "ucdeprecatedtheme.h"
#include "uctheme.h"
#include "listener.h"
#include <QtQml/QQmlComponent>
#include <QtQml/QQmlContext>
#include <QtQml/QQmlInfo>
#include <QtQml/QQmlEngine>

/*!
    \qmltype Theme
    \instantiates UCTheme
    \inqmlmodule Ubuntu.Components 1.1
    \ingroup theming
    \brief The Theme class provides facilities to interact with the current theme.

    A global instance is exposed as the \b Theme context property.

    The theme defines the visual aspect of the Ubuntu components.

    Example changing the current theme:

    \qml
    import QtQuick 2.4
    import Ubuntu.Components 1.2

    Item {
        Button {
            onClicked: Theme.name = "Ubuntu.Components.Themes.Ambiance"
        }
    }
    \endqml

    Example creating a style component:

    \qml
    import QtQuick 2.4
    import Ubuntu.Components 1.2

    StyledItem {
        id: myItem
        style: Theme.createStyleComponent("MyItemStyle.qml", myItem)
    }
    \endqml

    \sa {StyledItem}
*/
UCDeprecatedTheme::UCDeprecatedTheme(QObject *parent)
    : QObject(parent)
{
    m_notes = QHash<QString, bool>();
    connect(&UCTheme::defaultTheme(), &UCTheme::nameChanged,
            this, &UCDeprecatedTheme::nameChanged);
    connect(&UCTheme::defaultTheme(), &UCTheme::paletteChanged,
            this, &UCDeprecatedTheme::paletteChanged);
}

void UCDeprecatedTheme::showDeprecatedNote(QObject *onItem, const char *note)
{
    QQmlContext ctx(QQmlEngine::contextForObject(onItem));
    // No warnings due to deprecated code used in the components themselves
    if (ctx.baseUrl().toString().contains("/Ubuntu/Components/"))
        return;
    // Warnings without a filename are not helpful
    if (ctx.baseUrl().isEmpty())
        return;

    QString noteId(QString("%1.%2").arg(note).arg(onItem->metaObject()->className()));
    if (m_notes.contains(noteId))
        return;
    QByteArray suppressNote = qgetenv("SUPPRESS_DEPRECATED_NOTE");
    if (suppressNote.isEmpty() || suppressNote != "yes") {
        qmlInfo(onItem) << note;
        m_notes.insert(noteId, true);
    }
}

/*!
    \qmlproperty string Theme::name

    The name of the current theme.
*/
QString UCDeprecatedTheme::name()
{
    showDeprecatedNote(this, "Theme.name is deprecated. Use ThemeSettings instead.");
    return UCTheme::defaultTheme().name();
}
void UCDeprecatedTheme::setName(const QString& name)
{
    showDeprecatedNote(this, "Theme.name is deprecated. Use ThemeSettings instead.");
    UCTheme::defaultTheme().setName(name);
}
void UCDeprecatedTheme::resetName()
{
    showDeprecatedNote(this, "Theme.name is deprecated. Use ThemeSettings instead.");
    UCTheme::defaultTheme().resetName();
}

/*!
    \qmlproperty Palette Theme::palette

    The palette of the current theme.
*/
QObject* UCDeprecatedTheme::palette()
{
    showDeprecatedNote(this, "Theme.palette is deprecated. Use ThemeSettings instead.");
    return UCTheme::defaultTheme().palette();
}

/*!
    \qmlmethod Component Theme::createStyleComponent(string styleName, object parent)

    Returns an instance of the style component named \a styleName.
*/
QQmlComponent* UCDeprecatedTheme::createStyleComponent(const QString& styleName, QObject* parent)
{
    showDeprecatedNote(parent, "Theme.createStyleComponent() is deprecated. Use ThemeSettings instead.");
    return UCTheme::defaultTheme().createStyleComponent(styleName, parent, BUILD_VERSION(1, 2));
}

void UCDeprecatedTheme::registerToContext(QQmlContext* context)
{
    UCTheme::defaultTheme().m_engine = context->engine();
    UCTheme::defaultTheme().updateEnginePaths();
    // register deprecated Theme property
    context->setContextProperty("Theme", this);

    ContextPropertyChangeListener *themeChangeListener =
        new ContextPropertyChangeListener(context, "Theme");
    QObject::connect(this, SIGNAL(nameChanged()),
                     themeChangeListener, SLOT(updateContextProperty()));
}