~ci-train-bot/ubuntu-settings-components/ubuntu-settings-components-ubuntu-yakkety-1993

« back to all changes in this revision

Viewing changes to Ubuntu/Settings/Components/StatusIcon.qml

  • Committer: CI bot
  • Author(s): Michał Sawicz
  • Date: 2014-07-01 14:06:24 UTC
  • mfrom: (68.2.8 status-icon)
  • Revision ID: ps-jenkins@lists.canonical.com-20140701140624-4bt800y20nageco4
Add new StatusIcon component.

New run-time dependency: suru-icon-theme. 

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright 2014 Canonical Ltd.
 
3
 *
 
4
 * This program is free software; you can redistribute it and/or modify
 
5
 * it under the terms of the GNU General Public License as published by
 
6
 * the Free Software Foundation; version 3.
 
7
 *
 
8
 * This program is distributed in the hope that it will be useful,
 
9
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
 * GNU General Public License for more details.
 
12
 *
 
13
 * You should have received a copy of the GNU General Public License
 
14
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
15
 */
 
16
 
 
17
import QtQuick 2.0
 
18
 
 
19
Item {
 
20
    id: root
 
21
 
 
22
    /*!
 
23
       The source of the icon to display.
 
24
       \qmlproperty url source
 
25
    */
 
26
    property url source
 
27
 
 
28
    /*!
 
29
       The color that all pixels that originally are of color \l keyColor should take.
 
30
       \qmlproperty color color
 
31
    */
 
32
    property alias color: colorizedImage.keyColorOut
 
33
 
 
34
    /*!
 
35
       The color of the pixels that should be colorized.
 
36
       By default it is set to #808080.
 
37
       \qmlproperty color keyColor
 
38
    */
 
39
    property alias keyColor: colorizedImage.keyColorIn
 
40
 
 
41
    // FIXME: should only be "status", but overriding in settings app doesn't work.
 
42
    property var sets: ["status","apps"]
 
43
 
 
44
    implicitWidth: image.width
 
45
 
 
46
    Image {
 
47
        id: image
 
48
        objectName: "image"
 
49
        anchors { top: parent.top; bottom: parent.bottom }
 
50
        sourceSize.height: height
 
51
 
 
52
        visible: !colorizedImage.active
 
53
 
 
54
        property string iconPath: "/usr/share/icons/suru/%1/scalable/%2.svg"
 
55
        property var icons: {
 
56
            if (String(root.source).match(/^image:\/\/theme/)) {
 
57
                return String(root.source).replace("image://theme/", "").split(",");
 
58
            } else return null;
 
59
        }
 
60
        property int fallback: 0
 
61
        property int setFallback: 0
 
62
 
 
63
        Component.onCompleted: updateSource()
 
64
        onStatusChanged: if (status == Image.Error) bump();
 
65
        onIconsChanged: reset()
 
66
 
 
67
        Connections {
 
68
            target: root
 
69
            onSetsChanged: image.reset()
 
70
        }
 
71
 
 
72
        function reset() {
 
73
            fallback = 0;
 
74
            setFallback = 0;
 
75
 
 
76
            updateSource();
 
77
        }
 
78
 
 
79
        function bump() {
 
80
            if (icons === null) return;
 
81
            if (fallback < icons.length - 1) fallback += 1;
 
82
            else if (setFallback < root.sets.length - 1) {
 
83
                setFallback += 1;
 
84
                fallback = 0;
 
85
            } else {
 
86
                console.warn("Could not load StatusIcon with source \"%1\" and sets %2.".arg(root.source).arg(root.sets));
 
87
                return;
 
88
            }
 
89
 
 
90
            updateSource();
 
91
        }
 
92
 
 
93
        function updateSource() {
 
94
            if (icons === null) {
 
95
                source = root.source;
 
96
            } else {
 
97
                source = (root.sets && root.sets.length > setFallback) && (icons && icons.length > fallback) ?
 
98
                            iconPath.arg(root.sets[setFallback]).arg(icons[fallback]) : "";
 
99
            }
 
100
        }
 
101
    }
 
102
 
 
103
    ShaderEffect {
 
104
        id: colorizedImage
 
105
 
 
106
        anchors.fill: parent
 
107
        visible: active && image.status == Image.Ready
 
108
 
 
109
        // Whether or not a color has been set.
 
110
        property bool active: keyColorOut != Qt.rgba(0.0, 0.0, 0.0, 0.0)
 
111
 
 
112
        property Image source: visible ? image : null
 
113
        property color keyColorOut: Qt.rgba(0.0, 0.0, 0.0, 0.0)
 
114
        property color keyColorIn: "#808080"
 
115
        property real threshold: 0.1
 
116
 
 
117
        fragmentShader: "
 
118
            varying highp vec2 qt_TexCoord0;
 
119
            uniform sampler2D source;
 
120
            uniform highp vec4 keyColorOut;
 
121
            uniform highp vec4 keyColorIn;
 
122
            uniform lowp float threshold;
 
123
            uniform lowp float qt_Opacity;
 
124
            void main() {
 
125
                lowp vec4 sourceColor = texture2D(source, qt_TexCoord0);
 
126
                gl_FragColor = mix(vec4(keyColorOut.rgb, 1.0) * sourceColor.a, sourceColor, step(threshold, distance(sourceColor.rgb / sourceColor.a, keyColorIn.rgb))) * qt_Opacity;
 
127
            }"
 
128
    }
 
129
}