on xenial help sign in
Merge from trunk
0cfbca3Michael Terry
data/devices.confnew file+30
@@ -0,0 +1,30 @@
1+# This file can hold multiple device configs. Devices are separated by sections.
2+#
3+# SupportedOrientations holds a list of all enabled orientations. A standard
4+# phone will usually have Portrait,Landcape,InvertedLandscape in order to
5+# disable upside down usage.
6+#
7+# PrimaryOrientation gives the orientation the device will start up with
8+# when there is no orientations sensor input available (yet) or lock to
9+# when an application specifies to be locked to PrimaryOrientation.
10+#
11+# The other Orientation settings can be used to re-map the orientations.
12+# A device might be used with different orientations than how the screen
13+# is physically mounted on the hardware.
14+#
15+# Category can be phone, tablet, or desktop. This option determines
16+# whether the side stage is shown (tablet) or not (phone). Using
17+# desktop will load the shell in windowed mode. Note that the user
18+# can override/change this by connecting input hardware or change
19+# user settings.
20+#
21+# Any options not listed will default to the values of the example below.
22+
23+# [devicename]
24+# SupportedOrientations=Portrait,InvertedPortrait,Landscape,InvertedLandscape
25+# PrimaryOrientation=PrimaryOrienation
26+# PortraitOrientation=Portrait
27+# InvertedPortraitOrientation=InvertedPortrait
28+# LandscapeOrientation=Landscape
29+# InvertedLandscapeOrientation=InvertedLandscape
30+# Category=phone
data/unity8-dash.desktop.in−1
@@ -7,4 +7,3 @@ Terminal=false
7Icon=@CMAKE_INSTALL_PREFIX@/@SHELL_APP_DIR@/Dash/unity8-dash.png
7Icon=@CMAKE_INSTALL_PREFIX@/@SHELL_APP_DIR@/Dash/unity8-dash.png
8NoDisplay=true
8NoDisplay=true
9X-Ubuntu-Touch=true
9X-Ubuntu-Touch=true
10−X-Ubuntu-Supported-Orientations=primary
data/unity8.conf+6−10
@@ -44,22 +44,18 @@ pre-start script
44 fi
44 fi
45
45
46 initctl set-env --global MIR_SERVER_PROMPT_FILE=1
46 initctl set-env --global MIR_SERVER_PROMPT_FILE=1
47+
48+ # Disable Qt's stuttering 'touch compression' to fix scrolling smoothness
49+ # issues (LP: #1486341, LP: #1556763). As a bonus, this eliminates most of
50+ # the lag seen in the indicator panel pull-down (LP: #1488327) and also
51+ # reduces lag seen in apps:
52+ initctl set-env --global QML_NO_TOUCH_COMPRESSION=1
47end script
53end script
48
54
49exec ${BINARY:-unity8} $ARGS
55exec ${BINARY:-unity8} $ARGS
50
56
51post-start script
57post-start script
52 initctl emit --no-wait indicator-services-start
58 initctl emit --no-wait indicator-services-start
53−
54− # Disable Qt's stuttering 'touch compression' to fix scrolling smoothness
55− # issues (LP: #1486341). As a bonus, this eliminates most of the
56− # lag seen in the indicator panel pull-down (LP: #1488327) and also
57− # reduces lag seen in apps:
58− initctl set-env --global QML_NO_TOUCH_COMPRESSION=1
59−
60− # For twice the fun and half the latency, try this (Warning: not all
61− # devices are fast enough to keep up smoothly yet)...
62− # initctl set-env MIR_SERVER_NBUFFERS=2
63end script
59end script
64
60
65post-stop script
61post-stop script
debian/changelog+58
@@ -1,3 +1,61 @@
1+unity8 (8.12+16.04.20160427.3-0ubuntu1) xenial; urgency=medium
2+
3+ [ Albert Astals Cid ]
4+ * Add env var to enable js debugging/profiling even if not built on
5+ debug mode
6+ * Better error message if the item does not exist
7+ * CardCreator: Remove ShaderEffectSource (LP: #1544875)
8+ * Compile with Qt 5.6 (LP: #1565632)
9+ * LVWPH: Account for contentHeight not really being "all" of the
10+ content height (LP: #1569976)
11+ * NotificationAudio: We don't need weird "ifdef" for multimedia 5.6 vs
12+ 5.0 roles anymore
13+ * See all/less -> Show all/less (LP: #1349471)
14+ * Stabilize test_superTabToCycleLauncher
15+ * Take into account that sectionItem height can change
16+ * Turn verify intro tryCompareFunction
17+ * forceLayout before calling positionViewAtIndex (LP: #1553475)
18+ * rootObject can be null for a small moment after setSource is called
19+ (LP: #1560501)
20+
21+ [ CI Train Bot ]
22+ * Resync trunk.
23+
24+ [ Daniel van Vugt ]
25+ * Reinstate the touch performance/smoothness fix (LP: #1486341, LP:
26+ #1556763). (LP: #1556763, #1486341)
27+
28+ [ Josh Arenson ]
29+ * Change the color of the activity pulse to blue (LP: #1568082)
30+ * Make scope filter settings button the same color as other foreground
31+ elements (LP: #1563357)
32+
33+ [ Lukáš Tinkl ]
34+ * Drop OOBE wizard autopilot tests
35+ * Fix labels in desktop spread
36+ * Fix upcoming event ETAs falling out of sync (LP: #1557571)
37+ * Hide the close button for dash (LP: #1550056, #1564347)
38+ * Notifications visual update, close button on mouse hover (LP:
39+ #1564343)
40+ * Shell visual update
41+ * Stabilize wizard tests
42+ * Unity8 windows now cascade instead of opening all in the top left
43+ corner (LP: #1513813)
44+
45+ [ Michael Terry ]
46+ * Fix some unreliable test code.
47+ * Ignore Home Key presses when the greeter is up. (LP: #1565818)
48+
49+ [ Michael Zanetti ]
50+ * Drop the rotation lock for the dash (LP: #1465331, #1574165)
51+ * improve the pin lockscreen
52+ * install devices.conf by default
53+
54+ [ Ted Gould ]
55+ * Switch to using uid/pwdent for getting username
56+
57+ -- Michael Terry <michael.terry@canonical.com> Wed, 27 Apr 2016 15:01:28 +0000
58+
1unity8 (8.12+16.04.20160421.1-0ubuntu1) xenial; urgency=medium
59unity8 (8.12+16.04.20160421.1-0ubuntu1) xenial; urgency=medium
2
60
3 [ Daniel d'Andrada ]
61 [ Daniel d'Andrada ]
debian/unity8.install+1
@@ -2,6 +2,7 @@ var/lib/unity8/version
2data/unity8-dash.conf usr/share/upstart/sessions/
2data/unity8-dash.conf usr/share/upstart/sessions/
3data/unity8-filewatcher.conf usr/share/upstart/sessions/
3data/unity8-filewatcher.conf usr/share/upstart/sessions/
4data/unity8.conf usr/share/upstart/sessions/
4data/unity8.conf usr/share/upstart/sessions/
5+data/devices.conf etc/ubuntu/
5usr/bin/unity8
6usr/bin/unity8
6usr/bin/unity8-dash
7usr/bin/unity8-dash
7usr/share/applications/unity8-dash.desktop
8usr/share/applications/unity8-dash.desktop
doc/devices.conf+15
@@ -28,3 +28,18 @@ InvertedPortraitOrientation=InvertedPortrait
28LandscapeOrientation=Landscape
28LandscapeOrientation=Landscape
29InvertedLandscapeOrientation=InvertedLandscape
29InvertedLandscapeOrientation=InvertedLandscape
30Category=phone
30Category=phone
31+
32+# Example for the Nexus 7
33+# This device has the screen mounted in portrait, but we run it as a landscape
34+# device and we want the side stage on it.
35+[flo]
36+PrimaryOrientation=LandscapeOrienation
37+Category=tablet
38+
39+# Example for the Nexus 4
40+# The screen is already mounted the way we want it, so no special config
41+# required. However, we don't want the phone to rotate upside down, so lets
42+# restrict that.
43+[mako]
44+SupportedOrientations=Portrait,Landscape,InvertedLandscape
45+Category=phone
plugins/Dash/CardCreator.js+4−11
@@ -62,7 +62,7 @@ var kBackgroundLoaderCode = 'Loader {\n\
62// %1 is used as anchors of artShapeHolder
62// %1 is used as anchors of artShapeHolder
63// %2 is used as image width
63// %2 is used as image width
64// %3 is used as image height
64// %3 is used as image height
65−// %4 is used for artShapeSource.hideSource and inner Loader visible
65+// %4 is whether the image or the Loader with the UbuntuShape/ProportionalShape should be visible
66// %5 is used as aspect ratio fallback
66// %5 is used as aspect ratio fallback
67// %6 is whether the loader should be asynchronous or not
67// %6 is whether the loader should be asynchronous or not
68// %7 is injected as code to artImage
68// %7 is injected as code to artImage
@@ -84,14 +84,6 @@ var kArtShapeHolderCode = 'Item { \n\
84 objectName: "artShape"; \n\
84 objectName: "artShape"; \n\
85 visible: image.status == Image.Ready; \n\
85 visible: image.status == Image.Ready; \n\
86 readonly property alias image: artImage; \n\
86 readonly property alias image: artImage; \n\
87− ShaderEffectSource { \n\
88− id: artShapeSource; \n\
89− sourceItem: artImage; \n\
90− anchors.centerIn: parent; \n\
91− width: 1; \n\
92− height: 1; \n\
93− hideSource: %4; \n\
94− } \n\
95 Loader { \n\
87 Loader { \n\
96 anchors.fill: parent; \n\
88 anchors.fill: parent; \n\
97 visible: %4; \n\
89 visible: %4; \n\
@@ -99,7 +91,7 @@ var kArtShapeHolderCode = 'Item { \n\
99 Component { \n\
91 Component { \n\
100 id: artShapeShapeComponent; \n\
92 id: artShapeShapeComponent; \n\
101 UbuntuShape { \n\
93 UbuntuShape { \n\
102− source: artShapeSource; \n\
94+ source: artImage; \n\
103 sourceFillMode: UbuntuShape.PreserveAspectCrop; \n\
95 sourceFillMode: UbuntuShape.PreserveAspectCrop; \n\
104 radius: "medium"; \n\
96 radius: "medium"; \n\
105 aspect: { \n\
97 aspect: { \n\
@@ -114,7 +106,7 @@ var kArtShapeHolderCode = 'Item { \n\
114 } \n\
106 } \n\
115 Component { \n\
107 Component { \n\
116 id: artShapeIconComponent; \n\
108 id: artShapeIconComponent; \n\
117− ProportionalShape { source: artShapeSource; aspect: UbuntuShape.DropShadow; } \n\
109+ ProportionalShape { source: artImage; aspect: UbuntuShape.DropShadow; } \n\
118 } \n\
110 } \n\
119 } \n\
111 } \n\
120 readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1; \n\
112 readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1; \n\
@@ -135,6 +127,7 @@ var kArtShapeHolderCode = 'Item { \n\
135 objectName: "artImage"; \n\
127 objectName: "artImage"; \n\
136 source: artShapeLoader.cardArt; \n\
128 source: artShapeLoader.cardArt; \n\
137 asynchronous: %6; \n\
129 asynchronous: %6; \n\
130+ visible: !%4; \n\
138 width: %2; \n\
131 width: %2; \n\
139 height: %3; \n\
132 height: %3; \n\
140 %7 \n\
133 %7 \n\
plugins/Dash/listviewwithpageheader.cpp+29−12
@@ -285,7 +285,7 @@ void ListViewWithPageHeader::setSectionDelegate(QQmlComponent *delegate)
285
285
286 m_sectionDelegate = delegate;
286 m_sectionDelegate = delegate;
287
287
288− m_topSectionItem = getSectionItem(QString());
288+ m_topSectionItem = getSectionItem(QString(), false /*watchGeometry*/);
289 m_topSectionItem->setZ(3);
289 m_topSectionItem->setZ(3);
290 QQuickItemPrivate::get(m_topSectionItem)->setCulled(true);
290 QQuickItemPrivate::get(m_topSectionItem)->setCulled(true);
291 connect(m_topSectionItem, &QQuickItem::heightChanged, this, &ListViewWithPageHeader::stickyHeaderHeightChanged);
291 connect(m_topSectionItem, &QQuickItem::heightChanged, this, &ListViewWithPageHeader::stickyHeaderHeightChanged);
@@ -514,6 +514,11 @@ qreal ListViewWithPageHeader::minYExtent() const
514 return m_minYExtent;
514 return m_minYExtent;
515}
515}
516
516
517+qreal ListViewWithPageHeader::maxYExtent() const
518+{
519+ return height() - contentHeight();
520+}
521+
517void ListViewWithPageHeader::componentComplete()
522void ListViewWithPageHeader::componentComplete()
518{
523{
519 if (m_delegateModel)
524 if (m_delegateModel)
@@ -700,8 +705,10 @@ void ListViewWithPageHeader::reallyReleaseItem(ListItem *listItem)
700
705
701void ListViewWithPageHeader::releaseItem(ListItem *listItem)
706void ListViewWithPageHeader::releaseItem(ListItem *listItem)
702{
707{
703− QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(listItem->m_item);
708+ QQuickItemPrivate::get(listItem->m_item)->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
709+ if (listItem->sectionItem()) {
704− itemPrivate->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
710+ QQuickItemPrivate::get(listItem->sectionItem())->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
711+ }
705 m_itemsToRelease << listItem;
712 m_itemsToRelease << listItem;
706}
713}
707
714
@@ -744,7 +751,7 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(int modelIndex, bool alreadyI
744 return getSectionItem(section);
751 return getSectionItem(section);
745}
752}
746
753
747−QQuickItem *ListViewWithPageHeader::getSectionItem(const QString &sectionText)
754+QQuickItem *ListViewWithPageHeader::getSectionItem(const QString &sectionText, bool watchGeometry)
748{
755{
749 QQuickItem *sectionItem = nullptr;
756 QQuickItem *sectionItem = nullptr;
750
757
@@ -768,7 +775,9 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(const QString &sectionText)
768 }
775 }
769 m_sectionDelegate->completeCreate();
776 m_sectionDelegate->completeCreate();
770
777
771− // TODO attach to sectionItem so we can accomodate to it changing its height
778+ if (watchGeometry) {
779+ QQuickItemPrivate::get(sectionItem)->addItemChangeListener(this, QQuickItemPrivate::Geometry);
780+ }
772
781
773 return sectionItem;
782 return sectionItem;
774}
783}
@@ -1126,15 +1135,23 @@ void ListViewWithPageHeader::contentYAnimationRunningChanged(bool running)
1126 }
1135 }
1127}
1136}
1128
1137
1129−void ListViewWithPageHeader::itemGeometryChanged(QQuickItem * /*item*/, const QRectF &newGeometry, const QRectF &oldGeometry)
1138+void ListViewWithPageHeader::itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry)
1130{
1139{
1131 const qreal heightDiff = newGeometry.height() - oldGeometry.height();
1140 const qreal heightDiff = newGeometry.height() - oldGeometry.height();
1132 if (heightDiff != 0) {
1141 if (heightDiff != 0) {
1133− if (!m_inContentHeightKeepHeaderShown && oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY() && !m_visibleItems.isEmpty()) {
1142+ if (!m_visibleItems.isEmpty()) {
1134 ListItem *firstItem = m_visibleItems.first();
1143 ListItem *firstItem = m_visibleItems.first();
1144+ const auto prevFirstItemY = firstItem->y();
1145+ if (!m_inContentHeightKeepHeaderShown && oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY()) {
1135− firstItem->setY(firstItem->y() - heightDiff);
1146+ firstItem->setY(firstItem->y() - heightDiff);
1147+ } else if (item == firstItem->sectionItem()) {
1148+ firstItem->setY(firstItem->y() + heightDiff);
1149+ }
1150+
1151+ if (firstItem->y() != prevFirstItemY) {
1136− adjustMinYExtent();
1152+ adjustMinYExtent();
1137− layout();
1153+ layout();
1154+ }
1138 }
1155 }
1139 refill();
1156 refill();
1140 adjustMinYExtent();
1157 adjustMinYExtent();
@@ -1186,7 +1203,7 @@ void ListViewWithPageHeader::headerHeightChanged(qreal newHeaderHeight, qreal ol
1186
1203
1187void ListViewWithPageHeader::adjustMinYExtent()
1204void ListViewWithPageHeader::adjustMinYExtent()
1188{
1205{
1189− if (m_visibleItems.isEmpty() || contentHeight() < height()) {
1206+ if (m_visibleItems.isEmpty() || (contentHeight() + m_minYExtent < height())) {
1190 m_minYExtent = 0;
1207 m_minYExtent = 0;
1191 } else {
1208 } else {
1192 qreal nonCreatedHeight = 0;
1209 qreal nonCreatedHeight = 0;
@@ -1368,7 +1385,7 @@ void ListViewWithPageHeader::updatePolish()
1368
1385
1369 m_contentHeightDirty = false;
1386 m_contentHeightDirty = false;
1370 adjustMinYExtent();
1387 adjustMinYExtent();
1371− if (contentHeight < height()) {
1388+ if (contentHeight + m_minYExtent < height()) {
1372 // need this since in the previous call to adjustMinYExtent contentHeight is not set yet
1389 // need this since in the previous call to adjustMinYExtent contentHeight is not set yet
1373 m_minYExtent = 0;
1390 m_minYExtent = 0;
1374 }
1391 }
plugins/Dash/listviewwithpageheader.h+2−1
@@ -115,6 +115,7 @@ protected:
115 void componentComplete() override;
115 void componentComplete() override;
116 void viewportMoved(Qt::Orientations orient) override;
116 void viewportMoved(Qt::Orientations orient) override;
117 qreal minYExtent() const override;
117 qreal minYExtent() const override;
118+ qreal maxYExtent() const override;
118 void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) override;
119 void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) override;
119 void itemImplicitHeightChanged(QQuickItem *item) override;
120 void itemImplicitHeightChanged(QQuickItem *item) override;
120 void updatePolish() override;
121 void updatePolish() override;
@@ -166,7 +167,7 @@ private:
166 void reallyReleaseItem(ListItem *item);
167 void reallyReleaseItem(ListItem *item);
167 void updateWatchedRoles();
168 void updateWatchedRoles();
168 QQuickItem *getSectionItem(int modelIndex, bool alreadyInserted);
169 QQuickItem *getSectionItem(int modelIndex, bool alreadyInserted);
169− QQuickItem *getSectionItem(const QString &sectionText);
170+ QQuickItem *getSectionItem(const QString &sectionText, bool watchGeometry = true);
170 void updateSectionItem(int modelIndex);
171 void updateSectionItem(int modelIndex);
171 void initializeValuesForEmptyList();
172 void initializeValuesForEmptyList();
172
173
plugins/Utils/deviceconfigparser.cpp+8
@@ -23,6 +23,7 @@
23
23
24DeviceConfigParser::DeviceConfigParser(QObject *parent): QObject(parent)
24DeviceConfigParser::DeviceConfigParser(QObject *parent): QObject(parent)
25{
25{
26+ // Local files have highest priority
26 QString path;
27 QString path;
27 Q_FOREACH (const QString &standardPath, QStandardPaths::standardLocations(QStandardPaths::GenericConfigLocation)) {
28 Q_FOREACH (const QString &standardPath, QStandardPaths::standardLocations(QStandardPaths::GenericConfigLocation)) {
28 if (QFileInfo(standardPath + "/devices.conf").exists()) {
29 if (QFileInfo(standardPath + "/devices.conf").exists()) {
@@ -31,9 +32,16 @@ DeviceConfigParser::DeviceConfigParser(QObject *parent): QObject(parent)
31 }
32 }
32 }
33 }
33
34
35+ // Check if there is an override in the device tarball (/system/etc/)
36+ if (path.isEmpty() && QFileInfo::exists("/system/etc/ubuntu/devices.conf")) {
37+ path = "/system/etc/ubuntu/devices.conf";
38+ }
39+
40+ // No higher priority files found. Use standard of /etc/
34 if (path.isEmpty()) {
41 if (path.isEmpty()) {
35 path = "/etc/ubuntu/devices.conf";
42 path = "/etc/ubuntu/devices.conf";
36 }
43 }
44+
37 qDebug() << "Using" << path << "as device configuration file";
45 qDebug() << "Using" << path << "as device configuration file";
38 m_config = new QSettings(path, QSettings::IniFormat, this);
46 m_config = new QSettings(path, QSettings::IniFormat, this);
39}
47}
plugins/Utils/deviceconfigparser.h+1
@@ -25,6 +25,7 @@ class DeviceConfigParser: public QObject
25 Q_OBJECT
25 Q_OBJECT
26 Q_PROPERTY(QString name READ name WRITE setName NOTIFY changed)
26 Q_PROPERTY(QString name READ name WRITE setName NOTIFY changed)
27
27
28+ // NOTE: When changing this properties, also update the examples in docs and data
28 Q_PROPERTY(Qt::ScreenOrientation primaryOrientation READ primaryOrientation NOTIFY changed)
29 Q_PROPERTY(Qt::ScreenOrientation primaryOrientation READ primaryOrientation NOTIFY changed)
29 Q_PROPERTY(Qt::ScreenOrientations supportedOrientations READ supportedOrientations NOTIFY changed)
30 Q_PROPERTY(Qt::ScreenOrientations supportedOrientations READ supportedOrientations NOTIFY changed)
30 Q_PROPERTY(Qt::ScreenOrientation landscapeOrientation READ landscapeOrientation NOTIFY changed)
31 Q_PROPERTY(Qt::ScreenOrientation landscapeOrientation READ landscapeOrientation NOTIFY changed)
po/aa.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:01+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/am.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:01+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ar.po+1−1
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
17"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
18"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
18"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
19−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-27 06:01+0000\n"
20"X-Generator: Launchpad (build 17995)\n"
20"X-Generator: Launchpad (build 17995)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ast.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:01+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/az.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:01+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/be.po+1−1
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
17"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
19−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-27 06:01+0000\n"
20"X-Generator: Launchpad (build 17995)\n"
20"X-Generator: Launchpad (build 17995)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
po/bg.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/bn.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:01+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/br.po+7−7
@@ -8,14 +8,14 @@ msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2016-04-21 13:47+0000\n"
10"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11−"PO-Revision-Date: 2016-04-18 07:33+0000\n"
11+"PO-Revision-Date: 2016-04-27 12:20+0000\n"
12"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
12"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
13"Language-Team: Breton <br@li.org>\n"
13"Language-Team: Breton <br@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-28 05:59+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -189,7 +189,7 @@ msgstr "Ouzhpennañ d'ar sinedoù"
189
189
190#: qml/Dash/FiltersPopover.qml:60
190#: qml/Dash/FiltersPopover.qml:60
191msgid "Refine your results"
191msgid "Refine your results"
192−msgstr ""
192+msgstr "Purañ ho tisoc'hoù"
193
193
194#: qml/Dash/FiltersPopover.qml:69
194#: qml/Dash/FiltersPopover.qml:69
195msgid "Reset"
195msgid "Reset"
@@ -661,7 +661,7 @@ msgstr "Kod da brennañ ar skramm"
661
661
662#: qml/Wizard/Pages/passcode-desktop.qml:56
662#: qml/Wizard/Pages/passcode-desktop.qml:56
663msgid "Enter 4 numbers to setup your passcode"
663msgid "Enter 4 numbers to setup your passcode"
664−msgstr ""
664+msgstr "Skrivit 4 sifr evit lakaat ho kod"
665
665
666#: qml/Wizard/Pages/passcode-desktop.qml:65
666#: qml/Wizard/Pages/passcode-desktop.qml:65
667#: qml/Wizard/Pages/passcode-set.qml:54
667#: qml/Wizard/Pages/passcode-set.qml:54
@@ -674,15 +674,15 @@ msgstr "Kod re verr"
674
674
675#: qml/Wizard/Pages/passcode-desktop.qml:107
675#: qml/Wizard/Pages/passcode-desktop.qml:107
676msgid "Passcodes match"
676msgid "Passcodes match"
677−msgstr ""
677+msgstr "klotañ a ra ar c'hodoù an eil gant egile"
678
678
679#: qml/Wizard/Pages/passcode-desktop.qml:109
679#: qml/Wizard/Pages/passcode-desktop.qml:109
680msgid "Passcodes do not match"
680msgid "Passcodes do not match"
681−msgstr ""
681+msgstr "Ne glot ket ar c'hodoù an eil gant egile"
682
682
683#: qml/Wizard/Pages/passcode-set.qml:62
683#: qml/Wizard/Pages/passcode-set.qml:62
684msgid "Passcode must be 4 characters long"
684msgid "Passcode must be 4 characters long"
685−msgstr ""
685+msgstr "4 arouezenn a rank bezañ ar c'hod"
686
686
687#: qml/Wizard/Pages/password-set.qml:30
687#: qml/Wizard/Pages/password-set.qml:30
688msgid "Lock Screen Password"
688msgid "Lock Screen Password"
po/bs.po+1−1
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-27 06:01+0000\n"
20"X-Generator: Launchpad (build 17995)\n"
20"X-Generator: Launchpad (build 17995)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ca.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ca@valencia.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:03+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ce.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ckb.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:03+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/cs.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
17"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20"Language: cs\n"
20"Language: cs\n"
21
21
po/cy.po+1−1
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=4; plural=n==1 ? 0 : n==2 ? 1 : (n != 8 && n != 11) ? "
17"Plural-Forms: nplurals=4; plural=n==1 ? 0 : n==2 ? 1 : (n != 8 && n != 11) ? "
18"2 : 3;\n"
18"2 : 3;\n"
19−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-27 06:03+0000\n"
20"X-Generator: Launchpad (build 17995)\n"
20"X-Generator: Launchpad (build 17995)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
po/da.po+1−1
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18"Plural-Forms: nplurals=2; plural=n != 1;\n"
18"Plural-Forms: nplurals=2; plural=n != 1;\n"
19−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
20"X-Generator: Launchpad (build 17995)\n"
20"X-Generator: Launchpad (build 17995)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
po/de.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/el.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/en_AU.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:03+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/en_GB.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:03+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/eo.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/es.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/eu.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:01+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/fa.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/fi.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/fo.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/fr.po+4−2
@@ -8,14 +8,14 @@ msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2016-04-21 13:47+0000\n"
10"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11−"PO-Revision-Date: 2016-03-26 13:06+0000\n"
11+"PO-Revision-Date: 2016-04-28 14:49+0000\n"
12"Last-Translator: Jean-Marc <Unknown>\n"
12"Last-Translator: Jean-Marc <Unknown>\n"
13"Language-Team: French <fr@li.org>\n"
13"Language-Team: French <fr@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-29 06:04+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -473,6 +473,8 @@ msgstr "Faites glisser à partir du bord gauche pour ouvrir le lanceur"
473#: qml/Tutorial/TutorialRight.qml:55
473#: qml/Tutorial/TutorialRight.qml:55
474msgid "Push your mouse against the right edge to view your open apps"
474msgid "Push your mouse against the right edge to view your open apps"
475msgstr ""
475msgstr ""
476+"Déplacez votre souris contre le bord droit pour voir vos applications "
477+"ouvertes"
476
478
477#: qml/Tutorial/TutorialRight.qml:56
479#: qml/Tutorial/TutorialRight.qml:56
478msgid "Short or long swipe from the right edge to view your open apps"
480msgid "Short or long swipe from the right edge to view your open apps"
po/ga.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2;\n"
17"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/gd.po+1−1
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
17"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
18"(n > 2 && n < 20) ? 2 : 3;\n"
18"(n > 2 && n < 20) ? 2 : 3;\n"
19−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
20"X-Generator: Launchpad (build 17995)\n"
20"X-Generator: Launchpad (build 17995)\n"
21"Language: gd\n"
21"Language: gd\n"
22
22
po/gl.po+2−2
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -458,7 +458,7 @@ msgstr "Esvare desde o bordo esquerdo para abrir o Iniciador"
458
458
459#: qml/Tutorial/TutorialRight.qml:55
459#: qml/Tutorial/TutorialRight.qml:55
460msgid "Push your mouse against the right edge to view your open apps"
460msgid "Push your mouse against the right edge to view your open apps"
461−msgstr ""
461+msgstr "Empuxe o rato contra o bordo dereito para ver os aplicativos abertos"
462
462
463#: qml/Tutorial/TutorialRight.qml:56
463#: qml/Tutorial/TutorialRight.qml:56
464msgid "Short or long swipe from the right edge to view your open apps"
464msgid "Short or long swipe from the right edge to view your open apps"
po/gv.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : (n == 2 ? 1 : 2);\n"
17"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : (n == 2 ? 1 : 2);\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/he.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/hi.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/hr.po+1−1
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
20"X-Generator: Launchpad (build 17995)\n"
20"X-Generator: Launchpad (build 17995)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
po/hu.po+2−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -462,6 +462,7 @@ msgstr "Csúsztasson balról az indító eléréshez"
462#: qml/Tutorial/TutorialRight.qml:55
462#: qml/Tutorial/TutorialRight.qml:55
463msgid "Push your mouse against the right edge to view your open apps"
463msgid "Push your mouse against the right edge to view your open apps"
464msgstr ""
464msgstr ""
465+"Húzza az egeret a jobb oldalhoz a nyitott alkalmazások megjelenítéséhez"
465
466
466#: qml/Tutorial/TutorialRight.qml:56
467#: qml/Tutorial/TutorialRight.qml:56
467msgid "Short or long swipe from the right edge to view your open apps"
468msgid "Short or long swipe from the right edge to view your open apps"
po/hy.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:01+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ia.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/id.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/is.po+1−1
@@ -17,7 +17,7 @@ msgstr ""
17"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Type: text/plain; charset=UTF-8\n"
18"Content-Transfer-Encoding: 8bit\n"
18"Content-Transfer-Encoding: 8bit\n"
19"Plural-Forms: nplurals=2; plural=n != 1;\n"
19"Plural-Forms: nplurals=2; plural=n != 1;\n"
20−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
20+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
21"X-Generator: Launchpad (build 17995)\n"
21"X-Generator: Launchpad (build 17995)\n"
22"Language: is\n"
22"Language: is\n"
23
23
po/it.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ja.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/km.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/kn.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ko.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ku.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ky.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/lo.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/lt.po+1−1
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"(n%100<10 || n%100>=20) ? 1 : 2;\n"
18"(n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
20"X-Generator: Launchpad (build 17995)\n"
20"X-Generator: Launchpad (build 17995)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
po/lv.po+1−1
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
18"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
20"X-Generator: Launchpad (build 17995)\n"
20"X-Generator: Launchpad (build 17995)\n"
21"Language: lv\n"
21"Language: lv\n"
22
22
po/ml.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/mr.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ms.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/my.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/nb.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ne.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/nl.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/nn.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/oc.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/or.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n!=1;\n"
17"Plural-Forms: nplurals=2; plural=n!=1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/pa.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/pl.po+1−1
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
17"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
18"|| n%100>=20) ? 1 : 2;\n"
18"|| n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
20"X-Generator: Launchpad (build 17995)\n"
20"X-Generator: Launchpad (build 17995)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
po/pt.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/pt_BR.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:03+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ro.po+1−1
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 "
17"Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 "
18"== 0) && (n != 0))) ? 2: 1));\n"
18"== 0) && (n != 0))) ? 2: 1));\n"
19−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
20"X-Generator: Launchpad (build 17995)\n"
20"X-Generator: Launchpad (build 17995)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ru.po+1−1
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
20"X-Generator: Launchpad (build 17995)\n"
20"X-Generator: Launchpad (build 17995)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
po/shn.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=(n == 1) ? 0 : 1;\n"
17"Plural-Forms: nplurals=2; plural=(n == 1) ? 0 : 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/si.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/sk.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n"
17"Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20"Language: sk\n"
20"Language: sk\n"
21
21
po/sl.po+1−1
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
17"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
18"n%100==4 ? 3 : 0);\n"
18"n%100==4 ? 3 : 0);\n"
19−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
20"X-Generator: Launchpad (build 17995)\n"
20"X-Generator: Launchpad (build 17995)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
po/sq.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:01+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20"Language: sq\n"
20"Language: sq\n"
21
21
po/sr.po+1−1
@@ -17,7 +17,7 @@ msgstr ""
17"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
19"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
20−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
20+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
21"X-Generator: Launchpad (build 17995)\n"
21"X-Generator: Launchpad (build 17995)\n"
22"Language: sr\n"
22"Language: sr\n"
23
23
po/sv.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20"Language: sv\n"
20"Language: sv\n"
21
21
po/sw.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:02+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ta.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:03+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20"Language: ta\n"
20"Language: ta\n"
21
21
po/te.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:03+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/th.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:03+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/tr.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:03+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ug.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:03+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/uk.po+1−1
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-27 06:03+0000\n"
20"X-Generator: Launchpad (build 17995)\n"
20"X-Generator: Launchpad (build 17995)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
po/unity8.pot+22−22
@@ -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: 2016-04-21 13:47+0000\n"
11+"POT-Creation-Date: 2016-04-27 15:01+0000\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"
@@ -73,7 +73,7 @@ msgctxt "Button: Log out from the system"
73msgid "Log Out"
73msgid "Log Out"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:219
76+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
77#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
77#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
78#: qml/Wizard/Pages/passcode-set.qml:32
78#: qml/Wizard/Pages/passcode-set.qml:32
79msgid "Cancel"
79msgid "Cancel"
@@ -92,27 +92,27 @@ msgstr ""
92msgid "No"
92msgid "No"
93msgstr ""
93msgstr ""
94
94
95−#: qml/Components/Dialogs.qml:183
95+#: qml/Components/Dialogs.qml:182
96msgid "Yes"
96msgid "Yes"
97msgstr ""
97msgstr ""
98
98
99−#: qml/Components/Dialogs.qml:198
99+#: qml/Components/Dialogs.qml:197
100msgctxt "Title: Power off/Restart dialog"
100msgctxt "Title: Power off/Restart dialog"
101msgid "Power"
101msgid "Power"
102msgstr ""
102msgstr ""
103
103
104−#: qml/Components/Dialogs.qml:199
104+#: qml/Components/Dialogs.qml:198
105msgid ""
105msgid ""
106"Are you sure you would like\n"
106"Are you sure you would like\n"
107"to power off?"
107"to power off?"
108msgstr ""
108msgstr ""
109
109
110−#: qml/Components/Dialogs.qml:201
110+#: qml/Components/Dialogs.qml:200
111msgctxt "Button: Power off the system"
111msgctxt "Button: Power off the system"
112msgid "Power off"
112msgid "Power off"
113msgstr ""
113msgstr ""
114
114
115−#: qml/Components/Dialogs.qml:210
115+#: qml/Components/Dialogs.qml:209
116msgctxt "Button: Restart the system"
116msgctxt "Button: Restart the system"
117msgid "Restart"
117msgid "Restart"
118msgstr ""
118msgstr ""
@@ -187,11 +187,11 @@ msgid "Reset"
187msgstr ""
187msgstr ""
188
188
189#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
189#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
190−msgid "See less"
190+msgid "Show less"
191msgstr ""
191msgstr ""
192
192
193#: qml/Dash/GenericScopeView.qml:570
193#: qml/Dash/GenericScopeView.qml:570
194−msgid "See all"
194+msgid "Show all"
195msgstr ""
195msgstr ""
196
196
197#: qml/Dash/GenericScopeView.qml:627
197#: qml/Dash/GenericScopeView.qml:627
@@ -329,7 +329,7 @@ msgstr ""
329msgid "Sorry, incorrect passcode"
329msgid "Sorry, incorrect passcode"
330msgstr ""
330msgstr ""
331
331
332−#: qml/Notifications/NotificationMenuItemFactory.qml:129
332+#: qml/Notifications/NotificationMenuItemFactory.qml:124
333msgid "Show password"
333msgid "Show password"
334msgstr ""
334msgstr ""
335
335
@@ -341,62 +341,62 @@ msgstr ""
341msgid "Conference"
341msgid "Conference"
342msgstr ""
342msgstr ""
343
343
344−#: qml/Panel/Indicators/MenuItemFactory.qml:761
344+#: qml/Panel/Indicators/MenuItemFactory.qml:762
345msgid "Nothing is playing"
345msgid "Nothing is playing"
346msgstr ""
346msgstr ""
347
347
348−#: qml/Panel/Indicators/MenuItemFactory.qml:890
348+#: qml/Panel/Indicators/MenuItemFactory.qml:891
349#, qt-format
349#, qt-format
350msgid "%1 hour"
350msgid "%1 hour"
351msgid_plural "%1 hours"
351msgid_plural "%1 hours"
352msgstr[0] ""
352msgstr[0] ""
353msgstr[1] ""
353msgstr[1] ""
354
354
355−#: qml/Panel/Indicators/MenuItemFactory.qml:894
355+#: qml/Panel/Indicators/MenuItemFactory.qml:895
356#, qt-format
356#, qt-format
357msgid "%1 minute"
357msgid "%1 minute"
358msgid_plural "%1 minutes"
358msgid_plural "%1 minutes"
359msgstr[0] ""
359msgstr[0] ""
360msgstr[1] ""
360msgstr[1] ""
361
361
362−#: qml/Panel/Indicators/MenuItemFactory.qml:899
362+#: qml/Panel/Indicators/MenuItemFactory.qml:900
363#, qt-format
363#, qt-format
364msgid "%1 second"
364msgid "%1 second"
365msgid_plural "%1 seconds"
365msgid_plural "%1 seconds"
366msgstr[0] ""
366msgstr[0] ""
367msgstr[1] ""
367msgstr[1] ""
368
368
369−#: qml/Panel/Indicators/MenuItemFactory.qml:902
369+#: qml/Panel/Indicators/MenuItemFactory.qml:903
370msgid "0 seconds"
370msgid "0 seconds"
371msgstr ""
371msgstr ""
372
372
373#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
373#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
374−#: qml/Panel/Indicators/MenuItemFactory.qml:904
374+#: qml/Panel/Indicators/MenuItemFactory.qml:905
375#, qt-format
375#, qt-format
376msgid "%1 remaining"
376msgid "%1 remaining"
377msgstr ""
377msgstr ""
378
378
379−#: qml/Panel/Indicators/MenuItemFactory.qml:910
379+#: qml/Panel/Indicators/MenuItemFactory.qml:911
380msgid "In queue…"
380msgid "In queue…"
381msgstr ""
381msgstr ""
382
382
383−#: qml/Panel/Indicators/MenuItemFactory.qml:914
383+#: qml/Panel/Indicators/MenuItemFactory.qml:915
384msgid "Downloading"
384msgid "Downloading"
385msgstr ""
385msgstr ""
386
386
387−#: qml/Panel/Indicators/MenuItemFactory.qml:916
387+#: qml/Panel/Indicators/MenuItemFactory.qml:917
388msgid "Paused, tap to resume"
388msgid "Paused, tap to resume"
389msgstr ""
389msgstr ""
390
390
391−#: qml/Panel/Indicators/MenuItemFactory.qml:918
391+#: qml/Panel/Indicators/MenuItemFactory.qml:919
392msgid "Canceled"
392msgid "Canceled"
393msgstr ""
393msgstr ""
394
394
395−#: qml/Panel/Indicators/MenuItemFactory.qml:920
395+#: qml/Panel/Indicators/MenuItemFactory.qml:921
396msgid "Finished"
396msgid "Finished"
397msgstr ""
397msgstr ""
398
398
399−#: qml/Panel/Indicators/MenuItemFactory.qml:922
399+#: qml/Panel/Indicators/MenuItemFactory.qml:923
400msgid "Failed, tap to retry"
400msgid "Failed, tap to retry"
401msgstr ""
401msgstr ""
402
402
po/ur.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:03+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/uz.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:03+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/vi.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:03+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/wo.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:03+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/xh.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:03+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/zh_CN.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:03+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/zh_HK.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:03+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
po/zh_TW.po+1−1
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-27 06:03+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20"Language: zh_TW\n"
20"Language: zh_TW\n"
21
21
qml/Components/Dialogs.qml−3
@@ -177,7 +177,6 @@ Item {
177 onClicked: {
177 onClicked: {
178 rebootDialog.hide();
178 rebootDialog.hide();
179 }
179 }
180− color: UbuntuColors.lightGrey
181 }
180 }
182 Button {
181 Button {
183 text: i18n.tr("Yes")
182 text: i18n.tr("Yes")
@@ -213,14 +212,12 @@ Item {
213 unitySessionService.reboot();
212 unitySessionService.reboot();
214 powerDialog.hide();
213 powerDialog.hide();
215 }
214 }
216− color: UbuntuColors.lightGrey
217 }
215 }
218 Button {
216 Button {
219 text: i18n.tr("Cancel")
217 text: i18n.tr("Cancel")
220 onClicked: {
218 onClicked: {
221 powerDialog.hide();
219 powerDialog.hide();
222 }
220 }
223− color: UbuntuColors.lightGrey
224 }
221 }
225 }
222 }
226 }
223 }
qml/Components/NotificationAudio.qml+4−7
@@ -15,6 +15,7 @@
15 */
15 */
16
16
17import QtQuick 2.4
17import QtQuick 2.4
18+import QtMultimedia 5.6
18
19
19Item {
20Item {
20 id: root
21 id: root
@@ -30,13 +31,9 @@ Item {
30
31
31 QtObject {
32 QtObject {
32 id: priv
33 id: priv
33− property var audio: {
34+ property var audio: Audio {
34− try {
35+ source: root.source
35− return Qt.createQmlObject("import QtMultimedia 5.6; Audio { source: root.source; audioRole: MediaPlayer.NotificationRole }", priv)
36+ audioRole: MediaPlayer.NotificationRole
36− } catch(err) {
37− console.log("Upstream audioRole enum not available, falling back to old role name.");
38− return Qt.createQmlObject("import QtMultimedia 5.0; Audio { source: root.source; audioRole: MediaPlayer.alert }", priv)
39− }
40 }
37 }
41 }
38 }
42}
39}
qml/Components/PanelState/PanelState.qml+2−1
@@ -22,8 +22,9 @@ QtObject {
22
22
23 property string title: ""
23 property string title: ""
24 property bool buttonsVisible: false
24 property bool buttonsVisible: false
25+ property bool closeButtonShown: true
25 property bool dropShadow: false
26 property bool dropShadow: false
26− property int panelHeight: units.gu(3)
27+ property int panelHeight: 0
27
28
28 signal close()
29 signal close()
29 signal minimize()
30 signal minimize()
qml/Components/PinLockscreen.qml+2−1
@@ -144,12 +144,13 @@ FocusScope {
144
144
145 AbstractButton {
145 AbstractButton {
146 objectName: "backspaceIcon"
146 objectName: "backspaceIcon"
147− anchors { right: parent.right; top: parent.top; bottom: parent.bottom }
147+ anchors { right: parent.right; top: parent.top; bottom: parent.bottom; margins: -units.gu(1) }
148 width: height
148 width: height
149 enabled: root.entryEnabled
149 enabled: root.entryEnabled
150
150
151 Icon {
151 Icon {
152 anchors.fill: parent
152 anchors.fill: parent
153+ anchors.margins: units.gu(1)
153 name: "erase"
154 name: "erase"
154 color: root.foregroundColor
155 color: root.foregroundColor
155 }
156 }
qml/Components/PinPadButton.qml+17−2
@@ -17,7 +17,7 @@
17import QtQuick 2.4
17import QtQuick 2.4
18import Ubuntu.Components 1.3
18import Ubuntu.Components 1.3
19
19
20−AbstractButton {
20+Item {
21 id: root
21 id: root
22 opacity: enabled ? 1 : 0.6
22 opacity: enabled ? 1 : 0.6
23
23
@@ -25,9 +25,11 @@ AbstractButton {
25 property string iconName
25 property string iconName
26 property color foregroundColor: "#000000"
26 property color foregroundColor: "#000000"
27
27
28+ signal clicked();
29+
28 UbuntuShape {
30 UbuntuShape {
29 anchors.fill: parent
31 anchors.fill: parent
30− opacity: root.pressed ? 1 : 0
32+ opacity: mouseArea.pressed ? 1 : 0
31 Behavior on opacity {
33 Behavior on opacity {
32 UbuntuNumberAnimation {}
34 UbuntuNumberAnimation {}
33 }
35 }
@@ -60,4 +62,17 @@ AbstractButton {
60 UbuntuNumberAnimation { duration: UbuntuAnimation.SlowDuration }
62 UbuntuNumberAnimation { duration: UbuntuAnimation.SlowDuration }
61 }
63 }
62 }
64 }
65+
66+ MouseArea {
67+ id: mouseArea
68+ anchors.fill: parent
69+
70+ // Intentionally using onReleased here to increase the robustness against
71+ // sloppy presses. This often happens when entering a pin very quickly and
72+ // the numbers for the pin are far apart.
73+ onReleased: {
74+ Haptics.play();
75+ root.clicked();
76+ }
77+ }
63}
78}
qml/Components/UbuntuShapeForItem.qml+1
@@ -28,6 +28,7 @@ Item {
28
28
29 property alias radius: shape.radius
29 property alias radius: shape.radius
30 property alias image: source.sourceItem
30 property alias image: source.sourceItem
31+ property alias aspect: shape.aspect
31
32
32 ShaderEffectSource {
33 ShaderEffectSource {
33 id: source
34 id: source
qml/Components/WindowControlButtons.qml+8−6
@@ -23,6 +23,7 @@ Row {
23
23
24 // to be set from outside
24 // to be set from outside
25 property bool active: false
25 property bool active: false
26+ property bool closeButtonShown: true
26
27
27 signal close()
28 signal close()
28 signal minimize()
29 signal minimize()
@@ -35,13 +36,14 @@ Row {
35 height: parent.height
36 height: parent.height
36 width: height
37 width: height
37 onClicked: root.close()
38 onClicked: root.close()
39+ visible: root.closeButtonShown
38
40
39 Rectangle {
41 Rectangle {
40 anchors.centerIn: parent
42 anchors.centerIn: parent
41 width: units.gu(2)
43 width: units.gu(2)
42 height: units.gu(2)
44 height: units.gu(2)
43 radius: height / 2
45 radius: height / 2
44− color: "#ed3146"
46+ color: UbuntuColors.red
45 visible: parent.containsMouse
47 visible: parent.containsMouse
46 }
48 }
47 Icon {
49 Icon {
@@ -49,7 +51,7 @@ Row {
49 height: parent.height *.5
51 height: parent.height *.5
50 anchors.centerIn: parent
52 anchors.centerIn: parent
51 source: "graphics/window-close.svg"
53 source: "graphics/window-close.svg"
52− color: root.active ? "white" : "#5d5d5d"
54+ color: root.active ? "white" : UbuntuColors.slate
53 keyColor: "black"
55 keyColor: "black"
54 }
56 }
55 }
57 }
@@ -67,7 +69,7 @@ Row {
67 width: units.gu(2)
69 width: units.gu(2)
68 height: units.gu(2)
70 height: units.gu(2)
69 radius: height / 2
71 radius: height / 2
70− color: "#888888"
72+ color: root.active ? UbuntuColors.graphite : UbuntuColors.ash
71 visible: parent.containsMouse
73 visible: parent.containsMouse
72 }
74 }
73 Icon {
75 Icon {
@@ -75,7 +77,7 @@ Row {
75 height: parent.height *.5
77 height: parent.height *.5
76 anchors.centerIn: parent
78 anchors.centerIn: parent
77 source: "graphics/window-minimize.svg"
79 source: "graphics/window-minimize.svg"
78− color: root.active ? "white" : "#5d5d5d"
80+ color: root.active ? "white" : UbuntuColors.slate
79 keyColor: "black"
81 keyColor: "black"
80 }
82 }
81 }
83 }
@@ -93,7 +95,7 @@ Row {
93 width: units.gu(2)
95 width: units.gu(2)
94 height: units.gu(2)
96 height: units.gu(2)
95 radius: height / 2
97 radius: height / 2
96− color: "#888888"
98+ color: root.active ? UbuntuColors.graphite : UbuntuColors.ash
97 visible: parent.containsMouse
99 visible: parent.containsMouse
98 }
100 }
99 Icon {
101 Icon {
@@ -101,7 +103,7 @@ Row {
101 height: parent.height *.5
103 height: parent.height *.5
102 anchors.centerIn: parent
104 anchors.centerIn: parent
103 source: "graphics/window-maximize.svg"
105 source: "graphics/window-maximize.svg"
104− color: root.active ? "white" : "#5d5d5d"
106+ color: root.active ? "white" : UbuntuColors.slate
105 keyColor: "black"
107 keyColor: "black"
106 }
108 }
107 }
109 }
qml/Dash/Dash.qml+8−8
@@ -293,27 +293,27 @@ Showable {
293 }
293 }
294
294
295 Rectangle {
295 Rectangle {
296− id: orange
296+ id: activityPulse
297 anchors { top: parent.top; bottom: parent.bottom }
297 anchors { top: parent.top; bottom: parent.bottom }
298 width: parent.width / 4
298 width: parent.width / 4
299− color: UbuntuColors.orange
299+ color: theme.palette.normal.activity
300
300
301 SequentialAnimation {
301 SequentialAnimation {
302 running: indicator.visible
302 running: indicator.visible
303 loops: Animation.Infinite
303 loops: Animation.Infinite
304 XAnimator {
304 XAnimator {
305− from: -orange.width / 2
305+ from: -activityPulse.width / 2
306− to: indicator.width - orange.width / 2
306+ to: indicator.width - activityPulse.width / 2
307 duration: UbuntuAnimation.SleepyDuration
307 duration: UbuntuAnimation.SleepyDuration
308 easing.type: Easing.InOutSine
308 easing.type: Easing.InOutSine
309− target: orange
309+ target: activityPulse
310 }
310 }
311 XAnimator {
311 XAnimator {
312− from: indicator.width - orange.width / 2
312+ from: indicator.width - activityPulse.width / 2
313− to: -orange.width / 2
313+ to: -activityPulse.width / 2
314 duration: UbuntuAnimation.SleepyDuration
314 duration: UbuntuAnimation.SleepyDuration
315 easing.type: Easing.InOutSine
315 easing.type: Easing.InOutSine
316− target: orange
316+ target: activityPulse
317 }
317 }
318 }
318 }
319 }
319 }
qml/Dash/DashPageHeader.qml+1−1
@@ -273,7 +273,7 @@ Item {
273 anchors.fill: parent
273 anchors.fill: parent
274 anchors.margins: units.gu(2)
274 anchors.margins: units.gu(2)
275 name: "filters"
275 name: "filters"
276− color: root.activeFiltersCount > 0 ? UbuntuColors.orange : Qt.rgba(0.0, 0.0, 0.0, 0.0)
276+ color: root.activeFiltersCount > 0 ? UbuntuColors.orange : header.config.foregroundColor
277 }
277 }
278
278
279 onClicked: {
279 onClicked: {
qml/Dash/GenericScopeView.qml+2−2
@@ -567,7 +567,7 @@ FocusScope {
567
567
568 Label {
568 Label {
569 id: seeAllLabel
569 id: seeAllLabel
570− text: baseItem.expanded ? i18n.tr("See less") : i18n.tr("See all")
570+ text: baseItem.expanded ? i18n.tr("Show less") : i18n.tr("Show all")
571 anchors {
571 anchors {
572 centerIn: parent
572 centerIn: parent
573 verticalCenterOffset: units.gu(-0.5)
573 verticalCenterOffset: units.gu(-0.5)
@@ -752,7 +752,7 @@ FocusScope {
752
752
753 Label {
753 Label {
754 id: seeLessLabel
754 id: seeLessLabel
755− text: i18n.tr("See less")
755+ text: i18n.tr("Show less")
756 anchors {
756 anchors {
757 centerIn: parent
757 centerIn: parent
758 verticalCenterOffset: units.gu(-0.5)
758 verticalCenterOffset: units.gu(-0.5)
qml/Dash/Previews/Preview.qml+4−1
@@ -105,7 +105,10 @@ Item {
105
105
106 onFocusChanged: if (focus) column.positionViewAtIndex(index, ListView.Contain)
106 onFocusChanged: if (focus) column.positionViewAtIndex(index, ListView.Contain)
107
107
108+ onHeightChanged: if (focus) {
109+ column.forceLayout();
108− onHeightChanged: if (focus) column.positionViewAtIndex(index, ListView.Contain)
110+ column.positionViewAtIndex(index, ListView.Contain)
111+ }
109 }
112 }
110 }
113 }
111 }
114 }
qml/Launcher/Launcher.qml−1
@@ -19,7 +19,6 @@ import "../Components"
19import Ubuntu.Components 1.3
19import Ubuntu.Components 1.3
20import Ubuntu.Gestures 0.1
20import Ubuntu.Gestures 0.1
21import Unity.Launcher 0.1
21import Unity.Launcher 0.1
22−import GlobalShortcut 1.0
23
22
24FocusScope {
23FocusScope {
25 id: root
24 id: root
qml/Launcher/LauncherDelegate.qml+9−11
@@ -164,7 +164,7 @@ Item {
164 }
164 }
165 width: Math.min(root.itemWidth, Math.max(units.gu(2), countLabel.implicitWidth + units.gu(1)))
165 width: Math.min(root.itemWidth, Math.max(units.gu(2), countLabel.implicitWidth + units.gu(1)))
166 height: units.gu(2)
166 height: units.gu(2)
167− backgroundColor: UbuntuColors.orange
167+ backgroundColor: UbuntuColors.green
168 visible: root.countVisible
168 visible: root.countVisible
169 aspect: UbuntuShape.Flat
169 aspect: UbuntuShape.Flat
170
170
@@ -173,9 +173,6 @@ Item {
173 objectName: "countLabel"
173 objectName: "countLabel"
174 text: root.count
174 text: root.count
175 anchors.centerIn: parent
175 anchors.centerIn: parent
176− // FIXME: verticalCenter seems to be off wee bit and QML doesn't have a centerLine
177− // property for Text: https://bugreports.qt-project.org/browse/QTBUG-40479
178− anchors.verticalCenterOffset: -units.dp(.5)
179 width: root.itemWidth - units.gu(1)
176 width: root.itemWidth - units.gu(1)
180 horizontalAlignment: Text.AlignHCenter
177 horizontalAlignment: Text.AlignHCenter
181 elide: Text.ElideRight
178 elide: Text.ElideRight
@@ -190,9 +187,9 @@ Item {
190
187
191 anchors.centerIn: parent
188 anchors.centerIn: parent
192 width: root.itemWidth * .8
189 width: root.itemWidth * .8
193− height: units.gu(1)
190+ height: units.dp(3)
194 visible: root.progress > -1
191 visible: root.progress > -1
195− backgroundColor: UbuntuColors.darkGrey
192+ backgroundColor: "white"
196 borderSource: "none"
193 borderSource: "none"
197
194
198 Item {
195 Item {
@@ -210,7 +207,7 @@ Item {
210 top: parent.top
207 top: parent.top
211 bottom: parent.bottom
208 bottom: parent.bottom
212 }
209 }
213− backgroundColor: "white"
210+ backgroundColor: UbuntuColors.blue
214 borderSource: "none"
211 borderSource: "none"
215 width: progressOverlay.width
212 width: progressOverlay.width
216 }
213 }
@@ -247,18 +244,19 @@ Item {
247 visible: root.itemFocused
244 visible: root.itemFocused
248 }
245 }
249
246
250− Rectangle {
247+ UbuntuShape {
251 objectName: "shortcutHint"
248 objectName: "shortcutHint"
252 anchors.centerIn: parent
249 anchors.centerIn: parent
253− width: units.gu(3)
250+ width: units.gu(2.5)
254 height: width
251 height: width
255− color: "#E0292929"
252+ backgroundColor: "#F2111111"
256 visible: root.shortcutHintShown
253 visible: root.shortcutHintShown
254+ aspect: UbuntuShape.Flat
257 Label {
255 Label {
258 anchors.centerIn: parent
256 anchors.centerIn: parent
259 text: (itemIndex + 1) % 10
257 text: (itemIndex + 1) % 10
260 color: "white"
258 color: "white"
261− font.weight: Font.DemiBold
259+ font.weight: Font.Light
262 }
260 }
263 }
261 }
264 }
262 }
qml/Launcher/LauncherPanel.qml+25−13
@@ -16,16 +16,14 @@
16
16
17import QtQuick 2.4
17import QtQuick 2.4
18import Ubuntu.Components 1.3
18import Ubuntu.Components 1.3
19−import Ubuntu.Components.ListItems 1.3 as ListItems
20import Unity.Launcher 0.1
19import Unity.Launcher 0.1
21import Ubuntu.Components.Popups 1.3
20import Ubuntu.Components.Popups 1.3
22−import GlobalShortcut 1.0
23import "../Components/ListItems"
21import "../Components/ListItems"
24import "../Components/"
22import "../Components/"
25
23
26Rectangle {
24Rectangle {
27 id: root
25 id: root
28− color: "#E0292929"
26+ color: "#F2111111"
29
27
30 rotation: inverted ? 180 : 0
28 rotation: inverted ? 180 : 0
31
29
@@ -634,9 +632,10 @@ Rectangle {
634 id: quickListShape
632 id: quickListShape
635 objectName: "quickListShape"
633 objectName: "quickListShape"
636 anchors.fill: quickList
634 anchors.fill: quickList
637− opacity: quickList.state === "open" ? 0.8 : 0
635+ opacity: quickList.state === "open" ? 0.95 : 0
638 visible: opacity > 0
636 visible: opacity > 0
639 rotation: root.rotation
637 rotation: root.rotation
638+ aspect: UbuntuShape.Flat
640
639
641 Behavior on opacity {
640 Behavior on opacity {
642 UbuntuNumberAnimation {}
641 UbuntuNumberAnimation {}
@@ -697,7 +696,7 @@ Rectangle {
697 Rectangle {
696 Rectangle {
698 id: quickList
697 id: quickList
699 objectName: "quickList"
698 objectName: "quickList"
700− color: "#f5f5f5"
699+ color: theme.palette.normal.background
701 // Because we're setting left/right anchors depending on orientation, it will break the
700 // Because we're setting left/right anchors depending on orientation, it will break the
702 // width setting after rotating twice. This makes sure we also re-apply width on rotation
701 // width setting after rotating twice. This makes sure we also re-apply width on rotation
703 width: root.inverted ? units.gu(30) : units.gu(30)
702 width: root.inverted ? units.gu(30) : units.gu(30)
@@ -768,14 +767,10 @@ Rectangle {
768 quickList.state = "open";
767 quickList.state = "open";
769 }
768 }
770
769
771− StyledItem {
770+ Item {
772 width: parent.width
771 width: parent.width
773 height: quickListColumn.height
772 height: quickListColumn.height
774
773
775− theme: ThemeSettings {
776− name: "Ubuntu.Components.Themes.Ambiance"
777− }
778−
779 Column {
774 Column {
780 id: quickListColumn
775 id: quickListColumn
781 width: parent.width
776 width: parent.width
@@ -785,11 +780,28 @@ Rectangle {
785 id: popoverRepeater
780 id: popoverRepeater
786 model: quickList.model
781 model: quickList.model
787
782
788− ListItems.Standard {
783+ ListItem {
789 objectName: "quickListEntry" + index
784 objectName: "quickListEntry" + index
790− text: (model.clickable ? "" : "<b>") + model.label + (model.clickable ? "" : "</b>")
791− highlightWhenPressed: model.clickable
792 selected: index === quickList.selectedIndex
785 selected: index === quickList.selectedIndex
786+ height: label.implicitHeight + label.anchors.topMargin + label.anchors.bottomMargin
787+ color: model.clickable ? (selected ? theme.palette.highlighted.background : "transparent") : theme.palette.disabled.background
788+ highlightColor: !model.clickable ? quickList.color : undefined // make disabled items visually unclickable
789+ divider.colorFrom: UbuntuColors.inkstone
790+ divider.colorTo: UbuntuColors.inkstone
791+
792+ Label {
793+ id: label
794+ anchors.fill: parent
795+ anchors.leftMargin: units.gu(3) // 2 GU for checkmark, 3 GU total
796+ anchors.rightMargin: units.gu(2)
797+ anchors.topMargin: units.gu(2)
798+ anchors.bottomMargin: units.gu(2)
799+ verticalAlignment: Label.AlignVCenter
800+ text: model.label
801+ fontSize: index == 0 ? "medium" : "small"
802+ font.weight: index == 0 ? Font.Medium : Font.Light
803+ color: model.clickable ? theme.palette.normal.backgroundText : theme.palette.disabled.backgroundText
804+ }
793
805
794 onClicked: {
806 onClicked: {
795 if (!model.clickable) {
807 if (!model.clickable) {
qml/Launcher/graphics/quicklist_tooltip@30.png

Binary file not shown.

qml/Notifications/Notification.qml+129−119
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013, 2015 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 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 General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -36,44 +36,40 @@ StyledItem {
36 property var type
36 property var type
37 property var hints
37 property var hints
38 property var notification
38 property var notification
39− property color color
39+ property color color: theme.palette.normal.background
40 property bool fullscreen: false
40 property bool fullscreen: false
41 property int maxHeight
41 property int maxHeight
42− property int margins
42+ property int margins: units.gu(1)
43− readonly property bool draggable: (type === Notification.SnapDecision && state === "contracted") || type === Notification.Interactive || type === Notification.Ephemeral
43+
44− readonly property bool darkOnBright: inverseMode || type === Notification.SnapDecision
44+ readonly property real defaultOpacity: 1.0
45− readonly property color sdLightGrey: "#eaeaea"
46− readonly property real contentSpacing: units.gu(2)
47− readonly property bool canBeClosed: type === Notification.Ephemeral
48 property bool hasMouse
45 property bool hasMouse
49− property bool inverseMode
50 property url background: ""
46 property url background: ""
51
47
52 objectName: "background"
48 objectName: "background"
53− implicitHeight: type !== Notification.PlaceHolder ? (fullscreen ? maxHeight : outterColumn.height - shapedBack.anchors.topMargin + contentSpacing * 2) : 0
49+ implicitHeight: type !== Notification.PlaceHolder ? (fullscreen ? maxHeight : outterColumn.height + shapedBack.anchors.topMargin + margins * 2) : 0
54
50
55− color: (type === Notification.Confirmation && notificationList.useModal && !greeter.shown) || darkOnBright ? sdLightGrey : Qt.rgba(0.132, 0.117, 0.109, 0.97)
56− opacity: 1 - (x / notification.width) // FIXME: non-zero initially because of LP: #1354406 workaround, we want this to start at 0 upon creation eventually
51+ // FIXME: non-zero initially because of LP: #1354406 workaround, we want this to start at 0 upon creation eventually
52+ opacity: defaultOpacity - Math.abs(x / notification.width)
57
53
58 theme: ThemeSettings {
54 theme: ThemeSettings {
59− name: darkOnBright ? "Ubuntu.Components.Themes.Ambiance" : "Ubuntu.Components.Themes.SuruDark"
55+ name: "Ubuntu.Components.Themes.Ambiance"
60 }
56 }
61
57
62− state: {
58+ readonly property bool expanded: {
63− var result = "";
59+ var result = false;
64
60
65− if (type == Notification.SnapDecision) {
61+ if (type === Notification.SnapDecision) {
66− if (ListView.view.currentIndex == index) {
62+ if (ListView.view.currentIndex === index) {
67− result = "expanded";
63+ result = true;
68 } else {
64 } else {
69 if (ListView.view.count > 2) {
65 if (ListView.view.count > 2) {
70− if (ListView.view.currentIndex == -1 && index == 1) {
66+ if (ListView.view.currentIndex === -1 && index == 1) {
71− result = "expanded";
67+ result = true;
72 } else {
68 } else {
73− result = "contracted";
69+ result = false;
74 }
70 }
75 } else {
71 } else {
76− result = "expanded";
72+ result = true;
77 }
73 }
78 }
74 }
79 }
75 }
@@ -90,72 +86,66 @@ StyledItem {
90 Component.onCompleted: {
86 Component.onCompleted: {
91 // Turn on screen as needed (Powerd.Notification means the screen
87 // Turn on screen as needed (Powerd.Notification means the screen
92 // stays on for a shorter amount of time)
88 // stays on for a shorter amount of time)
93− if (type == Notification.SnapDecision) {
89+ if (type === Notification.SnapDecision) {
94 Powerd.setStatus(Powerd.On, Powerd.SnapDecision);
90 Powerd.setStatus(Powerd.On, Powerd.SnapDecision);
95− } else if (type != Notification.Confirmation) {
91+ } else if (type !== Notification.Confirmation) {
96 Powerd.setStatus(Powerd.On, Powerd.Notification);
92 Powerd.setStatus(Powerd.On, Powerd.Notification);
97 }
93 }
98
94
99 // FIXME: using onCompleted because of LP: #1354406 workaround, has to be onOpacityChanged really
95 // FIXME: using onCompleted because of LP: #1354406 workaround, has to be onOpacityChanged really
100− if (opacity == 1.0 && hints["suppress-sound"] !== "true" && sound.source !== "") {
96+ if (opacity == defaultOpacity && hints["suppress-sound"] !== "true" && sound.source !== "") {
101 sound.play();
97 sound.play();
102 }
98 }
103 }
99 }
104
100
105− Behavior on x {
101+ function closeNotification() {
106− id: normalXBehavior
102+ if (notification.actions.count > 1) { // perform the "reject" action
107−
103+ notification.notification.invokeAction(notification.actions.data(1, ActionModel.RoleActionId));
108− enabled: draggable
109− UbuntuNumberAnimation {
110− duration: UbuntuAnimation.FastDuration
111− easing.type: Easing.OutBounce
112 }
104 }
105+ notification.notification.close();
106+ }
107+
108+ Behavior on x {
109+ UbuntuNumberAnimation { easing.type: Easing.OutBounce }
113 }
110 }
114
111
115 onHintsChanged: {
112 onHintsChanged: {
116− if (type === Notification.Confirmation && opacity == 1.0 && hints["suppress-sound"] !== "true" && sound.source !== "") {
113+ if (type === Notification.Confirmation && opacity == defaultOpacity && hints["suppress-sound"] !== "true" && sound.source !== "") {
117 sound.play();
114 sound.play();
118 }
115 }
119 }
116 }
120
117
121 Behavior on height {
118 Behavior on height {
122− id: normalHeightBehavior
123−
124− //enabled: menuItemFactory.progress == 1
125− enabled: true
126 UbuntuNumberAnimation {
119 UbuntuNumberAnimation {
127 duration: UbuntuAnimation.SnapDuration
120 duration: UbuntuAnimation.SnapDuration
128 }
121 }
129 }
122 }
130
123
131− states:[
124+ visible: type !== Notification.PlaceHolder
132− State {
133− name: "contracted"
134− PropertyChanges {target: notification; height: units.gu(10)}
135− },
136− State {
137− name: "expanded"
138− PropertyChanges {target: notification; height: implicitHeight}
139− }
140− ]
141−
142− clip: fullscreen ? false : true
143
125
144− visible: type != Notification.PlaceHolder
126+ BorderImage {
127+ anchors {
128+ fill: contents
129+ margins: shapedBack.visible ? -units.gu(1) : -units.gu(1.5)
130+ }
131+ source: "../Stages/graphics/dropshadow2gu.sci"
132+ opacity: notification.opacity * 0.5
133+ enabled: !fullscreen
134+ }
145
135
146 UbuntuShape {
136 UbuntuShape {
147 id: shapedBack
137 id: shapedBack
138+ objectName: "shapedBack"
148
139
149 visible: !fullscreen
140 visible: !fullscreen
150 anchors {
141 anchors {
151 fill: parent
142 fill: parent
152 leftMargin: notification.margins
143 leftMargin: notification.margins
153 rightMargin: notification.margins
144 rightMargin: notification.margins
154− topMargin: type === Notification.Confirmation ? units.gu(.5) : 0
145+ topMargin: index == 0 ? notification.margins : 0
155 }
146 }
156 backgroundColor: parent.color
147 backgroundColor: parent.color
157− opacity: parent.opacity
158− radius: "medium"
148+ radius: "small"
159 aspect: UbuntuShape.Flat
149 aspect: UbuntuShape.Flat
160 }
150 }
161
151
@@ -165,12 +155,11 @@ StyledItem {
165 visible: fullscreen
155 visible: fullscreen
166 anchors.fill: parent
156 anchors.fill: parent
167 color: parent.color
157 color: parent.color
168− opacity: parent.opacity
169 }
158 }
170
159
171 onXChanged: {
160 onXChanged: {
172− if (draggable && notification.x > 0.75 * notification.width) {
161+ if (Math.abs(notification.x) > 0.75 * notification.width) {
173− notification.notification.close()
162+ closeNotification();
174 }
163 }
175 }
164 }
176
165
@@ -210,22 +199,21 @@ StyledItem {
210 anchors.fill: parent
199 anchors.fill: parent
211 objectName: "interactiveArea"
200 objectName: "interactiveArea"
212
201
213− drag.target: draggable ? notification : undefined
202+ drag.target: notification
214 drag.axis: Drag.XAxis
203 drag.axis: Drag.XAxis
215− drag.minimumX: 0
204+ drag.minimumX: -notification.width
216 drag.maximumX: notification.width
205 drag.maximumX: notification.width
206+ hoverEnabled: true
217
207
218 onClicked: {
208 onClicked: {
219− if (notification.type == Notification.Interactive) {
209+ if (notification.type === Notification.Interactive) {
220 notification.notification.invokeAction(actionRepeater.itemAt(0).actionId)
210 notification.notification.invokeAction(actionRepeater.itemAt(0).actionId)
221− } else if (hasMouse && canBeClosed) {
222− notification.notification.close()
223 } else {
211 } else {
224 notificationList.currentIndex = index;
212 notificationList.currentIndex = index;
225 }
213 }
226 }
214 }
227 onReleased: {
215 onReleased: {
228− if (notification.x < notification.width / 2) {
216+ if (Math.abs(notification.x) < notification.width / 2) {
229 notification.x = 0
217 notification.x = 0
230 } else {
218 } else {
231 notification.x = notification.width
219 notification.x = notification.width
@@ -233,44 +221,61 @@ StyledItem {
233 }
221 }
234 }
222 }
235
223
224+ NotificationButton {
225+ objectName: "closeButton"
226+ width: units.gu(2)
227+ height: width
228+ radius: width / 2
229+ visible: hasMouse && (containsMouse || interactiveArea.containsMouse)
230+ iconName: "close"
231+ outline: false
232+ hoverEnabled: true
233+ color: theme.palette.normal.negative
234+ anchors.horizontalCenter: parent.left
235+ anchors.horizontalCenterOffset: notification.parent.state === "narrow" ? notification.margins / 2 : 0
236+ anchors.verticalCenter: parent.top
237+ anchors.verticalCenterOffset: notification.parent.state === "narrow" ? notification.margins / 2 : 0
238+
239+ onClicked: closeNotification();
240+ }
241+
236 Column {
242 Column {
237 id: outterColumn
243 id: outterColumn
244+ objectName: "outterColumn"
238
245
239 anchors {
246 anchors {
240 left: parent.left
247 left: parent.left
241 right: parent.right
248 right: parent.right
242 top: parent.top
249 top: parent.top
243− margins: 0
250+ margins: !fullscreen ? notification.margins : 0
244− topMargin: fullscreen ? 0 : type === Notification.Confirmation ? units.gu(1) : units.gu(2)
245 }
251 }
246
252
247− spacing: type === Notification.Confirmation ? units.gu(1) : units.gu(2)
253+ spacing: notification.margins
248
254
249 Row {
255 Row {
250 id: topRow
256 id: topRow
251
257
252− spacing: contentSpacing
258+ spacing: notification.margins
253 anchors {
259 anchors {
254 left: parent.left
260 left: parent.left
255 right: parent.right
261 right: parent.right
256− margins: contentSpacing
257 }
262 }
258
263
259 ShapedIcon {
264 ShapedIcon {
260 id: icon
265 id: icon
261
266
262 objectName: "icon"
267 objectName: "icon"
263− width: type == Notification.Ephemeral && !bodyLabel.visible ? units.gu(3) : units.gu(6)
268+ width: units.gu(6)
264 height: width
269 height: width
265− shaped: notification.hints["x-canonical-non-shaped-icon"] == "true" ? false : true
270+ shaped: notification.hints["x-canonical-non-shaped-icon"] !== "true"
266− visible: iconSource !== undefined && iconSource !== "" && type !== Notification.Confirmation
271+ visible: iconSource !== "" && type !== Notification.Confirmation
267 }
272 }
268
273
269 Column {
274 Column {
270 id: labelColumn
275 id: labelColumn
271− width: secondaryIcon.visible ? parent.width - x - units.gu(4.5) : parent.width - x
276+ width: secondaryIcon.visible ? parent.width - x - units.gu(3) : parent.width - x
272−
273 anchors.verticalCenter: (icon.visible && !bodyLabel.visible) ? icon.verticalCenter : undefined
277 anchors.verticalCenter: (icon.visible && !bodyLabel.visible) ? icon.verticalCenter : undefined
278+ spacing: units.gu(.4)
274
279
275 Label {
280 Label {
276 id: summaryLabel
281 id: summaryLabel
@@ -282,6 +287,8 @@ StyledItem {
282 }
287 }
283 visible: type !== Notification.Confirmation
288 visible: type !== Notification.Confirmation
284 fontSize: "medium"
289 fontSize: "medium"
290+ font.weight: Font.Light
291+ color: theme.palette.normal.backgroundSecondaryText
285 elide: Text.ElideRight
292 elide: Text.ElideRight
286 textFormat: Text.PlainText
293 textFormat: Text.PlainText
287 }
294 }
@@ -296,10 +303,13 @@ StyledItem {
296 }
303 }
297 visible: body != "" && type !== Notification.Confirmation
304 visible: body != "" && type !== Notification.Confirmation
298 fontSize: "small"
305 fontSize: "small"
306+ font.weight: Font.Light
307+ color: theme.palette.normal.backgroundTertiaryText
299 wrapMode: Text.Wrap
308 wrapMode: Text.Wrap
300− maximumLineCount: type == Notification.SnapDecision ? 12 : 2
309+ maximumLineCount: type === Notification.SnapDecision ? 12 : 2
301 elide: Text.ElideRight
310 elide: Text.ElideRight
302 textFormat: Text.PlainText
311 textFormat: Text.PlainText
312+ lineHeight: 1.1
303 }
313 }
304 }
314 }
305
315
@@ -307,25 +317,34 @@ StyledItem {
307 id: secondaryIcon
317 id: secondaryIcon
308
318
309 objectName: "secondaryIcon"
319 objectName: "secondaryIcon"
310− width: units.gu(3)
320+ width: units.gu(2)
311− height: units.gu(3)
321+ height: width
312 visible: status === Image.Ready
322 visible: status === Image.Ready
313 fillMode: Image.PreserveAspectCrop
323 fillMode: Image.PreserveAspectCrop
314 }
324 }
315 }
325 }
316
326
317 ListItem.ThinDivider {
327 ListItem.ThinDivider {
318− visible: type == Notification.SnapDecision
328+ visible: type === Notification.SnapDecision && notification.expanded
329+ }
330+
331+ Icon {
332+ name: "toolkit_chevron-down_3gu"
333+ visible: type === Notification.SnapDecision && !notification.expanded
334+ width: units.gu(2)
335+ height: width
336+ anchors.horizontalCenter: parent.horizontalCenter
337+ color: theme.palette.normal.base
319 }
338 }
320
339
321 ShapedIcon {
340 ShapedIcon {
322 id: centeredIcon
341 id: centeredIcon
323 objectName: "centeredIcon"
342 objectName: "centeredIcon"
324− width: units.gu(5)
343+ width: units.gu(4)
325 height: width
344 height: width
326− shaped: notification.hints["x-canonical-non-shaped-icon"] == "true" ? false : true
345+ shaped: notification.hints["x-canonical-non-shaped-icon"] !== "true"
327 fileSource: icon.fileSource
346 fileSource: icon.fileSource
328− visible: fileSource !== undefined && fileSource !== "" && type === Notification.Confirmation
347+ visible: fileSource !== "" && type === Notification.Confirmation
329 anchors.horizontalCenter: parent.horizontalCenter
348 anchors.horizontalCenter: parent.horizontalCenter
330 }
349 }
331
350
@@ -336,44 +355,32 @@ StyledItem {
336 anchors.horizontalCenter: parent.horizontalCenter
355 anchors.horizontalCenter: parent.horizontalCenter
337 visible: type === Notification.Confirmation && body !== ""
356 visible: type === Notification.Confirmation && body !== ""
338 fontSize: "medium"
357 fontSize: "medium"
358+ font.weight: Font.Light
359+ color: theme.palette.normal.backgroundSecondaryText
339 wrapMode: Text.WordWrap
360 wrapMode: Text.WordWrap
340 maximumLineCount: 1
361 maximumLineCount: 1
341 elide: Text.ElideRight
362 elide: Text.ElideRight
342 textFormat: Text.PlainText
363 textFormat: Text.PlainText
343 }
364 }
344
365
345− UbuntuShape {
366+ ProgressBar {
346 id: valueIndicator
367 id: valueIndicator
347 objectName: "valueIndicator"
368 objectName: "valueIndicator"
348 visible: type === Notification.Confirmation
369 visible: type === Notification.Confirmation
349− property double value
370+ minimumValue: 0
350−
371+ maximumValue: 100
372+ showProgressPercentage: false
351 anchors {
373 anchors {
352 left: parent.left
374 left: parent.left
353 right: parent.right
375 right: parent.right
354− margins: contentSpacing
355 }
376 }
356−
357 height: units.gu(1)
377 height: units.gu(1)
358− backgroundColor: theme.palette.normal.background
359− aspect: UbuntuShape.Flat
360− radius: "small"
361−
362− UbuntuShape {
363− id: innerBar
364− objectName: "innerBar"
365− width: valueIndicator.width * valueIndicator.value / 100
366− height: units.gu(1)
367− backgroundColor: notification.hints["x-canonical-value-bar-tint"] === "true" ? theme.palette.normal.activity : theme.palette.highlighted.foreground
368− aspect: UbuntuShape.Flat
369− radius: "small"
370− }
371 }
378 }
372
379
373 Column {
380 Column {
374 id: dialogColumn
381 id: dialogColumn
375 objectName: "dialogListView"
382 objectName: "dialogListView"
376− spacing: units.gu(2)
383+ spacing: notification.margins
377
384
378 visible: count > 0
385 visible: count > 0
379
386
@@ -417,12 +424,11 @@ StyledItem {
417 anchors {
424 anchors {
418 left: parent.left
425 left: parent.left
419 right: parent.right
426 right: parent.right
420− margins: contentSpacing
421 }
427 }
422
428
423− spacing: contentSpacing
429+ spacing: notification.margins
424
430
425− visible: notification.type === Notification.SnapDecision && oneOverTwoRepeaterTop.count === 3
431+ visible: notification.type === Notification.SnapDecision && oneOverTwoRepeaterTop.count === 3 && notification.expanded
426
432
427 Repeater {
433 Repeater {
428 id: oneOverTwoRepeaterTop
434 id: oneOverTwoRepeaterTop
@@ -437,11 +443,13 @@ StyledItem {
437 Component {
443 Component {
438 id: oneOverTwoButtonTop
444 id: oneOverTwoButtonTop
439
445
440− Button {
446+ NotificationButton {
441 objectName: "notify_oot_button" + index
447 objectName: "notify_oot_button" + index
442 width: oneOverTwoCase.width
448 width: oneOverTwoCase.width
443 text: oneOverTwoLoaderTop.actionLabel
449 text: oneOverTwoLoaderTop.actionLabel
450+ outline: notification.hints["x-canonical-private-affirmative-tint"] !== "true"
444− color: notification.hints["x-canonical-private-affirmative-tint"] == "true" ? UbuntuColors.green : theme.palette.normal.baseText
451+ color: notification.hints["x-canonical-private-affirmative-tint"] === "true" ? theme.palette.normal.positive
452+ : theme.palette.normal.foreground
445 onClicked: notification.notification.invokeAction(oneOverTwoLoaderTop.actionId)
453 onClicked: notification.notification.invokeAction(oneOverTwoLoaderTop.actionId)
446 }
454 }
447 }
455 }
@@ -450,7 +458,7 @@ StyledItem {
450 }
458 }
451
459
452 Row {
460 Row {
453− spacing: contentSpacing
461+ spacing: notification.margins
454
462
455 Repeater {
463 Repeater {
456 id: oneOverTwoRepeaterBottom
464 id: oneOverTwoRepeaterBottom
@@ -465,11 +473,13 @@ StyledItem {
465 Component {
473 Component {
466 id: oneOverTwoButtonBottom
474 id: oneOverTwoButtonBottom
467
475
468− Button {
476+ NotificationButton {
469 objectName: "notify_oot_button" + index
477 objectName: "notify_oot_button" + index
470− width: oneOverTwoCase.width / 2 - spacing * 2
478+ width: oneOverTwoCase.width / 2 - spacing / 2
471 text: oneOverTwoLoaderBottom.actionLabel
479 text: oneOverTwoLoaderBottom.actionLabel
480+ outline: notification.hints["x-canonical-private-rejection-tint"] !== "true"
472− color: index == 1 && notification.hints["x-canonical-private-rejection-tint"] == "true" ? UbuntuColors.red : theme.palette.normal.baseText
481+ color: index == 1 && notification.hints["x-canonical-private-rejection-tint"] === "true" ? theme.palette.normal.negative
482+ : theme.palette.normal.foreground
473 onClicked: notification.notification.invokeAction(oneOverTwoLoaderBottom.actionId)
483 onClicked: notification.notification.invokeAction(oneOverTwoLoaderBottom.actionId)
474 }
484 }
475 }
485 }
@@ -486,10 +496,9 @@ StyledItem {
486 anchors {
496 anchors {
487 left: parent.left
497 left: parent.left
488 right: parent.right
498 right: parent.right
489− margins: contentSpacing
490 }
499 }
491− visible: notification.type === Notification.SnapDecision && actionRepeater.count > 0 && !oneOverTwoCase.visible
500+ visible: notification.type === Notification.SnapDecision && actionRepeater.count > 0 && !oneOverTwoCase.visible && notification.expanded
492− spacing: contentSpacing
501+ spacing: notification.margins
493 layoutDirection: Qt.RightToLeft
502 layoutDirection: Qt.RightToLeft
494
503
495 Loader {
504 Loader {
@@ -525,17 +534,19 @@ StyledItem {
525 Component {
534 Component {
526 id: actionButton
535 id: actionButton
527
536
528− Button {
537+ NotificationButton {
529 objectName: "notify_button" + index
538 objectName: "notify_button" + index
530− width: buttonRow.width / 2 - spacing * 2
539+ width: buttonRow.width / 2 - spacing / 2
531 text: loader.actionLabel
540 text: loader.actionLabel
541+ outline: (index == 0 && notification.hints["x-canonical-private-affirmative-tint"] !== "true") ||
542+ (index == 1 && notification.hints["x-canonical-private-rejection-tint"] !== "true")
532 color: {
543 color: {
533− var result = theme.palette.normal.baseText;
544+ var result = theme.palette.normal.foreground;
534− if (index == 0 && notification.hints["x-canonical-private-affirmative-tint"] == "true") {
545+ if (index == 0 && notification.hints["x-canonical-private-affirmative-tint"] === "true") {
535− result = UbuntuColors.green;
546+ result = theme.palette.normal.positive;
536 }
547 }
537− if (index == 1 && notification.hints["x-canonical-private-rejection-tint"] == "true") {
548+ if (index == 1 && notification.hints["x-canonical-private-rejection-tint"] === "true") {
538− result = UbuntuColors.red;
549+ result = theme.palette.normal.negative;
539 }
550 }
540 return result;
551 return result;
541 }
552 }
@@ -554,10 +565,9 @@ StyledItem {
554 anchors {
565 anchors {
555 left: parent.left
566 left: parent.left
556 right: parent.right
567 right: parent.right
557− margins: contentSpacing
558 }
568 }
559
569
560− visible: notification.type == Notification.SnapDecision && actionRepeater.count > 3 && !oneOverTwoCase.visible
570+ visible: notification.type === Notification.SnapDecision && actionRepeater.count > 3 && !oneOverTwoCase.visible && notification.expanded
561 model: notification.actions
571 model: notification.actions
562 expanded: false
572 expanded: false
563 startIndex: 2
573 startIndex: 2
qml/Notifications/NotificationButton.qmlnew file+72
@@ -0,0 +1,72 @@
1+/*
2+ * Copyright 2016 Canonical Ltd.
3+ *
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
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 Lesser General Public License for more details.
12+ *
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/>.
15+ */
16+
17+import QtQuick 2.4
18+import Ubuntu.Components 1.3
19+
20+Rectangle {
21+ id: root
22+ height: units.gu(4)
23+ radius: units.gu(0.6)
24+
25+ // to be read from outside
26+ readonly property alias containsMouse: mouseArea.containsMouse
27+
28+ // to be set from outside
29+ property bool outline: true
30+ property alias text: label.text
31+ property alias iconName: icon.name
32+ property bool hoverEnabled: false
33+
34+ signal clicked()
35+
36+ Label {
37+ id: label
38+ fontSize: "medium"
39+ font.weight: Font.Light
40+ anchors.centerIn: root
41+ color: outline ? theme.palette.normal.backgroundSecondaryText : "white"
42+ visible: text !== ""
43+ }
44+
45+ Icon {
46+ id: icon
47+ height: root.height * 2 / 3
48+ width: height
49+ anchors.centerIn: root
50+ color: "white"
51+ visible: !label.visible
52+ }
53+
54+ MouseArea {
55+ id: mouseArea
56+ anchors.fill: root
57+ hoverEnabled: root.hoverEnabled
58+ onClicked: {
59+ Haptics.play();
60+ root.clicked();
61+ }
62+ }
63+
64+ transformOrigin: Item.Top
65+ scale: mouseArea.pressed ? 0.98 : 1.0
66+ Behavior on scale {
67+ ScaleAnimator {
68+ duration: UbuntuAnimation.SnapDuration
69+ easing.type: Easing.Linear
70+ }
71+ }
72+}
qml/Notifications/NotificationMenuItemFactory.qml+5−11
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright 2013 Canonical Ltd.
2+ * Copyright 2013-2016 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.4
17import QtQuick 2.4
@@ -71,7 +68,7 @@ Loader {
71 id: textfield
68 id: textfield
72
69
73 Column {
70 Column {
74− spacing: units.gu(2)
71+ spacing: notification.margins
75
72
76 anchors {
73 anchors {
77 left: parent.left
74 left: parent.left
@@ -87,12 +84,10 @@ Loader {
87
84
88 Label {
85 Label {
89 text: menuData.label
86 text: menuData.label
90− color: notification.sdFontColor
87+ color: theme.palette.normal.backgroundSecondaryText
91 }
88 }
92
89
93 TextField {
90 TextField {
94− id: textfield
95−
96 // TODO using Qt.ImhNoPredictiveText here until lp #1291575 is fixed for ubuntu-ui-toolkit
91 // TODO using Qt.ImhNoPredictiveText here until lp #1291575 is fixed for ubuntu-ui-toolkit
97 inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhNoPredictiveText
92 inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhNoPredictiveText
98 anchors {
93 anchors {
@@ -115,7 +110,7 @@ Loader {
115 Row {
110 Row {
116 id: checkBoxRow
111 id: checkBoxRow
117
112
118− spacing: units.gu(.5)
113+ spacing: notification.margins
119
114
120 CheckBox {
115 CheckBox {
121 id: checkBox
116 id: checkBox
@@ -127,7 +122,7 @@ Loader {
127 Label {
122 Label {
128 anchors.verticalCenter: checkBox.verticalCenter
123 anchors.verticalCenter: checkBox.verticalCenter
129 text: i18n.tr("Show password")
124 text: i18n.tr("Show password")
130− color: notification.sdFontColor
125+ color: theme.palette.normal.backgroundSecondaryText
131
126
132 MouseArea {
127 MouseArea {
133 anchors.fill: parent
128 anchors.fill: parent
@@ -151,7 +146,6 @@ Loader {
151 errorText: errorAction.valid ? errorAction.state : ""
146 errorText: errorAction.valid ? errorAction.state : ""
152 retryText: notification.body
147 retryText: notification.body
153 background: menuFactory.background
148 background: menuFactory.background
154− darkenBackground: 0.4
155
149
156 onEntered: {
150 onEntered: {
157 menuModel.changeState(menuIndex, passphrase);
151 menuModel.changeState(menuIndex, passphrase);
qml/Notifications/Notifications.qml+4−5
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 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 General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -27,11 +27,11 @@ ListView {
27 interactive: false
27 interactive: false
28
28
29 property real margin
29 property real margin
30− property bool useModal: snapDecisionProxyModel.count > 0
31 property bool hasMouse
30 property bool hasMouse
32− property bool inverseMode
33 property url background: ""
31 property url background: ""
34
32
33+ readonly property bool useModal: snapDecisionProxyModel.count > 0
34+
35 UnitySortFilterProxyModel {
35 UnitySortFilterProxyModel {
36 id: snapDecisionProxyModel
36 id: snapDecisionProxyModel
37 objectName: "snapDecisionProxyModel"
37 objectName: "snapDecisionProxyModel"
@@ -42,7 +42,7 @@ ListView {
42 }
42 }
43
43
44 property bool topmostIsFullscreen: false
44 property bool topmostIsFullscreen: false
45− spacing: topmostIsFullscreen ? 0 : units.gu(.5)
45+ spacing: topmostIsFullscreen ? 0 : units.gu(1)
46
46
47 currentIndex: count > 1 ? 1 : -1
47 currentIndex: count > 1 ? 1 : -1
48
48
@@ -62,7 +62,6 @@ ListView {
62 maxHeight: notificationList.height
62 maxHeight: notificationList.height
63 margins: notificationList.margin
63 margins: notificationList.margin
64 hasMouse: notificationList.hasMouse
64 hasMouse: notificationList.hasMouse
65− inverseMode: notificationList.inverseMode
66 background: notificationList.background
65 background: notificationList.background
67
66
68 // make sure there's no opacity-difference between the several
67 // make sure there's no opacity-difference between the several
qml/Notifications/OptionToggle.qml+12−10
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2014,2015 Canonical, Ltd.
2+ * Copyright (C) 2014-2016 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 General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -19,22 +19,23 @@ import Ubuntu.Components 1.3
19import Ubuntu.Components.ListItems 1.3 as ListItem
19import Ubuntu.Components.ListItems 1.3 as ListItem
20import Ubuntu.Components.Popups 1.3
20import Ubuntu.Components.Popups 1.3
21
21
22−UbuntuShape {
22+Rectangle {
23 id: optionToggle
23 id: optionToggle
24
24
25 property bool expanded
25 property bool expanded
26 property var model
26 property var model
27 property int startIndex
27 property int startIndex
28− readonly property double itemHeight: units.gu(5)
28+ readonly property double itemHeight: units.gu(4)
29
29
30 signal triggered(string id)
30 signal triggered(string id)
31
31
32− backgroundColor: theme.palette.normal.base
32+ color: theme.palette.normal.background
33− aspect: UbuntuShape.Flat
34 height: expanded ? (optionToggleRepeater.count - startIndex) * itemHeight : itemHeight
33 height: expanded ? (optionToggleRepeater.count - startIndex) * itemHeight : itemHeight
35 width: parent.width
34 width: parent.width
36− radius: "medium"
35+ radius: units.gu(0.6)
37 clip: true
36 clip: true
37+ border.width: units.dp(1)
38+ border.color: theme.palette.normal.base
38
39
39 Column {
40 Column {
40 id: optionToggleContent
41 id: optionToggleContent
@@ -75,7 +76,7 @@ UbuntuShape {
75 id: delegateIcon
76 id: delegateIcon
76 anchors {
77 anchors {
77 left: parent.left
78 left: parent.left
78− leftMargin: units.gu(2)
79+ leftMargin: units.gu(1)
79 verticalCenter: parent.verticalCenter
80 verticalCenter: parent.verticalCenter
80 }
81 }
81 visible: index !== startIndex
82 visible: index !== startIndex
@@ -90,14 +91,15 @@ UbuntuShape {
90 left: delegateIcon.visible ? delegateIcon.right : parent.left
91 left: delegateIcon.visible ? delegateIcon.right : parent.left
91 leftMargin: delegateIcon.visible ? units.gu(1) : units.gu(2)
92 leftMargin: delegateIcon.visible ? units.gu(1) : units.gu(2)
92 right: parent.right
93 right: parent.right
93− rightMargin: units.gu(2)
94+ rightMargin: units.gu(1)
94 verticalCenter: delegateIcon.visible ? delegateIcon.verticalCenter : parent.verticalCenter
95 verticalCenter: delegateIcon.visible ? delegateIcon.verticalCenter : parent.verticalCenter
95 }
96 }
96
97
97 width: parent.width
98 width: parent.width
98 text: splitLabel[3]
99 text: splitLabel[3]
99− color: theme.palette.normal.backgroundText
100+ color: theme.palette.normal.backgroundSecondaryText
100 fontSize: "small"
101 fontSize: "small"
102+ font.weight: Font.Light
101 maximumLineCount: 1
103 maximumLineCount: 1
102 elide: Text.ElideRight
104 elide: Text.ElideRight
103 }
105 }
@@ -105,7 +107,7 @@ UbuntuShape {
105 Icon {
107 Icon {
106 anchors {
108 anchors {
107 right: parent.right
109 right: parent.right
108− rightMargin: units.gu(2)
110+ rightMargin: units.gu(1)
109 verticalCenter: delegateIcon.verticalCenter
111 verticalCenter: delegateIcon.verticalCenter
110 }
112 }
111
113
qml/Notifications/ShapedIcon.qml+1
@@ -27,6 +27,7 @@ Item {
27 visible: shaped
27 visible: shaped
28 source: realImage
28 source: realImage
29 sourceFillMode: UbuntuShape.PreserveAspectCrop
29 sourceFillMode: UbuntuShape.PreserveAspectCrop
30+ aspect: UbuntuShape.Flat
30 }
31 }
31
32
32 Image {
33 Image {
qml/Notifications/SwipeToAct.qml+16−20
@@ -20,7 +20,7 @@ import Ubuntu.Components 1.3
20Item {
20Item {
21 id: swipeToAct
21 id: swipeToAct
22
22
23− height: clickToAct ? leftButton.height : childrenRect.height
23+ height: clickToAct ? leftButton.height : row.height
24
24
25 signal leftTriggered()
25 signal leftTriggered()
26 signal rightTriggered()
26 signal rightTriggered()
@@ -36,8 +36,8 @@ Item {
36 property double opacityDelta
36 property double opacityDelta
37 readonly property double sliderHeight: units.gu(8)
37 readonly property double sliderHeight: units.gu(8)
38 readonly property double gap: units.gu(1)
38 readonly property double gap: units.gu(1)
39− readonly property color sliderMainColor: "#b2b2b2"
39+ readonly property color sliderMainColor: theme.palette.normal.base
40− readonly property color sliderBGColor: "#f4f4f4"
40+ readonly property color sliderBGColor: theme.palette.normal.background
41 readonly property double halfWay: mouseArea.drag.maximumX / 2
41 readonly property double halfWay: mouseArea.drag.maximumX / 2
42
42
43 UbuntuNumberAnimation on opacityDelta {
43 UbuntuNumberAnimation on opacityDelta {
@@ -66,32 +66,30 @@ Item {
66 }
66 }
67 }
67 }
68
68
69− Button {
69+ NotificationButton {
70 id: leftButton
70 id: leftButton
71 objectName: "leftButton"
71 objectName: "leftButton"
72 anchors.verticalCenter: parent.verticalCenter
72 anchors.verticalCenter: parent.verticalCenter
73 anchors.left: parent.left
73 anchors.left: parent.left
74 iconName: leftIconName
74 iconName: leftIconName
75 visible: clickToAct
75 visible: clickToAct
76+ outline: false
76− width: (parent.width / 2) - priv.gap
77+ width: (parent.width / 2) - priv.gap / 2
77− color: UbuntuColors.red
78+ color: theme.palette.normal.negative
78− onClicked: {
79− leftTriggered()
79+ onClicked: leftTriggered()
80− }
81 }
80 }
82
81
83− Button {
82+ NotificationButton {
84 id: rightButton
83 id: rightButton
85 objectName: "rightButton"
84 objectName: "rightButton"
86 anchors.verticalCenter: parent.verticalCenter
85 anchors.verticalCenter: parent.verticalCenter
87 anchors.right: parent.right
86 anchors.right: parent.right
88 iconName: rightIconName
87 iconName: rightIconName
89 visible: clickToAct
88 visible: clickToAct
89+ outline: false
90− width: (parent.width / 2) - priv.gap
90+ width: (parent.width / 2) - priv.gap / 2
91− color: UbuntuColors.green
91+ color: theme.palette.normal.positive
92− onClicked: {
93− rightTriggered()
92+ onClicked: rightTriggered()
94− }
95 }
93 }
96
94
97 UbuntuShape {
95 UbuntuShape {
@@ -108,10 +106,9 @@ Item {
108 anchors.top: parent.top
106 anchors.top: parent.top
109 anchors.left: parent.left
107 anchors.left: parent.left
110 anchors.margins: priv.gap
108 anchors.margins: priv.gap
111− backgroundColor: UbuntuColors.red
109+ backgroundColor: theme.palette.normal.negative
112 aspect: UbuntuShape.Flat
110 aspect: UbuntuShape.Flat
113
111
114− state: "normal"
115 height: units.gu(6)
112 height: units.gu(6)
116 width: units.gu(6)
113 width: units.gu(6)
117 radius: "medium"
114 radius: "medium"
@@ -195,7 +192,7 @@ Item {
195 Icon {
192 Icon {
196 anchors.fill: parent
193 anchors.fill: parent
197 anchors.margins: units.gu(1.5)
194 anchors.margins: units.gu(1.5)
198− source: "grip-large.svg"
195+ name: "grip-large"
199 color: "white"
196 color: "white"
200 }
197 }
201 }
198 }
@@ -226,10 +223,9 @@ Item {
226 anchors.top: parent.top
223 anchors.top: parent.top
227 anchors.right: parent.right
224 anchors.right: parent.right
228 anchors.margins: priv.gap
225 anchors.margins: priv.gap
229− backgroundColor: UbuntuColors.green
226+ backgroundColor: theme.palette.normal.positive
230 aspect: UbuntuShape.Flat
227 aspect: UbuntuShape.Flat
231
228
232− state: "normal"
233 height: units.gu(6)
229 height: units.gu(6)
234 width: units.gu(6)
230 width: units.gu(6)
235 radius: "medium"
231 radius: "medium"
qml/Notifications/grip-large.svgdeleted−150
@@ -1,150 +0,0 @@
1−<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2−<!-- Created with Inkscape (http://www.inkscape.org/) -->
3−
4−<svg
5− xmlns:dc="http://purl.org/dc/elements/1.1/"
6− xmlns:cc="http://creativecommons.org/ns#"
7− xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8− xmlns:svg="http://www.w3.org/2000/svg"
9− xmlns="http://www.w3.org/2000/svg"
10− xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11− xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12− width="90"
13− height="90"
14− id="svg4874"
15− version="1.1"
16− inkscape:version="0.91+devel r"
17− viewBox="0 0 90 90.000001"
18− sodipodi:docname="grip-large01.svg">
19− <defs
20− id="defs4876" />
21− <sodipodi:namedview
22− id="base"
23− pagecolor="#ffffff"
24− bordercolor="#666666"
25− borderopacity="1.0"
26− inkscape:pageopacity="0.0"
27− inkscape:pageshadow="2"
28− inkscape:zoom="7.9580786"
29− inkscape:cx="13.632541"
30− inkscape:cy="49.591116"
31− inkscape:document-units="px"
32− inkscape:current-layer="g1708"
33− showgrid="true"
34− showborder="true"
35− fit-margin-top="0"
36− fit-margin-left="0"
37− fit-margin-right="0"
38− fit-margin-bottom="0"
39− inkscape:snap-bbox="true"
40− inkscape:bbox-paths="true"
41− inkscape:bbox-nodes="true"
42− inkscape:snap-bbox-edge-midpoints="true"
43− inkscape:snap-bbox-midpoints="true"
44− inkscape:object-paths="true"
45− inkscape:snap-intersection-paths="true"
46− inkscape:object-nodes="true"
47− inkscape:snap-smooth-nodes="true"
48− inkscape:snap-midpoints="true"
49− inkscape:snap-object-midpoints="true"
50− inkscape:snap-center="true"
51− showguides="true"
52− inkscape:guide-bbox="true">
53− <inkscape:grid
54− type="xygrid"
55− id="grid5451"
56− empspacing="6" />
57− <sodipodi:guide
58− orientation="1,0"
59− position="6,77"
60− id="guide4063" />
61− <sodipodi:guide
62− orientation="1,0"
63− position="3,78"
64− id="guide4065" />
65− <sodipodi:guide
66− orientation="0,1"
67− position="55,84"
68− id="guide4067" />
69− <sodipodi:guide
70− orientation="0,1"
71− position="53,87"
72− id="guide4069" />
73− <sodipodi:guide
74− orientation="0,1"
75− position="20,3"
76− id="guide4071" />
77− <sodipodi:guide
78− orientation="0,1"
79− position="20,6"
80− id="guide4073" />
81− <sodipodi:guide
82− orientation="1,0"
83− position="87,7"
84− id="guide4075" />
85− <sodipodi:guide
86− orientation="1,0"
87− position="84,7"
88− id="guide4077" />
89− <sodipodi:guide
90− orientation="0,1"
91− position="58,81"
92− id="guide4074" />
93− <sodipodi:guide
94− orientation="1,0"
95− position="9,74"
96− id="guide4076" />
97− <sodipodi:guide
98− orientation="0,1"
99− position="21,9"
100− id="guide4078" />
101− <sodipodi:guide
102− orientation="1,0"
103− position="81,4"
104− id="guide4080" />
105− </sodipodi:namedview>
106− <metadata
107− id="metadata4879">
108− <rdf:RDF>
109− <cc:Work
110− rdf:about="">
111− <dc:format>image/svg+xml</dc:format>
112− <dc:type
113− rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
114− <dc:title></dc:title>
115− </cc:Work>
116− </rdf:RDF>
117− </metadata>
118− <g
119− inkscape:label="Layer 1"
120− inkscape:groupmode="layer"
121− id="layer1"
122− transform="translate(67.857146,-84.50504)">
123− <g
124− transform="matrix(0,-1,-1,0,373.50506,516.50504)"
125− id="g4845"
126− style="display:inline">
127− <g
128− inkscape:label="Layer 1"
129− id="g1708"
130− transform="matrix(0,-1,-1,0,1394.3622,441.36221)"
131− inkscape:export-filename="add01.png"
132− inkscape:export-xdpi="90"
133− inkscape:export-ydpi="90">
134− <rect
135− style="color:#000000;fill:none;stroke:none;stroke-width:7.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
136− id="rect1710"
137− width="90"
138− height="90"
139− x="0"
140− y="962.36218" />
141− <path
142− style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
143− d="m 9.000004,971.3622 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m -72,16 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m -72,16 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m -72,16 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m -72,16 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z"
144− id="path4169"
145− inkscape:connector-curvature="0"
146− sodipodi:nodetypes="sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss" />
147− </g>
148− </g>
149− </g>
150−</svg>
qml/Panel/Indicators/MenuItemFactory.qml+3−2
@@ -418,11 +418,12 @@ Item {
418 property int menuIndex: -1
418 property int menuIndex: -1
419 property var extendedData: menuData && menuData.ext || undefined
419 property var extendedData: menuData && menuData.ext || undefined
420
420
421− property date serverTime: new Date(getExtendedProperty(extendedData, "xCanonicalTime", 0) * 1000)
421+ readonly property date serverTime: new Date(getExtendedProperty(extendedData, "xCanonicalTime", 0) * 1000)
422+
422 LiveTimer {
423 LiveTimer {
423 frequency: LiveTimer.Relative
424 frequency: LiveTimer.Relative
424 relativeTime: appointmentItem.serverTime
425 relativeTime: appointmentItem.serverTime
425− onTrigger: appointmentItem.serverTime = new Date(getExtendedProperty(extendedData, "xCanonicalTime", 0) * 1000)
426+ onTrigger: appointmentItem.time = i18n.relativeDateTime(appointmentItem.serverTime)
426 }
427 }
427
428
428 text: menuData && menuData.label || ""
429 text: menuData && menuData.label || ""
qml/Panel/Indicators/client/IndicatorsClient.qml+1−1
@@ -22,7 +22,7 @@ import Ubuntu.Components 1.3
22import Ubuntu.Components.ListItems 1.3 as ListItem
22import Ubuntu.Components.ListItems 1.3 as ListItem
23
23
24Rectangle {
24Rectangle {
25− color: "#292929"
25+ color: theme.palette.normal.background
26 id: root
26 id: root
27
27
28 Component.onCompleted: {
28 Component.onCompleted: {
qml/Panel/Panel.qml+3−2
@@ -126,6 +126,7 @@ Item {
126 height: indicators.minimizedPanelHeight - anchors.topMargin - anchors.bottomMargin
126 height: indicators.minimizedPanelHeight - anchors.topMargin - anchors.bottomMargin
127 visible: PanelState.buttonsVisible && parent.containsMouse && !root.locked && !callHint.visible
127 visible: PanelState.buttonsVisible && parent.containsMouse && !root.locked && !callHint.visible
128 active: PanelState.buttonsVisible
128 active: PanelState.buttonsVisible
129+ closeButtonShown: PanelState.closeButtonShown
129 onClose: PanelState.close()
130 onClose: PanelState.close()
130 onMinimize: PanelState.minimize()
131 onMinimize: PanelState.minimize()
131 onMaximize: PanelState.maximize()
132 onMaximize: PanelState.maximize()
@@ -176,12 +177,12 @@ Item {
176 topMargin: units.gu(0.5)
177 topMargin: units.gu(0.5)
177 bottomMargin: units.gu(0.5)
178 bottomMargin: units.gu(0.5)
178 }
179 }
179− color: PanelState.buttonsVisible ? "#ffffff" : "#5d5d5d"
180+ color: "white"
180 height: indicators.minimizedPanelHeight - anchors.topMargin - anchors.bottomMargin
181 height: indicators.minimizedPanelHeight - anchors.topMargin - anchors.bottomMargin
181 visible: !windowControlButtons.visible && !root.locked && !callHint.visible
182 visible: !windowControlButtons.visible && !root.locked && !callHint.visible
182 verticalAlignment: Text.AlignVCenter
183 verticalAlignment: Text.AlignVCenter
183 fontSize: "medium"
184 fontSize: "medium"
184− font.weight: Font.Normal
185+ font.weight: PanelState.buttonsVisible ? Font.Light : Font.Medium
185 text: PanelState.title
186 text: PanelState.title
186 elide: Text.ElideRight
187 elide: Text.ElideRight
187 maximumLineCount: 1
188 maximumLineCount: 1
qml/Shell.qml+11−12
@@ -207,7 +207,14 @@ Item {
207 }
207 }
208
208
209 WindowInputMonitor {
209 WindowInputMonitor {
210+ objectName: "windowInputMonitor"
210− onHomeKeyActivated: { launcher.fadeOut(); shell.showHome(); }
211+ onHomeKeyActivated: {
212+ // Ignore when greeter is active, to avoid pocket presses
213+ if (!greeter.active) {
214+ launcher.fadeOut();
215+ shell.showHome();
216+ }
217+ }
211 onTouchBegun: { cursor.opacity = 0; }
218 onTouchBegun: { cursor.opacity = 0; }
212 onTouchEnded: {
219 onTouchEnded: {
213 // move the (hidden) cursor to the last known touch position
220 // move the (hidden) cursor to the last known touch position
@@ -639,17 +646,10 @@ Item {
639 onActiveChanged: unlockWhenDoneWithWizard()
646 onActiveChanged: unlockWhenDoneWithWizard()
640 }
647 }
641
648
642− Rectangle {
649+ MouseArea { // modal notifications prevent interacting with other contents
643− id: modalNotificationBackground
644−
645− visible: notifications.useModal
646− color: "#000000"
647 anchors.fill: parent
650 anchors.fill: parent
648− opacity: 0.9
651+ visible: notifications.useModal
649−
652+ enabled: visible
650− MouseArea {
651− anchors.fill: parent
652− }
653 }
653 }
654
654
655 Notifications {
655 Notifications {
@@ -658,7 +658,6 @@ Item {
658 model: NotificationBackend.Model
658 model: NotificationBackend.Model
659 margin: units.gu(1)
659 margin: units.gu(1)
660 hasMouse: shell.hasMouse
660 hasMouse: shell.hasMouse
661− inverseMode: panel.indicators.shown
662 background: wallpaperResolver.background
661 background: wallpaperResolver.background
663
662
664 y: topmostIsFullscreen ? 0 : panel.panelHeight
663 y: topmostIsFullscreen ? 0 : panel.panelHeight
qml/Stages/DecoratedWindow.qml+1−1
@@ -73,7 +73,7 @@ FocusScope {
73 }
73 }
74 source: "graphics/dropshadow2gu.sci"
74 source: "graphics/dropshadow2gu.sci"
75 opacity: root.shadowOpacity * .3
75 opacity: root.shadowOpacity * .3
76− enabled: !fullscreen
76+ visible: !fullscreen
77 }
77 }
78
78
79 WindowDecoration {
79 WindowDecoration {
qml/Stages/DesktopSpread.qml+4−4
@@ -170,6 +170,8 @@ FocusScope {
170 property int itemScaleOriginX: 0
170 property int itemScaleOriginX: 0
171 property int itemScaleOriginY: 0
171 property int itemScaleOriginY: 0
172
172
173+ readonly property string windowTitle: clippedSpreadDelegate.window.title
174+
173 Behavior on x {
175 Behavior on x {
174 id: closeBehavior
176 id: closeBehavior
175 enabled: spreadRepeater.closingIndex >= 0
177 enabled: spreadRepeater.closingIndex >= 0
@@ -326,9 +328,7 @@ FocusScope {
326 Label {
328 Label {
327 Layout.fillWidth: true
329 Layout.fillWidth: true
328 Layout.preferredHeight: units.gu(6)
330 Layout.preferredHeight: units.gu(6)
329− property string surfaceName: model.surface ? model.surface.name : ""
331+ text: model.application ? model.application.name : spreadDelegate.windowTitle
330− property string applicationName: model.application ? model.application.name : ""
331− text: surfaceName ? surfaceName : applicationName
332 wrapMode: Text.WordWrap
332 wrapMode: Text.WordWrap
333 elide: Text.ElideRight
333 elide: Text.ElideRight
334 maximumLineCount: 2
334 maximumLineCount: 2
@@ -527,7 +527,7 @@ FocusScope {
527 Label {
527 Label {
528 id: currentSelectedLabel
528 id: currentSelectedLabel
529 anchors { bottom: parent.bottom; bottomMargin: root.height * 0.625; horizontalCenter: parent.horizontalCenter }
529 anchors { bottom: parent.bottom; bottomMargin: root.height * 0.625; horizontalCenter: parent.horizontalCenter }
530− text: spreadRepeater.highlightedIndex >= 0 ? topLevelSurfaceList.surfaceAt(spreadRepeater.highlightedIndex).name : ""
530+ text: spreadRepeater.highlightedIndex >= 0 ? spreadRepeater.itemAt(spreadRepeater.highlightedIndex).windowTitle: ""
531 visible: false
531 visible: false
532 fontSize: "large"
532 fontSize: "large"
533 }
533 }
qml/Stages/DesktopStage.qml+8−1
@@ -190,6 +190,12 @@ AbstractStage {
190 value: priv.focusedAppDelegate && !priv.focusedAppDelegate.maximized && priv.foregroundMaximizedAppDelegate !== null
190 value: priv.focusedAppDelegate && !priv.focusedAppDelegate.maximized && priv.foregroundMaximizedAppDelegate !== null
191 }
191 }
192
192
193+ Binding {
194+ target: PanelState
195+ property: "closeButtonShown"
196+ value: priv.focusedAppDelegate && priv.focusedAppDelegate.maximized && priv.focusedAppDelegate.application.appId !== "unity8-dash"
197+ }
198+
193 Component.onDestruction: {
199 Component.onDestruction: {
194 PanelState.title = "";
200 PanelState.title = "";
195 PanelState.buttonsVisible = false;
201 PanelState.buttonsVisible = false;
@@ -249,7 +255,8 @@ AbstractStage {
249 }
255 }
250 }
256 }
251 z: normalZ
257 z: normalZ
252− y: PanelState.panelHeight
258+ x: priv.focusedAppDelegate ? priv.focusedAppDelegate.x + units.gu(3) : (normalZ - 1) * units.gu(3)
259+ y: priv.focusedAppDelegate ? priv.focusedAppDelegate.y + units.gu(3) : normalZ * units.gu(3)
253
260
254 width: decoratedWindow.width
261 width: decoratedWindow.width
255 height: decoratedWindow.height
262 height: decoratedWindow.height
qml/Stages/WindowDecoration.qml+3−2
@@ -84,6 +84,7 @@ MouseArea {
84 id: buttons
84 id: buttons
85 height: parent.height
85 height: parent.height
86 active: root.active
86 active: root.active
87+ closeButtonShown: root.target.application.appId !== "unity8-dash"
87 onClose: root.close();
88 onClose: root.close();
88 onMinimize: root.minimize();
89 onMinimize: root.minimize();
89 onMaximize: root.maximize();
90 onMaximize: root.maximize();
@@ -92,12 +93,12 @@ MouseArea {
92 Label {
93 Label {
93 id: titleLabel
94 id: titleLabel
94 objectName: "windowDecorationTitle"
95 objectName: "windowDecorationTitle"
95− color: root.active ? "white" : "#5d5d5d"
96+ color: root.active ? "white" : UbuntuColors.slate
96 height: parent.height
97 height: parent.height
97 width: parent.width - buttons.width - parent.anchors.rightMargin - parent.anchors.leftMargin
98 width: parent.width - buttons.width - parent.anchors.rightMargin - parent.anchors.leftMargin
98 verticalAlignment: Text.AlignVCenter
99 verticalAlignment: Text.AlignVCenter
99 fontSize: "medium"
100 fontSize: "medium"
100− font.weight: root.active ? Font.Light : Font.Normal
101+ font.weight: root.active ? Font.Light : Font.Medium
101 elide: Text.ElideRight
102 elide: Text.ElideRight
102 }
103 }
103 }
104 }
src/Dash/main.cpp+5
@@ -27,6 +27,7 @@
27#include <libintl.h>
27#include <libintl.h>
28
28
29#include <paths.h>
29#include <paths.h>
30+#include "../qmldebuggerutils.h"
30#ifdef UNITY8_ENABLE_TOUCH_EMULATION
31#ifdef UNITY8_ENABLE_TOUCH_EMULATION
31 #include "../MouseTouchAdaptor.h"
32 #include "../MouseTouchAdaptor.h"
32#endif
33#endif
@@ -34,6 +35,10 @@
34
35
35int main(int argc, const char *argv[])
36int main(int argc, const char *argv[])
36{
37{
38+ if (enableQmlDebugger(argc, argv)) {
39+ QQmlDebuggingEnabler qQmlEnableDebuggingHelper(true);
40+ }
41+
37 QGuiApplication *application = new QGuiApplication(argc, (char**)argv);
42 QGuiApplication *application = new QGuiApplication(argc, (char**)argv);
38
43
39 QCommandLineParser parser;
44 QCommandLineParser parser;
src/ShellView.cpp+6−2
@@ -49,11 +49,15 @@ void ShellView::onWidthChanged(int w)
49 // The QResizeEvent we get still has the size of the first screen and since the resize move is triggered
49 // The QResizeEvent we get still has the size of the first screen and since the resize move is triggered
50 // from the resize event handler, the root item doesn't get resized.
50 // from the resize event handler, the root item doesn't get resized.
51 // TODO: Confirm the Qt bug and submit a patch upstream
51 // TODO: Confirm the Qt bug and submit a patch upstream
52+ if (rootObject()) {
52− rootObject()->setWidth(w);
53+ rootObject()->setWidth(w);
54+ }
53}
55}
54
56
55void ShellView::onHeightChanged(int h)
57void ShellView::onHeightChanged(int h)
56{
58{
57 // See comment in ShellView::onWidthChanged()
59 // See comment in ShellView::onWidthChanged()
60+ if (rootObject()) {
58− rootObject()->setHeight(h);
61+ rootObject()->setHeight(h);
62+ }
59}
63}
src/main.cpp+5
@@ -16,6 +16,7 @@
16
16
17// local
17// local
18#include "ShellApplication.h"
18#include "ShellApplication.h"
19+#include "qmldebuggerutils.h"
19
20
20int main(int argc, const char *argv[])
21int main(int argc, const char *argv[])
21{
22{
@@ -25,6 +26,10 @@ int main(int argc, const char *argv[])
25 isMirServer = true;
26 isMirServer = true;
26 }
27 }
27
28
29+ if (enableQmlDebugger(argc, argv)) {
30+ QQmlDebuggingEnabler qQmlEnableDebuggingHelper(true);
31+ }
32+
28 ShellApplication *application = new ShellApplication(argc, (char**)argv, isMirServer);
33 ShellApplication *application = new ShellApplication(argc, (char**)argv, isMirServer);
29
34
30 int result = application->exec();
35 int result = application->exec();
src/qmldebuggerutils.hnew file+33
@@ -0,0 +1,33 @@
1+/*
2+ * Copyright (C) 2016 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 QMLDEBUGGERUTILS_H
18+#define QMLDEBUGGERUTILS_H
19+
20+bool enableQmlDebugger(int argc, const char *argv[])
21+{
22+ for (int i = 1; i < argc; ++i) {
23+ QByteArray arg = argv[i];
24+ if (arg.startsWith("--"))
25+ arg.remove(0, 1);
26+ if (arg.startsWith("-qmljsdebugger=") || (arg == "-qmljsdebugger" && i < argc - 1)) {
27+ return true;
28+ }
29+ }
30+ return false;
31+}
32+
33+#endif
tests/autopilot/unity8/settings_wizard/__init__.pydeleted−555
@@ -1,555 +0,0 @@
1−# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2−#
3−# Unity Autopilot Test Suite
4−# Copyright (C) 2015 Canonical
5−#
6−# This program is free software: you can redistribute it and/or modify
7−# it under the terms of the GNU General Public License as published by
8−# the Free Software Foundation, either version 3 of the License, or
9−# (at your option) any later version.
10−#
11−# This program is distributed in the hope that it will be useful,
12−# but WITHOUT ANY WARRANTY; without even the implied warranty of
13−# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14−# GNU General Public License for more details.
15−#
16−# You should have received a copy of the GNU General Public License
17−# along with this program. If not, see <http://www.gnu.org/licenses/>.
18−#
19−
20−import logging
21−import re
22−
23−import autopilot
24−from autopilot import introspection
25−from ubuntuuitoolkit import UbuntuUIToolkitCustomProxyObjectBase
26−
27−from contextlib import contextmanager
28−
29−
30−logger = logging.getLogger(__name__)
31−
32−
33−@contextmanager
34−def override_proxy_timeout(proxy, timeout_seconds):
35− original_timeout = proxy._poll_time
36− try:
37− proxy._poll_time = timeout_seconds
38− yield proxy
39− finally:
40− proxy._poll_time = original_timeout
41−
42−
43−def get_wizard(current_page):
44− return current_page.get_root_instance().select_single(Wizard)
45−
46−
47−class Wizard(UbuntuUIToolkitCustomProxyObjectBase):
48− """High-level helper to navigate through the pages of the wizard"""
49−
50− def get_language_page(self):
51− return self.wait_select_single(
52− objectName='languagePage', visible='True')
53−
54− def get_current_page(self):
55− return self.wait_select_single('Page', visible='True')
56−
57− def get_sim_page(self):
58− return self.wait_select_single(
59− objectName='simPage', visible='True')
60−
61− def get_password_page(self):
62− return self.wait_select_single(
63− objectName='passwdPage', visible='True')
64−
65− def get_password_entry_page(self):
66− return self.wait_select_single(
67− objectName='passwdSetPage', visible='True')
68−
69− def get_confirm_password_page(self):
70− return self.wait_select_single(
71− objectName='passwdConfirmPage', visible='True')
72−
73− def get_wifi_connect_page(self):
74− return self.wait_select_single(
75− objectName='wifiPage', visible='True')
76−
77− def get_location_page(self):
78− return self.wait_select_single(
79− objectName='locationPage', visible='True')
80−
81− def get_reporting_page(self):
82− return self.wait_select_single(
83− objectName='reportingPage', visible='True')
84−
85− def get_finished_page(self):
86− return self.wait_select_single(
87− objectName='finishedPage', visible='True')
88−
89−
90−class WizardLanguagePage(UbuntuUIToolkitCustomProxyObjectBase):
91− """Helper class to interact with the language welcome page"""
92−
93− # This class was renamed from LanguagePage to WizardLanguagePage because
94− # there is a class with the same name in the system settings custom proxy
95− # objects. Reported in http://pad.lv/1422904. --elopio - 2015-02-17
96−
97− @classmethod
98− def validate_dbus_object(cls, path, state):
99− name = introspection.get_classname_from_path(path)
100− if name == b'Page':
101− if state['objectName'][1] == 'languagePage':
102− return True
103− return False
104−
105− def _get_language_button(self):
106− return self.select_single(
107− 'ComboButton', objectName='languageCombo')
108−
109− def _get_continue_button(self):
110− return self.select_single('StackButton', text='Continue')
111−
112− def _swipe_to_language(self, list, language):
113− """Swipe to the chosen language in the given list"""
114− list.swipe_to_top()
115− while not list.atYEnd:
116− try:
117− item = list.select_single(
118− 'LabelVisual', text=language, visible='True')
119− item.swipe_into_view()
120− return item
121− except introspection.dbus.StateNotFoundError:
122− list.swipe_to_show_more_below()
123− # item could not be found
124− raise introspection.dbus.StateNotFoundError
125−
126− @autopilot.logging.log_action(logger.info)
127− def select_language(self, language):
128− """Select a different language from the list"""
129− combo_button = self._get_language_button()
130− self.pointing_device.click_object(combo_button)
131− language_list = combo_button.wait_select_single(
132− 'UbuntuListView11', visible='True')
133− item = self._swipe_to_language(language_list, language)
134− self.pointing_device.click_object(item)
135−
136− def get_selected_language(self):
137− return self._get_language_button().get_properties()['text']
138−
139− @autopilot.logging.log_action(logger.info)
140− def continue_(self):
141− self.pointing_device.click_object(self._get_continue_button())
142− wizard = get_wizard(self)
143− next_page = wizard.get_current_page()
144− sim_inserted = True
145− if next_page.objectName == 'simPage':
146− # no sim is inserted
147− next_page = wizard.get_sim_page()
148− sim_inserted = False
149− else:
150− # sim is inserted
151− next_page = wizard.get_password_page()
152− return sim_inserted, next_page
153−
154−
155−class SimPage(UbuntuUIToolkitCustomProxyObjectBase):
156− """Helper class to interact with the no sim notification page"""
157−
158− @classmethod
159− def validate_dbus_object(cls, path, state):
160− name = introspection.get_classname_from_path(path)
161− if name == b'Page':
162− if state['objectName'][1] == 'simPage':
163− return True
164− return False
165−
166− def _get_back_button(self):
167− return self.select_single('StackButton', text='Back')
168−
169− def _get_skip_button(self):
170− return self.select_single('StackButton', text='Skip')
171−
172− @autopilot.logging.log_action(logger.info)
173− def back(self):
174− self.pointing_device.click_object(self._get_back_button())
175− return get_wizard(self).get_languge_page()
176−
177− @autopilot.logging.log_action(logger.info)
178− def skip(self):
179− self.pointing_device.click_object(self._get_skip_button())
180− return get_wizard(self).get_password_page()
181−
182−
183−class PasswordPage(UbuntuUIToolkitCustomProxyObjectBase):
184− """Helper class to interact with the password security page"""
185−
186− SECURITY_SWIPE = 'Swipe'
187− SECURITY_PASSCODE = 'Passcode'
188− SECURITY_PASSPHRASE = 'Passphrase'
189−
190− @classmethod
191− def validate_dbus_object(cls, path, state):
192− name = introspection.get_classname_from_path(path)
193− if name == b'Page':
194− if state['objectName'][1] == 'passwdPage':
195− return True
196− return False
197−
198− def _get_option_name(self, formatted_name):
199− # the option name is formatted as follows:
200− # need to read the name between bold tags
201− # '<b>Passcode</b> (4 digits only)'
202− formatted_pattern = re.compile(r'<b>(.*?)</b>.*',
203− re.IGNORECASE | re.DOTALL)
204− name = None
205− match = formatted_pattern.search(formatted_name)
206− if match:
207− name = match.group(1)
208− return name
209−
210− def _get_all_options(self):
211− return self.select_many('OptionSelectorDelegate')
212−
213− def _get_continue_button(self):
214− return self.select_single('StackButton', text='Continue')
215−
216− def _get_back_button(self):
217− return self.select_single('StackButton', text='Back')
218−
219− def _get_selected_option(self):
220− return self.select_single(
221− 'OptionSelectorDelegate', visible='True', selected='True')
222−
223− def get_selected_security_option(self):
224− name_fmt = self._get_selected_option().get_properties()['subText']
225− return self._get_option_name(name_fmt)
226−
227− @autopilot.logging.log_action(logger.info)
228− def select_security_option(self, selected_option):
229− options = self._get_all_options()
230− for option in options:
231− name = self._get_option_name(option.get_properties()['subText'])
232− if name == selected_option:
233− self.pointing_device.click_object(option)
234−
235− @autopilot.logging.log_action(logger.info)
236− def back(self, sim_inserted):
237− self.pointing_device.click_object(self._get_back_button())
238− wizard = get_wizard(self)
239− if sim_inserted:
240− page = wizard.get_languge_page()
241− else:
242− page = wizard.get_sim_page()
243− return page
244−
245− @autopilot.logging.log_action(logger.info)
246− def continue_(self):
247− option = self.get_selected_security_option()
248− self.pointing_device.click_object(self._get_continue_button())
249− wizard = get_wizard(self)
250− if option == self.SECURITY_SWIPE:
251− next_page = wizard.get_wifi_connect_page()
252− else:
253− next_page = wizard.get_password_entry_page()
254− return next_page
255−
256−
257−class PasswordEntryPage(UbuntuUIToolkitCustomProxyObjectBase):
258− """Helper class to interact with the pin entry page"""
259−
260− @classmethod
261− def validate_dbus_object(cls, path, state):
262− name = introspection.get_classname_from_path(path)
263− if name == b'Page':
264− if state['objectName'][1] == 'passwdSetPage':
265− return True
266− return False
267−
268− def _get_pinpad_button(self, char):
269− return self.select_single('PinPadButton', text=char)
270−
271− def _get_continue_button(self):
272− return self.select_single('StackButton', text='Continue')
273−
274− def _get_back_button(self):
275− return self.select_single('StackButton', text='Back')
276−
277− def _get_text_field(self):
278− return self.select_single('QQuickTextInput')
279−
280− @autopilot.logging.log_action(logger.info)
281− def enter_pin(self, pin):
282− for char in pin:
283− self.pointing_device.click_object(self._get_pinpad_button(char))
284− return get_wizard(self).get_confirm_password_page()
285−
286− @autopilot.logging.log_action(logger.info)
287− def enter_text(self, text):
288− self.pointing_device.click_object(self._get_text_field())
289− autopilot.input.Keyboard.create().type(text)
290−
291− @autopilot.logging.log_action(logger.info)
292− def back(self):
293− self.pointing_device.click_object(self._get_back_button())
294− return get_wizard(self).get_password_page()
295−
296− @autopilot.logging.log_action(logger.info)
297− def continue_(self):
298− autopilot.input.Keyboard.create().press_and_release('Enter')
299− return get_wizard(self).get_confirm_password_page()
300−
301−
302−class ConfirmPasswordPage(UbuntuUIToolkitCustomProxyObjectBase):
303− """Helper class to interact with the pin confirmation page"""
304−
305− @classmethod
306− def validate_dbus_object(cls, path, state):
307− name = introspection.get_classname_from_path(path)
308− if name == b'Page':
309− if state['objectName'][1] == 'passwdConfirmPage':
310− return True
311− return False
312−
313− def _get_pinpad_button(self, char):
314− return self.select_single('PinPadButton', text=char)
315−
316− def _get_continue_button(self):
317− return self.select_single('StackButton', text='Continue')
318−
319− def _get_back_button(self):
320− return self.select_single('StackButton', text='Back')
321−
322− def _get_text_field(self):
323− return self.select_single('QQuickTextInput')
324−
325− @autopilot.logging.log_action(logger.info)
326− def enter_pin(self, pin):
327− for char in pin:
328− self.pointing_device.click_object(self._get_pinpad_button(char))
329− return get_wizard(self).get_wifi_connect_page()
330−
331− @autopilot.logging.log_action(logger.info)
332− def enter_text(self, text):
333− self.pointing_device.click_object(self._get_text_field())
334− autopilot.input.Keyboard.create().type(text)
335−
336− @autopilot.logging.log_action(logger.info)
337− def back(self):
338− self.pointing_device.click_object(self._get_back_button())
339− return get_wizard(self).get_password_page()
340−
341− @autopilot.logging.log_action(logger.info)
342− def continue_(self):
343− autopilot.input.Keyboard.create().press_and_release('Enter')
344− return get_wizard(self).get_wifi_connect_page()
345−
346−
347−class WifiConnectPage(UbuntuUIToolkitCustomProxyObjectBase):
348− """Helper class to interact with the Wi-Fi network list page"""
349−
350− @classmethod
351− def validate_dbus_object(cls, path, state):
352− name = introspection.get_classname_from_path(path)
353− if name == b'Page':
354− if state['objectName'][1] == 'wifiPage':
355− return True
356− return False
357−
358− def _get_all_networks(self):
359− try:
360− networks = self.select_many('Standard', objectName='accessPoint',
361− visible='True')
362− except:
363− networks = []
364− return networks
365−
366− def _get_network(self, ssid):
367− return self.wait_select_single(
368− 'Standard', objectName='accessPoint', text=ssid, visible='True')
369−
370− def _get_network_checkbox(self, ssid):
371− return self._get_network(ssid).select_single(
372− 'CheckBox', visible='True')
373−
374− def _get_next_page(self):
375− wizard = get_wizard(self)
376− next_page = wizard.get_current_page()
377− locationPageEnabled = True
378− reportingPageEnabled = True
379− if next_page.objectName == 'locationPage':
380− next_page = wizard.get_location_page()
381− else:
382− locationPageEnabled = False
383− if next_page.objectName == 'reportingPage':
384− next_page = wizard.get_reporting_page()
385− else:
386− reportingPageEnabled = False
387− next_page = wizard.get_finished_page()
388− return locationPageEnabled, reportingPageEnabled, next_page
389−
390− def _get_notification(self, unity):
391− logger.info('Waiting longer for notification object')
392− with override_proxy_timeout(unity, 30):
393− return unity.wait_select_single(
394− Notification, objectName='notification1', visible='True')
395−
396− def _get_back_button(self):
397− return self.wait_select_single(
398− 'StackButton', text='Back', visible='True')
399−
400− def _get_continue_button(self):
401− return self.wait_select_single(
402− 'StackButton', text='Continue', visible='True')
403−
404− def _get_skip_button(self):
405− return self.wait_select_single(
406− 'StackButton', text='Skip', visible='True')
407−
408− def is_any_network_checked(self):
409− networks = self._get_all_networks()
410− for network in networks:
411− checkbox = network.select_single('CheckBox', visible='True')
412− if checkbox.get_properties()['checked']:
413− return True
414− return False
415−
416− def is_any_network_found(self):
417− num_neworks = len(self._get_all_networks())
418− return True if num_neworks > 0 else False
419−
420− def is_network_checked(self, ssid):
421− return self._get_network_checkbox(ssid).get_properties()['checked']
422−
423− @autopilot.logging.log_action(logger.info)
424− def select_network(self, unity, ssid):
425− self.pointing_device.click_object(self._get_network_checkbox(ssid))
426− return PasswordNotification(self._get_notification(unity))
427−
428− @autopilot.logging.log_action(logger.info)
429− def back(self):
430− self.pointing_device.click_object(self._get_back_button())
431− return get_wizard(self).get_password_page()
432−
433− @autopilot.logging.log_action(logger.info)
434− def skip(self):
435− self.pointing_device.click_object(self._get_skip_button())
436− return self._get_next_page()
437−
438− @autopilot.logging.log_action(logger.info)
439− def continue_(self):
440− self.pointing_device.click_object(self._get_continue_button())
441− return self._get_next_page()
442−
443−
444−class LocationPage(UbuntuUIToolkitCustomProxyObjectBase):
445− """Helper class to interact with the LocationPage"""
446−
447− @classmethod
448− def validate_dbus_object(cls, path, state):
449− name = introspection.get_classname_from_path(path)
450− if name == b'Page':
451− if state['objectName'][1] == 'locationPage':
452− return True
453− return False
454−
455− def _get_back_button(self):
456− return self.select_single('StackButton', text='Back')
457−
458− def _get_continue_button(self):
459− return self.select_single('StackButton', text='Continue')
460−
461− @autopilot.logging.log_action(logger.info)
462− def back(self):
463− self.pointing_device.click_object(self._get_back_button())
464− return get_wizard(self).get_wifi_connect_page()
465−
466− @autopilot.logging.log_action(logger.info)
467− def continue_(self):
468− self.pointing_device.click_object(self._get_continue_button())
469− return get_wizard(self).get_reporting_page()
470−
471−
472−class Notification(UbuntuUIToolkitCustomProxyObjectBase):
473− """Base class for notification objects"""
474− pass
475−
476−
477−class PasswordNotification(Notification):
478− """Helper class to interact with the password entry notification"""
479−
480− def __init__(self, notification):
481− self.notification = notification
482−
483− def _get_connect_button(self):
484− return self.notification.wait_select_single(
485− 'Button', text='Connect', objectName='notify_button0')
486−
487− def _get_cancel_buttoon(self):
488− return self.notification.wait_select_single(
489− 'Button', text='Cancel', objectName='notify_button1')
490−
491− def _get_text_field(self):
492− return self.notification.wait_select_single('TextField')
493−
494− @autopilot.logging.log_action(logger.info)
495− def enter_text(self, text):
496− self._get_text_field().write(text)
497−
498− @autopilot.logging.log_action(logger.info)
499− def connect(self):
500− self.notification.pointing_device.click_object(
501− self._get_connect_button())
502−
503− @autopilot.logging.log_action(logger.info)
504− def cancel(self):
505− self.notification.pointing_device.click_object(
506− self._get_cancel_buttoon())
507−
508−
509−class ReportingPage(UbuntuUIToolkitCustomProxyObjectBase):
510− """Helper class to interact with the reporting page"""
511−
512− @classmethod
513− def validate_dbus_object(cls, path, state):
514− name = introspection.get_classname_from_path(path)
515− if name == b'Page':
516− if state['objectName'][1] == 'reportingPage':
517− return True
518− return False
519−
520− def _get_continue_button(self):
521− return self.select_single('StackButton', text='Continue')
522−
523− def _get_back_button(self):
524− return self.select_single('StackButton', text='Back')
525−
526− @autopilot.logging.log_action(logger.info)
527− def back(self):
528− self.pointing_device.click_object(self._get_back_button())
529− return get_wizard(self).get_wifi_connect_page()
530−
531− @autopilot.logging.log_action(logger.info)
532− def continue_(self):
533− self.pointing_device.click_object(self._get_continue_button())
534− return get_wizard(self).get_finished_page()
535−
536−
537−class FinishedPage(UbuntuUIToolkitCustomProxyObjectBase):
538− """Helper class to interact with the finished page"""
539−
540− @classmethod
541− def validate_dbus_object(cls, path, state):
542− name = introspection.get_classname_from_path(path)
543− if name == b'Page':
544− if state['objectName'][1] == 'finishedPage':
545− return True
546− return False
547−
548− def _get_finish_button(self):
549− return self.wait_select_single(
550− 'StackButton', text='Finish', visible='True')
551−
552− @autopilot.logging.log_action(logger.info)
553− def finish(self):
554− self.pointing_device.click_object(self._get_finish_button())
555− self.wait_until_destroyed()
tests/autopilot/unity8/settings_wizard/fixture_setup.pydeleted−58
@@ -1,58 +0,0 @@
1−# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2−#
3−# Unity Autopilot Test Suite
4−# Copyright (C) 2015 Canonical
5−#
6−# This program is free software: you can redistribute it and/or modify
7−# it under the terms of the GNU General Public License as published by
8−# the Free Software Foundation, either version 3 of the License, or
9−# (at your option) any later version.
10−#
11−# This program is distributed in the hope that it will be useful,
12−# but WITHOUT ANY WARRANTY; without even the implied warranty of
13−# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14−# GNU General Public License for more details.
15−#
16−# You should have received a copy of the GNU General Public License
17−# along with this program. If not, see <http://www.gnu.org/licenses/>.
18−#
19−
20−"""Set up and clean up fixtures for the Unity SettingsWizard tests."""
21−
22−import fixtures
23−import os
24−
25−from os.path import expanduser
26−
27−
28−class SettingsWizard(fixtures.Fixture):
29− WIZARD_FILE = expanduser("~") + \
30− '/.config/ubuntu-system-settings/wizard-has-run'
31−
32− def __init__(self, enable):
33− super().__init__()
34− self.enable = enable
35−
36− def setUp(self):
37− super().setUp()
38− original_state = self.is_settings_wizard_enabled()
39− self.addCleanup(self.set_settings_wizard, original_state)
40− if self.enable != original_state:
41− self.set_settings_wizard(self.enable)
42−
43− def is_settings_wizard_enabled(self):
44− return not os.path.exists(self.WIZARD_FILE)
45−
46− def set_settings_wizard(self, enabled):
47− if enabled:
48− self.enable_settings_wizard()
49− else:
50− self.disable_settings_wizard()
51−
52− def enable_settings_wizard(self):
53− if os.path.exists(self.WIZARD_FILE):
54− os.remove(self.WIZARD_FILE)
55−
56− def disable_settings_wizard(self):
57− if not os.path.exists(self.WIZARD_FILE):
58− open(self.WIZARD_FILE, 'a').close()
tests/autopilot/unity8/settings_wizard/ofono_helper.pydeleted−116
@@ -1,116 +0,0 @@
1−#!/usr/bin/python -tt
2−
3−# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
4−#
5−# Unity Indicators Autopilot Test Suite
6−# Copyright (C) 2014, 2015 Canonical
7−#
8−# This program is free software: you can redistribute it and/or modify
9−# it under the terms of the GNU General Public License as published by
10−# the Free Software Foundation, either version 3 of the License, or
11−# (at your option) any later version.
12−#
13−# This program is distributed in the hope that it will be useful,
14−# but WITHOUT ANY WARRANTY; without even the implied warranty of
15−# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16−# GNU General Public License for more details.
17−#
18−# You should have received a copy of the GNU General Public License
19−# along with this program. If not, see <http://www.gnu.org/licenses/>.
20−
21−
22−from __future__ import absolute_import
23−
24−import dbus
25−import subprocess
26−from time import sleep
27−
28−
29−class OfonoManager(object):
30−
31− def __init__(self):
32− self.system_bus = dbus.SystemBus()
33− self.ofono = self.system_bus.get_object('org.ofono', '/')
34−
35− self.real_manager = dbus.Interface(
36− self.ofono,
37− 'org.ofono.Manager'
38− )
39−
40− def _get_sim_manager(self):
41− modems = self.real_manager.GetModems()
42− path = modems[0][0]
43− return dbus.Interface(self.system_bus.get_object('org.ofono', path),
44− 'org.ofono.SimManager')
45−
46− def physical_sim_is_present(self):
47− sim_manager = self._get_sim_manager()
48− properties = sim_manager.GetProperties()
49− return properties["Present"] == 1
50−
51−
52−class PhonesimManager(object):
53−
54− def __init__(self, sims, exe=None):
55− if exe is None:
56− self.phonesim_exe = '/usr/bin/ofono-phonesim'
57− else:
58− self.phonesim_exe = exe
59− self.sims = sims
60− self.sim_processes = {}
61− self.system_bus = dbus.SystemBus()
62− self.ofono = self.system_bus.get_object('org.ofono', '/')
63−
64− self.phonesim_manager = dbus.Interface(
65− self.ofono,
66− 'org.ofono.phonesim.Manager'
67− )
68−
69− def start_phonesim_processes(self):
70− for simname, simport, conffile in self.sims:
71− cmd = ['/usr/bin/xvfb-run',
72− '-a',
73− self.phonesim_exe,
74− '-p',
75− str(simport),
76− conffile]
77−
78− p = subprocess.Popen(cmd)
79− self.sim_processes[simname] = p
80− # give the processes some time to start
81− sleep(3)
82−
83− def shutdown(self):
84− for p in self.sim_processes.values():
85− p.kill()
86− self.sim_processes = {}
87−
88− def reset_ofono(self):
89− self.phonesim_manager.Reset()
90−
91− def remove_all_ofono(self):
92− self.phonesim_manager.RemoveAll()
93−
94− def add_ofono(self, name):
95− for simname, simport, _ in self.sims:
96− if name == simname:
97− self.phonesim_manager.Add(simname, '127.0.0.1', str(simport))
98− return
99− raise RuntimeError('Tried to add unknown modem %s.' % name)
100−
101− def power_on(self, sim_name):
102− sim = self.system_bus.get_object('org.ofono', '/'+sim_name)
103− modem = dbus.Interface(sim, dbus_interface='org.ofono.Modem')
104− modem.SetProperty('Powered', True)
105− sleep(1)
106−
107− def power_off(self, sim_name):
108− sim = self.system_bus.get_object('org.ofono', '/'+sim_name)
109− modem = dbus.Interface(sim, dbus_interface='org.ofono.Modem')
110− modem.SetProperty('Powered', False)
111− sleep(1)
112−
113− def get_required_pin(self, sim_name):
114− sim = self.system_bus.get_object('org.ofono', '/'+sim_name)
115− interface = dbus.Interface(sim, dbus_interface='org.ofono.SimManager')
116− return str(interface.GetProperties()['PinRequired'])
tests/autopilot/unity8/settings_wizard/tests/__init__.pydeleted

No changes to the content.

tests/autopilot/unity8/settings_wizard/tests/test_settings_wizard.pydeleted−99
@@ -1,99 +0,0 @@
1−# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2−#
3−# Unity Autopilot Test Suite
4−# Copyright (C) 2015 Canonical
5−#
6−# This program is free software: you can redistribute it and/or modify
7−# it under the terms of the GNU General Public License as published by
8−# the Free Software Foundation, either version 3 of the License, or
9−# (at your option) any later version.
10−#
11−# This program is distributed in the hope that it will be useful,
12−# but WITHOUT ANY WARRANTY; without even the implied warranty of
13−# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14−# GNU General Public License for more details.
15−#
16−# You should have received a copy of the GNU General Public License
17−# along with this program. If not, see <http://www.gnu.org/licenses/>.
18−#
19−
20−from unity8.settings_wizard import fixture_setup, Wizard
21−from unity8.shell import tests
22−
23−DEFAULT_LANGUAGE = 'English (United States)'
24−DEFAULT_PHONESIM_CONFIG_FILE = '/usr/share/phonesim/default.xml'
25−DEFAULT_SECURITY_METHOD = 'Passcode'
26−
27−
28−class SkipThroughSettingsWizardTestCase(tests.UnityTestCase):
29− """ Autopilot test for completing settings wizard """
30−
31− def setUp(self):
32− super().setUp()
33− self.wizard_helper = self.useFixture(
34− fixture_setup.SettingsWizard(True))
35− self.unity = self.launch_unity()
36− self.wizard = self._get_settings_wizard()
37−
38− def _get_settings_wizard(self):
39− return self.unity.wait_select_single(Wizard)
40−
41− def _test_language_page(self):
42− """ Get the language page, check the default language and continue """
43− language_page = self.wizard.get_language_page()
44− default_selection = language_page.get_selected_language()
45− self.assertEqual(default_selection, DEFAULT_LANGUAGE)
46− return language_page.continue_()
47−
48− def _test_location_page(self, location_page):
49− return location_page.continue_()
50−
51− def _test_password_page(self, password_page):
52− """ Check default selection for password type and change
53− password type to swipe to keep this test as uncomplicated
54− as possible """
55− default_selection = password_page.get_selected_security_option()
56− self.assertEqual(default_selection, DEFAULT_SECURITY_METHOD)
57− password_page.select_security_option('Swipe')
58− return password_page.continue_()
59−
60− def _test_reporting_page(self, reporting_page):
61− return reporting_page.continue_()
62−
63− def _test_sim_page(self, sim_page):
64− return sim_page.skip()
65−
66− def _test_wifi_connect_page(self, wifi_connect_page):
67− if wifi_connect_page.is_any_network_checked() or not \
68− wifi_connect_page.is_any_network_found():
69− return wifi_connect_page.continue_()
70− else:
71− return wifi_connect_page.skip()
72−
73− def test_skipping_through_wizard(self):
74− """ Most basic test of the settings wizard. Skip all skipable pages """
75− sim_inserted, next_page = self._test_language_page()
76− if not sim_inserted:
77− sim_page = next_page
78− password_page = self._test_sim_page(sim_page)
79− else:
80− password_page = next_page
81− wifi_connect_page = self._test_password_page(password_page)
82−
83− reporting_page = None
84− locationPageEnabled, reportingPageEnabled, next_page = self._test_wifi_connect_page(wifi_connect_page)
85− if locationPageEnabled:
86− location_page = next_page
87− if reportingPageEnabled:
88− reporting_page = self._test_location_page(location_page)
89− else:
90− finish_page = next_page
91−
92− if reporting_page is not None:
93− finish_page = self._test_reporting_page(reporting_page)
94− else:
95− finish_page = next_page
96−
97− finish_page.finish()
98− self.assertFalse(
99− self.wizard_helper.is_settings_wizard_enabled())
tests/libs/UbuntuGestures/tst_TouchRegistry.cpp+1−1
@@ -712,7 +712,7 @@ void tst_TouchRegistry::rejectingTouchfterItsEnd()
712 touchRegistry->removeCandidateOwnerForTouch(0, &earlyCandidate);
712 touchRegistry->removeCandidateOwnerForTouch(0, &earlyCandidate);
713
713
714 QCOMPARE(lateCandidate.ownedTouches.count(), 1);
714 QCOMPARE(lateCandidate.ownedTouches.count(), 1);
715− QCOMPARE(lateCandidate.ownedTouches.contains(0), 1);
715+ QVERIFY(lateCandidate.ownedTouches.contains(0));
716
716
717 // Check that there's no trace left of touch 0 as we no longer need to keep tabs on it.
717 // Check that there's no trace left of touch 0 as we no longer need to keep tabs on it.
718 QVERIFY(!touchRegistry->findTouchInfo(0));
718 QVERIFY(!touchRegistry->findTouchInfo(0));
tests/mocks/QtMultimedia/audio.cpp+13
@@ -34,6 +34,19 @@ Audio::Audio(QObject* parent):
34 Q_EMIT durationChanged(m_duration);
34 Q_EMIT durationChanged(m_duration);
35}
35}
36
36
37+QUrl Audio::source() const
38+{
39+ return m_source;
40+}
41+
42+void Audio::setSource(const QUrl &source)
43+{
44+ if (m_source != source) {
45+ m_source = source;
46+ Q_EMIT sourceChanged(source);
47+ }
48+}
49+
37Audio::PlaybackState Audio::playbackState() const
50Audio::PlaybackState Audio::playbackState() const
38{
51{
39 return m_playbackState;
52 return m_playbackState;
tests/mocks/QtMultimedia/audio.h+5
@@ -29,6 +29,7 @@ class Audio: public QObject
29 Q_OBJECT
29 Q_OBJECT
30 Q_ENUMS(PlaybackState)
30 Q_ENUMS(PlaybackState)
31 Q_ENUMS(AudioRole)
31 Q_ENUMS(AudioRole)
32+ Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
32 Q_PROPERTY(PlaybackState playbackState READ playbackState NOTIFY playbackStateChanged)
33 Q_PROPERTY(PlaybackState playbackState READ playbackState NOTIFY playbackStateChanged)
33 Q_PROPERTY(int position READ position NOTIFY positionChanged)
34 Q_PROPERTY(int position READ position NOTIFY positionChanged)
34 Q_PROPERTY(int duration READ duration NOTIFY durationChanged)
35 Q_PROPERTY(int duration READ duration NOTIFY durationChanged)
@@ -51,6 +52,9 @@ public:
51
52
52 explicit Audio(QObject *parent = 0);
53 explicit Audio(QObject *parent = 0);
53
54
55+ QUrl source() const;
56+ void setSource(const QUrl &source);
57+
54 DeclarativePlaylist *playlist() const;
58 DeclarativePlaylist *playlist() const;
55 void setPlaylist(DeclarativePlaylist *playlist);
59 void setPlaylist(DeclarativePlaylist *playlist);
56
60
@@ -82,6 +86,7 @@ private Q_SLOTS:
82 void timerEvent();
86 void timerEvent();
83
87
84private:
88private:
89+ QUrl m_source;
85 PlaybackState m_playbackState;
90 PlaybackState m_playbackState;
86 QTimer m_timer;
91 QTimer m_timer;
87 int m_position;
92 int m_position;
tests/mocks/Unity/InputInfo/qinputdeviceinfo_mock.cpp+1−1
@@ -23,7 +23,7 @@ QInputDeviceManagerPrivate::QInputDeviceManagerPrivate(QObject *parent) :
23 QObject(parent),
23 QObject(parent),
24 currentFilter(QInputDevice::Unknown)
24 currentFilter(QInputDevice::Unknown)
25{
25{
26− QTimer::singleShot(1, SIGNAL(ready()));
26+ QTimer::singleShot(1, this, SIGNAL(ready()));
27}
27}
28
28
29QInputDeviceManagerPrivate::~QInputDeviceManagerPrivate()
29QInputDeviceManagerPrivate::~QInputDeviceManagerPrivate()
tests/mocks/Unity/Notifications/MockNotificationModel.cpp+6−11
@@ -90,6 +90,7 @@ QVariant MockNotificationModel::data(const QModelIndex &index, int role) const {
90}
90}
91
91
92void MockNotificationModel::append(MockNotification* n) {
92void MockNotificationModel::append(MockNotification* n) {
93+ QQmlEngine::setObjectOwnership(n, QQmlEngine::CppOwnership);
93 int location = m_queue.size();
94 int location = m_queue.size();
94 QModelIndex insertionPoint = QModelIndex();
95 QModelIndex insertionPoint = QModelIndex();
95 beginInsertRows(insertionPoint, location, location);
96 beginInsertRows(insertionPoint, location, location);
@@ -98,9 +99,10 @@ void MockNotificationModel::append(MockNotification* n) {
98}
99}
99
100
100MockNotification* MockNotificationModel::getNotification(int id) const {
101MockNotification* MockNotificationModel::getNotification(int id) const {
101− for(int i=0; i < m_queue.size(); i++) {
102+ for(int i = 0; i < m_queue.size(); i++) {
103+ MockNotification* n = m_queue.at(i);
102− if(m_queue[i]->getID() == id) {
104+ if(n && n->getID() == id) {
103− return m_queue[i];
105+ return n;
104 }
106 }
105 }
107 }
106
108
@@ -130,14 +132,7 @@ void MockNotificationModel::removeInternal(int loc) {
130}
132}
131
133
132MockNotification* MockNotificationModel::getRaw(const int notificationId) const {
134MockNotification* MockNotificationModel::getRaw(const int notificationId) const {
133− for(int i = 0; i < m_queue.size(); i++) {
134− if(m_queue[i]->getID() == notificationId) {
135+ return getNotification(notificationId);
135− MockNotification* n = m_queue[i];
136− return n;
137− }
138− }
139−
140− return nullptr;
141}
136}
142
137
143int MockNotificationModel::queued() const {
138int MockNotificationModel::queued() const {
tests/plugins/Dash/cardcreator/1.res+4−11
@@ -30,14 +30,6 @@ Item {
30 objectName: "artShape";
30 objectName: "artShape";
31 visible: image.status == Image.Ready;
31 visible: image.status == Image.Ready;
32 readonly property alias image: artImage;
32 readonly property alias image: artImage;
33− ShaderEffectSource {
34− id: artShapeSource;
35− sourceItem: artImage;
36− anchors.centerIn: parent;
37− width: 1;
38− height: 1;
39− hideSource: true;
40− }
41 Loader {
33 Loader {
42 anchors.fill: parent;
34 anchors.fill: parent;
43 visible: true;
35 visible: true;
@@ -45,7 +37,7 @@ Item {
45 Component {
37 Component {
46 id: artShapeShapeComponent;
38 id: artShapeShapeComponent;
47 UbuntuShape {
39 UbuntuShape {
48− source: artShapeSource;
40+ source: artImage;
49 sourceFillMode: UbuntuShape.PreserveAspectCrop;
41 sourceFillMode: UbuntuShape.PreserveAspectCrop;
50 radius: "medium";
42 radius: "medium";
51 aspect: {
43 aspect: {
@@ -60,7 +52,7 @@ Item {
60 }
52 }
61 Component {
53 Component {
62 id: artShapeIconComponent;
54 id: artShapeIconComponent;
63− ProportionalShape { source: artShapeSource; aspect: UbuntuShape.DropShadow; }
55+ ProportionalShape { source: artImage; aspect: UbuntuShape.DropShadow; }
64 }
56 }
65 }
57 }
66 readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1;
58 readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1;
@@ -81,7 +73,8 @@ Item {
81 objectName: "artImage";
73 objectName: "artImage";
82 source: artShapeLoader.cardArt;
74 source: artShapeLoader.cardArt;
83 asynchronous: true;
75 asynchronous: true;
76+ visible: !true;
84− width: root.width;
77+ width: root.width;
85 height: width / artShape.aspect;
78 height: width / artShape.aspect;
86 }
79 }
87 }
80 }
tests/plugins/Dash/cardcreator/1.res.cardcreator+3−10
@@ -29,14 +29,6 @@ Item {
29 objectName: "artShape";
29 objectName: "artShape";
30 visible: image.status == Image.Ready;
30 visible: image.status == Image.Ready;
31 readonly property alias image: artImage;
31 readonly property alias image: artImage;
32− ShaderEffectSource {
33− id: artShapeSource;
34− sourceItem: artImage;
35− anchors.centerIn: parent;
36− width: 1;
37− height: 1;
38− hideSource: true;
39− }
40 Loader {
32 Loader {
41 anchors.fill: parent;
33 anchors.fill: parent;
42 visible: true;
34 visible: true;
@@ -44,7 +36,7 @@ Item {
44 Component {
36 Component {
45 id: artShapeShapeComponent;
37 id: artShapeShapeComponent;
46 UbuntuShape {
38 UbuntuShape {
47− source: artShapeSource;
39+ source: artImage;
48 sourceFillMode: UbuntuShape.PreserveAspectCrop;
40 sourceFillMode: UbuntuShape.PreserveAspectCrop;
49 radius: "medium";
41 radius: "medium";
50 aspect: {
42 aspect: {
@@ -59,7 +51,7 @@ Item {
59 }
51 }
60 Component {
52 Component {
61 id: artShapeIconComponent;
53 id: artShapeIconComponent;
62− ProportionalShape { source: artShapeSource; aspect: UbuntuShape.DropShadow; }
54+ ProportionalShape { source: artImage; aspect: UbuntuShape.DropShadow; }
63 }
55 }
64 }
56 }
65 readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1;
57 readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1;
@@ -80,6 +72,7 @@ Item {
80 objectName: "artImage";
72 objectName: "artImage";
81 source: artShapeLoader.cardArt;
73 source: artShapeLoader.cardArt;
82 asynchronous: false;
74 asynchronous: false;
75+ visible: !true;
83 width: root.width;
76 width: root.width;
84 height: width / artShape.aspect;
77 height: width / artShape.aspect;
85 }
78 }
tests/plugins/Dash/cardcreator/11.res+3−10
@@ -68,14 +68,6 @@ Item {
68 objectName: "artShape";
68 objectName: "artShape";
69 visible: image.status == Image.Ready;
69 visible: image.status == Image.Ready;
70 readonly property alias image: artImage;
70 readonly property alias image: artImage;
71− ShaderEffectSource {
72− id: artShapeSource;
73− sourceItem: artImage;
74− anchors.centerIn: parent;
75− width: 1;
76− height: 1;
77− hideSource: true;
78− }
79 Loader {
71 Loader {
80 anchors.fill: parent;
72 anchors.fill: parent;
81 visible: true;
73 visible: true;
@@ -83,7 +75,7 @@ Item {
83 Component {
75 Component {
84 id: artShapeShapeComponent;
76 id: artShapeShapeComponent;
85 UbuntuShape {
77 UbuntuShape {
86− source: artShapeSource;
78+ source: artImage;
87 sourceFillMode: UbuntuShape.PreserveAspectCrop;
79 sourceFillMode: UbuntuShape.PreserveAspectCrop;
88 radius: "medium";
80 radius: "medium";
89 aspect: {
81 aspect: {
@@ -98,7 +90,7 @@ Item {
98 }
90 }
99 Component {
91 Component {
100 id: artShapeIconComponent;
92 id: artShapeIconComponent;
101− ProportionalShape { source: artShapeSource; aspect: UbuntuShape.DropShadow; }
93+ ProportionalShape { source: artImage; aspect: UbuntuShape.DropShadow; }
102 }
94 }
103 }
95 }
104 readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1;
96 readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1;
@@ -119,6 +111,7 @@ Item {
119 objectName: "artImage";
111 objectName: "artImage";
120 source: artShapeLoader.cardArt;
112 source: artShapeLoader.cardArt;
121 asynchronous: true;
113 asynchronous: true;
114+ visible: !true;
122 width: root.width;
115 width: root.width;
123 height: width / artShape.aspect;
116 height: width / artShape.aspect;
124 onStatusChanged: if (status === Image.Error) source = decodeURI("%5C");
117 onStatusChanged: if (status === Image.Error) source = decodeURI("%5C");
tests/plugins/Dash/cardcreator/11.res.cardcreator+3−10
@@ -67,14 +67,6 @@ Item {
67 objectName: "artShape";
67 objectName: "artShape";
68 visible: image.status == Image.Ready;
68 visible: image.status == Image.Ready;
69 readonly property alias image: artImage;
69 readonly property alias image: artImage;
70− ShaderEffectSource {
71− id: artShapeSource;
72− sourceItem: artImage;
73− anchors.centerIn: parent;
74− width: 1;
75− height: 1;
76− hideSource: true;
77− }
78 Loader {
70 Loader {
79 anchors.fill: parent;
71 anchors.fill: parent;
80 visible: true;
72 visible: true;
@@ -82,7 +74,7 @@ Item {
82 Component {
74 Component {
83 id: artShapeShapeComponent;
75 id: artShapeShapeComponent;
84 UbuntuShape {
76 UbuntuShape {
85− source: artShapeSource;
77+ source: artImage;
86 sourceFillMode: UbuntuShape.PreserveAspectCrop;
78 sourceFillMode: UbuntuShape.PreserveAspectCrop;
87 radius: "medium";
79 radius: "medium";
88 aspect: {
80 aspect: {
@@ -97,7 +89,7 @@ Item {
97 }
89 }
98 Component {
90 Component {
99 id: artShapeIconComponent;
91 id: artShapeIconComponent;
100− ProportionalShape { source: artShapeSource; aspect: UbuntuShape.DropShadow; }
92+ ProportionalShape { source: artImage; aspect: UbuntuShape.DropShadow; }
101 }
93 }
102 }
94 }
103 readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1;
95 readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1;
@@ -118,6 +110,7 @@ Item {
118 objectName: "artImage";
110 objectName: "artImage";
119 source: artShapeLoader.cardArt;
111 source: artShapeLoader.cardArt;
120 asynchronous: false;
112 asynchronous: false;
113+ visible: !true;
121 width: root.width;
114 width: root.width;
122 height: width / artShape.aspect;
115 height: width / artShape.aspect;
123 }
116 }
tests/plugins/Dash/cardcreator/3.res+3−10
@@ -30,14 +30,6 @@ Item {
30 objectName: "artShape";
30 objectName: "artShape";
31 visible: image.status == Image.Ready;
31 visible: image.status == Image.Ready;
32 readonly property alias image: artImage;
32 readonly property alias image: artImage;
33− ShaderEffectSource {
34− id: artShapeSource;
35− sourceItem: artImage;
36− anchors.centerIn: parent;
37− width: 1;
38− height: 1;
39− hideSource: true;
40− }
41 Loader {
33 Loader {
42 anchors.fill: parent;
34 anchors.fill: parent;
43 visible: true;
35 visible: true;
@@ -45,7 +37,7 @@ Item {
45 Component {
37 Component {
46 id: artShapeShapeComponent;
38 id: artShapeShapeComponent;
47 UbuntuShape {
39 UbuntuShape {
48− source: artShapeSource;
40+ source: artImage;
49 sourceFillMode: UbuntuShape.PreserveAspectCrop;
41 sourceFillMode: UbuntuShape.PreserveAspectCrop;
50 radius: "medium";
42 radius: "medium";
51 aspect: {
43 aspect: {
@@ -60,7 +52,7 @@ Item {
60 }
52 }
61 Component {
53 Component {
62 id: artShapeIconComponent;
54 id: artShapeIconComponent;
63− ProportionalShape { source: artShapeSource; aspect: UbuntuShape.DropShadow; }
55+ ProportionalShape { source: artImage; aspect: UbuntuShape.DropShadow; }
64 }
56 }
65 }
57 }
66 readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1;
58 readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1;
@@ -81,6 +73,7 @@ Item {
81 objectName: "artImage";
73 objectName: "artImage";
82 source: artShapeLoader.cardArt;
74 source: artShapeLoader.cardArt;
83 asynchronous: true;
75 asynchronous: true;
76+ visible: !true;
84 width: root.width;
77 width: root.width;
85 height: width / artShape.aspect;
78 height: width / artShape.aspect;
86 onStatusChanged: if (status === Image.Error) source = decodeURI("IHAVE%5C%22ESCAPED%5C%22QUOTES%5C%22");
79 onStatusChanged: if (status === Image.Error) source = decodeURI("IHAVE%5C%22ESCAPED%5C%22QUOTES%5C%22");
tests/plugins/Dash/cardcreator/3.res.cardcreator+3−10
@@ -29,14 +29,6 @@ Item {
29 objectName: "artShape";
29 objectName: "artShape";
30 visible: image.status == Image.Ready;
30 visible: image.status == Image.Ready;
31 readonly property alias image: artImage;
31 readonly property alias image: artImage;
32− ShaderEffectSource {
33− id: artShapeSource;
34− sourceItem: artImage;
35− anchors.centerIn: parent;
36− width: 1;
37− height: 1;
38− hideSource: true;
39− }
40 Loader {
32 Loader {
41 anchors.fill: parent;
33 anchors.fill: parent;
42 visible: true;
34 visible: true;
@@ -44,7 +36,7 @@ Item {
44 Component {
36 Component {
45 id: artShapeShapeComponent;
37 id: artShapeShapeComponent;
46 UbuntuShape {
38 UbuntuShape {
47− source: artShapeSource;
39+ source: artImage;
48 sourceFillMode: UbuntuShape.PreserveAspectCrop;
40 sourceFillMode: UbuntuShape.PreserveAspectCrop;
49 radius: "medium";
41 radius: "medium";
50 aspect: {
42 aspect: {
@@ -59,7 +51,7 @@ Item {
59 }
51 }
60 Component {
52 Component {
61 id: artShapeIconComponent;
53 id: artShapeIconComponent;
62− ProportionalShape { source: artShapeSource; aspect: UbuntuShape.DropShadow; }
54+ ProportionalShape { source: artImage; aspect: UbuntuShape.DropShadow; }
63 }
55 }
64 }
56 }
65 readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1;
57 readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1;
@@ -80,6 +72,7 @@ Item {
80 objectName: "artImage";
72 objectName: "artImage";
81 source: artShapeLoader.cardArt;
73 source: artShapeLoader.cardArt;
82 asynchronous: false;
74 asynchronous: false;
75+ visible: !true;
83 width: root.width;
76 width: root.width;
84 height: width / artShape.aspect;
77 height: width / artShape.aspect;
85 }
78 }
tests/plugins/Dash/cardcreator/5.res+3−10
@@ -30,14 +30,6 @@ Item {
30 objectName: "artShape";
30 objectName: "artShape";
31 visible: image.status == Image.Ready;
31 visible: image.status == Image.Ready;
32 readonly property alias image: artImage;
32 readonly property alias image: artImage;
33− ShaderEffectSource {
34− id: artShapeSource;
35− sourceItem: artImage;
36− anchors.centerIn: parent;
37− width: 1;
38− height: 1;
39− hideSource: false;
40− }
41 Loader {
33 Loader {
42 anchors.fill: parent;
34 anchors.fill: parent;
43 visible: false;
35 visible: false;
@@ -45,7 +37,7 @@ Item {
45 Component {
37 Component {
46 id: artShapeShapeComponent;
38 id: artShapeShapeComponent;
47 UbuntuShape {
39 UbuntuShape {
48− source: artShapeSource;
40+ source: artImage;
49 sourceFillMode: UbuntuShape.PreserveAspectCrop;
41 sourceFillMode: UbuntuShape.PreserveAspectCrop;
50 radius: "medium";
42 radius: "medium";
51 aspect: {
43 aspect: {
@@ -60,7 +52,7 @@ Item {
60 }
52 }
61 Component {
53 Component {
62 id: artShapeIconComponent;
54 id: artShapeIconComponent;
63− ProportionalShape { source: artShapeSource; aspect: UbuntuShape.DropShadow; }
55+ ProportionalShape { source: artImage; aspect: UbuntuShape.DropShadow; }
64 }
56 }
65 }
57 }
66 readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1;
58 readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1;
@@ -81,6 +73,7 @@ Item {
81 objectName: "artImage";
73 objectName: "artImage";
82 source: artShapeLoader.cardArt;
74 source: artShapeLoader.cardArt;
83 asynchronous: true;
75 asynchronous: true;
76+ visible: !false;
84 width: root.width;
77 width: root.width;
85 height: width / artShape.aspect;
78 height: width / artShape.aspect;
86 }
79 }
tests/plugins/Dash/cardcreator/5.res.cardcreator+3−10
@@ -29,14 +29,6 @@ Item {
29 objectName: "artShape";
29 objectName: "artShape";
30 visible: image.status == Image.Ready;
30 visible: image.status == Image.Ready;
31 readonly property alias image: artImage;
31 readonly property alias image: artImage;
32− ShaderEffectSource {
33− id: artShapeSource;
34− sourceItem: artImage;
35− anchors.centerIn: parent;
36− width: 1;
37− height: 1;
38− hideSource: false;
39− }
40 Loader {
32 Loader {
41 anchors.fill: parent;
33 anchors.fill: parent;
42 visible: false;
34 visible: false;
@@ -44,7 +36,7 @@ Item {
44 Component {
36 Component {
45 id: artShapeShapeComponent;
37 id: artShapeShapeComponent;
46 UbuntuShape {
38 UbuntuShape {
47− source: artShapeSource;
39+ source: artImage;
48 sourceFillMode: UbuntuShape.PreserveAspectCrop;
40 sourceFillMode: UbuntuShape.PreserveAspectCrop;
49 radius: "medium";
41 radius: "medium";
50 aspect: {
42 aspect: {
@@ -59,7 +51,7 @@ Item {
59 }
51 }
60 Component {
52 Component {
61 id: artShapeIconComponent;
53 id: artShapeIconComponent;
62− ProportionalShape { source: artShapeSource; aspect: UbuntuShape.DropShadow; }
54+ ProportionalShape { source: artImage; aspect: UbuntuShape.DropShadow; }
63 }
55 }
64 }
56 }
65 readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1;
57 readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1;
@@ -80,6 +72,7 @@ Item {
80 objectName: "artImage";
72 objectName: "artImage";
81 source: artShapeLoader.cardArt;
73 source: artShapeLoader.cardArt;
82 asynchronous: false;
74 asynchronous: false;
75+ visible: !false;
83 width: root.width;
76 width: root.width;
84 height: width / artShape.aspect;
77 height: width / artShape.aspect;
85 }
78 }
tests/plugins/Dash/listviewwithpageheadersectiontest.cpp+15
@@ -2182,6 +2182,21 @@ private Q_SLOTS:
2182 verifyItem(2, 480., 390., false, "Agressive", false);
2182 verifyItem(2, 480., 390., false, "Agressive", false);
2183 }
2183 }
2184
2184
2185+ void firstItemSectionHeightChange()
2186+ {
2187+ QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 1), Q_ARG(QVariant, 5));
2188+ model->setProperty(0, "type", "halfheight");
2189+ verifyItem(0, 50., 170., false, "halfheight", false);
2190+ }
2191+
2192+ void secondItemSectionHeightChange()
2193+ {
2194+ QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 2), Q_ARG(QVariant, 4));
2195+ model->setProperty(1, "type", "halfheight");
2196+ verifyItem(0, 50., 190., false, "Agressive", false);
2197+ verifyItem(1, 240., 220., false, "halfheight", false);
2198+ }
2199+
2185private:
2200private:
2186 QQuickView *view;
2201 QQuickView *view;
2187 ListViewWithPageHeader *lvwph;
2202 ListViewWithPageHeader *lvwph;
tests/plugins/Dash/listviewwithpageheadertest.cpp+15
@@ -1979,6 +1979,21 @@ private Q_SLOTS:
1979 verifyItem(0, 50., 200., false);
1979 verifyItem(0, 50., 200., false);
1980 }
1980 }
1981
1981
1982+ void testBug1569976()
1983+ {
1984+ QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 3), Q_ARG(QVariant, 3));
1985+
1986+ for (int i = 0; i < 10; ++i) {
1987+ scrollToBottom();
1988+ lvwph->showHeader();
1989+ QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning());
1990+ scrollToTop();
1991+ }
1992+ verifyItem(0, 50., 150., false);
1993+ verifyItem(1, 200., 200., false);
1994+ verifyItem(2, 400., 350., false);
1995+ }
1996+
1982private:
1997private:
1983 QQuickView *view;
1998 QQuickView *view;
1984 ListViewWithPageHeader *lvwph;
1999 ListViewWithPageHeader *lvwph;
tests/plugins/Dash/listviewwithpageheadertestsection.qml+1−1
@@ -98,7 +98,7 @@ Rectangle {
98 sectionDelegate: Component {
98 sectionDelegate: Component {
99 Rectangle {
99 Rectangle {
100 color: "green"
100 color: "green"
101− height: 40
101+ height: section === "" ? 0 : section != "halfheight" ? 40 : 20;
102 Text { text: section; font.pixelSize: 34 }
102 Text { text: section; font.pixelSize: 34 }
103 anchors { left: parent.left; right: parent.right }
103 anchors { left: parent.left; right: parent.right }
104 }
104 }
tests/qmltests/Components/tst_Dialogs.qml+4−2
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2014 Canonical, Ltd.
2+ * Copyright (C) 2014-2016 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 General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -27,6 +27,8 @@ Rectangle {
27 width: units.gu(70)
27 width: units.gu(70)
28 height: fakeShell.longestDimension
28 height: fakeShell.longestDimension
29
29
30+ Component.onCompleted: theme.name = "Ubuntu.Components.Themes.SuruDark" // use the same theme as the real shell
31+
30 QtObject {
32 QtObject {
31 id: fakeUnitySession
33 id: fakeUnitySession
32 signal logoutRequested
34 signal logoutRequested
@@ -69,7 +71,7 @@ Rectangle {
69 }
71 }
70
72
71 Rectangle {
73 Rectangle {
72− color: "white"
74+ color: theme.palette.normal.background
73 x: fakeShell.shortestDimension
75 x: fakeShell.shortestDimension
74 width: root.width - x
76 width: root.width - x
75 anchors {
77 anchors {
tests/qmltests/Dash/Previews/tst_PreviewImageGallery.qml+3−2
@@ -70,8 +70,6 @@ Rectangle {
70 when: windowShown
70 when: windowShown
71
71
72 property Item overlay: findChild(imageGallery.rootItem, "overlay")
72 property Item overlay: findChild(imageGallery.rootItem, "overlay")
73− property Item overlayCloseButton: findChild(overlay, "overlayCloseButton")
74− property Item overlayListView: findChild(overlay, "overlayListView")
75
73
76 function cleanup() {
74 function cleanup() {
77 overlay.hide();
75 overlay.hide();
@@ -87,6 +85,7 @@ Rectangle {
87 }
85 }
88
86
89 function test_overlayOpenClose() {
87 function test_overlayOpenClose() {
88+ var overlayCloseButton = findChild(overlay, "overlayCloseButton");
90 var image0 = findChild(imageGallery, "previewImage0");
89 var image0 = findChild(imageGallery, "previewImage0");
91 mouseClick(image0);
90 mouseClick(image0);
92 tryCompare(overlay, "visible", true);
91 tryCompare(overlay, "visible", true);
@@ -97,6 +96,7 @@ Rectangle {
97 }
96 }
98
97
99 function test_overlayShowHideHeader() {
98 function test_overlayShowHideHeader() {
99+ var overlayCloseButton = findChild(overlay, "overlayCloseButton");
100 var image0 = findChild(imageGallery, "previewImage0");
100 var image0 = findChild(imageGallery, "previewImage0");
101 mouseClick(image0);
101 mouseClick(image0);
102 tryCompare(overlay, "visible", true);
102 tryCompare(overlay, "visible", true);
@@ -117,6 +117,7 @@ Rectangle {
117 }
117 }
118
118
119 function test_overlayOpenCorrectImage(data) {
119 function test_overlayOpenCorrectImage(data) {
120+ var overlayListView = findChild(overlay, "overlayListView");
120 var image = findChild(imageGallery, "previewImage" + data.index);
121 var image = findChild(imageGallery, "previewImage" + data.index);
121 mouseClick(image);
122 mouseClick(image);
122 tryCompare(overlay, "visible", true);
123 tryCompare(overlay, "visible", true);
tests/qmltests/Dash/tst_Card.qml+10−10
@@ -217,16 +217,16 @@ Rectangle {
217
217
218 when: windowShown
218 when: windowShown
219
219
220− property Item title: findChild(card, "titleLabel")
220+ property Item title: findChild(loader, "titleLabel")
221− property Item subtitle: findChild(card, "subtitleLabel")
221+ property Item subtitle: findChild(loader, "subtitleLabel")
222− property var headerRow: findChild(card, "outerRow")
222+ property var headerRow: findChild(loader, "outerRow")
223− property var art: findChild(card, "artShape")
223+ property var art: findChild(loader, "artShape")
224− property Item artImage: findChild(card, "artImage")
224+ property Item artImage: findChild(loader, "artImage")
225− property Item summary: findChild(card, "summaryLabel")
225+ property Item summary: findChild(loader, "summaryLabel")
226− property Item background: findChild(card, "background")
226+ property Item background: findChild(loader, "background")
227− property Item backgroundLoader: findChild(card, "backgroundLoader")
227+ property Item backgroundLoader: findChild(loader, "backgroundLoader")
228− property Item backgroundImage: findChild(card, "backgroundImage")
228+ property Item backgroundImage: findChild(loader, "backgroundImage")
229− property Item mascotImage: findChild(card, "mascotImage");
229+ property Item mascotImage: findChild(loader, "mascotImage");
230
230
231 function init() {
231 function init() {
232 cardTool.components = Qt.binding(function() { return Helpers.update(JSON.parse(Helpers.defaultLayout), Helpers.tryParse(layoutArea.text, layoutError))['components']; });
232 cardTool.components = Qt.binding(function() { return Helpers.update(JSON.parse(Helpers.defaultLayout), Helpers.tryParse(layoutArea.text, layoutError))['components']; });
tests/qmltests/Launcher/tst_Launcher.qml+5−2
@@ -26,10 +26,13 @@ import Utils 0.1 // For EdgeBarrierSettings
26
26
27/* Nothing is shown at first. If you drag from left edge you will bring up the
27/* Nothing is shown at first. If you drag from left edge you will bring up the
28 launcher. */
28 launcher. */
29−Item {
29+Rectangle {
30 id: root
30 id: root
31 width: units.gu(140)
31 width: units.gu(140)
32 height: units.gu(70)
32 height: units.gu(70)
33+ color: UbuntuColors.graphite // something neither white nor black
34+
35+ Component.onCompleted: theme.name = "Ubuntu.Components.Themes.SuruDark"
33
36
34 Loader {
37 Loader {
35 id: launcherLoader
38 id: launcherLoader
@@ -868,7 +871,7 @@ Item {
868
871
869 // Doing longpress
872 // Doing longpress
870 mousePress(draggedItem);
873 mousePress(draggedItem);
871− tryCompare(quickListShape, "opacity", 0.8);
874+ tryCompare(quickListShape, "opacity", 0.95);
872 mouseRelease(draggedItem);
875 mouseRelease(draggedItem);
873
876
874 verify(quickList.y >= units.gu(1));
877 verify(quickList.y >= units.gu(1));
tests/qmltests/Notifications/tst_Notifications.qml+50−54
@@ -31,26 +31,26 @@ Item {
31 height: notificationsRect.height
31 height: notificationsRect.height
32 property int index: 0
32 property int index: 0
33
33
34+ // add the default/PlaceHolder notification to the model
35+ Component.onCompleted: {
36+ var component = Qt.createComponent("Notification.qml")
37+ var n = component.createObject("notification", {"nid": index++,
38+ "type": Notification.PlaceHolder,
39+ "hints": {},
40+ "summary": "",
41+ "body": "",
42+ "icon": "",
43+ "secondaryIcon": "",
44+ "rawActions": []})
45+ n.completed.connect(mockModel.onCompleted)
46+ mockModel.append(n)
47+ }
48+
34 Row {
49 Row {
35 id: rootRow
50 id: rootRow
36
51
37 NotificationModel {
52 NotificationModel {
38 id: mockModel
53 id: mockModel
39−
40− // add the default/PlaceHolder notification to the model
41− Component.onCompleted: {
42− var component = Qt.createComponent("Notification.qml")
43− var n = component.createObject("notification", {"nid": index++,
44− "type": Notification.PlaceHolder,
45− "hints": {},
46− "summary": "",
47− "body": "",
48− "icon": "",
49− "secondaryIcon": "",
50− "rawActions": []})
51− n.completed.connect(mockModel.onCompleted)
52− append(n)
53− }
54 }
54 }
55
55
56 function add2over1SnapDecisionNotification() {
56 function add2over1SnapDecisionNotification() {
@@ -188,7 +188,6 @@ Item {
188 anchors.fill: parent
188 anchors.fill: parent
189 model: mockModel
189 model: mockModel
190 hasMouse: fakeMouseCB.checked
190 hasMouse: fakeMouseCB.checked
191− inverseMode: inverseModeCB.checked
192 }
191 }
193 }
192 }
194
193
@@ -269,15 +268,9 @@ Item {
269 }
268 }
270 }
269 }
271
270
272− RowLayout {
271+ MouseTouchEmulationCheckbox {
273− Layout.fillWidth: true
272+ id: mouseEmulation
274− CheckBox {
273+ checked: false
275− id: inverseModeCB
276− }
277− Label {
278− text: "Inverse mode"
279− anchors.verticalCenter: parent.verticalCenter
280− }
281 }
274 }
282 }
275 }
283 }
276 }
@@ -562,6 +555,12 @@ Item {
562 signalName: "actionInvoked"
555 signalName: "actionInvoked"
563 }
556 }
564
557
558+ function init() {
559+ while (mockModel.count > 0) {
560+ mockModel.remove(0);
561+ }
562+ }
563+
565 function cleanup() {
564 function cleanup() {
566 clickThroughSpy.clear()
565 clickThroughSpy.clear()
567 actionSpy.clear()
566 actionSpy.clear()
@@ -582,10 +581,9 @@ Item {
582 waitForRendering(notifications);
581 waitForRendering(notifications);
583
582
584 var notification = findChild(notifications, "notification" + (mockModel.count - 1))
583 var notification = findChild(notifications, "notification" + (mockModel.count - 1))
585− verify(notification !== undefined, "notification wasn't found");
586−
587 waitForRendering(notification);
584 waitForRendering(notification);
585+ verify(notification, "notification wasn't found");
588− tryCompare(notification, "height", notification.state === "contracted" ? units.gu(10) : notification.implicitHeight);
586+ tryCompare(notification, "height", notification.implicitHeight);
589
587
590 var icon = findChild(notification, "icon")
588 var icon = findChild(notification, "icon")
591 var centeredIcon = findChild(notification, "centeredIcon")
589 var centeredIcon = findChild(notification, "centeredIcon")
@@ -596,7 +594,6 @@ Item {
596 var buttonRow = findChild(notification, "buttonRow")
594 var buttonRow = findChild(notification, "buttonRow")
597 var valueIndicator = findChild(notification, "valueIndicator")
595 var valueIndicator = findChild(notification, "valueIndicator")
598 var valueLabel = findChild(notification, "valueLabel")
596 var valueLabel = findChild(notification, "valueLabel")
599− var innerBar = findChild(notification, "innerBar")
600
597
601 compare(icon.visible, data.iconVisible, "avatar-icon visibility is incorrect")
598 compare(icon.visible, data.iconVisible, "avatar-icon visibility is incorrect")
602 if (icon.visible) {
599 if (icon.visible) {
@@ -607,9 +604,6 @@ Item {
607 compare(centeredIcon.shaped, data.shaped, "shaped-status is incorrect")
604 compare(centeredIcon.shaped, data.shaped, "shaped-status is incorrect")
608 }
605 }
609 compare(valueIndicator.visible, data.valueVisible, "value-indicator visibility is incorrect")
606 compare(valueIndicator.visible, data.valueVisible, "value-indicator visibility is incorrect")
610− if (valueIndicator.visible) {
611− verify(innerBar.color === data.valueTinted ? UbuntuColors.orange : "white", "value-bar has the wrong color-tint")
612− }
613 compare(valueLabel.visible, data.valueLabelVisible, "value-label visibility is incorrect")
607 compare(valueLabel.visible, data.valueLabelVisible, "value-label visibility is incorrect")
614
608
615 // test input does not fall through
609 // test input does not fall through
@@ -629,7 +623,12 @@ Item {
629 // for their height animations to finish before continuing
623 // for their height animations to finish before continuing
630 for (var i = 0; i < mockModel.count; ++i) {
624 for (var i = 0; i < mockModel.count; ++i) {
631 var n = findChild(notifications, "notification" + i)
625 var n = findChild(notifications, "notification" + i)
632− tryCompare(n, "height", n.state === "contracted" ? units.gu(10) : n.implicitHeight);
626+ if (n.type === Notification.PlaceHolder)
627+ continue;
628+ waitForRendering(n);
629+ var outterColumn = findChild(n, "outterColumn");
630+ var shapedBack = findChild(n, "shapedBack");
631+ tryCompare(n, "height", outterColumn.height + n.margins * 2 + shapedBack.anchors.topMargin);
633 }
632 }
634
633
635 if (data.hasSound) {
634 if (data.hasSound) {
@@ -662,7 +661,7 @@ Item {
662 tryCompareFunction(function() { return comboButton.expanded === false; }, true);
661 tryCompareFunction(function() { return comboButton.expanded === false; }, true);
663
662
664 // click to expand
663 // click to expand
665− tryCompareFunction(function() { mouseClick(comboButton, comboButton.width / 2, comboButton.height / 2); return comboButton.expanded === true; }, true);
664+ tryCompareFunction(function() { mouseClick(comboButton, comboButton.width / 2, comboButton.height / 2); return comboButton.expanded; }, true);
666
665
667 // try clicking on choices in expanded comboList
666 // try clicking on choices in expanded comboList
668 var choiceButton1 = findChild(notification, "notify_button3")
667 var choiceButton1 = findChild(notification, "notify_button3")
@@ -676,7 +675,7 @@ Item {
676 actionSpy.clear()
675 actionSpy.clear()
677
676
678 // click to collapse
677 // click to collapse
679− tryCompareFunction(function() { mouseClick(comboButton, comboButton.width / 2, comboButton.height / 2); return comboButton.expanded == false; }, true);
678+ tryCompareFunction(function() { mouseClick(comboButton, comboButton.width / 2, comboButton.height / 2); return !comboButton.expanded; }, true);
680 } else {
679 } else {
681 mouseClick(buttonCancel)
680 mouseClick(buttonCancel)
682 compare(actionSpy.signalArguments[0][0], data.n.actions.data(1, ActionModel.RoleActionId), "got wrong id for negative action")
681 compare(actionSpy.signalArguments[0][0], data.n.actions.data(1, ActionModel.RoleActionId), "got wrong id for negative action")
@@ -691,19 +690,18 @@ Item {
691 var dragY = notification.height / 2;
690 var dragY = notification.height / 2;
692 touchFlick(notification, dragStart, dragY, dragEnd, dragY)
691 touchFlick(notification, dragStart, dragY, dragEnd, dragY)
693 waitForRendering(notification)
692 waitForRendering(notification)
694− if ((data.n.type === Notification.SnapDecision && notification.state === "expanded") || data.n.type === Notification.Confirmation) {
695− tryCompare(mockModel, "count", before)
696− } else {
697− tryCompare(mockModel, "count", before - 1)
693+ tryCompare(mockModel, "count", before - 1)
698− }
699 }
694 }
700
695
701− function test_clickToClose_data() { // reuse the data
696+ function test_closeButton_data() { // reuse the data
702 notifications.hasMouse = true;
697 notifications.hasMouse = true;
703 return test_NotificationRenderer_data();
698 return test_NotificationRenderer_data();
704 }
699 }
705
700
706− function test_clickToClose(data) {
701+ function test_closeButton(data) {
702+ // hook up notification's completed-signal with model's onCompleted-slot, so that remove() (model) happens on close() (notification)
703+ data.n.completed.connect(mockModel.onCompleted)
704+
707 // populate model with some mock notifications
705 // populate model with some mock notifications
708 mockModel.append(data.n)
706 mockModel.append(data.n)
709
707
@@ -712,21 +710,19 @@ Item {
712 waitForRendering(notifications);
710 waitForRendering(notifications);
713
711
714 var notification = findChild(notifications, "notification" + (mockModel.count - 1))
712 var notification = findChild(notifications, "notification" + (mockModel.count - 1))
713+ waitForRendering(notification);
715 verify(!!notification, "notification wasn't found");
714 verify(!!notification, "notification wasn't found");
716
715
717− // click-to-dismiss check
716+ // close button check
718− waitForRendering(notification);
717+ mouseMove(notification, notification.width/2, notification.height/2);
718+ var closeButton = findChild(notification, "closeButton");
719+ tryCompare(closeButton, "visible", true);
719 var before = mockModel.count;
720 var before = mockModel.count;
720− var canBeClosed = notification.canBeClosed;
721− mouseClick(notification);
721+ mouseClick(closeButton);
722−
722+ waitForRendering(notification);
723− if (canBeClosed) {
723+
724− // closing the notification, the model count should be one less
724+ // closing the notification, the model count should be one less
725− tryCompare(mockModel, "count", before - 1)
725+ tryCompare(mockModel, "count", before - 1)
726− } else {
727− // not closing, model stays the same
728− tryCompare(mockModel, "count", before)
729− }
730 }
726 }
731
727
732 function cleanupTestCase() {
728 function cleanupTestCase() {
tests/qmltests/Notifications/tst_OptionToggle.qml+10−1
@@ -36,6 +36,10 @@ Row {
36 console.log("Action invoked", actionId);
36 console.log("Action invoked", actionId);
37 mockModel.actionInvoked(actionId)
37 mockModel.actionInvoked(actionId)
38 }
38 }
39+
40+ function close() {
41+ console.log("Close notification");
42+ }
39 }
43 }
40 }
44 }
41
45
@@ -96,7 +100,7 @@ Row {
96
100
97 width: units.gu(40)
101 width: units.gu(40)
98 height: units.gu(81)
102 height: units.gu(81)
99− color: "#cccccc"
103+ color: theme.palette.normal.background
100
104
101 MouseArea{
105 MouseArea{
102 id: clickThroughCatcher
106 id: clickThroughCatcher
@@ -143,6 +147,11 @@ Row {
143 text: "clear model"
147 text: "clear model"
144 onClicked: clearNotifications()
148 onClicked: clearNotifications()
145 }
149 }
150+
151+ MouseTouchEmulationCheckbox {
152+ id: mouseEmulation
153+ checked: false
154+ }
146 }
155 }
147 }
156 }
148
157
tests/qmltests/Notifications/tst_SwipeToAct.qml+11−1
@@ -37,6 +37,10 @@ Item {
37 function invokeAction(actionId) {
37 function invokeAction(actionId) {
38 mockModel.actionInvoked(actionId)
38 mockModel.actionInvoked(actionId)
39 }
39 }
40+
41+ function close() {
42+ console.log("Close notification");
43+ }
40 }
44 }
41 }
45 }
42
46
@@ -73,7 +77,7 @@ Item {
73 summary: "Incoming call",
77 summary: "Incoming call",
74 body: "Frank Zappa\n+44 (0)7736 027340",
78 body: "Frank Zappa\n+44 (0)7736 027340",
75 icon: Qt.resolvedUrl("../../graphics/avatars/amanda.png"),
79 icon: Qt.resolvedUrl("../../graphics/avatars/amanda.png"),
76− secondaryIcon: "incoming-call",
80+ secondaryIcon: "image://theme/incoming-call",
77 actions: [{ id: "ok_id", label: "Ok"},
81 actions: [{ id: "ok_id", label: "Ok"},
78 { id: "cancel_id", label: "Cancel"},
82 { id: "cancel_id", label: "Cancel"},
79 { id: "foo_id", label: "Foo"},
83 { id: "foo_id", label: "Foo"},
@@ -162,6 +166,11 @@ Item {
162 anchors.verticalCenter: parent.verticalCenter
166 anchors.verticalCenter: parent.verticalCenter
163 }
167 }
164 }
168 }
169+
170+ MouseTouchEmulationCheckbox {
171+ id: mouseEmulation
172+ checked: false
173+ }
165 }
174 }
166 }
175 }
167
176
@@ -301,6 +310,7 @@ Item {
301
310
302 // add a mock mouse, test clicking the left/right buttons
311 // add a mock mouse, test clicking the left/right buttons
303 notifications.hasMouse = true;
312 notifications.hasMouse = true;
313+ waitForRendering(notification);
304 var leftButton = findChild(swipeButton, "leftButton");
314 var leftButton = findChild(swipeButton, "leftButton");
305 var rightButton = findChild(swipeButton, "rightButton");
315 var rightButton = findChild(swipeButton, "rightButton");
306
316
tests/qmltests/Notifications/tst_VisualSnapDecisionsQueue.qml+15−6
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2014 Canonical, Ltd.
2+ * Copyright (C) 2014-2016 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 General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -32,6 +32,10 @@ Row {
32 function invokeAction(actionId) {
32 function invokeAction(actionId) {
33 mockModel.actionInvoked(actionId)
33 mockModel.actionInvoked(actionId)
34 }
34 }
35+
36+ function close() {
37+ console.log("Close notification");
38+ }
35 }
39 }
36 }
40 }
37
41
@@ -180,6 +184,11 @@ Row {
180 text: "clear model"
184 text: "clear model"
181 onClicked: clearNotifications()
185 onClicked: clearNotifications()
182 }
186 }
187+
188+ MouseTouchEmulationCheckbox {
189+ id: mouseEmulation
190+ checked: false
191+ }
183 }
192 }
184 }
193 }
185
194
@@ -207,9 +216,9 @@ Row {
207 }
216 }
208
217
209 // check initial states once all five snap-decisions were appended to the model
218 // check initial states once all five snap-decisions were appended to the model
210− compare(snap_decision[0].state, "expanded", "state of first snap-decision is not expanded");
219+ compare(snap_decision[0].expanded, true, "state of first snap-decision is not expanded");
211 for (var index = 1; index < snap_decision.length; index++) {
220 for (var index = 1; index < snap_decision.length; index++) {
212− compare(snap_decision[index].state, "contracted", "state of "+ index + ".snap-decision is not contracted");
221+ compare(snap_decision[index].expanded, false, "state of "+ index + ".snap-decision is not contracted");
213 }
222 }
214
223
215 // click/tap on each snap-decision and verify only one is in expanded-state at any time
224 // click/tap on each snap-decision and verify only one is in expanded-state at any time
@@ -217,9 +226,9 @@ Row {
217 mouseClick(snap_decision[index])
226 mouseClick(snap_decision[index])
218 for (var kindex = 0; kindex < snap_decision.length; kindex++) {
227 for (var kindex = 0; kindex < snap_decision.length; kindex++) {
219 if (kindex == index) {
228 if (kindex == index) {
220− compare(snap_decision[kindex].state, "expanded", "state of "+ kindex + ".snap-decision is not expanded");
229+ compare(snap_decision[kindex].expanded, true, "state of "+ kindex + ".snap-decision is not expanded");
221 } else {
230 } else {
222− compare(snap_decision[kindex].state, "contracted", "state of "+ kindex + ".snap-decision is not contracted");
231+ compare(snap_decision[kindex].expanded, false, "state of "+ kindex + ".snap-decision is not contracted");
223 }
232 }
224 }
233 }
225 }
234 }
@@ -232,7 +241,7 @@ Row {
232
241
233 for (var index = 1; index < snap_decision.length; index++) {
242 for (var index = 1; index < snap_decision.length; index++) {
234 removeTopMostNotification();
243 removeTopMostNotification();
235− compare(snap_decision[index].state, "expanded", "state of " + index + ". snap-decision is not expanded");
244+ compare(snap_decision[index].expanded, true, "state of " + index + ". snap-decision is not expanded");
236 }
245 }
237 }
246 }
238 }
247 }
tests/qmltests/Stages/ApplicationCheckBox.qml−1
@@ -96,7 +96,6 @@ Column {
96 Label {
96 Label {
97 id: appIdLabel
97 id: appIdLabel
98 text: root.appId
98 text: root.appId
99− color: "white"
100 anchors.verticalCenter: parent.verticalCenter
99 anchors.verticalCenter: parent.verticalCenter
101 }
100 }
102 Rectangle {
101 Rectangle {
tests/qmltests/Stages/SurfaceManagerControls.qml+6−7
@@ -20,14 +20,13 @@ import Unity.Application 0.1
20
20
21Column {
21Column {
22 id: root
22 id: root
23− property color textColor: "black"
24
23
25 Label {text: "Size hints for new surface:"; color: root.textColor; font.bold: true}
24 Label {text: "Size hints for new surface:"; color: root.textColor; font.bold: true}
26
25
27− SurfaceManagerField { text: "min width"; propertyName: "newSurfaceMinimumWidth"; textColor: root.textColor }
26+ SurfaceManagerField { text: "min width"; propertyName: "newSurfaceMinimumWidth"; }
28− SurfaceManagerField { text: "max width"; propertyName: "newSurfaceMaximumWidth"; textColor: root.textColor }
27+ SurfaceManagerField { text: "max width"; propertyName: "newSurfaceMaximumWidth"; }
29− SurfaceManagerField { text: "min height"; propertyName: "newSurfaceMinimumHeight"; textColor: root.textColor }
28+ SurfaceManagerField { text: "min height"; propertyName: "newSurfaceMinimumHeight"; }
30− SurfaceManagerField { text: "max height"; propertyName: "newSurfaceMaximumHeight"; textColor: root.textColor }
29+ SurfaceManagerField { text: "max height"; propertyName: "newSurfaceMaximumHeight"; }
31− SurfaceManagerField { text: "width increment"; propertyName: "newSurfaceWidthIncrement"; textColor: root.textColor }
30+ SurfaceManagerField { text: "width increment"; propertyName: "newSurfaceWidthIncrement"; }
32− SurfaceManagerField { text: "height increment"; propertyName: "newSurfaceHeightIncrement"; textColor: root.textColor }
31+ SurfaceManagerField { text: "height increment"; propertyName: "newSurfaceHeightIncrement"; }
33}
32}
tests/qmltests/Stages/tst_DesktopStage.qml+13−5
@@ -41,7 +41,10 @@ Item {
41 value: false
41 value: false
42 }
42 }
43
43
44− Component.onCompleted: resetGeometry()
44+ Component.onCompleted: {
45+ theme.name = "Ubuntu.Components.Themes.SuruDark";
46+ resetGeometry();
47+ }
45
48
46 function resetGeometry() {
49 function resetGeometry() {
47 // ensures apps which are tested decorations are in view.
50 // ensures apps which are tested decorations are in view.
@@ -71,7 +74,6 @@ Item {
71 property bool itemDestroyed: false
74 property bool itemDestroyed: false
72 sourceComponent: Component {
75 sourceComponent: Component {
73 DesktopStage {
76 DesktopStage {
74− color: "white"
75 anchors.fill: parent
77 anchors.fill: parent
76 background: "../../../qml/graphics/tablet_background.jpg"
78 background: "../../../qml/graphics/tablet_background.jpg"
77 focus: true
79 focus: true
@@ -91,8 +93,8 @@ Item {
91
93
92 Rectangle {
94 Rectangle {
93 id: controls
95 id: controls
94− color: "darkgrey"
95 width: units.gu(30)
96 width: units.gu(30)
97+ color: theme.palette.normal.background
96 anchors {
98 anchors {
97 top: parent.top
99 top: parent.top
98 bottom: parent.bottom
100 bottom: parent.bottom
@@ -107,7 +109,6 @@ Item {
107 spacing: units.gu(1)
109 spacing: units.gu(1)
108
110
109 Button {
111 Button {
110− color: "white"
111 text: "Make surface slow to resize"
112 text: "Make surface slow to resize"
112 activeFocusOnPress: false
113 activeFocusOnPress: false
113 onClicked: {
114 onClicked: {
@@ -134,7 +135,7 @@ Item {
134 }
135 }
135 }
136 }
136
137
137− SurfaceManagerControls { textColor: "white" }
138+ SurfaceManagerControls { }
138 }
139 }
139 }
140 }
140 }
141 }
@@ -616,5 +617,12 @@ Item {
616 // verify the drop shadow is gone
617 // verify the drop shadow is gone
617 tryCompare(PanelState, "dropShadow", false);
618 tryCompare(PanelState, "dropShadow", false);
618 }
619 }
620+
621+ function test_dashHasNoCloseButton() {
622+ var dashAppDelegate = startApplication("unity8-dash");
623+ verify(dashAppDelegate);
624+ var closeButton = findChild(dashAppDelegate, "closeWindowButton");
625+ tryCompare(closeButton, "visible", false);
626+ }
619 }
627 }
620}
628}
tests/qmltests/Wizard/tst_Wizard.qml+1
@@ -197,6 +197,7 @@ Item {
197
197
198 page = waitForPage("tzPage");
198 page = waitForPage("tzPage");
199 if (name === page.objectName) return page;
199 if (name === page.objectName) return page;
200+ waitUntilTransitionsEnd(page);
200 var tzList = findChild(page, "tzList");
201 var tzList = findChild(page, "tzList");
201 verify(tzList);
202 verify(tzList);
202 waitForRendering(tzList);
203 waitForRendering(tzList);
tests/qmltests/tst_OrientedShell.qml+5−7
@@ -536,8 +536,6 @@ Rectangle {
536 compare(shell.transformRotationAngle, root.primaryOrientationAngle);
536 compare(shell.transformRotationAngle, root.primaryOrientationAngle);
537 }
537 }
538
538
539−/* Flaky in adt and cannot reproduce locally. Given the deadline I won't risk this getting stuck in proposed.
540− Adding a skip() seems to fail this nevertheless for accessing a null object
541 function test_appSupportingOnlyPrimaryOrientationWillOnlyRotateInLandscape_data() {
539 function test_appSupportingOnlyPrimaryOrientationWillOnlyRotateInLandscape_data() {
542 return [
540 return [
543 {tag: "manta", deviceName: "manta"},
541 {tag: "manta", deviceName: "manta"},
@@ -561,25 +559,25 @@ Rectangle {
561 compare(dashApp.stage, ApplicationInfoInterface.MainStage);
559 compare(dashApp.stage, ApplicationInfoInterface.MainStage);
562
560
563 tryCompareFunction(function(){return dashApp.surfaceList.count > 0;}, true);
561 tryCompareFunction(function(){return dashApp.surfaceList.count > 0;}, true);
564− verify(checkAppSurfaceOrientation(dashAppWindow, dashApp, root.primaryOrientationAngle));
565
562
563+ tryCompareFunction(function(){return checkAppSurfaceOrientation(dashAppWindow, dashApp, root.primaryOrientationAngle)}, true);
566 compare(shell.transformRotationAngle, root.primaryOrientationAngle);
564 compare(shell.transformRotationAngle, root.primaryOrientationAngle);
565+
567 rotateTo(90);
566 rotateTo(90);
568
567
569− verify(checkAppSurfaceOrientation(dashAppWindow, dashApp, root.primaryOrientationAngle));
568+ tryCompareFunction(function(){return checkAppSurfaceOrientation(dashAppWindow, dashApp, root.primaryOrientationAngle)}, true);
570 compare(shell.transformRotationAngle, root.primaryOrientationAngle);
569 compare(shell.transformRotationAngle, root.primaryOrientationAngle);
571
570
572 rotateTo(180);
571 rotateTo(180);
573
572
574− verify(checkAppSurfaceOrientation(dashAppWindow, dashApp, root.primaryOrientationAngle + 180));
573+ tryCompareFunction(function(){return checkAppSurfaceOrientation(dashAppWindow, dashApp, root.primaryOrientationAngle + 180)}, true);
575 compare(shell.transformRotationAngle, root.primaryOrientationAngle + 180);
574 compare(shell.transformRotationAngle, root.primaryOrientationAngle + 180);
576
575
577 rotateTo(270);
576 rotateTo(270);
578
577
579− verify(checkAppSurfaceOrientation(dashAppWindow, dashApp, root.primaryOrientationAngle + 180));
578+ tryCompareFunction(function(){return checkAppSurfaceOrientation(dashAppWindow, dashApp, root.primaryOrientationAngle + 180)}, true);
580 compare(shell.transformRotationAngle, root.primaryOrientationAngle + 180);
579 compare(shell.transformRotationAngle, root.primaryOrientationAngle + 180);
581 }
580 }
582−*/
583
581
584 function test_greeterRemainsInPrimaryOrientation_data() {
582 function test_greeterRemainsInPrimaryOrientation_data() {
585 return [
583 return [
tests/qmltests/tst_Shell.qml+15−1
@@ -226,7 +226,6 @@ Rectangle {
226 MouseTouchEmulationCheckbox {
226 MouseTouchEmulationCheckbox {
227 id: mouseEmulation
227 id: mouseEmulation
228 checked: true
228 checked: true
229− color: "white"
230 }
229 }
231 ListItem.ItemSelector {
230 ListItem.ItemSelector {
232 id: ctrlModifier
231 id: ctrlModifier
@@ -1404,6 +1403,16 @@ Rectangle {
1404 tryCompare(launcherPanel, "x", -launcherPanel.width);
1403 tryCompare(launcherPanel, "x", -launcherPanel.width);
1405 }
1404 }
1406
1405
1406+ function test_physicalHomeKeyPressDoesNothingWithActiveGreeter() {
1407+ loadShell("phone");
1408+
1409+ var windowInputMonitor = findInvisibleChild(shell, "windowInputMonitor");
1410+ var coverPage = findChild(shell, "coverPage");
1411+
1412+ windowInputMonitor.homeKeyActivated();
1413+ verify(coverPage.shown);
1414+ }
1415+
1407 function test_tabletLogin_data() {
1416 function test_tabletLogin_data() {
1408 return [
1417 return [
1409 {tag: "auth error", user: "auth-error", loggedIn: false, password: ""},
1418 {tag: "auth error", user: "auth-error", loggedIn: false, password: ""},
@@ -2179,6 +2188,11 @@ Rectangle {
2179 shell.usageScenario = "desktop";
2188 shell.usageScenario = "desktop";
2180 GSettingsController.setAutohideLauncher(!data.launcherLocked);
2189 GSettingsController.setAutohideLauncher(!data.launcherLocked);
2181 waitForRendering(shell);
2190 waitForRendering(shell);
2191+ // Not sure why 2 but it's the number of times
2192+ // it triggers at this time and we need to wait
2193+ // for them otherwise a sessionStarted signal will
2194+ // hide the launcher and make the test fail
2195+ tryCompare(sessionSpy, "count", 2);
2182
2196
2183 var launcher = findChild(shell, "launcher");
2197 var launcher = findChild(shell, "launcher");
2184 var launcherPanel = findChild(launcher, "launcherPanel");
2198 var launcherPanel = findChild(launcher, "launcherPanel");
tests/utils/modules/Unity/Test/UnityTestCase.qml+84−7
@@ -52,8 +52,11 @@ TestCase {
52 this.getCurrentTimeMs = function() {return this.currentTimeMs}
52 this.getCurrentTimeMs = function() {return this.currentTimeMs}
53 }
53 }
54
54
55− // TODO This function can be removed altogether once we use Qt 5.5 which has the same feature
55+ // TODO This function can be removed altogether once we use Qt 5.7 which has the same feature
56 function mouseClick(item, x, y, button, modifiers, delay) {
56 function mouseClick(item, x, y, button, modifiers, delay) {
57+ if (!item)
58+ qtest_fail("no item given", 1);
59+
57 if (button === undefined)
60 if (button === undefined)
58 button = Qt.LeftButton;
61 button = Qt.LeftButton;
59 if (modifiers === undefined)
62 if (modifiers === undefined)
@@ -68,8 +71,11 @@ TestCase {
68 qtest_fail("window not shown", 2);
71 qtest_fail("window not shown", 2);
69 }
72 }
70
73
71− // TODO This function can be removed altogether once we use Qt 5.5 which has the same feature
74+ // TODO This function can be removed altogether once we use Qt 5.7 which has the same feature
72 function mouseDoubleClick(item, x, y, button, modifiers, delay) {
75 function mouseDoubleClick(item, x, y, button, modifiers, delay) {
76+ if (!item)
77+ qtest_fail("no item given", 1);
78+
73 if (button === undefined)
79 if (button === undefined)
74 button = Qt.LeftButton;
80 button = Qt.LeftButton;
75 if (modifiers === undefined)
81 if (modifiers === undefined)
@@ -84,8 +90,11 @@ TestCase {
84 qtest_fail("window not shown", 2)
90 qtest_fail("window not shown", 2)
85 }
91 }
86
92
87− // TODO This function can be removed altogether once we use Qt 5.5 which has the same feature
93+ // TODO This function can be removed altogether once we use Qt 5.7 which has the same feature
88 function mousePress(item, x, y, button, modifiers, delay) {
94 function mousePress(item, x, y, button, modifiers, delay) {
95+ if (!item)
96+ qtest_fail("no item given", 1);
97+
89 if (button === undefined)
98 if (button === undefined)
90 button = Qt.LeftButton;
99 button = Qt.LeftButton;
91 if (modifiers === undefined)
100 if (modifiers === undefined)
@@ -100,8 +109,11 @@ TestCase {
100 qtest_fail("window not shown", 2)
109 qtest_fail("window not shown", 2)
101 }
110 }
102
111
103− // TODO This function can be removed altogether once we use Qt 5.5 which has the same feature
112+ // TODO This function can be removed altogether once we use Qt 5.7 which has the same feature
104 function mouseRelease(item, x, y, button, modifiers, delay) {
113 function mouseRelease(item, x, y, button, modifiers, delay) {
114+ if (!item)
115+ qtest_fail("no item given", 1);
116+
105 if (button === undefined)
117 if (button === undefined)
106 button = Qt.LeftButton;
118 button = Qt.LeftButton;
107 if (modifiers === undefined)
119 if (modifiers === undefined)
@@ -123,6 +135,9 @@ TestCase {
123 // speed is in pixels/second
135 // speed is in pixels/second
124 function mouseFlick(item, x, y, toX, toY, pressMouse, releaseMouse,
136 function mouseFlick(item, x, y, toX, toY, pressMouse, releaseMouse,
125 speed, iterations) {
137 speed, iterations) {
138+ if (!item)
139+ qtest_fail("no item given", 1);
140+
126 pressMouse = ((pressMouse != null) ? pressMouse : true); // Default to true for pressMouse if not present
141 pressMouse = ((pressMouse != null) ? pressMouse : true); // Default to true for pressMouse if not present
127 releaseMouse = ((releaseMouse != null) ? releaseMouse : true); // Default to true for releaseMouse if not present
142 releaseMouse = ((releaseMouse != null) ? releaseMouse : true); // Default to true for releaseMouse if not present
128
143
@@ -161,6 +176,9 @@ TestCase {
161
176
162 // Find an object with the given name in the children tree of "obj"
177 // Find an object with the given name in the children tree of "obj"
163 function findChild(obj, objectName) {
178 function findChild(obj, objectName) {
179+ if (!obj)
180+ qtest_fail("no obj given", 1);
181+
164 return findChildIn(obj, "children", objectName);
182 return findChildIn(obj, "children", objectName);
165 }
183 }
166
184
@@ -170,11 +188,17 @@ TestCase {
170 // as this tree is much bigger and might contain stuff that goes
188 // as this tree is much bigger and might contain stuff that goes
171 // away randomly.
189 // away randomly.
172 function findInvisibleChild(obj, objectName) {
190 function findInvisibleChild(obj, objectName) {
191+ if (!obj)
192+ qtest_fail("no obj given", 1);
193+
173 return findChildIn(obj, "data", objectName);
194 return findChildIn(obj, "data", objectName);
174 }
195 }
175
196
176 // Find a child in the named property
197 // Find a child in the named property
177 function findChildIn(obj, prop, objectName) {
198 function findChildIn(obj, prop, objectName) {
199+ if (!obj)
200+ qtest_fail("no obj given", 1);
201+
178 var childs = new Array(0);
202 var childs = new Array(0);
179 childs.push(obj)
203 childs.push(obj)
180 while (childs.length > 0) {
204 while (childs.length > 0) {
@@ -190,6 +214,9 @@ TestCase {
190 }
214 }
191
215
192 function findChildsByType(obj, typeName) {
216 function findChildsByType(obj, typeName) {
217+ if (!obj)
218+ qtest_fail("no obj given", 1);
219+
193 var res = new Array(0);
220 var res = new Array(0);
194 for (var i in obj.children) {
221 for (var i in obj.children) {
195 var c = obj.children[i];
222 var c = obj.children[i];
@@ -237,6 +264,9 @@ TestCase {
237 }
264 }
238
265
239 function flickToYEnd(item) {
266 function flickToYEnd(item) {
267+ if (!item)
268+ qtest_fail("no item given", 1);
269+
240 var i = 0;
270 var i = 0;
241 var x = item.width / 2;
271 var x = item.width / 2;
242 var y = item.height - units.gu(1);
272 var y = item.height - units.gu(1);
@@ -256,6 +286,9 @@ TestCase {
256
286
257 // speed is in pixels/second
287 // speed is in pixels/second
258 function touchFlick(item, x, y, toX, toY, beginTouch, endTouch, speed, iterations) {
288 function touchFlick(item, x, y, toX, toY, beginTouch, endTouch, speed, iterations) {
289+ if (!item)
290+ qtest_fail("no item given", 1);
291+
259 // Make sure the item is rendered
292 // Make sure the item is rendered
260 waitForRendering(item);
293 waitForRendering(item);
261
294
@@ -315,10 +348,16 @@ TestCase {
315 // perform a drag in the given direction until the given condition is true
348 // perform a drag in the given direction until the given condition is true
316 // The condition is a function to be evaluated after every step
349 // The condition is a function to be evaluated after every step
317 function touchDragUntil(item, startX, startY, stepX, stepY, condition) {
350 function touchDragUntil(item, startX, startY, stepX, stepY, condition) {
351+ if (!item)
352+ qtest_fail("no item given", 1);
353+
318 multiTouchDragUntil([0], item, startX, startY, stepX, stepY, condition);
354 multiTouchDragUntil([0], item, startX, startY, stepX, stepY, condition);
319 }
355 }
320
356
321 function multiTouchDragUntil(touchIds, item, startX, startY, stepX, stepY, condition) {
357 function multiTouchDragUntil(touchIds, item, startX, startY, stepX, stepY, condition) {
358+ if (!item)
359+ qtest_fail("no item given", 1);
360+
322 var root = fetchRootItem(item);
361 var root = fetchRootItem(item);
323 var pos = item.mapToItem(root, startX, startY);
362 var pos = item.mapToItem(root, startX, startY);
324
363
@@ -363,9 +402,17 @@ TestCase {
363 event.commit()
402 event.commit()
364 }
403 }
365
404
366− function touchMove(item, tox, toy) { multiTouchMove(0, item, tox, toy); }
405+ function touchMove(item, tox, toy) {
406+ if (!item)
407+ qtest_fail("no item given", 1);
408+
409+ multiTouchMove(0, item, tox, toy);
410+ }
367
411
368 function multiTouchMove(touchId, item, tox, toy) {
412 function multiTouchMove(touchId, item, tox, toy) {
413+ if (!item)
414+ qtest_fail("no item given", 1);
415+
369 if (typeof touchId !== "number") touchId = 0;
416 if (typeof touchId !== "number") touchId = 0;
370 var root = fetchRootItem(item)
417 var root = fetchRootItem(item)
371 var rootPoint = item.mapToItem(root, tox, toy)
418 var rootPoint = item.mapToItem(root, tox, toy)
@@ -376,6 +423,9 @@ TestCase {
376 }
423 }
377
424
378 function touchPinch(item, x1Start, y1Start, x1End, y1End, x2Start, y2Start, x2End, y2End) {
425 function touchPinch(item, x1Start, y1Start, x1End, y1End, x2Start, y2Start, x2End, y2End) {
426+ if (!item)
427+ qtest_fail("no item given", 1);
428+
379 // Make sure the item is rendered
429 // Make sure the item is rendered
380 waitForRendering(item);
430 waitForRendering(item);
381
431
@@ -402,13 +452,21 @@ TestCase {
402 }
452 }
403
453
404 function fetchRootItem(item) {
454 function fetchRootItem(item) {
455+ if (!item)
456+ qtest_fail("no item given", 1);
457+
405 if (item.parent)
458 if (item.parent)
406 return fetchRootItem(item.parent)
459 return fetchRootItem(item.parent)
407 else
460 else
408 return item
461 return item
409 }
462 }
410
463
411− function touchPress(item, x, y) { multiTouchPress(0, item, x, y, []); }
464+ function touchPress(item, x, y) {
465+ if (!item)
466+ qtest_fail("no item given", 1);
467+
468+ multiTouchPress(0, item, x, y, []);
469+ }
412
470
413 /*! \brief Release a touch point
471 /*! \brief Release a touch point
414
472
@@ -419,6 +477,9 @@ TestCase {
419 \param stationaryPoints An array of touchIds which are "already touched"
477 \param stationaryPoints An array of touchIds which are "already touched"
420 */
478 */
421 function multiTouchPress(touchId, item, x, y, stationaryPoints) {
479 function multiTouchPress(touchId, item, x, y, stationaryPoints) {
480+ if (!item)
481+ qtest_fail("no item given", 1);
482+
422 if (typeof touchId !== "number") touchId = 0;
483 if (typeof touchId !== "number") touchId = 0;
423 if (typeof x !== "number") x = item.width / 2;
484 if (typeof x !== "number") x = item.width / 2;
424 if (typeof y !== "number") y = item.height / 2;
485 if (typeof y !== "number") y = item.height / 2;
@@ -434,7 +495,12 @@ TestCase {
434 event.commit()
495 event.commit()
435 }
496 }
436
497
437− function touchRelease(item, x, y) { multiTouchRelease(0, item, x, y, []); }
498+ function touchRelease(item, x, y) {
499+ if (!item)
500+ qtest_fail("no item given", 1);
501+
502+ multiTouchRelease(0, item, x, y, []);
503+ }
438
504
439 /*! \brief Release a touch point
505 /*! \brief Release a touch point
440
506
@@ -445,6 +511,9 @@ TestCase {
445 \param stationaryPoints An array of touchIds which are "still touched"
511 \param stationaryPoints An array of touchIds which are "still touched"
446 */
512 */
447 function multiTouchRelease(touchId, item, x, y, stationaryPoints) {
513 function multiTouchRelease(touchId, item, x, y, stationaryPoints) {
514+ if (!item)
515+ qtest_fail("no item given", 1);
516+
448 if (typeof touchId !== "number") touchId = 0;
517 if (typeof touchId !== "number") touchId = 0;
449 if (typeof x !== "number") x = item.width / 2;
518 if (typeof x !== "number") x = item.width / 2;
450 if (typeof y !== "number") y = item.height / 2;
519 if (typeof y !== "number") y = item.height / 2;
@@ -467,10 +536,16 @@ TestCase {
467 \param y The y coordinate of the tap, defaults to vertical center
536 \param y The y coordinate of the tap, defaults to vertical center
468 */
537 */
469 function tap(item, x, y) {
538 function tap(item, x, y) {
539+ if (!item)
540+ qtest_fail("no item given", 1);
541+
470 multiTouchTap([0], item, x, y);
542 multiTouchTap([0], item, x, y);
471 }
543 }
472
544
473 function multiTouchTap(touchIds, item, x, y) {
545 function multiTouchTap(touchIds, item, x, y) {
546+ if (!item)
547+ qtest_fail("no item given", 1);
548+
474 if (typeof touchIds !== "object") touchIds = [0];
549 if (typeof touchIds !== "object") touchIds = [0];
475 if (typeof x !== "number") x = item.width / 2;
550 if (typeof x !== "number") x = item.width / 2;
476 if (typeof y !== "number") y = item.height / 2;
551 if (typeof y !== "number") y = item.height / 2;
@@ -510,6 +585,8 @@ TestCase {
510 This effectively makes DirectionalDragAreas easier to fool.
585 This effectively makes DirectionalDragAreas easier to fool.
511 */
586 */
512 function removeTimeConstraintsFromDirectionalDragAreas(item) {
587 function removeTimeConstraintsFromDirectionalDragAreas(item) {
588+ if (!item)
589+ qtest_fail("no item given", 1);
513
590
514 // use duck-typing to identify a DirectionalDragArea
591 // use duck-typing to identify a DirectionalDragArea
515 if (item.removeTimeConstraints != undefined) {
592 if (item.removeTimeConstraints != undefined) {