on xenial help sign in
Improve the appearance and functionality of datetime and session indicators in Unity8 desktop.
06831baLukáš Tinkl
plugins/Utils/CMakeLists.txt+1
@@ -23,6 +23,7 @@ set(QMLPLUGIN_SRC
23 windowscreenshotprovider.cpp
23 windowscreenshotprovider.cpp
24 easingcurve.cpp
24 easingcurve.cpp
25 windowstatestorage.cpp
25 windowstatestorage.cpp
26+ timezoneFormatter.cpp
26 plugin.cpp
27 plugin.cpp
27 )
28 )
28
29
plugins/Utils/plugin.cpp+3
@@ -36,6 +36,7 @@
36#include "windowscreenshotprovider.h"
36#include "windowscreenshotprovider.h"
37#include "windowstatestorage.h"
37#include "windowstatestorage.h"
38#include "constants.h"
38#include "constants.h"
39+#include "timezoneFormatter.h"
39
40
40static QObject *createWindowStateStorage(QQmlEngine *engine, QJSEngine *scriptEngine)
41static QObject *createWindowStateStorage(QQmlEngine *engine, QJSEngine *scriptEngine)
41{
42{
@@ -67,6 +68,8 @@ void UtilsPlugin::registerTypes(const char *uri)
67 qmlRegisterSingletonType<WindowStateStorage>(uri, 0, 1, "WindowStateStorage", createWindowStateStorage);
68 qmlRegisterSingletonType<WindowStateStorage>(uri, 0, 1, "WindowStateStorage", createWindowStateStorage);
68 qmlRegisterType<InputWatcher>(uri, 0, 1, "InputWatcher");
69 qmlRegisterType<InputWatcher>(uri, 0, 1, "InputWatcher");
69 qmlRegisterSingletonType<Constants>(uri, 0, 1, "Constants", createConstants);
70 qmlRegisterSingletonType<Constants>(uri, 0, 1, "Constants", createConstants);
71+ qmlRegisterSingletonType<TimezoneFormatter>(uri, 0, 1, "TimezoneFormatter",
72+ [](QQmlEngine*, QJSEngine*) -> QObject* { return new TimezoneFormatter; });
70 qmlRegisterType<ActiveFocusLogger>(uri, 0, 1, "ActiveFocusLogger");
73 qmlRegisterType<ActiveFocusLogger>(uri, 0, 1, "ActiveFocusLogger");
71}
74}
72
75
plugins/Utils/timezoneFormatter.cppnew file+35
@@ -0,0 +1,35 @@
1+/*
2+ * Copyright 2015 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+#include <QTimeZone>
18+
19+#include "timezoneFormatter.h"
20+
21+TimezoneFormatter::TimezoneFormatter(QObject *parent)
22+ : QObject(parent)
23+{
24+}
25+
26+QString TimezoneFormatter::currentTimeInTimezone(const QVariant &tzId) const
27+{
28+ QTimeZone tz(tzId.toByteArray());
29+ if (tz.isValid()) {
30+ const QDateTime now = QDateTime::currentDateTime().toTimeZone(tz);
31+ // return locale-aware string in the form "day, hh:mm", e.g. "Mon 14:30" or "Mon 1:30 pm"
32+ return QStringLiteral("%1 %2").arg(now.toString("ddd")).arg(now.time().toString(Qt::DefaultLocaleShortDate));
33+ }
34+ return QString();
35+}
plugins/Utils/timezoneFormatter.hnew file+32
@@ -0,0 +1,32 @@
1+/*
2+ * Copyright 2015 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+#ifndef TIMEZONE_FORMATTER_H
18+#define TIMEZONE_FORMATTER_H
19+
20+#include <QObject>
21+
22+class TimezoneFormatter : public QObject
23+{
24+ Q_OBJECT
25+public:
26+ TimezoneFormatter(QObject * parent = nullptr);
27+ ~TimezoneFormatter() = default;
28+
29+ Q_INVOKABLE QString currentTimeInTimezone(const QVariant &tzId) const;
30+};
31+
32+#endif
po/unity8.pot+36−34
@@ -8,7 +8,7 @@ msgid ""
8msgstr ""
8msgstr ""
9"Project-Id-Version: unity8\n"
9"Project-Id-Version: unity8\n"
10"Report-Msgid-Bugs-To: \n"
10"Report-Msgid-Bugs-To: \n"
11−"POT-Creation-Date: 2015-08-25 14:53+0200\n"
11+"POT-Creation-Date: 2015-09-16 00:49+0200\n"
12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14"Language-Team: LANGUAGE <LL@li.org>\n"
14"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,7 +18,7 @@ msgstr ""
18"Content-Transfer-Encoding: 8bit\n"
18"Content-Transfer-Encoding: 8bit\n"
19"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
19"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
20
20
21−#: plugins/LightDM/Greeter.cpp:112
21+#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
23msgstr ""
23msgstr ""
24
24
@@ -134,83 +134,83 @@ msgid_plural "Please wait %1 minutes and then try again…"
134msgstr[0] ""
134msgstr[0] ""
135msgstr[1] ""
135msgstr[1] ""
136
136
137−#: qml/Components/Dialogs.qml:112
137+#: qml/Components/Dialogs.qml:115
138msgctxt "Title: Lock/Log out dialog"
138msgctxt "Title: Lock/Log out dialog"
139msgid "Log out"
139msgid "Log out"
140msgstr ""
140msgstr ""
141
141
142−#: qml/Components/Dialogs.qml:113
142+#: qml/Components/Dialogs.qml:116
143msgid "Are you sure you want to log out?"
143msgid "Are you sure you want to log out?"
144msgstr ""
144msgstr ""
145
145
146−#: qml/Components/Dialogs.qml:115
146+#: qml/Components/Dialogs.qml:118
147msgctxt "Button: Lock the system"
147msgctxt "Button: Lock the system"
148msgid "Lock"
148msgid "Lock"
149msgstr ""
149msgstr ""
150
150
151−#: qml/Components/Dialogs.qml:122
151+#: qml/Components/Dialogs.qml:125
152msgctxt "Button: Log out from the system"
152msgctxt "Button: Log out from the system"
153msgid "Log Out"
153msgid "Log Out"
154msgstr ""
154msgstr ""
155
155
156−#: qml/Components/Dialogs.qml:129 qml/Components/Dialogs.qml:162
156+#: qml/Components/Dialogs.qml:132 qml/Components/Dialogs.qml:165
157−#: qml/Components/Dialogs.qml:221
157+#: qml/Components/Dialogs.qml:224
158msgid "Cancel"
158msgid "Cancel"
159msgstr ""
159msgstr ""
160
160
161−#: qml/Components/Dialogs.qml:141
161+#: qml/Components/Dialogs.qml:144
162msgctxt "Title: Reboot/Shut down dialog"
162msgctxt "Title: Reboot/Shut down dialog"
163msgid "Shut down"
163msgid "Shut down"
164msgstr ""
164msgstr ""
165
165
166−#: qml/Components/Dialogs.qml:142
166+#: qml/Components/Dialogs.qml:145
167msgid "Are you sure you want to shut down?"
167msgid "Are you sure you want to shut down?"
168msgstr ""
168msgstr ""
169
169
170−#: qml/Components/Dialogs.qml:144
170+#: qml/Components/Dialogs.qml:147
171msgctxt "Button: Reboot the system"
171msgctxt "Button: Reboot the system"
172msgid "Reboot"
172msgid "Reboot"
173msgstr ""
173msgstr ""
174
174
175−#: qml/Components/Dialogs.qml:153
175+#: qml/Components/Dialogs.qml:156
176msgctxt "Button: Shut down the system"
176msgctxt "Button: Shut down the system"
177msgid "Shut down"
177msgid "Shut down"
178msgstr ""
178msgstr ""
179
179
180−#: qml/Components/Dialogs.qml:175
180+#: qml/Components/Dialogs.qml:178
181msgctxt "Title: Reboot dialog"
181msgctxt "Title: Reboot dialog"
182msgid "Reboot"
182msgid "Reboot"
183msgstr ""
183msgstr ""
184
184
185−#: qml/Components/Dialogs.qml:176
185+#: qml/Components/Dialogs.qml:179
186msgid "Are you sure you want to reboot?"
186msgid "Are you sure you want to reboot?"
187msgstr ""
187msgstr ""
188
188
189−#: qml/Components/Dialogs.qml:178
189+#: qml/Components/Dialogs.qml:181
190msgid "No"
190msgid "No"
191msgstr ""
191msgstr ""
192
192
193−#: qml/Components/Dialogs.qml:185
193+#: qml/Components/Dialogs.qml:188
194msgid "Yes"
194msgid "Yes"
195msgstr ""
195msgstr ""
196
196
197−#: qml/Components/Dialogs.qml:200
197+#: qml/Components/Dialogs.qml:203
198msgctxt "Title: Power off/Restart dialog"
198msgctxt "Title: Power off/Restart dialog"
199msgid "Power"
199msgid "Power"
200msgstr ""
200msgstr ""
201
201
202−#: qml/Components/Dialogs.qml:201
202+#: qml/Components/Dialogs.qml:204
203msgid ""
203msgid ""
204"Are you sure you would like\n"
204"Are you sure you would like\n"
205"to power off?"
205"to power off?"
206msgstr ""
206msgstr ""
207
207
208−#: qml/Components/Dialogs.qml:203
208+#: qml/Components/Dialogs.qml:206
209msgctxt "Button: Power off the system"
209msgctxt "Button: Power off the system"
210msgid "Power off"
210msgid "Power off"
211msgstr ""
211msgstr ""
212
212
213−#: qml/Components/Dialogs.qml:212
213+#: qml/Components/Dialogs.qml:215
214msgctxt "Button: Restart the system"
214msgctxt "Button: Restart the system"
215msgid "Restart"
215msgid "Restart"
216msgstr ""
216msgstr ""
@@ -271,8 +271,10 @@ msgstr ""
271msgid "Less..."
271msgid "Less..."
272msgstr ""
272msgstr ""
273
273
274−#: qml/Dash/Previews/PreviewCommentInput.qml:61
274+#: qml/Dash/Previews/PreviewCommentInput.qml:68
275−#: qml/Dash/Previews/PreviewRatingInput.qml:169
275+#: qml/Dash/Previews/PreviewRatingInput.qml:174
276+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:148
277+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:205
276msgid "Send"
278msgid "Send"
277msgstr ""
279msgstr ""
278
280
@@ -387,62 +389,62 @@ msgstr ""
387msgid "Conference"
389msgid "Conference"
388msgstr ""
390msgstr ""
389
391
390−#: qml/Panel/Indicators/MenuItemFactory.qml:674
392+#: qml/Panel/Indicators/MenuItemFactory.qml:718
391msgid "Nothing is playing"
393msgid "Nothing is playing"
392msgstr ""
394msgstr ""
393
395
394−#: qml/Panel/Indicators/MenuItemFactory.qml:803
396+#: qml/Panel/Indicators/MenuItemFactory.qml:847
395#, qt-format
397#, qt-format
396msgid "%1 hour"
398msgid "%1 hour"
397msgid_plural "%1 hours"
399msgid_plural "%1 hours"
398msgstr[0] ""
400msgstr[0] ""
399msgstr[1] ""
401msgstr[1] ""
400
402
401−#: qml/Panel/Indicators/MenuItemFactory.qml:807
403+#: qml/Panel/Indicators/MenuItemFactory.qml:851
402#, qt-format
404#, qt-format
403msgid "%1 minute"
405msgid "%1 minute"
404msgid_plural "%1 minutes"
406msgid_plural "%1 minutes"
405msgstr[0] ""
407msgstr[0] ""
406msgstr[1] ""
408msgstr[1] ""
407
409
408−#: qml/Panel/Indicators/MenuItemFactory.qml:812
410+#: qml/Panel/Indicators/MenuItemFactory.qml:856
409#, qt-format
411#, qt-format
410msgid "%1 second"
412msgid "%1 second"
411msgid_plural "%1 seconds"
413msgid_plural "%1 seconds"
412msgstr[0] ""
414msgstr[0] ""
413msgstr[1] ""
415msgstr[1] ""
414
416
415−#: qml/Panel/Indicators/MenuItemFactory.qml:815
417+#: qml/Panel/Indicators/MenuItemFactory.qml:859
416msgid "0 seconds"
418msgid "0 seconds"
417msgstr ""
419msgstr ""
418
420
419#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
421#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
420−#: qml/Panel/Indicators/MenuItemFactory.qml:817
422+#: qml/Panel/Indicators/MenuItemFactory.qml:861
421#, qt-format
423#, qt-format
422msgid "%1 remaining"
424msgid "%1 remaining"
423msgstr ""
425msgstr ""
424
426
425−#: qml/Panel/Indicators/MenuItemFactory.qml:823
427+#: qml/Panel/Indicators/MenuItemFactory.qml:867
426msgid "In queue…"
428msgid "In queue…"
427msgstr ""
429msgstr ""
428
430
429−#: qml/Panel/Indicators/MenuItemFactory.qml:827
431+#: qml/Panel/Indicators/MenuItemFactory.qml:871
430msgid "Downloading"
432msgid "Downloading"
431msgstr ""
433msgstr ""
432
434
433−#: qml/Panel/Indicators/MenuItemFactory.qml:829
435+#: qml/Panel/Indicators/MenuItemFactory.qml:873
434msgid "Paused, tap to resume"
436msgid "Paused, tap to resume"
435msgstr ""
437msgstr ""
436
438
437−#: qml/Panel/Indicators/MenuItemFactory.qml:831
439+#: qml/Panel/Indicators/MenuItemFactory.qml:875
438msgid "Canceled"
440msgid "Canceled"
439msgstr ""
441msgstr ""
440
442
441−#: qml/Panel/Indicators/MenuItemFactory.qml:833
443+#: qml/Panel/Indicators/MenuItemFactory.qml:877
442msgid "Finished"
444msgid "Finished"
443msgstr ""
445msgstr ""
444
446
445−#: qml/Panel/Indicators/MenuItemFactory.qml:835
447+#: qml/Panel/Indicators/MenuItemFactory.qml:879
446msgid "Failed, tap to retry"
448msgid "Failed, tap to retry"
447msgstr ""
449msgstr ""
448
450
qml/Panel/IndicatorItem.qml+1−1
@@ -243,7 +243,7 @@ IndicatorDelegate {
243 return;
243 return;
244 }
244 }
245
245
246− title = rootActionState.title ? rootActionState.title : "";
246+ title = rootActionState.title ? rootActionState.title : rootActionState.accessibleName;
247 leftLabel = rootActionState.leftLabel ? rootActionState.leftLabel : "";
247 leftLabel = rootActionState.leftLabel ? rootActionState.leftLabel : "";
248 rightLabel = rootActionState.rightLabel ? rootActionState.rightLabel : "";
248 rightLabel = rootActionState.rightLabel ? rootActionState.rightLabel : "";
249 icons = rootActionState.icons;
249 icons = rootActionState.icons;
qml/Panel/IndicatorPage.qml+1−1
@@ -23,7 +23,7 @@ IndicatorBase {
23 id: main
23 id: main
24
24
25 //const
25 //const
26− property string title: rootActionState.title
26+ property string title: rootActionState.title || rootActionState.accessibleName // some indicators don't expose a title but only the accessible-desc
27 property alias highlightFollowsCurrentItem : mainMenu.highlightFollowsCurrentItem
27 property alias highlightFollowsCurrentItem : mainMenu.highlightFollowsCurrentItem
28 readonly property alias factory: _factory
28 readonly property alias factory: _factory
29
29
qml/Panel/Indicators/IndicatorDelegate.qml+1−1
@@ -21,5 +21,5 @@ import QtQuick 2.0
21
21
22IndicatorBase {
22IndicatorBase {
23 readonly property bool indicatorVisible: rootActionState.indicatorVisible
23 readonly property bool indicatorVisible: rootActionState.indicatorVisible
24− readonly property string title: rootActionState.title
24+ readonly property string title: rootActionState.title || rootActionState.accessibleName
25}
25}
qml/Panel/Indicators/MenuItemFactory.qml+93−5
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright 2013 Canonical Ltd.
2+ * Copyright 2013,2015 Canonical Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License as published by
5 * it under the terms of the GNU Lesser General Public License as published by
@@ -12,9 +12,6 @@
12 *
12 *
13 * You should have received a copy of the GNU Lesser General Public License
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Nick Dedekind <nick.dedekind@canonical.com>
18 */
15 */
19
16
20import QtQuick 2.0
17import QtQuick 2.0
@@ -23,7 +20,8 @@ import Ubuntu.Settings.Components 0.1
23import QMenuModel 0.1
20import QMenuModel 0.1
24import Utils 0.1 as Utils
21import Utils 0.1 as Utils
25import Ubuntu.Components.ListItems 0.1 as ListItems
22import Ubuntu.Components.ListItems 0.1 as ListItems
26−import Ubuntu.Components 1.1
23+import Ubuntu.Components 1.2
24+import Unity.Session 0.1
27
25
28Item {
26Item {
29 id: menuFactory
27 id: menuFactory
@@ -60,6 +58,12 @@ Item {
60 "unity.widgets.systemsettings.tablet.wifisection" : wifiSection,
58 "unity.widgets.systemsettings.tablet.wifisection" : wifiSection,
61 "unity.widgets.systemsettings.tablet.accesspoint" : accessPoint,
59 "unity.widgets.systemsettings.tablet.accesspoint" : accessPoint,
62 "com.canonical.indicator.network.modeminfoitem" : modeminfoitem,
60 "com.canonical.indicator.network.modeminfoitem" : modeminfoitem,
61+
62+ "com.canonical.indicator.calendar": calendarMenu,
63+ "com.canonical.indicator.location": timezoneMenu,
64+
65+ "indicator.user-menu-item": userMenuItem,
66+ "indicator.guest-menu-item": userMenuItem
63 },
67 },
64 "indicator-messages" : {
68 "indicator-messages" : {
65 "com.canonical.indicator.button" : messagesButtonMenu
69 "com.canonical.indicator.button" : messagesButtonMenu
@@ -422,6 +426,90 @@ Item {
422 }
426 }
423 }
427 }
424
428
429+ Component {
430+ id: userMenuItem
431+
432+ Menus.UserSessionMenu {
433+ objectName: "userSessionMenu"
434+ highlightWhenPressed: false
435+
436+ property QtObject menuData: null
437+ property var menuModel: menuFactory.menuModel
438+ property int menuIndex: -1
439+
440+ name: menuData && menuData.label || "" // label is the user's real name
441+ iconSource: menuData && menuData.icon || ""
442+
443+ // would be better to compare with the logname but sadly the indicator doesn't expose that
444+ active: DBusUnitySessionService.RealName() !== "" ? DBusUnitySessionService.RealName() == name
445+ : DBusUnitySessionService.UserName() == name
446+
447+ onTriggered: {
448+ menuModel.activate(menuIndex);
449+ }
450+ }
451+ }
452+
453+ Component {
454+ id: calendarMenu
455+
456+ Menus.CalendarMenu {
457+ objectName: "calendarMenu"
458+ highlightWhenPressed: false
459+ focus: true
460+ }
461+ }
462+
463+ Component {
464+ id: timezoneMenu
465+
466+ Menus.TimeZoneMenu {
467+ id: tzMenuItem
468+ objectName: "timezoneMenu"
469+
470+ property QtObject menuData: null
471+ property var menuModel: menuFactory.menuModel
472+ property int menuIndex: -1
473+ property var extendedData: menuData && menuData.ext || undefined
474+ readonly property string tz: getExtendedProperty(extendedData, "xCanonicalTimezone", "UTC")
475+ property var updateTimer: Timer {
476+ repeat: true
477+ running: tzMenuItem.visible // only run when we're open
478+ onTriggered: tzMenuItem.time = Utils.TimezoneFormatter.currentTimeInTimezone(tzMenuItem.tz)
479+ }
480+
481+ city: menuData && menuData.label || ""
482+ time: Utils.TimezoneFormatter.currentTimeInTimezone(tz)
483+ enabled: menuData && menuData.sensitive || false
484+
485+ onMenuModelChanged: {
486+ loadAttributes();
487+ }
488+ onMenuIndexChanged: {
489+ loadAttributes();
490+ }
491+ onTriggered: {
492+ tzActionGroup.setLocation.activate(tz);
493+ }
494+
495+ QDBusActionGroup {
496+ id: tzActionGroup
497+ busType: DBus.SessionBus
498+ busName: "com.canonical.indicator.datetime"
499+ objectPath: "/com/canonical/indicator/datetime"
500+
501+ property variant setLocation: action("set-location")
502+
503+ Component.onCompleted: tzActionGroup.start()
504+ }
505+
506+ function loadAttributes() {
507+ if (!menuModel || menuIndex == -1) return;
508+ menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-timezone': 'string'});
509+ }
510+ }
511+ }
512+
425 Component {
513 Component {
426 id: wifiSection;
514 id: wifiSection;
427
515
qml/Panel/Indicators/MessageMenuItemFactory.qml+1−1
@@ -145,7 +145,7 @@ Loader {
145 title: menuData && menuData.label || ""
145 title: menuData && menuData.label || ""
146 time: timeFormatter.timeString
146 time: timeFormatter.timeString
147 body: getExtendedProperty(extendedData, "xCanonicalText", "")
147 body: getExtendedProperty(extendedData, "xCanonicalText", "")
148− replyButtonText: getExtendedProperty(replyActionDescription, "label", "Send")
148+ replyButtonText: getExtendedProperty(replyActionDescription, "label", i18n.tr("Send"))
149 replyHintText: i18n.ctr("Label: Hint in message indicator line edit", "Reply")
149 replyHintText: i18n.ctr("Label: Hint in message indicator line edit", "Reply")
150 // icons
150 // icons
151 avatar: getExtendedProperty(extendedData, "icon", "image://theme/contact")
151 avatar: getExtendedProperty(extendedData, "icon", "image://theme/contact")
qml/Panel/Indicators/client/IndicatorRepresentation.qml+3−1
@@ -26,7 +26,9 @@ import "../.."
26Page {
26Page {
27 id: root
27 id: root
28
28
29− title: indicatorProperties && indicatorProperties.title ? indicatorProperties.title : ""
29+ title: indicatorProperties && indicatorProperties.title ? indicatorProperties.title :
30+ indicatorProperties && indicatorProperties.accessibleName ? indicatorProperties.accessibleName
31+ : ""
30 property variant indicatorProperties
32 property variant indicatorProperties
31
33
32 anchors.fill: parent
34 anchors.fill: parent