on xenial help sign in
Merge from trunk
e7bca7eMichael Terry
Bottombar/Bottombar.qml+82−17
@@ -34,15 +34,32 @@ Item {
34
34
35 state: "hidden"
35 state: "hidden"
36
36
37+ function hide() {
38+ dismissTimer.stop()
39+ bottombar.state = "hidden"
40+ }
41+
42+ onApplicationIsOnForegroundChanged: {
43+ if (!applicationIsOnForeground) {
44+ hide()
45+ }
46+ }
47+
37 onStateChanged: {
48 onStateChanged: {
38 if (state == "hidden") {
49 if (state == "hidden") {
39 dismissTimer.stop()
50 dismissTimer.stop()
51+ bottomBarVisibilityCommunicatorShell.forceHidden = false
40 } else {
52 } else {
41 dismissTimer.restart()
53 dismissTimer.restart()
42 }
54 }
43 }
55 }
44
56
45 onPreventHidingChanged: {
57 onPreventHidingChanged: {
58+ if (!preventHiding) {
59+ if (state == "hint" || state == "reveal")
60+ hide()
61+ }
62+
46 if (dismissTimer.running) {
63 if (dismissTimer.running) {
47 dismissTimer.restart();
64 dismissTimer.restart();
48 }
65 }
@@ -50,7 +67,7 @@ Item {
50
67
51 Timer {
68 Timer {
52 id: dismissTimer
69 id: dismissTimer
53− interval: 5000
70+ interval: 1000
54 onTriggered: {
71 onTriggered: {
55 if (!bottombar.preventHiding) {
72 if (!bottombar.preventHiding) {
56 bottombar.state = "hidden"
73 bottombar.state = "hidden"
@@ -103,24 +120,29 @@ Item {
103
120
104 EdgeDragArea {
121 EdgeDragArea {
105 id: dragArea
122 id: dragArea
123+ objectName: "hudDragArea"
106 width: parent.width
124 width: parent.width
107− height: distanceThreshold
125+ height: shell.edgeSize
108 anchors.bottom: parent.bottom
126 anchors.bottom: parent.bottom
109
127
110− distanceThreshold: units.gu(1)
128+ distanceThreshold: units.gu(8)
111 enabled: !theHud.shown && bottombar.enabled && applicationIsOnForeground
129 enabled: !theHud.shown && bottombar.enabled && applicationIsOnForeground
112 direction: Direction.Upwards
130 direction: Direction.Upwards
131+ maxSilenceTime: 2000
113
132
114 property int previousStatus: -1
133 property int previousStatus: -1
115 property real touchStartX: -1
134 property real touchStartX: -1
116
135
136+ readonly property real distanceFromThreshold: (-distance) - distanceThreshold // distance is negative
137+ readonly property real revealDistance: units.gu(2)
138+ readonly property real commitDistance: units.gu(6)
139+ readonly property real commitProgress: MathLocal.clamp(distanceFromThreshold / commitDistance, 0, 1)
140+
117 onStatusChanged: {
141 onStatusChanged: {
118 if (status === DirectionalDragArea.WaitingForTouch) {
142 if (status === DirectionalDragArea.WaitingForTouch) {
119 if (previousStatus == DirectionalDragArea.Recognized) {
143 if (previousStatus == DirectionalDragArea.Recognized) {
120 if (hudButton.mouseOver) {
144 if (hudButton.mouseOver) {
121 hudButton.clicked()
145 hudButton.clicked()
122− } else {
123− bottombar.state = "hidden"
124 }
146 }
125 }
147 }
126 } else if (status === DirectionalDragArea.Undecided) {
148 } else if (status === DirectionalDragArea.Undecided) {
@@ -128,35 +150,78 @@ Item {
128 touchStartX = touchX
150 touchStartX = touchX
129 }
151 }
130 } else if (status === DirectionalDragArea.Recognized) {
152 } else if (status === DirectionalDragArea.Recognized) {
131− bottombar.state = "shown"
153+ bottombar.state = "hint"
132 }
154 }
133 previousStatus = status
155 previousStatus = status
134 }
156 }
157+
158+ onDistanceChanged: {
159+ if (status === DirectionalDragArea.Recognized) {
160+ if (distanceFromThreshold > commitDistance)
161+ bottombar.state = "shown"
162+ else if (distanceFromThreshold > revealDistance)
163+ bottombar.state = "reveal"
164+ }
165+ }
166+ }
167+
168+ Item {
169+ id: dismissArea
170+ anchors {
171+ top: parent.top
172+ left: parent.left
173+ right: parent.right
174+ }
175+ height: parent.height - bottomBarVisibilityCommunicatorShell.position
176+
177+ MouseArea {
178+ anchors.fill: parent
179+ enabled: bottombar.state == "shown"
180+ onPressed: {
181+ bottomBarVisibilityCommunicatorShell.forceHidden = true
182+ bottombar.state = "hidden"
183+ }
184+ }
185+
186+ InputFilterArea {
187+ anchors.fill: parent
188+ blockInput: (hudButton.opacity == 1)
189+ }
135 }
190 }
136
191
137 MouseArea {
192 MouseArea {
138− anchors.fill: parent
193+ anchors {
194+ top: dismissArea.bottom
195+ left: parent.left
196+ right: parent.right
197+ bottom: parent.bottom
198+ }
139− enabled: bottombar.state == "shown"
199+ enabled: bottombar.state == "shown" && bottomBarVisibilityCommunicatorShell.position > 0
140 onPressed: {
200 onPressed: {
141 bottombar.state = "hidden"
201 bottombar.state = "hidden"
142 }
202 }
143 }
203 }
144
204
145− InputFilterArea {
146− anchors.fill: parent
147− blockInput: (hudButton.opacity == 1)
148− }
149−
150 states: [
205 states: [
151 State {
206 State {
152 name: "hidden"
207 name: "hidden"
153− PropertyChanges { target: hudButton; opacity: 0}
208+ PropertyChanges { target: hudButton; opacity: 0 }
154− PropertyChanges { target: hudButton; bottomMargin: units.gu(-1)}
209+ PropertyChanges { target: hudButton; bottomMargin: units.gu(-2) }
210+ },
211+ State {
212+ name: "hint"
213+ extend: "hidden"
214+ PropertyChanges { target: hudButton; opacity: 0.5 }
215+ },
216+ State {
217+ name: "reveal"
218+ extend: "hint"
219+ PropertyChanges { target: hudButton; bottomMargin: units.gu(-2) + units.gu(2) * dragArea.commitProgress }
155 },
220 },
156 State {
221 State {
157 name: "shown"
222 name: "shown"
158− PropertyChanges { target: hudButton; opacity: 1}
223+ PropertyChanges { target: hudButton; opacity: 1 }
159− PropertyChanges { target: hudButton; bottomMargin: units.gu(0)}
224+ PropertyChanges { target: hudButton; bottomMargin: units.gu(0) }
160 }
225 }
161 ]
226 ]
162}
227}
CMakeLists.txt−1
@@ -96,7 +96,6 @@ enable_testing()
96# Autopilot tests
96# Autopilot tests
97include(autopilot)
97include(autopilot)
98declare_autopilot_test(shell unity8.shell ${CMAKE_SOURCE_DIR}/tests/autopilot/)
98declare_autopilot_test(shell unity8.shell ${CMAKE_SOURCE_DIR}/tests/autopilot/)
99−declare_autopilot_test(indicators_client unity8.indicators_client ${CMAKE_SOURCE_DIR}/tests/autopilot/)
100
99
101set(SHELL_APP unity8)
100set(SHELL_APP unity8)
102set(GREETER_APP unity8-greeter)
101set(GREETER_APP unity8-greeter)
Components/ApplicationManagerWrapper.qml+13−30
@@ -18,19 +18,20 @@ import QtQuick 2.0
18import Unity.Application 0.1
18import Unity.Application 0.1
19
19
20Item {
20Item {
21− id: applicationManager
21+ id: root
22
22
23 property alias mainStageApplications: mainStageModel
23 property alias mainStageApplications: mainStageModel
24 property alias sideStageApplications: sideStageModel
24 property alias sideStageApplications: sideStageModel
25 property variant mainStageFocusedApplication: null
25 property variant mainStageFocusedApplication: null
26 property variant sideStageFocusedApplication: null
26 property variant sideStageFocusedApplication: null
27 property bool sideStageEnabled: true
27 property bool sideStageEnabled: true
28− signal focusRequested(string desktopFile)
29 property bool keyboardVisible: ApplicationManager.keyboardVisible
28 property bool keyboardVisible: ApplicationManager.keyboardVisible
30 property int keyboardHeight: ApplicationManager.keyboardHeight
29 property int keyboardHeight: ApplicationManager.keyboardHeight
31
30
32 property bool fake: ApplicationManager.fake ? ApplicationManager.fake : false
31 property bool fake: ApplicationManager.fake ? ApplicationManager.fake : false
33
32
33+ signal focusRequested(string appId)
34+
34 ApplicationsModelStageFiltered {
35 ApplicationsModelStageFiltered {
35 id: mainStageModel
36 id: mainStageModel
36 stage: ApplicationInfo.MainStage
37 stage: ApplicationInfo.MainStage
@@ -62,6 +63,16 @@ Item {
62 }
63 }
63 }
64 }
64 }
65 }
66+
67+ onFocusRequested: {
68+ // if no side stage enabled, override application's stage parameter
69+ var app = ApplicationManager.findApplication(appId);
70+ if (app && app.stage === ApplicationInfo.SideStage && !sideStageEnabled) {
71+ app.stage = ApplicationInfo.MainStage;
72+ }
73+
74+ root.focusRequested(appId);
75+ }
65 }
76 }
66
77
67 function activateApplication(desktopFile, argument) {
78 function activateApplication(desktopFile, argument) {
@@ -155,32 +166,4 @@ Item {
155 }
166 }
156 return desktopFile.substring(left+1, right);
167 return desktopFile.substring(left+1, right);
157 }
168 }
158−
159− Connections {
160− target: ApplicationManager
161− onFocusRequested: {
162− // FIXME: hardcoded mapping from ApplicationManager.FavoriteApplications
163− // enum to desktop files
164− var desktopFile
165− if (favoriteApplication == ApplicationManager.CameraApplication) {
166− desktopFile = "/usr/share/applications/camera-app.desktop"
167− } else if (favoriteApplication == ApplicationManager.GalleryApplication) {
168− desktopFile = "/usr/share/applications/gallery-app.desktop"
169− } else if (favoriteApplication == ApplicationManager.ShareApplication) {
170− desktopFile = "/usr/share/applications/share-app.desktop"
171− } else if (favoriteApplication == ApplicationManager.BrowserApplication) {
172− desktopFile = "/usr/share/applications/webbrowser-app.desktop"
173− } else if (favoriteApplication == ApplicationManager.PhoneApplication) {
174− desktopFile = "/usr/share/applications/phone-app.desktop"
175− } else if (favoriteApplication == ApplicationManager.DialerApplication) {
176− desktopFile = "/usr/share/applications/dialer-app.desktop"
177− } else if (favoriteApplication == ApplicationManager.MessagingApplication) {
178− desktopFile = "/usr/share/applications/messaging-app.desktop"
179− } else if (favoriteApplication == ApplicationManager.AddressbookApplication) {
180− desktopFile = "/usr/share/applications/address-book-app.desktop"
181− }
182−
183− applicationManager.focusRequested(desktopFile);
184− }
185− }
186}
169}
Components/BasicShell.qml−4
@@ -63,10 +63,6 @@ FocusScope {
63 }
63 }
64 }
64 }
65
65
66− OSKController {
67− anchors.fill: parent // as needs to know the geometry of the shell
68− }
69−
70 VolumeControl {
66 VolumeControl {
71 id: volumeControl
67 id: volumeControl
72 }
68 }
Components/DragHandle.qml−1
@@ -208,5 +208,4 @@ EdgeDragArea {
208
208
209 d.previousStatus = status;
209 d.previousStatus = status;
210 }
210 }
211−
212}
211}
Components/EdgeDemoOverlay.qml+9−2
@@ -121,7 +121,6 @@ Showable {
121
121
122 Column {
122 Column {
123 id: labelGroup
123 id: labelGroup
124− layer.enabled: true // otherwise the underlining on "Skip intro" jumps
125 spacing: units.gu(3)
124 spacing: units.gu(3)
126
125
127 anchors {
126 anchors {
@@ -150,7 +149,15 @@ Showable {
150 text: i18n.tr("Skip intro")
149 text: i18n.tr("Skip intro")
151 color: UbuntuColors.orange
150 color: UbuntuColors.orange
152 fontSize: "small"
151 fontSize: "small"
153− font.underline: true
152+
153+ Icon {
154+ anchors.left: parent.right
155+ anchors.verticalCenter: parent.verticalCenter
156+ height: units.dp(12)
157+ width: units.dp(12)
158+ name: "chevron"
159+ color: UbuntuColors.orange
160+ }
154
161
155 MouseArea {
162 MouseArea {
156 // Make clickable area bigger than just the link because
163 // Make clickable area bigger than just the link because
Components/FilterGrid.qml+2−1
@@ -57,6 +57,8 @@ Item {
57 property alias delegate: iconTileGrid.delegate
57 property alias delegate: iconTileGrid.delegate
58 property alias cellWidth: iconTileGrid.cellWidth
58 property alias cellWidth: iconTileGrid.cellWidth
59 property alias cellHeight: iconTileGrid.cellHeight
59 property alias cellHeight: iconTileGrid.cellHeight
60+ property alias delegateCreationBegin: iconTileGrid.delegateCreationBegin
61+ property alias delegateCreationEnd: iconTileGrid.delegateCreationEnd
60 readonly property alias flicking: iconTileGrid.flicking
62 readonly property alias flicking: iconTileGrid.flicking
61 readonly property alias moving: iconTileGrid.moving
63 readonly property alias moving: iconTileGrid.moving
62 readonly property alias pressDelay: iconTileGrid.pressDelay
64 readonly property alias pressDelay: iconTileGrid.pressDelay
@@ -102,6 +104,5 @@ Item {
102 model: root.model
104 model: root.model
103 limit: (filter && !filterAnimation.running) ? collapsedRowCount * iconTileGrid.columns : -1
105 limit: (filter && !filterAnimation.running) ? collapsedRowCount * iconTileGrid.columns : -1
104 }
106 }
105−
106 }
107 }
107}
108}
Components/LazyImage.qmlnew file+185
@@ -0,0 +1,185 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * Authors:
5+ * Michał Sawicz <michal.sawicz@canonical.com>
6+ *
7+ * This program is free software; you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation; version 3.
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 QtQuick 2.0
21+import Ubuntu.Components 0.1
22+
23+Item {
24+ id: root
25+
26+ property url source
27+ // TODO convert into enums when available in QML
28+ property string scaleTo
29+
30+ property real initialWidth: scaleTo == "width" || scaleTo == "fit" ? width : units.gu(10)
31+ property real initialHeight: scaleTo == "height" || scaleTo == "fit" ? height : units.gu(10)
32+
33+ property alias sourceSize: image.sourceSize
34+ property alias fillMode: image.fillMode
35+ property alias asynchronous: image.asynchronous
36+ property alias cache: image.cache
37+ property alias horizontalAlignment: image.horizontalAlignment
38+ property alias verticalAlignment: image.verticalAlignment
39+
40+ state: "default"
41+
42+ onSourceChanged: {
43+ if (state === "ready") {
44+ state = "default";
45+ image.nextSource = source;
46+ } else {
47+ image.source = source;
48+ }
49+ }
50+
51+ UbuntuShape {
52+ id: placeholder
53+ objectName: "placeholder"
54+ color: "#22FFFFFF"
55+ anchors.fill: shape
56+ visible: opacity != 0
57+
58+ ActivityIndicator {
59+ id: activity
60+ anchors.centerIn: parent
61+ opacity: 0
62+ visible: opacity != 0
63+
64+ running: visible
65+ }
66+
67+ Image {
68+ id: errorImage
69+ objectName: "errorImage"
70+ anchors.centerIn: parent
71+ opacity: 0
72+ visible: opacity != 0
73+
74+ source: "graphics/close.png"
75+ sourceSize { width: units.gu(3); height: units.gu(3) }
76+ }
77+ }
78+
79+ UbuntuShape {
80+ id: shape
81+ objectName: "shape"
82+ height: root.initialHeight
83+ width: root.initialWidth
84+ anchors.centerIn: root.scaleTo == "fit" ? parent : undefined
85+
86+ opacity: 0
87+ visible: opacity != 0
88+
89+ image: Image {
90+ id: image
91+ objectName: "image"
92+
93+ property url nextSource
94+ property string format: image.implicitWidth > image.implicitHeight ? "landscape" : "portrait"
95+
96+ fillMode: Image.PreserveAspectFit
97+ asynchronous: true
98+ cache: false
99+ horizontalAlignment: Image.AlignHCenter
100+ verticalAlignment: Image.AlignVCenter
101+ sourceSize.width: root.scaleTo == "width" ? root.width
102+ : root.scaleTo == "fit" && root.width < root.height ? root.width
103+ : undefined
104+ sourceSize.height: root.scaleTo == "height" ? root.height
105+ : root.scale == "fit" && root.height < root.width ? root.height
106+ : undefined
107+ }
108+ }
109+
110+ states: [
111+ State {
112+ name: "default"
113+ when: image.source == ""
114+ PropertyChanges { target: root; implicitWidth: root.initialWidth; implicitHeight: root.initialHeight }
115+ PropertyChanges { target: errorImage; opacity: 0 }
116+ },
117+ State {
118+ name: "loading"
119+ extend: "default"
120+ when: image.status === Image.Loading
121+ PropertyChanges { target: activity; opacity: 1 }
122+ },
123+ State {
124+ name: "ready"
125+ when: image.status === Image.Ready && image.source != ""
126+ PropertyChanges { target: root; implicitWidth: shape.width; implicitHeight: shape.height }
127+ PropertyChanges { target: placeholder; opacity: 0 }
128+ PropertyChanges { target: shape; opacity: 1
129+ width: root.scaleTo == "width" || (root.scaleTo == "fit" && image.format == "landscape") ? root.width
130+ : root.scaleTo == "" ? image.implicitWidth : image.implicitWidth * height / image.implicitHeight
131+ height: root.scaleTo == "height" || (root.scaleTo == "fit" && image.format == "portrait") ? root.height
132+ : root.scaleTo == "" ? image.implicitHeight : image.implicitHeight * width / image.implicitWidth
133+ }
134+ },
135+ State {
136+ name: "error"
137+ extend: "default"
138+ when: image.status === Image.Error
139+ PropertyChanges { target: errorImage; opacity: 1.0 }
140+ }
141+ ]
142+
143+ transitions: [
144+ Transition {
145+ to: "ready"
146+ objectName: "readyTransition"
147+ SequentialAnimation {
148+ PropertyAction { target: shape; property: "visible" }
149+ ParallelAnimation {
150+ NumberAnimation { target: shape; property: "opacity"; easing.type: Easing.Linear }
151+ UbuntuNumberAnimation { target: root; properties: "implicitWidth,implicitHeight" }
152+ UbuntuNumberAnimation { target: shape; properties: "width,height" }
153+ NumberAnimation {
154+ targets: [placeholder, activity, errorImage]; property: "opacity";
155+ easing.type: Easing.Linear; duration: UbuntuAnimation.SnapDuration
156+ }
157+ }
158+ }
159+ },
160+
161+ Transition {
162+ to: "*"
163+ objectName: "genericTransition"
164+ SequentialAnimation {
165+ ParallelAnimation {
166+ NumberAnimation { target: shape; property: "opacity"; easing.type: Easing.Linear }
167+ NumberAnimation {
168+ targets: [placeholder, activity, errorImage]; property: "opacity";
169+ easing.type: Easing.Linear; duration: UbuntuAnimation.SnapDuration
170+ }
171+ UbuntuNumberAnimation { target: root; properties: "implicitWidth,implicitHeight" }
172+ UbuntuNumberAnimation { target: shape; properties: "width,height" }
173+ }
174+ PropertyAction { target: shape; property: "visible" }
175+ }
176+
177+ onRunningChanged: {
178+ if (!running && state === "default" && image.nextSource !== "") {
179+ image.source = image.nextSource;
180+ image.nextSource = "";
181+ }
182+ }
183+ }
184+ ]
185+}
Components/ListItems/Header.qml+1−1
@@ -28,7 +28,7 @@ Item {
28
28
29 signal clicked(variant mouse)
29 signal clicked(variant mouse)
30
30
31− height: units.gu(4.5)
31+ height: units.gu(5)
32
32
33 Item {
33 Item {
34 anchors {
34 anchors {
Components/PageHeader.qml+44−1
@@ -19,6 +19,7 @@ import Ubuntu.Components 0.1
19import Ubuntu.Components.Popups 0.1
19import Ubuntu.Components.Popups 0.1
20import Ubuntu.Components.ListItems 0.1 as ListItem
20import Ubuntu.Components.ListItems 0.1 as ListItem
21import SessionManager 0.1
21import SessionManager 0.1
22+import Unity 0.1
22
23
23Item {
24Item {
24 /*!
25 /*!
@@ -31,6 +32,7 @@ Item {
31 property bool searchEntryEnabled: false
32 property bool searchEntryEnabled: false
32 property alias searchQuery: searchField.text
33 property alias searchQuery: searchField.text
33 property ListModel searchHistory: SearchHistoryModel {}
34 property ListModel searchHistory: SearchHistoryModel {}
35+ property Scope scope
34
36
35 height: units.gu(8.5)
37 height: units.gu(8.5)
36 implicitHeight: units.gu(8.5)
38 implicitHeight: units.gu(8.5)
@@ -149,7 +151,7 @@ Item {
149 hasClearButton: false
151 hasClearButton: false
150
152
151 primaryItem: AbstractButton {
153 primaryItem: AbstractButton {
152− enabled: searchField.text != ""
154+ enabled: searchField.text != "" && !searchIndicator.running
153 onClicked: {
155 onClicked: {
154 if (searchField.text != "") {
156 if (searchField.text != "") {
155 searchHistory.addQuery(searchField.text)
157 searchHistory.addQuery(searchField.text)
@@ -159,8 +161,22 @@ Item {
159 height: parent.height
161 height: parent.height
160 width: height
162 width: height
161
163
164+ ActivityIndicator {
165+ id: searchIndicator
166+ objectName: "searchIndicator"
167+
168+ anchors {
169+ verticalCenter: parent.verticalCenter
170+ left: parent.left
171+ leftMargin: units.gu(0.5)
172+ }
173+
174+ running: opacity > 0
175+ }
176+
162 Image {
177 Image {
163 id: primaryImage
178 id: primaryImage
179+ objectName: "primaryImage"
164 anchors {
180 anchors {
165 verticalCenter: parent.verticalCenter
181 verticalCenter: parent.verticalCenter
166 left: parent.left
182 left: parent.left
@@ -168,6 +184,7 @@ Item {
168 }
184 }
169 width: units.gu(3)
185 width: units.gu(3)
170 height: units.gu(3)
186 height: units.gu(3)
187+ visible: opacity > 0
171 }
188 }
172
189
173 Item {
190 Item {
@@ -186,6 +203,32 @@ Item {
186 onActiveFocusChanged: {
203 onActiveFocusChanged: {
187 if (!activeFocus) searchContainer.closePopover()
204 if (!activeFocus) searchContainer.closePopover()
188 }
205 }
206+
207+ states: [
208+ State {
209+ name: "searching"
210+ when: scope && scope.searchInProgress
211+ PropertyChanges { target: searchIndicator; running: true; opacity: 1 }
212+ PropertyChanges { target: primaryImage; opacity: 0 }
213+ },
214+ State {
215+ name: "idle"
216+ when: !scope || !scope.searchInProgress
217+ PropertyChanges { target: searchIndicator; opacity: 0 }
218+ PropertyChanges { target: primaryImage; opacity: 1 }
219+ }
220+ ]
221+
222+ transitions: [
223+ Transition {
224+ to: "searching"
225+ reversible: true
226+ SequentialAnimation {
227+ NumberAnimation { target: primaryImage; property: "opacity"; duration: UbuntuAnimation.FastDuration; easing.type: Easing.Linear }
228+ NumberAnimation { target: searchIndicator; property: "opacity"; duration: UbuntuAnimation.FastDuration; easing.type: Easing.Linear }
229+ }
230+ }
231+ ]
189 }
232 }
190
233
191 states: [
234 states: [
Greeter/PinPadButton.qml → Components/PinPadButton.qmlrenamed

The content is the same.

Components/ResponsiveGridView.qml+2
@@ -39,6 +39,8 @@ Item {
39 readonly property alias flicking: gridView.flicking
39 readonly property alias flicking: gridView.flicking
40 readonly property alias moving: gridView.moving
40 readonly property alias moving: gridView.moving
41 readonly property alias pressDelay: gridView.pressDelay
41 readonly property alias pressDelay: gridView.pressDelay
42+ property alias delegateCreationBegin: gridView.delegateCreationBegin
43+ property alias delegateCreationEnd: gridView.delegateCreationEnd
42
44
43 function contentHeightForRows(rows) {
45 function contentHeightForRows(rows) {
44 return rows * cellHeight + verticalSpacing
46 return rows * cellHeight + verticalSpacing
Components/Showable.qml+11
@@ -30,6 +30,7 @@ Item {
30 property bool created: true
30 property bool created: true
31 property bool required
31 property bool required
32 property bool __shouldShow: false
32 property bool __shouldShow: false
33+ property bool __skipShowAnimation: false
33
34
34 property list<QtObject> hides
35 property list<QtObject> hides
35 property var showAnimation
36 property var showAnimation
@@ -58,6 +59,11 @@ Item {
58 }
59 }
59 }
60 }
60
61
62+ function showNow() {
63+ __skipShowAnimation = true;
64+ show();
65+ }
66+
61 onCreatedChanged: {
67 onCreatedChanged: {
62 if (created && __shouldShow) {
68 if (created && __shouldShow) {
63 __reallyShow();
69 __reallyShow();
@@ -67,6 +73,7 @@ Item {
67
73
68 function __reallyShow() {
74 function __reallyShow() {
69 if (!available) {
75 if (!available) {
76+ __skipShowAnimation = false;
70 return false;
77 return false;
71 }
78 }
72
79
@@ -80,11 +87,15 @@ Item {
80 if (!showAnimation.running) {
87 if (!showAnimation.running) {
81 showAnimation.restart()
88 showAnimation.restart()
82 }
89 }
90+ if (__skipShowAnimation) {
91+ showAnimation.complete();
92+ }
83 } else {
93 } else {
84 visible = true;
94 visible = true;
85 }
95 }
86
96
87 shown = true;
97 shown = true;
98+ __skipShowAnimation = false;
88 return true;
99 return true;
89 }
100 }
90
101
Components/Stage.qml+9−1
@@ -84,6 +84,11 @@ Showable {
84 }
84 }
85 }
85 }
86
86
87+ Connections {
88+ target: applicationManager
89+ onFocusRequested: activateApplication(appId)
90+ }
91+
87 /* Keep a reference to the focused application so that we can safely
92 /* Keep a reference to the focused application so that we can safely
88 unfocus it when the stage is not fully shown and refocus it when the stage
93 unfocus it when the stage is not fully shown and refocus it when the stage
89 is fully shown again.
94 is fully shown again.
@@ -97,7 +102,9 @@ Showable {
97 if (shouldUseScreenshots) {
102 if (shouldUseScreenshots) {
98 stage.__focusApplicationUsingScreenshots(stage.focusedApplication);
103 stage.__focusApplicationUsingScreenshots(stage.focusedApplication);
99 } else {
104 } else {
105+ if (stage.focusedApplicationWhenUsingScreenshots) {
100− stage.__focusActualApplication(stage.focusedApplicationWhenUsingScreenshots);
106+ stage.__focusActualApplication(stage.focusedApplicationWhenUsingScreenshots);
107+ }
101 }
108 }
102 }
109 }
103
110
@@ -244,6 +251,7 @@ Showable {
244 */
251 */
245 delayedHideScreenshots.start();
252 delayedHideScreenshots.start();
246 } else {
253 } else {
254+ stage.focusedApplicationWhenUsingScreenshots = null;
247 stage.__hideScreenshots();
255 stage.__hideScreenshots();
248 }
256 }
249 }
257 }
Components/Tile.qml+6−63
@@ -18,70 +18,13 @@ import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19
19
20AbstractButton {
20AbstractButton {
21− id: root
22− property alias source: image.source
21+ property url source
23− property alias fillMode: image.fillMode
22+ property int fillMode: Image.PreserveAspectCrop
24− property alias horizontalAlignment: image.horizontalAlignment
23+ property int horizontalAlignment: Text.AlignHCenter
25− property alias verticalAlignment: image.verticalAlignment
24+ property string text
26− property alias text: label.text
27 property int imageWidth
25 property int imageWidth
28 property int imageHeight
26 property int imageHeight
27+ property int maximumLineCount: 1
29
28
30− UbuntuShape {
29+ style: TileStyle {}
31− id: icon
32− anchors {
33− top: parent.top
34− horizontalCenter: parent.horizontalCenter
35− }
36− radius: "medium"
37− width: imageWidth
38− height: imageHeight
39− image: Image {
40− id: image
41− objectName: "image"
42− sourceSize { width: icon.width; height: icon.height }
43− asynchronous: true
44− cache: false
45− }
46− }
47−
48− UbuntuShape {
49− id: borderPressed
50− objectName: "borderPressed"
51−
52− anchors.fill: icon
53− radius: "medium"
54− borderSource: "radius_pressed.sci"
55− opacity: root.pressed ? 1.0 : 0.0
56− Behavior on opacity { NumberAnimation { duration: 200; easing.type: Easing.OutQuint } }
57− }
58−
59− Item {
60− anchors {
61− left: parent.left
62− right: parent.right
63− top: icon.bottom
64− }
65− height: units.gu(2)
66−
67− Label {
68− id: label
69− objectName: "label"
70− anchors {
71− baseline: parent.bottom
72− left: parent.left
73− right: parent.right
74− leftMargin: units.gu(1)
75− rightMargin: units.gu(1)
76− }
77−
78− color: Theme.palette.selected.backgroundText
79− opacity: 0.9
80− style: Text.Raised
81− styleColor: "black"
82− fontSize: "small"
83− elide: Text.ElideMiddle
84− horizontalAlignment: Text.AlignHCenter
85− }
86− }
87}
30}
Components/TileStyle.qmlnew file+81
@@ -0,0 +1,81 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+
20+Item {
21+ id: tile
22+
23+ anchors.fill: parent
24+
25+ UbuntuShape {
26+ id: icon
27+ anchors {
28+ top: parent.top
29+ horizontalCenter: parent.horizontalCenter
30+ }
31+ radius: "medium"
32+ width: styledItem.imageWidth
33+ height: styledItem.imageHeight
34+ image: Image {
35+ id: image
36+ objectName: "image"
37+ sourceSize { width: icon.width; height: icon.height }
38+ asynchronous: true
39+ cache: false
40+ source: styledItem.source
41+ fillMode: styledItem.fillMode
42+ horizontalAlignment: Image.AlignHCenter
43+ verticalAlignment: Image.AlignVCenter
44+ }
45+ }
46+
47+ UbuntuShape {
48+ id: borderPressed
49+ objectName: "borderPressed"
50+
51+ anchors.fill: icon
52+ radius: "medium"
53+ borderSource: "radius_pressed.sci"
54+ opacity: styledItem.pressed ? 1.0 : 0.0
55+ Behavior on opacity { NumberAnimation { duration: 200; easing.type: Easing.OutQuint } }
56+ }
57+
58+ Label {
59+ id: label
60+ objectName: "label"
61+ anchors {
62+ baseline: icon.bottom
63+ baselineOffset: units.gu(2)
64+ left: parent.left
65+ right: parent.right
66+ leftMargin: units.gu(1)
67+ rightMargin: units.gu(1)
68+ }
69+
70+ color: Theme.palette.selected.backgroundText
71+ opacity: 0.9
72+ style: Text.Raised
73+ styleColor: "black"
74+ fontSize: "small"
75+ elide: Text.ElideMiddle
76+ horizontalAlignment: styledItem.horizontalAlignment
77+ text: styledItem.text
78+ wrapMode: Text.Wrap
79+ maximumLineCount: styledItem.maximumLineCount
80+ }
81+}
Components/VolumeControl.qml+1−1
@@ -28,7 +28,7 @@ Item {
28 busName: "com.canonical.indicator.sound"
28 busName: "com.canonical.indicator.sound"
29 objectPath: "/com/canonical/indicator/sound"
29 objectPath: "/com/canonical/indicator/sound"
30
30
31− property variant actionObject: action("scroll")
31+ property variant actionObject: action("volume")
32 }
32 }
33
33
34 function volumeUp() {
34 function volumeUp() {
Components/graphics/close@20.pngnew file

Binary file not shown.

Dash/Apps/AppPreview.qml+70−123
@@ -16,153 +16,101 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19−import Ubuntu.Components.ListItems 0.1 as ListItem
19+import Ubuntu.Components.ListItems 0.1 as ListItems
20−import Ubuntu.DownloadDaemonListener 0.1
21import ".."
20import ".."
21+import "../Generic"
22+import "../Previews"
22import "../../Components"
23import "../../Components"
23
24
24−DashPreview {
25+GenericPreview {
25 id: root
26 id: root
26
27
27 signal sendUserReview(string review)
28 signal sendUserReview(string review)
28
29
29− title: root.previewData.title
30+ previewImages: previewImagesComponent
31+ description: descriptionComponent
32+ header: headerComponent
30
33
31− header: ListView {
34+ // TODO: Ratings are not yet complete... enable this once they work
32− spacing: units.gu(1)
35+ //ratings: ratingsComponent
33− orientation: ListView.Horizontal
34− height: units.gu(22)
35− anchors {
36− left: parent.left
37− right: parent.right
38− margins: units.gu(1)
39− }
40− model: previewData.infoMap["more-screenshots"] != null ? previewData.infoMap["more-screenshots"].value : [previewData.image]
41
36
42− delegate: UbuntuShape {
37+ Component {
43− id: shape
38+ id: previewImagesComponent
39+ ListView {
40+ id: previewImageListView
41+ spacing: units.gu(1)
42+ orientation: ListView.Horizontal
43+ height: units.gu(22)
44+ model: previewData.infoMap["more-screenshots"] != null ? previewData.infoMap["more-screenshots"].value : [previewData.image]
45+ cacheBuffer: width * 3
46+
47+ LazyImage {
48+ objectName: "placeholderScreenshot"
44− anchors {
49+ anchors {
45− top: parent.top
50+ top: parent.top
46− bottom: parent.bottom
51+ bottom: parent.bottom
52+ }
53+ scaleTo: "height"
54+ source: "broken_image"
55+ initialWidth: units.gu(13)
56+ visible: previewImageListView.count == 0
47 }
57 }
48− width: units.gu(12)
58+
49− radius: "medium"
59+ delegate: LazyImage {
50− borderSource: ""
60+ id: shape
51− image: Image {
61+ anchors {
52− asynchronous: true
62+ top: parent.top
53− sourceSize { width: shape.width; height: shape.height }
63+ bottom: parent.bottom
64+ }
54 source: modelData ? modelData : ""
65 source: modelData ? modelData : ""
55− fillMode: Image.PreserveAspectCrop
66+ scaleTo: "height"
67+ initialWidth: units.gu(13)
56 }
68 }
57 }
69 }
58 }
70 }
59
71
60 Component {
72 Component {
61− id: buttonsComponent
73+ id: headerComponent
62−
74+ Header {
63− GridView {
64− id: buttonsGrid
65− objectName: "gridButtons"
75+ objectName: "previewHeader"
66−
76+ title: previewData.title
67− property int numOfRows: (count + 1) / 2
77+ icon: previewData.appIcon
68− property int spacing: units.gu(1)
78+ subtitle: root.previewData.infoMap["publisher"] ? root.previewData.infoMap["publisher"].value : ""
69− height: Math.max(units.gu(5), units.gu(5)*numOfRows + spacing*(numOfRows - 1))
79+ rating: Math.round(root.previewData.rating * 10)
70−
80+ reviews: root.previewData.numRatings
71− interactive: false
81+ rated: root.previewData.infoMap["rated"] ? root.previewData.infoMap["rated"].value : 0
72− cellWidth: Math.max(units.gu(9), width / 2)
73− cellHeight: buttonHeight + spacing
74− property int buttonWidth: count > 1 ? Math.max(0, width / 2 - spacing) : width
75− property int buttonHeight: units.gu(5)
76−
77− delegate: Button {
78− width: Math.max(units.gu(4), buttonsGrid.buttonWidth)
79− height: buttonsGrid.buttonHeight
80− color: Theme.palette.selected.foreground
81− text: modelData.displayName
82− iconSource: modelData.iconHint
83− iconPosition: "right"
84− onClicked: root.previewData.execute(modelData.id, { })
85− }
86 }
82 }
87 }
83 }
88
84
89 Component {
85 Component {
90− id: progressComponent
86+ id: descriptionComponent
91−
87+ Column {
92− ProgressBar {
93− id: progressBar
94− objectName: "progressBar"
95− value: 0
96− maximumValue: 100
97− height: units.gu(5)
88+ spacing: units.gu(1)
98−
99− property var model
100−
101− DownloadTracker {
102− service: "com.canonical.applications.Downloader"
103− dbusPath: root.previewData.infoMap["progressbar_source"] ? root.previewData.infoMap["progressbar_source"].value : ""
104−
105− onProgress: {
106− var percentage = parseInt(received * 100 / total);
107− progressBar.value = percentage;
108− }
109−
110− onFinished: {
111− root.previewData.execute(progressBar.model[0].id, { })
112− }
113
89
114− onError: {
90+ Label {
115− root.previewData.execute(progressBar.model[1].id, { "error": error });
91+ anchors { left: parent.left; right: parent.right }
116− }
92+ text: root.previewData.description
93+ fontSize: "medium"
94+ color: Theme.palette.selected.backgroundText
95+ opacity: .6
96+ wrapMode: Text.WordWrap
97+ style: Text.Raised
98+ styleColor: "black"
117 }
99 }
118−
119− }
120− }
121−
122− buttons: Loader {
123− anchors {
124− left: parent.left
125− right: parent.right
126− }
127−
128− sourceComponent: root.previewData.infoMap["show_progressbar"] ? progressComponent : buttonsComponent
129−
130− onLoaded: {
131− item.model = root.previewData.actions;
132 }
100 }
133 }
101 }
134
102
135− body: Column {
103+ Component {
136− spacing: units.gu(1)
104+ id: ratingsComponent
137−
138− AppInfo {
139− objectName: "appInfo"
140− anchors { left: parent.left; right: parent.right }
141−
142− appName: root.previewData.title
143− icon: root.previewData.appIcon
144− rating: Math.round(root.previewData.rating * 10)
145− reviews: root.previewData.numRatings
146− rated: root.previewData.infoMap["rated"] ? root.previewData.infoMap["rated"].value : 0
147− }
148−
149− Label {
150− anchors { left: parent.left; right: parent.right }
151− text: root.previewData.description
152− fontSize: "medium"
153− color: Theme.palette.selected.backgroundText
154− opacity: .6
155− wrapMode: Text.WordWrap
156− style: Text.Raised
157− styleColor: "black"
158− }
159−
160 Column {
105 Column {
106+ id: columnReviewRating
107+ objectName: "columnReviewRating"
161 visible: root.previewData.rating >= 0
108 visible: root.previewData.rating >= 0
162− anchors { left: parent.left; right: parent.right }
163− spacing: parent.spacing
164
109
110+ spacing: units.gu(1)
111+ height: childrenRect.height
112+
165− ListItem.ThinDivider { }
113+ ListItems.ThinDivider { }
166
114
167 Item {
115 Item {
168 anchors { left: parent.left; right: parent.right }
116 anchors { left: parent.left; right: parent.right }
@@ -188,13 +136,12 @@ DashPreview {
188 }
136 }
189 }
137 }
190
138
191− ListItem.ThinDivider { }
139+ ListItems.ThinDivider { }
192
140
193− AppReviews {
141+ Reviews {
194 id: appReviews
142 id: appReviews
195 objectName: "appReviews"
143 objectName: "appReviews"
196− // TODO: This should make this visible when the feature for reviews/comments is complete.
144+
197− visible: false
198 anchors { left: parent.left; right: parent.right }
145 anchors { left: parent.left; right: parent.right }
199
146
200 model: root.previewData.infoMap["comments"] ? root.previewData.infoMap["comments"].value : undefined
147 model: root.previewData.infoMap["comments"] ? root.previewData.infoMap["comments"].value : undefined
Dash/Apps/AppsAvailableForDownloadModel.qmldeleted−81
@@ -1,81 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import "../../Applications"
19−
20−ListModel {
21− ListElement {
22− uri: "application://evernote.desktop"
23− icon: "../../graphics/applicationIcons/evernote.png"
24− category: 0
25− mimetype: "application/x-desktop"
26− title: "Evernote"
27− comment: ""
28− dndUri: "file:///usr/share/applications/evernote.desktop"
29− metadata: ""
30− }
31− ListElement {
32− uri: "application://map.desktop"
33− icon: "../../graphics/applicationIcons/map.png"
34− category: 0
35− mimetype: "application/x-desktop"
36− title: "Map"
37− comment: ""
38− dndUri: "file:///usr/share/applications/map.desktop"
39− metadata: ""
40− }
41− ListElement {
42− uri: "application://pinterest.desktop"
43− icon: "../../graphics/applicationIcons/pinterest.png"
44− category: 0
45− mimetype: "application/x-desktop"
46− title: "Pinterest"
47− comment: ""
48− dndUri: "file:///usr/share/applications/pinterest.desktop"
49− metadata: ""
50− }
51− ListElement {
52− uri: "application://soundcloud.desktop"
53− icon: "../../graphics/applicationIcons/soundcloud.png"
54− category: 0
55− mimetype: "application/x-desktop"
56− title: "Soundcloud"
57− comment: ""
58− dndUri: "file:///usr/share/applications/soundcloud.desktop"
59− metadata: ""
60− }
61− ListElement {
62− uri: "application://wikipedia.desktop"
63− icon: "../../graphics/applicationIcons/wikipedia.png"
64− category: 0
65− mimetype: "application/x-desktop"
66− title: "Wikipedia"
67− comment: ""
68− dndUri: "file:///usr/share/applications/wikipedia.desktop"
69− metadata: ""
70− }
71− ListElement {
72− uri: "application://youtube.desktop"
73− icon: "../../graphics/applicationIcons/youtube.png"
74− category: 0
75− mimetype: "application/x-desktop"
76− title: "Youtube"
77− comment: ""
78− dndUri: "file:///usr/share/applications/youtube.desktop"
79− metadata: ""
80− }
81−}
Dash/Apps/DashPluginFilterGrid.qmlnew file+49
@@ -0,0 +1,49 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+import "../../Components"
20+import "../Generic"
21+
22+GenericFilterGrid {
23+ id: filtergrid
24+
25+ delegate: Tile {
26+ id: tile
27+ objectName: "delegate" + index
28+ width: filtergrid.cellWidth
29+ height: filtergrid.cellHeight
30+ text: model.title
31+ imageWidth: filtergrid.iconWidth
32+ imageHeight: filtergrid.iconHeight
33+ source: model.icon
34+
35+ style: FlatTileStyle {
36+ disabled: model.rendererHints['scope_disabled'] === 1;
37+ }
38+
39+ onClicked: {
40+ var data = { model: model }
41+ filtergrid.clicked(index, data, tile.y)
42+ }
43+
44+ onPressAndHold: {
45+ var data = { model: model }
46+ filtergrid.pressAndHold(index, data, tile.y)
47+ }
48+ }
49+}
Dash/Apps/FrequentlyUsedAppsModel.qml+4−4
@@ -68,13 +68,13 @@ ListModel {
68 metadata: ""
68 metadata: ""
69 }
69 }
70 ListElement {
70 ListElement {
71− uri: "application:///usr/share/applications/facebook-webapp.desktop"
71+ uri: "appid://com.ubuntu.developer.webapps.webapp-facebook/webapp-facebook/current-user-version"
72 icon: "../../graphics/applicationIcons/facebook.png"
72 icon: "../../graphics/applicationIcons/facebook.png"
73 category: 0
73 category: 0
74 mimetype: "application/x-desktop"
74 mimetype: "application/x-desktop"
75 title: "Facebook"
75 title: "Facebook"
76 comment: ""
76 comment: ""
77− dndUri: "file:///usr/share/applications/facebook-webapp.desktop"
77+ dndUri: "appid://com.ubuntu.developer.webapps.webapp-facebook/webapp-facebook/current-user-version"
78 metadata: ""
78 metadata: ""
79 }
79 }
80 ListElement {
80 ListElement {
@@ -88,13 +88,13 @@ ListModel {
88 metadata: ""
88 metadata: ""
89 }
89 }
90 ListElement {
90 ListElement {
91− uri: "application:///usr/share/applications/gmail-webapp.desktop"
91+ uri: "appid://com.ubuntu.developer.webapps.webapp-gmail/webapp-gmail/current-user-version"
92 icon: "../../graphics/applicationIcons/gmail.png"
92 icon: "../../graphics/applicationIcons/gmail.png"
93 category: 0
93 category: 0
94 mimetype: "application/x-desktop"
94 mimetype: "application/x-desktop"
95 title: "GMail"
95 title: "GMail"
96 comment: ""
96 comment: ""
97− dndUri: "file:///usr/share/applications/gmail-webapp.desktop"
97+ dndUri: "appid://com.ubuntu.developer.webapps.webapp-gmail/webapp-gmail/current-user-version"
98 metadata: ""
98 metadata: ""
99 }
99 }
100 ListElement {
100 ListElement {
Dash/Apps/RunningApplicationTile.qml+9−5
@@ -39,9 +39,7 @@ AbstractButton {
39 property bool terminationModeEnabled: false
39 property bool terminationModeEnabled: false
40
40
41 onClicked: {
41 onClicked: {
42− if (terminationModeEnabled)
42+ if (!terminationModeEnabled)
43− requestedApplicationTermination(application)
44− else
45 requestedApplicationActivation(application)
43 requestedApplicationActivation(application)
46 }
44 }
47
45
@@ -123,9 +121,10 @@ AbstractButton {
123 }
121 }
124
122
125 CloseIcon {
123 CloseIcon {
124+ objectName: "closeIcon " + model.name
126 anchors {
125 anchors {
127− right: shapedApplicationImage.right
126+ left: shapedApplicationImage.left
128− rightMargin: -units.gu(1)
127+ leftMargin: -units.gu(1)
129 top: parent.top
128 top: parent.top
130 topMargin: -units.gu(1)
129 topMargin: -units.gu(1)
131 }
130 }
@@ -133,5 +132,10 @@ AbstractButton {
133 width: units.gu(6)
132 width: units.gu(6)
134 id: closeIcon
133 id: closeIcon
135 enabled: root.terminationModeEnabled
134 enabled: root.terminationModeEnabled
135+
136+ MouseArea {
137+ anchors { fill: parent; margins: -units.gu(1) }
138+ onClicked: requestedApplicationTermination(application)
139+ }
136 }
140 }
137}
141}
Dash/Apps/RunningApplicationsGrid.qml+20−1
@@ -22,6 +22,8 @@ ResponsiveFlowView {
22 clip: true
22 clip: true
23
23
24 signal updateScreenshots
24 signal updateScreenshots
25+ property alias enableHeightBehavior: heightBehaviour.enabled
26+ property bool enableHeightBehaviorOnNextCreation: firstModel.count + secondModel.count == 0
25
27
26 Connections {
28 Connections {
27 target: shell
29 target: shell
@@ -29,7 +31,24 @@ ResponsiveFlowView {
29 onStageScreenshotsReadyChanged: if (shell.dashShown && shell.stageScreenshotsReady) updateScreenshots();
31 onStageScreenshotsReadyChanged: if (shell.dashShown && shell.stageScreenshotsReady) updateScreenshots();
30 }
32 }
31
33
34+ Behavior on height {
35+ id: heightBehaviour
36+ enabled: false
32− Behavior on height { NumberAnimation { duration: 200; easing.type: Easing.InOutQuad } }
37+ NumberAnimation { duration: 200; easing.type: Easing.InOutQuad }
38+ }
39+
40+ Connections {
41+ target: root.firstModel
42+ onCountChanged: {
43+ heightBehaviour.enabled = true;
44+ }
45+ }
46+ Connections {
47+ target: root.secondModel
48+ onCountChanged: {
49+ heightBehaviour.enabled = true;
50+ }
51+ }
33
52
34 property bool canEnableTerminationMode: true
53 property bool canEnableTerminationMode: true
35
54
Dash/Dash.qml+3
@@ -22,6 +22,9 @@ import "../Components"
22
22
23Showable {
23Showable {
24 id: dash
24 id: dash
25+ objectName: "dash"
26+
27+ visible: shown
25
28
26 property alias contentProgress: dashContent.contentProgress
29 property alias contentProgress: dashContent.contentProgress
27 property string showScopeOnLoaded: "home.scope"
30 property string showScopeOnLoaded: "home.scope"
Dash/DashApps.qml+2
@@ -24,6 +24,7 @@ import "Apps"
24
24
25GenericScopeView {
25GenericScopeView {
26 id: scopeView
26 id: scopeView
27+ objectName: "DashApps"
27
28
28 // FIXME: a way to aggregate these models would be ideal
29 // FIXME: a way to aggregate these models would be ideal
29 property var mainStageApplicationsModel: shell.applicationManager.mainStageApplications
30 property var mainStageApplicationsModel: shell.applicationManager.mainStageApplications
@@ -51,5 +52,6 @@ GenericScopeView {
51
52
52 onScopeChanged: {
53 onScopeChanged: {
53 scopeView.scope.categories.overrideResults("recent", runningApplicationsModel);
54 scopeView.scope.categories.overrideResults("recent", runningApplicationsModel);
55+ enableHeightBehaviorOnNextCreation = (mainStageApplicationsModel.count + sideStageApplicationModel.count == 0)
54 }
56 }
55}
57}
Dash/DashContent.qml+7−6
@@ -83,7 +83,7 @@ Item {
83 id: dashContentList
83 id: dashContentList
84 objectName: "dashContentList"
84 objectName: "dashContentList"
85
85
86− interactive: dashContent.scopes.loaded
86+ interactive: dashContent.scopes.loaded && !currentItem.previewShown && !currentItem.moving
87
87
88 anchors.fill: parent
88 anchors.fill: parent
89 model: dashContent.model
89 model: dashContent.model
@@ -114,6 +114,10 @@ Item {
114 height: ListView.view.height
114 height: ListView.view.height
115 asynchronous: true
115 asynchronous: true
116 source: scopeMapper.map(scope.id)
116 source: scopeMapper.map(scope.id)
117+ objectName: scope.id + " loader"
118+
119+ readonly property bool previewShown: item.previewShown
120+ readonly property bool moving: item.moving
117
121
118 // these are needed for autopilot tests
122 // these are needed for autopilot tests
119 readonly property string scopeId: scope.id
123 readonly property string scopeId: scope.id
@@ -122,7 +126,7 @@ Item {
122
126
123 onLoaded: {
127 onLoaded: {
124 item.scope = Qt.binding(function() { return scope })
128 item.scope = Qt.binding(function() { return scope })
125− item.isCurrent = Qt.binding(function() { return ListView.isCurrentItem })
129+ item.isCurrent = Qt.binding(function() { return visible && ListView.isCurrentItem })
126 item.searchHistory = Qt.binding(function() { return shell.searchHistory })
130 item.searchHistory = Qt.binding(function() { return shell.searchHistory })
127 dashContentList.movementStarted.connect(item.movementStarted)
131 dashContentList.movementStarted.connect(item.movementStarted)
128 dashContent.positionedAtBeginning.connect(item.positionedAtBeginning)
132 dashContent.positionedAtBeginning.connect(item.positionedAtBeginning)
@@ -134,10 +138,7 @@ Item {
134 onEndReached: contentEndReached()
138 onEndReached: contentEndReached()
135 onPreviewShownChanged: {
139 onPreviewShownChanged: {
136 if (item.previewShown) {
140 if (item.previewShown) {
137− previewShown()
141+ dashContent.previewShown()
138− dashContentList.interactive = false
139− } else {
140− dashContentList.interactive = true
141 }
142 }
142 }
143 }
143 }
144 }
Dash/DashMusic.qmldeleted−96
@@ -1,96 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import "../Components"
20−import "../Components/ListItems" as ListItems
21−import "Music"
22−
23−ScopeView {
24− id: scopeView
25−
26− property var categoryNames: [
27− i18n.tr("Featured"),
28− i18n.tr("Recent"),
29− i18n.tr("New Releases"),
30− i18n.tr("Top Charting")
31− ]
32−
33− onIsCurrentChanged: {
34− pageHeader.resetSearch();
35− }
36−
37− onMovementStarted: categoryView.showHeader()
38−
39− Binding {
40− target: scopeView.scope
41− property: "searchQuery"
42− value: pageHeader.searchQuery
43− }
44−
45− Connections {
46− target: panel
47− onSearchClicked: if (isCurrent) {
48− pageHeader.triggerSearch()
49− categoryView.showHeader()
50− }
51− }
52−
53− function getRenderer(categoryId) {
54− switch (categoryId) {
55− case "featured": return "Music/MusicCarousel.qml"
56− default: return "Music/MusicFilterGrid.qml"
57− }
58− }
59−
60− ScopeListView {
61− id: categoryView
62− anchors.fill: parent
63− model: scopeView.categories
64−
65− onAtYEndChanged: if (atYEnd) endReached()
66− onMovingChanged: if (moving && atYEnd) endReached()
67−
68− delegate: ListItems.Base {
69− id: base
70− highlightWhenPressed: false
71−
72− property string categoryId: model.categoryId
73−
74− Loader {
75− anchors { top: parent.top; left: parent.left; right: parent.right }
76− source: scopeView.getRenderer(base.categoryId)
77− onLoaded: {
78− item.model = results
79− }
80− }
81− }
82−
83− sectionProperty: "name"
84− sectionDelegate: ListItems.Header {
85− width: categoryView.width
86− text: i18n.tr(section)
87− }
88− pageHeader: PageHeader {
89− id: pageHeader
90− width: categoryView.width
91− text: i18n.tr("Music")
92− searchEntryEnabled: true
93− searchHistory: scopeView.searchHistory
94− }
95− }
96−}
Dash/DashPreview.qml+91−93
@@ -23,19 +23,18 @@ Rectangle {
23 property int keyboardSize: Qt.inputMethod.visible ? Qt.inputMethod.keyboardRectangle.height : 0
23 property int keyboardSize: Qt.inputMethod.visible ? Qt.inputMethod.keyboardRectangle.height : 0
24 property var previewData
24 property var previewData
25
25
26− property string title: ""
27 property real previewWidthRatio: 0.5
26 property real previewWidthRatio: 0.5
28
27
28+ property Component previewImages
29 property Component header
29 property Component header
30− property Component buttons
30+ property Component actions
31− property Component body
31+ property Component description
32+ property Component ratings
32
33
33− readonly property bool narrowMode: width <= height
34+ readonly property bool narrowMode: width <= height * 1.5
35+ readonly property int columnWidth: narrowMode ? contentRow.width : (contentRow.width / 3) - contentRow.spacing
34 readonly property int contentSpacing: units.gu(3)
36 readonly property int contentSpacing: units.gu(3)
35
37
36− signal close()
37− signal previewImageClicked()
38−
39 color: Qt.rgba(0, 0, 0, .3)
38 color: Qt.rgba(0, 0, 0, .3)
40 clip: true
39 clip: true
41
40
@@ -61,87 +60,32 @@ Rectangle {
61 anchors.fill: parent
60 anchors.fill: parent
62 }
61 }
63
62
64− Item {
65− id: headerRow
66− height: units.gu(4)
67− anchors {
68− top: parent.top
69− left: parent.left
70− right: parent.right
71− margins: root.contentSpacing
72− }
73−
74− MouseArea {
75− anchors {
76− fill: parent
77− leftMargin: -root.contentSpacing
78− rightMargin: -root.contentSpacing
79− topMargin: -root.contentSpacing
80− }
81−
82− onClicked: root.close();
83− }
84−
85− Item {
86− id: labelItem
87− anchors {
88− fill: parent
89− rightMargin: closePreviewImage.width + spacing
90− }
91−
92− property int spacing: units.gu(2)
93−
94− Label {
95− id: title
96− objectName: "titleLabel"
97− anchors {
98− left: parent.left
99− right: parent.right
100− }
101−
102− elide: Text.ElideRight
103− fontSize: "x-large"
104− font.weight: Font.Light
105− color: Theme.palette.selected.backgroundText
106− opacity: 0.9
107− text: root.title
108− style: Text.Raised
109− styleColor: "black"
110− }
111− Image {
112− id: closePreviewImage
113− source: "graphics/tablet/icon_close_preview.png"
114− width: units.gu(4)
115− height: units.gu(1.5)
116− anchors {
117− bottom: title.bottom
118− bottomMargin: units.dp(7)
119− left: parent.left
120− leftMargin: title.paintedWidth + labelItem.spacing
121− }
122− }
123− }
124− }
125
63
126 Row {
64 Row {
127 id: contentRow
65 id: contentRow
128 anchors {
66 anchors {
129 left: parent.left
67 left: parent.left
68+ top: parent.top
130 right: parent.right
69 right: parent.right
131− top: headerRow.bottom
132 bottom: parent.bottom
70 bottom: parent.bottom
71+ topMargin: root.contentSpacing
72+ leftMargin: root.contentSpacing
133− margins: root.contentSpacing
73+ rightMargin: root.contentSpacing
134 }
74 }
75+ height: childrenRect.height
135
76
136 spacing: units.gu(2)
77 spacing: units.gu(2)
137
78
79+
138 Flickable {
80 Flickable {
139 id: leftFlickable
81 id: leftFlickable
140 objectName: "leftFlickable"
82 objectName: "leftFlickable"
83+ anchors {
141− anchors.top: parent.top
84+ top: parent.top
142− anchors.bottom: parent.bottom
85+ bottom: parent.bottom
143− width: root.narrowMode ? contentRow.width : contentRow.width * root.previewWidthRatio
86+ }
87+ width: root.columnWidth
144− contentHeight: leftColumn.height
88+ contentHeight: leftColumn.height + root.contentSpacing
145 anchors.bottomMargin: root.keyboardSize
89 anchors.bottomMargin: root.keyboardSize
146 clip: true
90 clip: true
147
91
@@ -150,33 +94,44 @@ Rectangle {
150 Column {
94 Column {
151 id: leftColumn
95 id: leftColumn
152 objectName: "leftColumn"
96 objectName: "leftColumn"
97+ height: childrenRect.height
98+ spacing: root.contentSpacing
153 anchors {
99 anchors {
154 left: parent.left
100 left: parent.left
155 right: parent.right
101 right: parent.right
156 }
102 }
157− height: childrenRect.height
103+ }
158− spacing: units.gu(1)
104+ }
159
105
160− Loader {
106+ Flickable {
161− id: headerLoader
107+ id: centerFlickable
162− anchors.left: parent.left
108+ anchors {
163− anchors.right: parent.right
109+ top: parent.top
164− sourceComponent: root.header
110+ bottom: parent.bottom
165− }
111+ }
166− Loader {
112+ width: root.columnWidth
167− id: buttonLoader
113+ contentHeight: centerColumn.height
114+ clip: true
115+
116+ Column {
117+ id: centerColumn
118+ objectName: "centerColumn"
119+ height: childrenRect.height
120+ anchors {
168− anchors.left: parent.left
121+ left: parent.left
169− anchors.right: parent.right
122+ right: parent.right
170− sourceComponent: root.buttons
171 }
123 }
124+ spacing: root.contentSpacing
172 }
125 }
173 }
126 }
174
127
175 Flickable {
128 Flickable {
176 id: rightFlickable
129 id: rightFlickable
130+ anchors {
177− anchors.top: parent.top
131+ top: parent.top
178− anchors.bottom: parent.bottom
132+ bottom: parent.bottom
179− width: narrowMode ? 0 : (contentRow.width - leftColumn.width - contentRow.spacing)
133+ }
134+ width: root.columnWidth
180 contentHeight: rightColumn.height
135 contentHeight: rightColumn.height
181 clip: true
136 clip: true
182
137
@@ -193,9 +148,52 @@ Rectangle {
193 }
148 }
194
149
195 Loader {
150 Loader {
151+ id: previewImageLoader
152+ parent: leftColumn
153+ sourceComponent: root.previewImages
154+ anchors {
155+ left: parent.left
156+ right: parent.right
157+ }
158+ }
159+
160+ Loader {
161+ id: ratingsLoader
196 parent: root.narrowMode ? leftColumn : rightColumn
162 parent: root.narrowMode ? leftColumn : rightColumn
163+ anchors {
164+ left: parent.left
165+ right: parent.right
166+ }
167+ sourceComponent: root.ratings
168+ }
169+
170+ Loader {
171+ id: descriptionLoader
172+ parent: root.narrowMode ? leftColumn : centerColumn
173+ anchors {
197− anchors.left: parent.left
174+ left: parent.left
175+ right: parent.right
176+ }
177+ sourceComponent: root.description
178+ }
179+
180+ Loader {
181+ id: actionsLoader
182+ parent: root.narrowMode ? leftColumn : centerColumn
183+ anchors {
184+ left: parent.left
198− anchors.right: parent.right
185+ right: parent.right
186+ }
199− sourceComponent: root.body
187+ sourceComponent: root.actions
188+ }
189+
190+ Loader {
191+ id: headerLoader
192+ parent: root.narrowMode ? leftColumn : centerColumn
193+ anchors {
194+ left: parent.left
195+ right: parent.right
196+ }
197+ sourceComponent: root.header
200 }
198 }
201}
199}
Dash/DashVideos.qmldeleted−201
@@ -1,201 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import "../Components"
20−import "../Components/ListItems" as ListItems
21−import "Video"
22−
23−ScopeView {
24− id: scopeView
25− property alias previewShown: previewLoader.onScreen
26−
27− property var categoryNames: [
28− i18n.tr("Featured"),
29− i18n.tr("Recent"),
30− i18n.tr("New Releases"),
31− i18n.tr("Popular Online")
32− ]
33−
34− onIsCurrentChanged: {
35− pageHeader.resetSearch();
36− }
37−
38− onMovementStarted: categoryView.showHeader()
39−
40− Binding {
41− target: scopeView.scope
42− property: "searchQuery"
43− value: pageHeader.searchQuery
44− }
45−
46− Connections {
47− target: panel
48− onSearchClicked: if (isCurrent) {
49− pageHeader.triggerSearch()
50− categoryView.showHeader()
51− }
52− }
53−
54− function getRenderer(categoryId) {
55− switch (categoryId) {
56− case "featured": return "Video/VideosCarousel.qml"
57− default: return "Video/VideosFilterGrid.qml"
58− }
59− }
60−
61− OpenEffect {
62− id: effect
63− anchors {
64− fill: parent
65− bottomMargin: -bottomOverflow
66− }
67− sourceItem: categoryView
68−
69− enabled: gap > 0.0
70−
71− topGapPx: (1 - gap) * positionPx
72− topOpacity: Math.max(0, (1 - gap * 1.2))
73− bottomGapPx: positionPx + gap * (targetBottomGapPx - positionPx)
74− bottomOverflow: units.gu(6)
75− bottomOpacity: 1 - (gap * 0.8)
76−
77− property int targetBottomGapPx: height - units.gu(8) - bottomOverflow
78− property real gap: previewLoader.open ? 1.0 : 0.0
79−
80− Behavior on gap {
81− NumberAnimation {
82− duration: 200
83− easing.type: Easing.InOutQuad
84− onRunningChanged: {
85− if (!previewLoader.open && !running) {
86− previewLoader.onScreen = false;
87− }
88− }
89− }
90− }
91− }
92−
93− ScopeListView {
94− id: categoryView
95− anchors.fill: parent
96− model: scopeView.categories
97− forceNoClip: previewLoader.onScreen
98−
99− onAtYEndChanged: if (atYEnd) endReached()
100− onMovingChanged: if (moving && atYEnd) endReached()
101−
102− delegate: ListItems.Base {
103− id: base
104− highlightWhenPressed: false
105− property string categoryId: model.categoryId
106−
107− Loader {
108− id: loader
109− anchors { top: parent.top; left: parent.left; right: parent.right }
110− source: scopeView.getRenderer(base.categoryId)
111− onLoaded: {
112− item.model = results
113− }
114−
115− Connections {
116− target: loader.item
117− onClicked: {
118− var dataItem;
119− // VideosCarousel and VideosFilterGrid have different
120− // clicked signals, accomodate for that
121− if (categoryId == "featured") {
122− var fileUri = delegateItem.model.uri.replace(/^[^:]+:/, "")
123− dataItem = {fileUri: fileUri, nfoUri: delegateItem.model.comment}
124− } else {
125− dataItem = data;
126− }
127− if (dataItem.nfoUri != "") {
128− previewLoader.videoData = dataItem;
129− previewLoader.open = true;
130− effect.positionPx = mapToItem(categoryView, 0, itemY).y;
131− }
132− }
133− }
134− }
135− }
136−
137− sectionProperty: "name"
138− sectionDelegate: ListItems.Header {
139− width: categoryView.width
140− text: i18n.tr(section)
141− }
142−
143− pageHeader: PageHeader {
144− id: pageHeader
145− width: categoryView.width
146− text: i18n.tr("Videos")
147− searchEntryEnabled: true
148− searchHistory: scopeView.searchHistory
149− }
150− }
151−
152− Loader {
153− id: previewLoader
154− height: effect.bottomGapPx - effect.topGapPx
155− anchors {
156− top: parent.top
157− topMargin: effect.topGapPx
158− left: parent.left
159− right: parent.right
160− }
161− sourceComponent: onScreen ? previewComponent : undefined
162−
163− property bool open: false
164− property bool onScreen: false
165− property var videoData
166−
167−
168− onOpenChanged: {
169− if (open) {
170− onScreen = true;
171− }
172− }
173−
174− onLoaded: {
175− item.item = videoData;
176− }
177− }
178−
179− Component {
180− id: previewComponent
181−
182− VideoPreview {
183− id: preview
184− anchors.fill: parent
185− onClose: open = false;
186− }
187− }
188−
189− // TODO: Move as InverseMouseArea to DashPreview
190− MouseArea {
191− enabled: previewLoader.onScreen
192− anchors {
193− fill: parent
194− topMargin: effect.bottomGapPx
195− }
196− onClicked: {
197− previewLoader.open = false;
198− }
199− }
200−
201−}
Dash/Generic/FlatTileStyle.qmlnew file+79
@@ -0,0 +1,79 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+
20+Item {
21+ id: tile
22+
23+ property bool disabled: false
24+
25+ anchors.fill: parent
26+
27+ Image {
28+ id: icon
29+ objectName: "image"
30+ width: styledItem.imageWidth
31+ height: styledItem.imageHeight
32+
33+ anchors.horizontalCenter: parent.horizontalCenter
34+
35+ sourceSize { width: width; height: height }
36+ asynchronous: true
37+ cache: false
38+ source: styledItem.source
39+ fillMode: styledItem.fillMode
40+ opacity: tile.disabled ? 0.3 : 1.0
41+ horizontalAlignment: Image.AlignHCenter
42+ verticalAlignment: Image.AlignVCenter
43+ }
44+
45+ UbuntuShape {
46+ id: borderPressed
47+ objectName: "borderPressed"
48+
49+ anchors.fill: icon
50+ radius: "medium"
51+ borderSource: "radius_pressed.sci"
52+ opacity: styledItem.pressed ? 1.0 : 0.0
53+ Behavior on opacity { NumberAnimation { duration: 200; easing.type: Easing.OutQuint } }
54+ }
55+
56+ Label {
57+ id: label
58+ objectName: "label"
59+ anchors {
60+ baseline: icon.bottom
61+ baselineOffset: units.gu(2)
62+ left: parent.left
63+ right: parent.right
64+ leftMargin: units.gu(1)
65+ rightMargin: units.gu(1)
66+ }
67+
68+ color: Theme.palette.selected.backgroundText
69+ opacity: 0.9
70+ style: Text.Raised
71+ styleColor: "black"
72+ fontSize: "small"
73+ elide: Text.ElideMiddle
74+ horizontalAlignment: styledItem.horizontalAlignment
75+ text: styledItem.text
76+ wrapMode: Text.Wrap
77+ maximumLineCount: styledItem.maximumLineCount
78+ }
79+}
Dash/Generic/GenericFilterGrid.qml−3
@@ -39,11 +39,8 @@ FilterGrid {
39 text: model.title
39 text: model.title
40 imageWidth: filtergrid.iconWidth
40 imageWidth: filtergrid.iconWidth
41 imageHeight: filtergrid.iconHeight
41 imageHeight: filtergrid.iconHeight
42−
43 source: model.icon
42 source: model.icon
44
43
45− fillMode: Image.PreserveAspectCrop
46−
47 onClicked: {
44 onClicked: {
48 var data = { model: model }
45 var data = { model: model }
49 filtergrid.clicked(index, data, tile.y)
46 filtergrid.clicked(index, data, tile.y)
Dash/Generic/GenericPreview.qml+158−70
@@ -16,90 +16,178 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19+import Ubuntu.Components.ListItems 0.1 as ListItems
20+import Ubuntu.DownloadDaemonListener 0.1
19import "../../Components"
21import "../../Components"
20−import "../../Components/ListItems" as ListItems
21import ".."
22import ".."
23+import "../Previews"
22
24
23DashPreview {
25DashPreview {
24 id: genericPreview
26 id: genericPreview
25
27
26− title: previewData.title
28+ previewImages: previewImagesComponent
27− previewWidthRatio: 0.6
29+ header: headerComponent
28−
30+ actions: (previewData.infoMap !== undefined && previewData.infoMap["show_progressbar"]) ? progressComponent : actionsComponent
29− property url url: previewData.image
31+ description: descriptionComponent
30−
32+
31− header: UbuntuShape {
33+ Component {
32− id: urlLoader
34+ id: previewImagesComponent
33− anchors.left: parent.left
35+
34− anchors.right: parent.right
36+ LazyImage {
35− height: width * previewImage.sourceSize.height / previewImage.sourceSize.width
37+ objectName: "genericPreviewImage"
36− radius: "medium"
38+ anchors {
37− image: Image {
39+ left: parent.left
38− id: previewImage
40+ right: parent.right
39− asynchronous: true
41+ }
42+ scaleTo: "width"
40− source: genericPreview.url
43+ source: genericPreview.previewData.image
41− fillMode: Image.PreserveAspectCrop
44+ initialHeight: width
45+ }
46+ }
47+
48+ Component {
49+ id: headerComponent
50+ Header {
51+ title: previewData.title
52+ subtitle: previewData.subtitle
42 }
53 }
43 }
54 }
44
55
45− buttons: GridView {
56+ Component {
46− id: buttons
57+ id: actionsComponent
58+
59+ Column {
60+ id: buttonList
61+ spacing: units.gu(1)
62+ Repeater {
63+ objectName: "buttonList"
47− model: genericPreview.previewData.actions
64+ model: previewData.actions
48−
65+
49− property int numOfRows: (count + 1) / 2
50− property int spacing: units.gu(1)
51− height: Math.max(units.gu(4), units.gu(4)*numOfRows + spacing*(numOfRows - 1))
52−
53− cellWidth: Math.max(units.gu(9), width / 2)
54− cellHeight: buttonHeight + spacing
55− property int buttonWidth: Math.max(0, width / 2 - spacing)
56− property int buttonHeight: units.gu(4)
57−
58− delegate: Button {
66+ delegate: Button {
59− width: Math.max(units.gu(4), buttons.buttonWidth)
67+ objectName: "button" + index
68+ width: parent.width
60− height: buttons.buttonHeight
69+ height: buttonList.buttonHeight
61− color: "#dd4814"
70+ color: Theme.palette.selected.foreground
62− text: modelData.displayName
71+ text: modelData.displayName
63− iconSource: modelData.iconHint
72+ iconSource: modelData.iconHint
64− iconPosition: "right"
73+ iconPosition: "right"
65− visible: true
66− onClicked: {
67− genericPreview.previewData.execute(modelData.id, { })
74+ onClicked: previewData.execute(modelData.id, { })
75+ }
68 }
76 }
69 }
77 }
70− focus: false
71 }
78 }
72− body: Column {
79+
80+ Component {
81+ id: progressComponent
82+
83+ ProgressBar {
84+ id: progressBar
85+ objectName: "progressBar"
86+ value: 0
87+ maximumValue: 100
73− spacing: units.gu(2)
88+ height: units.gu(5)
74−
89+
75− Label {
90+ property var model: previewData.actions
76− anchors { left: parent.left; right: parent.right }
91+
77− visible: text != ""
92+ DownloadTracker {
78− fontSize: "medium"
93+ service: "com.canonical.applications.Downloader"
79− opacity: 0.6
94+ dbusPath: previewData.infoMap["progressbar_source"] ? previewData.infoMap["progressbar_source"].value : ""
80− color: "white"
95+
81− text: previewData.subtitle.replace(/[\r\n]+/g, "<br />")
96+ onProgress: {
82− style: Text.Raised
97+ var percentage = parseInt(received * 100 / total);
83− styleColor: "black"
98+ progressBar.value = percentage;
84− wrapMode: Text.WordWrap
99+ }
85− textFormat: Text.RichText
100+
86− // FIXME: workaround for https://bugreports.qt-project.org/browse/QTBUG-33020
101+ onFinished: {
87− onWidthChanged: { wrapMode = Text.NoWrap; wrapMode = Text.WordWrap }
102+ previewData.execute(progressBar.model[0].id, { })
103+ }
104+
105+ onError: {
106+ previewData.execute(progressBar.model[1].id, { "error": error });
107+ }
108+ }
109+
88 }
110 }
111+ }
89
112
113+ Component {
114+ id: descriptionComponent
115+ Column {
116+ spacing: units.gu(2)
117+
90− Label {
118+ Label {
119+ id: descriptionLabel
91− anchors { left: parent.left; right: parent.right }
120+ anchors { left: parent.left; right: parent.right }
92− visible: text != ""
121+ visible: text != ""
93− fontSize: "small"
122+ fontSize: "small"
94− opacity: 0.6
123+ opacity: 0.6
95− color: "white"
124+ color: "white"
96− text: previewData.description.replace(/[\r\n]+/g, "<br />")
125+ text: previewData.description.replace(/[\r\n]/g, "<br />")
97− style: Text.Raised
126+ style: Text.Raised
98− styleColor: "black"
127+ styleColor: "black"
99− wrapMode: Text.WordWrap
128+ wrapMode: Text.WordWrap
100− textFormat: Text.RichText
129+ textFormat: Text.RichText
101− // FIXME: workaround for https://bugreports.qt-project.org/browse/QTBUG-33020
130+ // FIXME: workaround for https://bugreports.qt-project.org/browse/QTBUG-33020
102− onWidthChanged: { wrapMode = Text.NoWrap; wrapMode = Text.WordWrap }
131+ onWidthChanged: { wrapMode = Text.NoWrap; wrapMode = Text.WordWrap }
132+ }
133+
134+ Column {
135+ objectName: "infoHintColumn"
136+ anchors {
137+ left: parent.left
138+ right: parent.right
139+ }
140+ Repeater {
141+ objectName: "infoHintRepeater"
142+ model: previewData.infoHints
143+
144+ delegate: Item {
145+ objectName: "infoHintItem" + index
146+ width: parent.width
147+ height: units.gu(5)
148+ Row {
149+ width: parent.width
150+ spacing: units.gu(1)
151+ property int columnWidth: (width - spacing) / 2
152+ anchors.verticalCenter: parent.verticalCenter
153+
154+ Label {
155+ objectName: "displayNameLabel"
156+ visible: valueLabel.visible
157+ fontSize: "small"
158+ opacity: 0.9
159+ color: "white"
160+ horizontalAlignment: Text.AlignLeft
161+ width: parent.columnWidth
162+ text: modelData.displayName
163+ style: Text.Raised
164+ styleColor: "black"
165+ }
166+ Label {
167+ id: valueLabel
168+ objectName: "valueLabel"
169+ visible: modelData.value != ""
170+ fontSize: "small"
171+ opacity: 0.6
172+ color: "white"
173+ horizontalAlignment: Text.AlignRight
174+ width: parent.columnWidth
175+ text: modelData.value ? modelData.value : ""
176+ style: Text.Raised
177+ styleColor: "black"
178+ wrapMode: Text.WordWrap
179+ }
180+ }
181+ ListItems.ThinDivider {
182+ anchors {
183+ left: parent.left
184+ bottom: parent.bottom
185+ right: parent.right
186+ }
187+ }
188+ }
189+ }
190+ }
103 }
191 }
104 }
192 }
105}
193}
Dash/Generic/WeatherFilterGrid.qmlnew file+49
@@ -0,0 +1,49 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+import "../../Components"
20+
21+GenericFilterGrid {
22+ id: filtergrid
23+
24+ delegateHeight: units.gu(11.5)
25+
26+ delegate: Tile {
27+ id: tile
28+ objectName: "delegate" + index
29+ width: filtergrid.cellWidth
30+ height: filtergrid.cellHeight
31+ text: model.title
32+ imageWidth: filtergrid.iconWidth
33+ imageHeight: filtergrid.iconHeight
34+ source: model.icon
35+ maximumLineCount: 2
36+
37+ style: FlatTileStyle {}
38+
39+ onClicked: {
40+ var data = { model: model }
41+ filtergrid.clicked(index, data, tile.y)
42+ }
43+
44+ onPressAndHold: {
45+ var data = { model: model }
46+ filtergrid.pressAndHold(index, data, tile.y)
47+ }
48+ }
49+}
Dash/GenericScopeView.qml+63−4
@@ -22,6 +22,9 @@ import "../Components/ListItems" as ListItems
22ScopeView {
22ScopeView {
23 id: scopeView
23 id: scopeView
24 readonly property alias previewShown: previewLoader.onScreen
24 readonly property alias previewShown: previewLoader.onScreen
25+ property bool enableHeightBehaviorOnNextCreation: false
26+
27+ moving: categoryView.moving
25
28
26 onIsCurrentChanged: {
29 onIsCurrentChanged: {
27 pageHeader.resetSearch();
30 pageHeader.resetSearch();
@@ -30,6 +33,8 @@ ScopeView {
30
33
31 onMovementStarted: categoryView.showHeader()
34 onMovementStarted: categoryView.showHeader()
32
35
36+ onPositionedAtBeginning: categoryView.positionAtBeginning()
37+
33 Binding {
38 Binding {
34 target: scopeView.scope
39 target: scopeView.scope
35 property: "searchQuery"
40 property: "searchQuery"
@@ -58,6 +63,7 @@ ScopeView {
58
63
59 ScopeListView {
64 ScopeListView {
60 id: categoryView
65 id: categoryView
66+ objectName: "categoryListView"
61 anchors.fill: parent
67 anchors.fill: parent
62 model: scopeView.categories
68 model: scopeView.categories
63 forceNoClip: previewLoader.onScreen
69 forceNoClip: previewLoader.onScreen
@@ -68,6 +74,7 @@ ScopeView {
68 property string expandedCategoryId: ""
74 property string expandedCategoryId: ""
69
75
70 delegate: ListItems.Base {
76 delegate: ListItems.Base {
77+ id: baseItem
71 highlightWhenPressed: false
78 highlightWhenPressed: false
72
79
73 readonly property bool expandable: rendererLoader.item ? rendererLoader.item.expandable : false
80 readonly property bool expandable: rendererLoader.item ? rendererLoader.item.expandable : false
@@ -82,13 +89,18 @@ ScopeView {
82 right: parent.right
89 right: parent.right
83 }
90 }
84
91
85− source: getRenderer(model.renderer, model.contentType)
92+ source: getRenderer(model.renderer, model.contentType, model.rendererHint)
86
93
87 onLoaded: {
94 onLoaded: {
95+ if (item.enableHeightBehavior !== undefined && item.enableHeightBehaviorOnNextCreation !== undefined) {
96+ item.enableHeightBehavior = scopeView.enableHeightBehaviorOnNextCreation;
97+ scopeView.enableHeightBehaviorOnNextCreation = false;
98+ }
88 if (source.toString().indexOf("Apps/RunningApplicationsGrid.qml") != -1) {
99 if (source.toString().indexOf("Apps/RunningApplicationsGrid.qml") != -1) {
89 // TODO: the running apps grid doesn't support standard scope results model yet
100 // TODO: the running apps grid doesn't support standard scope results model yet
90 item.firstModel = Qt.binding(function() { return results.firstModel })
101 item.firstModel = Qt.binding(function() { return results.firstModel })
91 item.secondModel = Qt.binding(function() { return results.secondModel })
102 item.secondModel = Qt.binding(function() { return results.secondModel })
103+ item.canEnableTerminationMode = Qt.binding(function() { return scopeView.isCurrent })
92 } else {
104 } else {
93 item.model = Qt.binding(function() { return results })
105 item.model = Qt.binding(function() { return results })
94 }
106 }
@@ -99,6 +111,13 @@ ScopeView {
99 item.filter = shouldFilter;
111 item.filter = shouldFilter;
100 }
112 }
101 }
113 }
114+ updateDelegateCreationRange();
115+ }
116+
117+ Component.onDestruction: {
118+ if (item.enableHeightBehavior !== undefined && item.enableHeightBehaviorOnNextCreation !== undefined) {
119+ scopeView.enableHeightBehaviorOnNextCreation = item.enableHeightBehaviorOnNextCreation;
120+ }
102 }
121 }
103
122
104 Connections {
123 Connections {
@@ -149,6 +168,33 @@ ScopeView {
149 }
168 }
150 }
169 }
151 }
170 }
171+ onContentYChanged: rendererLoader.updateDelegateCreationRange();
172+ onHeightChanged: rendererLoader.updateDelegateCreationRange();
173+ }
174+
175+ function updateDelegateCreationRange() {
176+ // Do not update the range if we are overshooting up or down, since we'll come back
177+ // to the stable position and delete/create items without any reason
178+ if (categoryView.contentY < categoryView.originY) {
179+ return;
180+ } else if (categoryView.contentY + categoryView.height > categoryView.contentHeight) {
181+ return;
182+ }
183+
184+ if (item.hasOwnProperty("delegateCreationBegin")) {
185+ if (baseItem.y + baseItem.height <= 0) {
186+ // Not visible (item at top of the list)
187+ item.delegateCreationBegin = baseItem.height
188+ item.delegateCreationEnd = baseItem.height
189+ } else if (baseItem.y >= categoryView.height) {
190+ // Not visible (item at bottom of the list)
191+ item.delegateCreationBegin = 0
192+ item.delegateCreationEnd = 0
193+ } else {
194+ item.delegateCreationBegin = Math.max(-baseItem.y, 0)
195+ item.delegateCreationEnd = Math.min(categoryView.height + item.delegateCreationBegin, baseItem.height)
196+ }
197+ }
152 }
198 }
153 }
199 }
154 }
200 }
@@ -176,6 +222,7 @@ ScopeView {
176 width: categoryView.width
222 width: categoryView.width
177 text: scopeView.scope.name
223 text: scopeView.scope.name
178 searchEntryEnabled: true
224 searchEntryEnabled: true
225+ scope: scopeView.scope
179 }
226 }
180 }
227 }
181
228
@@ -185,19 +232,31 @@ ScopeView {
185 }
232 }
186 }
233 }
187
234
188− function getRenderer(rendererId, contentType) {
235+ function getRenderer(rendererId, contentType, rendererHint) {
189 if (rendererId == "default") {
236 if (rendererId == "default") {
190 rendererId = getDefaultRendererId(contentType);
237 rendererId = getDefaultRendererId(contentType);
191 }
238 }
192 switch (rendererId) {
239 switch (rendererId) {
193 case "grid": {
240 case "grid": {
194 switch (contentType) {
241 switch (contentType) {
195− case "video": return "Generic/GenericFilterGridPotrait.qml";
242+ case "video": return "Video/VideoFilterGrid.qml";
196 case "music": return "Music/MusicFilterGrid.qml";
243 case "music": return "Music/MusicFilterGrid.qml";
244+ case "apps": {
245+ if (rendererHint == "toggled")
246+ return "Apps/DashPluginFilterGrid.qml";
247+ else
248+ return "Generic/GenericFilterGrid.qml";
249+ }
250+ case "weather": return "Generic/WeatherFilterGrid.qml";
197 default: return "Generic/GenericFilterGrid.qml";
251 default: return "Generic/GenericFilterGrid.qml";
198 }
252 }
199 }
253 }
254+ case "carousel": {
255+ switch (contentType) {
256+ case "music": return "Music/MusicCarousel.qml";
200− case "carousel": return "Generic/GenericCarousel.qml";
257+ default: return "Generic/GenericCarousel.qml";
258+ }
259+ }
201 case "special": {
260 case "special": {
202 switch (contentType) {
261 switch (contentType) {
203 case "apps": return "Apps/RunningApplicationsGrid.qml";
262 case "apps": return "Apps/RunningApplicationsGrid.qml";
Dash/Movie/MoviePreview.qmlnew file+71
@@ -0,0 +1,71 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+import ".."
20+import "../Generic"
21+import "../../Components"
22+import "../Previews"
23+
24+GenericPreview {
25+ id: root
26+
27+ property bool ready: previewData ? true : false
28+ property url url: ready ? previewData.image : ""
29+
30+ previewImages: previewImageComponent
31+ header: headerComponent
32+
33+ Component {
34+ id: previewImageComponent
35+ LazyImage {
36+ anchors.left: parent.left
37+ anchors.right: parent.right
38+ scaleTo: "width"
39+ visible: height > 0
40+ source: root.url
41+ initialHeight: width * 10 / 16
42+
43+ Image {
44+ objectName: "playButton"
45+ anchors.centerIn: parent
46+ readonly property bool bigButton: parent.width > units.gu(40)
47+ width: bigButton ? units.gu(8) : units.gu(4.5)
48+ height: width
49+ source: "../graphics/play_button%1%2.png".arg(previewImageMouseArea.pressed ? "_active" : "").arg(bigButton ? "_big" : "")
50+ }
51+
52+ MouseArea {
53+ id: previewImageMouseArea
54+ anchors.fill: parent
55+ onClicked: {
56+ Qt.openUrlExternally(previewData.result.uri);
57+ }
58+ }
59+ }
60+ }
61+
62+ Component {
63+ id: headerComponent
64+ Header {
65+ title: previewData.title
66+ rating: Math.round(previewData.rating * 10)
67+ reviews: previewData.numRatings
68+ rated: previewData.infoMap["rated"] ? previewData.infoMap["rated"].value : 0
69+ }
70+ }
71+}
Dash/Music/MusicFilterGrid.qml+21−22
@@ -16,42 +16,41 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import "../../Components"
18import "../../Components"
19+import "../Generic"
19
20
20−FilterGrid {
21+GenericFilterGrid {
21− id: filterGrid
22+ id: filtergrid
22
23
23− minimumHorizontalSpacing: units.gu(2)
24− maximumNumberOfColumns: 5
25− delegateWidth: units.gu(17)
24+ delegateWidth: units.gu(11)
26− delegateHeight: iconHeight + units.gu(3.5)
25+ delegateHeight: units.gu(16)
27− verticalSpacing: units.gu(2)
28
26
29− readonly property int iconWidth: (width / columns) * 0.8
27+ iconWidth: units.gu(11)
30− readonly property int iconHeight: iconWidth
28+ iconHeight: units.gu(11)
31
29
32− signal clicked(int index, var delegateItem, real itemY)
33− signal pressAndHold(int index, var delegateItem, real itemY)
34−
35− delegate: AlbumTile {
30+ delegate: Tile {
36 id: tile
31 id: tile
37 objectName: "delegate" + index
32 objectName: "delegate" + index
38− width: filterGrid.cellWidth
33+ width: filtergrid.cellWidth
39− height: filterGrid.cellHeight
34+ height: filtergrid.cellHeight
40− iconWidth: filterGrid.iconWidth
41− iconHeight: filterGrid.iconHeight
42−
43− artist: model.title
44− album: model.comment
35+ text: model.comment
36+ imageWidth: filtergrid.iconWidth
37+ imageHeight: filtergrid.iconHeight
45 source: model.icon
38 source: model.icon
39+ maximumLineCount: 2
40+ horizontalAlignment: Text.AlignLeft
41+
42+ style: MusicTileStyle {
43+ artist: model.title
44+ }
46
45
47 onClicked: {
46 onClicked: {
48 var data = { model: model }
47 var data = { model: model }
49− filterGrid.clicked(index, data, tile.y)
48+ filtergrid.clicked(index, data, tile.y)
50 }
49 }
51
50
52 onPressAndHold: {
51 onPressAndHold: {
53 var data = { model: model }
52 var data = { model: model }
54− filterGrid.pressAndHold(index, data, tile.y)
53+ filtergrid.pressAndHold(index, data, tile.y)
55 }
54 }
56 }
55 }
57}
56}
Dash/Music/MusicTileStyle.qmlnew file+102
@@ -0,0 +1,102 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+
20+Item {
21+ id: tile
22+
23+ property alias artist: artistLabel.text
24+
25+ anchors.fill: parent
26+
27+ UbuntuShape {
28+ id: icon
29+ anchors {
30+ top: parent.top
31+ horizontalCenter: parent.horizontalCenter
32+ }
33+ radius: "medium"
34+ width: styledItem.imageWidth
35+ height: styledItem.imageHeight
36+ image: Image {
37+ id: image
38+ objectName: "image"
39+ sourceSize { width: icon.width; height: icon.height }
40+ asynchronous: true
41+ cache: false
42+ source: styledItem.source
43+ fillMode: styledItem.fillMode
44+ horizontalAlignment: Image.AlignHCenter
45+ verticalAlignment: Image.AlignVCenter
46+ }
47+ }
48+
49+ UbuntuShape {
50+ id: borderPressed
51+ objectName: "borderPressed"
52+
53+ anchors.fill: icon
54+ radius: "medium"
55+ borderSource: "radius_pressed.sci"
56+ opacity: styledItem.pressed ? 1.0 : 0.0
57+ Behavior on opacity { NumberAnimation { duration: 200; easing.type: Easing.OutQuint } }
58+ }
59+
60+ Label {
61+ id: label
62+ objectName: "label"
63+ anchors {
64+ baseline: icon.bottom
65+ baselineOffset: units.gu(2)
66+ left: icon.left
67+ right: parent.right
68+ rightMargin: units.gu(1)
69+ leftMargin: units.dp(2)
70+ }
71+
72+ color: Theme.palette.selected.backgroundText
73+ opacity: 0.9
74+ style: Text.Raised
75+ styleColor: "black"
76+ fontSize: "small"
77+ font.weight: Font.Bold
78+ elide: Text.ElideRight
79+ horizontalAlignment: styledItem.horizontalAlignment
80+ text: styledItem.text
81+ wrapMode: Text.Wrap
82+ maximumLineCount: styledItem.maximumLineCount
83+ }
84+
85+ Label {
86+ id: artistLabel
87+ anchors {
88+ top: label.bottom
89+ left: label.left
90+ right: label.right
91+ rightMargin: units.gu(1)
92+ }
93+
94+ color: Theme.palette.selected.backgroundText
95+ opacity: 0.9
96+ style: Text.Raised
97+ styleColor: "black"
98+ fontSize: "x-small"
99+ elide: Text.ElideMiddle
100+ horizontalAlignment: styledItem.horizontalAlignment
101+ }
102+}
Dash/PreviewDelegateMapper.qml+1
@@ -22,6 +22,7 @@ QtObject {
22 readonly property string appPreview: "Apps/AppPreview.qml"
22 readonly property string appPreview: "Apps/AppPreview.qml"
23 property var previewDelegateMapping: {"preview-generic": genericPreview,
23 property var previewDelegateMapping: {"preview-generic": genericPreview,
24 "preview-application": appPreview,
24 "preview-application": appPreview,
25+ "preview-movie": "Movie/MoviePreview.qml",
25 }
26 }
26 }
27 }
27
28
Dash/Previews/Header.qmlnew file+109
@@ -0,0 +1,109 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+import "../../Components"
20+
21+Row {
22+ id: root
23+ property alias icon: image.source
24+ property alias title: titleLabel.text
25+ property alias subtitle: subtitleLabel.text
26+ property alias rating: ratingStars.rating
27+ property int rated: 0
28+ property int reviews: 0
29+
30+ spacing: units.gu(2)
31+ height: imageShape.visible ? imageShape.height : contentColumn.height
32+
33+ UbuntuShape {
34+ id: imageShape
35+ width: height
36+ height: Math.max(units.gu(6), contentColumn.height)
37+ visible: image.source.toString().length > 0
38+ image: Image {
39+ id: image
40+ sourceSize { width: imageShape.width; height: imageShape.height }
41+ asynchronous: true
42+ fillMode: Image.PreserveAspectFit
43+ }
44+ }
45+
46+ Column {
47+ id: contentColumn
48+ spacing: units.gu(1)
49+ width: parent.width - x
50+
51+ Label {
52+ id: titleLabel
53+ objectName: "titleLabel"
54+ fontSize: "large"
55+ color: "white"
56+ style: Text.Raised
57+ styleColor: "black"
58+ opacity: .9
59+ width: parent.width
60+ elide: Text.ElideRight
61+ }
62+
63+ Label {
64+ id: subtitleLabel
65+ objectName: "subtitleLabel"
66+ fontSize: "medium"
67+ color: "white"
68+ style: Text.Raised
69+ styleColor: "black"
70+ opacity: .6
71+ visible: text.length > 0
72+ }
73+
74+ Row {
75+ visible: root.rating >= 0
76+ spacing: units.gu(1)
77+
78+ RatingStars {
79+ id: ratingStars
80+ maximumRating: 10
81+ rating: -1
82+ }
83+
84+ Label {
85+ id: ratedLabel
86+ objectName: "ratedLabel"
87+ fontSize: "medium"
88+ color: "white"
89+ style: Text.Raised
90+ styleColor: "black"
91+ opacity: .6
92+ //TRANSLATORS: Number of persons who rated this app/video/whatever
93+ text: i18n.tr("(%1)").arg(root.rated)
94+ }
95+
96+ Label {
97+ id: reviewsLabel
98+ objectName: "reviewsLabel"
99+ fontSize: "medium"
100+ color: "white"
101+ style: Text.Raised
102+ styleColor: "black"
103+ opacity: .6
104+ //TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
105+ text: i18n.tr("%1 review", "%1 reviews", root.reviews).arg(root.reviews)
106+ }
107+ }
108+ }
109+}
Dash/Apps/AppReviews.qml → Dash/Previews/Reviews.qmlrenamed

The content is the same.

Dash/ScopeDelegateMapper.qml+2−4
@@ -17,10 +17,8 @@
17import QtQuick 2.0
17import QtQuick 2.0
18
18
19QtObject {
19QtObject {
20− property var scopeDelegateMapping: {"mockmusicmaster.scope": "DashMusic.qml",
21− "applications.scope": "DashApps.qml",
20+ property var scopeDelegateMapping: {"applications.scope": "DashApps.qml",
22− "home.scope": "DashHome.qml",
21+ "home.scope": "DashHome.qml"
23− "mockvideosmaster.scope": "DashVideos.qml"
24 }
22 }
25 property string genericScope: "GenericScopeView.qml"
23 property string genericScope: "GenericScopeView.qml"
26
24
Dash/ScopeListView.qml+6
@@ -16,8 +16,14 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import ListViewWithPageHeader 0.1
18import ListViewWithPageHeader 0.1
19+import SessionManager 0.1
19
20
20ListViewWithPageHeader {
21ListViewWithPageHeader {
21 maximumFlickVelocity: height * 10
22 maximumFlickVelocity: height * 10
22 flickDeceleration: height * 2
23 flickDeceleration: height * 2
24+
25+ Connections {
26+ target: SessionManager
27+ onActiveChanged: if (!SessionManager.active) showHeader()
28+ }
23}
29}
Dash/ScopeView.qml+12−3
@@ -23,6 +23,7 @@ FocusScope {
23 property SortFilterProxyModel categories: categoryFilter
23 property SortFilterProxyModel categories: categoryFilter
24 property bool isCurrent
24 property bool isCurrent
25 property ListModel searchHistory
25 property ListModel searchHistory
26+ property bool moving: false
26
27
27 signal endReached
28 signal endReached
28 signal movementStarted
29 signal movementStarted
@@ -31,14 +32,22 @@ FocusScope {
31 // FIXME delay the search so that daemons have time to settle, note that
32 // FIXME delay the search so that daemons have time to settle, note that
32 // removing this will break ScopeView::test_changeScope
33 // removing this will break ScopeView::test_changeScope
33 onScopeChanged: {
34 onScopeChanged: {
35+ if (scope) {
34− timer.restart();
36+ timer.restart();
35− scope.activateApplication.connect(activateApp);
37+ scope.activateApplication.connect(activateApp);
38+ }
36 }
39 }
37
40
38 function activateApp(desktopFilePath) {
41 function activateApp(desktopFilePath) {
39 shell.activateApplication(desktopFilePath);
42 shell.activateApplication(desktopFilePath);
40 }
43 }
41
44
45+ Binding {
46+ target: scope
47+ property: "isActive"
48+ value: isCurrent
49+ }
50+
42 Timer {
51 Timer {
43 id: timer
52 id: timer
44 interval: 2000
53 interval: 2000
@@ -47,7 +56,7 @@ FocusScope {
47
56
48 SortFilterProxyModel {
57 SortFilterProxyModel {
49 id: categoryFilter
58 id: categoryFilter
50− model: scope.categories
59+ model: scope ? scope.categories : null
51 dynamicSortFilter: true
60 dynamicSortFilter: true
52 filterRole: Categories.RoleCount
61 filterRole: Categories.RoleCount
53 filterRegExp: /^0$/
62 filterRegExp: /^0$/
Dash/Video/VideosFilterGrid.qml → Dash/Video/VideoFilterGrid.qmlrenamed+17−13
@@ -16,20 +16,16 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import "../../Components"
18import "../../Components"
19+import "../Generic"
19
20
20−FilterGrid {
21+GenericFilterGrid {
21 id: filtergrid
22 id: filtergrid
22
23
23− minimumHorizontalSpacing: units.gu(0.5)
24− maximumNumberOfColumns: 5
25 delegateWidth: units.gu(11)
24 delegateWidth: units.gu(11)
26− delegateHeight: iconHeight + units.gu(2.5)
25+ delegateHeight: units.gu(15)
27− verticalSpacing: units.gu(2)
28
26
29− readonly property int iconWidth: (width / columns) * 0.8
27+ iconWidth: units.gu(11)
30− readonly property int iconHeight: iconWidth * 16 / 11
28+ iconHeight: units.gu(11)
31−
32− signal clicked(int index, var data, real itemY)
33
29
34 delegate: Tile {
30 delegate: Tile {
35 id: tile
31 id: tile
@@ -40,11 +36,19 @@ FilterGrid {
40 imageWidth: filtergrid.iconWidth
36 imageWidth: filtergrid.iconWidth
41 imageHeight: filtergrid.iconHeight
37 imageHeight: filtergrid.iconHeight
42 source: model.icon
38 source: model.icon
43− fillMode: Image.PreserveAspectCrop
39+ maximumLineCount: 2
40+ horizontalAlignment: Text.AlignLeft
41+
42+ style: VideoTileStyle {}
43+
44 onClicked: {
44 onClicked: {
45− var fileUri = model.uri.replace(/^[^:]+:/, "")
45+ var data = { model: model }
46− var data = {fileUri: fileUri, nfoUri: model.comment}
47− filtergrid.clicked(index, data, tile.y);
46+ filtergrid.clicked(index, data, tile.y)
47+ }
48+
49+ onPressAndHold: {
50+ var data = { model: model }
51+ filtergrid.pressAndHold(index, data, tile.y)
48 }
52 }
49 }
53 }
50}
54}
Dash/Video/VideoPreview.qmldeleted−210
@@ -1,210 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import ".."
20−import "../../Components"
21−
22−DashPreview {
23− id: root
24−
25− property var item
26− property alias ready: nfo.ready
27− property bool playable: fileUri != ""
28− readonly property url fileUri: item ? item.fileUri : ""
29− property url url: item ? item.nfoUri.replace(/\.nfo$/, "-fanart.jpg") : ""
30−
31− VideoInfo {
32− id: nfo
33− source: item ? item.nfoUri : ""
34− }
35−
36− title: nfo.ready ? nfo.video.title : ""
37− previewWidthRatio: 0.6
38−
39− onPreviewImageClicked: {
40− if (playable) {
41− shell.activateApplication('/usr/share/applications/mediaplayer-app.desktop', root.fileUri);
42− }
43− }
44−
45− // TODO: replace this UbuntuShape with the Video component once that lands
46− // with the player.
47− header: UbuntuShape {
48− id: urlLoader
49− anchors.left: parent.left
50− anchors.right: parent.right
51− height: width * previewImage.sourceSize.height / previewImage.sourceSize.width
52− radius: "medium"
53− image: Image {
54− id: previewImage
55− asynchronous: true
56− source: root.url
57− fillMode: Image.PreserveAspectCrop
58− }
59−
60− Image {
61− objectName: "playButton"
62− anchors.centerIn: parent
63− visible: root.playable
64− readonly property bool bigButton: parent.width > units.gu(40)
65− width: bigButton ? units.gu(8) : units.gu(4.5)
66− height: width
67− source: "../graphics/play_button%1%2.png".arg(previewImageMouseArea.pressed ? "_active" : "").arg(bigButton ? "_big" : "")
68− }
69−
70− MouseArea {
71− id: previewImageMouseArea
72− anchors.fill: parent
73− onClicked: root.previewImageClicked()
74− }
75− }
76−
77− buttons: Row {
78− spacing: units.gu(2)
79−
80− property int buttonWidth: Math.min(units.gu(22), (width - spacing) / 2)
81− Button {
82− width: parent.buttonWidth
83− color: Theme.palette.selected.foreground
84− text: nfo.ready && nfo.video.buyPrice != "" ? "Buy for " + nfo.video.buyPrice : ""
85− visible: text != ""
86− iconSource: "graphics/icon_button_amazon.png"
87− iconPosition: "right"
88− }
89− Button {
90− width: parent.buttonWidth
91− color: Theme.palette.selected.foreground
92− text: nfo.ready && nfo.video.buyPrice != "" ? "Rent for " + nfo.video.rentPrice : ""
93− visible: text != ""
94− iconSource: "graphics/icon_button_u1.png"
95− iconPosition: "right"
96− }
97− }
98−
99− body: Column {
100− spacing: units.gu(2)
101− RatingStars {
102− maximumRating: 10 // FIXME: this should happen on the backend side
103− rating: nfo.ready ? nfo.video.rating: 0
104− }
105−
106− Label {
107− text: nfo.ready ? nfo.video.plot : ""
108− color: Theme.palette.selected.backgroundText
109− opacity: .6
110− fontSize: "medium"
111− width: parent.width
112− wrapMode: Text.WordWrap
113− style: Text.Raised
114− styleColor: "black"
115− }
116−
117− Grid {
118− columns: 2
119− spacing: units.gu(1)
120− width: parent.width
121− property int firstColWidth: units.gu(9)
122− property int secondColWidth: width - firstColWidth - spacing
123− Label {
124− visible: directedLabel.visible
125− fontSize: "small"
126− opacity: 0.9
127− color: "white"
128− horizontalAlignment: Text.AlignRight
129− width: parent.firstColWidth
130− text: i18n.tr("Directed by:")
131− style: Text.Raised
132− styleColor: "black"
133− }
134− Label {
135− id: directedLabel
136− visible: text != ""
137− fontSize: "small"
138− opacity: 0.6
139− color: "white"
140− width: parent.secondColWidth
141− text: nfo.ready ? nfo.video.director : ""
142− style: Text.Raised
143− styleColor: "black"
144− wrapMode: Text.WordWrap
145− }
146− Label {
147− visible: starringLabel.visible
148− fontSize: "small"
149− opacity: 0.9
150− horizontalAlignment: Text.AlignRight
151− color: "white"
152− width: parent.firstColWidth
153− text: i18n.tr("Starring:")
154− style: Text.Raised
155− styleColor: "black"
156− }
157− Label {
158− id: starringLabel
159− visible: text != ""
160− fontSize: "small"
161− opacity: 0.6
162− color: "white"
163− width: parent.secondColWidth
164− text: nfo.ready ? nfo.getActors().join(", ") : ""
165− wrapMode: Text.WordWrap
166− style: Text.Raised
167− styleColor: "black"
168− }
169− Label {
170− visible: authorLabel.visible
171− fontSize: "small"
172− opacity: 0.9
173− horizontalAlignment: Text.AlignRight
174− color: "white"
175− width: parent.firstColWidth
176− text: i18n.tr("Author:")
177− style: Text.Raised
178− styleColor: "black"
179− }
180− Label {
181− id: authorLabel
182− visible: text != ""
183− fontSize: "small"
184− opacity: 0.6
185− color: "white"
186− width: parent.secondColWidth
187− text: nfo.ready ? nfo.video.author : ""
188− wrapMode: Text.WordWrap
189− style: Text.Raised
190− styleColor: "black"
191− }
192− }
193−
194− Label {
195− fontSize: "small"
196− opacity: 0.6
197− color: "white"
198− text: {
199− var parts = []
200− if (nfo.ready) {
201− if (nfo.video.year) parts.push(nfo.video.year)
202− if (nfo.video.runtime) parts.push("%1 minutes".arg(nfo.video.runtime))
203− }
204− return parts.join(", ");
205− }
206− style: Text.Raised
207− styleColor: "black"
208− }
209− }
210−}
Dash/Video/VideoTileStyle.qmlnew file+87
@@ -0,0 +1,87 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+
20+Item {
21+ id: tile
22+
23+ anchors.fill: parent
24+
25+ Image {
26+ id: icon
27+ anchors {
28+ top: parent.top
29+ horizontalCenter: parent.horizontalCenter
30+ }
31+ width: styledItem.imageWidth
32+ height: styledItem.imageHeight
33+ source: "graphics/movie_icon_holder.png"
34+
35+ Image {
36+ id: image
37+ objectName: "image"
38+ anchors {
39+ fill: parent;
40+ topMargin: units.gu(2);
41+ bottomMargin: units.gu(2)
42+ }
43+ sourceSize { width: icon.width; height: icon.height }
44+ asynchronous: true
45+ cache: false
46+ source: styledItem.source
47+ fillMode: styledItem.fillMode
48+ horizontalAlignment: Image.AlignHCenter
49+ verticalAlignment: Image.AlignVCenter
50+ }
51+ }
52+
53+ UbuntuShape {
54+ id: borderPressed
55+ objectName: "borderPressed"
56+
57+ anchors.fill: icon
58+ radius: "medium"
59+ borderSource: "radius_pressed.sci"
60+ opacity: styledItem.pressed ? 1.0 : 0.0
61+ Behavior on opacity { NumberAnimation { duration: 200; easing.type: Easing.OutQuint } }
62+ }
63+
64+ Label {
65+ id: label
66+ objectName: "label"
67+ anchors {
68+ baseline: icon.bottom
69+ baselineOffset: units.gu(2)
70+ left: icon.left
71+ right: parent.right
72+ rightMargin: units.gu(1)
73+ leftMargin: units.dp(2)
74+ }
75+
76+ color: Theme.palette.selected.backgroundText
77+ opacity: 0.9
78+ style: Text.Raised
79+ styleColor: "black"
80+ fontSize: "small"
81+ elide: Text.ElideRight
82+ horizontalAlignment: styledItem.horizontalAlignment
83+ text: styledItem.text
84+ wrapMode: Text.Wrap
85+ maximumLineCount: styledItem.maximumLineCount
86+ }
87+}
Dash/Video/graphics/movie_icon_holder@27.pngnew file

Binary file not shown.

Greeter/Clock.qml+31−12
@@ -16,6 +16,7 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19+import Unity.Indicators 0.1 as Indicators
19
20
20Item {
21Item {
21 id: clock
22 id: clock
@@ -23,17 +24,35 @@ Item {
23 implicitWidth: childrenRect.width
24 implicitWidth: childrenRect.width
24 implicitHeight: childrenRect.height
25 implicitHeight: childrenRect.height
25
26
27+ // Allows to set the current Date. Will be overwritten if active
26− property date __date
28+ property date currentDate
27− property alias __timerInterval: timer.interval
28− readonly property bool __timerRunning: timer.running
29
29
30− Timer {
30+ // If active, time will be updated through the indicators service
31− id: timer
32− interval: 1000 * 60
33− running: clock.enabled && clock.visible && clock.opacity != 0
31+ property bool active: clock.enabled && clock.visible
34− repeat: true
32+
35− triggeredOnStart: true
33+ Component.onCompleted: {
36− onTriggered: __date = new Date
34+ if (active) {
35+ currentDate = new Date()
36+ }
37+ }
38+
39+ Indicators.CachedUnityMenuModel {
40+ id: timeModel
41+ objectName: "timeModel"
42+
43+ busName: "com.canonical.indicator.datetime"
44+ actionsObjectPath: "/com/canonical/indicator/datetime"
45+ menuObjectPath: clock.active ? "/com/canonical/indicator/datetime/phone" : ""
46+
47+ Indicators.RootActionState {
48+ menu: timeModel.model
49+ onUpdated: {
50+ if (timeLabel.text != rightLabel) {
51+ timeLabel.text = rightLabel;
52+ clock.currentDate = new Date();
53+ }
54+ }
55+ }
37 }
56 }
38
57
39 Column {
58 Column {
@@ -47,7 +66,7 @@ Item {
47 font.pixelSize: units.gu(7.5)
66 font.pixelSize: units.gu(7.5)
48 color: "white"
67 color: "white"
49 opacity: 0.5
68 opacity: 0.5
50− text: Qt.formatTime(__date)
69+ text: Qt.formatTime(clock.currentDate)
51 font.weight: Font.Light
70 font.weight: Font.Light
52 }
71 }
53
72
@@ -59,7 +78,7 @@ Item {
59 fontSize: "medium"
78 fontSize: "medium"
60 color: "white"
79 color: "white"
61 opacity: 0.5
80 opacity: 0.5
62− text: Qt.formatDate(__date, Qt.DefaultLocaleLongDate)
81+ text: Qt.formatDate(clock.currentDate, Qt.DefaultLocaleLongDate)
63 font.weight: Font.Light
82 font.weight: Font.Light
64 }
83 }
65 }
84 }
Greeter/Gradient.js+7−3
@@ -15,8 +15,12 @@
15 */
15 */
16
16
17function threeColorByIndex(index, total, colors) {
17function threeColorByIndex(index, total, colors) {
18− var red, green, blue
18+ var red, green, blue;
19+ var p = 0.0;
20+
21+ if(total > 0) {
19− var p = index / total
22+ p = index / total;
23+ }
20
24
21 if (p < 0.5) {
25 if (p < 0.5) {
22 red = (colors.main.r * p * 2.0) + colors.start.r * (0.5 - p) * 2.0;
26 red = (colors.main.r * p * 2.0) + colors.start.r * (0.5 - p) * 2.0;
@@ -28,5 +32,5 @@ function threeColorByIndex(index, total, colors) {
28 blue = colors.end.b * (p - 0.5) * 2.0 + colors.main.b * (1.0 - p) * 2.0;
32 blue = colors.end.b * (p - 0.5) * 2.0 + colors.main.b * (1.0 - p) * 2.0;
29 }
33 }
30
34
31− return Qt.rgba(red, green, blue, 1)
35+ return Qt.rgba(red, green, blue, 1);
32}
36}
Greeter/GreeterContent.qml+11−7
@@ -102,19 +102,23 @@ MouseArea {
102
102
103 Infographics {
103 Infographics {
104 id: infographics
104 id: infographics
105+ objectName: "infographics"
105 height: narrowMode ? parent.height : 0.75 * parent.height
106 height: narrowMode ? parent.height : 0.75 * parent.height
106 model: greeterContentLoader.infographicModel
107 model: greeterContentLoader.infographicModel
107
108
108− Component.onCompleted: infographics.updateUsername(greeterContentLoader.currentIndex)
109+ property string selectedUser
110+ property string infographicUser: AccountsService.statsWelcomeScreen ? selectedUser : ""
111+ onInfographicUserChanged: greeterContentLoader.infographicModel.username = infographicUser
109
112
110− Connections {
113+ Component.onCompleted: {
111− target: root
114+ selectedUser = greeterContentLoader.model.data(greeterContentLoader.currentIndex, LightDM.UserRoles.NameRole)
112− onSelected: infographics.updateUsername(uid)
115+ greeterContentLoader.infographicModel.username = infographicUser
116+ greeterContentLoader.infographicModel.readyForDataChange()
113 }
117 }
114
118
115− function updateUsername(uid) {
119+ Connections {
120+ target: root
116− greeterContentLoader.infographicModel.username = greeterContentLoader.model.data(uid, LightDM.UserRoles.NameRole)
121+ onSelected: infographics.selectedUser = greeterContentLoader.model.data(uid, LightDM.UserRoles.NameRole)
117− greeterContentLoader.infographicModel.readyForDataChangeSlot();
118 }
122 }
119
123
120 anchors {
124 anchors {
Greeter/Infographics.qml+11−4
@@ -29,21 +29,30 @@ Item {
29 Connections {
29 Connections {
30 target: model
30 target: model
31
31
32+ onDataAboutToAppear: startHideAnimation() // hide "no data" label
32 onDataAppeared: startShowAnimation()
33 onDataAppeared: startShowAnimation()
33
34
34 onDataAboutToChange: startHideAnimation()
35 onDataAboutToChange: startHideAnimation()
35−
36 onDataChanged: startShowAnimation()
36 onDataChanged: startShowAnimation()
37
37
38 onDataAboutToDisappear: startHideAnimation()
38 onDataAboutToDisappear: startHideAnimation()
39+ onDataDisappeared: startShowAnimation() // show "no data" label
39 }
40 }
40
41
41 function startShowAnimation() {
42 function startShowAnimation() {
43+ dotHideAnimTimer.stop()
44+ circleShrinkAnimTimer.stop()
45+ notification.hideAnim.stop()
46+
42 dotShowAnimTimer.startFromBeginning()
47 dotShowAnimTimer.startFromBeginning()
43 notification.showAnim.start()
48 notification.showAnim.start()
44 }
49 }
45
50
46 function startHideAnimation() {
51 function startHideAnimation() {
52+ dotShowAnimTimer.stop()
53+ circleGrowAnimTimer.stop()
54+ notification.showAnim.stop()
55+
47 dotHideAnimTimer.startFromBeginning()
56 dotHideAnimTimer.startFromBeginning()
48 notification.hideAnim.start()
57 notification.hideAnim.start()
49 }
58 }
@@ -396,7 +405,7 @@ Item {
396 }
405 }
397 }
406 }
398
407
399− Text {
408+ Label {
400 id: notification
409 id: notification
401 objectName: "label"
410 objectName: "label"
402
411
@@ -410,13 +419,11 @@ Item {
410 anchors.centerIn: parent
419 anchors.centerIn: parent
411
420
412 text: infographic.model.label
421 text: infographic.model.label
413− font.pixelSize: notification.height / 12
414
422
415 wrapMode: Text.WordWrap
423 wrapMode: Text.WordWrap
416 horizontalAlignment: Text.AlignHCenter
424 horizontalAlignment: Text.AlignHCenter
417 verticalAlignment: Text.AlignVCenter
425 verticalAlignment: Text.AlignVCenter
418 color: "white"
426 color: "white"
419− font.weight: Font.Light
420
427
421 PropertyAnimation {
428 PropertyAnimation {
422 id: increaseOpacity
429 id: increaseOpacity
Greeter/PinLockscreen.qml+5
@@ -32,6 +32,8 @@ Column {
32 signal entered(string passphrase)
32 signal entered(string passphrase)
33 signal cancel()
33 signal cancel()
34
34
35+ property bool entryEnabled: true
36+
35 function clear(playAnimation) {
37 function clear(playAnimation) {
36 pinentryField.text = "";
38 pinentryField.text = "";
37 if (playAnimation) {
39 if (playAnimation) {
@@ -140,6 +142,7 @@ Column {
140 width: root.padWidth / 3
142 width: root.padWidth / 3
141 height: root.padHeight / 4
143 height: root.padHeight / 4
142 text: index + 1
144 text: index + 1
145+ enabled: entryEnabled
143
146
144 onClicked: {
147 onClicked: {
145 pinentryField.text = pinentryField.text + text;
148 pinentryField.text = pinentryField.text + text;
@@ -161,6 +164,7 @@ Column {
161 height: root.padHeight / 4
164 height: root.padHeight / 4
162 text: "0"
165 text: "0"
163 onClicked: pinentryField.text = pinentryField.text + text
166 onClicked: pinentryField.text = pinentryField.text + text
167+ enabled: entryEnabled
164 }
168 }
165
169
166 PinPadButton {
170 PinPadButton {
@@ -169,6 +173,7 @@ Column {
169 height: root.padHeight / 4
173 height: root.padHeight / 4
170 iconName: "erase"
174 iconName: "erase"
171 onClicked: pinentryField.text = pinentryField.text.substring(0, pinentryField.text.length-1)
175 onClicked: pinentryField.text = pinentryField.text.substring(0, pinentryField.text.length-1)
176+ enabled: entryEnabled
172 }
177 }
173 }
178 }
174 }
179 }
GreeterShell.qml+17
@@ -188,6 +188,11 @@ BasicShell {
188 }
188 }
189 }
189 }
190
190
191+ OSKController {
192+ anchors.topMargin: panel.panelHeight
193+ anchors.fill: parent // as needs to know the geometry of the shell
194+ }
195+
191 Connections {
196 Connections {
192 id: powerConnection
197 id: powerConnection
193 target: Powerd
198 target: Powerd
@@ -202,6 +207,18 @@ BasicShell {
202 }
207 }
203 }
208 }
204
209
210+ Connections {
211+ target: applicationManager
212+ ignoreUnknownSignals: true
213+ // If any app is focused when greeter is open, it's due to a user action
214+ // like a snap decision (say, an incoming call).
215+ // TODO: these should be protected to only unlock for certain applications / certain usecases
216+ // potentially only in connection with a notification.
217+ // TODO: what about the app the shell will restore focus to by itself?
218+ onMainStageFocusedApplicationChanged: greeter.hide()
219+ onSideStageFocusedApplicationChanged: greeter.hide()
220+ }
221+
205 GreeterEdgeDemo {
222 GreeterEdgeDemo {
206 id: edgeDemo
223 id: edgeDemo
207 greeter: greeter
224 greeter: greeter
Notifications/Notification.qml+49−5
@@ -17,6 +17,8 @@
17import QtQuick 2.0
17import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19import Unity.Notifications 1.0
19import Unity.Notifications 1.0
20+import QMenuModel 0.1
21+import Utils 0.1
20
22
21UbuntuShape {
23UbuntuShape {
22 id: notification
24 id: notification
@@ -33,11 +35,30 @@ UbuntuShape {
33
35
34 objectName: "background"
36 objectName: "background"
35 implicitHeight: contentColumn.height + contentColumn.spacing * 2
37 implicitHeight: contentColumn.height + contentColumn.spacing * 2
36− color: Qt.rgba(0, 0, 0, 0.85)
38+ color: Qt.rgba(0.132, 0.117, 0.109, 0.97)
37 opacity: 0
39 opacity: 0
40+ radius: "medium"
38
41
39 clip: true
42 clip: true
40
43
44+ UnityMenuModelPaths {
45+ id: paths
46+
47+ source: hints["x-canonical-private-menu-model"]
48+
49+ busNameHint: "busName"
50+ actionsHint: "actions"
51+ menuObjectPathHint: "menuPath"
52+ }
53+
54+ UnityMenuModel {
55+ id: unityMenuModel
56+
57+ busName: paths.busName
58+ actions: paths.actions
59+ menuObjectPath: paths.menuObjectPath
60+ }
61+
41 Behavior on implicitHeight {
62 Behavior on implicitHeight {
42 id: heightBehavior
63 id: heightBehavior
43
64
@@ -108,6 +129,8 @@ UbuntuShape {
108 id: labelColumn
129 id: labelColumn
109 width: parent.width - x
130 width: parent.width - x
110
131
132+ anchors.verticalCenter: (icon.visible && !bodyLabel.visible) ? icon.verticalCenter : undefined
133+
111 Label {
134 Label {
112 id: summaryLabel
135 id: summaryLabel
113
136
@@ -141,6 +164,27 @@ UbuntuShape {
141 }
164 }
142 }
165 }
143
166
167+ Column {
168+ objectName: "dialogListView"
169+ spacing: units.gu(2)
170+
171+ visible: count > 0
172+
173+ anchors.left: parent.left; anchors.right: parent.right
174+
175+ Repeater {
176+ model: unityMenuModel
177+
178+ NotificationMenuItemFactory {
179+ anchors.left: parent.left; anchors.right: parent.right
180+
181+ menuModel: unityMenuModel
182+ menuData: model
183+ menuIndex: index
184+ }
185+ }
186+ }
187+
144 Item {
188 Item {
145 id: buttonRow
189 id: buttonRow
146
190
@@ -149,8 +193,8 @@ UbuntuShape {
149 left: parent.left
193 left: parent.left
150 right: parent.right
194 right: parent.right
151 }
195 }
152− visible: notification.type == Notification.SnapDecision
196+ visible: notification.type == Notification.SnapDecision && actionRepeater.count > 0
153− height: units.gu(4)
197+ height: units.gu(5)
154
198
155 property real buttonWidth: (width - contentColumn.spacing) / 2
199 property real buttonWidth: (width - contentColumn.spacing) / 2
156 property bool expanded
200 property bool expanded
@@ -195,7 +239,7 @@ UbuntuShape {
195 top: parent.top
239 top: parent.top
196 bottom: parent.bottom
240 bottom: parent.bottom
197 }
241 }
198− gradient: notification.hints == Notification.ButtonTint ? UbuntuColors.orangeGradient : UbuntuColors.greyGradient
242+ gradient: notification.hints["x-canonical-private-button-tint"] == "true" ? UbuntuColors.orangeGradient : UbuntuColors.greyGradient
199 visible: width > 0
243 visible: width > 0
200 onClicked: notification.notification.invokeAction(actionRepeater.itemAt(0).actionId)
244 onClicked: notification.notification.invokeAction(actionRepeater.itemAt(0).actionId)
201 }
245 }
@@ -241,7 +285,7 @@ UbuntuShape {
241 }
285 }
242
286
243 text: loader.actionLabel
287 text: loader.actionLabel
244− height: units.gu(4)
288+ height: units.gu(5)
245 gradient: UbuntuColors.greyGradient
289 gradient: UbuntuColors.greyGradient
246 onClicked: notification.notification.invokeAction(loader.actionId)
290 onClicked: notification.notification.invokeAction(loader.actionId)
247 }
291 }
Notifications/NotificationMenuItemFactory.qmlnew file+96
@@ -0,0 +1,96 @@
1+/*
2+ * Copyright 2013 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+ * Authors:
17+ * Nick Dedekind <nick.dedekind@canonical.com>
18+ */
19+
20+import QtQuick 2.0
21+import Ubuntu.Components 0.1
22+import "../Components"
23+import "../Greeter"
24+
25+Loader {
26+ id: menuFactory
27+
28+ property QtObject menuModel: null
29+ property QtObject menuData: null
30+ property int menuIndex
31+ property var notification
32+
33+ property var _map: {
34+ "com.canonical.snapdecision.textfield": textfield,
35+ "com.canonical.snapdecision.pinlock" : pinLock,
36+ }
37+
38+ sourceComponent: {
39+ if (menuData.type !== undefined) {
40+ var component = _map[menuData.type];
41+ if (component !== undefined) {
42+ return component;
43+ }
44+ }
45+ }
46+
47+ Component {
48+ id: textfield
49+
50+ Column {
51+ spacing: units.gu(2)
52+
53+ anchors.left: parent.left; anchors.right: parent.right
54+
55+ Component.onCompleted: {
56+ menuModel.loadExtendedAttributes(menuIndex, {"x-echo-mode-password": "bool"});
57+ textfield.echoMode = menuData.ext.xEchoModePassword ? TextInput.Password : TextInput.Normal
58+ }
59+
60+ Label {
61+ text: menuData.label
62+ }
63+
64+ TextField {
65+ id: textfield
66+
67+ anchors.left: parent.left; anchors.right: parent.right
68+ height: units.gu(5)
69+ onTextChanged: {
70+ menuModel.changeState(menuIndex, text);
71+ }
72+ }
73+ }
74+ }
75+
76+ Component {
77+ id: pinLock
78+ PinLockscreen {
79+ anchors.left: parent.left; anchors.right: parent.right
80+
81+ Component.onCompleted: {
82+ menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-pin-length': 'int'});
83+ pinLength = menuData.ext.xCanonicalPinLength;
84+ }
85+
86+ onEntered: {
87+ menuModel.changeState(menuIndex, passphrase);
88+ entryEnabled = false;
89+ }
90+
91+ onCancel: {
92+ menuModel.activate(menuIndex, false);
93+ }
94+ }
95+ }
96+}
Panel/IndicatorRow.qml+51−12
@@ -27,6 +27,8 @@ Item {
27 property alias row: row
27 property alias row: row
28 property QtObject indicatorsModel: null
28 property QtObject indicatorsModel: null
29 property var visibleIndicators: defined
29 property var visibleIndicators: defined
30+ property int overFlowWidth: width
31+ property bool showAll: false
30
32
31 width: units.gu(40)
33 width: units.gu(40)
32 height: units.gu(3)
34 height: units.gu(3)
@@ -42,6 +44,15 @@ Item {
42 }
44 }
43 }
45 }
44
46
47+ Timer {
48+ id: allVisible
49+ interval: 1000
50+
51+ onTriggered: {
52+ showAll = false;
53+ }
54+ }
55+
45 Row {
56 Row {
46 id: row
57 id: row
47
58
@@ -54,16 +65,31 @@ Item {
54 objectName: "rowRepeater"
65 objectName: "rowRepeater"
55 model: indicatorsModel ? indicatorsModel : undefined
66 model: indicatorsModel ? indicatorsModel : undefined
56
67
68+ property int lastCount: 0
69+ onCountChanged: {
70+ if (lastCount < count) {
71+ showAll = true;
72+ allVisible.start();
73+ }
74+ lastCount = count;
75+ }
76+
57 Item {
77 Item {
58 id: itemWrapper
78 id: itemWrapper
59 height: indicatorRow.height
79 height: indicatorRow.height
60 width: indicatorItem.width
80 width: indicatorItem.width
61 visible: indicatorItem.indicatorVisible
81 visible: indicatorItem.indicatorVisible
82+ opacity: 1.0
83+ y: 0
84+ state: "standard"
62
85
63 property int ownIndex: index
86 property int ownIndex: index
64 property alias highlighted: indicatorItem.highlighted
87 property alias highlighted: indicatorItem.highlighted
65 property alias dimmed: indicatorItem.dimmed
88 property alias dimmed: indicatorItem.dimmed
66
89
90+ property bool hidden: !showAll && !indicatorItem.highlighted && (indicatorRow.state == "locked" || indicatorRow.state == "commit")
91+ property bool overflow: row.width - itemWrapper.x > overFlowWidth
92+
67 IndicatorItem {
93 IndicatorItem {
68 id: indicatorItem
94 id: indicatorItem
69 height: parent.height
95 height: parent.height
@@ -87,22 +113,35 @@ Item {
87 }
113 }
88 indicatorRow.visibleIndicators[model.identifier] = indicatorVisible;
114 indicatorRow.visibleIndicators[model.identifier] = indicatorVisible;
89 indicatorRow.visibleIndicatorsChanged();
115 indicatorRow.visibleIndicatorsChanged();
116+
117+ if (indicatorVisible) {
118+ showAll = true;
119+ allVisible.start();
120+ }
90 }
121 }
91 }
122 }
92
123
93− opacity: {
124+ states: [
94− if (!indicatorItem.highlighted && (indicatorRow.state == "locked" || indicatorRow.state == "commit")) {
125+ State {
95− return 0.0;
126+ name: "standard"
96− } else {
127+ when: !hidden && !overflow
97− return 1.0;
128+ },
129+ State {
130+ name: "overflow"
131+ when: hidden || overflow
132+ PropertyChanges { target: itemWrapper; opacity: 0.0 }
98 }
133 }
99− }
134+ ]
100− Behavior on opacity {
135+
136+ transitions: [
137+ Transition {
101− StandardAnimation {
138+ StandardAnimation {
102− // flow away from current index
139+ target: itemWrapper
103− duration: (rowRepeater.count - Math.abs(indicatorRow.currentItemIndex - index)) * (500/rowRepeater.count)
140+ property: "opacity"
141+ duration: 300
104− }
142+ }
105− }
143+ }
144+ ]
106 }
145 }
107 }
146 }
108 }
147 }
Panel/Indicators.qml+6−1
@@ -17,6 +17,7 @@
17import QtQuick 2.0
17import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19import Ubuntu.Gestures 0.1
19import Ubuntu.Gestures 0.1
20+import Unity.Indicators 0.1 as Indicators
20
21
21import "../Components"
22import "../Components"
22import "../Components/ListItems"
23import "../Components/ListItems"
@@ -28,6 +29,8 @@ Showable {
28 property real openedHeight: units.gu(71)
29 property real openedHeight: units.gu(71)
29 property int panelHeight: units.gu(3)
30 property int panelHeight: units.gu(3)
30 property bool pinnedMode: true //should be set true if indicators menu can cover whole screen
31 property bool pinnedMode: true //should be set true if indicators menu can cover whole screen
32+ property alias overFlowWidth: indicatorRow.overFlowWidth
33+ property alias showAll: indicatorRow.showAll
31
34
32 property int hintValue
35 property int hintValue
33 readonly property int lockThreshold: openedHeight / 2
36 readonly property int lockThreshold: openedHeight / 2
@@ -249,8 +252,10 @@ Showable {
249 anchors.fill: indicatorRow
252 anchors.fill: indicatorRow
250 }
253 }
251
254
252− IndicatorsDataModel {
255+ Indicators.IndicatorsModel {
253 id: indicatorsModel
256 id: indicatorsModel
257+
258+ Component.onCompleted: load()
254 }
259 }
255
260
256 IndicatorRow {
261 IndicatorRow {
Panel/Indicators/DatetimeIndicatorPage.qmldeleted−97
@@ -1,97 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− * Ubo Riboni <ugo.riboni@canonical.com>
19− */
20−
21−import QtQuick 2.0
22−import Ubuntu.Components 0.1
23−
24−Flickable {
25− id: page
26−
27− contentHeight: image.height
28−
29− Image {
30− id: image
31− anchors {
32− left: parent.left
33− right: parent.right
34− }
35− source: "../graphics/time_and_date@18.png"
36− fillMode: Image.PreserveAspectFit
37− }
38−
39− Item {
40− anchors {
41− top: parent.top
42− topMargin: units.gu(5)
43− left: parent.left
44− right: parent.right
45− }
46−
47− height: units.gu(30)
48−
49− Label {
50− id: timeLabel
51− anchors {
52− horizontalCenter: parent.horizontalCenter
53− verticalCenter: parent.verticalCenter
54− }
55−
56− text: ""
57− color: Theme.palette.selected.backgroundText
58− font.weight: Font.Light
59− font.pixelSize: units.gu(6)
60− }
61−
62− Label {
63− id: dateLabel
64−
65− anchors {
66− left: parent.left
67− leftMargin: units.gu(2)
68− bottom: parent.bottom
69− bottomMargin: units.gu(1.5)
70− }
71− text: ""
72− color: Theme.palette.selected.backgroundText
73− fontSize: "small"
74− }
75− }
76−
77− Timer {
78− interval: 1000 * 10 // 10 seconds
79− running: true
80− repeat: true
81− triggeredOnStart: true
82− onTriggered: updateTime();
83− }
84−
85− function updateTime() {
86− var dt = new Date();
87− var time = Qt.formatTime(dt);
88− var space = time.indexOf(" ");
89− timeLabel.text = time.substr(0, space > 0 ? space : 5);
90− dateLabel.text = Qt.formatDateTime(dt, "dddd,\ndd MMMM");
91− }
92−
93− // Make it compatible with the PluginItem interface
94− function start() {}
95− function stop() {}
96− function reset() {}
97−}
Panel/Indicators/DatetimeIndicatorWidget.qmldeleted−67
@@ -1,67 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Nick Dedekind <nick.dedekind@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−import Unity.IndicatorsLegacy 0.1 as Indicators
23−
24−Indicators.IndicatorWidget {
25− id: indicatorWidget
26−
27− width: timeLabel.width + units.gu(1)
28− rootMenuType: "com.canonical.indicator.root.time"
29−
30− property alias label: timeLabel.text
31−
32− Label {
33− id: timeLabel
34− objectName: "timeLabel"
35− color: Theme.palette.selected.backgroundText
36− opacity: 0.8
37− font.family: "Ubuntu"
38− fontSize: "medium"
39− anchors.centerIn: parent
40− text: Qt.formatTime(timer.dateNow)
41− }
42−
43− Timer {
44− id: timer
45− interval: 1000 * 10
46− running: indicatorWidget.visible
47− repeat: true
48− triggeredOnStart: true
49− property date dateNow
50−
51− onTriggered: dateNow = new Date
52− }
53−
54− onActionStateChanged: {
55− if (action == undefined || !action.valid) {
56− enabled = false;
57− return;
58− }
59−
60− if (action.state == undefined) {
61− enabled = false;
62− return;
63− }
64−
65− enabled = action.state[3];
66− }
67−}
Panel/Indicators/DefaultIndicatorPage.qml+1−1
@@ -18,7 +18,7 @@
18 */
18 */
19
19
20import QtQuick 2.0
20import QtQuick 2.0
21−import Unity.IndicatorsLegacy 0.1 as Indicators
21+import Unity.Indicators 0.1 as Indicators
22
22
23Indicators.IndicatorPage {
23Indicators.IndicatorPage {
24 anchors.fill: parent
24 anchors.fill: parent
Panel/Indicators/DefaultIndicatorPage2.qmldeleted−25
@@ -1,25 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Nick Dedekind <nick.dedekind@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Unity.Indicators 0.1 as Indicators
22−
23−Indicators.IndicatorPage {
24− anchors.fill: parent
25−}
Panel/Indicators/DefaultIndicatorWidget.qml+47−21
@@ -19,16 +19,16 @@
19
19
20import QtQuick 2.0
20import QtQuick 2.0
21import Ubuntu.Components 0.1
21import Ubuntu.Components 0.1
22−import Unity.IndicatorsLegacy 0.1 as Indicators
22+import Unity.Indicators 0.1 as Indicators
23
23
24Indicators.IndicatorWidget {
24Indicators.IndicatorWidget {
25 id: indicatorWidget
25 id: indicatorWidget
26
26
27− enabled:true
28 width: itemRow.width + units.gu(0.5)
27 width: itemRow.width + units.gu(0.5)
29
28
30− property alias label: itemLabel.text
29+ property alias leftLabel: itemLeftLabel.text
31− property alias iconSource: itemImage.source
30+ property alias rightLabel: itemRightLabel.text
31+ property var icons: undefined
32
32
33 Row {
33 Row {
34 id: itemRow
34 id: itemRow
@@ -40,19 +40,43 @@ Indicators.IndicatorWidget {
40 }
40 }
41 spacing: units.gu(0.5)
41 spacing: units.gu(0.5)
42
42
43− // FIXME : Should us Ubuntu.Icon . results in low res images
43+ Label {
44− Image {
44+ id: itemLeftLabel
45− id: itemImage
46− objectName: "itemImage"
45+ objectName: "leftLabel"
47− visible: source != ""
46+ color: Theme.palette.selected.backgroundText
48− height: indicatorWidget.iconSize
47+ opacity: 0.8
49− width: indicatorWidget.iconSize
48+ font.family: "Ubuntu"
49+ fontSize: "medium"
50 anchors.verticalCenter: parent.verticalCenter
50 anchors.verticalCenter: parent.verticalCenter
51+ visible: text != ""
52+ }
53+
54+ Row {
55+ width: childrenRect.width
56+ anchors {
57+ top: parent.top
58+ bottom: parent.bottom
59+ }
60+ spacing: units.gu(0.5)
61+
62+ Repeater {
63+ model: indicatorWidget.icons
64+
65+ Image {
66+ id: itemImage
67+ objectName: "itemImage"
68+ visible: source != ""
69+ source: modelData
70+ height: indicatorWidget.iconSize
71+ width: indicatorWidget.iconSize
72+ anchors.verticalCenter: parent.verticalCenter
73+ }
74+ }
51 }
75 }
52
76
53 Label {
77 Label {
54− id: itemLabel
78+ id: itemRightLabel
55− objectName: "itemLabel"
79+ objectName: "rightLabel"
56 color: Theme.palette.selected.backgroundText
80 color: Theme.palette.selected.backgroundText
57 opacity: 0.8
81 opacity: 0.8
58 font.family: "Ubuntu"
82 font.family: "Ubuntu"
@@ -62,16 +86,18 @@ Indicators.IndicatorWidget {
62 }
86 }
63 }
87 }
64
88
65− onActionStateChanged: {
89+ onRootActionStateChanged: {
66− if (action == undefined || !action.valid) {
90+ if (rootActionState == undefined) {
67− return;
91+ leftLabel = "";
68− }
92+ rightLabel = "";
69−
93+ icons = undefined;
70− if (action.state == undefined) {
94+ enabled = false;
71 return;
95 return;
72 }
96 }
73
97
74− label = action.state[Indicators.ActionState.Label];
98+ leftLabel = rootActionState.leftLabel ? rootActionState.leftLabel : "";
75− iconSource = "image://theme/" + action.state[Indicators.ActionState.IconSource];
99+ rightLabel = rootActionState.rightLabel ? rootActionState.rightLabel : "";
100+ icons = rootActionState.icons;
101+ enabled = rootActionState.visible;
76 }
102 }
77}
103}
Panel/Indicators/DefaultIndicatorWidget2.qmldeleted−103
@@ -1,103 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Nick Dedekind <nick.dedekind@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−import Unity.Indicators 0.1 as Indicators
23−
24−Indicators.IndicatorWidget {
25− id: indicatorWidget
26−
27− width: itemRow.width + units.gu(0.5)
28−
29− property alias leftLabel: itemLeftLabel.text
30− property alias rightLabel: itemRightLabel.text
31− property var icons: undefined
32−
33− Row {
34− id: itemRow
35− objectName: "itemRow"
36− anchors {
37− top: parent.top
38− bottom: parent.bottom
39− horizontalCenter: parent.horizontalCenter
40− }
41− spacing: units.gu(0.5)
42−
43− Label {
44− id: itemLeftLabel
45− objectName: "leftLabel"
46− color: Theme.palette.selected.backgroundText
47− opacity: 0.8
48− font.family: "Ubuntu"
49− fontSize: "medium"
50− anchors.verticalCenter: parent.verticalCenter
51− visible: text != ""
52− }
53−
54− Row {
55− width: childrenRect.width
56− anchors {
57− top: parent.top
58− bottom: parent.bottom
59− }
60− spacing: units.gu(0.5)
61−
62− Repeater {
63− model: indicatorWidget.icons
64−
65− Image {
66− id: itemImage
67− objectName: "itemImage"
68− visible: source != ""
69− source: modelData
70− height: indicatorWidget.iconSize
71− width: indicatorWidget.iconSize
72− anchors.verticalCenter: parent.verticalCenter
73− }
74− }
75− }
76−
77− Label {
78− id: itemRightLabel
79− objectName: "rightLabel"
80− color: Theme.palette.selected.backgroundText
81− opacity: 0.8
82− font.family: "Ubuntu"
83− fontSize: "medium"
84− anchors.verticalCenter: parent.verticalCenter
85− visible: text != ""
86− }
87− }
88−
89− onActionStateChanged: {
90− if (actionState == undefined) {
91− leftLabel = "";
92− rightLabel = "";
93− icons = undefined;
94− enabled = false;
95− return;
96− }
97−
98− leftLabel = actionState.leftLabel ? actionState.leftLabel : "";
99− rightLabel = actionState.rightLabel ? actionState.rightLabel : "";
100− icons = actionState.icons;
101− enabled = actionState.visible;
102− }
103−}
Panel/Indicators/MessagingIndicatorPage.qmldeleted−35
@@ -1,35 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Nick Dedekind <nick.dedekind@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−import Unity.IndicatorsLegacy 0.1 as Indicators
23−
24−Indicators.IndicatorPage {
25− anchors.fill: parent
26−
27− highlightFollowsCurrentItem: false
28− emptyText: "You have no more outstanding messages."
29−
30− function stop() {
31− // never stops the service
32− // this will keep all objects in memory, consume more memory
33− // but will optimize the menu contruction on the screen
34− }
35−}
Panel/Indicators/NetworkIndicatorPage.qmldeleted−83
@@ -1,83 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Unity.IndicatorsLegacy 0.1 as Indicators
22−import Unity.IndicatorsLegacy.Network 0.1 as ICNetwork
23−import Ubuntu.Components 0.1
24−
25−PageStack {
26− id: networkPage
27− // Stops the search for a parent tree node.
28− // We don't want it going up to the indicator tabs.
29− // FIXME: need a better way of doing this.
30− // https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1211704
31− __propagated: null
32−
33− property alias title: _mainPage.title
34− property alias emptyText: pluginItem.emptyText
35− property alias busType: pluginItem.busType
36− property alias busName: pluginItem.busName
37− property alias actionsObjectPath : pluginItem.actionsObjectPath
38− property alias menuObjectPaths : pluginItem.menuObjectPaths
39−
40− anchors.fill: parent
41−
42− Page {
43− id: _mainPage
44−
45− Indicators.IndicatorPage {
46− id: pluginItem
47− anchors.fill: parent
48− }
49− }
50−
51− Component {
52− id: passwordPageComponent
53−
54− ICNetwork.PasswordPage {
55− agent: networkAgent
56− }
57− }
58−
59− ICNetwork.NetworkAgent {
60− id: networkAgent
61−
62− onSecretRequested: {
63− networkPage.push(passwordPageComponent, {"token": token});
64− }
65− }
66−
67− function start()
68− {
69− push(_mainPage);
70− pluginItem.start();
71− }
72−
73− function stop()
74− {
75− clear();
76− pluginItem.stop();
77− }
78−
79− function reset()
80− {
81− pluginItem.reset();
82− }
83−}
Panel/Indicators/NetworkIndicatorPage2.qmldeleted−82
@@ -1,82 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Unity.Indicators 0.1 as Indicators
22−import Unity.Indicators.Network 0.1 as ICNetwork
23−import Ubuntu.Components 0.1
24−
25−PageStack {
26− id: networkPage
27− // Stops the search for a parent tree node.
28− // We don't want it going up to the indicator tabs.
29− // FIXME: need a better way of doing this.
30− // https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1211704
31− __propagated: null
32−
33− property alias title: _mainPage.title
34− property alias emptyText: pluginItem.emptyText
35− property alias busName: pluginItem.busName
36− property alias actionsObjectPath : pluginItem.actionsObjectPath
37− property alias menuObjectPaths : pluginItem.menuObjectPaths
38−
39− anchors.fill: parent
40−
41− Page {
42− id: _mainPage
43−
44− Indicators.IndicatorPage {
45− id: pluginItem
46− anchors.fill: parent
47− }
48− }
49−
50− Component {
51− id: passwordPageComponent
52−
53− ICNetwork.PasswordPage {
54− agent: networkAgent
55− }
56− }
57−
58− ICNetwork.NetworkAgent {
59− id: networkAgent
60−
61− onSecretRequested: {
62− networkPage.push(passwordPageComponent, {"token": token});
63− }
64− }
65−
66− function start()
67− {
68− push(_mainPage);
69− pluginItem.start();
70− }
71−
72− function stop()
73− {
74− clear();
75− pluginItem.stop();
76− }
77−
78− function reset()
79− {
80− pluginItem.reset();
81− }
82−}
Panel/Indicators/NetworkIndicatorWidget.qmldeleted−112
@@ -1,112 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Nick Dedekind <nick.dedekind@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−import Unity.IndicatorsLegacy 0.1 as Indicators
23−
24−Indicators.IndicatorWidget {
25− id: indicatorWidget
26−
27− width: networkIcon.width + units.gu(0.5)
28−
29− property int signalStrength: 0
30− property int connectionState: Indicators.NetworkConnection.Initial
31− rootMenuType: "com.canonical.indicator.root.network"
32−
33− // FIXME : Should us Ubuntu.Icon . results in low res images
34− Image {
35− id: networkIcon
36− objectName: "itemImage"
37− source: get_icon_for_signal(connectionState, signalStrength)
38− visible: source != ""
39− height: indicatorWidget.iconSize
40− width: indicatorWidget.iconSize
41− anchors.centerIn: parent
42− }
43−
44− onActionStateChanged: {
45− if (action == undefined || !action.valid) {
46− enabled = false;
47− return;
48− }
49−
50− if (action.state == undefined) {
51− enabled = false;
52− connectionState = 0;
53− return;
54− }
55−
56− enabled = true;
57− connectionState = action.state[Indicators.NetworkActionState.Connection];
58− if (connectionState == Indicators.NetworkConnection.Activated) {
59− signalStrength = action.state[Indicators.NetworkActionState.SignalStrength];
60− }
61− }
62−
63− NumberAnimation {
64− id: activation_animation
65− target: indicatorWidget
66− property: "signalStrength"
67− from: 0
68− to: 100
69− duration: 2500 // 5 states in 2.5 seconds
70− loops: Animation.Infinite
71− }
72−
73− states: [
74− State {
75− name: "unknown"
76− when: connectionState < Indicators.NetworkConnection.Activating || connectionState > Indicators.NetworkConnection.Deactivating
77− PropertyChanges { target: activation_animation; running: false }
78− },
79− State {
80− name: "activating"
81− when: connectionState == Indicators.NetworkConnection.Activating
82− PropertyChanges { target: activation_animation; running: true }
83− },
84− State {
85− name: "activated"
86− when: connectionState == Indicators.NetworkConnection.Activated
87− PropertyChanges { target: activation_animation; running: false }
88− },
89− State {
90− name: "deactivating"
91− when: connectionState == Indicators.NetworkConnection.Deactivating
92− PropertyChanges { target: activation_animation; running: true }
93− }
94− ]
95−
96−
97− function get_icon_for_signal(con_state, value) {
98− if (con_state >= Indicators.NetworkConnection.Activating && con_state <= Indicators.NetworkConnection.Deactivating) {
99− if (value == 0) {
100− return "image://theme/nm-signal-00";
101− } else if (value <= 25) {
102− return "image://theme/nm-signal-25";
103− } else if (value <= 50) {
104− return "image://theme/nm-signal-50";
105− } else if (value <= 75) {
106− return "image://theme/nm-signal-75";
107− }
108− return "image://theme/nm-signal-100";
109− }
110− return "image://theme/wifi-none";
111− }
112−}
Panel/Indicators/client/IndicatorsList.qml+16−14
@@ -20,7 +20,7 @@
20import QtQuick 2.0
20import QtQuick 2.0
21import Ubuntu.Components 0.1
21import Ubuntu.Components 0.1
22import Ubuntu.Components.ListItems 0.1 as ListItem
22import Ubuntu.Components.ListItems 0.1 as ListItem
23−import Unity.IndicatorsLegacy 0.1 as Indicators
23+import Unity.Indicators 0.1 as Indicators
24import "../.."
24import "../.."
25
25
26Page {
26Page {
@@ -28,8 +28,10 @@ Page {
28 anchors.fill: parent
28 anchors.fill: parent
29 title: "Plugin list"
29 title: "Plugin list"
30
30
31− IndicatorsDataModel {
31+ Indicators.IndicatorsModel {
32 id: indicatorsModel
32 id: indicatorsModel
33+
34+ Component.onCompleted: load()
33 }
35 }
34
36
35 ListView {
37 ListView {
@@ -38,24 +40,24 @@ Page {
38 anchors.fill: parent
40 anchors.fill: parent
39 model: indicatorsModel
41 model: indicatorsModel
40
42
41− delegate: Indicators.MenuItem {
43+ delegate: Indicators.FramedMenuItem {
42 anchors.left: parent.left
44 anchors.left: parent.left
43 anchors.right: parent.right
45 anchors.right: parent.right
44− progression: isValid
45 objectName: identifier
46 objectName: identifier
46
47
47− Label {
48+ text: identifier
48− anchors.left: parent.left
49− anchors.leftMargin: units.gu(0.5)
50− anchors.verticalCenter: parent.verticalCenter
51− text: title
52− }
53
49
54 onClicked: {
50 onClicked: {
55− if (progression) {
56− var new_page = Qt.createComponent("IndicatorsPage.qml");
51+ var new_page = Qt.createComponent("IndicatorsPage.qml");
57− page.pageStack.push(new_page.createObject(pages), {"indicatorProperties" : model.indicatorProperties, "pageSource" : model.pageSource});
52+ page.pageStack.push(new_page.createObject(pages), {"indicatorProperties" : model.indicatorProperties, "pageSource" : model.pageSource});
58− }
53+ }
54+
55+ Rectangle {
56+ id: background
57+
58+ anchors.fill: parent
59+ color: "#221e1c"
60+ z: -1
59 }
61 }
60 }
62 }
61 }
63 }
Panel/Indicators/client/IndicatorsTree.qml+4
@@ -44,6 +44,10 @@ Page {
44 menuObjectPath: page.deviceMenuObjectPath
44 menuObjectPath: page.deviceMenuObjectPath
45 }
45 }
46
46
47+ Indicators.RootActionState {
48+ menu: unityModel
49+ }
50+
47 Indicators.ModelPrinter {
51 Indicators.ModelPrinter {
48 id: printer
52 id: printer
49 model: unityModel
53 model: unityModel
Panel/IndicatorsDataModel.qmldeleted−79
@@ -1,79 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Unity.Indicators 0.1 as Indicators
22−import Utils 0.1
23−
24−Indicators.IndicatorsModel {
25− id: ic_model
26−
27− Component.onCompleted: load()
28−
29− indicatorData : {
30− 'indicator-location' : {
31− 'title': 'Location',
32− 'description' : '',
33− 'widgetSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/DefaultIndicatorWidget2.qml',
34− 'pageSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/DefaultIndicatorPage2.qml'
35− },
36− 'indicator-bluetooth' : {
37− 'title': 'Bluetooth',
38− 'description' : '',
39− 'widgetSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/DefaultIndicatorWidget2.qml',
40− 'pageSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/DefaultIndicatorPage2.qml'
41− },
42− 'indicator-messages' : {
43− 'title': 'Messaging',
44− 'description' : '',
45− 'widgetSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/MessagingIndicatorWidget.qml',
46− 'pageSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/MessagingIndicatorPage.qml'
47− },
48− 'indicator-sound' : {
49− 'title': 'Sound',
50− 'description' : '',
51− 'widgetSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/DefaultIndicatorWidget2.qml',
52− 'pageSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/DefaultIndicatorPage2.qml'
53− },
54− 'indicator-network' : {
55− 'title': 'Networks',
56− 'description' : '',
57− 'widgetSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/DefaultIndicatorWidget2.qml',
58− 'pageSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/NetworkIndicatorPage2.qml'
59− },
60− 'indicator-power' : {
61− 'title': 'Battery',
62− 'description' : '',
63− 'widgetSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/DefaultIndicatorWidget2.qml',
64− 'pageSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/DefaultIndicatorPage2.qml'
65− },
66− 'indicator-session' : {
67− 'title': 'Session',
68− 'description' : '',
69− 'widgetSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/DefaultIndicatorWidget2.qml',
70− 'pageSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/DefaultIndicatorPage2.qml'
71− },
72− 'indicator-datetime' : {
73− 'title': 'Date and Time',
74− 'description' : '',
75− 'widgetSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/DefaultIndicatorWidget2.qml',
76− 'pageSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/DefaultIndicatorPage2.qml'
77− }
78− }
79−}
Panel/MenuContent.qml+9−2
@@ -100,16 +100,17 @@ MainView {
100 Tab {
100 Tab {
101 id: tab
101 id: tab
102 objectName: model.identifier
102 objectName: model.identifier
103− title: model.title
104
103
105 page: Page {
104 page: Page {
106 Loader {
105 Loader {
106+ id: loader
107 clip: true
107 clip: true
108 anchors.fill: parent
108 anchors.fill: parent
109 source: pageSource
109 source: pageSource
110 asynchronous: true
110 asynchronous: true
111
111
112− property bool contentActive: content.__contentActive && menuActivator.content[index].active
112+ readonly property bool indexActive: index >= 0 && index < menuActivator.count && menuActivator.content[index].active
113+ readonly property bool contentActive: content.__contentActive && indexActive
113
114
114 onContentActiveChanged: {
115 onContentActiveChanged: {
115 if (contentActive && item) {
116 if (contentActive && item) {
@@ -136,6 +137,12 @@ MainView {
136 item.start()
137 item.start()
137 }
138 }
138 }
139 }
140+
141+ Binding {
142+ target: tab
143+ property: "title"
144+ value: loader.item && loader.item.hasOwnProperty("title") && loader.item.title !== "" ? loader.item.title : model.identifier
145+ }
139 }
146 }
140 }
147 }
141 }
148 }
Panel/Panel.qml+3−2
@@ -73,6 +73,7 @@ Item {
73
73
74 Indicators {
74 Indicators {
75 id: indicatorsMenu
75 id: indicatorsMenu
76+ objectName: "indicators"
76
77
77 anchors.right: parent.right
78 anchors.right: parent.right
78 y: panelBackground.y
79 y: panelBackground.y
@@ -82,6 +83,7 @@ Item {
82 panelHeight: __panelMinusSeparatorLineHeight
83 panelHeight: __panelMinusSeparatorLineHeight
83 openedHeight: parent.height + (pinnedMode ? 0 : root.panelHeight)
84 openedHeight: parent.height + (pinnedMode ? 0 : root.panelHeight)
84 pinnedMode: !fullscreenMode
85 pinnedMode: !fullscreenMode
86+ overFlowWidth: search.state=="hidden" ? parent.width : parent.width - search.width
85
87
86 property real unitProgress: (height - panelHeight) / (openedHeight - panelHeight)
88 property real unitProgress: (height - panelHeight) / (openedHeight - panelHeight)
87 }
89 }
@@ -120,14 +122,13 @@ Item {
120 return "hidden";
122 return "hidden";
121 }
123 }
122 }
124 }
123− if (root.searchVisible) {
125+ if (root.searchVisible && !indicatorsMenu.showAll) {
124 return "visible";
126 return "visible";
125 }
127 }
126
128
127 return "hidden";
129 return "hidden";
128 }
130 }
129
131
130− width: units.gu(13)
131 height: __panelMinusSeparatorLineHeight
132 height: __panelMinusSeparatorLineHeight
132 anchors {
133 anchors {
133 top: panelBackground.top
134 top: panelBackground.top
Panel/SearchIndicator.qml+9−8
@@ -21,7 +21,7 @@ import "../Components"
21Item {
21Item {
22 id: search
22 id: search
23
23
24− width: units.gu(9)
24+ width: container.width + units.gu(2)
25 height: units.gu(3)
25 height: units.gu(3)
26
26
27 property string headerText: i18n.tr("Search")
27 property string headerText: i18n.tr("Search")
@@ -34,21 +34,24 @@ Item {
34 onClicked: search.clicked()
34 onClicked: search.clicked()
35 }
35 }
36
36
37− Item {
37+ Row {
38 id: container
38 id: container
39 objectName: "container"
39 objectName: "container"
40
40
41− width: parent.width
42 height: parent.height
41 height: parent.height
42+ width: childrenRect.width
43+ anchors {
44+ left: parent.left
45+ leftMargin: units.gu(1)
46+ }
47+ spacing: units.gu(1)
43
48
44− Behavior on opacity { StandardAnimation {} }
49+ Behavior on opacity { StandardAnimation { duration: 300 } }
45
50
46 Image {
51 Image {
47 id: icon
52 id: icon
48 source: "graphics/search.png"
53 source: "graphics/search.png"
49 anchors.verticalCenter: parent.verticalCenter
54 anchors.verticalCenter: parent.verticalCenter
50− anchors.left: parent.left
51− anchors.leftMargin: units.gu(1)
52 }
55 }
53
56
54 Label {
57 Label {
@@ -56,8 +59,6 @@ Item {
56 color: Qt.rgba(0.8, 0.8, 0.8, 1.0)
59 color: Qt.rgba(0.8, 0.8, 0.8, 1.0)
57 fontSize: "small"
60 fontSize: "small"
58 font.capitalization: Font.AllUppercase
61 font.capitalization: Font.AllUppercase
59− anchors.left: icon.right
60− anchors.leftMargin: units.gu(1)
61 anchors.verticalCenter: parent.verticalCenter
62 anchors.verticalCenter: parent.verticalCenter
62 }
63 }
63 }
64 }
Shell.qml+56−37
@@ -88,14 +88,6 @@ BasicShell {
88 }
88 }
89 }
89 }
90
90
91− Connections {
92− target: applicationManager
93− ignoreUnknownSignals: true
94− onFocusRequested: {
95− shell.activateApplication(desktopFile);
96− }
97− }
98−
99 function activateApplication(desktopFile, argument) {
91 function activateApplication(desktopFile, argument) {
100 if (applicationManager) {
92 if (applicationManager) {
101 // For newly started applications, as it takes them time to draw their first frame
93 // For newly started applications, as it takes them time to draw their first frame
@@ -348,7 +340,7 @@ BasicShell {
348
340
349 width: shell.edgeSize
341 width: shell.edgeSize
350 direction: Direction.Leftwards
342 direction: Direction.Leftwards
351− enabled: edgeDemo.dashEnabled
343+ enabled: greeter.showProgress == 0 && edgeDemo.dashEnabled
352 property bool haveApps: mainStage.applications.count > 0 || sideStage.applications.count > 0
344 property bool haveApps: mainStage.applications.count > 0 || sideStage.applications.count > 0
353
345
354 maxTotalDragDistance: haveApps ? parent.width : parent.width * 0.7
346 maxTotalDragDistance: haveApps ? parent.width : parent.width * 0.7
@@ -358,38 +350,54 @@ BasicShell {
358 }
350 }
359 }
351 }
360
352
353+ InputFilterArea {
354+ anchors.fill: parent
355+ blockInput: !applicationFocused || launcher.shown
356+ || panel.indicators.shown || hud.shown
357+ }
358+
361 Connections {
359 Connections {
362− id: powerConnection
360+ id: sessionConnection
363− target: Powerd
361+ target: SessionManager
364
362
365 property var previousMainApp: null
363 property var previousMainApp: null
366 property var previousSideApp: null
364 property var previousSideApp: null
367
365
368− function setFocused(focused) {
366+ function removeApplicationFocus() {
369− if (!focused) {
370− powerConnection.previousMainApp = applicationManager.mainStageFocusedApplication;
367+ sessionConnection.previousMainApp = applicationManager.mainStageFocusedApplication;
371− powerConnection.previousSideApp = applicationManager.sideStageFocusedApplication;
368+ sessionConnection.previousSideApp = applicationManager.sideStageFocusedApplication;
372− applicationManager.unfocusCurrentApplication();
369+ applicationManager.unfocusCurrentApplication();
370+ }
371+
372+ function restoreApplicationFocus() {
373+ if (sessionConnection.previousMainApp) {
374+ applicationManager.focusApplication(sessionConnection.previousMainApp);
375+ sessionConnection.previousMainApp = null;
376+ }
377+ if (sessionConnection.previousSideApp) {
378+ applicationManager.focusApplication(sessionConnection.previousSideApp);
379+ sessionConnection.previousSideApp = null;
380+ }
381+ }
382+
383+ onActiveChanged: {
384+ if (SessionManager.active) {
385+ restoreApplicationFocus();
373 } else {
386 } else {
374− if (powerConnection.previousMainApp) {
387+ removeApplicationFocus();
375− applicationManager.focusApplication(powerConnection.previousMainApp);
376− powerConnection.previousMainApp = null;
377− }
378− if (powerConnection.previousSideApp) {
379− applicationManager.focusApplication(powerConnection.previousSideApp);
380− powerConnection.previousSideApp = null;
381− }
382 }
388 }
383 }
389 }
390+ }
391+
392+ Connections {
393+ id: powerConnection
394+ target: Powerd
384
395
385 onDisplayPowerStateChange: {
396 onDisplayPowerStateChange: {
386 // We ignore any display-off signals when the proximity sensor
397 // We ignore any display-off signals when the proximity sensor
387 // is active. This usually indicates something like a phone call.
398 // is active. This usually indicates something like a phone call.
388 if (status == Powerd.Off && (flags & Powerd.UseProximity) == 0) {
399 if (status == Powerd.Off && (flags & Powerd.UseProximity) == 0) {
389− powerConnection.setFocused(false);
390 SessionManager.lock();
400 SessionManager.lock();
391− } else if (status == Powerd.On) {
392− powerConnection.setFocused(true);
393 }
401 }
394
402
395 // No reason to chew demo CPU when user isn't watching
403 // No reason to chew demo CPU when user isn't watching
@@ -401,13 +409,9 @@ BasicShell {
401 }
409 }
402 }
410 }
403
411
404− function showHome() {
412+ function showHome(fromLauncher) {
405− // Animate if moving between application and dash
406− if (!stages.shown) {
413+ var animate = fromLauncher && !stages.shown
407− dash.setCurrentScope("home.scope", true, false)
408− } else {
409− dash.setCurrentScope("home.scope", false, false)
414+ dash.setCurrentScope("home.scope", animate, false)
410− }
411 stages.hide()
415 stages.hide()
412 }
416 }
413
417
@@ -426,6 +430,7 @@ BasicShell {
426 contentEnabled: edgeDemo.panelContentEnabled
430 contentEnabled: edgeDemo.panelContentEnabled
427 }
431 }
428 fullscreenMode: shell.fullscreenMode
432 fullscreenMode: shell.fullscreenMode
433+ searchVisible: dash.shown
429
434
430 InputFilterArea {
435 InputFilterArea {
431 anchors {
436 anchors {
@@ -473,6 +478,7 @@ BasicShell {
473 }
478 }
474
479
475 Bottombar {
480 Bottombar {
481+ id: bottombar
476 theHud: hud
482 theHud: hud
477 anchors.fill: parent
483 anchors.fill: parent
478 enabled: hud.available
484 enabled: hud.available
@@ -497,10 +503,10 @@ BasicShell {
497 width: parent.width
503 width: parent.width
498 dragAreaWidth: shell.edgeSize
504 dragAreaWidth: shell.edgeSize
499 available: edgeDemo.launcherEnabled
505 available: edgeDemo.launcherEnabled
500− onDashItemSelected: showHome()
506+ onDashItemSelected: showHome(true)
501 onDash: {
507 onDash: {
502 if (stages.shown) {
508 if (stages.shown) {
503− dash.setCurrentScope("applications.scope", true, false)
509+ dash.setCurrentScope("applications.scope", true /* animate */, true /* reset */)
504 stages.hide();
510 stages.hide();
505 launcher.hide();
511 launcher.hide();
506 }
512 }
@@ -512,6 +518,7 @@ BasicShell {
512 if (shown) {
518 if (shown) {
513 panel.indicators.hide()
519 panel.indicators.hide()
514 hud.hide()
520 hud.hide()
521+ bottombar.hide()
515 }
522 }
516 }
523 }
517 }
524 }
@@ -541,10 +548,17 @@ BasicShell {
541 PropertyChanges { target: notifications; width: units.gu(38) }
548 PropertyChanges { target: notifications; width: units.gu(38) }
542 }
549 }
543 ]
550 ]
551+
552+ InputFilterArea {
553+ anchors { left: parent.left; right: parent.right }
554+ height: parent.contentHeight
555+ blockInput: height > 0
556+ }
544 }
557 }
545 }
558 }
546
559
547 focus: true
560 focus: true
561+ onFocusChanged: if (!focus) forceActiveFocus();
548
562
549 InputFilterArea {
563 InputFilterArea {
550 anchors {
564 anchors {
@@ -562,6 +576,11 @@ BasicShell {
562 value: "unity8"
576 value: "unity8"
563 }
577 }
564
578
579+ OSKController {
580+ anchors.topMargin: panel.panelHeight
581+ anchors.fill: parent // as needs to know the geometry of the shell
582+ }
583+
565 //FIXME: This should be handled in the input stack, keyboard shouldnt propagate
584 //FIXME: This should be handled in the input stack, keyboard shouldnt propagate
566 MouseArea {
585 MouseArea {
567 anchors.bottom: parent.bottom
586 anchors.bottom: parent.bottom
@@ -596,6 +615,6 @@ BasicShell {
596
615
597 Connections {
616 Connections {
598 target: SessionBroadcast
617 target: SessionBroadcast
599− onShowHome: showHome()
618+ onShowHome: showHome(false)
600 }
619 }
601}
620}
data/unity8-setcap.confnew file+32
@@ -0,0 +1,32 @@
1+# unity8-setcap - ugly hacks to arrange for /usr/bin/unity8 to have CAP_SYS_RESOURCE
2+
3+# XXX replace me with some root-helper to gain CAP_SYS_RESOURCE XXX
4+
5+author "Loïc Minier <loic.minier@ubuntu.com>"
6+description "Ugly hacks to arrange for /usr/bin/unity8 to have CAP_SYS_RESOURCE"
7+
8+# start when first boot-hooks event is emitted and before lightdm (lightdm
9+# starts ubuntu-touch-session which starts unity8); note that /run is
10+# guaranteeds to be be there because lightdm starts on filesystem
11+start on boot-hooks and starting lightdm
12+
13+# NOT a task as otherwise this would block restarting lightdm
14+
15+env RUNDIR=/run/unity8-setcap
16+
17+# work needs to be done in pre-start as this really is a job with nothing to
18+# start
19+pre-start script
20+ if [ ! -e "$RUNDIR" ]; then
21+ mkdir "$RUNDIR"
22+ # /run is noexec, hence mounting another tmpfs exec
23+ # NB: unity8 is 35K; 512K should be enough for everyone
24+ mount -o rw,nosuid,nodev,exec,relatime,mode=755,size=512k -t tmpfs tmpfs "$RUNDIR"
25+ cp -a /usr/bin/unity8 "$RUNDIR"
26+ setcap CAP_SYS_RESOURCE=+ep "$RUNDIR/unity8"
27+ # bind-mount this back as unity8 checks dirname(argv[0]'s) == /usr to
28+ # decide whether it's installed or not
29+ mount --bind "$RUNDIR/unity8" /usr/bin/unity8
30+ fi
31+end script
32+
data/unity8.confnew file+9
@@ -0,0 +1,9 @@
1+description "Unity Shell v8"
2+author "Ricardo Mendoza <ricmm@ubuntu.com>"
3+
4+start on ((xsession SESSION=ubuntu-touch) or (xsession SESSION=ubuntu-touch-surfaceflinger)) and started dbus
5+stop on desktop-end
6+
7+respawn
8+
9+exec ${BINARY:-unity8} $ARGS
debian/changelog+391
@@ -1,3 +1,394 @@
1+unity8 (7.83) UNRELEASED; urgency=low
2+
3+ * Replace ubuntu-touch-session's unity8.conf upstart job.
4+
5+ -- Michał Sawicz <michal.sawicz@canonical.com> Tue, 15 Oct 2013 01:12:45 +0200
6+
7+unity8 (7.82+13.10.20131011.2-0ubuntu1) saucy; urgency=low
8+
9+ [ Michał Sawicz ]
10+ * Work around Mir not delivering input to shell after restart, if the
11+ device isn't reinitialized.
12+
13+ [ Albert Astals ]
14+ * Remove unused DashMusic/DashVideos.
15+ * Don't let the user change between scopes if the current one is
16+ moving up/down.
17+ * Fix two uninitialized variable uses reported by valgrind ==17988==
18+ Conditional jump or move depends on uninitialised value(s) ==17988==
19+ at 0x13839F3A: AccountsService::updateDemoEdges()
20+ (AccountsService.cpp:74) ==17988== by 0x13839DA5:
21+ AccountsService::setUser(QString const&) (AccountsService.cpp:45)
22+ ==17988== by 0x1383F67B:
23+ AccountsService::qt_metacall(QMetaObject::Call, int, void**)
24+ (moc_AccountsService.cpp:192) ==17988== by 0x496143D:
25+ StoreProperty(QV8Engine*, QObject*, QQmlPropertyData*,
26+ v8::Handle<v8::Value>) (in /usr/lib/arm-linux-
27+ gnueabihf/libQt5Qml.so.5.0.2) ==17988== ==17988== Conditional jump
28+ or move depends on uninitialised value(s) ==17988== at 0x1383A0F6:
29+ AccountsService::updateStatsWelcomeScreen() (AccountsService.cpp:92)
30+ ==17988== by 0x13839DB1: AccountsService::setUser(QString const&)
31+ (AccountsService.cpp:47) ==17988== by 0x1383F67B:
32+ AccountsService::qt_metacall(QMetaObject::Call, int, void**)
33+ (moc_AccountsService.cpp:192) ==17988== by 0x496143D:
34+ StoreProperty(QV8Engine*, QObject*, QQmlPropertyData*,
35+ v8::Handle<v8::Value>) (in /usr/lib/arm-linux-
36+ gnueabihf/libQt5Qml.so.5.0.2)
37+ * Fix unitialized variable in Scope ==18457== Conditional jump or move
38+ depends on uninitialised value(s) ==18457== at 0x15AD1FD6:
39+ Scope::setActive(bool) (scope.cpp:165) ==18457== by 0x15B0023D:
40+ Scope::qt_metacall(QMetaObject::Call, int, void**)
41+ (moc_scope.cpp:478) ==18457== by 0x48B709F:
42+ QQmlPropertyPrivate::write(QObject*, QQmlPropertyData const&,
43+ QVariant const&, QQmlContextData*,
44+ QFlags<QQmlPropertyPrivate::WriteFlag>) (in /usr/lib/arm-linux-
45+ gnueabihf/libQt5Qml.so.5.0.2)
46+ * Fix crash on the phone For some reason i'm getting v8 crashes
47+ without this when shuting down unity-mir
48+
49+ [ Gerry Boland ]
50+ * Use focusRequested signal from AppManager. WM: AppManager has new
51+ signal to ask shell to request focus for app - use it to properly
52+ animate and focus the app. If app wants to be side stage, but no
53+ side stage available, override the application stage.
54+
55+ [ Nick Dedekind ]
56+ * Only use the root action state as a unitymenumodel ActionStateParser
57+ when needed.
58+
59+ [ Andrea Cimitan ]
60+ * Move the close app icon on top left.
61+ * The header of category list is already on screen after unlock
62+
63+ [ Michael Zanetti ]
64+ * Make the greeter's clock update in sync with the indicators.
65+
66+ [ Omer Akram ]
67+ * Increase dash header height to 5gu.
68+
69+ [ Nicolas d'Offay ]
70+ * Standardised expansion speed in scopes.
71+
72+ [ Ubuntu daily release ]
73+ * Automatic snapshot from revision 449
74+
75+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 11 Oct 2013 17:26:34 +0000
76+
77+unity8 (7.82+13.10.20131011.1-0ubuntu1) saucy; urgency=low
78+
79+ [ Michał Sawicz ]
80+ * Fix frequent application IDs and drop old AppsAvailableForDownload
81+ model.
82+ * Unrevert r388 now that we have fixed the infinite loop it was
83+ causing in Qt.
84+
85+ [ Steve Langasek ]
86+ * Don't keep a long-lived connection open to upstart when we only use
87+ it for two events, one at load time and one at unload time.
88+
89+ [ Lars Uebernickel ]
90+ * VolumeControl: use 'volume' instead of 'scroll' action The volume
91+ action doesn't show a notification.
92+
93+ [ Michael Terry ]
94+ * Disable DragHandle on right side of screen while the greeter is
95+ animating
96+
97+ [ Marcus Tomlinson ]
98+ * Added missing "enabled" property to "progressMenu" component in the
99+ menu item factory.
100+
101+ [ Michael Zanetti ]
102+ * Add scaleTo: "fit" mode support to LazyImage
103+
104+ [ Andrea Cimitan ]
105+ * Add music and video renderers
106+ * Use shell.edgeSize for BottomBar's EdgeDragArea, detecting gestures
107+ only when they are within the edgeSize.
108+
109+ [ Nick Dedekind ]
110+ * Removed greeter "toHome" animation (LP#1092976) (LP: #1092976)
111+ * Only show Snap Decision notification actions when available.
112+
113+ [ Albert Astals ]
114+ * Dash: Set delegate creation range for inner itemviewss If it's above
115+ the list viewport we set it to the end of the list to precache the
116+ last items It it's below the list viewport we set it to the
117+ beginning to precache the first items Otherwise we set it to the
118+ part of the viewport in the view Approved by: Michał Sawicz.
119+
120+ [ Ubuntu daily release ]
121+ * Automatic snapshot from revision 435
122+
123+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 11 Oct 2013 09:05:30 +0000
124+
125+unity8 (7.82+13.10.20131010-0ubuntu1) saucy; urgency=low
126+
127+ [ David Callé ]
128+ * Small logic change in preview descriptions line breaks. Multiple new
129+ lines are now replaced by multiple br tags.
130+
131+ [ Nick Dedekind ]
132+ * Use indicator identifier for indicators-client list item label.
133+ * Make sure overflow indicators are hidden and not the search label.
134+
135+ [ Mirco Müller ]
136+ * Tweaks to notifications to improve spec-compliance. - updated
137+ notifications-qmltest to reflect the use of a variant-map for the
138+ hints - made text-fields as heigh as buttons - made the summary
139+ align horizontally to the icon - updated button-height and bubble-
140+ background.
141+
142+ [ Pawel Stolowski ]
143+ * Handle category_order_changes signal from scopes (used in Home only)
144+ and reorder categories accordingly.
145+ * Implementation of albumart image provider for audio content.
146+
147+ [ Michael Terry ]
148+ * Hide the greeter when an app is focused, fixing snap decisions
149+ launching an app in the greeter (like receiving a call).
150+
151+ [ Michael Zanetti ]
152+ * Launcher - remove support for pinning items in the backend After the
153+ latest design changes, recent apps is everything that is contained
154+ in the ApplicationManager. So no need for storing anything else than
155+ pinned apps in the config.
156+
157+ [ Michał Sawicz ]
158+ * Remove the mir socket before starting unity8 during autopilot tests.
159+
160+ [ Ubuntu daily release ]
161+ * Automatic snapshot from revision 420
162+
163+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 10 Oct 2013 04:15:13 +0000
164+
165+unity8 (7.82+13.10.20131008.1-0ubuntu1) saucy; urgency=low
166+
167+ [ Michal Hruby ]
168+ * Add Scope::isActive property and corresponding tests. (LP: #1230352)
169+
170+ [ Daniel d'Andrada ]
171+ * Move OSKController to the front as it will now also block input
172+ meant to the OSK That's in the unity-mir implementation. The
173+ SurfaceFlinger one is still an empty noop. Currently, when the OSK
174+ is up, both shell and OSK get user input, thus we need the
175+ OSKController to shield our shell components from them. (LP:
176+ #1236773)
177+
178+ [ Michał Sawicz ]
179+ * Add Scope::isActive property and corresponding tests. (LP: #1230352)
180+ * Force focus back on shell in case it loses it for some reason.
181+
182+ [ Ubuntu daily release ]
183+ * Automatic snapshot from revision 409
184+
185+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 08 Oct 2013 19:14:20 +0000
186+
187+unity8 (7.82+13.10.20131008-0ubuntu1) saucy; urgency=low
188+
189+ [ Michał Sawicz ]
190+ * update previews to match design. (LP: #1224555)
191+ * Add an InputFilterArea in Notifications. (LP: #1233411, #1235215)
192+
193+ [ Ying-Chun Liu ]
194+ * update previews to match design. (LP: #1224555)
195+
196+ [ Albert Astals ]
197+ * Unrevert 376 by reverting r395 and a small fix to fix the cpu
198+ hogging issue . (LP: #1124567)
199+
200+ [ Michael Terry ]
201+ * Add Showable.showNow() method and use it in Shell to immediately
202+ show greeter when we blank the screen rather than animating it. (LP:
203+ #1233564)
204+
205+ [ Michael Zanetti ]
206+ * update previews to match design. (LP: #1224555)
207+
208+ [ Diego Sarmentero ]
209+ * update previews to match design. (LP: #1224555)
210+
211+ [ Ubuntu daily release ]
212+ * Automatic snapshot from revision 404
213+
214+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 08 Oct 2013 02:57:55 +0000
215+
216+unity8 (7.82+13.10.20131007-0ubuntu1) saucy; urgency=low
217+
218+ [ Michał Sawicz ]
219+ * Respect pre-set import and library paths and prevent segfault in
220+ startShell.
221+
222+ [ Ubuntu daily release ]
223+ * Automatic snapshot from revision 399
224+
225+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 07 Oct 2013 07:10:46 +0000
226+
227+unity8 (7.82+13.10.20131005-0ubuntu1) saucy; urgency=low
228+
229+ [ Michał Sawicz ]
230+ * Revert r376 that caused constant CPU usage due to the
231+ ActivityIndicator.
232+
233+ [ Nick Dedekind ]
234+ * Removed indicators-client autopilot tests. (LP: #1234736)
235+
236+ [ Albert Astals ]
237+ * Revert r388. (LP: #1235268)
238+
239+ [ Christopher Lee ]
240+ * Removes passing -fullscreen to unity8 when on the device (as per bug
241+ #1235065). (LP: #1235065)
242+
243+ [ Ubuntu daily release ]
244+ * Automatic snapshot from revision 396
245+
246+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Sat, 05 Oct 2013 11:45:14 +0000
247+
248+unity8 (7.82+13.10.20131004.2-0ubuntu1) saucy; urgency=low
249+
250+ * Revert 7.82+13.10.20131004.1-0ubuntu1 back to
251+ 7.81.3+13.10.20130927.3-0ubuntu1 due to CPU hogging issue with
252+ 7.82+13.10.20131004.1-0ubuntu1.
253+
254+ -- Loïc Minier <loic.minier@ubuntu.com> Fri, 04 Oct 2013 21:22:29 +0200
255+
256+unity8 (7.82+13.10.20131004.1-0ubuntu1) saucy; urgency=low
257+
258+ [ Michał Sawicz ]
259+ * Bump to indicate support for extended snap decisions.
260+ * Make Tile themeable, add renderers for Dash Plugins and weather.
261+ (LP: #1231948)
262+ * Drop network agents now that they're in indicator-network instead.
263+
264+ [ Michal Hruby ]
265+ * Differentiate generic and music carousels.
266+ * Use the thumbnailer image provider for scope results that don't
267+ specify icon as well as for previews.
268+ * Added an indicator which is displayed in the search bar whenever a
269+ search is in progress. Added accompanying test in tst_PageHeader.
270+ * Expose rendererHint to shell.
271+
272+ [ Albert Astals ]
273+ * Update pot file. (LP: #1232374)
274+ * Only enable the animation when the item is on screen (i.e. !culled)
275+ . (LP: #1200374)
276+ * Do not crash on positionAtBeginning if the list is empty .
277+ * Enable/disable running apps height animation in a less error prone
278+ way.
279+
280+ [ Michael Terry ]
281+ * Use a chevron after 'Skip intro' and drop the underlining.
282+ * Load testability driver when QT_LOAD_TESTABILITY is set. (LP:
283+ #1226234)
284+ * Listen to the system setting StatsWelcomeScreen, which tells us
285+ whether to show user-specific infographic data in the greeter. (LP:
286+ #1207857)
287+
288+ [ Gerry Boland ]
289+ * WM: ensure focusedApplicationWhenUsingScreenshots reset when unused,
290+ and only used when set. Fixes window focus conflict between shell
291+ and ApplicationManager.
292+
293+ [ Nick Dedekind ]
294+ * Removed deprecated Unity.IndicatorsLegacy plugin.
295+ * Added actionState parser to the indicators-client text printer so
296+ that we get the icon.
297+ * Moved indicator page titles to the root action state of menu model.
298+ (LP: #1223635)
299+
300+ [ Mirco Müller ]
301+ * Added rendering- and interaction-support for the first three
302+ extended snap-decision dialog-cases password-entry, user-
303+ authentication and simunlock.
304+
305+ [ Daniel d'Andrada ]
306+ * Revert the reversion of r304 since it doesn't seem to crash anymore
307+ Original commit was Reset apps scope when returning from app to dash
308+ (LP #1193419) If an app is on foreground and you perform a long
309+ left-edge swipe to minimize it, and therefore return to the dash,
310+ the dash should be in the Applications scope and showing the
311+ running/recents applications. (LP: #1193419)
312+
313+ [ Andrea Cimitan ]
314+ * Add behaviours to the hud reveal. (LP: #1224480, #1224633)
315+ * Make Tile themeable, add renderers for Dash Plugins and weather.
316+ (LP: #1231948)
317+
318+ [ Michael Zanetti ]
319+ * fix inserting into quicklistmodel.
320+ * Drop useStorage argument and use exising LAUNCHER_TESTING define for
321+ this decision.
322+
323+ [ Omer Akram ]
324+ * Make the volume/brightness slider changes realtime. (LP: #1227595)
325+
326+ [ Nicolas d'Offay ]
327+ * Fixed black colour on the first of the month due to division. (LP:
328+ #1233657)
329+ * Added an indicator which is displayed in the search bar whenever a
330+ search is in progress. Added accompanying test in tst_PageHeader.
331+
332+ [ Ubuntu daily release ]
333+ * Automatic snapshot from revision 390
334+
335+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 04 Oct 2013 06:55:16 +0000
336+
337+unity8 (7.81.3+13.10.20130927.3-0ubuntu1) saucy; urgency=low
338+
339+ [ Michal Hruby ]
340+ * Correctly handle image URI scheme in results.
341+
342+ [ Michał Sawicz ]
343+ * Make SHOW_DASH and HIDE_DASH close the current preview. (LP:
344+ #1231404)
345+ * Add a LazyImage component that shows an activity spinner for long-
346+ loading images and handles aspect ratio properly.
347+ * Fix Qt 5.1 FTBFS and suppress some build warnings.
348+
349+ [ Albert Astals ]
350+ * Make sure we always have least have one column in the gridview. (LP:
351+ #1225391)
352+ * LVWPH: Make sure we always overshoot vertically. (LP: #1229851)
353+ * Remember the expanded categoryId and not the expanded index The
354+ index can change on search, and we still want to maintain it
355+ expanded in that case. (LP: #1230216)
356+ * Fix showHeader in an edge case of notShownByItsOwn Not all the tests
357+ i've added fail without the code fix, but i've added them just to be
358+ more covered . (LP: #1230187)
359+
360+ [ Diego Sarmentero ]
361+ * Handling error signal from the DownloadTracker plugin (BUG:
362+ #1229744). (LP: #1229744)
363+ * Remove "Reviews and Comments" section from Application Preview until
364+ the feature is ready (BUG: #1226632) - Detect when the keyboard is
365+ being shown to allow the user to scroll the Preview even more if
366+ necessary to interact with the components at the bottom of that
367+ preview, and don't leave those components obscured behind the
368+ keyboard (BUG: #1226638). (LP: #1226632, #1224717, #1226638)
369+
370+ [ Nick Dedekind ]
371+ * Brought messaging indicator inline with UnityMenuModel &
372+ UnityMenuAction. (LP: #1217676, #1217678)
373+
374+ [ Pawel Stolowski ]
375+ * Support canned search queries returned by Home Scope.
376+ * Cancel previous actions and previews on new activation / preview.
377+ Expose previewed data row in Preview object.
378+
379+ [ Michael Terry ]
380+ * Only enable the Bottombar when the HUD is available. (LP: #1220306)
381+ * Increase the "Skip intro" clickable area, making dismissing the edge
382+ demo intro feel more natural. (LP: #1220632)
383+
384+ [ Michael Zanetti ]
385+ * drop our CrossFadeImage in favor of the SDK one. (LP: #1227783)
386+
387+ [ Ubuntu daily release ]
388+ * Automatic snapshot from revision 358
389+
390+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 27 Sep 2013 14:13:22 +0000
391+
1unity8 (7.81.3+13.10.20130924.2-0ubuntu1) saucy; urgency=low
392unity8 (7.81.3+13.10.20130924.2-0ubuntu1) saucy; urgency=low
2
393
3 [ Michal Hruby ]
394 [ Michal Hruby ]
debian/control+9−9
@@ -14,21 +14,20 @@ Build-Depends: cmake,
14 libjson-perl,
14 libjson-perl,
15 libnih-dbus-dev,
15 libnih-dbus-dev,
16 libnih-dev,
16 libnih-dev,
17− libnm-glib-dev,
18− libnm-util-dev,
19 liblightdm-qt5-3-dev,
17 liblightdm-qt5-3-dev,
20 libpulse-dev,
18 libpulse-dev,
21 libqmenumodel-dev (>= 0.2.7),
19 libqmenumodel-dev (>= 0.2.7),
22 libqt5v8-5-private-dev,
20 libqt5v8-5-private-dev,
23 libsigc++-2.0-dev,
21 libsigc++-2.0-dev,
24 libunity-api-dev (>= 7.80.3),
22 libunity-api-dev (>= 7.80.3),
25− libunity-core-6.0-dev (<< 7.80),
23+ libunity-core-6.0-dev (>= 7.1.1),
26 libunity-dev (>= 7.0.12),
24 libunity-dev (>= 7.0.12),
27 libunity-mir-dev,
25 libunity-mir-dev,
28 libunity-scopes-json-def-phone,
26 libunity-scopes-json-def-phone,
29 libupstart-dev,
27 libupstart-dev,
30 libusermetricsoutput1-dev,
28 libusermetricsoutput1-dev,
31 libxcb1-dev,
29 libxcb1-dev,
30+ libglib2.0-dev,
32 pkg-config,
31 pkg-config,
33 python:any (>= 2.7),
32 python:any (>= 2.7),
34 python-setuptools,
33 python-setuptools,
@@ -44,6 +43,7 @@ Build-Depends: cmake,
44 qtdeclarative5-test-plugin,
43 qtdeclarative5-test-plugin,
45 qtdeclarative5-ubuntu-ui-toolkit-plugin,
44 qtdeclarative5-ubuntu-ui-toolkit-plugin,
46 qtdeclarative5-xmllistmodel-plugin,
45 qtdeclarative5-xmllistmodel-plugin,
46+ libqt5xmlpatterns5-dev,
47 ttf-ubuntu-font-family,
47 ttf-ubuntu-font-family,
48Standards-Version: 3.9.4
48Standards-Version: 3.9.4
49Homepage: http://launchpad.net/unity
49Homepage: http://launchpad.net/unity
@@ -76,16 +76,17 @@ Depends: gsettings-desktop-schemas,
76 qtdeclarative5-xmllistmodel-plugin,
76 qtdeclarative5-xmllistmodel-plugin,
77 unity-greeter-session-broadcast,
77 unity-greeter-session-broadcast,
78 unity-launcher-impl-3,
78 unity-launcher-impl-3,
79− unity-notifications-impl-1,
79+ unity-notifications-impl-2,
80 unity8-fake-env | qtubuntu-shell,
80 unity8-fake-env | qtubuntu-shell,
81 unity8-private (= ${binary:Version}),
81 unity8-private (= ${binary:Version}),
82 unity8-private | unity-launcher-impl,
82 unity8-private | unity-launcher-impl,
83+# for setcap:
84+ libcap2-bin,
83 ${misc:Depends},
85 ${misc:Depends},
84 ${shlibs:Depends},
86 ${shlibs:Depends},
85−Recommends: indicator-battery,
86− indicator-messages,
87− indicator-time,
88− ${unity-default-masterscopes},
87+Recommends: ${unity-default-masterscopes},
88+Breaks: indicator-network (<< 0.5.1)
89+Replaces: ubuntu-touch-session (<< 0.82~)
89Description: Unity 8 shell
90Description: Unity 8 shell
90 The Unity 8 shell is the primary user interface for Ubuntu devices.
91 The Unity 8 shell is the primary user interface for Ubuntu devices.
91
92
@@ -102,7 +103,6 @@ Description: Ubuntu QML greeter
102Package: unity8-autopilot
103Package: unity8-autopilot
103Architecture: all
104Architecture: all
104Depends: gir1.2-glib-2.0,
105Depends: gir1.2-glib-2.0,
105− indicators-client (>= ${source:Version}),
106 libautopilot-qt,
106 libautopilot-qt,
107 libqt5test5,
107 libqt5test5,
108 libqt5widgets5,
108 libqt5widgets5,
debian/unity8.install+2−1
@@ -12,4 +12,5 @@ usr/share/unity8/Panel
12usr/share/unity8/Shell.qml
12usr/share/unity8/Shell.qml
13usr/share/unity8/SideStage
13usr/share/unity8/SideStage
14usr/share/unity8/graphics
14usr/share/unity8/graphics
15−usr/share/unity8/unity/indicators/*
15+data/unity8.conf usr/share/upstart/sessions/
16+data/unity8-setcap.conf etc/init/boot-hooks/
main.cpp+5−4
@@ -114,7 +114,7 @@ int startShell(int argc, const char** argv, void* server)
114
114
115 // The testability driver is only loaded by QApplication but not by QGuiApplication.
115 // The testability driver is only loaded by QApplication but not by QGuiApplication.
116 // However, QApplication depends on QWidget which would add some unneeded overhead => Let's load the testability driver on our own.
116 // However, QApplication depends on QWidget which would add some unneeded overhead => Let's load the testability driver on our own.
117− if (args.contains(QLatin1String("-testability"))) {
117+ if (args.contains(QLatin1String("-testability")) || getenv("QT_LOAD_TESTABILITY")) {
118 QLibrary testLib(QLatin1String("qttestability"));
118 QLibrary testLib(QLatin1String("qttestability"));
119 if (testLib.load()) {
119 if (testLib.load()) {
120 typedef void (*TasInitialize)(void);
120 typedef void (*TasInitialize)(void);
@@ -161,10 +161,10 @@ int startShell(int argc, const char** argv, void* server)
161 prependImportPaths(view->engine(), ::overrideImportPaths());
161 prependImportPaths(view->engine(), ::overrideImportPaths());
162 appendImportPaths(view->engine(), ::fallbackImportPaths());
162 appendImportPaths(view->engine(), ::fallbackImportPaths());
163
163
164− QStringList importPath = view->engine()->importPathList().filter("qt5/imports");
165 if (isUbuntuMirServer) {
164 if (isUbuntuMirServer) {
166− importPath.first().append("/Unity-Mir");
165+ QStringList importPaths = view->engine()->importPathList();
167− view->engine()->addImportPath(importPath.first());
166+ importPaths.replaceInStrings(QRegExp("qt5/imports$"), "qt5/imports/Unity-Mir");
167+ view->engine()->setImportPathList(importPaths);
168 }
168 }
169
169
170 view->setSource(source);
170 view->setSource(source);
@@ -182,6 +182,7 @@ int startShell(int argc, const char** argv, void* server)
182
182
183 int result = application->exec();
183 int result = application->exec();
184
184
185+ delete view;
185 delete mouseTouchAdaptor;
186 delete mouseTouchAdaptor;
186 delete application;
187 delete application;
187
188
plugins/AccountsService/AccountsService.cpp+23−1
@@ -23,7 +23,10 @@
23
23
24AccountsService::AccountsService(QObject* parent)
24AccountsService::AccountsService(QObject* parent)
25 : QObject(parent),
25 : QObject(parent),
26− m_service(new AccountsServiceDBusAdaptor(this))
26+ m_service(new AccountsServiceDBusAdaptor(this)),
27+ m_user(qgetenv("USER")),
28+ m_demoEdges(false),
29+ m_statsWelcomeScreen(false)
27{
30{
28 connect(m_service, SIGNAL(propertiesChanged(const QString &, const QString &, const QStringList &)),
31 connect(m_service, SIGNAL(propertiesChanged(const QString &, const QString &, const QStringList &)),
29 this, SLOT(propertiesChanged(const QString &, const QString &, const QStringList &)));
32 this, SLOT(propertiesChanged(const QString &, const QString &, const QStringList &)));
@@ -46,6 +49,7 @@ void AccountsService::setUser(const QString &user)
46
49
47 updateDemoEdges();
50 updateDemoEdges();
48 updateBackgroundFile();
51 updateBackgroundFile();
52+ updateStatsWelcomeScreen();
49}
53}
50
54
51bool AccountsService::demoEdges() const
55bool AccountsService::demoEdges() const
@@ -75,6 +79,11 @@ QString AccountsService::backgroundFile() const
75 return m_backgroundFile;
79 return m_backgroundFile;
76}
80}
77
81
82+bool AccountsService::statsWelcomeScreen() const
83+{
84+ return m_statsWelcomeScreen;
85+}
86+
78void AccountsService::updateDemoEdges()
87void AccountsService::updateDemoEdges()
79{
88{
80 auto demoEdges = m_service->getUserProperty(m_user, "com.canonical.unity.AccountsService", "demo-edges").toBool();
89 auto demoEdges = m_service->getUserProperty(m_user, "com.canonical.unity.AccountsService", "demo-edges").toBool();
@@ -102,6 +111,15 @@ void AccountsService::updateBackgroundFile()
102 }
111 }
103}
112}
104
113
114+void AccountsService::updateStatsWelcomeScreen()
115+{
116+ bool statsWelcomeScreen = m_service->getUserProperty(m_user, "com.ubuntu.touch.AccountsService.SecurityPrivacy", "StatsWelcomeScreen").toBool();
117+ if (m_statsWelcomeScreen != statsWelcomeScreen) {
118+ m_statsWelcomeScreen = statsWelcomeScreen;
119+ Q_EMIT statsWelcomeScreenChanged();
120+ }
121+}
122+
105void AccountsService::propertiesChanged(const QString &user, const QString &interface, const QStringList &changed)
123void AccountsService::propertiesChanged(const QString &user, const QString &interface, const QStringList &changed)
106{
124{
107 if (interface == "com.canonical.unity.AccountsService") {
125 if (interface == "com.canonical.unity.AccountsService") {
@@ -113,6 +131,10 @@ void AccountsService::propertiesChanged(const QString &user, const QString &inte
113 updateDemoEdges();
131 updateDemoEdges();
114 }
132 }
115 }
133 }
134+ } else if (interface == "com.ubuntu.touch.AccountsService.SecurityPrivacy") {
135+ if (changed.contains("StatsWelcomeScreen")) {
136+ updateStatsWelcomeScreen();
137+ }
116 }
138 }
117}
139}
118
140
plugins/AccountsService/AccountsService.h+7
@@ -42,6 +42,9 @@ class AccountsService: public QObject
42 Q_PROPERTY (QString backgroundFile
42 Q_PROPERTY (QString backgroundFile
43 READ backgroundFile
43 READ backgroundFile
44 NOTIFY backgroundFileChanged)
44 NOTIFY backgroundFileChanged)
45+ Q_PROPERTY (bool statsWelcomeScreen
46+ READ statsWelcomeScreen
47+ NOTIFY statsWelcomeScreenChanged)
45
48
46public:
49public:
47 explicit AccountsService(QObject *parent = 0);
50 explicit AccountsService(QObject *parent = 0);
@@ -53,12 +56,14 @@ public:
53 bool demoEdgesForCurrentUser() const;
56 bool demoEdgesForCurrentUser() const;
54 void setDemoEdgesForCurrentUser(bool demoEdgesForCurrentUser);
57 void setDemoEdgesForCurrentUser(bool demoEdgesForCurrentUser);
55 QString backgroundFile() const;
58 QString backgroundFile() const;
59+ bool statsWelcomeScreen() const;
56
60
57Q_SIGNALS:
61Q_SIGNALS:
58 void userChanged();
62 void userChanged();
59 void demoEdgesChanged();
63 void demoEdgesChanged();
60 void demoEdgesForCurrentUserChanged();
64 void demoEdgesForCurrentUserChanged();
61 void backgroundFileChanged();
65 void backgroundFileChanged();
66+ void statsWelcomeScreenChanged();
62
67
63private Q_SLOTS:
68private Q_SLOTS:
64 void propertiesChanged(const QString &user, const QString &interface, const QStringList &changed);
69 void propertiesChanged(const QString &user, const QString &interface, const QStringList &changed);
@@ -68,12 +73,14 @@ private:
68 void updateDemoEdges();
73 void updateDemoEdges();
69 void updateDemoEdgesForCurrentUser();
74 void updateDemoEdgesForCurrentUser();
70 void updateBackgroundFile();
75 void updateBackgroundFile();
76+ void updateStatsWelcomeScreen();
71
77
72 AccountsServiceDBusAdaptor *m_service;
78 AccountsServiceDBusAdaptor *m_service;
73 QString m_user;
79 QString m_user;
74 bool m_demoEdges;
80 bool m_demoEdges;
75 bool m_demoEdgesForCurrentUser;
81 bool m_demoEdgesForCurrentUser;
76 QString m_backgroundFile;
82 QString m_backgroundFile;
83+ bool m_statsWelcomeScreen;
77};
84};
78
85
79#endif
86#endif
plugins/ListViewWithPageHeader/listviewwithpageheader.cpp+8−1
@@ -327,6 +327,9 @@ void ListViewWithPageHeader::setForceNoClip(bool noClip)
327
327
328void ListViewWithPageHeader::positionAtBeginning()
328void ListViewWithPageHeader::positionAtBeginning()
329{
329{
330+ if (m_delegateModel->count() <= 0)
331+ return;
332+
330 qreal headerHeight = (m_headerItem ? m_headerItem->height() : 0);
333 qreal headerHeight = (m_headerItem ? m_headerItem->height() : 0);
331 if (m_firstVisibleIndex != 0) {
334 if (m_firstVisibleIndex != 0) {
332 // TODO This could be optimized by trying to reuse the interesection
335 // TODO This could be optimized by trying to reuse the interesection
@@ -485,7 +488,7 @@ void ListViewWithPageHeader::viewportMoved(Qt::Orientations orient)
485 // or the header is partially shown and we are not doing a maximizeVisibleArea either
488 // or the header is partially shown and we are not doing a maximizeVisibleArea either
486 const bool scrolledUp = m_previousContentY > contentY();
489 const bool scrolledUp = m_previousContentY > contentY();
487 const bool notRebounding = contentY() + height() < contentHeight();
490 const bool notRebounding = contentY() + height() < contentHeight();
488− const bool notShownByItsOwn = contentY() + diff > m_headerItem->y() + m_headerItem->height();
491+ const bool notShownByItsOwn = contentY() + diff >= m_headerItem->y() + m_headerItem->height();
489 const bool maximizeVisibleAreaRunning = m_contentYAnimation->isRunning() && contentYAnimationType == ContentYAnimationMaximizeVisibleArea;
492 const bool maximizeVisibleAreaRunning = m_contentYAnimation->isRunning() && contentYAnimationType == ContentYAnimationMaximizeVisibleArea;
490
493
491 if (!scrolledUp && contentY() == -m_minYExtent) {
494 if (!scrolledUp && contentY() == -m_minYExtent) {
@@ -1009,7 +1012,11 @@ void ListViewWithPageHeader::onModelUpdated(const QQmlChangeSet &changeSet, bool
1009 }
1012 }
1010 }
1013 }
1011
1014
1015+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
1012 Q_FOREACH(const QQuickChangeSet::Change &change, changeSet.changes()) {
1016 Q_FOREACH(const QQuickChangeSet::Change &change, changeSet.changes()) {
1017+#else
1018+ Q_FOREACH(const QQmlChangeSet::Change &change, changeSet.changes()) {
1019+#endif
1013// qDebug() << "ListViewWithPageHeader::onModelUpdated Change" << change.index << change.count;
1020// qDebug() << "ListViewWithPageHeader::onModelUpdated Change" << change.index << change.count;
1014 for (int i = change.index; i < change.count; ++i) {
1021 for (int i = change.index; i < change.count; ++i) {
1015 ListItem *item = itemAtIndex(i);
1022 ListItem *item = itemAtIndex(i);
plugins/SessionManager/SessionManager.h+4−2
@@ -30,8 +30,10 @@
30class SessionManager: public QObject
30class SessionManager: public QObject
31{
31{
32 Q_OBJECT
32 Q_OBJECT
33−
34− Q_PROPERTY(bool active READ active NOTIFY activeChanged FINAL)
33+ Q_PROPERTY(bool active
34+ READ active
35+ NOTIFY activeChanged
36+ FINAL)
35
37
36public:
38public:
37 explicit SessionManager(QObject *parent = 0);
39 explicit SessionManager(QObject *parent = 0);
plugins/Unity/CMakeLists.txt+2−2
@@ -2,12 +2,11 @@
2include(Plugins)
2include(Plugins)
3
3
4add_subdirectory(Indicators)
4add_subdirectory(Indicators)
5−add_subdirectory(IndicatorsLegacy)
6
5
7# Dependencies
6# Dependencies
8include(FindPkgConfig)
7include(FindPkgConfig)
9pkg_check_modules(QTDEE REQUIRED libdee-qt5>=3.2)
8pkg_check_modules(QTDEE REQUIRED libdee-qt5>=3.2)
10−pkg_check_modules(UNITYCORE REQUIRED unity-core-6.0)
9+pkg_check_modules(UNITYCORE REQUIRED unity-core-6.0>=7.1.1)
11
10
12include_directories(
11include_directories(
13 ${CMAKE_CURRENT_SOURCE_DIR}
12 ${CMAKE_CURRENT_SOURCE_DIR}
@@ -43,6 +42,7 @@ set(QMLPLUGIN_SRC
43 preview.cpp
42 preview.cpp
44 previewaction.cpp
43 previewaction.cpp
45 previewinfohint.cpp
44 previewinfohint.cpp
45+ result.cpp
46 showallfilteroption.cpp
46 showallfilteroption.cpp
47 signalslist.cpp
47 signalslist.cpp
48 socialpreview.cpp
48 socialpreview.cpp
plugins/Unity/Indicators/CMakeLists.txt+1
@@ -12,6 +12,7 @@ find_package(Qt5Core REQUIRED)
12find_package(Qt5Quick REQUIRED)
12find_package(Qt5Quick REQUIRED)
13
13
14add_subdirectory(qml)
14add_subdirectory(qml)
15+add_subdirectory(Messaging)
15add_subdirectory(Network)
16add_subdirectory(Network)
16
17
17include_directories(
18include_directories(
plugins/Unity/IndicatorsLegacy/Messaging/CMakeLists.txt → plugins/Unity/Indicators/Messaging/CMakeLists.txtrenamed

The content is the same.

plugins/Unity/IndicatorsLegacy/Messaging/qml/ActionButton.qml → plugins/Unity/Indicators/Messaging/qml/ActionButton.qmlrenamed

The content is the same.

plugins/Unity/IndicatorsLegacy/Messaging/qml/ActionTextField.qml → plugins/Unity/Indicators/Messaging/qml/ActionTextField.qmlrenamed+10−7
@@ -22,11 +22,12 @@ import QtQuick 2.0
22import Ubuntu.Components 0.1
22import Ubuntu.Components 0.1
23
23
24Item {
24Item {
25− property alias actionGroup: sendButton.actionGroup
25+ id: textField
26− property alias action: sendButton.action
27−
28 property alias text: replyField.text
26 property alias text: replyField.text
29 property alias buttonText: sendButton.text
27 property alias buttonText: sendButton.text
28+ property bool activateEnabled: false
29+
30+ signal activate(var value)
30
31
31 TextField {
32 TextField {
32 id: replyField
33 id: replyField
@@ -50,17 +51,19 @@ Item {
50 }
51 }
51 }
52 }
52
53
53− ActionButton {
54+ Button {
54 id: sendButton
55 id: sendButton
55−
56− actionParameter: replyField.text
57 anchors {
56 anchors {
58 top: parent.top
57 top: parent.top
59 bottom: parent.bottom
58 bottom: parent.bottom
60 right: parent.right
59 right: parent.right
61 }
60 }
62 width: units.gu(9)
61 width: units.gu(9)
63− enabled: replyField.text !== ""
62+ enabled: replyField.text !== "" && textField.activateEnabled
64 color: enabled ? "#c94212" : "#bababa"
63 color: enabled ? "#c94212" : "#bababa"
64+
65+ onClicked: {
66+ textField.activate(replyField.text);
67+ }
65 }
68 }
66}
69}
plugins/Unity/Indicators/Messaging/qml/CMakeLists.txtnew file+5
@@ -0,0 +1,5 @@
1+# export_qmlfiles macro
2+include(Plugins)
3+
4+# export the qmldir, *.qml files.
5+export_qmlfiles(Unity.Indicators.Messaging Unity/Indicators/Messaging)
plugins/Unity/IndicatorsLegacy/Messaging/qml/GroupedMessage.qml → plugins/Unity/Indicators/Messaging/qml/GroupedMessage.qmlrenamed+13−18
@@ -20,20 +20,19 @@
20
20
21import QtQuick 2.0
21import QtQuick 2.0
22import Ubuntu.Components 0.1
22import Ubuntu.Components 0.1
23−import Unity.IndicatorsLegacy 0.1 as Indicators
23+import Unity.Indicators 0.1 as Indicators
24
24
25−Indicators.BasicMenuItem {
25+Indicators.BaseMenuItem {
26 id: groupedMessage
26 id: groupedMessage
27+
28+ property alias title: __title.text
27 property alias count: label.text
29 property alias count: label.text
30+ property string appIcon: "qrc:/indicators/artwork/messaging/default_app.svg"
28
31
29− color: "#221e1b"
32+ signal activateApp()
30− implicitHeight: units.gu(10)
33+ signal dismiss()
31
34
32− Indicators.MenuAction {
35+ implicitHeight: units.gu(10)
33− id: menuAction
34− actionGroup: groupedMessage.actionGroup
35− action: menu ? menu.action : ""
36− }
37
36
38 Row {
37 Row {
39 anchors.fill: parent
38 anchors.fill: parent
@@ -44,17 +43,17 @@ Indicators.BasicMenuItem {
44 height: units.gu(6)
43 height: units.gu(6)
45 width: units.gu(6)
44 width: units.gu(6)
46 image: Image {
45 image: Image {
47− source: menu && (menu.extra.canonical_icon.length > 0) ? "image://theme/" + encodeURI(menu.extra.canonical_icon) : "qrc:/indicators/artwork/messaging/default_app.svg"
46+ source: groupedMessage.appIcon
48 fillMode: Image.PreserveAspectFit
47 fillMode: Image.PreserveAspectFit
49 }
48 }
50 }
49 }
51
50
52 Label {
51 Label {
52+ id: __title
53 anchors.verticalCenter: parent.verticalCenter
53 anchors.verticalCenter: parent.verticalCenter
54 color: "#e8e1d0"
54 color: "#e8e1d0"
55 font.weight: Font.DemiBold
55 font.weight: Font.DemiBold
56 fontSize: "medium"
56 fontSize: "medium"
57− text: menu && menu.label ? menu.label : ""
58 }
57 }
59
58
60 Label {
59 Label {
@@ -65,7 +64,7 @@ Indicators.BasicMenuItem {
65 color: "#e8e1d0"
64 color: "#e8e1d0"
66 font.weight: Font.DemiBold
65 font.weight: Font.DemiBold
67 fontSize: "medium"
66 fontSize: "medium"
68− text: menuAction.valid ? menuAction.state[0] : "0"
67+ text: "0"
69 }
68 }
70 }
69 }
71
70
@@ -82,15 +81,11 @@ Indicators.BasicMenuItem {
82 MouseArea {
81 MouseArea {
83 anchors.fill: parent
82 anchors.fill: parent
84 onClicked: {
83 onClicked: {
85− if (menuAction.valid) {
84+ groupedMessage.activateApp();
86− menuAction.activate(true);
87− }
88 }
85 }
89 }
86 }
90
87
91 onItemRemoved: {
88 onItemRemoved: {
92− if (menuAction.valid) {
89+ groupedMessage.dismiss();
93− menuAction.activate(false);
94− }
95 }
90 }
96}
91}
plugins/Unity/IndicatorsLegacy/Messaging/qml/HeroMessage.qml → plugins/Unity/Indicators/Messaging/qml/HeroMessage.qmlrenamed+25−22
@@ -20,25 +20,30 @@
20
20
21import QtQuick 2.0
21import QtQuick 2.0
22import Ubuntu.Components 0.1
22import Ubuntu.Components 0.1
23−import Unity.IndicatorsLegacy 0.1 as Indicators
23+import Unity.Indicators 0.1 as Indicators
24
24
25−Indicators.BasicMenuItem {
25+Indicators.BaseMenuItem {
26 id: heroMessage
26 id: heroMessage
27
27
28− property variant actionsDescription: null
29 property alias heroMessageHeader: __heroMessageHeader
28 property alias heroMessageHeader: __heroMessageHeader
30 property real collapsedHeight: heroMessageHeader.y + heroMessageHeader.bodyBottom + units.gu(2)
29 property real collapsedHeight: heroMessageHeader.y + heroMessageHeader.bodyBottom + units.gu(2)
31 property real expandedHeight: collapsedHeight
30 property real expandedHeight: collapsedHeight
32
31
33− color: "#221e1c"
32+ property alias avatar: __heroMessageHeader.avatar
33+ property alias appIcon: __heroMessageHeader.icon
34+
35+ signal activateApp
36+ signal dismiss
34
37
35 removable: state !== "expanded"
38 removable: state !== "expanded"
36 implicitHeight: collapsedHeight
39 implicitHeight: collapsedHeight
37
40
38− Indicators.MenuAction {
41+ Rectangle {
39− id: menuAction
42+ id: background
40− actionGroup: heroMessage.actionGroup
43+ property real alpha: 0.0
41− action: menu ? menu.action : ""
44+ anchors.fill: parent
45+ color: Qt.rgba(1.0, 1.0, 1.0, alpha)
46+ z: -1
42 }
47 }
43
48
44 HeroMessageHeader {
49 HeroMessageHeader {
@@ -48,25 +53,22 @@ Indicators.BasicMenuItem {
48 anchors.left: parent.left
53 anchors.left: parent.left
49 anchors.right: parent.right
54 anchors.right: parent.right
50
55
51− avatar: menu && (menu.extra.canonical_icon.length > 0) ? "image://theme/" + encodeURI(menu.extra.canonical_icon) : "qrc:/indicators/artwork/messaging/default_contact.png"
56+ avatar: "qrc:/indicators/artwork/messaging/default_contact.png"
52− icon: menu && (menu.extra.canonical_app_icon.length > 0) ? "image://theme/" + encodeURI(menu.extra.canonical_app_icon) : ""
53 appIcon: icon
57 appIcon: icon
54
58
55 state: heroMessage.state
59 state: heroMessage.state
56
60
57 onAppIconClicked: {
61 onAppIconClicked: {
58− if (menuAction.valid) {
62+ deselectMenu();
59− deactivateMenu();
63+ heroMessage.activateApp();
60− action.activate(true);
61− }
62 }
64 }
63 }
65 }
64
66
65 onClicked: {
67 onClicked: {
66− if (menuActivated) {
68+ if (menuSelected) {
67− deactivateMenu();
69+ deselectMenu();
68 } else {
70 } else {
69− activateMenu();
71+ selectMenu();
70 }
72 }
71 }
73 }
72
74
@@ -84,13 +86,16 @@ Indicators.BasicMenuItem {
84
86
85 states: State {
87 states: State {
86 name: "expanded"
88 name: "expanded"
87− when: menuActivated
89+ when: menuSelected
88
90
89 PropertyChanges {
91 PropertyChanges {
90 target: heroMessage
92 target: heroMessage
91− color: "#333130"
92 implicitHeight: heroMessage.expandedHeight
93 implicitHeight: heroMessage.expandedHeight
93 }
94 }
95+ PropertyChanges {
96+ target: background
97+ alpha: 0.05
98+ }
94 PropertyChanges {
99 PropertyChanges {
95 target: __topHLine
100 target: __topHLine
96 opacity: 0.0
101 opacity: 0.0
@@ -113,8 +118,6 @@ Indicators.BasicMenuItem {
113 }
118 }
114
119
115 onItemRemoved: {
120 onItemRemoved: {
116− if (menuAction.valid) {
121+ heroMessage.dismiss();
117− menuAction.activate(false);
118− }
119 }
122 }
120}
123}
plugins/Unity/IndicatorsLegacy/Messaging/qml/HeroMessageHeader.qml → plugins/Unity/Indicators/Messaging/qml/HeroMessageHeader.qmlrenamed

The content is the same.

plugins/Unity/Indicators/Messaging/qml/MessageMenuItemFactory.qmlnew file+180
@@ -0,0 +1,180 @@
1+/*
2+ * Copyright 2013 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+ * Authors:
17+ * Renato Araujo Oliveira Filho <renato@canonical.com>
18+ * Olivier Tilloy <olivier.tilloy@canonical.com>
19+ */
20+
21+import QtQuick 2.0
22+import Ubuntu.Components 0.1
23+import Unity.Indicators 0.1 as Indicators
24+import QMenuModel 0.1 as QMenuModel
25+import "utils.js" as Utils
26+
27+Indicators.BaseMenuItem {
28+ id: menuItem
29+ property var actionsDescription: menu ? menu.ext.xCanonicalMessageActions : undefined
30+
31+ implicitHeight: contents.status == Loader.Ready ? contents.item.implicitHeight : 0
32+
33+ property var model: null
34+
35+ Loader {
36+ id: contents
37+ anchors.fill: parent
38+
39+ sourceComponent: loadMessage(actionsDescription);
40+
41+ // Binding all properties for the item, to make sure that any change in the
42+ // property will be propagated to the contents.item at any time
43+ Binding {
44+ target: contents.item
45+ property: "menuSelected"
46+ value: menuSelected
47+ when: (contents.status == Loader.Ready)
48+ }
49+
50+ Binding {
51+ target: contents.item
52+ property: "menu"
53+ value: menu
54+ when: (contents.status == Loader.Ready)
55+ }
56+
57+ Connections {
58+ target: contents.item ? contents.item : null
59+ onSelectMenu: selectMenu()
60+ onDeselectMenu: deselectMenu()
61+ }
62+
63+ Component {
64+ id: simpleTextMessage
65+ SimpleTextMessage {
66+ // text
67+ title: menu && menu.label ? menu.label : ""
68+ time: menu ? Utils.formatDate(menu.ext.xCanonicalTime) : ""
69+ message: menu && menu.ext.xCanonicalText ? menu.ext.xCanonicalText : ""
70+ // icons
71+ avatar: menu && menu.ext.icon !== undefined ? menu.ext.icon : "qrc:/indicators/artwork/messaging/default_contact.png"
72+ appIcon: menu && menu.ext.xCanonicalAppIcon !== undefined ? menu.ext.xCanonicalAppIcon : "qrc:/indicators/artwork/messaging/default_app.svg"
73+
74+ onActivateApp: {
75+ menuItem.model.activate(modelIndex, true);
76+ }
77+ onDismiss: {
78+ menuItem.model.activate(modelIndex, false);
79+ }
80+ }
81+ }
82+ Component {
83+ id: textMessage
84+ TextMessage {
85+ property var replyAction: QMenuModel.UnityMenuAction {
86+ model: menuItem.model
87+ index: modelIndex
88+ name: menu && actionsDescription[0].name ? actionsDescription[0].name : ""
89+ }
90+
91+ // text
92+ title: menu && menu.label ? menu.label : ""
93+ time: menu ? Utils.formatDate(menu.ext.xCanonicalTime) : ""
94+ message: menu && menu.ext.xCanonicalText ? menu.ext.xCanonicalText : ""
95+ replyButtonText: actionsDescription && actionsDescription[0].label ? actionsDescription[0].label : "Send"
96+ // icons
97+ avatar: menu && menu.ext.icon !== undefined ? menu.ext.icon : "qrc:/indicators/artwork/messaging/default_contact.png"
98+ appIcon: menu && menu.ext.xCanonicalAppIcon !== undefined ? menu.ext.xCanonicalAppIcon : "qrc:/indicators/artwork/messaging/default_app.svg"
99+ // actions
100+ replyEnabled: replyAction.valid && replyAction.enabled
101+
102+ onActivateApp: {
103+ menuItem.model.activate(modelIndex, true);
104+ }
105+ onDismiss: {
106+ menuItem.model.activate(modelIndex, false);
107+ }
108+ onReply: {
109+ replyAction.activate(value);
110+ }
111+ }
112+ }
113+ Component {
114+ id: snapDecision
115+ SnapDecision {
116+ property var activateAction: QMenuModel.UnityMenuAction {
117+ model: menuItem.model
118+ index: modelIndex
119+ name: menu && actionsDescription[0].name ? actionsDescription[0].name : ""
120+ }
121+ property var replyAction: QMenuModel.UnityMenuAction {
122+ model: menuItem.model
123+ index: modelIndex
124+ name: menu && actionsDescription[1].name ? actionsDescription[1].name : ""
125+ }
126+
127+ // text
128+ title: menu && menu.label ? menu.label : ""
129+ time: menu ? Utils.formatDate(menu.ext.xCanonicalTime) : ""
130+ message: menu && menu.ext.xCanonicalText ? menu.ext.xCanonicalText : ""
131+ actionButtonText: actionsDescription && actionsDescription[0].label ? actionsDescription[0].label : "Call back"
132+ replyButtonText: actionsDescription && actionsDescription[1].label ? actionsDescription[1].label : "Send"
133+ replyMessages: actionsDescription && actionsDescription[1]["parameter-hint"] ? actionsDescription[1]["parameter-hint"] : ""
134+ // icons
135+ avatar: menu && menu.ext.icon !== undefined ? menu.ext.icon : "qrc:/indicators/artwork/messaging/default_contact.png"
136+ appIcon: menu && menu.ext.xCanonicalAppIcon !== undefined ? menu.ext.xCanonicalAppIcon : "qrc:/indicators/artwork/messaging/default_app.svg"
137+ // actions
138+ activateEnabled: activateAction.valid && activateAction.enabled
139+ replyEnabled: replyAction.valid && replyAction.enabled
140+
141+ onActivateApp: {
142+ menuItem.model.activate(modelIndex, true);
143+ }
144+ onDismiss: {
145+ menuItem.model.activate(modelIndex, false);
146+ }
147+ onActivate: {
148+ activateAction.activate();
149+ }
150+ onReply: {
151+ replyAction.activate(value);
152+ }
153+ }
154+ }
155+ }
156+
157+ function loadMessage(actions)
158+ {
159+ var parameterType = ""
160+ for (var actIndex in actions) {
161+ var desc = actions[actIndex];
162+ if (desc["parameter-type"] !== undefined) {
163+ parameterType += desc["parameter-type"];
164+ } else {
165+ parameterType += "_";
166+ }
167+ }
168+
169+ if (parameterType === "") {
170+ return simpleTextMessage;
171+ } else if (parameterType === "s") {
172+ return textMessage;
173+ } else if (parameterType === "_s") {
174+ return snapDecision;
175+ } else {
176+ console.debug("Unknown paramater type: " + parameterType);
177+ }
178+ return undefined;
179+ }
180+}
plugins/Unity/IndicatorsLegacy/Messaging/qml/QuickReply.qml → plugins/Unity/Indicators/Messaging/qml/QuickReply.qmlrenamed+11−6
@@ -20,15 +20,16 @@
20
20
21import QtQuick 2.0
21import QtQuick 2.0
22import Ubuntu.Components 0.1
22import Ubuntu.Components 0.1
23−import Unity.IndicatorsLegacy 0.1 as Indicators
23+import Unity.Indicators 0.1 as Indicators
24
24
25Item {
25Item {
26− property alias actionGroup: actionTextField.actionGroup
26+ id: quickReply
27− property alias action: actionTextField.action
28−
29 property alias buttonText: actionTextField.buttonText
27 property alias buttonText: actionTextField.buttonText
30 property real expandedHeight: childrenRect.height
28 property real expandedHeight: childrenRect.height
31 property alias messages : messagelistRepeater.model
29 property alias messages : messagelistRepeater.model
30+ property alias replyEnabled: actionTextField.activateEnabled
31+
32+ signal reply(var value)
32
33
33 Item {
34 Item {
34 id: header
35 id: header
@@ -83,10 +84,9 @@ Item {
83
84
84 height: childrenRect.height
85 height: childrenRect.height
85
86
86− Rectangle {
87+ Item {
87 width: messagelist.width
88 width: messagelist.width
88 height: units.gu(5)
89 height: units.gu(5)
89− color: "#333230"
90
90
91 Label {
91 Label {
92 id: __label
92 id: __label
@@ -150,6 +150,11 @@ Item {
150
150
151 anchors.fill: parent
151 anchors.fill: parent
152 anchors.margins: units.gu(1)
152 anchors.margins: units.gu(1)
153+ activateEnabled: replyEnabled
154+
155+ onActivate: {
156+ quickReply.reply(value)
157+ }
153 }
158 }
154
159
155 Indicators.HLine {
160 Indicators.HLine {
plugins/Unity/IndicatorsLegacy/Messaging/qml/SimpleTextMessage.qml → plugins/Unity/Indicators/Messaging/qml/SimpleTextMessage.qmlrenamed+7−4
@@ -20,17 +20,20 @@
20
20
21import QtQuick 2.0
21import QtQuick 2.0
22import Ubuntu.Components 0.1
22import Ubuntu.Components 0.1
23−import "utils.js" as Utils
24
23
25HeroMessage {
24HeroMessage {
26 id: __heroMessage
25 id: __heroMessage
27
26
27+ property string title: ""
28+ property string time: ""
29+ property string message: ""
30+
28 property alias footer: footerLoader.sourceComponent
31 property alias footer: footerLoader.sourceComponent
29
32
30 expandedHeight: fullMessage.y + fullMessage.height + units.gu(2)
33 expandedHeight: fullMessage.y + fullMessage.height + units.gu(2)
31− heroMessageHeader.titleText.text: menu ? menu.label : ""
34+ heroMessageHeader.titleText.text: title
32− heroMessageHeader.subtitleText.text: menu ? Utils.formatDate(menu.extra.canonical_time) : ""
35+ heroMessageHeader.subtitleText.text: time
33− heroMessageHeader.bodyText.text: menu ? menu.extra.canonical_text : ""
36+ heroMessageHeader.bodyText.text: message
34
37
35 Item {
38 Item {
36 id: fullMessage
39 id: fullMessage
plugins/Unity/IndicatorsLegacy/Messaging/qml/SnapDecision.qml → plugins/Unity/Indicators/Messaging/qml/SnapDecision.qmlrenamed+33−14
@@ -20,19 +20,33 @@
20
20
21import QtQuick 2.0
21import QtQuick 2.0
22import Ubuntu.Components 0.1
22import Ubuntu.Components 0.1
23−import Unity.IndicatorsLegacy 0.1 as Indicators
23+import Unity.Indicators 0.1 as Indicators
24import "utils.js" as Utils
24import "utils.js" as Utils
25
25
26HeroMessage {
26HeroMessage {
27 id: snapDecision
27 id: snapDecision
28
28
29+ property string title: ""
30+ property string time: ""
31+ property string message: ""
32+
33+ property bool activateEnabled: true
34+ property alias actionButtonText: actionButton.text
35+
36+ property bool replyEnabled: true
37+ property alias replyMessages: quickreply.messages
38+ property alias replyButtonText: quickreply.buttonText
39+
29 expandedHeight: buttons.y + buttons.height + quickreply.height + units.gu(2)
40 expandedHeight: buttons.y + buttons.height + quickreply.height + units.gu(2)
30− heroMessageHeader.titleText.text: menu ? menu.label : ""
41+ heroMessageHeader.titleText.text: title
31− heroMessageHeader.subtitleText.text: menu ? menu.extra.canonical_text : ""
42+ heroMessageHeader.subtitleText.text: message
32 heroMessageHeader.subtitleText.color: "#e8e1d0"
43 heroMessageHeader.subtitleText.color: "#e8e1d0"
33− heroMessageHeader.bodyText.text: menu ? Utils.formatDate(menu.extra.canonical_time) : ""
44+ heroMessageHeader.bodyText.text: time
34 heroMessageHeader.bodyText.color: "#8f8f88"
45 heroMessageHeader.bodyText.color: "#8f8f88"
35
46
47+ signal activate
48+ signal reply(string value)
49+
36 Item {
50 Item {
37 id: buttons
51 id: buttons
38
52
@@ -62,16 +76,19 @@ HeroMessage {
62 }
76 }
63 }
77 }
64
78
65− ActionButton {
79+ Button {
66− actionGroup: snapDecision.actionGroup
80+ id: actionButton
67− action: actionsDescription[0].name
81+ text: "Call back"
68−
69− text: actionsDescription ? actionsDescription[0].label : "Call back"
70− color: "#c94212"
82+ color: enabled ? "#c94212" : "#bababa"
71 anchors.right: parent.right
83 anchors.right: parent.right
72 anchors.top: parent.top
84 anchors.top: parent.top
73 anchors.bottom: parent.bottom
85 anchors.bottom: parent.bottom
74 width: (parent.width - units.gu(1)) / 2
86 width: (parent.width - units.gu(1)) / 2
87+ enabled: snapDecision.activateEnabled
88+
89+ onClicked: {
90+ snapDecision.activate();
91+ }
75 }
92 }
76
93
77 states: State {
94 states: State {
@@ -95,11 +112,12 @@ HeroMessage {
95 QuickReply {
112 QuickReply {
96 id: quickreply
113 id: quickreply
97
114
115+ onReply: {
98− actionGroup: snapDecision.actionGroup
116+ snapDecision.reply(value);
99− action: actionsDescription[1].name
117+ }
100
118
101− messages: actionsDescription ? actionsDescription[1]["parameter-hint"] : ""
119+ messages: ""
102− buttonText: actionsDescription ? actionsDescription[1].label : "send"
120+ buttonText: "Send"
103 anchors {
121 anchors {
104 top: buttons.bottom
122 top: buttons.bottom
105 topMargin: units.gu(2)
123 topMargin: units.gu(2)
@@ -109,6 +127,7 @@ HeroMessage {
109 height: 0
127 height: 0
110 opacity: 0.0
128 opacity: 0.0
111 enabled: false
129 enabled: false
130+ replyEnabled: snapDecision.replyEnabled
112
131
113 states: State {
132 states: State {
114 name: "expanded"
133 name: "expanded"
plugins/Unity/IndicatorsLegacy/Messaging/qml/TextMessage.qml → plugins/Unity/Indicators/Messaging/qml/TextMessage.qmlrenamed+12−4
@@ -20,16 +20,24 @@
20
20
21import QtQuick 2.0
21import QtQuick 2.0
22import Ubuntu.Components 0.1
22import Ubuntu.Components 0.1
23−import Unity.IndicatorsLegacy 0.1 as Indicators
23+import Unity.Indicators 0.1 as Indicators
24
24
25SimpleTextMessage {
25SimpleTextMessage {
26 id: simpleMessage
26 id: simpleMessage
27
27
28+ property bool replyEnabled: false
29+ property string replyButtonText: "Send"
30+
31+ signal reply(string value)
32+
28 footer: ActionTextField {
33 footer: ActionTextField {
29 anchors.fill: parent
34 anchors.fill: parent
30− actionGroup: simpleMessage.actionGroup
31− action: actionsDescription[0].name
32
35
33− buttonText: actionsDescription ? actionsDescription[0].label : "Send"
36+ activateEnabled: simpleMessage.replyEnabled
37+ buttonText: simpleMessage.replyButtonText
38+
39+ onActivate: {
40+ simpleMessage.reply(value);
41+ }
34 }
42 }
35}
43}
plugins/Unity/IndicatorsLegacy/Messaging/qml/qmldir → plugins/Unity/Indicators/Messaging/qml/qmldirrenamed+2−2
@@ -1,11 +1,11 @@
1−module Unity.IndicatorsLegacy.Messaging
1+module Unity.Indicators.Messaging
2
2
3ActionButton 0.1 ActionButton.qml
3ActionButton 0.1 ActionButton.qml
4ActionTextField 0.1 ActionTextField.qml
4ActionTextField 0.1 ActionTextField.qml
5GroupedMessage 0.1 GroupedMessage.qml
5GroupedMessage 0.1 GroupedMessage.qml
6HeroMessage 0.1 HeroMessage.qml
6HeroMessage 0.1 HeroMessage.qml
7HeroMessageHeader 0.1 HeroMessageHeader.qml
7HeroMessageHeader 0.1 HeroMessageHeader.qml
8−MessageMenuItem 0.1 MessageMenuItem.qml
8+MessageMenuItemFactory 0.1 MessageMenuItemFactory.qml
9QuickReply 0.1 QuickReply.qml
9QuickReply 0.1 QuickReply.qml
10SimpleTextMessage 0.1 SimpleTextMessage.qml
10SimpleTextMessage 0.1 SimpleTextMessage.qml
11SnapDecision 0.1 SnapDecision.qml
11SnapDecision 0.1 SnapDecision.qml
plugins/Unity/IndicatorsLegacy/Messaging/qml/utils.js → plugins/Unity/Indicators/Messaging/qml/utils.jsrenamed

The content is the same.

plugins/Unity/Indicators/Network/CMakeLists.txt−44
@@ -1,45 +1 @@
1−# export_qmlplugin macro
2−include(Plugins)
3−
4−project(IndicatorsNetworkQml)
5−
6−pkg_check_modules(GLIB glib-2.0>=2.32)
7−pkg_check_modules(LIBNM_GLIB libnm-glib>=0.9.6)
8−pkg_check_modules(LIBNM_UTIL libnm-util>=0.9.6)
9−
10−if(LIBNM_GLIB_FOUND AND LIBNM_UTIL_FOUND AND GLIB_FOUND)
11− set(INDICATORS_NETWORK_SRC
12− networkagent.cpp
13− plugin.cpp
14− secret-agent.c
15− )
16−
17− add_library(IndicatorsNetworkQml MODULE
18− ${INDICATORS_NETWORK_SRC}
19− )
20−
21− qt5_use_modules(IndicatorsNetworkQml Core Qml Widgets)
22−
23− set_target_properties(IndicatorsNetworkQml PROPERTIES COMPILE_FLAGS -fPIC)
24−
25− include_directories(
26− ${CMAKE_CURRENT_SOURCE_DIR}
27− ${GLIB_INCLUDE_DIRS}
28− ${LIBNM_GLIB_INCLUDE_DIRS}
29− ${LIBNM_UTIL_INCLUDE_DIRS}
30− )
31−
32− target_link_libraries(IndicatorsNetworkQml
33− ${GLIB_LIBRARIES}
34− ${LIBNM_GLIB_LIBRARIES}
35− ${LIBNM_UTIL_LIBRARIES}
36− )
37−
38− # export the qmltypes and plugin files
39− export_qmlplugin(Unity.Indicators.Network 0.1 Unity/Indicators/Network TARGETS IndicatorsNetworkQml)
40−
41−else()
42− message(WARNING "Missing glib or libnm dependency for the network plugin, not building")
43−endif()
44−
45add_subdirectory(qml)
1add_subdirectory(qml)
plugins/Unity/Indicators/Network/networkagent.cppdeleted−146
@@ -1,146 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Alberto Ruiz <alberto.ruiz@canonical.com>
18− * Renato Araujo Oliveira Filho <renato@canonical.com>
19− */
20−
21−#include "networkagent.h"
22−
23−#include <QVariant>
24−#include <QApplication>
25−#include <QDebug>
26−
27−class NetworkAgentToken
28−{
29−public:
30− NMConnection *connection;
31− NMSettingWirelessSecurity *wisec;
32− guint id;
33− QByteArray keyMgmt;
34−
35− NetworkAgentToken(NMConnection *connection,
36− NMSettingWirelessSecurity *wisec,
37− guint id,
38− QByteArray keyMgmt)
39− : connection(connection),
40− wisec(wisec),
41− id(id),
42− keyMgmt(keyMgmt)
43− {
44− if (connection) {
45− g_object_ref(connection);
46− } else {
47− qWarning() << "invalid connection object";
48− }
49− }
50−
51− ~NetworkAgentToken()
52− {
53− if (connection) {
54− g_object_unref(connection);
55− }
56− }
57−};
58−
59−NetworkAgent::NetworkAgent(QObject *parent)
60− : QObject(parent)
61−{
62− m_agent = unity_settings_secret_agent_new();
63− g_signal_connect(G_OBJECT(m_agent),
64− UNITY_SETTINGS_SECRET_AGENT_SECRET_REQUESTED,
65− G_CALLBACK(onSecretRequested),
66− this);
67−
68− g_signal_connect(G_OBJECT(m_agent),
69− UNITY_SETTINGS_SECRET_AGENT_REQUEST_CANCELLED,
70− G_CALLBACK(onSecretRequestCancelled),
71− this);
72−}
73−
74−NetworkAgent::~NetworkAgent()
75−{
76− nm_secret_agent_unregister(NM_SECRET_AGENT(m_agent));
77− g_object_unref(m_agent);
78−}
79−
80−void NetworkAgent::authenticate(const QVariant &token, const QString &key)
81−{
82− NetworkAgentToken *pToken = (NetworkAgentToken *) token.value<void *>();
83− if (pToken == NULL) {
84− return;
85− }
86−
87− if ((pToken->keyMgmt == "wpa-none") || (pToken->keyMgmt == "wpa-psk")) {
88− g_object_set(G_OBJECT(pToken->wisec),
89− NM_SETTING_WIRELESS_SECURITY_PSK, qPrintable(key),
90− NULL);
91− } else if (pToken->keyMgmt == "none") {
92− g_object_set(G_OBJECT(pToken->wisec),
93− NM_SETTING_WIRELESS_SECURITY_WEP_KEY0, qPrintable(key),
94− NULL);
95− }
96−
97− GHashTable *settings = nm_connection_to_hash(pToken->connection,
98− NM_SETTING_HASH_FLAG_ALL);
99−
100− unity_settings_secret_agent_provide_secret(m_agent,
101− pToken->id, settings);
102− g_hash_table_unref(settings);
103− delete pToken;
104−}
105−
106−void NetworkAgent::cancel(const QVariant &token)
107−{
108− NetworkAgentToken *pToken = (NetworkAgentToken *) token.value<void *>();
109− if (pToken != NULL) {
110− unity_settings_secret_agent_cancel_request(m_agent, pToken->id);
111− delete pToken;
112− }
113−}
114−
115−void NetworkAgent::onSecretRequested(UnitySettingsSecretAgent* /*agent*/,
116− guint id,
117− NMConnection* connection,
118− const char* /*setting_name*/,
119− const char** /*hints*/,
120− NMSecretAgentGetSecretsFlags /*flags*/,
121− NetworkAgent* self)
122−{
123− NetworkAgentToken *token = new NetworkAgentToken(connection,
124− NULL,
125− id,
126− NULL);
127−
128− token->wisec = nm_connection_get_setting_wireless_security(connection);
129− if (token->wisec) {
130− token->keyMgmt = nm_setting_wireless_security_get_key_mgmt(token->wisec);
131− }
132−
133− QVariant varToken = qVariantFromValue((void *) token);
134− Q_EMIT self->secretRequested(varToken);
135−}
136−
137−void NetworkAgent::onSecretRequestCancelled(UnitySettingsSecretAgent* /*agent*/,
138− guint /*id*/,
139− NMConnection* /*connection*/,
140− const char* /*setting_name*/,
141− const char** /*hints*/,
142− NMSecretAgentGetSecretsFlags /*flags*/,
143− NetworkAgent* /*self*/)
144−{
145− //Do nothing for now
146−}
plugins/Unity/Indicators/Network/networkagent.hdeleted−65
@@ -1,65 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Alberto Ruiz <alberto.ruiz@canonical.com>
18− * Renato Araujo Oliveira Filho <renato@canonical.com>
19− */
20−
21−#ifndef NETWORKAGENT_H
22−#define NETWORKAGENT_H
23−
24−#include "secret-agent.h"
25−
26−#include <QObject>
27−
28−class NetworkAgentToken;
29−
30−class NetworkAgent : public QObject
31−{
32− Q_OBJECT
33−public:
34− NetworkAgent(QObject *parent=0);
35− ~NetworkAgent();
36−
37− Q_INVOKABLE void authenticate(const QVariant &token, const QString &key);
38− Q_INVOKABLE void cancel(const QVariant &token);
39−
40−Q_SIGNALS:
41− void secretRequested(const QVariant &token);
42− void secretRequestCancelled();
43−
44−private:
45− UnitySettingsSecretAgent *m_agent;
46−
47− static void onSecretRequested(UnitySettingsSecretAgent *agent,
48− guint id,
49− NMConnection *connection,
50− const char *setting_name,
51− const char **hints,
52− NMSecretAgentGetSecretsFlags flags,
53− NetworkAgent *self);
54−
55− static void onSecretRequestCancelled(UnitySettingsSecretAgent *agent,
56− guint id,
57− NMConnection *connection,
58− const char *setting_name,
59− const char **hints,
60− NMSecretAgentGetSecretsFlags flags,
61− NetworkAgent *self);
62−
63−};
64−
65−#endif
plugins/Unity/Indicators/Network/plugin.hdeleted−32
@@ -1,32 +0,0 @@
1−/*
2− * Copyright (C) 2012 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− * Author: Nick Dedekind <nick.dedekind@canonical.com>
17− */
18−
19−#ifndef INDICATORS_NETWORK_PLUGIN_H
20−#define INDICATORS_NETWORK_PLUGIN_H
21−
22−#include <QtQml/QQmlExtensionPlugin>
23−
24−class IndicatorsNetworkPlugin : public QQmlExtensionPlugin
25−{
26− Q_OBJECT
27− Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28−public:
29− void registerTypes(const char *uri);
30−};
31−
32−#endif // INDICATORS_NETWORK_PLUGIN_H
plugins/Unity/Indicators/Network/qml/PasswordPage.qmldeleted−88
@@ -1,88 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−import Ubuntu.Components.ListItems 0.1 as ListItem
23−import Unity.Indicators 0.1 as Indicators
24−
25−Page {
26− id: pagePassword
27−
28− property variant agent
29− property variant token
30−
31− anchors.fill: parent
32− title: "Network Authentication"
33−
34− Column {
35− anchors {
36− left: parent.left
37− right: parent.right
38− }
39−
40− Indicators.SectionMenuItem {
41− text: "Authentication"
42− }
43−
44− Indicators.FramedMenuItem {
45− implicitHeight: password.height + units.gu(1)
46−
47− PasswordTextField {
48− id: password
49− anchors {
50− left: parent.left
51− right: parent.right
52− margins: units.gu(3)
53− verticalCenter: parent.verticalCenter
54− }
55− }
56− }
57−
58− Indicators.FramedMenuItem {
59− Row {
60− anchors {
61− right: parent.right
62− verticalCenter: parent.verticalCenter
63− margins: units.gu(3)
64− }
65−
66− spacing: units.gu(1)
67−
68− Button {
69− text: "Cancel"
70− width: units.gu(10)
71− onClicked: {
72− agent.cancel(token);
73− pageStack.pop();
74− }
75− }
76−
77− Button {
78− text: "OK"
79− width: units.gu(10)
80− onClicked: {
81− agent.authenticate(token, password.text);
82− pageStack.pop();
83− }
84− }
85− }
86− }
87− }
88−}
plugins/Unity/Indicators/Network/qml/PasswordTextField.qmldeleted−68
@@ -1,68 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−
23−Item {
24− id: textMenu
25−
26− property alias text: textField.text
27−
28− height: contentColumn.height
29−
30− Column {
31− id: contentColumn
32− spacing: units.gu(0.5)
33− anchors {
34− left: parent.left
35− right: parent.right
36− }
37−
38− TextField {
39− id: textField
40−
41− anchors {
42− left: parent.left
43− right: parent.right
44− }
45−
46− placeholderText: "Password"
47− echoMode: showPassword.checked ? TextInput.Normal : TextInput.Password
48− }
49−
50− Row {
51− anchors {
52− left: parent.left
53− right: parent.right
54− }
55−
56− spacing: units.gu(1)
57−
58− CheckBox {
59− id: showPassword
60− }
61−
62− Label {
63− text: "Show password"
64− anchors.verticalCenter: showPassword.verticalCenter
65− }
66− }
67− }
68−}
plugins/Unity/Indicators/Network/qml/qmldir−5
@@ -1,8 +1,3 @@
1module Unity.Indicators.Network
1module Unity.Indicators.Network
2−plugin IndicatorsNetworkQml
3−typeinfo plugin.qmltypes
4
2
5−NetworkPage 0.1 NetworkPage.qml
6AccessPoint 0.1 AccessPoint.qml
3AccessPoint 0.1 AccessPoint.qml
7−PasswordPage 0.1 PasswordPage.qml
8−PasswordTextField 0.1 PasswordTextField.qml
plugins/Unity/Indicators/Network/secret-agent.cdeleted−382
@@ -1,382 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Alberto Ruiz <alberto.ruiz@canonical.com>
18− * Renato Araujo Oliveira Filho <renato@canonical.com>
19− */
20−
21−
22−#include <glib.h>
23−#include <glib-object.h>
24−#include <nm-secret-agent.h>
25−#include "secret-agent.h"
26−
27−#define UNITY_SETTINGS_TYPE_SECRET_AGENT (unity_settings_secret_agent_get_type ())
28−#define UNITY_SETTINGS_SECRET_AGENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgent))
29−#define UNITY_SETTINGS_SECRET_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgentClass))
30−#define UNITY_SETTINGS_IS_SECRET_AGENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), UNITY_SETTINGS_TYPE_SECRET_AGENT))
31−#define UNITY_SETTINGS_IS_SECRET_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), UNITY_SETTINGS_TYPE_SECRET_AGENT))
32−#define UNITY_SETTINGS_SECRET_AGENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgentClass))
33−#define UNITY_SETTINGS_SECRET_AGENT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgentPrivate))
34−
35−#define AGENT_ID "com.canonical.settings.network.nm-agent"
36−
37−static gpointer unity_settings_secret_agent_parent_class = NULL;
38−
39−typedef struct _UnitySettingsSecretAgentPrivate UnitySettingsSecretAgentPrivate;
40−
41−struct _UnitySettingsSecretAgentPrivate {
42− GQueue *requests;
43−};
44−
45−typedef struct _SecretRequest {
46− gint id;
47− NMSecretAgent *agent;
48− NMConnection *connection;
49− const char *connection_path;
50− const char *setting_name;
51− const char **hints;
52− NMSecretAgentGetSecretsFlags flags;
53− NMSecretAgentGetSecretsFunc callback;
54− gpointer callback_data;
55−} SecretRequest;
56−
57−GType unity_settings_secret_agent_get_type (void) G_GNUC_CONST;
58−enum {
59− UNITY_SETTINGS_SECRET_AGENT_DUMMY_PROPERTY
60−};
61−
62−enum {
63− SECRET_REQUESTED,
64− REQUEST_CANCELLED,
65− LAST_SIGNAL
66−};
67−
68−static guint signals[LAST_SIGNAL] = { 0 };
69−
70−UnitySettingsSecretAgent* unity_settings_secret_agent_new (void);
71−UnitySettingsSecretAgent* unity_settings_secret_agent_construct (GType object_type);
72−
73−int
74−secret_request_find (SecretRequest *req,
75− guint *id)
76−{
77− if (req->id > *id)
78− return -1;
79−
80− if (req->id < *id)
81− return 1;
82−
83− return 0;
84−}
85−
86−void
87−unity_settings_secret_agent_provide_secret (UnitySettingsSecretAgent *agent,
88− guint request,
89− GHashTable *secrets)
90−{
91− GList *iter;
92− SecretRequest *req;
93− UnitySettingsSecretAgentPrivate *priv = agent->priv;
94−
95− iter = g_queue_find_custom (priv->requests,
96− &request,
97− (GCompareFunc)secret_request_find);
98−
99− if (iter == NULL || iter->data == NULL)
100− {
101− g_warning ("Secret request with id <%d> was not found", (int)request);
102− return;
103− }
104−
105− req = iter->data;
106−
107− req->callback (NM_SECRET_AGENT (agent),
108− req->connection,
109− secrets,
110− NULL,
111− req->callback_data);
112−
113− g_queue_remove_all (priv->requests, req);
114− g_free (req);
115− return;
116−}
117−
118−void
119−free_request (SecretRequest *req)
120−{
121− g_object_unref (req->connection);
122− g_free (req);
123−}
124−
125−void
126−unity_settings_secret_agent_cancel_request (UnitySettingsSecretAgent *agent,
127− guint request)
128−{
129− GList *iter;
130− SecretRequest *req;
131− UnitySettingsSecretAgentPrivate *priv = agent->priv;
132− GError *error;
133−
134− iter = g_queue_find_custom (priv->requests,
135− &request,
136− (GCompareFunc)secret_request_find);
137−
138− if (iter == NULL || iter->data == NULL)
139− {
140− g_warning ("Secret request with id <%d> was not found", (int)request);
141− return;
142− }
143−
144− req = iter->data;
145− error = g_error_new (NM_SECRET_AGENT_ERROR,
146− NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
147− "This secret request was canceled by the user.");
148−
149− req->callback (NM_SECRET_AGENT (agent),
150− req->connection,
151− NULL,
152− error,
153− req->callback_data);
154−
155− g_queue_remove_all (priv->requests, req);
156− free_request (req);
157− return;
158−}
159−
160−static void
161−delete_secrets (NMSecretAgent *agent,
162− NMConnection *connection,
163− const char *connection_path,
164− NMSecretAgentDeleteSecretsFunc callback,
165− gpointer callback_data)
166−{
167− g_debug ("delete secrets");
168−}
169−
170−/* If it returns G_MAXUINT it's considered an error */
171−static guint
172−find_available_id (UnitySettingsSecretAgentPrivate *priv)
173−{
174− guint i = 0;
175− guint candidate = 0;
176−
177− if (g_queue_get_length (priv->requests) == G_MAXUINT)
178− return G_MAXUINT;
179−
180− while (i < g_queue_get_length (priv->requests))
181− {
182− SecretRequest *req = (SecretRequest*)g_queue_peek_nth (priv->requests, i);
183−
184− if (req->id == candidate)
185− {
186− candidate++;
187− i = 0;
188− }
189− else
190− {
191− i++;
192− }
193− }
194−
195− return i;
196−}
197−
198−static void
199−get_secrets (NMSecretAgent *agent,
200− NMConnection *connection,
201− const char *connection_path,
202− const char *setting_name,
203− const char **hints,
204− NMSecretAgentGetSecretsFlags flags,
205− NMSecretAgentGetSecretsFunc callback,
206− gpointer callback_data)
207−{
208− guint id;
209− UnitySettingsSecretAgentPrivate *priv = UNITY_SETTINGS_SECRET_AGENT_GET_PRIVATE (agent);
210− SecretRequest *req = NULL;
211−
212− if (flags == NM_SECRET_AGENT_GET_SECRETS_FLAG_NONE)
213− {
214− GError *error = g_error_new (NM_SECRET_AGENT_ERROR,
215− NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
216− "No password found for this connection.");
217− callback (agent, connection, NULL, error, callback_data);
218− g_error_free (error);
219− return;
220− }
221−
222− id = find_available_id (priv);
223− if (id == G_MAXUINT)
224− {
225− GError *error = g_error_new (NM_SECRET_AGENT_ERROR,
226− NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
227− "Reached maximum number of requests.");
228− callback (agent, connection, NULL, error, callback_data);
229− g_error_free (error);
230− return;
231− }
232−
233− /* Adding a request */
234− req = (SecretRequest*) g_malloc0 (sizeof (SecretRequest));
235− *req = ((SecretRequest)
236− { id,
237− agent,
238− connection,
239− connection_path,
240− setting_name,
241− hints,
242− flags,
243− callback,
244− callback_data });
245−
246− g_object_ref (connection);
247−
248− g_queue_push_tail (priv->requests, req);
249−
250− g_signal_emit_by_name (agent,
251− UNITY_SETTINGS_SECRET_AGENT_SECRET_REQUESTED,
252− id,
253− connection,
254− setting_name,
255− hints,
256− flags);
257−}
258−
259−static void
260−save_secrets (NMSecretAgent *agent,
261− NMConnection *connection,
262− const char *connection_path,
263− NMSecretAgentSaveSecretsFunc callback,
264− gpointer callback_data)
265−{
266− g_debug ("save secrets");
267−}
268−
269−static void
270−cancel_get_secrets (NMSecretAgent *agent,
271− const char *connection_path,
272− const char *setting_name)
273−{
274− g_debug ("cancel get secrets");
275−}
276−
277−UnitySettingsSecretAgent*
278−unity_settings_secret_agent_construct (GType object_type)
279−{
280− UnitySettingsSecretAgent * self = NULL;
281− self = (UnitySettingsSecretAgent*) g_object_new (object_type,
282− NM_SECRET_AGENT_IDENTIFIER, AGENT_ID,
283− NULL);
284− return self;
285−}
286−
287−
288−UnitySettingsSecretAgent*
289−unity_settings_secret_agent_new (void)
290−{
291− return unity_settings_secret_agent_construct (UNITY_SETTINGS_TYPE_SECRET_AGENT);
292−}
293−
294−static void
295−destroy_pending_request (gpointer data)
296−{
297− SecretRequest* req = (SecretRequest*)data;
298− /* Reporting the cancellation of all pending requests */
299− g_signal_emit_by_name (req->agent,
300− UNITY_SETTINGS_SECRET_AGENT_REQUEST_CANCELLED,
301− req->id);
302−
303− free_request (req);
304−}
305−
306−static void
307−unity_settings_secret_agent_finalize (GObject *agent)
308−{
309− UnitySettingsSecretAgentPrivate *priv = UNITY_SETTINGS_SECRET_AGENT_GET_PRIVATE (agent);
310−
311− g_queue_free_full (priv->requests, destroy_pending_request);
312−}
313−
314−static void
315−unity_settings_secret_agent_class_init (UnitySettingsSecretAgentClass *klass)
316−{
317− unity_settings_secret_agent_parent_class = g_type_class_peek_parent (klass);
318− NMSecretAgentClass *parent_class = NM_SECRET_AGENT_CLASS (klass);
319− parent_class->get_secrets = get_secrets;
320− parent_class->save_secrets = save_secrets;
321− parent_class->delete_secrets = delete_secrets;
322− parent_class->cancel_get_secrets = cancel_get_secrets;
323−
324− g_type_class_add_private (klass, sizeof(UnitySettingsSecretAgentPrivate));
325− G_OBJECT_CLASS (klass)->finalize = unity_settings_secret_agent_finalize;
326−
327−
328− signals[SECRET_REQUESTED] = g_signal_new (UNITY_SETTINGS_SECRET_AGENT_SECRET_REQUESTED,
329− G_OBJECT_CLASS_TYPE (G_OBJECT_CLASS (klass)),
330− G_SIGNAL_RUN_FIRST,
331− G_STRUCT_OFFSET (UnitySettingsSecretAgentClass, secret_requested),
332− NULL, NULL, NULL,
333− G_TYPE_NONE, 5,
334− G_TYPE_UINT, G_TYPE_POINTER, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_UINT);
335−
336− signals[REQUEST_CANCELLED] = g_signal_new (UNITY_SETTINGS_SECRET_AGENT_REQUEST_CANCELLED,
337− G_OBJECT_CLASS_TYPE (G_OBJECT_CLASS (klass)),
338− G_SIGNAL_RUN_FIRST,
339− G_STRUCT_OFFSET (UnitySettingsSecretAgentClass, request_cancelled),
340− NULL, NULL, NULL,
341− G_TYPE_NONE, 1,
342− G_TYPE_UINT);
343−}
344−
345−
346−static void
347−unity_settings_secret_agent_instance_init (UnitySettingsSecretAgent *self)
348−{
349− self->priv = UNITY_SETTINGS_SECRET_AGENT_GET_PRIVATE (self);
350− self->priv->requests = g_queue_new ();
351−}
352−
353−GType
354−unity_settings_secret_agent_get_type (void)
355−{
356− static volatile gsize unity_settings_secret_agent_type_id__volatile = 0;
357− if (g_once_init_enter (&unity_settings_secret_agent_type_id__volatile))
358− {
359− static const GTypeInfo g_define_type_info =
360− {
361− sizeof (UnitySettingsSecretAgentClass),
362− (GBaseInitFunc) NULL,
363− (GBaseFinalizeFunc) NULL,
364− (GClassInitFunc) unity_settings_secret_agent_class_init,
365− (GClassFinalizeFunc) NULL,
366− NULL,
367− sizeof (UnitySettingsSecretAgent),
368− 0,
369− (GInstanceInitFunc) unity_settings_secret_agent_instance_init,
370− NULL
371− };
372− GType unity_settings_secret_agent_type_id;
373− unity_settings_secret_agent_type_id = g_type_register_static (NM_TYPE_SECRET_AGENT,
374− "UnitySettingsSecretAgent",
375− &g_define_type_info,
376− 0);
377− g_once_init_leave (&unity_settings_secret_agent_type_id__volatile,
378− unity_settings_secret_agent_type_id);
379− }
380−
381− return unity_settings_secret_agent_type_id__volatile;
382−}
plugins/Unity/Indicators/Network/secret-agent.hdeleted−102
@@ -1,102 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Alberto Ruiz <alberto.ruiz@canonical.com>
18− * Renato Araujo Oliveira Filho <renato@canonical.com>
19− */
20−
21−#ifndef __SECRET_AGENT_H__
22−#define __SECRET_AGENT_H__
23−
24−#include <glib.h>
25−#include <glib-object.h>
26−#include <nm-secret-agent.h>
27−
28−/*
29− * This class is a basic implementation of the NetworkManager SecretAgent base class.
30− *
31− * The purpose of this class is to handle credential requests from the network,
32− * for example, from a WiFi hotspot or a VPN network.
33− *
34− * It queues requests objects (SecretRequest) on a GQueue in the private struct
35− * of the class. And notifies the consumer of the class through the "secret-request"
36− * and the "request-cancelled" signals with the following callback prototypes:
37− *
38− * void (*secret_requested) (UnitySettingsSecretAgent *self,
39− * guint id,
40− * NMConnection *connection,
41− * const char *setting_name,
42− * const char **hints,
43− * NMSecretAgentGetSecretsFlags flags,
44− * gpointer user_data);
45− *
46− * void (*request_cancelled) (UnitySettingsSecretAgent *self,
47− * guint id,
48− * gpointer user_data);
49− *
50− */
51−
52−
53−G_BEGIN_DECLS
54−
55−
56−#define UNITY_SETTINGS_TYPE_SECRET_AGENT (unity_settings_secret_agent_get_type ())
57−#define UNITY_SETTINGS_SECRET_AGENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgent))
58−#define UNITY_SETTINGS_SECRET_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgentClass))
59−#define UNITY_SETTINGS_IS_SECRET_AGENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), UNITY_SETTINGS_TYPE_SECRET_AGENT))
60−#define UNITY_SETTINGS_IS_SECRET_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), UNITY_SETTINGS_TYPE_SECRET_AGENT))
61−#define UNITY_SETTINGS_SECRET_AGENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgentClass))
62−
63−#define UNITY_SETTINGS_SECRET_AGENT_SECRET_REQUESTED "secret-requested"
64−#define UNITY_SETTINGS_SECRET_AGENT_REQUEST_CANCELLED "request-cancelled"
65−
66−typedef struct _UnitySettingsSecretAgent UnitySettingsSecretAgent;
67−typedef struct _UnitySettingsSecretAgentClass UnitySettingsSecretAgentClass;
68−typedef struct _UnitySettingsSecretAgentPrivate UnitySettingsSecretAgentPrivate;
69−
70−struct _UnitySettingsSecretAgent {
71− NMSecretAgent parent_instance;
72− UnitySettingsSecretAgentPrivate * priv;
73−};
74−
75−struct _UnitySettingsSecretAgentClass {
76− NMSecretAgentClass parent_class;
77−
78− void (*secret_requested) (UnitySettingsSecretAgent *self,
79− guint id,
80− NMConnection *connection,
81− const char *setting_name,
82− const char **hints,
83− NMSecretAgentGetSecretsFlags flags);
84−
85− void (*request_cancelled) (UnitySettingsSecretAgent *self,
86− guint id);
87−};
88−
89−
90−GType unity_settings_secret_agent_get_type (void) G_GNUC_CONST;
91−UnitySettingsSecretAgent* unity_settings_secret_agent_new (void);
92−UnitySettingsSecretAgent* unity_settings_secret_agent_construct (GType object_type);
93−
94−void unity_settings_secret_agent_provide_secret (UnitySettingsSecretAgent *agent,
95− guint request,
96− GHashTable *secrets);
97−void unity_settings_secret_agent_cancel_request (UnitySettingsSecretAgent *agent,
98− guint request);
99−
100−G_END_DECLS
101−
102−#endif
plugins/Unity/Indicators/indicators.h−2
@@ -74,8 +74,6 @@ public:
74 enum Roles {
74 enum Roles {
75 Identifier = 0,
75 Identifier = 0,
76 Position,
76 Position,
77− Title,
78− Description,
79 WidgetSource,
77 WidgetSource,
80 PageSource,
78 PageSource,
81 IndicatorProperties,
79 IndicatorProperties,
plugins/Unity/Indicators/indicatorsmanager.cpp+20−24
@@ -47,34 +47,13 @@ public:
47IndicatorsManager::IndicatorsManager(QObject* parent)
47IndicatorsManager::IndicatorsManager(QObject* parent)
48 : QObject(parent)
48 : QObject(parent)
49 , m_loaded(false)
49 , m_loaded(false)
50− , m_upstart(NULL)
51{
50{
52− auto upstartsession = qgetenv("UPSTART_SESSION");
53− if (!upstartsession.isNull()) {
54− DBusConnection * conn = NULL;
55− conn = dbus_connection_open(upstartsession.constData(), NULL);
56− if (conn != NULL) {
57− m_upstart = nih_dbus_proxy_new(NULL, conn,
58− NULL,
59− DBUS_PATH_UPSTART,
60− NULL, NULL);
61− dbus_connection_unref(conn);
62− }
63− }
64−
65− if (m_upstart != NULL) {
66− m_upstart->auto_start = FALSE;
67− }
68}
51}
69
52
70IndicatorsManager::~IndicatorsManager()
53IndicatorsManager::~IndicatorsManager()
71{
54{
72 unload();
55 unload();
73
56
74− if (m_upstart != NULL) {
75− nih_unref(m_upstart, NULL);
76− m_upstart = NULL;
77− }
78}
57}
79
58
80void IndicatorsManager::load()
59void IndicatorsManager::load()
@@ -235,17 +214,34 @@ void IndicatorsManager::setLoaded(bool loaded)
235 m_loaded = loaded;
214 m_loaded = loaded;
236 Q_EMIT loadedChanged(m_loaded);
215 Q_EMIT loadedChanged(m_loaded);
237
216
238− if (m_upstart != NULL) {
217+ auto upstartsession = qgetenv("UPSTART_SESSION");
218+ NihDBusProxy * upstart = NULL;
219+
220+ if (!upstartsession.isNull()) {
221+ DBusConnection * conn = NULL;
222+ conn = dbus_connection_open(upstartsession.constData(), NULL);
223+ if (conn != NULL) {
224+ upstart = nih_dbus_proxy_new(NULL, conn,
225+ NULL,
226+ DBUS_PATH_UPSTART,
227+ NULL, NULL);
228+ dbus_connection_unref(conn);
229+ }
230+ }
231+
232+ if (upstart != NULL) {
239 int event_sent = 0;
233 int event_sent = 0;
240 if (m_loaded) {
234 if (m_loaded) {
241− event_sent = upstart_emit_event_sync(NULL, m_upstart, "indicator-services-start", NULL, 0);
235+ event_sent = upstart_emit_event_sync(NULL, upstart, "indicator-services-start", NULL, 0);
242 } else {
236 } else {
243− event_sent = upstart_emit_event_sync(NULL, m_upstart, "indicator-services-end", NULL, 0);
237+ event_sent = upstart_emit_event_sync(NULL, upstart, "indicator-services-end", NULL, 0);
244 }
238 }
245
239
246 if (event_sent != 0) {
240 if (event_sent != 0) {
247 qWarning() << "Unable to send indicator event to Upstart";
241 qWarning() << "Unable to send indicator event to Upstart";
248 }
242 }
243+ nih_unref(upstart, NULL);
244+ upstart = NULL;
249 }
245 }
250 }
246 }
251}
247}
plugins/Unity/Indicators/indicatorsmanager.h−1
@@ -71,7 +71,6 @@ private:
71 QHash<QString, IndicatorData*> m_indicatorsData;
71 QHash<QString, IndicatorData*> m_indicatorsData;
72 QSharedPointer<QFileSystemWatcher> m_fsWatcher;
72 QSharedPointer<QFileSystemWatcher> m_fsWatcher;
73 bool m_loaded;
73 bool m_loaded;
74− NihDBusProxy * m_upstart;
75};
74};
76
75
77#endif // INDICATORS_MANAGER_H
76#endif // INDICATORS_MANAGER_H
plugins/Unity/Indicators/indicatorsmodel.cpp+2−55
@@ -201,8 +201,6 @@ QHash<int, QByteArray> IndicatorsModel::roleNames() const
201 {
201 {
202 roles[IndicatorsModelRole::Identifier] = "identifier";
202 roles[IndicatorsModelRole::Identifier] = "identifier";
203 roles[IndicatorsModelRole::Position] = "position";
203 roles[IndicatorsModelRole::Position] = "position";
204− roles[IndicatorsModelRole::Title] = "title";
205− roles[IndicatorsModelRole::Description] = "description";
206 roles[IndicatorsModelRole::WidgetSource] = "widgetSource";
204 roles[IndicatorsModelRole::WidgetSource] = "widgetSource";
207 roles[IndicatorsModelRole::PageSource] = "pageSource";
205 roles[IndicatorsModelRole::PageSource] = "pageSource";
208 roles[IndicatorsModelRole::IndicatorProperties] = "indicatorProperties";
206 roles[IndicatorsModelRole::IndicatorProperties] = "indicatorProperties";
@@ -216,25 +214,6 @@ int IndicatorsModel::columnCount(const QModelIndex &) const
216 return 1;
214 return 1;
217}
215}
218
216
219−/*! \internal */
220−QVariant IndicatorsModel::defaultData(Indicator::Ptr indicator, int role)
221−{
222− switch (role)
223− {
224− case IndicatorsModelRole::Position:
225− return 0;
226− case IndicatorsModelRole::Title:
227− return indicator ? indicator->identifier() : "Unknown";
228− case IndicatorsModelRole::Description:
229− return "";
230− case IndicatorsModelRole::WidgetSource:
231− return shellAppDirectory()+"/Panel/Indicators/DefaultIndicatorWidget2.qml";
232− case IndicatorsModelRole::PageSource:
233− return shellAppDirectory()+"/Panel/Indicators/DefaultIndicatorPage2.qml";
234− }
235− return QVariant();
236−}
237−
238Q_INVOKABLE QVariant IndicatorsModel::data(int row, int role) const
217Q_INVOKABLE QVariant IndicatorsModel::data(int row, int role) const
239{
218{
240 return data(index(row, 0), role);
219 return data(index(row, 0), role);
@@ -268,27 +247,16 @@ QVariant IndicatorsModel::data(const QModelIndex &index, int role) const
268 return QVariant(indicator->indicatorProperties());
247 return QVariant(indicator->indicatorProperties());
269 }
248 }
270 break;
249 break;
271− case IndicatorsModelRole::Title:
272− case IndicatorsModelRole::Description:
273 case IndicatorsModelRole::WidgetSource:
250 case IndicatorsModelRole::WidgetSource:
251+ return shellAppDirectory()+"/Panel/Indicators/DefaultIndicatorWidget.qml";
274 case IndicatorsModelRole::PageSource:
252 case IndicatorsModelRole::PageSource:
275− return indicatorData(indicator, role);
253+ return shellAppDirectory()+"/Panel/Indicators/DefaultIndicatorPage.qml";
276 default:
254 default:
277 break;
255 break;
278 }
256 }
279 return QVariant();
257 return QVariant();
280}
258}
281
259
282−QVariant IndicatorsModel::indicatorData(const Indicator::Ptr& indicator, int role) const
283−{
284− if (indicator && m_parsed_indicator_data.contains(indicator->identifier()))
285− {
286− QVariantMap data = m_parsed_indicator_data[indicator->identifier()];
287− return data.value(roleNames()[role], QVariant());
288− }
289− return defaultData(indicator, role);
290−}
291−
292/*! \internal */
260/*! \internal */
293QModelIndex IndicatorsModel::parent(const QModelIndex&) const
261QModelIndex IndicatorsModel::parent(const QModelIndex&) const
294{
262{
@@ -300,24 +268,3 @@ int IndicatorsModel::rowCount(const QModelIndex&) const
300{
268{
301 return m_indicators.count();
269 return m_indicators.count();
302}
270}
303−
304−void IndicatorsModel::setIndicatorData(const QVariant& data)
305−{
306− m_indicator_data = data;
307−
308− m_parsed_indicator_data.clear();
309− QMap<QString, QVariant> map = data.toMap();
310− QMapIterator<QString, QVariant> iter(map);
311− while(iter.hasNext())
312− {
313− iter.next();
314− m_parsed_indicator_data[iter.key()] = iter.value().toMap();
315− }
316−
317− Q_EMIT indicatorDataChanged(m_indicator_data);
318−}
319−
320−QVariant IndicatorsModel::indicatorData() const
321−{
322− return m_indicator_data;
323−}
plugins/Unity/Indicators/indicatorsmodel.h−8
@@ -34,7 +34,6 @@ class UNITYINDICATORS_EXPORT IndicatorsModel : public QAbstractListModel
34 Q_OBJECT
34 Q_OBJECT
35 Q_ENUMS(Roles)
35 Q_ENUMS(Roles)
36 Q_PROPERTY(int count READ count NOTIFY countChanged)
36 Q_PROPERTY(int count READ count NOTIFY countChanged)
37− Q_PROPERTY(QVariant indicatorData READ indicatorData WRITE setIndicatorData NOTIFY indicatorDataChanged)
38
37
39public:
38public:
40
39
@@ -53,9 +52,6 @@ public:
53 QModelIndex parent (const QModelIndex &index) const;
52 QModelIndex parent (const QModelIndex &index) const;
54 int rowCount(const QModelIndex &parent = QModelIndex()) const;
53 int rowCount(const QModelIndex &parent = QModelIndex()) const;
55
54
56− void setIndicatorData(const QVariant& data);
57− QVariant indicatorData() const;
58−
59
55
60Q_SIGNALS:
56Q_SIGNALS:
61 void countChanged();
57 void countChanged();
@@ -71,13 +67,9 @@ private:
71 IndicatorsManager *m_manager;
67 IndicatorsManager *m_manager;
72
68
73 QList<Indicator::Ptr> m_indicators;
69 QList<Indicator::Ptr> m_indicators;
74− QVariant m_indicator_data;
75− QMap<QString, QVariantMap> m_parsed_indicator_data;
76
70
77 void notifyDataChanged(QObject *sender, int role);
71 void notifyDataChanged(QObject *sender, int role);
78 int count() const;
72 int count() const;
79− QVariant indicatorData(const Indicator::Ptr& indicator, int role) const;
80− static QVariant defaultData(Indicator::Ptr indicator, int role);
81};
73};
82
74
83#endif // INDICATORSMODEL_H
75#endif // INDICATORSMODEL_H
plugins/Unity/Indicators/plugin.cpp+2
@@ -42,6 +42,8 @@ static QObject* menuModelCacheSingleton(QQmlEngine* engine, QJSEngine* scriptEng
42
42
43void Indicators2Plugin::registerTypes(const char *uri)
43void Indicators2Plugin::registerTypes(const char *uri)
44{
44{
45+ Q_INIT_RESOURCE(indicators);
46+
45 qmlRegisterType<IndicatorsManager>(uri, 0, 1, "IndicatorsManager");
47 qmlRegisterType<IndicatorsManager>(uri, 0, 1, "IndicatorsManager");
46 qmlRegisterType<IndicatorsModel>(uri, 0, 1, "IndicatorsModel");
48 qmlRegisterType<IndicatorsModel>(uri, 0, 1, "IndicatorsModel");
47 qmlRegisterType<MenuContentActivator>(uri, 0, 1, "MenuContentActivator");
49 qmlRegisterType<MenuContentActivator>(uri, 0, 1, "MenuContentActivator");
plugins/Unity/Indicators/qml/BaseMenuItem.qml+1−1
@@ -24,7 +24,7 @@ import Ubuntu.Components.ListItems 0.1 as ListItem
24ListItem.Standard {
24ListItem.Standard {
25 id: baseMenu
25 id: baseMenu
26
26
27− property bool menuActivated: false
27+ property bool menuSelected: false
28
28
29 signal selectMenu()
29 signal selectMenu()
30 signal deselectMenu()
30 signal deselectMenu()
plugins/Unity/Indicators/qml/IndicatorBase.qml+8−5
@@ -27,13 +27,11 @@ Item {
27 enabled: menuObjectPaths.hasOwnProperty(device)
27 enabled: menuObjectPaths.hasOwnProperty(device)
28
28
29 //const
29 //const
30− property string title
31 property string busName
30 property string busName
32 property string actionsObjectPath
31 property string actionsObjectPath
33 property var menuObjectPaths: undefined
32 property var menuObjectPaths: undefined
34 readonly property string device: "phone"
33 readonly property string device: "phone"
35 property string rootMenuType: "com.canonical.indicator.root"
34 property string rootMenuType: "com.canonical.indicator.root"
36− property bool active: false
37
35
38 property string deviceMenuObjectPath: menuObjectPaths.hasOwnProperty(device) ? menuObjectPaths[device] : ""
36 property string deviceMenuObjectPath: menuObjectPaths.hasOwnProperty(device) ? menuObjectPaths[device] : ""
39
37
@@ -41,8 +39,13 @@ Item {
41
39
42 CachedUnityMenuModel {
40 CachedUnityMenuModel {
43 id: cachedModel
41 id: cachedModel
44− busName: active ? indicatorItem.busName : ""
42+ busName: indicatorItem.busName
45− actionsObjectPath: active ? indicatorItem.actionsObjectPath : ""
43+ actionsObjectPath: indicatorItem.actionsObjectPath
46− menuObjectPath: active ? indicatorItem.deviceMenuObjectPath : ""
44+ menuObjectPath: indicatorItem.deviceMenuObjectPath
45+ }
46+
47+ property var rootActionState: Indicators.RootActionState {
48+ menu: menuModel
49+ onUpdated: indicatorItem.rootActionStateChanged()
47 }
50 }
48}
51}
plugins/Unity/Indicators/qml/IndicatorPage.qml+40−11
@@ -26,12 +26,14 @@ IndicatorBase {
26 id: main
26 id: main
27
27
28 //const
28 //const
29+ property bool contentActive: false
30+ property string title: rootActionState.title
29 property alias emptyText: emptyLabel.text
31 property alias emptyText: emptyLabel.text
30 property alias highlightFollowsCurrentItem : mainMenu.highlightFollowsCurrentItem
32 property alias highlightFollowsCurrentItem : mainMenu.highlightFollowsCurrentItem
31
33
32 Indicators.UnityMenuModelStack {
34 Indicators.UnityMenuModelStack {
33 id: menuStack
35 id: menuStack
34− head: main.menuModel
36+ head: contentActive ? main.menuModel : null
35 }
37 }
36
38
37 ListView {
39 ListView {
@@ -60,7 +62,34 @@ IndicatorBase {
60 // Only allow flicking if the content doesn't fit on the page
62 // Only allow flicking if the content doesn't fit on the page
61 interactive: contentHeight > height
63 interactive: contentHeight > height
62
64
65+ property int selectedIndex: -1
66+ property bool blockCurrentIndexChange: false
67+ // for count = 0
68+ onCountChanged: {
69+ if (count == 0 && selectedIndex != -1) {
70+ selectedIndex = -1;
71+ }
72+ }
73+ // for highlight following
74+ onSelectedIndexChanged: {
63− currentIndex: -1
75+ if (currentIndex != selectedIndex) {
76+ var blocked = blockCurrentIndexChange;
77+ blockCurrentIndexChange = true;
78+
79+ currentIndex = selectedIndex;
80+
81+ blockCurrentIndexChange = blocked;
82+ }
83+ }
84+ // for item addition/removal
85+ onCurrentIndexChanged: {
86+ if (!blockCurrentIndexChange) {
87+ if (selectedIndex != -1 && selectedIndex != currentIndex) {
88+ selectedIndex = currentIndex;
89+ }
90+ }
91+ }
92+
64 delegate: Item {
93 delegate: Item {
65 id: menuDelegate
94 id: menuDelegate
66
95
@@ -89,10 +118,10 @@ IndicatorBase {
89 menuStack.push(mainMenu.model.submenu(index));
118 menuStack.push(mainMenu.model.submenu(index));
90 }
119 }
91
120
92− if (item.hasOwnProperty("menuActivated")) {
121+ if (item.hasOwnProperty("menuSelected")) {
93− item.menuActivated = Qt.binding(function() { return ListView.isCurrentItem; });
122+ item.menuSelected = Qt.binding(function() { return mainMenu.selectedIndex == index; });
94− item.selectMenu.connect(function() { ListView.view.currentIndex = index });
123+ item.selectMenu.connect(function() { mainMenu.selectedIndex = index; });
95− item.deselectMenu.connect(function() { ListView.view.currentIndex = -1 });
124+ item.deselectMenu.connect(function() { mainMenu.selectedIndex = -1; });
96 }
125 }
97 if (item.hasOwnProperty("menu")) {
126 if (item.hasOwnProperty("menu")) {
98 item.menu = Qt.binding(function() { return model; });
127 item.menu = Qt.binding(function() { return model; });
@@ -135,21 +164,21 @@ IndicatorBase {
135 function start()
164 function start()
136 {
165 {
137 reset()
166 reset()
138− if (!active) {
167+ if (!contentActive) {
139− active = true;
168+ contentActive = true;
140 }
169 }
141 }
170 }
142
171
143 function stop()
172 function stop()
144 {
173 {
145− if (active) {
174+ if (contentActive) {
146− active = false;
175+ contentActive = false;
147 }
176 }
148 }
177 }
149
178
150 function reset()
179 function reset()
151 {
180 {
152− mainMenu.currentIndex = -1;
181+ mainMenu.selectedIndex = -1;
153 mainMenu.positionViewAtBeginning();
182 mainMenu.positionViewAtBeginning();
154 }
183 }
155}
184}
plugins/Unity/Indicators/qml/IndicatorWidget.qml−6
@@ -23,12 +23,6 @@ import Unity.Indicators 0.1 as Indicators
23IndicatorBase {
23IndicatorBase {
24 id: indicatorWidget
24 id: indicatorWidget
25
25
26− active: true
27 enabled: false
26 enabled: false
28 property int iconSize: height - units.gu(0.5)
27 property int iconSize: height - units.gu(0.5)
29−
30− property var actionState: Indicators.RootActionState {
31− menu: menuModel
32− onUpdated: indicatorWidget.actionStateChanged()
33− }
34}
28}
plugins/Unity/Indicators/qml/MenuItemFactory.qml+63−12
@@ -20,6 +20,7 @@
20import QtQuick 2.0
20import QtQuick 2.0
21import Unity.Indicators 0.1 as Indicators
21import Unity.Indicators 0.1 as Indicators
22import Unity.Indicators.Network 0.1 as ICNetwork
22import Unity.Indicators.Network 0.1 as ICNetwork
23+import Unity.Indicators.Messaging 0.1 as ICMessaging
23import QMenuModel 0.1 as QMenuModel
24import QMenuModel 0.1 as QMenuModel
24
25
25Item {
26Item {
@@ -38,6 +39,9 @@ Item {
38 "com.canonical.indicator.slider" : sliderMenu,
39 "com.canonical.indicator.slider" : sliderMenu,
39 "com.canonical.indicator.switch" : switchMenu,
40 "com.canonical.indicator.switch" : switchMenu,
40
41
42+ "com.canonical.indicator.messages.messageitem" : messageItem,
43+ "com.canonical.indicator.messages.sourceitem" : groupedMessage,
44+
41 "com.canonical.unity.slider" : sliderMenu,
45 "com.canonical.unity.slider" : sliderMenu,
42 "com.canonical.unity.switch" : switchMenu,
46 "com.canonical.unity.switch" : switchMenu,
43
47
@@ -45,15 +49,17 @@ Item {
45 "unity.widgets.systemsettings.tablet.accesspoint" : accessPoint,
49 "unity.widgets.systemsettings.tablet.accesspoint" : accessPoint,
46 }
50 }
47
51
52+ Component { id: divMenu; Indicators.DivMenuItem {} }
53+
48 Component {
54 Component {
49 id: sliderMenu;
55 id: sliderMenu;
50 Indicators.SliderMenuItem {
56 Indicators.SliderMenuItem {
51 property QtObject menu: null
57 property QtObject menu: null
52
58
53 text: menu && menu.label ? menu.label : ""
59 text: menu && menu.label ? menu.label : ""
54− icon: menu ? menu.icon : ""
60+ icon: menu && menu.icon ? menu.icon : ""
55− minIcon: menu.ext.minIcon
61+ minIcon: menu && menu.ext.minIcon ? menu.ext.minIcon : ""
56− maxIcon: menu.ext.maxIcon
62+ maxIcon: menu && menu.ext.maxIcon ? menu.ext.maxIcon : ""
57
63
58 minimumValue: menu.ext.minValue ? menu.ext.minValue : 0.0
64 minimumValue: menu.ext.minValue ? menu.ext.minValue : 0.0
59 maximumValue: {
65 maximumValue: {
@@ -79,8 +85,6 @@ Item {
79 }
85 }
80 }
86 }
81
87
82− Component { id: divMenu; Indicators.DivMenuItem {} }
83−
84 Component {
88 Component {
85 id: buttonMenu;
89 id: buttonMenu;
86 Indicators.ButtonMenuItem {
90 Indicators.ButtonMenuItem {
@@ -89,7 +93,9 @@ Item {
89 text: menu && menu.label ? menu.label : ""
93 text: menu && menu.label ? menu.label : ""
90 enabled: menu ? menu.sensitive : false
94 enabled: menu ? menu.sensitive : false
91
95
96+ onActivate: {
92− onActivate: model.activate(modelIndex);
97+ model.activate(modelIndex);
98+ }
93 }
99 }
94 }
100 }
95 Component {
101 Component {
@@ -109,6 +115,7 @@ Item {
109 text: menu && menu.label ? menu.label : ""
115 text: menu && menu.label ? menu.label : ""
110 icon: menu ? menu.icon : ""
116 icon: menu ? menu.icon : ""
111 value : menu ? menu.actionState : 0.0
117 value : menu ? menu.actionState : 0.0
118+ enabled: menu ? menu.sensitive : false
112 }
119 }
113 }
120 }
114
121
@@ -118,12 +125,14 @@ Item {
118 property QtObject menu: null
125 property QtObject menu: null
119
126
120 text: menu && menu.label ? menu.label : ""
127 text: menu && menu.label ? menu.label : ""
121− icon: menu ? menu.icon : ""
128+ icon: menu && menu.icon ? menu.icon : ""
122 checkable: menu ? (menu.isCheck || menu.isRadio) : false
129 checkable: menu ? (menu.isCheck || menu.isRadio) : false
123 checked: checkable ? menu.isToggled : false
130 checked: checkable ? menu.isToggled : false
124 enabled: menu ? menu.sensitive : false
131 enabled: menu ? menu.sensitive : false
125
132
133+ onActivate: {
126− onActivate: model.activate(modelIndex);
134+ model.activate(modelIndex);
135+ }
127 }
136 }
128 }
137 }
129
138
@@ -133,11 +142,13 @@ Item {
133 property QtObject menu: null
142 property QtObject menu: null
134
143
135 text: menu && menu.label ? menu.label : ""
144 text: menu && menu.label ? menu.label : ""
136− icon: menu ? menu.icon : ""
145+ icon: menu && menu.icon ? menu.icon : ""
137 checked: menu ? menu.isToggled : false
146 checked: menu ? menu.isToggled : false
138 enabled: menu ? menu.sensitive : false
147 enabled: menu ? menu.sensitive : false
139
148
149+ onActivate: {
140− onActivate: model.activate(modelIndex);
150+ model.activate(modelIndex);
151+ }
141 }
152 }
142 }
153 }
143
154
@@ -161,11 +172,11 @@ Item {
161 property QtObject menu: null
172 property QtObject menu: null
162 property var strengthAction: QMenuModel.UnityMenuAction {
173 property var strengthAction: QMenuModel.UnityMenuAction {
163 model: menuFactory.model ? menuFactory.model : null
174 model: menuFactory.model ? menuFactory.model : null
175+ index: modelIndex
164 name: menu ? menu.ext.xCanonicalWifiApStrengthAction : ""
176 name: menu ? menu.ext.xCanonicalWifiApStrengthAction : ""
165 }
177 }
166
178
167 text: menu && menu.label ? menu.label : ""
179 text: menu && menu.label ? menu.label : ""
168− icon: menu ? menu.icon : ""
169 secure: menu ? menu.ext.xCanonicalWifiApIsSecure : false
180 secure: menu ? menu.ext.xCanonicalWifiApIsSecure : false
170 adHoc: menu ? menu.ext.xCanonicalWifiApIsAdhoc : false
181 adHoc: menu ? menu.ext.xCanonicalWifiApIsAdhoc : false
171 checked: menu ? menu.isToggled : false
182 checked: menu ? menu.isToggled : false
@@ -177,7 +188,47 @@ Item {
177 'x-canonical-wifi-ap-is-secure': 'bool',
188 'x-canonical-wifi-ap-is-secure': 'bool',
178 'x-canonical-wifi-ap-strength-action': 'string'});
189 'x-canonical-wifi-ap-strength-action': 'string'});
179 }
190 }
191+ onActivate: {
180− onActivate: model.activate(modelIndex);
192+ model.activate(modelIndex);
193+ }
194+ }
195+ }
196+
197+ Component {
198+ id: messageItem
199+ ICMessaging.MessageMenuItemFactory {
200+
201+ property QtObject menu: null
202+ model: menuFactory.model ? menuFactory.model : null
203+
204+ Component.onCompleted: {
205+ model.loadExtendedAttributes(modelIndex, {'x-canonical-time': 'int64',
206+ 'x-canonical-text': 'string',
207+ 'x-canonical-message-actions': 'variant',
208+ 'icon': 'icon',
209+ 'x-canonical-app-icon': 'icon'});
210+ }
211+ }
212+ }
213+
214+ Component {
215+ id: groupedMessage
216+ ICMessaging.GroupedMessage {
217+ property QtObject menu: null
218+
219+ title: menu && menu.label ? menu.label : ""
220+ count: menu && menu.actionState[0] ? menu.actionState[0] : "0"
221+ appIcon: menu && menu.ext.icon !== undefined ? menu.ext.icon : "qrc:/indicators/artwork/messaging/default_app.svg"
222+
223+ Component.onCompleted: {
224+ model.loadExtendedAttributes(modelIndex, {'icon': 'icon'});
225+ }
226+ onActivateApp: {
227+ model.activate(modelIndex, true);
228+ }
229+ onDismiss: {
230+ model.activate(modelIndex, false);
231+ }
181 }
232 }
182 }
233 }
183
234
plugins/Unity/Indicators/qml/SliderMenuItem.qml+1−1
@@ -71,7 +71,7 @@ FramedMenuItem {
71 leftMargin: leftImage.visible ? units.gu(0.5) : 0
71 leftMargin: leftImage.visible ? units.gu(0.5) : 0
72 rightMargin: rightImage.visible ? units.gu(0.5) : 0
72 rightMargin: rightImage.visible ? units.gu(0.5) : 0
73 }
73 }
74− live: false
74+ live: true
75
75
76 Component.onCompleted: {
76 Component.onCompleted: {
77 value = menuItem.value
77 value = menuItem.value
plugins/Unity/IndicatorsLegacy/resources/artwork/messaging/default_app.svg → plugins/Unity/Indicators/resources/artwork/messaging/default_app.svgrenamed

The content is the same.

plugins/Unity/IndicatorsLegacy/resources/artwork/messaging/default_contact.png → plugins/Unity/Indicators/resources/artwork/messaging/default_contact.pngrenamed

Binary file not shown.

plugins/Unity/IndicatorsLegacy/resources/artwork/messaging/message_sms01_54px.png → plugins/Unity/Indicators/resources/artwork/messaging/message_sms01_54px.pngrenamed

Binary file not shown.

plugins/Unity/Indicators/resources/indicators.qrc+3
@@ -1,5 +1,8 @@
1<RCC>
1<RCC>
2 <qresource prefix="/indicators">
2 <qresource prefix="/indicators">
3 <file>artwork/network/secure.svg</file>
3 <file>artwork/network/secure.svg</file>
4+ <file>artwork/messaging/default_contact.png</file>
5+ <file>artwork/messaging/default_app.svg</file>
6+ <file>artwork/messaging/message_sms01_54px.png</file>
4 </qresource>
7 </qresource>
5</RCC>
8</RCC>
plugins/Unity/Indicators/rootactionstate.cpp+22−2
@@ -57,7 +57,7 @@ void RootActionState::setMenu(UnityMenuModel* menu)
57 connect(m_menu, SIGNAL(rowsRemoved(const QModelIndex&, int, int)), SLOT(onModelRowsRemoved(const QModelIndex&, int, int)));
57 connect(m_menu, SIGNAL(rowsRemoved(const QModelIndex&, int, int)), SLOT(onModelRowsRemoved(const QModelIndex&, int, int)));
58 connect(m_menu, SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&, const QVector<int>&)), SLOT(onModelDataChanged(const QModelIndex&, const QModelIndex&, const QVector<int>&)));
58 connect(m_menu, SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&, const QVector<int>&)), SLOT(onModelDataChanged(const QModelIndex&, const QModelIndex&, const QVector<int>&)));
59
59
60− m_menu->setActionStateParser(this);
60+ connect(m_menu, SIGNAL(destroyed()), SLOT(reset()));
61 }
61 }
62 updateActionState();
62 updateActionState();
63 Q_EMIT menuChanged();
63 Q_EMIT menuChanged();
@@ -92,22 +92,42 @@ void RootActionState::onModelDataChanged(const QModelIndex& topLeft, const QMode
92 }
92 }
93}
93}
94
94
95+void RootActionState::reset()
96+{
97+ m_cachedState.clear();
98+ m_menu = NULL;
99+
100+ Q_EMIT menuChanged();
101+ Q_EMIT updated();
102+}
103+
95void RootActionState::updateActionState()
104void RootActionState::updateActionState()
96{
105{
97 if (m_menu && m_menu->rowCount() > 0) {
106 if (m_menu && m_menu->rowCount() > 0) {
107+ ActionStateParser* oldParser = m_menu->actionStateParser();
108+ m_menu->setActionStateParser(this);
109+
98 m_cachedState = m_menu->get(0, "actionState").toMap();
110 m_cachedState = m_menu->get(0, "actionState").toMap();
111+
112+ m_menu->setActionStateParser(oldParser);
99 } else {
113 } else {
100 m_cachedState.clear();
114 m_cachedState.clear();
101 }
115 }
102 Q_EMIT updated();
116 Q_EMIT updated();
103}
117}
104
118
105−
106bool RootActionState::isValid() const
119bool RootActionState::isValid() const
107{
120{
108 return m_menu && m_menu->rowCount() > 0;
121 return m_menu && m_menu->rowCount() > 0;
109}
122}
110
123
124+QString RootActionState::title() const
125+{
126+ if (!isValid()) return QString();
127+
128+ return m_cachedState.value("title", QVariant::fromValue(QString())).toString();
129+}
130+
111QString RootActionState::leftLabel() const
131QString RootActionState::leftLabel() const
112{
132{
113 if (!isValid()) return QString();
133 if (!isValid()) return QString();
plugins/Unity/Indicators/rootactionstate.h+4
@@ -32,6 +32,7 @@ class UNITYINDICATORS_EXPORT RootActionState : public ActionStateParser
32 Q_PROPERTY(UnityMenuModel* menu READ menu WRITE setMenu NOTIFY menuChanged)
32 Q_PROPERTY(UnityMenuModel* menu READ menu WRITE setMenu NOTIFY menuChanged)
33
33
34 Q_PROPERTY(bool valid READ isValid NOTIFY validChanged)
34 Q_PROPERTY(bool valid READ isValid NOTIFY validChanged)
35+ Q_PROPERTY(QString title READ title NOTIFY titleChanged)
35 Q_PROPERTY(QString leftLabel READ leftLabel NOTIFY leftLabelChanged)
36 Q_PROPERTY(QString leftLabel READ leftLabel NOTIFY leftLabelChanged)
36 Q_PROPERTY(QString rightLabel READ rightLabel NOTIFY rightLabelChanged)
37 Q_PROPERTY(QString rightLabel READ rightLabel NOTIFY rightLabelChanged)
37 Q_PROPERTY(QStringList icons READ icons NOTIFY iconsChanged)
38 Q_PROPERTY(QStringList icons READ icons NOTIFY iconsChanged)
@@ -48,6 +49,7 @@ public:
48 void setIndex(int index);
49 void setIndex(int index);
49
50
50 bool isValid() const;
51 bool isValid() const;
52+ QString title() const;
51 QString leftLabel() const;
53 QString leftLabel() const;
52 QString rightLabel() const;
54 QString rightLabel() const;
53 QStringList icons() const;
55 QStringList icons() const;
@@ -64,6 +66,7 @@ Q_SIGNALS:
64 void indexChanged();
66 void indexChanged();
65
67
66 void validChanged();
68 void validChanged();
69+ void titleChanged();
67 void leftLabelChanged();
70 void leftLabelChanged();
68 void rightLabelChanged();
71 void rightLabelChanged();
69 void iconsChanged();
72 void iconsChanged();
@@ -74,6 +77,7 @@ private Q_SLOTS:
74 void onModelRowsAdded(const QModelIndex& parent, int start, int end);
77 void onModelRowsAdded(const QModelIndex& parent, int start, int end);
75 void onModelRowsRemoved(const QModelIndex& parent, int start, int end);
78 void onModelRowsRemoved(const QModelIndex& parent, int start, int end);
76 void onModelDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight, const QVector<int>&);
79 void onModelDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight, const QVector<int>&);
80+ void reset();
77
81
78private:
82private:
79 void updateActionState();
83 void updateActionState();
plugins/Unity/Indicators/visibleindicatorsmodel.cpp−2
@@ -33,8 +33,6 @@ QHash<int, QByteArray> VisibleIndicatorsModel::roleNames() const
33 {
33 {
34 roles[IndicatorsModelRole::Identifier] = "identifier";
34 roles[IndicatorsModelRole::Identifier] = "identifier";
35 roles[IndicatorsModelRole::Position] = "position";
35 roles[IndicatorsModelRole::Position] = "position";
36− roles[IndicatorsModelRole::Title] = "title";
37− roles[IndicatorsModelRole::Description] = "description";
38 roles[IndicatorsModelRole::WidgetSource] = "widgetSource";
36 roles[IndicatorsModelRole::WidgetSource] = "widgetSource";
39 roles[IndicatorsModelRole::PageSource] = "pageSource";
37 roles[IndicatorsModelRole::PageSource] = "pageSource";
40 roles[IndicatorsModelRole::IndicatorProperties] = "indicatorProperties";
38 roles[IndicatorsModelRole::IndicatorProperties] = "indicatorProperties";
plugins/Unity/IndicatorsLegacy/CMakeLists.txtdeleted−49
@@ -1,49 +0,0 @@
1−# export_qmlplugin macro
2−include(Plugins)
3−
4−project(IndicatorsLegacyQml)
5−
6−pkg_check_modules(QMENUMODEL REQUIRED qmenumodel)
7−find_package(Qt5Core REQUIRED)
8−find_package(Qt5Quick REQUIRED)
9−
10−add_subdirectory(qml)
11−add_subdirectory(Messaging)
12−add_subdirectory(Network)
13−
14−include_directories(
15− ${CMAKE_CURRENT_SOURCE_DIR}
16− ${CMAKE_CURRENT_BINARY_DIR}
17− ${QMENUMODEL_INCLUDE_DIRS}
18− ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators
19−)
20−
21−set(IndicatorsLegacyQML_SOURCES
22− ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/indicators.h
23− flatmenuproxymodel.cpp
24− modelprinter.cpp
25− plugin.cpp
26−)
27−add_definitions(-DUNITYINDICATORS_LIBRARY)
28−
29−set(IndicatorsLegacyQML_RESOURCES
30− resources/indicators.qrc
31−)
32−
33−qt5_add_resources(IndicatorsLegacyQML_RESOURCES_RCC
34− ${IndicatorsLegacyQML_RESOURCES}
35−)
36−
37−add_library(IndicatorsLegacyQml SHARED
38− ${IndicatorsLegacyQML_RESOURCES_RCC}
39− ${IndicatorsLegacyQML_SOURCES}
40−)
41−
42−target_link_libraries(IndicatorsLegacyQml
43− ${QMENUMODEL_LDFLAGS}
44−)
45−
46−qt5_use_modules(IndicatorsLegacyQml Core Qml Quick)
47−
48−# export the qmltypes and plugin files
49−export_qmlplugin(Unity.IndicatorsLegacy 0.1 Unity/IndicatorsLegacy TARGETS IndicatorsLegacyQml)
plugins/Unity/IndicatorsLegacy/Messaging/qml/CMakeLists.txtdeleted−5
@@ -1,5 +0,0 @@
1−# export_qmlfiles macro
2−include(Plugins)
3−
4−# export the qmldir, *.qml files.
5−export_qmlfiles(Unity.IndicatorsLegacy.Messaging Unity/IndicatorsLegacy/Messaging)
plugins/Unity/IndicatorsLegacy/Messaging/qml/MessageMenuItem.qmldeleted−96
@@ -1,96 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− * Olivier Tilloy <olivier.tilloy@canonical.com>
19− */
20−
21−import QtQuick 2.0
22−import Ubuntu.Components 0.1
23−import Unity.IndicatorsLegacy 0.1 as Indicators
24−
25−Indicators.BasicMenuItem {
26− property variant actionsDescription: menu ? menu.extra.canonical_message_actions : undefined
27−
28− onActionGroupChanged: loadItem()
29− onActionsDescriptionChanged: loadItem()
30− implicitHeight: contents.status == Loader.Ready ? contents.item.implicitHeight : 0
31−
32− Loader {
33− id: contents
34−
35− anchors.fill: parent
36− // Binding all properties for the item, to make sure that any change in the
37− // property will be propagated to the contents.item at any time
38− Binding {
39− target: contents.item
40− property: "menuActivated"
41− value: menuActivated
42− when: (contents.status == Loader.Ready)
43− }
44−
45− Binding {
46− target: contents.item
47− property: "actionGroup"
48− value: actionGroup
49− when: (contents.status == Loader.Ready)
50− }
51−
52− Binding {
53− target: contents.item
54− property: "menu"
55− value: menu
56− when: (contents.status == Loader.Ready)
57− }
58−
59− Binding {
60− target: contents.item
61− property: "actionsDescription"
62− value: actionsDescription
63− when: (contents.status == Loader.Ready)
64− }
65−
66− Connections {
67− target: contents.item ? contents.item : null
68− onActivateMenu: activateMenu()
69− onDeactivateMenu: deactivateMenu()
70− }
71− }
72−
73−
74− function loadItem()
75− {
76− var parameterType = ""
77− for (var actIndex in actionsDescription) {
78− var desc = actionsDescription[actIndex];
79− if (desc["parameter-type"] !== undefined) {
80− parameterType += desc["parameter-type"];
81− } else {
82− parameterType += "_";
83− }
84− }
85−
86− if (parameterType === "") {
87− contents.source = "SimpleTextMessage.qml";
88− } else if (parameterType === "s") {
89− contents.source = "TextMessage.qml";
90− } else if (parameterType === "_s") {
91− contents.source = "SnapDecision.qml";
92− } else {
93− console.debug("Unknown paramater type: " + parameterType);
94− }
95− }
96−}
plugins/Unity/IndicatorsLegacy/Network/CMakeLists.txtdeleted−45
@@ -1,45 +0,0 @@
1−# export_qmlplugin macro
2−include(Plugins)
3−
4−project(IndicatorsLegacyNetworkQml)
5−
6−pkg_check_modules(GLIB glib-2.0>=2.32)
7−pkg_check_modules(LIBNM_GLIB libnm-glib>=0.9.6)
8−pkg_check_modules(LIBNM_UTIL libnm-util>=0.9.6)
9−
10−if(LIBNM_GLIB_FOUND AND LIBNM_UTIL_FOUND AND GLIB_FOUND)
11− set(INDICATORS_LEGACY_NETWORK_SRC
12− networkagent.cpp
13− plugin.cpp
14− secret-agent.c
15− )
16−
17− add_library(IndicatorsLegacyNetworkQml MODULE
18− ${INDICATORS_LEGACY_NETWORK_SRC}
19− )
20−
21− qt5_use_modules(IndicatorsLegacyNetworkQml Core Qml Widgets)
22−
23− set_target_properties(IndicatorsLegacyNetworkQml PROPERTIES COMPILE_FLAGS -fPIC)
24−
25− include_directories(
26− ${CMAKE_CURRENT_SOURCE_DIR}
27− ${GLIB_INCLUDE_DIRS}
28− ${LIBNM_GLIB_INCLUDE_DIRS}
29− ${LIBNM_UTIL_INCLUDE_DIRS}
30− )
31−
32− target_link_libraries(IndicatorsLegacyNetworkQml
33− ${GLIB_LIBRARIES}
34− ${LIBNM_GLIB_LIBRARIES}
35− ${LIBNM_UTIL_LIBRARIES}
36− )
37−
38− # export the qmltypes and plugin files
39− export_qmlplugin(Unity.IndicatorsLegacy.Network 0.1 Unity/IndicatorsLegacy/Network TARGETS IndicatorsLegacyNetworkQml)
40−
41−else()
42− message(WARNING "Missing glib or libnm dependency for the network plugin, not building")
43−endif()
44−
45−add_subdirectory(qml)
plugins/Unity/IndicatorsLegacy/Network/networkagent.cppdeleted−146
@@ -1,146 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Alberto Ruiz <alberto.ruiz@canonical.com>
18− * Renato Araujo Oliveira Filho <renato@canonical.com>
19− */
20−
21−#include "networkagent.h"
22−
23−#include <QVariant>
24−#include <QApplication>
25−#include <QDebug>
26−
27−class NetworkAgentToken
28−{
29−public:
30− NMConnection *connection;
31− NMSettingWirelessSecurity *wisec;
32− guint id;
33− QByteArray keyMgmt;
34−
35− NetworkAgentToken(NMConnection *connection,
36− NMSettingWirelessSecurity *wisec,
37− guint id,
38− QByteArray keyMgmt)
39− : connection(connection),
40− wisec(wisec),
41− id(id),
42− keyMgmt(keyMgmt)
43− {
44− if (connection) {
45− g_object_ref(connection);
46− } else {
47− qWarning() << "invalid connection object";
48− }
49− }
50−
51− ~NetworkAgentToken()
52− {
53− if (connection) {
54− g_object_unref(connection);
55− }
56− }
57−};
58−
59−NetworkAgent::NetworkAgent(QObject *parent)
60− : QObject(parent)
61−{
62− m_agent = unity_settings_secret_agent_new();
63− g_signal_connect(G_OBJECT(m_agent),
64− UNITY_SETTINGS_SECRET_AGENT_SECRET_REQUESTED,
65− G_CALLBACK(onSecretRequested),
66− this);
67−
68− g_signal_connect(G_OBJECT(m_agent),
69− UNITY_SETTINGS_SECRET_AGENT_REQUEST_CANCELLED,
70− G_CALLBACK(onSecretRequestCancelled),
71− this);
72−}
73−
74−NetworkAgent::~NetworkAgent()
75−{
76− nm_secret_agent_unregister(NM_SECRET_AGENT(m_agent));
77− g_object_unref(m_agent);
78−}
79−
80−void NetworkAgent::authenticate(const QVariant &token, const QString &key)
81−{
82− NetworkAgentToken *pToken = (NetworkAgentToken *) token.value<void *>();
83− if (pToken == NULL) {
84− return;
85− }
86−
87− if ((pToken->keyMgmt == "wpa-none") || (pToken->keyMgmt == "wpa-psk")) {
88− g_object_set(G_OBJECT(pToken->wisec),
89− NM_SETTING_WIRELESS_SECURITY_PSK, qPrintable(key),
90− NULL);
91− } else if (pToken->keyMgmt == "none") {
92− g_object_set(G_OBJECT(pToken->wisec),
93− NM_SETTING_WIRELESS_SECURITY_WEP_KEY0, qPrintable(key),
94− NULL);
95− }
96−
97− GHashTable *settings = nm_connection_to_hash(pToken->connection,
98− NM_SETTING_HASH_FLAG_ALL);
99−
100− unity_settings_secret_agent_provide_secret(m_agent,
101− pToken->id, settings);
102− g_hash_table_unref(settings);
103− delete pToken;
104−}
105−
106−void NetworkAgent::cancel(const QVariant &token)
107−{
108− NetworkAgentToken *pToken = (NetworkAgentToken *) token.value<void *>();
109− if (pToken != NULL) {
110− unity_settings_secret_agent_cancel_request(m_agent, pToken->id);
111− delete pToken;
112− }
113−}
114−
115−void NetworkAgent::onSecretRequested(UnitySettingsSecretAgent* /*agent*/,
116− guint id,
117− NMConnection* connection,
118− const char* /*setting_name*/,
119− const char** /*hints*/,
120− NMSecretAgentGetSecretsFlags /*flags*/,
121− NetworkAgent* self)
122−{
123− NetworkAgentToken *token = new NetworkAgentToken(connection,
124− NULL,
125− id,
126− NULL);
127−
128− token->wisec = nm_connection_get_setting_wireless_security(connection);
129− if (token->wisec) {
130− token->keyMgmt = nm_setting_wireless_security_get_key_mgmt(token->wisec);
131− }
132−
133− QVariant varToken = qVariantFromValue((void *) token);
134− Q_EMIT self->secretRequested(varToken);
135−}
136−
137−void NetworkAgent::onSecretRequestCancelled(UnitySettingsSecretAgent* /*agent*/,
138− guint /*id*/,
139− NMConnection* /*connection*/,
140− const char* /*setting_name*/,
141− const char** /*hints*/,
142− NMSecretAgentGetSecretsFlags /*flags*/,
143− NetworkAgent* /*self*/)
144−{
145− //Do nothing for now
146−}
plugins/Unity/IndicatorsLegacy/Network/networkagent.hdeleted−65
@@ -1,65 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Alberto Ruiz <alberto.ruiz@canonical.com>
18− * Renato Araujo Oliveira Filho <renato@canonical.com>
19− */
20−
21−#ifndef NETWORKAGENT_H
22−#define NETWORKAGENT_H
23−
24−#include "secret-agent.h"
25−
26−#include <QObject>
27−
28−class NetworkAgentToken;
29−
30−class NetworkAgent : public QObject
31−{
32− Q_OBJECT
33−public:
34− NetworkAgent(QObject *parent=0);
35− ~NetworkAgent();
36−
37− Q_INVOKABLE void authenticate(const QVariant &token, const QString &key);
38− Q_INVOKABLE void cancel(const QVariant &token);
39−
40−Q_SIGNALS:
41− void secretRequested(const QVariant &token);
42− void secretRequestCancelled();
43−
44−private:
45− UnitySettingsSecretAgent *m_agent;
46−
47− static void onSecretRequested(UnitySettingsSecretAgent *agent,
48− guint id,
49− NMConnection *connection,
50− const char *setting_name,
51− const char **hints,
52− NMSecretAgentGetSecretsFlags flags,
53− NetworkAgent *self);
54−
55− static void onSecretRequestCancelled(UnitySettingsSecretAgent *agent,
56− guint id,
57− NMConnection *connection,
58− const char *setting_name,
59− const char **hints,
60− NMSecretAgentGetSecretsFlags flags,
61− NetworkAgent *self);
62−
63−};
64−
65−#endif
plugins/Unity/IndicatorsLegacy/Network/plugin.cppdeleted−31
@@ -1,31 +0,0 @@
1−/*
2− * Copyright (C) 2012 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− * Author: Nick Dedekind <nick.dedekind@canonical.com>
17− */
18−
19−// Qt
20−#include <QtQml/qqml.h>
21−
22−// self
23−#include "plugin.h"
24−
25−// local
26−#include "networkagent.h"
27−
28−void IndicatorsNetworkPlugin::registerTypes(const char *uri)
29−{
30− qmlRegisterType<NetworkAgent>(uri, 0, 1, "NetworkAgent");
31−}
plugins/Unity/IndicatorsLegacy/Network/plugin.hdeleted−32
@@ -1,32 +0,0 @@
1−/*
2− * Copyright (C) 2012 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− * Author: Nick Dedekind <nick.dedekind@canonical.com>
17− */
18−
19−#ifndef INDICATORS_NETWORK_PLUGIN_H
20−#define INDICATORS_NETWORK_PLUGIN_H
21−
22−#include <QtQml/QQmlExtensionPlugin>
23−
24−class IndicatorsNetworkPlugin : public QQmlExtensionPlugin
25−{
26− Q_OBJECT
27− Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28−public:
29− void registerTypes(const char *uri);
30−};
31−
32−#endif // INDICATORS_NETWORK_PLUGIN_H
plugins/Unity/IndicatorsLegacy/Network/qml/AccessPoint.qmldeleted−68
@@ -1,68 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−import Ubuntu.Components.ListItems 0.1 as ListItem
23−import Unity.IndicatorsLegacy 0.1 as Indicators
24−
25−Indicators.MenuItem {
26− id: accessPoint
27− property variant actionWifiApStrength : menu && actionGroup ? actionGroup.action(menu.extra.canonical_wifi_ap_strength_action) : null
28− property variant wifiApStrength : actionWifiApStrength && actionWifiApStrength.valid ? actionWifiApStrength.state : "0"
29−
30− function getNetworkIcon(data) {
31− var imageName = "nm-signal-100"
32− var signalStrength = parseInt(wifiApStrength)
33−
34− if (data.extra.canonical_wifi_ap_is_adhoc) {
35− imageName = "nm-adhoc";
36− } else if (signalStrength == 0) {
37− imageName = "nm-signal-00";
38− } else if (signalStrength <= 25) {
39− imageName = "nm-signal-25";
40− } else if (signalStrength <= 50) {
41− imageName = "nm-signal-50";
42− } else if (signalStrength <= 75) {
43− imageName = "nm-signal-75";
44− }
45−
46− if (data.extra.canonical_wifi_ap_is_secure) {
47− imageName += "-secure";
48− }
49−
50− return "image://theme/" + imageName;
51− }
52−
53− icon: menu && wifiApStrength ? getNetworkIcon(menu) : "image://theme/wifi-none"
54− iconFrame: false
55− control: CheckBox {
56− id: checkBoxActive
57− height: units.gu(4)
58− width: units.gu(4)
59− anchors.centerIn: parent
60− }
61−
62− Indicators.MenuActionBinding {
63− actionGroup: accessPoint.actionGroup
64− action: menu ? menu.action : ""
65− target: checkBoxActive
66− property: "checked"
67− }
68−}
plugins/Unity/IndicatorsLegacy/Network/qml/CMakeLists.txtdeleted−5
@@ -1,5 +0,0 @@
1−# export_qmlplugin macro
2−include(Plugins)
3−
4−# export the qmldir, *.qml files.
5−export_qmlfiles(Unity.IndicatorsLegacy.Network Unity/IndicatorsLegacy/Network)
plugins/Unity/IndicatorsLegacy/Network/qml/PasswordPage.qmldeleted−88
@@ -1,88 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−import Ubuntu.Components.ListItems 0.1 as ListItem
23−import Unity.IndicatorsLegacy 0.1 as Indicators
24−
25−Page {
26− id: pagePassword
27−
28− property variant agent
29− property variant token
30−
31− anchors.fill: parent
32− title: "Network Authentication"
33−
34− Column {
35− anchors {
36− left: parent.left
37− right: parent.right
38− }
39−
40− Indicators.SectionMenuItem {
41− label: "Authentication"
42− }
43−
44− Indicators.MenuItem {
45− implicitHeight: password.height + units.gu(1)
46−
47− PasswordTextField {
48− id: password
49− anchors {
50− left: parent.left
51− right: parent.right
52− margins: units.gu(3)
53− verticalCenter: parent.verticalCenter
54− }
55− }
56− }
57−
58− Indicators.MenuItem {
59− Row {
60− anchors {
61− right: parent.right
62− verticalCenter: parent.verticalCenter
63− margins: units.gu(3)
64− }
65−
66− spacing: units.gu(1)
67−
68− Button {
69− text: "Cancel"
70− width: units.gu(10)
71− onClicked: {
72− agent.cancel(token);
73− pageStack.pop();
74− }
75− }
76−
77− Button {
78− text: "OK"
79− width: units.gu(10)
80− onClicked: {
81− agent.authenticate(token, password.text);
82− pageStack.pop();
83− }
84− }
85− }
86− }
87− }
88−}
plugins/Unity/IndicatorsLegacy/Network/qml/PasswordTextField.qmldeleted−68
@@ -1,68 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−
23−Item {
24− id: textMenu
25−
26− property alias text: textField.text
27−
28− height: contentColumn.height
29−
30− Column {
31− id: contentColumn
32− spacing: units.gu(0.5)
33− anchors {
34− left: parent.left
35− right: parent.right
36− }
37−
38− TextField {
39− id: textField
40−
41− anchors {
42− left: parent.left
43− right: parent.right
44− }
45−
46− placeholderText: "Password"
47− echoMode: showPassword.checked ? TextInput.Normal : TextInput.Password
48− }
49−
50− Row {
51− anchors {
52− left: parent.left
53− right: parent.right
54− }
55−
56− spacing: units.gu(1)
57−
58− CheckBox {
59− id: showPassword
60− }
61−
62− Label {
63− text: "Show password"
64− anchors.verticalCenter: showPassword.verticalCenter
65− }
66− }
67− }
68−}
plugins/Unity/IndicatorsLegacy/Network/qml/WifiSection.qmldeleted−34
@@ -1,34 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−import Unity.IndicatorsLegacy 0.1 as Indicators
23−
24−Indicators.SectionMenuItem {
25− id: wifiSectionMenu
26−
27− Indicators.MenuAction {
28− id: busyAction
29− actionGroup: wifiSectionMenu.actionGroup
30− action: menu ? menu.extra.canonical_busy_action : ""
31− }
32−
33− busy: busyAction.valid ? busyAction.state : false
34−}
plugins/Unity/IndicatorsLegacy/Network/qml/qmldirdeleted−9
@@ -1,9 +0,0 @@
1−module Unity.IndicatorsLegacy.Network
2−plugin IndicatorsLegacyNetworkQml
3−typeinfo plugin.qmltypes
4−
5−NetworkPage 0.1 NetworkPage.qml
6−AccessPoint 0.1 AccessPoint.qml
7−PasswordPage 0.1 PasswordPage.qml
8−PasswordTextField 0.1 PasswordTextField.qml
9−WifiSection 0.1 WifiSection.qml
plugins/Unity/IndicatorsLegacy/Network/secret-agent.cdeleted−382
@@ -1,382 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Alberto Ruiz <alberto.ruiz@canonical.com>
18− * Renato Araujo Oliveira Filho <renato@canonical.com>
19− */
20−
21−
22−#include <glib.h>
23−#include <glib-object.h>
24−#include <nm-secret-agent.h>
25−#include "secret-agent.h"
26−
27−#define UNITY_SETTINGS_TYPE_SECRET_AGENT (unity_settings_secret_agent_get_type ())
28−#define UNITY_SETTINGS_SECRET_AGENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgent))
29−#define UNITY_SETTINGS_SECRET_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgentClass))
30−#define UNITY_SETTINGS_IS_SECRET_AGENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), UNITY_SETTINGS_TYPE_SECRET_AGENT))
31−#define UNITY_SETTINGS_IS_SECRET_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), UNITY_SETTINGS_TYPE_SECRET_AGENT))
32−#define UNITY_SETTINGS_SECRET_AGENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgentClass))
33−#define UNITY_SETTINGS_SECRET_AGENT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgentPrivate))
34−
35−#define AGENT_ID "com.canonical.settings.network.nm-agent"
36−
37−static gpointer unity_settings_secret_agent_parent_class = NULL;
38−
39−typedef struct _UnitySettingsSecretAgentPrivate UnitySettingsSecretAgentPrivate;
40−
41−struct _UnitySettingsSecretAgentPrivate {
42− GQueue *requests;
43−};
44−
45−typedef struct _SecretRequest {
46− gint id;
47− NMSecretAgent *agent;
48− NMConnection *connection;
49− const char *connection_path;
50− const char *setting_name;
51− const char **hints;
52− NMSecretAgentGetSecretsFlags flags;
53− NMSecretAgentGetSecretsFunc callback;
54− gpointer callback_data;
55−} SecretRequest;
56−
57−GType unity_settings_secret_agent_get_type (void) G_GNUC_CONST;
58−enum {
59− UNITY_SETTINGS_SECRET_AGENT_DUMMY_PROPERTY
60−};
61−
62−enum {
63− SECRET_REQUESTED,
64− REQUEST_CANCELLED,
65− LAST_SIGNAL
66−};
67−
68−static guint signals[LAST_SIGNAL] = { 0 };
69−
70−UnitySettingsSecretAgent* unity_settings_secret_agent_new (void);
71−UnitySettingsSecretAgent* unity_settings_secret_agent_construct (GType object_type);
72−
73−int
74−secret_request_find (SecretRequest *req,
75− guint *id)
76−{
77− if (req->id > *id)
78− return -1;
79−
80− if (req->id < *id)
81− return 1;
82−
83− return 0;
84−}
85−
86−void
87−unity_settings_secret_agent_provide_secret (UnitySettingsSecretAgent *agent,
88− guint request,
89− GHashTable *secrets)
90−{
91− GList *iter;
92− SecretRequest *req;
93− UnitySettingsSecretAgentPrivate *priv = agent->priv;
94−
95− iter = g_queue_find_custom (priv->requests,
96− &request,
97− (GCompareFunc)secret_request_find);
98−
99− if (iter == NULL || iter->data == NULL)
100− {
101− g_warning ("Secret request with id <%d> was not found", (int)request);
102− return;
103− }
104−
105− req = iter->data;
106−
107− req->callback (NM_SECRET_AGENT (agent),
108− req->connection,
109− secrets,
110− NULL,
111− req->callback_data);
112−
113− g_queue_remove_all (priv->requests, req);
114− g_free (req);
115− return;
116−}
117−
118−void
119−free_request (SecretRequest *req)
120−{
121− g_object_unref (req->connection);
122− g_free (req);
123−}
124−
125−void
126−unity_settings_secret_agent_cancel_request (UnitySettingsSecretAgent *agent,
127− guint request)
128−{
129− GList *iter;
130− SecretRequest *req;
131− UnitySettingsSecretAgentPrivate *priv = agent->priv;
132− GError *error;
133−
134− iter = g_queue_find_custom (priv->requests,
135− &request,
136− (GCompareFunc)secret_request_find);
137−
138− if (iter == NULL || iter->data == NULL)
139− {
140− g_warning ("Secret request with id <%d> was not found", (int)request);
141− return;
142− }
143−
144− req = iter->data;
145− error = g_error_new (NM_SECRET_AGENT_ERROR,
146− NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
147− "This secret request was canceled by the user.");
148−
149− req->callback (NM_SECRET_AGENT (agent),
150− req->connection,
151− NULL,
152− error,
153− req->callback_data);
154−
155− g_queue_remove_all (priv->requests, req);
156− free_request (req);
157− return;
158−}
159−
160−static void
161−delete_secrets (NMSecretAgent *agent,
162− NMConnection *connection,
163− const char *connection_path,
164− NMSecretAgentDeleteSecretsFunc callback,
165− gpointer callback_data)
166−{
167− g_debug ("delete secrets");
168−}
169−
170−/* If it returns G_MAXUINT it's considered an error */
171−static guint
172−find_available_id (UnitySettingsSecretAgentPrivate *priv)
173−{
174− guint i = 0;
175− guint candidate = 0;
176−
177− if (g_queue_get_length (priv->requests) == G_MAXUINT)
178− return G_MAXUINT;
179−
180− while (i < g_queue_get_length (priv->requests))
181− {
182− SecretRequest *req = (SecretRequest*)g_queue_peek_nth (priv->requests, i);
183−
184− if (req->id == candidate)
185− {
186− candidate++;
187− i = 0;
188− }
189− else
190− {
191− i++;
192− }
193− }
194−
195− return i;
196−}
197−
198−static void
199−get_secrets (NMSecretAgent *agent,
200− NMConnection *connection,
201− const char *connection_path,
202− const char *setting_name,
203− const char **hints,
204− NMSecretAgentGetSecretsFlags flags,
205− NMSecretAgentGetSecretsFunc callback,
206− gpointer callback_data)
207−{
208− guint id;
209− UnitySettingsSecretAgentPrivate *priv = UNITY_SETTINGS_SECRET_AGENT_GET_PRIVATE (agent);
210− SecretRequest *req = NULL;
211−
212− if (flags == NM_SECRET_AGENT_GET_SECRETS_FLAG_NONE)
213− {
214− GError *error = g_error_new (NM_SECRET_AGENT_ERROR,
215− NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
216− "No password found for this connection.");
217− callback (agent, connection, NULL, error, callback_data);
218− g_error_free (error);
219− return;
220− }
221−
222− id = find_available_id (priv);
223− if (id == G_MAXUINT)
224− {
225− GError *error = g_error_new (NM_SECRET_AGENT_ERROR,
226− NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
227− "Reached maximum number of requests.");
228− callback (agent, connection, NULL, error, callback_data);
229− g_error_free (error);
230− return;
231− }
232−
233− /* Adding a request */
234− req = (SecretRequest*) g_malloc0 (sizeof (SecretRequest));
235− *req = ((SecretRequest)
236− { id,
237− agent,
238− connection,
239− connection_path,
240− setting_name,
241− hints,
242− flags,
243− callback,
244− callback_data });
245−
246− g_object_ref (connection);
247−
248− g_queue_push_tail (priv->requests, req);
249−
250− g_signal_emit_by_name (agent,
251− UNITY_SETTINGS_SECRET_AGENT_SECRET_REQUESTED,
252− id,
253− connection,
254− setting_name,
255− hints,
256− flags);
257−}
258−
259−static void
260−save_secrets (NMSecretAgent *agent,
261− NMConnection *connection,
262− const char *connection_path,
263− NMSecretAgentSaveSecretsFunc callback,
264− gpointer callback_data)
265−{
266− g_debug ("save secrets");
267−}
268−
269−static void
270−cancel_get_secrets (NMSecretAgent *agent,
271− const char *connection_path,
272− const char *setting_name)
273−{
274− g_debug ("cancel get secrets");
275−}
276−
277−UnitySettingsSecretAgent*
278−unity_settings_secret_agent_construct (GType object_type)
279−{
280− UnitySettingsSecretAgent * self = NULL;
281− self = (UnitySettingsSecretAgent*) g_object_new (object_type,
282− NM_SECRET_AGENT_IDENTIFIER, AGENT_ID,
283− NULL);
284− return self;
285−}
286−
287−
288−UnitySettingsSecretAgent*
289−unity_settings_secret_agent_new (void)
290−{
291− return unity_settings_secret_agent_construct (UNITY_SETTINGS_TYPE_SECRET_AGENT);
292−}
293−
294−static void
295−destroy_pending_request (gpointer data)
296−{
297− SecretRequest* req = (SecretRequest*)data;
298− /* Reporting the cancellation of all pending requests */
299− g_signal_emit_by_name (req->agent,
300− UNITY_SETTINGS_SECRET_AGENT_REQUEST_CANCELLED,
301− req->id);
302−
303− free_request (req);
304−}
305−
306−static void
307−unity_settings_secret_agent_finalize (GObject *agent)
308−{
309− UnitySettingsSecretAgentPrivate *priv = UNITY_SETTINGS_SECRET_AGENT_GET_PRIVATE (agent);
310−
311− g_queue_free_full (priv->requests, destroy_pending_request);
312−}
313−
314−static void
315−unity_settings_secret_agent_class_init (UnitySettingsSecretAgentClass *klass)
316−{
317− unity_settings_secret_agent_parent_class = g_type_class_peek_parent (klass);
318− NMSecretAgentClass *parent_class = NM_SECRET_AGENT_CLASS (klass);
319− parent_class->get_secrets = get_secrets;
320− parent_class->save_secrets = save_secrets;
321− parent_class->delete_secrets = delete_secrets;
322− parent_class->cancel_get_secrets = cancel_get_secrets;
323−
324− g_type_class_add_private (klass, sizeof(UnitySettingsSecretAgentPrivate));
325− G_OBJECT_CLASS (klass)->finalize = unity_settings_secret_agent_finalize;
326−
327−
328− signals[SECRET_REQUESTED] = g_signal_new (UNITY_SETTINGS_SECRET_AGENT_SECRET_REQUESTED,
329− G_OBJECT_CLASS_TYPE (G_OBJECT_CLASS (klass)),
330− G_SIGNAL_RUN_FIRST,
331− G_STRUCT_OFFSET (UnitySettingsSecretAgentClass, secret_requested),
332− NULL, NULL, NULL,
333− G_TYPE_NONE, 5,
334− G_TYPE_UINT, G_TYPE_POINTER, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_UINT);
335−
336− signals[REQUEST_CANCELLED] = g_signal_new (UNITY_SETTINGS_SECRET_AGENT_REQUEST_CANCELLED,
337− G_OBJECT_CLASS_TYPE (G_OBJECT_CLASS (klass)),
338− G_SIGNAL_RUN_FIRST,
339− G_STRUCT_OFFSET (UnitySettingsSecretAgentClass, request_cancelled),
340− NULL, NULL, NULL,
341− G_TYPE_NONE, 1,
342− G_TYPE_UINT);
343−}
344−
345−
346−static void
347−unity_settings_secret_agent_instance_init (UnitySettingsSecretAgent *self)
348−{
349− self->priv = UNITY_SETTINGS_SECRET_AGENT_GET_PRIVATE (self);
350− self->priv->requests = g_queue_new ();
351−}
352−
353−GType
354−unity_settings_secret_agent_get_type (void)
355−{
356− static volatile gsize unity_settings_secret_agent_type_id__volatile = 0;
357− if (g_once_init_enter (&unity_settings_secret_agent_type_id__volatile))
358− {
359− static const GTypeInfo g_define_type_info =
360− {
361− sizeof (UnitySettingsSecretAgentClass),
362− (GBaseInitFunc) NULL,
363− (GBaseFinalizeFunc) NULL,
364− (GClassInitFunc) unity_settings_secret_agent_class_init,
365− (GClassFinalizeFunc) NULL,
366− NULL,
367− sizeof (UnitySettingsSecretAgent),
368− 0,
369− (GInstanceInitFunc) unity_settings_secret_agent_instance_init,
370− NULL
371− };
372− GType unity_settings_secret_agent_type_id;
373− unity_settings_secret_agent_type_id = g_type_register_static (NM_TYPE_SECRET_AGENT,
374− "UnitySettingsSecretAgent",
375− &g_define_type_info,
376− 0);
377− g_once_init_leave (&unity_settings_secret_agent_type_id__volatile,
378− unity_settings_secret_agent_type_id);
379− }
380−
381− return unity_settings_secret_agent_type_id__volatile;
382−}
plugins/Unity/IndicatorsLegacy/Network/secret-agent.hdeleted−102
@@ -1,102 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Alberto Ruiz <alberto.ruiz@canonical.com>
18− * Renato Araujo Oliveira Filho <renato@canonical.com>
19− */
20−
21−#ifndef __SECRET_AGENT_H__
22−#define __SECRET_AGENT_H__
23−
24−#include <glib.h>
25−#include <glib-object.h>
26−#include <nm-secret-agent.h>
27−
28−/*
29− * This class is a basic implementation of the NetworkManager SecretAgent base class.
30− *
31− * The purpose of this class is to handle credential requests from the network,
32− * for example, from a WiFi hotspot or a VPN network.
33− *
34− * It queues requests objects (SecretRequest) on a GQueue in the private struct
35− * of the class. And notifies the consumer of the class through the "secret-request"
36− * and the "request-cancelled" signals with the following callback prototypes:
37− *
38− * void (*secret_requested) (UnitySettingsSecretAgent *self,
39− * guint id,
40− * NMConnection *connection,
41− * const char *setting_name,
42− * const char **hints,
43− * NMSecretAgentGetSecretsFlags flags,
44− * gpointer user_data);
45− *
46− * void (*request_cancelled) (UnitySettingsSecretAgent *self,
47− * guint id,
48− * gpointer user_data);
49− *
50− */
51−
52−
53−G_BEGIN_DECLS
54−
55−
56−#define UNITY_SETTINGS_TYPE_SECRET_AGENT (unity_settings_secret_agent_get_type ())
57−#define UNITY_SETTINGS_SECRET_AGENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgent))
58−#define UNITY_SETTINGS_SECRET_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgentClass))
59−#define UNITY_SETTINGS_IS_SECRET_AGENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), UNITY_SETTINGS_TYPE_SECRET_AGENT))
60−#define UNITY_SETTINGS_IS_SECRET_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), UNITY_SETTINGS_TYPE_SECRET_AGENT))
61−#define UNITY_SETTINGS_SECRET_AGENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgentClass))
62−
63−#define UNITY_SETTINGS_SECRET_AGENT_SECRET_REQUESTED "secret-requested"
64−#define UNITY_SETTINGS_SECRET_AGENT_REQUEST_CANCELLED "request-cancelled"
65−
66−typedef struct _UnitySettingsSecretAgent UnitySettingsSecretAgent;
67−typedef struct _UnitySettingsSecretAgentClass UnitySettingsSecretAgentClass;
68−typedef struct _UnitySettingsSecretAgentPrivate UnitySettingsSecretAgentPrivate;
69−
70−struct _UnitySettingsSecretAgent {
71− NMSecretAgent parent_instance;
72− UnitySettingsSecretAgentPrivate * priv;
73−};
74−
75−struct _UnitySettingsSecretAgentClass {
76− NMSecretAgentClass parent_class;
77−
78− void (*secret_requested) (UnitySettingsSecretAgent *self,
79− guint id,
80− NMConnection *connection,
81− const char *setting_name,
82− const char **hints,
83− NMSecretAgentGetSecretsFlags flags);
84−
85− void (*request_cancelled) (UnitySettingsSecretAgent *self,
86− guint id);
87−};
88−
89−
90−GType unity_settings_secret_agent_get_type (void) G_GNUC_CONST;
91−UnitySettingsSecretAgent* unity_settings_secret_agent_new (void);
92−UnitySettingsSecretAgent* unity_settings_secret_agent_construct (GType object_type);
93−
94−void unity_settings_secret_agent_provide_secret (UnitySettingsSecretAgent *agent,
95− guint request,
96− GHashTable *secrets);
97−void unity_settings_secret_agent_cancel_request (UnitySettingsSecretAgent *agent,
98− guint request);
99−
100−G_END_DECLS
101−
102−#endif
plugins/Unity/IndicatorsLegacy/flatmenuproxymodel.cppdeleted−288
@@ -1,288 +0,0 @@
1−/*
2− * Copyright 2012 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− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−extern "C" {
21−#include <gio/gio.h>
22−}
23−
24−#include "flatmenuproxymodel.h"
25−#include <QString>
26−#include <QStringList>
27−
28−FlatMenuProxyModel::FlatMenuProxyModel(QAbstractItemModel *source)
29− : QAbstractProxyModel(source),
30− m_rowCount(0)
31−{
32− m_model = new QDBusMenuModel;
33− setSourceModel(m_model);
34−}
35−
36−/*! \internal */
37−FlatMenuProxyModel::~FlatMenuProxyModel()
38−{
39− delete m_model;
40−}
41−
42−void FlatMenuProxyModel::setSourceModel(QAbstractItemModel *source)
43−{
44− if (sourceModel()) {
45− QAbstractItemModel *oldSource = sourceModel();
46− if (oldSource == source) {
47− return;
48− }
49−
50− oldSource->disconnect(this);
51− }
52−
53− QAbstractProxyModel::setSourceModel(source);
54−
55− if (source) {
56−
57− // FIXME - not working correctly with dynamic inserts/removes
58− // FIXME 2 - We're using Queud connections as a workaround to QTBUG-32859
59− // The signals from qmenumodel are coming straight off the glib event loop,
60− // which is not supported and has the effect of listview delegates not to be deleted.
61−
62− connect(source,
63− SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)),
64− SLOT(onModelAboutToBeReset()), Qt::QueuedConnection);
65− connect(source,
66− SIGNAL(rowsInserted(QModelIndex,int,int)),
67− SLOT(onModelReset()), Qt::QueuedConnection);
68−
69− connect(source,
70− SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
71− SLOT(onModelAboutToBeReset()), Qt::QueuedConnection);
72− connect(source,
73− SIGNAL(rowsRemoved(QModelIndex,int,int)),
74− SLOT(onModelReset()), Qt::QueuedConnection);
75−
76− connect(source,
77− SIGNAL(modelAboutToBeReset()),
78− SLOT(onModelAboutToBeReset()), Qt::QueuedConnection);
79− connect(source,
80− SIGNAL(modelReset()),
81− SLOT(onModelReset()), Qt::QueuedConnection);
82−
83− //Connection args
84− connect(source,
85− SIGNAL(busTypeChanged(DBusEnums::BusType)),
86− SIGNAL(busTypeChanged()));
87−
88− connect(source,
89− SIGNAL(busNameChanged(const QString&)),
90− SIGNAL(busNameChanged()));
91−
92− connect(source,
93− SIGNAL(objectPathChanged(const QString&)),
94− SIGNAL(objectPathChanged()));
95−
96− connect(source,
97− SIGNAL(statusChanged(DBusEnums::ConnectionStatus)),
98− SIGNAL(statusChanged()), Qt::QueuedConnection);
99−
100− // initiliaze rowCount
101− QModelIndex lastItem = source->index(source->rowCount() - 1, 0);
102− m_rowCount = recursiveRowCount(lastItem);
103− } else {
104− m_rowCount = 0;
105− }
106−
107− Q_EMIT countChanged();
108−}
109−
110−void FlatMenuProxyModel::setBusName(const QString &busName)
111−{
112− m_model->setBusName(busName);
113−}
114−
115−QString FlatMenuProxyModel::busName() const
116−{
117− return m_model->busName();
118−}
119−
120−void FlatMenuProxyModel::setObjectPath(const QString &busPath)
121−{
122− m_model->setObjectPath(busPath);
123−}
124−
125−QString FlatMenuProxyModel::objectPath() const
126−{
127− return m_model->objectPath();
128−}
129−
130−int FlatMenuProxyModel::status() const
131−{
132− return m_model->status();
133−}
134−
135−DBusEnums::BusType FlatMenuProxyModel::busType() const
136−{
137− return m_model->busType();
138−}
139−
140−void FlatMenuProxyModel::setIntBusType(int type)
141−{
142− m_model->setBusType((DBusEnums::BusType) type);
143−}
144−
145−void FlatMenuProxyModel::start()
146−{
147− m_model->start();
148−}
149−
150−void FlatMenuProxyModel::stop()
151−{
152− m_model->stop();
153−}
154−
155−QModelIndex FlatMenuProxyModel::mapFromSource(const QModelIndex &index) const
156−{
157− if (!index.isValid()) {
158− return QModelIndex();
159− }
160−
161− QModelIndex result = createIndex(rowOffsetOf(index, index.row()), 0);
162− return result;
163−}
164−
165−QModelIndex FlatMenuProxyModel::mapToSource(const QModelIndex &index) const
166−{
167− if (sourceModel() && m_indexCache.contains(index.row())) {
168− QString key = m_indexCache.value(index.row());
169− QStringList sections = key.split('.', QString::SkipEmptyParts);
170− QModelIndex sourceIndex = QModelIndex();
171− for(int i=0; i < sections.size(); i++) {
172− sourceIndex = sourceModel()->index(sections.at(i).toInt(), 9, sourceIndex);
173− }
174− return sourceIndex;
175− } else {
176− return QModelIndex();
177− }
178−}
179−
180−QModelIndex FlatMenuProxyModel::index(int row, int sectionRow, const QModelIndex &parent, const QString &key) const
181−{
182− for (int i = 0, count = 0; i < sourceModel()->rowCount(parent); i++) {
183− QModelIndex sourceIndex = sourceModel()->index(i, 0, parent);
184− int indexCount = recursiveRowCount(sourceIndex);
185−
186− if (count == sectionRow) {
187− QString sectionKey = key + "." + QString::number(i);
188− m_indexCache.insert(row, sectionKey);
189− return createIndex(row, 0);
190− } else if ((count + indexCount) >= sectionRow) {
191− count++;
192− return index(row, sectionRow - count, sourceIndex, key + "." + QString::number(i));
193− }
194−
195− count += indexCount + 1;
196− }
197− return QModelIndex();
198−}
199−
200−QModelIndex FlatMenuProxyModel::index(int row, int, const QModelIndex &) const
201−{
202− return index(row, row, QModelIndex(), "");
203−}
204−
205−QModelIndex FlatMenuProxyModel::parent(const QModelIndex &) const
206−{
207− return QModelIndex();
208−}
209−
210−int FlatMenuProxyModel::columnCount(const QModelIndex &) const
211−{
212− return 1;
213−}
214−
215−int FlatMenuProxyModel::rowCount(const QModelIndex &) const
216−{
217− return m_rowCount;
218−}
219−
220−int FlatMenuProxyModel::count() const
221−{
222− return rowCount(QModelIndex());
223−}
224−
225−void FlatMenuProxyModel::onModelAboutToBeReset()
226−{
227− beginResetModel();
228−}
229−
230−void FlatMenuProxyModel::onModelReset()
231−{
232− // initiliaze rowCount
233− m_rowCount = 0;
234− for (int i = 0, iMax = sourceModel()->rowCount(); i < iMax; i++) {
235− QModelIndex index = sourceModel()->index(i, 0);
236− m_rowCount += recursiveRowCount(index) + 1;
237− }
238− m_indexCache.clear();
239− endResetModel();
240− Q_EMIT countChanged();
241−}
242−
243−int FlatMenuProxyModel::recursiveRowCount(const QModelIndex &index) const
244−{
245− int size = sourceModel()->rowCount(index);
246− for (int i=0, iMax=size; i < iMax; i++) {
247− QModelIndex currentIndex = sourceModel()->index(i, 0, index);
248− size += recursiveRowCount(currentIndex);
249− }
250−
251− return size;
252−}
253−
254−int FlatMenuProxyModel::rowOffsetOf(const QModelIndex &index, int row, bool inclusive) const
255−{
256− int offset = 0;
257−
258− QModelIndex parent = index.parent();
259−
260− // Check row 0 offset
261− while(parent.isValid()) {
262− offset += 1;
263− for (int i = 0; i < parent.row(); i++) {
264− QModelIndex currentIndex = sourceModel()->index(i, 0, parent);
265− offset += recursiveRowCount(currentIndex) + 1;
266− }
267− parent = parent.parent();
268− }
269−
270− // Check index.row() offset
271− for(int i = 0; i < row; i++) {
272− QModelIndex currentIndex = sourceModel()->index(i, 0, index.parent());
273− offset += recursiveRowCount(currentIndex) + 1;
274− }
275−
276− if (inclusive) {
277− // itself
278− QModelIndex currentIndex = sourceModel()->index(row, 0, index.parent());
279− offset += recursiveRowCount(currentIndex);
280− }
281−
282− return offset;
283−}
284−
285−QVariant FlatMenuProxyModel::data(int row, int role) const
286−{
287− return QAbstractProxyModel::data(index(row, 0), role);
288−}
plugins/Unity/IndicatorsLegacy/flatmenuproxymodel.hdeleted−93
@@ -1,93 +0,0 @@
1−/*
2− * Copyright 2012 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− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−#ifndef FLATMENUPROXYMODEL_H
21−#define FLATMENUPROXYMODEL_H
22−
23−#include "unityindicatorsglobal.h"
24−
25−#include <QAbstractProxyModel>
26−#include <qdbusmenumodel.h>
27−
28−class SectionInfo;
29−
30−class UNITYINDICATORS_EXPORT FlatMenuProxyModel : public QAbstractProxyModel
31−{
32− Q_OBJECT
33− Q_PROPERTY(int count READ count NOTIFY countChanged)
34− Q_PROPERTY(int busType READ busType WRITE setIntBusType NOTIFY busTypeChanged)
35− Q_PROPERTY(QString busName READ busName WRITE setBusName NOTIFY busNameChanged)
36− Q_PROPERTY(QString objectPath READ objectPath WRITE setObjectPath NOTIFY objectPathChanged)
37− Q_PROPERTY(int status READ status NOTIFY statusChanged)
38−
39− Q_ENUMS(Roles)
40−public:
41− FlatMenuProxyModel(QAbstractItemModel *source=0);
42− ~FlatMenuProxyModel();
43−
44− void setSourceModel(QAbstractItemModel * sourceModel);
45−
46− Q_INVOKABLE QVariant data(int row, int role = Qt::DisplayRole) const;
47−
48− QModelIndex mapFromSource(const QModelIndex &index) const;
49− QModelIndex mapToSource(const QModelIndex &index) const;
50−
51− QModelIndex index(int row, int column = 0, const QModelIndex &parent = QModelIndex()) const;
52− QModelIndex parent(const QModelIndex &index) const;
53− int rowCount(const QModelIndex &parent = QModelIndex()) const;
54− int count() const;
55− int columnCount(const QModelIndex &parent) const;
56−
57− void setBusName(const QString &busName);
58− QString busName() const;
59−
60− void setObjectPath(const QString &busName);
61− QString objectPath() const;
62−
63− DBusEnums::BusType busType() const;
64− void setIntBusType(int type);
65−
66− int status() const;
67−
68−public Q_SLOTS:
69− void onModelAboutToBeReset();
70− void onModelReset();
71−
72− void start();
73− void stop();
74−
75−Q_SIGNALS:
76− void countChanged();
77−
78− void busTypeChanged();
79− void busNameChanged();
80− void objectPathChanged();
81− void statusChanged();
82−
83−private:
84− QDBusMenuModel *m_model;
85− mutable QMap<int, QString> m_indexCache;
86− int m_rowCount;
87−
88− int rowOffsetOf(const QModelIndex &index, int row, bool inclusive = false) const;
89− int recursiveRowCount(const QModelIndex &index) const;
90− QModelIndex index(int row, int rowCount, const QModelIndex &parent, const QString &key) const;
91−};
92−
93−#endif
plugins/Unity/IndicatorsLegacy/modelprinter.cppdeleted−114
@@ -1,114 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Nick Dedekind <nick.dedekind@canonical.com>
18− */
19−
20−// self
21−#include "modelprinter.h"
22−
23−// Qt
24−#include <QTextStream>
25−
26−ModelPrinter::ModelPrinter(QObject *parent)
27− : QObject(parent)
28− , m_model(NULL)
29−{
30−}
31−
32−void ModelPrinter::setSourceModel(QAbstractItemModel * sourceModel)
33−{
34− if (m_model != NULL) {
35− disconnect(m_model);
36− }
37− if (m_model != sourceModel) {
38− m_model = sourceModel;
39− Q_EMIT modelChanged();
40− Q_EMIT textChanged();
41− }
42− if (m_model != NULL) {
43− connect(m_model, SIGNAL(modelReset()), this, SIGNAL(textChanged()));
44− connect(m_model, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SIGNAL(textChanged()));
45− connect(m_model, SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SIGNAL(textChanged()));
46− }
47−}
48−
49−QAbstractItemModel* ModelPrinter::sourceModel() const
50−{
51− return m_model;
52−}
53−
54−QString ModelPrinter::text(const QModelIndex& index) const
55−{
56− return recurseString(index, 0);
57−}
58−
59−QString tabify(int level) { QString str;
60− for (int i = 0; i < level; i++) {
61− str += " ";
62− }
63− return str;
64−}
65−
66−QString ModelPrinter::recurseString(const QModelIndex& index, int level) const
67−{
68− if (!m_model)
69− return "";
70−
71− QString str;
72− QTextStream stream(&str);
73−
74− QHash<int, QByteArray> roleNames = m_model->roleNames();
75− QList<int> roles = roleNames.keys();
76− qSort(roles);
77− Q_FOREACH(int role, roles) {
78− QVariant vData = m_model->data(index, role);
79− if (vData.canConvert(QMetaType::QVariantMap)) {
80− QMapIterator<QString, QVariant> iter(vData.toMap());
81− while (iter.hasNext()) {
82− iter.next();
83− stream << tabify(level)
84− << roleNames[role]
85− << "."
86− << iter.key()
87− << ": "
88− << iter.value().toString()
89− << endl;
90− }
91− }
92− else {
93− stream << tabify(level)
94− << roleNames[role]
95− << ": "
96− << vData.toString()
97− << endl;
98− }
99− }
100−
101− int rowCount = m_model->rowCount(index);
102− stream << tabify(level)
103− << "child count"
104− << ": "
105− << rowCount
106− << endl
107− << endl;
108−
109− for (int i = 0; i < rowCount; i++) {
110− QModelIndex child = m_model->index(i, 0, index);
111− str += recurseString(child, level+1);
112− }
113− return str;
114−}
plugins/Unity/IndicatorsLegacy/modelprinter.hdeleted−50
@@ -1,50 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Nick Dedekind <nick.dedekind@canonical.com>
18− */
19−
20−#ifndef MODELPRINTER_H
21−#define MODELPRINTER_H
22−
23−#include <QSortFilterProxyModel>
24−
25−// This class acts as a namespace only, with the addition that its enums
26−// are registered to be exposed on the QML side.
27−class ModelPrinter : public QObject
28−{
29− Q_OBJECT
30−
31− Q_PROPERTY(QAbstractItemModel* model READ sourceModel WRITE setSourceModel NOTIFY modelChanged)
32− Q_PROPERTY(QString text READ text NOTIFY textChanged)
33−public:
34− ModelPrinter(QObject* parent=0);
35−
36− void setSourceModel(QAbstractItemModel* sourceModel);
37− QAbstractItemModel* sourceModel() const;
38−
39− Q_INVOKABLE QString text(const QModelIndex& index = QModelIndex()) const;
40−
41−Q_SIGNALS:
42− void modelChanged();
43− void textChanged();
44−
45−private:
46− QString recurseString(const QModelIndex& index, int level) const;
47− QAbstractItemModel* m_model;
48−};
49−
50−#endif // MODELPRINTER_H
plugins/Unity/IndicatorsLegacy/plugin.cppdeleted−42
@@ -1,42 +0,0 @@
1−/*
2− * Copyright (C) 2012 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− * Author: Nick Dedekind <nick.dedekind@canonical.com>
17− */
18−
19−// Qt
20−#include <QtQml/qqml.h>
21−
22−// self
23−#include "plugin.h"
24−
25−// local
26−#include "flatmenuproxymodel.h"
27−#include "indicators.h"
28−#include "modelprinter.h"
29−
30−void IndicatorsPlugin::registerTypes(const char *uri)
31−{
32− Q_INIT_RESOURCE(indicators);
33−
34− qmlRegisterType<FlatMenuProxyModel>(uri, 0, 1, "FlatMenuProxyModel");
35− qmlRegisterType<ModelPrinter>(uri, 0, 1, "ModelPrinter");
36−
37− qmlRegisterUncreatableType<ActionState>(uri, 0, 1, "ActionState", "Can't create ActionState class");
38− qmlRegisterUncreatableType<NetworkActionState>(uri, 0, 1, "NetworkActionState", "Can't create NetworkActionState class");
39− qmlRegisterUncreatableType<NetworkConnection>(uri, 0, 1, "NetworkConnection", "Can't create NetworkConnection class");
40− qmlRegisterUncreatableType<IndicatorsModelRole>(uri, 0, 1, "IndicatorsModelRole", "Can't create IndicatorsModelRole class");
41− qmlRegisterUncreatableType<FlatMenuProxyModelRole>(uri, 0, 1, "FlatMenuProxyModelRole", "Can't create FlatMenuProxyModelRole class");
42−}
plugins/Unity/IndicatorsLegacy/plugin.hdeleted−32
@@ -1,32 +0,0 @@
1−/*
2− * Copyright (C) 2012 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− * Author: Nick Dedekind <nick.dedekind@canonical.com>
17− */
18−
19−#ifndef INDICATORS_PLUGIN_H
20−#define INDICATORS_PLUGIN_H
21−
22−#include <QtQml/QQmlExtensionPlugin>
23−
24−class IndicatorsPlugin : public QQmlExtensionPlugin
25−{
26− Q_OBJECT
27− Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28−public:
29− void registerTypes(const char *uri);
30−};
31−
32−#endif // INDICATORS_PLUGIN_H
plugins/Unity/IndicatorsLegacy/qml/BasicMenuItem.qmldeleted−48
@@ -1,48 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components.ListItems 0.1 as ListItem
22−
23−ListItem.Standard {
24− id: stdListItem
25−
26− property bool menuActivated: false
27− property QtObject menu
28− property QtObject actionGroup
29− property alias color: background.color
30−
31− signal activateMenu()
32− signal deactivateMenu()
33−
34− showDivider: false
35− __foregroundColor: "#e8e1d0"
36−
37− backgroundIndicator: RemoveBackground {
38− state: stdListItem.swipingState
39− }
40−
41− Rectangle {
42− id: background
43−
44− anchors.fill: parent
45− color: "#221e1c"
46− z: -1
47− }
48−}
plugins/Unity/IndicatorsLegacy/qml/ButtonMenuItem.qmldeleted−47
@@ -1,47 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−
23−BasicMenuItem {
24− id: buttonMenu
25− color: "#221e1b"
26− implicitHeight: units.gu(7)
27−
28− Button {
29− id: button
30− enabled: menuAction.valid
31− text: menu ? menu.label : ""
32− anchors.centerIn: parent
33− height: units.gu(4)
34− width: units.gu(16)
35− color: "#1b1817"
36−
37− onClicked: {
38− menuAction.activate()
39− }
40− }
41−
42− MenuAction {
43− id: menuAction
44− actionGroup: buttonMenu.actionGroup
45− action: menu ? menu.action : ""
46− }
47−}
plugins/Unity/IndicatorsLegacy/qml/CMakeLists.txtdeleted−5
@@ -1,5 +0,0 @@
1−# export_qmlplugin macro
2−include(Plugins)
3−
4−# export the qmldir, *.qml files.
5−export_qmlfiles(Unity.IndicatorsLegacy Unity/IndicatorsLegacy)
plugins/Unity/IndicatorsLegacy/qml/DivMenuItem.qmldeleted−26
@@ -1,26 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Olivier Tilloy <olivier.tilloy@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−
23−Rectangle {
24− color: "#181514"
25− implicitHeight: units.gu(1)
26−}
plugins/Unity/IndicatorsLegacy/qml/HLine.qmldeleted−29
@@ -1,29 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−
23−Rectangle {
24− height: units.dp(1)
25− anchors {
26− left: parent.left
27− right: parent.right
28− }
29−}
plugins/Unity/IndicatorsLegacy/qml/IndicatorBase.qmldeleted−59
@@ -1,59 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− * Nick Dedekind <nick.dedekind@canonical.com>
19− */
20−
21−import QtQuick 2.0
22−import QMenuModel 0.1
23−import Unity.IndicatorsLegacy 0.1 as Indicators
24−
25−Item {
26− id: indicatorItem
27−
28− //const
29− property string title
30− property int busType
31− property string busName
32− property string actionsObjectPath
33− property var menuObjectPaths: undefined
34− readonly property string device: "phone"
35−
36− property string deviceMenuObjectPath: menuObjectPaths.hasOwnProperty(device) ? menuObjectPaths[device] : ""
37−
38− signal actionGroupUpdated()
39− signal modelUpdated()
40−
41− property var actionGroup: QDBusActionGroup {
42− busType: indicatorItem.busType
43− busName: indicatorItem.busName
44− objectPath: indicatorItem.actionsObjectPath
45−
46− onActionAppear: indicatorItem.actionGroupUpdated();
47− }
48−
49− property var proxyModel: Indicators.FlatMenuProxyModel {
50− busType: indicatorItem.busType
51− busName: indicatorItem.busName
52− objectPath: indicatorItem.deviceMenuObjectPath
53−
54− onStatusChanged: indicatorItem.modelUpdated();
55− onRowsInserted: indicatorItem.modelUpdated();
56− onRowsRemoved: indicatorItem.modelUpdated();
57− onDataChanged: indicatorItem.modelUpdated();
58− }
59−}
plugins/Unity/IndicatorsLegacy/qml/IndicatorPage.qmldeleted−191
@@ -1,191 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− * Nick Dedekind <nick.dedekind@canonical.com>
19− */
20−
21−import QtQuick 2.0
22−import Ubuntu.Components 0.1 as Components
23−
24−IndicatorBase {
25− id: main
26−
27− //const
28− property alias emptyText: emptyLabel.text
29− property alias highlightFollowsCurrentItem : mainMenu.highlightFollowsCurrentItem
30− property bool __active: false
31−
32− ListView {
33− id: mainMenu
34−
35− property int visibleItems: 0
36−
37− model: proxyModel
38− anchors {
39− fill: parent
40− bottomMargin: Qt.inputMethod.visible ? (Qt.inputMethod.keyboardRectangle.height - main.anchors.bottomMargin) : 0
41−
42− Behavior on bottomMargin {
43− NumberAnimation {
44− duration: 175
45− easing.type: Easing.OutQuad
46− }
47− }
48− // TODO - does ever frame.
49− onBottomMarginChanged: {
50− mainMenu.positionViewAtIndex(mainMenu.currentIndex, ListView.End)
51− }
52− }
53−
54− // Ensure all delegates are cached in order to improve smoothness of scrolling
55− cacheBuffer: 10000
56−
57− // Only allow flicking if the content doesn't fit on the page
58− interactive: contentHeight > height
59−
60− currentIndex: -1
61− delegate: Item {
62− id: item
63− property bool ready: false
64− property alias empty: factory.empty
65−
66− anchors {
67− left: parent.left
68− right: parent.right
69− }
70− height: div.height + factory.implicitHeight
71− visible: height > 0
72−
73− Component.onCompleted: {
74− if (!item.empty) {
75− mainMenu.visibleItems += 1;
76− }
77− ready = true;
78− }
79− Component.onDestruction: {
80− if (!item.empty) {
81− mainMenu.visibleItems -= 1;
82− }
83− ready = false;
84− }
85−
86− onEmptyChanged: {
87− if (!ready) {
88− return;
89− }
90− if (empty) {
91− mainMenu.visibleItems -= 1;
92− } else {
93− mainMenu.visibleItems += 1;
94− }
95− }
96−
97− ListView.onRemove: {
98− if (!highlightFollowsCurrentItem) {
99− mainMenu.currentIndex = -1;
100− }
101− }
102−
103− Column {
104− id: contents
105−
106− anchors.fill: parent
107−
108− DivMenuItem {
109− id: div
110−
111− anchors.left: parent.left
112− anchors.right: parent.right
113− // only visible if is a root or a section header element and the factory is visible
114− height: {
115− // skipe first item
116− if (item.y == 0) {
117− return 0;
118− }
119− if (hasSection || ((depth == 0) && (!factory.empty))) {
120− return implicitHeight;
121− } else {
122− return 0;
123− }
124− }
125− }
126−
127− MenuItemFactory {
128− id: factory
129−
130− actionGroup: main.actionGroup
131− isCurrentItem: item.ListView.isCurrentItem
132− anchors {
133− left: parent.left
134− right: parent.right
135− }
136− menu: model
137−
138− Connections {
139− target : factory
140− onActivated: item.ListView.view.currentIndex = index
141− onDeactivated: item.ListView.view.currentIndex = -1
142− }
143− }
144− }
145− }
146− }
147−
148− Components.Label {
149− id: emptyLabel
150− visible: (mainMenu.visibleItems === 0)
151− anchors {
152− top: parent.top
153− left: parent.left
154− right: parent.right
155− topMargin: units.gu(2)
156− }
157− wrapMode: Text.WordWrap
158− horizontalAlignment: Text.AlignHCenter
159−
160− //style
161− color: "#e8e1d0"
162− fontSize: "medium"
163−
164− text: "Empty!"
165− }
166−
167− function start()
168− {
169− reset()
170− if (!__active) {
171− proxyModel.start();
172− actionGroup.start();
173− __active = true;
174− }
175− }
176−
177− function stop()
178− {
179− if (__active) {
180− __active = false;
181− proxyModel.stop();
182− actionGroup.stop();
183− }
184− }
185−
186− function reset()
187− {
188− mainMenu.currentIndex = -1;
189− mainMenu.positionViewAtBeginning();
190− }
191−}
plugins/Unity/IndicatorsLegacy/qml/IndicatorWidget.qmldeleted−68
@@ -1,68 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Nick Dedekind <nick.dedekind@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Unity.IndicatorsLegacy 0.1 as Indicators
22−
23−IndicatorBase {
24− id: indicatorWidget
25−
26− enabled: false
27− property var action: undefined
28− property bool started: (busType != 0) && (busName != "") && (deviceMenuObjectPath != "")
29− property int iconSize: height - units.gu(0.5)
30− property string rootMenuType: "com.canonical.indicator.root"
31−
32− signal actionStateChanged()
33−
34− onStartedChanged: {
35− if (started) {
36− proxyModel.start();
37− actionGroup.start();
38− } else {
39− proxyModel.stop();
40− actionGroup.stop();
41− }
42− }
43− onActionGroupUpdated: update_state()
44− onModelUpdated: update_state()
45−
46−
47− function update_state() {
48− var extra = proxyModel.data(0, Indicators.FlatMenuProxyModelRole.Extra);
49− if (extra == undefined) {
50− return;
51− }
52−
53− if (!extra.hasOwnProperty("canonical_type")) {
54− return;
55− }
56−
57− if (extra.canonical_type === rootMenuType) {
58− action = actionGroup.action(proxyModel.data(0, Indicators.FlatMenuProxyModelRole.Action));
59− actionStateChanged();
60− }
61− }
62−
63− Connections {
64− target: action == undefined ? null : action
65− onStateChanged: actionStateChanged()
66− onValidChanged: actionStateChanged()
67− }
68−}
plugins/Unity/IndicatorsLegacy/qml/MenuAction.qmldeleted−86
@@ -1,86 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−
22−/*!
23− \qmltype MenuAction
24− \inqmlmodule Indicators 0.1
25− \brief Helper class to connect to a qmenumodel action
26−
27− Example:
28− \qml
29− Button {
30− id: slide
31− onClick: { action.activate() }
32− }
33− MenuAction {
34− id: action
35− actionGroup: menuItem.actionGroup
36− action: "/ubuntu/sound/enabled"
37− }
38− \endqml
39−*/
40−
41−Item {
42− id: menuAction
43−
44− /*!
45− \preliminary
46− The dbus action name
47− */
48− property string action: ""
49−
50− /*!
51− \preliminary
52− The dbus action group object
53− */
54− property QtObject actionGroup: null
55−
56− /*!
57− \preliminary
58− This is a read-only property with the current validity of the action
59− */
60− readonly property bool valid: actionObject ? actionObject.valid : false
61−
62− readonly property var state: actionObject ? actionObject.state : undefined
63−
64− // internal
65− property QtObject actionObject: null
66−
67− function activate(param) {
68− if (valid) {
69− actionObject.activate(param);
70− }
71− }
72−
73− onActionGroupChanged: updateAction()
74− onActionChanged: updateAction()
75−
76− Connections {
77− target: menuAction.actionGroup != undefined ? menuAction.actionGroup : null
78− onActionAppear: menuAction.updateAction();
79− onActionVanish: menuAction.updateAction();
80− onStatusChanged: menuAction.updateAction();
81− }
82−
83− function updateAction() {
84− actionObject = action !== "" && actionGroup ? actionGroup.action(action) : null
85− }
86−}
plugins/Unity/IndicatorsLegacy/qml/MenuActionBinding.qmldeleted−106
@@ -1,106 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−
22−/*!
23− \qmltype MenuActionBinding
24− \inqmlmodule Indicators 0.1
25− \brief Helper class to connect a qmenumodel action state with a qml components property
26−
27− Example:
28− \qml
29− Slider {
30− id: slide
31− }
32− MenuActionBinding {
33− actionGroup: menuItem.actionGroup
34− action: "/ubuntu/sound/volume"
35− target: slider
36− property: "value"
37− }
38− \endqml
39−*/
40−
41−MenuAction {
42− id: menuAction
43−
44− /*!
45− \preliminary
46− The component which will have the property changed by action
47− */
48− property QtObject target: null
49−
50− /*!
51− \preliminary
52− The property name of \l target component which will be linked with action state
53− */
54− property string property
55−
56− /*!
57− \preliminary
58− Use this to enable or disable the action state propagation to component property.
59− */
60− property bool active: true
61−
62− Component.onCompleted: connectViewChanges()
63− onTargetChanged: connectViewChanges()
64− onPropertyChanged: connectViewChanges()
65−
66− Item {
67− id: d
68− property var currentTarget: undefined
69− property string currentSignal
70− }
71−
72− Binding {
73− id: propertyBinding
74− target: menuAction.target
75− property: menuAction.property
76− value: menuAction.state
77− when: menuAction.actionObject && menuAction.active
78− }
79−
80− // TODO - re-evaluate in c++
81− function connectViewChanges() {
82− if (d.currentTarget != undefined && d.currentSignal !== "") {
83− if (d.currentTarget[d.currentSignal] !== undefined) {
84− d.currentTarget[d.currentSignal].disconnect(onViewValueChanged);
85− }
86− }
87−
88− d.currentTarget = null;
89− d.currentSignal = "";
90− if (target) {
91− var signal = "on%1Changed".arg(property.charAt(0).toUpperCase() + property.slice(1));
92− if (target[signal] !== undefined) {
93− target[signal].connect(onViewValueChanged);
94− d.currentTarget = target;
95− d.currentSignal = signal;
96− }
97− }
98− }
99−
100− function onViewValueChanged() {
101− if (valid) {
102− var propertyValue = target[property];
103− actionObject.updateState(propertyValue);
104− }
105− }
106−}
plugins/Unity/IndicatorsLegacy/qml/MenuItem.qmldeleted−40
@@ -1,40 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−import Ubuntu.Components.ListItems 0.1 as ListItem
23−
24−BasicMenuItem {
25− objectName: menu ? menu.action : ""
26− progression: menu && (menu.linkSubMenu !== undefined)
27− text: menu && menu.label ? menu.label : ""
28− color: "#221e1c"
29− implicitHeight: units.gu(7)
30−
31− HLine {
32− anchors.top: parent.top
33− color: "#403b37"
34− }
35−
36− HLine {
37− anchors.bottom: parent.bottom
38− color: "#060606"
39− }
40−}
plugins/Unity/IndicatorsLegacy/qml/MenuItemFactory.qmldeleted−110
@@ -1,110 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Nick Dedekind <nick.dedekind@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Unity.IndicatorsLegacy 0.1 as Indicators
22−import Unity.IndicatorsLegacy.Messaging 0.1 as ICMessaging
23−import Unity.IndicatorsLegacy.Network 0.1 as ICNetwork
24−
25−Item {
26− id: menuFactory
27−
28− property QtObject menu
29− property QtObject listView
30− property QtObject actionGroup
31− property bool isCurrentItem
32− readonly property bool empty: (loader.item !== undefined && loader.status == Loader.Ready) ? loader.item.state === "EMPTY" : true
33−
34− implicitHeight: loader.height
35−
36− signal activated()
37− signal deactivated()
38−
39− property var _map: {
40− "unity.widgets.systemsettings.tablet.volumecontrol" : sliderMenu,
41− "unity.widgets.systemsettings.tablet.switch" : switchMenu,
42−
43− "com.canonical.indicator.button" : buttonMenu,
44− "com.canonical.indicator.div" : divMenu,
45− "com.canonical.indicator.section" : sectionMenu,
46− "com.canonical.indicator.progress" : progressMenu,
47− "com.canonical.indicator.slider" : sliderMenu,
48− "com.canonical.indicator.switch" : switchMenu,
49−
50− "com.canonical.indicator.messages.messageitem" : messageItem,
51− "com.canonical.indicator.messages.snapdecision" : snapDecision,
52− "com.canonical.indicator.messages.sourceitem" : groupedMessage,
53−
54− "unity.widget.systemsettings.tablet.sectiontitle" : wifiSection,
55− "unity.widgets.systemsettings.tablet.wifisection" : wifiSection,
56− "unity.widgets.systemsettings.tablet.accesspoint" : accessPoint,
57− }
58−
59− Component { id: sliderMenu; Indicators.SliderMenuItem {} }
60− Component { id: switchMenu; Indicators.SwitchMenuItem {} }
61− Component { id: buttonMenu; Indicators.ButtonMenuItem {} }
62− Component { id: divMenu; Indicators.DivMenuItem {} }
63− Component { id: sectionMenu; Indicators.SectionMenuItem {} }
64− Component { id: progressMenu; Indicators.ProgressMenuItem {} }
65− Component { id: messageItem; ICMessaging.MessageMenuItem {} }
66− Component { id: snapDecision; ICMessaging.SnapDecision {} }
67− Component { id: groupedMessage; ICMessaging.GroupedMessage {} }
68− Component { id: wifiSection; ICNetwork.WifiSection {} }
69− Component { id: accessPoint; ICNetwork.AccessPoint {} }
70− Component { id: indicatorMenu; Indicators.MenuItem {} }
71−
72− Loader {
73− id: loader
74− asynchronous: true
75−
76− anchors {
77− left: parent.left
78− right: parent.right
79− }
80−
81− sourceComponent: {
82− if (!menuFactory.menu || !menuFactory.menu.extra) {
83− return undefined;
84− }
85−
86− var widgetType = menuFactory.menu.extra.canonical_type;
87− if (widgetType) {
88− return _map[widgetType];
89− } else {
90− if (widgetType === "com.canonical.indicator.root") {
91− return undefined;
92− // Try discovery the item based on the basic properties
93− } else if (menu.hasSection) {
94− return sectionMenu;
95− } else {
96− return indicatorMenu;
97− }
98− }
99− }
100−
101− onLoaded: {
102− item.menuActivated = Qt.binding(function() { return isCurrentItem; });
103− item.actionGroup = Qt.binding(function() { return menuFactory.actionGroup; });
104− item.menu = Qt.binding(function() { return menuFactory.menu; });
105−
106− item.activateMenu.connect(function() { menuFactory.activated(); });
107− item.deactivateMenu.connect(function() { menuFactory.deactivated(); });
108− }
109− }
110−}
plugins/Unity/IndicatorsLegacy/qml/ProgressMenuItem.qmldeleted−65
@@ -1,65 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Michael Zanetti <michael.zanetti@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−
23−MenuItem {
24− id: progressMenu
25− property alias value : progressBar.value
26−
27− // TODO: Replace this with the official ProgressBar component as soon as
28− // it is available. For now, this rebuilds the Mockup as close as possible.
29− UbuntuShape {
30− id: progressBar
31− anchors {
32− right: parent.right
33− rightMargin: units.gu(2)
34− left: parent.left
35− leftMargin: units.gu(2)
36− }
37− height: units.gu(4)
38− anchors.verticalCenter: parent.verticalCenter
39− color: "transparent"
40−
41− property int minimumValue: 0
42− property int maximumValue: 100
43− property int value: 50
44−
45− UbuntuShape {
46− anchors.fill: parent
47− anchors.rightMargin: parent.width - (parent.width * parent.value / parent.maximumValue)
48− color: "#c94212"
49− }
50−
51− Label {
52− anchors.centerIn: parent
53− text: parent.value + " %"
54− fontSize: "medium"
55− color: "#e8e1d0"
56− }
57− }
58−
59− MenuActionBinding {
60− actionGroup: progressMenu.actionGroup
61− action: menu ? menu.action : ""
62− target: progressBar
63− property: "value"
64− }
65−}
plugins/Unity/IndicatorsLegacy/qml/RemoveBackground.qmldeleted−55
@@ -1,55 +0,0 @@
1−/*
2− * Copyright 2013 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.0
18−import Ubuntu.Components 0.1
19−
20−Rectangle {
21− anchors.fill: parent
22− color: "#333130"
23− Label {
24− id: backgroundText
25−
26− anchors.fill: parent
27− verticalAlignment: Text.AlignVCenter
28− text: "Clear"
29− fontSize: "medium"
30− color: "#e8e1d0"
31− font.bold: true
32− }
33−
34− states: [
35− State {
36− name: "SwipingRight"
37− PropertyChanges {
38− target: backgroundText
39− anchors.rightMargin: units.gu(3)
40− anchors.leftMargin: 0
41− horizontalAlignment: Text.AlignRight
42−
43− }
44− },
45− State {
46− name: "SwipingLeft"
47− PropertyChanges {
48− target: backgroundText
49− anchors.rightMargin: 0
50− anchors.leftMargin: units.gu(3)
51− horizontalAlignment: Text.AlignLeft
52− }
53− }
54− ]
55−}
plugins/Unity/IndicatorsLegacy/qml/SectionMenuItem.qmldeleted−57
@@ -1,57 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−import Ubuntu.Components.ListItems 0.1 as ListItem
23−
24−BasicMenuItem {
25− property string label: menu && menu.label ? menu.label : ""
26− property bool busy: false
27− property int count: menu && menu.linkSection ? menu.linkSection.count : 0
28−
29− color: "#221e1b"
30− implicitHeight: label !== "" ? __header.height : 0
31− state: count === 0 ? "EMPTY" : ""
32−
33− ListItem.Header {
34− id: __header
35−
36− text: label
37− height: units.gu(4)
38− anchors {
39− left: parent.left
40− right: parent.right
41− top: parent.top
42− }
43− visible: text != ""
44−
45− ActivityIndicator {
46− id: indicator
47− running: busy
48− anchors {
49− margins: units.gu(0.5)
50− right: parent.right
51− }
52− height: parent.height - (anchors.margins * 2)
53− width: height
54− anchors.verticalCenter: parent.verticalCenter
55− }
56− }
57−}
plugins/Unity/IndicatorsLegacy/qml/SliderMenuItem.qmldeleted−64
@@ -1,64 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−
23−MenuItem {
24− id: _sliderMenu
25−
26− property alias minimumValue: slider.minimumValue
27− property alias maximumValue: slider.maximumValue
28− property alias value: slider.value
29−
30− control: Slider {
31− id: slider
32− enabled: menuAction.valid
33− width: _sliderMenu.text ? units.gu(20) : _sliderMenu.width - units.gu(4)
34− anchors.verticalCenter: parent.verticalCenter
35− live: false
36− // FIXME: The interval should be [0.0 - 1.0]. Unfortunately, when
37− // reaching the boundaries (0.0 or 1.0), the value is converted
38− // to an integer when automatically wrapped in a variant when
39− // passed to QStateAction::updateState(…). The server chokes on
40− // those values, complaining that they’re not of the right type…
41− minimumValue: menu.extra.canonical_min ? menu.extra.canonical_min * 1.000001 : 0.0000001
42− maximumValue: {
43− var maximum = menu.extra.canonical_max ? menu.extra.canonical_max * 1.000001 : 0.9999999
44− if (maximum <= minimumValue) {
45− return minimumValue + 1;
46− }
47− return maximum;
48− }
49−
50− // FIXME - to be deprecated in Ubuntu.Components.
51− // Use this to disable the label, since there is not way to do it on the component.
52− function formatValue(v) {
53− return "";
54− }
55− }
56−
57− MenuActionBinding {
58− id: menuAction
59− actionGroup: _sliderMenu.actionGroup
60− action: menu ? menu.action : ""
61− target: slider
62− property: "value"
63− }
64−}
plugins/Unity/IndicatorsLegacy/qml/SwitchMenuItem.qmldeleted−43
@@ -1,43 +0,0 @@
1−/*
2− * Copyright 2013 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− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−
23−MenuItem {
24− id: switchMenu
25−
26− property alias checked: switcher.checked
27−
28− control: Switch {
29− id: switcher
30− enabled: menuAction.valid
31−
32− anchors.verticalCenter: parent.verticalCenter
33− anchors.right: parent.right
34− }
35−
36− MenuActionBinding {
37− id: menuAction
38− actionGroup: switchMenu.actionGroup
39− action: menu ? menu.action : ""
40− target: switcher
41− property: "checked"
42− }
43−}
plugins/Unity/IndicatorsLegacy/qml/qmldirdeleted−21
@@ -1,21 +0,0 @@
1−module Unity.IndicatorsLegacy
2−plugin IndicatorsLegacyQml
3−typeinfo plugin.qmltypes
4−
5−BasicMenuItem 0.1 BasicMenuItem.qml
6−ButtonMenuItem 0.1 ButtonMenuItem.qml
7−DivMenuItem 0.1 DivMenuItem.qml
8−HLine 0.1 HLine.qml
9−IndicatorBase 0.1 IndicatorBase.qml
10−IndicatorPage 0.1 IndicatorPage.qml
11−IndicatorWidget 0.1 IndicatorWidget.qml
12−MenuItem 0.1 MenuItem.qml
13−MenuAction 0.1 MenuAction.qml
14−MenuActionBinding 0.1 MenuActionBinding.qml
15−MenuItemFactory 0.1 MenuItemFactory.qml
16−ProgressMenuItem 0.1 ProgressMenuItem.qml
17−SectionMenuItem 0.1 SectionMenuItem.qml
18−SliderMenuItem 0.1 SliderMenuItem.qml
19−SwitchMenuItem 0.1 SwitchMenuItem.qml
20−
21−internal RemoveBackground RemoveBackground.qml
plugins/Unity/IndicatorsLegacy/resources/indicators.qrcdeleted−7
@@ -1,7 +0,0 @@
1−<RCC>
2− <qresource prefix="/indicators">
3− <file>artwork/messaging/default_contact.png</file>
4− <file>artwork/messaging/default_app.svg</file>
5− <file>artwork/messaging/message_sms01_54px.png</file>
6− </qresource>
7−</RCC>
plugins/Unity/Launcher/backend/launcherbackend.cpp+4−37
@@ -30,21 +30,18 @@
30class LauncherBackendItem
30class LauncherBackendItem
31{
31{
32public:
32public:
33− LauncherBackendItem(): pinned(false) {}
34−
35 QString desktopFile;
33 QString desktopFile;
36 QString displayName;
34 QString displayName;
37 QString icon;
35 QString icon;
38− bool pinned;
39};
36};
40
37
41−LauncherBackend::LauncherBackend(bool useStorage, QObject *parent):
38+LauncherBackend::LauncherBackend(QObject *parent):
42 QObject(parent),
39 QObject(parent),
43 m_accounts(nullptr)
40 m_accounts(nullptr)
44{
41{
45− if (useStorage) {
42+#ifndef LAUNCHER_TESTING
46− m_accounts = new AccountsServiceDBusAdaptor(this);
43+ m_accounts = new AccountsServiceDBusAdaptor(this);
47− }
44+#endif
48 m_user = qgetenv("USER");
45 m_user = qgetenv("USER");
49 syncFromAccounts();
46 syncFromAccounts();
50}
47}
@@ -135,32 +132,6 @@ QString LauncherBackend::icon(const QString &appId) const
135 return iconName;
132 return iconName;
136}
133}
137
134
138−bool LauncherBackend::isPinned(const QString &appId) const
139−{
140− LauncherBackendItem *item = m_itemCache.value(appId);
141− if (item) {
142− return item->pinned;
143− }
144− return false;
145−}
146−
147−void LauncherBackend::setPinned(const QString &appId, bool pinned)
148−{
149− if (!m_storedApps.contains(appId)) {
150− return;
151− }
152−
153− LauncherBackendItem *item = m_itemCache.value(appId);
154− if (!item) {
155− item = new LauncherBackendItem();
156− m_itemCache.insert(appId, item);
157− }
158− if (item->pinned != pinned) {
159− item->pinned = pinned;
160− syncToAccounts();
161− }
162−}
163−
164QList<QuickListEntry> LauncherBackend::quickList(const QString &appId) const
135QList<QuickListEntry> LauncherBackend::quickList(const QString &appId) const
165{
136{
166 // TODO: Get static (from .desktop file) and dynamic (from the app itself)
137 // TODO: Get static (from .desktop file) and dynamic (from the app itself)
@@ -233,7 +204,6 @@ void LauncherBackend::syncFromAccounts()
233 if (!m_itemCache.contains(appId)) {
204 if (!m_itemCache.contains(appId)) {
234 m_itemCache.insert(appId, parseDesktopFile(df));
205 m_itemCache.insert(appId, parseDesktopFile(df));
235 }
206 }
236− m_itemCache.value(appId)->pinned = true;
237 }
207 }
238 }
208 }
239 }
209 }
@@ -305,7 +275,6 @@ LauncherBackendItem* LauncherBackend::parseDesktopFile(const QString &desktopFil
305 } else {
275 } else {
306 item->icon = "image://theme/" + iconString;
276 item->icon = "image://theme/" + iconString;
307 }
277 }
308− item->pinned = false;
309 return item;
278 return item;
310}
279}
311
280
@@ -326,7 +295,6 @@ void LauncherBackend::loadFromVariant(const QVariantMap &details)
326 item->desktopFile = details.value("desktopFile").toString();
295 item->desktopFile = details.value("desktopFile").toString();
327 item->displayName = details.value("name").toString();
296 item->displayName = details.value("name").toString();
328 item->icon = details.value("icon").toString();
297 item->icon = details.value("icon").toString();
329− item->pinned = details.value("is-pinned").toBool();
330
298
331 m_itemCache.insert(appId, item);
299 m_itemCache.insert(appId, item);
332 m_storedApps.append(appId);
300 m_storedApps.append(appId);
@@ -340,7 +308,6 @@ QVariantMap LauncherBackend::itemToVariant(const QString &appId) const
340 details.insert("name", item->displayName);
308 details.insert("name", item->displayName);
341 details.insert("icon", item->icon);
309 details.insert("icon", item->icon);
342 details.insert("desktopFile", item->desktopFile);
310 details.insert("desktopFile", item->desktopFile);
343− details.insert("is-pinned", item->pinned);
344 return details;
311 return details;
345}
312}
346
313
plugins/Unity/Launcher/backend/launcherbackend.h+1−16
@@ -39,7 +39,7 @@ class LauncherBackend : public QObject
39
39
40
40
41public:
41public:
42− LauncherBackend(bool useStorage = true, QObject *parent = 0);
42+ LauncherBackend(QObject *parent = 0);
43 virtual ~LauncherBackend();
43 virtual ~LauncherBackend();
44
44
45 /**
45 /**
@@ -88,21 +88,6 @@ public:
88 */
88 */
89 QString icon(const QString &appId) const;
89 QString icon(const QString &appId) const;
90
90
91− /**
92− * @brief Is the app manually pinned?
93− * @returns true if pinned, otherwise false.
94− */
95− bool isPinned(const QString &appId) const;
96−
97− /**
98− * @brief Change the pinned state of an application.
99− * @param appId The application where the pinned flag should be set.
100− * @param pinned true if pinned, otherwise false.
101− */
102− void setPinned(const QString &appId, bool pinned);
103−
104− //TODO: Fill in getters for all the other things needed from the .desktop file.
105−
106 /**
91 /**
107 * @brief Get the QuickList for an application.
92 * @brief Get the QuickList for an application.
108 * @param appId The ID of the application.
93 * @param appId The ID of the application.
plugins/Unity/Launcher/launchermodel.cpp+4−8
@@ -27,7 +27,7 @@ using namespace unity::shell::application;
27
27
28LauncherModel::LauncherModel(QObject *parent):
28LauncherModel::LauncherModel(QObject *parent):
29 LauncherModelInterface(parent),
29 LauncherModelInterface(parent),
30− m_backend(new LauncherBackend(true, this)),
30+ m_backend(new LauncherBackend(this)),
31 m_appManager(0)
31 m_appManager(0)
32{
32{
33 connect(m_backend, SIGNAL(countChanged(QString,int)), SLOT(countChanged(QString,int)));
33 connect(m_backend, SIGNAL(countChanged(QString,int)), SLOT(countChanged(QString,int)));
@@ -38,11 +38,7 @@ LauncherModel::LauncherModel(QObject *parent):
38 m_backend->displayName(entry),
38 m_backend->displayName(entry),
39 m_backend->icon(entry),
39 m_backend->icon(entry),
40 this);
40 this);
41− if (m_backend->isPinned(entry)) {
42− item->setPinned(true);
41+ item->setPinned(true);
43− } else {
44− item->setRecent(true);
45− }
46 m_list.append(item);
42 m_list.append(item);
47 }
43 }
48}
44}
@@ -129,11 +125,12 @@ void LauncherModel::pin(const QString &appId, int index)
129 if (currentIndex >= 0) {
125 if (currentIndex >= 0) {
130 if (index == -1 || index == currentIndex) {
126 if (index == -1 || index == currentIndex) {
131 m_list.at(currentIndex)->setPinned(true);
127 m_list.at(currentIndex)->setPinned(true);
132− m_backend->setPinned(appId, true);
133 QModelIndex modelIndex = this->index(currentIndex);
128 QModelIndex modelIndex = this->index(currentIndex);
134 Q_EMIT dataChanged(modelIndex, modelIndex);
129 Q_EMIT dataChanged(modelIndex, modelIndex);
135 } else {
130 } else {
136 move(currentIndex, index);
131 move(currentIndex, index);
132+ // move() will store the list to the backend itself, so just exit at this point.
133+ return;
137 }
134 }
138 } else {
135 } else {
139 if (index == -1) {
136 if (index == -1) {
@@ -144,7 +141,6 @@ void LauncherModel::pin(const QString &appId, int index)
144 m_backend->displayName(appId),
141 m_backend->displayName(appId),
145 m_backend->icon(appId));
142 m_backend->icon(appId));
146 item->setPinned(true);
143 item->setPinned(true);
147− m_backend->setPinned(appId, true);
148 m_list.insert(index, item);
144 m_list.insert(index, item);
149 endInsertRows();
145 endInsertRows();
150 }
146 }
plugins/Unity/Launcher/quicklistmodel.cpp+1−1
@@ -32,7 +32,7 @@ QuickListModel::~QuickListModel()
32
32
33void QuickListModel::appendAction(const QuickListEntry &entry)
33void QuickListModel::appendAction(const QuickListEntry &entry)
34{
34{
35− beginInsertRows(QModelIndex(), m_list.count() - 1, m_list.count() -1);
35+ beginInsertRows(QModelIndex(), m_list.count(), m_list.count());
36 m_list.append(entry);
36 m_list.append(entry);
37 endInsertRows();
37 endInsertRows();
38}
38}
plugins/Unity/bottombarvisibilitycommunicatorshell.cpp+15−1
@@ -17,7 +17,8 @@
17#include "bottombarvisibilitycommunicatorshell.h"
17#include "bottombarvisibilitycommunicatorshell.h"
18
18
19BottomBarVisibilityCommunicatorShell::BottomBarVisibilityCommunicatorShell()
19BottomBarVisibilityCommunicatorShell::BottomBarVisibilityCommunicatorShell()
20− : m_forceHidden(false)
20+ : m_forceHidden(false),
21+ m_position(0)
21{
22{
22}
23}
23
24
@@ -26,6 +27,11 @@ bool BottomBarVisibilityCommunicatorShell::forceHidden() const
26 return m_forceHidden;
27 return m_forceHidden;
27}
28}
28
29
30+double BottomBarVisibilityCommunicatorShell::position() const
31+{
32+ return m_position;
33+}
34+
29void BottomBarVisibilityCommunicatorShell::setForceHidden(bool forceHidden)
35void BottomBarVisibilityCommunicatorShell::setForceHidden(bool forceHidden)
30{
36{
31 if (forceHidden != m_forceHidden) {
37 if (forceHidden != m_forceHidden) {
@@ -33,3 +39,11 @@ void BottomBarVisibilityCommunicatorShell::setForceHidden(bool forceHidden)
33 Q_EMIT forceHiddenChanged(forceHidden);
39 Q_EMIT forceHiddenChanged(forceHidden);
34 }
40 }
35}
41}
42+
43+void BottomBarVisibilityCommunicatorShell::setPosition(double position)
44+{
45+ if (position != m_position) {
46+ m_position = position;
47+ Q_EMIT positionChanged(position);
48+ }
49+}
plugins/Unity/bottombarvisibilitycommunicatorshell.h+6
@@ -30,6 +30,7 @@ class BottomBarVisibilityCommunicatorShell : public QObject
30{
30{
31 Q_OBJECT
31 Q_OBJECT
32 Q_PROPERTY(bool forceHidden READ forceHidden WRITE setForceHidden NOTIFY forceHiddenChanged)
32 Q_PROPERTY(bool forceHidden READ forceHidden WRITE setForceHidden NOTIFY forceHiddenChanged)
33+ Q_PROPERTY(double position READ position WRITE setPosition NOTIFY positionChanged)
33
34
34 Q_CLASSINFO("D-Bus Interface", "com.canonical.Shell.BottomBarVisibilityCommunicator")
35 Q_CLASSINFO("D-Bus Interface", "com.canonical.Shell.BottomBarVisibilityCommunicator")
35public:
36public:
@@ -41,13 +42,18 @@ public:
41 bool forceHidden() const;
42 bool forceHidden() const;
42 void setForceHidden(bool forceHidden);
43 void setForceHidden(bool forceHidden);
43
44
45+ double position() const;
46+ void setPosition(double position);
47+
44Q_SIGNALS:
48Q_SIGNALS:
45 void forceHiddenChanged(bool forceHidden);
49 void forceHiddenChanged(bool forceHidden);
50+ void positionChanged(double position);
46
51
47private:
52private:
48 BottomBarVisibilityCommunicatorShell();
53 BottomBarVisibilityCommunicatorShell();
49
54
50 bool m_forceHidden;
55 bool m_forceHidden;
56+ double m_position;
51};
57};
52
58
53#endif
59#endif
plugins/Unity/categories.cpp+77−16
@@ -40,6 +40,7 @@ Categories::Categories(QObject* parent)
40 m_roles[Categories::RoleIcon] = "icon";
40 m_roles[Categories::RoleIcon] = "icon";
41 m_roles[Categories::RoleRenderer] = "renderer";
41 m_roles[Categories::RoleRenderer] = "renderer";
42 m_roles[Categories::RoleContentType] = "contentType";
42 m_roles[Categories::RoleContentType] = "contentType";
43+ m_roles[Categories::RoleRendererHint] = "rendererHint";
43 m_roles[Categories::RoleProgressSource] = "progressSource";
44 m_roles[Categories::RoleProgressSource] = "progressSource";
44 m_roles[Categories::RoleHints] = "hints";
45 m_roles[Categories::RoleHints] = "hints";
45 m_roles[Categories::RoleResults] = "results";
46 m_roles[Categories::RoleResults] = "results";
@@ -89,9 +90,37 @@ void Categories::onCategoriesModelChanged(unity::glib::Object<DeeModel> model)
89 delete model;
90 delete model;
90 }
91 }
91 m_results.clear();
92 m_results.clear();
93+ m_categoryOrder.clear();
94+
92 setModel(model);
95 setModel(model);
93}
96}
94
97
98+void Categories::onCategoryOrderChanged(const std::vector<unsigned int>& cat_order)
99+{
100+ for (unsigned int pos = 0; pos<cat_order.size(); pos++)
101+ {
102+ unsigned int cat = cat_order[pos];
103+ const int old_pos = m_categoryOrder.indexOf(cat);
104+
105+ if (old_pos < 0) {
106+ qWarning() << "No such category index:" << cat;
107+ continue;
108+ }
109+
110+ if (static_cast<int>(pos) != old_pos) {
111+ int target_pos = pos;
112+ if (target_pos > old_pos)
113+ target_pos++;
114+ const bool status = beginMoveRows(QModelIndex(), old_pos, old_pos, QModelIndex(), target_pos);
115+ if (status)
116+ m_categoryOrder.move(old_pos, pos);
117+ else
118+ qWarning() << "beginMoveRows failed:" << old_pos << target_pos;
119+ endMoveRows();
120+ }
121+ }
122+}
123+
95void
124void
96Categories::setUnityScope(const unity::dash::Scope::Ptr& scope)
125Categories::setUnityScope(const unity::dash::Scope::Ptr& scope)
97{
126{
@@ -100,9 +129,11 @@ Categories::setUnityScope(const unity::dash::Scope::Ptr& scope)
100 // no need to call this, we'll get notified
129 // no need to call this, we'll get notified
101 //setModel(m_unityScope->categories()->model());
130 //setModel(m_unityScope->categories()->model());
102
131
103− m_categoriesChangedConnection.disconnect();
132+ m_signals.disconnectAll();
104− m_categoriesChangedConnection =
105− m_unityScope->categories()->model.changed.connect(sigc::mem_fun(this, &Categories::onCategoriesModelChanged));
133+ m_signals << m_unityScope->categories()->model.changed.connect(sigc::mem_fun(this, &Categories::onCategoriesModelChanged));
134+
135+ // FIXME: Don't handle category order changes for now as it causes UI issues (https://bugs.launchpad.net/unity8/+bug/1239584).
136+ //m_signals << m_unityScope->category_order.changed.connect(sigc::mem_fun(this, &Categories::onCategoryOrderChanged));
106}
137}
107
138
108void
139void
@@ -110,7 +141,9 @@ Categories::onCountChanged()
110{
141{
111 CategoryResults* results = qobject_cast<CategoryResults*>(sender());
142 CategoryResults* results = qobject_cast<CategoryResults*>(sender());
112 if (results) {
143 if (results) {
144+ if (!m_updatedCategories.contains(results->categoryIndex())) {
113− m_updatedCategories << results->categoryIndex();
145+ m_updatedCategories << results->categoryIndex();
146+ }
114 m_timer.start();
147 m_timer.start();
115 }
148 }
116}
149}
@@ -141,7 +174,8 @@ Categories::onEmitCountChanged()
141 roles.append(Categories::RoleCount);
174 roles.append(Categories::RoleCount);
142 Q_FOREACH(int categoryIndex, m_updatedCategories) {
175 Q_FOREACH(int categoryIndex, m_updatedCategories) {
143 if (!m_results.contains(categoryIndex)) continue;
176 if (!m_results.contains(categoryIndex)) continue;
177+ const int realIndex = m_categoryOrder.indexOf(categoryIndex);
144− QModelIndex changedIndex = index(categoryIndex);
178+ const QModelIndex changedIndex = index(realIndex);
145 Q_EMIT dataChanged(changedIndex, changedIndex, roles);
179 Q_EMIT dataChanged(changedIndex, changedIndex, roles);
146 }
180 }
147 m_updatedCategories.clear();
181 m_updatedCategories.clear();
@@ -195,43 +229,70 @@ Categories::data(const QModelIndex& index, int role) const
195 return QVariant();
229 return QVariant();
196 }
230 }
197
231
232+ if (m_categoryOrder.size() != rowCount())
233+ {
234+ // populate category order vector with 0..n
235+ m_categoryOrder.clear();
236+ const unsigned int lim = rowCount();
237+ for (unsigned int i = 0; i<lim; i++) {
238+ m_categoryOrder.append(i);
239+ }
240+ }
241+
242+ int realRow = index.row();
243+ if (index.row() < m_categoryOrder.size()) {
244+ realRow = m_categoryOrder[index.row()];
245+ } else {
246+ qWarning() << "Invalid index" << index.row();
247+ return QVariant();
248+ }
249+
250+ const QModelIndex realIndex = createIndex(realRow, index.column());
251+
198 switch (role) {
252 switch (role) {
199 case RoleCategoryId:
253 case RoleCategoryId:
200− return DeeListModel::data(index, CategoryColumn::ID);
254+ return DeeListModel::data(realIndex, CategoryColumn::ID);
201 case RoleName:
255 case RoleName:
202− return DeeListModel::data(index, CategoryColumn::DISPLAY_NAME);
256+ return DeeListModel::data(realIndex, CategoryColumn::DISPLAY_NAME);
203 case RoleIcon:
257 case RoleIcon:
204− return DeeListModel::data(index, CategoryColumn::ICON_HINT);
258+ return DeeListModel::data(realIndex, CategoryColumn::ICON_HINT);
205 case RoleRenderer:
259 case RoleRenderer:
206− return DeeListModel::data(index, CategoryColumn::RENDERER_NAME);
260+ return DeeListModel::data(realIndex, CategoryColumn::RENDERER_NAME);
207 case RoleContentType:
261 case RoleContentType:
208 {
262 {
209− auto hints = DeeListModel::data(index, CategoryColumn::HINTS).toHash();
263+ auto hints = DeeListModel::data(realIndex, CategoryColumn::HINTS).toHash();
210 return hints.contains("content-type") ? hints["content-type"] : QVariant(QString("default"));
264 return hints.contains("content-type") ? hints["content-type"] : QVariant(QString("default"));
211 }
265 }
266+ case RoleRendererHint:
267+ {
268+ auto hints = DeeListModel::data(realIndex, CategoryColumn::HINTS).toHash();
269+ return hints.contains("renderer-hint") ? hints["renderer-hint"] : QVariant(QString());
270+ }
212 case RoleProgressSource:
271 case RoleProgressSource:
213 {
272 {
214− auto hints = DeeListModel::data(index, CategoryColumn::HINTS).toHash();
273+ auto hints = DeeListModel::data(realIndex, CategoryColumn::HINTS).toHash();
215 return hints.contains("progress-source") ? hints["progress-source"] : QVariant();
274 return hints.contains("progress-source") ? hints["progress-source"] : QVariant();
216 }
275 }
217 case RoleHints:
276 case RoleHints:
218− return DeeListModel::data(index, CategoryColumn::HINTS);
277+ return DeeListModel::data(realIndex, CategoryColumn::HINTS);
219 case RoleResults:
278 case RoleResults:
220 if (m_overriddenCategories.size() > 0)
279 if (m_overriddenCategories.size() > 0)
221 {
280 {
222− auto id = DeeListModel::data(index, CategoryColumn::ID).toString();
281+ auto id = DeeListModel::data(realIndex, CategoryColumn::ID).toString();
223 if (m_overriddenCategories.find(id) != m_overriddenCategories.end())
282 if (m_overriddenCategories.find(id) != m_overriddenCategories.end())
224 return QVariant::fromValue(m_overriddenCategories[id]);
283 return QVariant::fromValue(m_overriddenCategories[id]);
225 }
284 }
226− return QVariant::fromValue(getResults(index.row()));
285+ return QVariant::fromValue(getResults(realRow));
227 case RoleCount:
286 case RoleCount:
228 if (m_overriddenCategories.size() > 0)
287 if (m_overriddenCategories.size() > 0)
229 {
288 {
230− auto id = DeeListModel::data(index, CategoryColumn::ID).toString();
289+ auto id = DeeListModel::data(realIndex, CategoryColumn::ID).toString();
231 if (m_overriddenCategories.find(id) != m_overriddenCategories.end())
290 if (m_overriddenCategories.find(id) != m_overriddenCategories.end())
291+ {
232 return QVariant::fromValue(m_overriddenCategories[id]->rowCount());
292 return QVariant::fromValue(m_overriddenCategories[id]->rowCount());
293+ }
233 }
294 }
234− return QVariant::fromValue(getResults(index.row())->rowCount());
295+ return QVariant::fromValue(getResults(realRow)->rowCount());
235 default:
296 default:
236 return QVariant();
297 return QVariant();
237 }
298 }
plugins/Unity/categories.h+11−1
@@ -32,6 +32,9 @@
32#include <QSet>
32#include <QSet>
33#include <QTimer>
33#include <QTimer>
34
34
35+// local
36+#include "signalslist.h"
37+
35class Categories : public DeeListModel
38class Categories : public DeeListModel
36{
39{
37 Q_OBJECT
40 Q_OBJECT
@@ -47,6 +50,7 @@ public:
47 RoleIcon,
50 RoleIcon,
48 RoleRenderer,
51 RoleRenderer,
49 RoleContentType,
52 RoleContentType,
53+ RoleRendererHint,
50 RoleProgressSource,
54 RoleProgressSource,
51 RoleHints,
55 RoleHints,
52 RoleResults,
56 RoleResults,
@@ -70,6 +74,7 @@ private Q_SLOTS:
70
74
71private:
75private:
72 void onCategoriesModelChanged(unity::glib::Object<DeeModel> model);
76 void onCategoriesModelChanged(unity::glib::Object<DeeModel> model);
77+ void onCategoryOrderChanged(const std::vector<unsigned int>& cat_order);
73
78
74 DeeListModel* getResults(int index) const;
79 DeeListModel* getResults(int index) const;
75
80
@@ -79,7 +84,12 @@ private:
79 QHash<int, QByteArray> m_roles;
84 QHash<int, QByteArray> m_roles;
80 QMap<QString, QAbstractItemModel*> m_overriddenCategories;
85 QMap<QString, QAbstractItemModel*> m_overriddenCategories;
81 mutable QMap<int, DeeListModel*> m_results;
86 mutable QMap<int, DeeListModel*> m_results;
82− sigc::connection m_categoriesChangedConnection;
87+ SignalsList m_signals;
88+
89+ /* Category order array contains indices of actual categories in the underlying DeeListModel.
90+ It's used internally to reflect category order reported by scope.
91+ */
92+ mutable QList<unsigned int> m_categoryOrder;
83};
93};
84
94
85#endif // CATEGORIES_H
95#endif // CATEGORIES_H
plugins/Unity/categoryresults.cpp+22
@@ -46,6 +46,7 @@ CategoryResults::CategoryResults(QObject* parent)
46 m_roles[CategoryResults::RoleComment] = "comment";
46 m_roles[CategoryResults::RoleComment] = "comment";
47 m_roles[CategoryResults::RoleDndUri] = "dndUri";
47 m_roles[CategoryResults::RoleDndUri] = "dndUri";
48 m_roles[CategoryResults::RoleMetadata] = "metadata";
48 m_roles[CategoryResults::RoleMetadata] = "metadata";
49+ m_roles[CategoryResults::RoleRendererHints] = "rendererHints";
49}
50}
50
51
51int CategoryResults::categoryIndex() const
52int CategoryResults::categoryIndex() const
@@ -79,6 +80,14 @@ CategoryResults::data(const QModelIndex& index, int role) const
79 return DeeListModel::data(index, ResultsColumn::URI);
80 return DeeListModel::data(index, ResultsColumn::URI);
80 case RoleIconHint: {
81 case RoleIconHint: {
81 QString giconString(DeeListModel::data(index, ResultsColumn::ICON_HINT).toString());
82 QString giconString(DeeListModel::data(index, ResultsColumn::ICON_HINT).toString());
83+ if (giconString.isEmpty()) {
84+ QString mimetype(DeeListModel::data(index, ResultsColumn::MIMETYPE).toString());
85+ QString uri(DeeListModel::data(index, ResultsColumn::URI).toString());
86+ QString thumbnailerUri(uriToThumbnailerProviderString(uri, mimetype, DeeListModel::data(index, ResultsColumn::METADATA).toHash()));
87+ if (!thumbnailerUri.isNull()) {
88+ return QVariant::fromValue(thumbnailerUri);
89+ }
90+ }
82 return QVariant::fromValue(gIconToDeclarativeImageProviderString(giconString));
91 return QVariant::fromValue(gIconToDeclarativeImageProviderString(giconString));
83 }
92 }
84 case RoleCategory:
93 case RoleCategory:
@@ -93,6 +102,19 @@ CategoryResults::data(const QModelIndex& index, int role) const
93 return DeeListModel::data(index, ResultsColumn::DND_URI);
102 return DeeListModel::data(index, ResultsColumn::DND_URI);
94 case RoleMetadata:
103 case RoleMetadata:
95 return DeeListModel::data(index, ResultsColumn::METADATA);
104 return DeeListModel::data(index, ResultsColumn::METADATA);
105+ case RoleRendererHints:
106+ {
107+ QVariantHash hash(DeeListModel::data(index, ResultsColumn::METADATA).toHash());
108+ if (hash.contains("content")) {
109+ QVariantMap hints;
110+ QVariantHash innerHash(hash["content"].toHash());
111+ if (innerHash.contains("scope_disabled")) {
112+ hints["scope_disabled"] = innerHash["scope_disabled"];
113+ }
114+ return hints.empty() ? QVariant() : QVariant::fromValue(hints);
115+ }
116+ return QVariant();
117+ }
96 default:
118 default:
97 return QVariant();
119 return QVariant();
98 }
120 }
plugins/Unity/categoryresults.h+2−1
@@ -43,7 +43,8 @@ public:
43 RoleTitle,
43 RoleTitle,
44 RoleComment,
44 RoleComment,
45 RoleDndUri,
45 RoleDndUri,
46− RoleMetadata
46+ RoleMetadata,
47+ RoleRendererHints
47 };
48 };
48
49
49 QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
50 QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
plugins/Unity/iconutils.cpp+33
@@ -24,6 +24,8 @@
24#include "iconutils.h"
24#include "iconutils.h"
25
25
26#define BASE_THEME_ICON_URI "image://theme/"
26#define BASE_THEME_ICON_URI "image://theme/"
27+#define BASE_THUMBNAILER_URI "image://thumbnailer/"
28+#define BASE_ALBUMART_URI "image://albumart/"
27
29
28QString gIconToDeclarativeImageProviderString(QString const &giconString)
30QString gIconToDeclarativeImageProviderString(QString const &giconString)
29{
31{
@@ -89,3 +91,34 @@ QString gIconToDeclarativeImageProviderString(QString const &giconString)
89
91
90 return result;
92 return result;
91}
93}
94+
95+QString uriToThumbnailerProviderString(QString const &uri, QString const &mimetype, QVariantHash const &metadata)
96+{
97+ if (uri.startsWith(QLatin1String("file:///"))) {
98+ bool isAudio = mimetype.startsWith(QLatin1String("audio/"));
99+ QString thumbnailerUri;
100+ if (isAudio) {
101+ thumbnailerUri = BASE_ALBUMART_URI;
102+ if (metadata.contains("content")) {
103+ QVariantHash contentHash = metadata["content"].toHash();
104+ if (contentHash.contains("content")) { // nested content in Home?
105+ contentHash = contentHash["content"].toHash();
106+ }
107+ if (contentHash.contains("album") &&
108+ contentHash.contains("artist")) {
109+ const QString album = contentHash["album"].toString();
110+ const QString artist = contentHash["artist"].toString();
111+ thumbnailerUri.append(QUrl::toPercentEncoding(artist));
112+ thumbnailerUri.append("/");
113+ thumbnailerUri.append(QUrl::toPercentEncoding(album));
114+ }
115+ }
116+ } else {
117+ thumbnailerUri = BASE_THUMBNAILER_URI;
118+ thumbnailerUri.append(uri.midRef(7));
119+ }
120+ return thumbnailerUri;
121+ }
122+
123+ return QString::null;
124+}
plugins/Unity/iconutils.h+2
@@ -21,7 +21,9 @@
21#define ICONUTILS_H
21#define ICONUTILS_H
22
22
23#include <QString>
23#include <QString>
24+#include <QVariant>
24
25
25QString gIconToDeclarativeImageProviderString(QString const &giconString);
26QString gIconToDeclarativeImageProviderString(QString const &giconString);
27+QString uriToThumbnailerProviderString(QString const &uri, QString const &mimetype, QVariantHash const &metadata);
26
28
27#endif
29#endif
plugins/Unity/plugin.cpp+2
@@ -35,6 +35,7 @@
35#include "categoryresults.h"
35#include "categoryresults.h"
36#include "bottombarvisibilitycommunicatorshell.h"
36#include "bottombarvisibilitycommunicatorshell.h"
37#include "genericoptionsmodel.h"
37#include "genericoptionsmodel.h"
38+#include "result.h"
38
39
39// libqtdee
40// libqtdee
40#include "deelistmodel.h"
41#include "deelistmodel.h"
@@ -50,6 +51,7 @@ void UnityPlugin::registerTypes(const char *uri)
50 qmlRegisterUncreatableType<PreviewInfoHint>(uri, 0, 1, "PreviewInfoHint", "Can't create PreviewInfoHint object in QML.");
51 qmlRegisterUncreatableType<PreviewInfoHint>(uri, 0, 1, "PreviewInfoHint", "Can't create PreviewInfoHint object in QML.");
51 qmlRegisterUncreatableType<SocialPreviewComment>(uri, 0, 1, "SocialPreviewComment", "Can't create SocialPreviewComment object in QML.");
52 qmlRegisterUncreatableType<SocialPreviewComment>(uri, 0, 1, "SocialPreviewComment", "Can't create SocialPreviewComment object in QML.");
52 qmlRegisterUncreatableType<GenericOptionsModel>(uri, 0, 1, "GenericOptionsModel", "Can't create options model in QML.");
53 qmlRegisterUncreatableType<GenericOptionsModel>(uri, 0, 1, "GenericOptionsModel", "Can't create options model in QML.");
54+ qmlRegisterUncreatableType<Result>(uri, 0, 1, "Result", "Can't create result object in QML.");
53 qmlRegisterType<Scope>(uri, 0, 1, "Scope");
55 qmlRegisterType<Scope>(uri, 0, 1, "Scope");
54 qmlRegisterType<Scopes>(uri, 0, 1, "Scopes");
56 qmlRegisterType<Scopes>(uri, 0, 1, "Scopes");
55 qmlRegisterType<Categories>(uri, 0, 1, "Categories");
57 qmlRegisterType<Categories>(uri, 0, 1, "Categories");
plugins/Unity/preview.cpp+24−13
@@ -39,9 +39,12 @@
39#include <UnityCore/MusicPreview.h>
39#include <UnityCore/MusicPreview.h>
40#include <UnityCore/SocialPreview.h>
40#include <UnityCore/SocialPreview.h>
41
41
42+#include <UnityCore/GLibWrapper.h>
43+
42Preview::Preview(QObject *parent):
44Preview::Preview(QObject *parent):
43 QObject(parent),
45 QObject(parent),
44− m_unityPreview(nullptr)
46+ m_unityPreview(nullptr),
47+ m_result(new Result(this))
45{
48{
46}
49}
47
50
@@ -103,24 +106,25 @@ QVariantMap Preview::infoHintsHash() const
103QString Preview::image() const
106QString Preview::image() const
104{
107{
105 if (m_unityPreview) {
108 if (m_unityPreview) {
109+ if (m_unityPreview->image() != nullptr) {
106− auto giconString = g_icon_to_string(m_unityPreview->image());
110+ auto giconString = g_icon_to_string(m_unityPreview->image());
107− QString result(gIconToDeclarativeImageProviderString(QString::fromUtf8(giconString)));
111+ QString result(gIconToDeclarativeImageProviderString(QString::fromUtf8(giconString)));
108− g_free(giconString);
112+ g_free(giconString);
109− return result;
113+ return result;
114+ } else {
115+ QString sourceMedia(QString::fromStdString(m_unityPreview->image_source_uri()));
116+ QString thumbnailUri(uriToThumbnailerProviderString(sourceMedia, m_result->mimeType(), m_result->metadata().toHash()));
117+ if (!thumbnailUri.isNull()) return thumbnailUri;
118+ }
110 } else {
119 } else {
111 qWarning() << "Preview not set";
120 qWarning() << "Preview not set";
112 }
121 }
113 return QString::null;
122 return QString::null;
114}
123}
115
124
116−QString Preview::imageSourceUri() const
125+QVariant Preview::result() const
117{
126{
118− if (m_unityPreview) {
127+ return QVariant::fromValue(m_result);
119− return QString::fromStdString(m_unityPreview->image_source_uri());
120− } else {
121− qWarning() << "Preview not set";
122− }
123− return QString::null;
124}
128}
125
129
126Preview* Preview::newFromUnityPreview(unity::dash::Preview::Ptr unityPreview)
130Preview* Preview::newFromUnityPreview(unity::dash::Preview::Ptr unityPreview)
@@ -151,6 +155,7 @@ Preview* Preview::newFromUnityPreview(unity::dash::Preview::Ptr unityPreview)
151void Preview::setUnityPreviewBase(unity::dash::Preview::Ptr unityPreview)
155void Preview::setUnityPreviewBase(unity::dash::Preview::Ptr unityPreview)
152{
156{
153 m_unityPreview = unityPreview;
157 m_unityPreview = unityPreview;
158+ m_result->setPreview(unityPreview);
154
159
155 qDeleteAll(m_infoHints);
160 qDeleteAll(m_infoHints);
156 m_infoHints.clear();
161 m_infoHints.clear();
@@ -181,8 +186,14 @@ void Preview::execute(const QString& actionId, const QHash<QString, QVariant>& h
181{
186{
182 if (m_unityPreview) {
187 if (m_unityPreview) {
183 auto unityHints = convertToHintsMap(hints);
188 auto unityHints = convertToHintsMap(hints);
189+ m_actionCancellable.Renew();
184− m_unityPreview->PerformAction(actionId.toStdString(), unityHints);
190+ m_unityPreview->PerformAction(actionId.toStdString(), unityHints, nullptr, m_actionCancellable);
185 } else {
191 } else {
186 qWarning() << "Preview not set";
192 qWarning() << "Preview not set";
187 }
193 }
188}
194}
195+
196+void Preview::cancelAction()
197+{
198+ m_actionCancellable.Cancel();
199+}
plugins/Unity/preview.h+7−2
@@ -31,7 +31,9 @@
31#include <UnityCore/Preview.h>
31#include <UnityCore/Preview.h>
32
32
33// local
33// local
34+#include "result.h"
34#include "previewaction.h"
35#include "previewaction.h"
36+#include <UnityCore/GLibWrapper.h>
35
37
36class Q_DECL_EXPORT Preview : public QObject
38class Q_DECL_EXPORT Preview : public QObject
37{
39{
@@ -45,7 +47,7 @@ class Q_DECL_EXPORT Preview : public QObject
45 Q_PROPERTY(QVariant infoHints READ infoHints NOTIFY previewChanged)
47 Q_PROPERTY(QVariant infoHints READ infoHints NOTIFY previewChanged)
46 Q_PROPERTY(QVariantMap infoMap READ infoHintsHash NOTIFY previewChanged)
48 Q_PROPERTY(QVariantMap infoMap READ infoHintsHash NOTIFY previewChanged)
47 Q_PROPERTY(QString image READ image NOTIFY previewChanged)
49 Q_PROPERTY(QString image READ image NOTIFY previewChanged)
48− Q_PROPERTY(QString imageSourceUri READ imageSourceUri NOTIFY previewChanged)
50+ Q_PROPERTY(QVariant result READ result NOTIFY previewChanged)
49
51
50public:
52public:
51 explicit Preview(QObject *parent = 0);
53 explicit Preview(QObject *parent = 0);
@@ -59,9 +61,10 @@ public:
59 QVariant infoHints();
61 QVariant infoHints();
60 QVariantMap infoHintsHash() const;
62 QVariantMap infoHintsHash() const;
61 QString image() const;
63 QString image() const;
62− QString imageSourceUri() const;
64+ QVariant result() const;
63
65
64 Q_INVOKABLE void execute(const QString& actionId, const QHash<QString, QVariant>& hints);
66 Q_INVOKABLE void execute(const QString& actionId, const QHash<QString, QVariant>& hints);
67+ Q_INVOKABLE void cancelAction();
65
68
66Q_SIGNALS:
69Q_SIGNALS:
67 void previewChanged();
70 void previewChanged();
@@ -70,6 +73,7 @@ protected:
70 virtual void setUnityPreview(unity::dash::Preview::Ptr unityPreview);
73 virtual void setUnityPreview(unity::dash::Preview::Ptr unityPreview);
71
74
72 unity::dash::Preview::Ptr m_unityPreview;
75 unity::dash::Preview::Ptr m_unityPreview;
76+ Result* m_result;
73
77
74private:
78private:
75 void setUnityPreviewBase(unity::dash::Preview::Ptr unityPreview);
79 void setUnityPreviewBase(unity::dash::Preview::Ptr unityPreview);
@@ -77,6 +81,7 @@ private:
77 QList<QObject *> m_actions;
81 QList<QObject *> m_actions;
78 QList<QObject *> m_infoHints;
82 QList<QObject *> m_infoHints;
79 QVariantMap m_infoHintsHash;
83 QVariantMap m_infoHintsHash;
84+ unity::glib::Cancellable m_actionCancellable;
80};
85};
81
86
82Q_DECLARE_METATYPE(Preview *)
87Q_DECLARE_METATYPE(Preview *)
plugins/Unity/result.cppnew file+82
@@ -0,0 +1,82 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * Authors:
5+ * Pawel Stolowski <pawel.stolowski@canonical.com>
6+ *
7+ * This program is free software; you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation; version 3.
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+#include "result.h"
21+#include "variantutils.h"
22+
23+Result::Result(QObject *parent) :
24+ QObject(parent)
25+{
26+}
27+
28+Result::Result(unity::dash::Preview::Ptr preview, QObject *parent) :
29+ QObject(parent),
30+ m_preview(preview)
31+{
32+}
33+
34+void Result::setPreview(unity::dash::Preview::Ptr preview)
35+{
36+ m_preview = preview;
37+}
38+
39+QString Result::uri() const
40+{
41+ return m_preview != nullptr ? QString::fromStdString(m_preview->preview_result.uri) : QString::null;
42+}
43+
44+QString Result::iconHint() const
45+{
46+ return m_preview != nullptr ? QString::fromStdString(m_preview->preview_result.icon_hint) : QString::null;
47+}
48+
49+unsigned Result::categoryIndex() const
50+{
51+ return m_preview != nullptr ? m_preview->preview_result.category_index : 0;
52+}
53+
54+unsigned Result::resultType() const
55+{
56+ return m_preview != nullptr ? m_preview->preview_result.result_type : 0;
57+}
58+
59+QString Result::mimeType() const
60+{
61+ return m_preview != nullptr ? QString::fromStdString(m_preview->preview_result.mimetype) : QString::null;
62+}
63+
64+QString Result::title() const
65+{
66+ return m_preview != nullptr ? QString::fromStdString(m_preview->preview_result.name) : QString::null;
67+}
68+
69+QString Result::comment() const
70+{
71+ return m_preview != nullptr ? QString::fromStdString(m_preview->preview_result.comment) : QString::null;
72+}
73+
74+QString Result::dndUri() const
75+{
76+ return m_preview != nullptr ? QString::fromStdString(m_preview->preview_result.dnd_uri) : QString::null;
77+}
78+
79+QVariant Result::metadata() const
80+{
81+ return m_preview != nullptr ? convertToQVariantHash(m_preview->preview_result.hints) : QVariant();
82+}
plugins/Unity/result.hnew file+69
@@ -0,0 +1,69 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * Authors:
5+ * Pawel Stolowski <pawel.stolowski@canonical.com>
6+ *
7+ * This program is free software; you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation; version 3.
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+#ifndef RESULT_H
21+#define RESULT_H
22+
23+// Qt
24+#include <QObject>
25+#include <QVariant>
26+
27+// libunity-core
28+#include <UnityCore/Preview.h>
29+
30+class Q_DECL_EXPORT Result : public QObject
31+{
32+ Q_OBJECT
33+
34+ Q_PROPERTY(QString uri READ uri CONSTANT)
35+ Q_PROPERTY(QString iconHint READ iconHint CONSTANT)
36+ Q_PROPERTY(unsigned categoryIndex READ categoryIndex CONSTANT)
37+ Q_PROPERTY(unsigned resultType READ resultType CONSTANT)
38+ Q_PROPERTY(QString mimeType READ mimeType CONSTANT)
39+ Q_PROPERTY(QString title READ title CONSTANT)
40+ Q_PROPERTY(QString comment READ comment CONSTANT)
41+ Q_PROPERTY(QString dndUri READ dndUri CONSTANT)
42+ Q_PROPERTY(QVariant metadata READ metadata CONSTANT)
43+
44+public:
45+ Result(QObject *parent = nullptr);
46+ Result(unity::dash::Preview::Ptr preview, QObject *parent = nullptr);
47+
48+ void setPreview(unity::dash::Preview::Ptr preview);
49+
50+ QString uri() const;
51+ QString iconHint() const;
52+ unsigned categoryIndex() const;
53+ unsigned resultType() const;
54+ QString mimeType() const;
55+ QString title() const;
56+ QString comment() const;
57+ QString dndUri() const;
58+ QVariant metadata() const;
59+
60+private:
61+ /* Keep reference to the original preview to access result attributes via it, rather than keeping copies of them;
62+ this will save us a bit on copying, especially as UI is mostly interested in just uri.
63+ */
64+ unity::dash::Preview::Ptr m_preview;
65+};
66+
67+Q_DECLARE_METATYPE(Result *)
68+
69+#endif
plugins/Unity/scope.cpp+76−6
@@ -33,14 +33,19 @@
33#include <QQmlEngine>
33#include <QQmlEngine>
34
34
35#include <UnityCore/Variant.h>
35#include <UnityCore/Variant.h>
36+#include <UnityCore/GLibWrapper.h>
36
37
37#include <libintl.h>
38#include <libintl.h>
38#include <glib.h>
39#include <glib.h>
39
40
40Scope::Scope(QObject *parent) : QObject(parent)
41Scope::Scope(QObject *parent) : QObject(parent)
41 , m_formFactor("phone")
42 , m_formFactor("phone")
43+ , m_isActive(false)
44+ , m_searchInProgress(false)
42{
45{
43 m_categories.reset(new Categories(this));
46 m_categories.reset(new Categories(this));
47+
48+ connect(this, &Scope::isActiveChanged, this, &Scope::scopeIsActiveChanged);
44}
49}
45
50
46QString Scope::id() const
51QString Scope::id() const
@@ -68,6 +73,11 @@ QString Scope::searchHint() const
68 return QString::fromStdString(m_unityScope->search_hint());
73 return QString::fromStdString(m_unityScope->search_hint());
69}
74}
70
75
76+bool Scope::searchInProgress() const
77+{
78+ return m_searchInProgress;
79+}
80+
71bool Scope::visible() const
81bool Scope::visible() const
72{
82{
73 return m_unityScope->visible();
83 return m_unityScope->visible();
@@ -103,6 +113,11 @@ QString Scope::formFactor() const
103 return m_formFactor;
113 return m_formFactor;
104}
114}
105
115
116+bool Scope::isActive() const
117+{
118+ return m_isActive;
119+}
120+
106Filters* Scope::filters() const
121Filters* Scope::filters() const
107{
122{
108 return m_filters.get();
123 return m_filters.get();
@@ -115,10 +130,17 @@ void Scope::setSearchQuery(const QString& search_query)
115 string ("") and m_searchQuery is the null string,
130 string ("") and m_searchQuery is the null string,
116 search_query != m_searchQuery is still true.
131 search_query != m_searchQuery is still true.
117 */
132 */
133+ using namespace std::placeholders;
134+
118 if (m_searchQuery.isNull() || search_query != m_searchQuery) {
135 if (m_searchQuery.isNull() || search_query != m_searchQuery) {
119 m_searchQuery = search_query;
136 m_searchQuery = search_query;
137+ m_cancellable.Renew();
120− m_unityScope->Search(search_query.toStdString(), sigc::mem_fun(this, &Scope::searchFinished));
138+ m_unityScope->Search(search_query.toStdString(), std::bind(&Scope::onSearchFinished, this, _1, _2, _3), m_cancellable);
121 Q_EMIT searchQueryChanged();
139 Q_EMIT searchQueryChanged();
140+ if (!m_searchInProgress) {
141+ m_searchInProgress = true;
142+ Q_EMIT searchInProgressChanged();
143+ }
122 }
144 }
123}
145}
124
146
@@ -140,6 +162,13 @@ void Scope::setFormFactor(const QString& form_factor) {
140 }
162 }
141}
163}
142
164
165+void Scope::setActive(const bool active) {
166+ if (active != m_isActive) {
167+ m_isActive = active;
168+ Q_EMIT isActiveChanged(m_isActive);
169+ }
170+}
171+
143unity::dash::LocalResult Scope::createLocalResult(const QVariant &uri, const QVariant &icon_hint,
172unity::dash::LocalResult Scope::createLocalResult(const QVariant &uri, const QVariant &icon_hint,
144 const QVariant &category, const QVariant &result_type,
173 const QVariant &category, const QVariant &result_type,
145 const QVariant &mimetype, const QVariant &title,
174 const QVariant &mimetype, const QVariant &title,
@@ -175,14 +204,21 @@ void Scope::preview(const QVariant &uri, const QVariant &icon_hint, const QVaria
175 const QVariant &comment, const QVariant &dnd_uri, const QVariant &metadata)
204 const QVariant &comment, const QVariant &dnd_uri, const QVariant &metadata)
176{
205{
177 auto res = createLocalResult(uri, icon_hint, category, result_type, mimetype, title, comment, dnd_uri, metadata);
206 auto res = createLocalResult(uri, icon_hint, category, result_type, mimetype, title, comment, dnd_uri, metadata);
207+ m_previewCancellable.Renew();
208+
178 // canned queries don't have previews, must be activated
209 // canned queries don't have previews, must be activated
179 if (uri.toString().startsWith("x-unity-no-preview-scopes-query://")) {
210 if (uri.toString().startsWith("x-unity-no-preview-scopes-query://")) {
180 m_unityScope->Activate(res);
211 m_unityScope->Activate(res);
181 } else {
212 } else {
182− m_unityScope->Preview(res);
213+ m_unityScope->Preview(res, nullptr, m_previewCancellable);
183 }
214 }
184}
215}
185
216
217+void Scope::cancelActivation()
218+{
219+ m_previewCancellable.Cancel();
220+}
221+
186void Scope::onActivated(unity::dash::LocalResult const& result, unity::dash::ScopeHandledType type, unity::glib::HintsMap const& hints)
222void Scope::onActivated(unity::dash::LocalResult const& result, unity::dash::ScopeHandledType type, unity::glib::HintsMap const& hints)
187{
223{
188 // note: we will not get called on SHOW_PREVIEW, instead UnityCore will signal preview_ready.
224 // note: we will not get called on SHOW_PREVIEW, instead UnityCore will signal preview_ready.
@@ -287,8 +323,7 @@ void Scope::setUnityScope(const unity::dash::Scope::Ptr& scope)
287 m_unityScope->visible.changed.connect(sigc::mem_fun(this, &Scope::visibleChanged));
323 m_unityScope->visible.changed.connect(sigc::mem_fun(this, &Scope::visibleChanged));
288 m_unityScope->shortcut.changed.connect(sigc::mem_fun(this, &Scope::shortcutChanged));
324 m_unityScope->shortcut.changed.connect(sigc::mem_fun(this, &Scope::shortcutChanged));
289 m_unityScope->connected.changed.connect(sigc::mem_fun(this, &Scope::connectedChanged));
325 m_unityScope->connected.changed.connect(sigc::mem_fun(this, &Scope::connectedChanged));
290− /* Signals forwarding */
326+ m_unityScope->results_dirty.changed.connect(sigc::mem_fun(this, &Scope::resultsDirtyToggled));
291− connect(this, SIGNAL(searchFinished(const std::string &, unity::glib::HintsMap const &, unity::glib::Error const &)), SLOT(onSearchFinished(const std::string &, unity::glib::HintsMap const &)));
292
327
293 /* FIXME: signal should be forwarded instead of calling the handler directly */
328 /* FIXME: signal should be forwarded instead of calling the handler directly */
294 m_unityScope->activated.connect(sigc::mem_fun(this, &Scope::onActivated));
329 m_unityScope->activated.connect(sigc::mem_fun(this, &Scope::onActivated));
@@ -309,18 +344,53 @@ unity::dash::Scope::Ptr Scope::unityScope() const
309
344
310void Scope::synchronizeStates()
345void Scope::synchronizeStates()
311{
346{
347+ using namespace std::placeholders;
348+
312 if (connected()) {
349 if (connected()) {
313 /* Forward local states to m_unityScope */
350 /* Forward local states to m_unityScope */
314 if (!m_searchQuery.isNull()) {
351 if (!m_searchQuery.isNull()) {
352+ m_cancellable.Renew();
315− m_unityScope->Search(m_searchQuery.toStdString());
353+ m_unityScope->Search(m_searchQuery.toStdString(), std::bind(&Scope::onSearchFinished, this, _1, _2, _3), m_cancellable);
354+ if (!m_searchInProgress) {
355+ m_searchInProgress = true;
356+ Q_EMIT searchInProgressChanged();
357+ }
316 }
358 }
317 }
359 }
318}
360}
319
361
362+void Scope::scopeIsActiveChanged()
363+{
364+ if (!isActive() || !m_unityScope || !m_unityScope->results_dirty()) return;
365+
366+ // force new search
367+ synchronizeStates();
368+}
369+
370+void Scope::resultsDirtyToggled(bool results_dirty)
371+{
372+ if (!results_dirty || !isActive()) return;
373+
374+ // force new search
375+ synchronizeStates();
376+}
377+
320−void Scope::onSearchFinished(const std::string& /* query */, unity::glib::HintsMap const &hints)
378+void Scope::onSearchFinished(std::string const& /* query */, unity::glib::HintsMap const& hints, unity::glib::Error const& err)
321{
379{
322 QString hint;
380 QString hint;
323
381
382+ GError* error = const_cast<unity::glib::Error&>(err);
383+
384+ if (!err || !g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
385+ if (m_searchInProgress) {
386+ m_searchInProgress = false;
387+ Q_EMIT searchInProgressChanged();
388+ }
389+ } else {
390+ // no need to check the results hint, we're still searching
391+ return;
392+ }
393+
324 if (!m_unityScope->results()->count()) {
394 if (!m_unityScope->results()->count()) {
325 unity::glib::HintsMap::const_iterator it = hints.find("no-results-hint");
395 unity::glib::HintsMap::const_iterator it = hints.find("no-results-hint");
326 if (it != hints.end()) {
396 if (it != hints.end()) {
plugins/Unity/scope.h+17−2
@@ -28,6 +28,7 @@
28// libunity-core
28// libunity-core
29#include <UnityCore/Scope.h>
29#include <UnityCore/Scope.h>
30#include <UnityCore/Results.h>
30#include <UnityCore/Results.h>
31+#include <UnityCore/GLibWrapper.h>
31
32
32#include "categories.h"
33#include "categories.h"
33#include "filters.h"
34#include "filters.h"
@@ -43,6 +44,7 @@ class Scope : public QObject
43 Q_PROPERTY(QString iconHint READ iconHint NOTIFY iconHintChanged)
44 Q_PROPERTY(QString iconHint READ iconHint NOTIFY iconHintChanged)
44 Q_PROPERTY(QString description READ description NOTIFY descriptionChanged)
45 Q_PROPERTY(QString description READ description NOTIFY descriptionChanged)
45 Q_PROPERTY(QString searchHint READ searchHint NOTIFY searchHintChanged)
46 Q_PROPERTY(QString searchHint READ searchHint NOTIFY searchHintChanged)
47+ Q_PROPERTY(bool searchInProgress READ searchInProgress NOTIFY searchInProgressChanged)
46 Q_PROPERTY(bool visible READ visible NOTIFY visibleChanged)
48 Q_PROPERTY(bool visible READ visible NOTIFY visibleChanged)
47 Q_PROPERTY(QString shortcut READ shortcut NOTIFY shortcutChanged)
49 Q_PROPERTY(QString shortcut READ shortcut NOTIFY shortcutChanged)
48 Q_PROPERTY(bool connected READ connected NOTIFY connectedChanged)
50 Q_PROPERTY(bool connected READ connected NOTIFY connectedChanged)
@@ -52,6 +54,7 @@ class Scope : public QObject
52 Q_PROPERTY(QString searchQuery READ searchQuery WRITE setSearchQuery NOTIFY searchQueryChanged)
54 Q_PROPERTY(QString searchQuery READ searchQuery WRITE setSearchQuery NOTIFY searchQueryChanged)
53 Q_PROPERTY(QString noResultsHint READ noResultsHint WRITE setNoResultsHint NOTIFY noResultsHintChanged)
55 Q_PROPERTY(QString noResultsHint READ noResultsHint WRITE setNoResultsHint NOTIFY noResultsHintChanged)
54 Q_PROPERTY(QString formFactor READ formFactor WRITE setFormFactor NOTIFY formFactorChanged)
56 Q_PROPERTY(QString formFactor READ formFactor WRITE setFormFactor NOTIFY formFactorChanged)
57+ Q_PROPERTY(bool isActive READ isActive WRITE setActive NOTIFY isActiveChanged)
55
58
56public:
59public:
57 explicit Scope(QObject *parent = 0);
60 explicit Scope(QObject *parent = 0);
@@ -65,16 +68,19 @@ public:
65 bool visible() const;
68 bool visible() const;
66 QString shortcut() const;
69 QString shortcut() const;
67 bool connected() const;
70 bool connected() const;
71+ bool searchInProgress() const;
68 Categories* categories() const;
72 Categories* categories() const;
69 Filters* filters() const;
73 Filters* filters() const;
70 QString searchQuery() const;
74 QString searchQuery() const;
71 QString noResultsHint() const;
75 QString noResultsHint() const;
72 QString formFactor() const;
76 QString formFactor() const;
77+ bool isActive() const;
73
78
74 /* setters */
79 /* setters */
75 void setSearchQuery(const QString& search_query);
80 void setSearchQuery(const QString& search_query);
76 void setNoResultsHint(const QString& hint);
81 void setNoResultsHint(const QString& hint);
77 void setFormFactor(const QString& form_factor);
82 void setFormFactor(const QString& form_factor);
83+ void setActive(const bool);
78
84
79 Q_INVOKABLE void activate(const QVariant &uri, const QVariant &icon_hint, const QVariant &category,
85 Q_INVOKABLE void activate(const QVariant &uri, const QVariant &icon_hint, const QVariant &category,
80 const QVariant &result_type, const QVariant &mimetype, const QVariant &title,
86 const QVariant &result_type, const QVariant &mimetype, const QVariant &title,
@@ -82,6 +88,8 @@ public:
82 Q_INVOKABLE void preview(const QVariant &uri, const QVariant &icon_hint, const QVariant &category,
88 Q_INVOKABLE void preview(const QVariant &uri, const QVariant &icon_hint, const QVariant &category,
83 const QVariant &result_type, const QVariant &mimetype, const QVariant &title,
89 const QVariant &result_type, const QVariant &mimetype, const QVariant &title,
84 const QVariant &comment, const QVariant &dnd_uri, const QVariant &metadata);
90 const QVariant &comment, const QVariant &dnd_uri, const QVariant &metadata);
91+ Q_INVOKABLE void cancelActivation();
92+
85 void setUnityScope(const unity::dash::Scope::Ptr& scope);
93 void setUnityScope(const unity::dash::Scope::Ptr& scope);
86 unity::dash::Scope::Ptr unityScope() const;
94 unity::dash::Scope::Ptr unityScope() const;
87
95
@@ -93,14 +101,15 @@ Q_SIGNALS:
93 void iconHintChanged(const std::string&);
101 void iconHintChanged(const std::string&);
94 void descriptionChanged(const std::string&);
102 void descriptionChanged(const std::string&);
95 void searchHintChanged(const std::string&);
103 void searchHintChanged(const std::string&);
104+ void searchInProgressChanged();
96 void visibleChanged(bool);
105 void visibleChanged(bool);
97 void shortcutChanged(const std::string&);
106 void shortcutChanged(const std::string&);
98 void connectedChanged(bool);
107 void connectedChanged(bool);
99 void categoriesChanged();
108 void categoriesChanged();
100− void searchFinished(const std::string&, unity::glib::HintsMap const&, unity::glib::Error const&);
101 void searchQueryChanged();
109 void searchQueryChanged();
102 void noResultsHintChanged();
110 void noResultsHintChanged();
103 void formFactorChanged();
111 void formFactorChanged();
112+ void isActiveChanged(bool);
104 void filtersChanged();
113 void filtersChanged();
105
114
106 // signals triggered by activate(..) or preview(..) requests.
115 // signals triggered by activate(..) or preview(..) requests.
@@ -113,7 +122,8 @@ Q_SIGNALS:
113
122
114private Q_SLOTS:
123private Q_SLOTS:
115 void synchronizeStates();
124 void synchronizeStates();
125+ void scopeIsActiveChanged();
116− void onSearchFinished(const std::string &, unity::glib::HintsMap const &);
126+ void onSearchFinished(std::string const &, unity::glib::HintsMap const &, unity::glib::Error const&);
117
127
118private:
128private:
119 unity::dash::LocalResult createLocalResult(const QVariant &uri, const QVariant &icon_hint,
129 unity::dash::LocalResult createLocalResult(const QVariant &uri, const QVariant &icon_hint,
@@ -124,6 +134,7 @@ private:
124 void onActivated(unity::dash::LocalResult const& result, unity::dash::ScopeHandledType type, unity::glib::HintsMap const& hints);
134 void onActivated(unity::dash::LocalResult const& result, unity::dash::ScopeHandledType type, unity::glib::HintsMap const& hints);
125 void onPreviewReady(unity::dash::LocalResult const& result, unity::dash::Preview::Ptr const& preview);
135 void onPreviewReady(unity::dash::LocalResult const& result, unity::dash::Preview::Ptr const& preview);
126 void fallbackActivate(const QString& uri);
136 void fallbackActivate(const QString& uri);
137+ void resultsDirtyToggled(bool);
127
138
128 unity::dash::Scope::Ptr m_unityScope;
139 unity::dash::Scope::Ptr m_unityScope;
129 std::unique_ptr<Categories> m_categories;
140 std::unique_ptr<Categories> m_categories;
@@ -131,6 +142,10 @@ private:
131 QString m_searchQuery;
142 QString m_searchQuery;
132 QString m_noResultsHint;
143 QString m_noResultsHint;
133 QString m_formFactor;
144 QString m_formFactor;
145+ bool m_isActive;
146+ bool m_searchInProgress;
147+ unity::glib::Cancellable m_cancellable;
148+ unity::glib::Cancellable m_previewCancellable;
134};
149};
135
150
136Q_DECLARE_METATYPE(Scope*)
151Q_DECLARE_METATYPE(Scope*)
plugins/Unity/variantutils.cpp+9
@@ -40,3 +40,12 @@ unity::glib::HintsMap convertToHintsMap(const QVariant &var)
40 }
40 }
41 return unity::glib::HintsMap();
41 return unity::glib::HintsMap();
42}
42}
43+
44+QVariantHash convertToQVariantHash(const unity::glib::HintsMap& var)
45+{
46+ QVariantHash hash;
47+ for (auto hint: var) {
48+ hash.insert(QString::fromStdString(hint.first), DeeListModel::VariantForData(hint.second));
49+ }
50+ return hash;
51+}
plugins/Unity/variantutils.h+1
@@ -28,5 +28,6 @@
28
28
29unity::glib::HintsMap convertToHintsMap(const QHash<QString, QVariant> &val);
29unity::glib::HintsMap convertToHintsMap(const QHash<QString, QVariant> &val);
30unity::glib::HintsMap convertToHintsMap(const QVariant &var);
30unity::glib::HintsMap convertToHintsMap(const QVariant &var);
31+QVariantHash convertToQVariantHash(const unity::glib::HintsMap& var);
31
32
32#endif
33#endif
plugins/Utils/CMakeLists.txt+13−1
@@ -1,27 +1,39 @@
1+# Dependencies
2+include(FindPkgConfig)
3+
4+pkg_search_module(GIO REQUIRED gio-2.0)
5+
1include_directories(
6include_directories(
2 ${CMAKE_CURRENT_SOURCE_DIR}
7 ${CMAKE_CURRENT_SOURCE_DIR}
3 ${CMAKE_CURRENT_BINARY_DIR}
8 ${CMAKE_CURRENT_BINARY_DIR}
4 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
9 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
10+ ${GIO_INCLUDE_DIRS}
5)
11)
6
12
7set(QMLPLUGIN_SRC
13set(QMLPLUGIN_SRC
14+ albumartprovider.cpp
8 applicationpaths.h
15 applicationpaths.h
16+ mediaartcache.cpp
9 qlimitproxymodelqml.cpp
17 qlimitproxymodelqml.cpp
10 qsortfilterproxymodelqml.cpp
18 qsortfilterproxymodelqml.cpp
11 ubuntuwindow.cpp
19 ubuntuwindow.cpp
20+ unitymenumodelpaths.cpp
12 plugin.cpp
21 plugin.cpp
13 )
22 )
14
23
15add_library(Utils-qml SHARED
24add_library(Utils-qml SHARED
16 ${QMLPLUGIN_SRC}
25 ${QMLPLUGIN_SRC}
17 )
26 )
27+
28+target_link_libraries(Utils-qml ${GIO_LDFLAGS})
29+
18# Because this is an internal support library, we want
30# Because this is an internal support library, we want
19# to expose all symbols in it. Consider changing this
31# to expose all symbols in it. Consider changing this
20# either to a static library or just using the
32# either to a static library or just using the
21# files directly in targets.
33# files directly in targets.
22set_target_properties(Utils-qml PROPERTIES COMPILE_FLAGS -fvisibility=default)
34set_target_properties(Utils-qml PROPERTIES COMPILE_FLAGS -fvisibility=default)
23
35
24−qt5_use_modules(Utils-qml Qml Quick)
36+qt5_use_modules(Utils-qml Qml Quick DBus Network XmlPatterns)
25
37
26# export the qmldir qmltypes and plugin files
38# export the qmldir qmltypes and plugin files
27export_qmlfiles(Utils Utils)
39export_qmlfiles(Utils Utils)
plugins/Utils/albumartprovider.cppnew file+231
@@ -0,0 +1,231 @@
1+/*
2+ * Copyright 2013 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+ * Authors: Jussi Pakkanen <jussi.pakkanen@canonical.com>
17+ * Pawel Stolowski <pawel.stolowski@canonical.com>
18+*/
19+
20+#include "albumartprovider.h"
21+#include <QString>
22+#include <QNetworkAccessManager>
23+#include <QEventLoop>
24+#include <QNetworkRequest>
25+#include <QNetworkReply>
26+#include <QXmlQuery>
27+#include <QTemporaryFile>
28+#include <QBuffer>
29+#include <QDebug>
30+#include <QFile>
31+#include <QStringList>
32+#include <QByteArray>
33+#include <QImage>
34+#include <QUrl>
35+
36+using namespace std;
37+
38+const std::string AlbumArtProvider::DEFAULT_ALBUM_ART = "/usr/share/unity/icons/album_missing.png";
39+const std::string AlbumArtProvider::UNITY_LENS_SCHEMA = "com.canonical.Unity.Lenses";
40+
41+AlbumArtProvider::AlbumArtProvider()
42+ : QQuickImageProvider(QQmlImageProviderBase::Image, QQmlImageProviderBase::ForceAsynchronousImageLoading),
43+ m_settings(nullptr)
44+{
45+ auto schemas = g_settings_list_schemas();
46+ if (schemas) {
47+ for (int i = 0; schemas[i]; i++) {
48+ if (g_strcmp0(schemas[i], UNITY_LENS_SCHEMA.c_str()) == 0) {
49+ m_settings = g_settings_new(UNITY_LENS_SCHEMA.c_str());
50+ break;
51+ }
52+ }
53+ }
54+ if (m_settings == nullptr) {
55+ qWarning() << "Missing" << QString::fromStdString(UNITY_LENS_SCHEMA) << "schema";
56+ }
57+}
58+
59+AlbumArtProvider::~AlbumArtProvider()
60+{
61+ if (m_settings)
62+ g_object_unref(m_settings);
63+}
64+
65+std::string AlbumArtProvider::get_lastfm_url(const albuminfo &ai) {
66+ QString artist = QString::fromStdString(ai.artist);
67+ QString album = QString::fromStdString(ai.album);
68+
69+ /// @todo: this is the old API which will probably get axed at some point in the future
70+ /// The new 2.0 API requires an API key, but supports JSON output, etc, so switching
71+ /// to it should be done ASAP.
72+ QString request = QString("http://ws.audioscrobbler.com/1.0/album/%1/%2/info.xml").arg(artist)
73+ .arg(album)
74+ .toHtmlEscaped();
75+ QScopedPointer<QNetworkAccessManager> am(new QNetworkAccessManager);
76+ QNetworkReply *reply = am->get(QNetworkRequest(QUrl(request)));
77+ QEventLoop loop;
78+ QObject::connect(am.data(), &QNetworkAccessManager::finished, &loop, &QEventLoop::quit);
79+ loop.exec();
80+
81+ if (reply->error() != QNetworkReply::NoError) {
82+ qWarning() << "Error getting the XML:" << reply->errorString();
83+ return "";
84+ }
85+
86+ QXmlQuery query;
87+ QBuffer tmp;
88+ tmp.setData(reply->readAll());
89+ tmp.open(QIODevice::ReadOnly);
90+ query.bindVariable("reply", &tmp);
91+ query.setQuery("doc($reply)/album/coverart/large[1]/text()");
92+ QString image;
93+ query.evaluateTo(&image);
94+ image = image.trimmed();
95+
96+ // return empty if last.fm tries to offer their default
97+ // fallback artwork
98+ if (image.contains("catalogue/noimage")) {
99+ return "";
100+ }
101+
102+ return image.toStdString();
103+}
104+
105+bool AlbumArtProvider::download_and_store(const std::string &image_url, const std::string &output_file) {
106+ QString url = QString::fromStdString(image_url);
107+ QString fileName = QString::fromStdString(output_file);
108+
109+ QScopedPointer<QNetworkAccessManager> am(new QNetworkAccessManager);
110+ QNetworkReply *reply = am->get(QNetworkRequest(QUrl(url)));
111+ QEventLoop loop;
112+ QObject::connect(am.data(), &QNetworkAccessManager::finished, &loop, &QEventLoop::quit);
113+ loop.exec();
114+
115+ if (reply->error() != QNetworkReply::NoError) {
116+ qWarning() << "Error getting the image:" << reply->errorString();
117+ return false;
118+ }
119+
120+ QFile file(fileName);
121+ if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
122+ qWarning() << "Could not open file for writing:" << file.errorString();
123+ return false;
124+ }
125+ if (file.write(reply->readAll()) == -1){
126+ qWarning() << "Could not write the image:" << file.error();
127+ return false;
128+ }
129+
130+ return true;
131+}
132+
133+void AlbumArtProvider::fix_format(const std::string &fname) {
134+ // MediaArtSpec requires jpg. Convert to it if necessary.
135+ FILE *f = fopen(fname.c_str(), "r");
136+ if(!f)
137+ return;
138+ unsigned char buf[2];
139+ fread(buf, 1, 2, f);
140+ fclose(f);
141+ if(buf[0] == 0xff && buf[1] == 0xd8) {
142+ return;
143+ }
144+ QImage im(fname.c_str());
145+ im.save(fname.c_str(), "JPEG");
146+}
147+
148+std::string AlbumArtProvider::get_image(const std::string &artist, const std::string &album) {
149+ albuminfo info;
150+
151+ info.artist = artist;
152+ info.album = album;
153+
154+ if(info.album.empty() || info.artist.empty()) {
155+ return DEFAULT_ALBUM_ART;
156+ }
157+ if(cache.has_art(info.artist, info.album)) {
158+ // Image may have expired from cache between these two lines.
159+ // It might expire before we return. C'est la vie.
160+ return cache.get_art_file(info.artist, info.album);
161+ }
162+
163+ if (m_settings != nullptr && g_strcmp0(g_settings_get_string(m_settings, "remote-content-search"), "all") !=0) {
164+ qDebug() << "Remote content disabled";
165+ return DEFAULT_ALBUM_ART;
166+ }
167+
168+ std::string image_url = get_lastfm_url(info);
169+ if(image_url.empty()) {
170+ return DEFAULT_ALBUM_ART;
171+ }
172+ QTemporaryFile tempFile;
173+ tempFile.open();
174+ tempFile.setAutoRemove(true);
175+ QString fname = tempFile.fileName();
176+ std::string tmpname = fname.toUtf8().data();
177+
178+ if(!download_and_store(image_url, tmpname)) {
179+ return DEFAULT_ALBUM_ART;
180+ }
181+ fix_format(tmpname.c_str());
182+ QFile f(fname);
183+ if(!f.open(QIODevice::ReadWrite)) {
184+ return DEFAULT_ALBUM_ART;
185+ }
186+ QByteArray arr = f.readAll();
187+ f.close();
188+
189+ cache.add_art(info.artist, info.album, arr.data(), arr.size());
190+ try {
191+ std::string res = cache.get_art_file(info.artist, info.album);
192+ if(res.empty())
193+ return DEFAULT_ALBUM_ART;
194+ return res;
195+ } catch(...) {
196+ }
197+ return DEFAULT_ALBUM_ART;
198+}
199+
200+QImage AlbumArtProvider::requestImage(const QString &id, QSize *realSize, const QSize &requestedSize) {
201+ Q_UNUSED(requestedSize)
202+
203+ const QStringList parts = id.split("/");
204+ if (parts.size() != 2) {
205+ qWarning() << "Invalid albumart uri:" << id;
206+ return QImage(QString::fromStdString(DEFAULT_ALBUM_ART));
207+ }
208+ const std::string artist = QUrl::fromPercentEncoding(parts[0].toUtf8()).toStdString();
209+ const std::string album = QUrl::fromPercentEncoding(parts[1].toUtf8()).toStdString();
210+
211+ std::string tgt_path;
212+ try {
213+ tgt_path = get_image(artist, album);
214+ if(!tgt_path.empty()) {
215+ QString tgt(tgt_path.c_str());
216+ QImage image;
217+ image.load(tgt);
218+ // FIXME: Rescale to requested size preserving aspect.
219+ *realSize = image.size();
220+ return image;
221+ }
222+ } catch(std::exception &e) {
223+ qDebug() << "Album art loader failed: " << e.what();
224+ } catch(...) {
225+ qDebug() << "Unknown error when generating image.";
226+ }
227+
228+ QImage fallback(QString::fromStdString(DEFAULT_ALBUM_ART));
229+ *realSize = fallback.size();
230+ return fallback;
231+}
plugins/Utils/albumartprovider.hnew file+56
@@ -0,0 +1,56 @@
1+/*
2+ * Copyright 2013 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+ * Authors: Jussi Pakkanen <jussi.pakkanen@canonical.com>
17+*/
18+
19+#ifndef ALBUMART_PROVIDER_H_
20+#define ALBUMART_PROVIDER_H_
21+
22+#include <string>
23+#include <stdexcept>
24+#include <QQuickImageProvider>
25+#include <gio/gio.h>
26+
27+#include "mediaartcache.h"
28+
29+struct albuminfo {
30+ std::string artist;
31+ std::string album;
32+};
33+
34+class AlbumArtProvider : public QQuickImageProvider
35+{
36+public:
37+ AlbumArtProvider();
38+ ~AlbumArtProvider();
39+ QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize);
40+
41+ std::string get_image(const std::string &artist, const std::string &album);
42+
43+ const static std::string DEFAULT_ALBUM_ART;
44+ const static std::string UNITY_LENS_SCHEMA;
45+private:
46+ MediaArtCache cache;
47+ GSettings *m_settings;
48+
49+ void fix_format(const std::string &fname);
50+
51+ std::string get_lastfm_url(const albuminfo &ai);
52+
53+ bool download_and_store(const std::string &image_url, const std::string &output_file);
54+};
55+
56+#endif
plugins/Utils/mediaartcache.cppnew file+178
@@ -0,0 +1,178 @@
1+/*
2+ * This file is part of the Ubuntu TV Media Scanner
3+ * Copyright (C) 2012-2013 Canonical Ltd.
4+ *
5+ * This program is free software: you can redistribute it and/or modify
6+ * it under the terms of the GNU Lesser General Public License version 3 as
7+ * published by the Free Software Foundation.
8+ *
9+ * This program is distributed in the hope that it will be useful,
10+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+ * GNU Lesser General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU Lesser General Public License
15+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
16+ *
17+ * Authored by: Jussi Pakkanen <jussi.pakkanen@canonical.com>
18+ */
19+
20+#include"mediaartcache.h"
21+
22+#include<dirent.h>
23+#include<sys/stat.h>
24+#include<fcntl.h>
25+#include<unistd.h>
26+#include<errno.h>
27+#include<stdio.h>
28+#include<string.h>
29+#include<stdlib.h>
30+#include<assert.h>
31+#include<utime.h>
32+
33+#include<glib.h>
34+
35+#include<vector>
36+#include<algorithm>
37+#include<stdexcept>
38+
39+using namespace std;
40+
41+static string md5(const string &str) {
42+ const unsigned char *buf = (const unsigned char *)str.c_str();
43+ char *normalized = g_utf8_normalize((const gchar*)buf, str.size(), G_NORMALIZE_ALL);
44+ string final;
45+ gchar *result;
46+
47+ if(normalized) {
48+ buf = (const unsigned char*)normalized;
49+ }
50+ gssize bytes = str.length();
51+
52+ result = g_compute_checksum_for_data(G_CHECKSUM_MD5, buf, bytes);
53+ final = result;
54+ g_free((gpointer)normalized);
55+ g_free(result);
56+ return final;
57+}
58+
59+MediaArtCache::MediaArtCache() {
60+ string xdg_base = g_get_user_cache_dir();
61+
62+ if (xdg_base == "") {
63+ string s("Could not determine cache dir.");
64+ throw runtime_error(s);
65+ }
66+ int ec = mkdir(xdg_base.c_str(), S_IRUSR | S_IWUSR | S_IXUSR);
67+ if (ec < 0 && errno != EEXIST) {
68+ string s("Could not create base dir.");
69+ throw runtime_error(s);
70+ }
71+ root_dir = xdg_base + "/media-art";
72+ ec = mkdir(root_dir.c_str(), S_IRUSR | S_IWUSR | S_IXUSR);
73+ if (ec < 0 && errno != EEXIST) {
74+ string s("Could not create cache dir.");
75+ throw runtime_error(s);
76+ }
77+}
78+
79+bool MediaArtCache::has_art(const std::string &artist, const std::string &album) const {
80+ string fname = get_art_file(artist, album);
81+ return access(fname.c_str(), R_OK) == 0;
82+}
83+
84+void MediaArtCache::add_art(const std::string &artist, const std::string &album,
85+ char *data, unsigned int datalen) {
86+ string abs_fname = get_full_filename(artist, album);
87+ GError *err = nullptr;
88+ if(!g_file_set_contents(abs_fname.c_str(), data, datalen, &err)) {
89+ string e("Could not write file ");
90+ e += abs_fname;
91+ e += ": ";
92+ e += err->message;
93+ g_error_free(err);
94+ throw runtime_error(e);
95+ }
96+}
97+
98+string MediaArtCache::get_art_file(const std::string &artist, const std::string &album) const {
99+ string abs_fname = get_full_filename(artist, album);
100+
101+ if (access(abs_fname.c_str(), R_OK) == 0) {
102+ utime(abs_fname.c_str(), nullptr); // update access times to current time
103+ return abs_fname;
104+ }
105+ return "";
106+}
107+
108+std::string MediaArtCache::get_full_filename(const std::string &artist, const std::string & album) const {
109+ return root_dir + "/" + compute_base_name(artist, album);
110+}
111+
112+
113+std::string MediaArtCache::compute_base_name(const std::string &artist, const std::string &album) const {
114+ string type = "album";
115+ string h1 = md5(artist);
116+ string h2 = md5(album);
117+ return type + "-" + h1 + "-" + h2 + ".jpg";
118+}
119+
120+
121+void MediaArtCache::clear() const {
122+ DIR *d = opendir(root_dir.c_str());
123+ if(!d) {
124+ string s = "Something went wrong.";
125+ throw runtime_error(s);
126+ }
127+ struct dirent *entry, *de;
128+ entry = (dirent*)malloc(sizeof(dirent) + NAME_MAX);
129+ while(readdir_r(d, entry, &de) == 0 && de) {
130+ string basename = entry->d_name;
131+ if (basename == "." || basename == "..")
132+ continue;
133+ string fname = root_dir + "/" + basename;
134+ if(remove(fname.c_str()) < 0) {
135+ // This is not really an error worth
136+ // halting everything for.
137+ fprintf(stderr, "Could not delete file %s: %s.\n", fname.c_str(),
138+ strerror(errno));
139+ }
140+ }
141+ free(entry);
142+ closedir(d);
143+}
144+
145+void MediaArtCache::prune() {
146+ vector<pair<double, string>> mtimes;
147+ DIR *d = opendir(root_dir.c_str());
148+ if(!d) {
149+ string s = "Something went wrong.";
150+ throw runtime_error(s);
151+ }
152+ struct dirent *entry, *de;
153+ entry = (dirent*)malloc(sizeof(dirent) + NAME_MAX);
154+ while(readdir_r(d, entry, &de) == 0 && de) {
155+ string basename = entry->d_name;
156+ if (basename == "." || basename == "..")
157+ continue;
158+ string fname = root_dir + "/" + basename;
159+ struct stat sbuf;
160+ if(stat(fname.c_str(), &sbuf) != 0) {
161+ continue;
162+ }
163+ // Use mtime because atime is not guaranteed to work if, for example
164+ // the filesystem is mounted with noatime or relatime.
165+ mtimes.push_back(make_pair(sbuf.st_mtim.tv_sec + sbuf.st_mtim.tv_nsec/1000000000.0, fname));
166+ }
167+ free(entry);
168+ closedir(d);
169+ if (mtimes.size() <= MAX_SIZE)
170+ return;
171+ sort(mtimes.begin(), mtimes.end());
172+ for(size_t i=0; i < mtimes.size()-MAX_SIZE; i++) {
173+ if(remove(mtimes[i].second.c_str()) < 0) {
174+ fprintf(stderr, "Could not remove file %s: %s.\n",
175+ mtimes[i].second.c_str(), strerror(errno));
176+ }
177+ }
178+}
plugins/Utils/mediaartcache.hnew file+54
@@ -0,0 +1,54 @@
1+/*
2+ * This file is part of the Ubuntu TV Media Scanner
3+ * Copyright (C) 2012-2013 Canonical Ltd.
4+ *
5+ * This program is free software: you can redistribute it and/or modify
6+ * it under the terms of the GNU Lesser General Public License version 3 as
7+ * published by the Free Software Foundation.
8+ *
9+ * This program is distributed in the hope that it will be useful,
10+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+ * GNU Lesser General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU Lesser General Public License
15+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
16+ *
17+ * Authored by: Jussi Pakkanen <jussi.pakkanen@canonical.com>
18+ */
19+
20+#ifndef MEDIAARTCACHE_H
21+#define MEDIAARTCACHE_H
22+
23+#include<string>
24+
25+/*
26+ * A class to store thumbnails for files according to
27+ * https://wiki.gnome.org/MediaArtStorageSpec
28+ *
29+ * As this class deals mostly with the filesystem, all
30+ * errors are reported with runtime_error exceptions.
31+ */
32+
33+
34+class MediaArtCache {
35+private:
36+ std::string root_dir;
37+
38+ std::string compute_base_name(const std::string &artist, const std::string &album) const;
39+ std::string get_full_filename(const std::string &artist, const std::string & album) const;
40+
41+public:
42+ static const unsigned int MAX_SIZE = 200;
43+
44+ MediaArtCache();
45+ bool has_art(const std::string &artist, const std::string &album) const;
46+ void add_art(const std::string &artist, const std::string &album,
47+ char *data, unsigned int datalen);
48+ std::string get_art_file(const std::string &artist, const std::string &album) const;
49+ void clear() const;
50+ void prune();
51+ std::string get_cache_dir() const { return root_dir; }
52+};
53+
54+#endif
plugins/Utils/plugin.cpp+22−1
@@ -19,15 +19,17 @@
19// Qt
19// Qt
20#include <QtQml/qqml.h>
20#include <QtQml/qqml.h>
21#include <QtQuick/QQuickWindow>
21#include <QtQuick/QQuickWindow>
22−
22+#include <QDebug>
23// self
23// self
24#include "plugin.h"
24#include "plugin.h"
25
25
26// local
26// local
27+#include "albumartprovider.h"
27#include "applicationpaths.h"
28#include "applicationpaths.h"
28#include "qlimitproxymodelqml.h"
29#include "qlimitproxymodelqml.h"
29#include "qsortfilterproxymodelqml.h"
30#include "qsortfilterproxymodelqml.h"
30#include "ubuntuwindow.h"
31#include "ubuntuwindow.h"
32+#include "unitymenumodelpaths.h"
31
33
32static QObject* applicationsPathsSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
34static QObject* applicationsPathsSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
33 Q_UNUSED(engine);
35 Q_UNUSED(engine);
@@ -41,6 +43,25 @@ void UtilsPlugin::registerTypes(const char *uri)
41 qmlRegisterType<QAbstractItemModel>();
43 qmlRegisterType<QAbstractItemModel>();
42 qmlRegisterType<QLimitProxyModelQML>(uri, 0, 1, "LimitProxyModel");
44 qmlRegisterType<QLimitProxyModelQML>(uri, 0, 1, "LimitProxyModel");
43 qmlRegisterType<QSortFilterProxyModelQML>(uri, 0, 1, "SortFilterProxyModel");
45 qmlRegisterType<QSortFilterProxyModelQML>(uri, 0, 1, "SortFilterProxyModel");
46+ qmlRegisterType<UnityMenuModelPaths>(uri, 0, 1, "UnityMenuModelPaths");
44 qmlRegisterExtendedType<QQuickWindow, UbuntuWindow>(uri, 0, 1, "Window");
47 qmlRegisterExtendedType<QQuickWindow, UbuntuWindow>(uri, 0, 1, "Window");
45 qmlRegisterSingletonType<ApplicationPaths>(uri, 0, 1, "ApplicationPaths", applicationsPathsSingleton);
48 qmlRegisterSingletonType<ApplicationPaths>(uri, 0, 1, "ApplicationPaths", applicationsPathsSingleton);
46}
49}
50+
51+void UtilsPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
52+{
53+ QQmlExtensionPlugin::initializeEngine(engine, uri);
54+
55+ try
56+ {
57+ engine->addImageProvider(QLatin1String("albumart"), new AlbumArtProvider);
58+ }
59+ catch (const std::runtime_error &e)
60+ {
61+ qWarning() << "Failed to register image provider for albumart:" << e.what();
62+ }
63+ catch (...)
64+ {
65+ qWarning() << "Failed to register image provider for albumart (unknown error)";
66+ }
67+}
plugins/Utils/plugin.h+1
@@ -29,6 +29,7 @@ class UtilsPlugin : public QQmlExtensionPlugin
29
29
30public:
30public:
31 void registerTypes(const char *uri);
31 void registerTypes(const char *uri);
32+ void initializeEngine(QQmlEngine *engine, const char *uri);
32};
33};
33
34
34#endif
35#endif
plugins/Utils/unitymenumodelpaths.cppnew file+182
@@ -0,0 +1,182 @@
1+/*
2+ * Copyright (C) 2013 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+ * Author: Nick Dedekind <nick.dedekind@canonical.com>
17+ */
18+
19+
20+#include "unitymenumodelpaths.h"
21+#include <QDBusArgument>
22+
23+static QVariant parseVariantData(const QVariant& var);
24+
25+const QDBusArgument &operator>>(const QDBusArgument &arg, QVariantMap &map)
26+{
27+ arg.beginMap();
28+ map.clear();
29+ while (!arg.atEnd()) {
30+ QString key;
31+ QVariant value;
32+ arg.beginMapEntry();
33+
34+ arg >> key >> value;
35+ map.insertMulti(key, parseVariantData(value)); // re-parse for qdbusargument
36+
37+ arg.endMapEntry();
38+ }
39+ arg.endMap();
40+ return arg;
41+}
42+
43+static QVariant parseVariantData(const QVariant& var) {
44+ if ((int)var.type() == QMetaType::User && var.userType() == qMetaTypeId<QDBusArgument>()) {
45+ QDBusArgument arg(var.value<QDBusArgument>());
46+ if (arg.currentType() == QDBusArgument::MapType) {
47+ QVariantMap map;
48+ arg >> map;
49+ return map;
50+ }
51+ return arg.asVariant();
52+ }
53+
54+ return var;
55+}
56+
57+UnityMenuModelPaths::UnityMenuModelPaths(QObject *parent)
58+ : QObject(parent)
59+{
60+}
61+
62+QVariant UnityMenuModelPaths::source() const
63+{
64+ return m_sourceData;
65+}
66+
67+void UnityMenuModelPaths::setSource(const QVariant& data)
68+{
69+ if (m_sourceData != data) {
70+ m_sourceData = data;
71+ Q_EMIT sourceChanged();
72+
73+ updateData();
74+ }
75+}
76+
77+void UnityMenuModelPaths::updateData()
78+{
79+ QVariantMap dataMap = parseVariantData(m_sourceData).toMap();
80+
81+ if (!m_busNameHint.isEmpty() && dataMap.contains(m_busNameHint)) {
82+ setBusName(dataMap[m_busNameHint].toByteArray());
83+ } else {
84+ setBusName("");
85+ }
86+
87+ if (!m_menuObjectPathHint.isEmpty() && dataMap.contains(m_menuObjectPathHint)) {
88+ setMenuObjectPath(dataMap[m_menuObjectPathHint].toByteArray());
89+ } else {
90+ setMenuObjectPath("");
91+ }
92+
93+ if (!m_actionsHint.isEmpty() && dataMap.contains(m_actionsHint)) {
94+ setActions(dataMap[m_actionsHint].toMap());
95+ } else {
96+ setActions(QVariantMap());
97+ }
98+}
99+
100+QByteArray UnityMenuModelPaths::busName() const
101+{
102+ return m_busName;
103+}
104+
105+void UnityMenuModelPaths::setBusName(const QByteArray &name)
106+{
107+ if (m_busName != name) {
108+ m_busName = name;
109+ Q_EMIT busNameChanged();
110+ }
111+}
112+
113+QVariantMap UnityMenuModelPaths::actions() const
114+{
115+ return m_actions;
116+}
117+
118+void UnityMenuModelPaths::setActions(const QVariantMap &actions)
119+{
120+ if (m_actions != actions) {
121+ m_actions = actions;
122+ Q_EMIT actionsChanged();
123+ }
124+}
125+
126+QByteArray UnityMenuModelPaths::menuObjectPath() const
127+{
128+ return m_menuObjectPath;
129+}
130+
131+void UnityMenuModelPaths::setMenuObjectPath(const QByteArray &path)
132+{
133+ if (m_menuObjectPath != path) {
134+ m_menuObjectPath = path;
135+ Q_EMIT menuObjectPathChanged();
136+ }
137+}
138+
139+QByteArray UnityMenuModelPaths::busNameHint() const
140+{
141+ return m_busNameHint;
142+}
143+
144+void UnityMenuModelPaths::setBusNameHint(const QByteArray &nameHint)
145+{
146+ if (m_busNameHint != nameHint) {
147+ m_busNameHint = nameHint;
148+ Q_EMIT busNameHintChanged();
149+
150+ updateData();
151+ }
152+}
153+
154+QByteArray UnityMenuModelPaths::actionsHint() const
155+{
156+ return m_actionsHint;
157+}
158+
159+void UnityMenuModelPaths::setActionsHint(const QByteArray &actionsHint)
160+{
161+ if (m_actionsHint != actionsHint) {
162+ m_actionsHint = actionsHint;
163+ Q_EMIT actionsHintChanged();
164+
165+ updateData();
166+ }
167+}
168+
169+QByteArray UnityMenuModelPaths::menuObjectPathHint() const
170+{
171+ return m_menuObjectPathHint;
172+}
173+
174+void UnityMenuModelPaths::setMenuObjectPathHint(const QByteArray &pathHint)
175+{
176+ if (m_menuObjectPathHint != pathHint) {
177+ m_menuObjectPathHint = pathHint;
178+ Q_EMIT menuObjectPathHintChanged();
179+
180+ updateData();
181+ }
182+}
plugins/Utils/unitymenumodelpaths.hnew file+82
@@ -0,0 +1,82 @@
1+/*
2+ * Copyright (C) 2013 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+ * Author: Nick Dedekind <nick.dedekind@canonical.com>
17+ */
18+
19+#ifndef UNITY_MENU_MODEL_PATHS_H
20+#define UNITY_MENU_MODEL_PATHS_H
21+
22+#include <QVariant>
23+
24+class UnityMenuModelPaths : public QObject
25+{
26+ Q_OBJECT
27+
28+ Q_PROPERTY(QVariant source READ source WRITE setSource NOTIFY sourceChanged)
29+ Q_PROPERTY(QByteArray busName READ busName NOTIFY busNameChanged)
30+ Q_PROPERTY(QVariantMap actions READ actions NOTIFY actionsChanged)
31+ Q_PROPERTY(QByteArray menuObjectPath READ menuObjectPath NOTIFY menuObjectPathChanged)
32+
33+ Q_PROPERTY(QByteArray busNameHint READ busNameHint WRITE setBusNameHint NOTIFY busNameHintChanged)
34+ Q_PROPERTY(QByteArray actionsHint READ actionsHint WRITE setActionsHint NOTIFY actionsHintChanged)
35+ Q_PROPERTY(QByteArray menuObjectPathHint READ menuObjectPathHint WRITE setMenuObjectPathHint NOTIFY menuObjectPathHintChanged)
36+
37+public:
38+ explicit UnityMenuModelPaths(QObject *parent = 0);
39+
40+ QVariant source() const;
41+ void setSource(const QVariant& data);
42+
43+ QByteArray busName() const;
44+ QVariantMap actions() const;
45+ QByteArray menuObjectPath() const;
46+
47+ QByteArray busNameHint() const;
48+ QByteArray actionsHint() const;
49+ QByteArray menuObjectPathHint() const;
50+
51+Q_SIGNALS:
52+ void sourceChanged();
53+ void busNameChanged();
54+ void actionsChanged();
55+ void menuObjectPathChanged();
56+
57+ void busNameHintChanged();
58+ void actionsHintChanged();
59+ void menuObjectPathHintChanged();
60+
61+private:
62+ void setBusName(const QByteArray &name);
63+ void setActions(const QVariantMap& actions);
64+ void setMenuObjectPath(const QByteArray &path);
65+
66+ void setBusNameHint(const QByteArray& nameHint);
67+ void setActionsHint(const QByteArray &actionsHint);
68+ void setMenuObjectPathHint(const QByteArray &pathHint);
69+
70+ void updateData();
71+
72+ QVariant m_sourceData;
73+ QByteArray m_busName;
74+ QVariantMap m_actions;
75+ QByteArray m_menuObjectPath;
76+
77+ QByteArray m_busNameHint;
78+ QByteArray m_actionsHint;
79+ QByteArray m_menuObjectPathHint;
80+};
81+
82+#endif // UNITY_MENU_MODEL_PATHS_H
po/ar.po+52−66
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11"PO-Revision-Date: 2013-06-26 23:26+0000\n"
11"PO-Revision-Date: 2013-06-26 23:26+0000\n"
12"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
12"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
13"Language-Team: Arabic <ar@li.org>\n"
13"Language-Team: Arabic <ar@li.org>\n"
@@ -16,8 +16,8 @@ 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: 2013-08-30 05:37+0000\n"
19+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
20−"X-Generator: Launchpad (build 16750)\n"
20+"X-Generator: Launchpad (build 16799)\n"
21
21
22#: Applications/applications.js:23
22#: Applications/applications.js:23
23msgid "Phone"
23msgid "Phone"
@@ -87,129 +87,93 @@ msgstr "ويكيبيديا"
87msgid "YouTube"
87msgid "YouTube"
88msgstr "يوتيوب"
88msgstr "يوتيوب"
89
89
90−#: Components/EdgeDemoOverlay.qml:145
90+#: Components/EdgeDemoOverlay.qml:149
91msgid "Skip intro"
91msgid "Skip intro"
92msgstr ""
92msgstr ""
93
93
94−#: Components/EdgeDemo.qml:98
94+#: Components/EdgeDemo.qml:112
95msgid "Right edge"
95msgid "Right edge"
96msgstr ""
96msgstr ""
97
97
98−#: Components/EdgeDemo.qml:99
98+#: Components/EdgeDemo.qml:113
99msgid "Try swiping from the right edge to unlock the phone"
99msgid "Try swiping from the right edge to unlock the phone"
100msgstr ""
100msgstr ""
101
101
102−#: Components/EdgeDemo.qml:135
102+#: Components/EdgeDemo.qml:144
103msgid "Top edge"
103msgid "Top edge"
104msgstr ""
104msgstr ""
105
105
106−#: Components/EdgeDemo.qml:136
106+#: Components/EdgeDemo.qml:145
107msgid "Try swiping from the top edge to access the indicators"
107msgid "Try swiping from the top edge to access the indicators"
108msgstr ""
108msgstr ""
109
109
110−#: Components/EdgeDemo.qml:161
110+#: Components/EdgeDemo.qml:170
111msgid "Close"
111msgid "Close"
112msgstr ""
112msgstr ""
113
113
114−#: Components/EdgeDemo.qml:162
114+#: Components/EdgeDemo.qml:171
115msgid "Swipe up again to close the settings screen"
115msgid "Swipe up again to close the settings screen"
116msgstr ""
116msgstr ""
117
117
118−#: Components/EdgeDemo.qml:189
118+#: Components/EdgeDemo.qml:198
119msgid "Left edge"
119msgid "Left edge"
120msgstr ""
120msgstr ""
121
121
122−#: Components/EdgeDemo.qml:190
122+#: Components/EdgeDemo.qml:199
123msgid "Swipe from the left to reveal the launcher for quick access to apps"
123msgid "Swipe from the left to reveal the launcher for quick access to apps"
124msgstr ""
124msgstr ""
125
125
126−#: Components/EdgeDemo.qml:217
126+#: Components/EdgeDemo.qml:226
127msgid "Well done"
127msgid "Well done"
128msgstr ""
128msgstr ""
129
129
130−#: Components/EdgeDemo.qml:218
130+#: Components/EdgeDemo.qml:227
131+msgid ""
131−msgid "You have now mastered the edge gestures and can start using the phone"
132+"You have now mastered the edge gestures and can start using the "
133+"phone<br><br>Tap anywhere to start"
132msgstr ""
134msgstr ""
133
135
134−#: Components/PageHeader.qml:298
136+#: Components/PageHeader.qml:341
135msgid "Recent searches"
137msgid "Recent searches"
136msgstr "عمليات البحث الأخيرة"
138msgstr "عمليات البحث الأخيرة"
137
139
138#. TRANSLATORS: Number of persons who rated this app
140#. TRANSLATORS: Number of persons who rated this app
141+#. TRANSLATORS: Number of persons who rated this app/video/whatever
139−#: Dash/Apps/AppInfo.qml:73
142+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
140#, qt-format
143#, qt-format
141msgid "(%1)"
144msgid "(%1)"
142msgstr ""
145msgstr ""
143
146
144#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app
148+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
145−#: Dash/Apps/AppInfo.qml:85
149+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
146#, qt-format
150#, qt-format
147msgid "%1 review"
151msgid "%1 review"
148msgid_plural "%1 reviews"
152msgid_plural "%1 reviews"
149msgstr[0] ""
153msgstr[0] ""
150msgstr[1] ""
154msgstr[1] ""
151
155
152−#: Dash/Apps/AppPreview.qml:175
156+#: Dash/Apps/AppPreview.qml:126
153msgid "Rate this"
157msgid "Rate this"
154msgstr ""
158msgstr ""
155
159
156−#: Dash/Apps/AppReviews.qml:72
160+#: Dash/Previews/Reviews.qml:74
157msgid "Add a review"
161msgid "Add a review"
158msgstr ""
162msgstr ""
159
163
160−#: Dash/Apps/AppReviews.qml:84
164+#: Dash/Previews/Reviews.qml:86
161msgid "Review"
165msgid "Review"
162msgstr ""
166msgstr ""
163
167
164−#: Dash/Apps/AppReviews.qml:118
168+#: Dash/Previews/Reviews.qml:121
165msgid "Send"
169msgid "Send"
166msgstr ""
170msgstr ""
167
171
168−#: Dash/Apps/AppReviews.qml:136
172+#: Dash/Previews/Reviews.qml:139
169msgid "Comments:"
173msgid "Comments:"
170msgstr ""
174msgstr ""
171
175
172−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
173−msgid "Featured"
174−msgstr "المميز"
175−
176−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
177−msgid "Recent"
178−msgstr "الحديث"
179−
180−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
181−msgid "New Releases"
182−msgstr "الإصدارات الجديدة"
183−
184−#: Dash/DashMusic.qml:30
185−msgid "Top Charting"
186−msgstr ""
187−
188−#: Dash/DashMusic.qml:91
189−msgid "Music"
190−msgstr "موسيقى"
191−
192−#: Dash/DashVideos.qml:31
193−msgid "Popular Online"
194−msgstr "الشائع على الإنترنت"
195−
196−#: Dash/DashVideos.qml:146
197−msgid "Videos"
198−msgstr "فيديوهات"
199−
200−#: Dash/Video/VideoPreview.qml:130
201−msgid "Directed by:"
202−msgstr "أخرجه:"
203−
204−#: Dash/Video/VideoPreview.qml:153
205−msgid "Starring:"
206−msgstr "النجوم:"
207−
208−#: Dash/Video/VideoPreview.qml:176
209−msgid "Author:"
210−msgstr "المؤلف:"
211−
212−#: Greeter/Lockscreen.qml:134
176+#: Greeter/Lockscreen.qml:142
213msgid "Emergency Call"
177msgid "Emergency Call"
214msgstr ""
178msgstr ""
215
179
@@ -246,11 +210,33 @@ msgstr "تتكلم الآن..."
246msgid "Search"
210msgid "Search"
247msgstr "ابحث"
211msgstr "ابحث"
248
212
249−#: plugins/Unity/scope.cpp:317
213+#: plugins/Unity/scope.cpp:398
250msgid "Sorry, there is nothing that matches your search."
214msgid "Sorry, there is nothing that matches your search."
251msgstr "عذراً، لا يوجد ما يطابق بحثك."
215msgstr "عذراً، لا يوجد ما يطابق بحثك."
252
216
217+#: plugins/Unity/showallfilteroption.cpp:41
218+msgid "All"
219+msgstr ""
220+
253−#: Shell.qml:429
221+#: Shell.qml:438
254#, qt-format
222#, qt-format
255msgid "Please enter %1"
223msgid "Please enter %1"
256msgstr ""
224msgstr ""
225+
226+#~ msgid "Featured"
227+#~ msgstr "المميز"
228+
229+#~ msgid "Recent"
230+#~ msgstr "الحديث"
231+
232+#~ msgid "New Releases"
233+#~ msgstr "الإصدارات الجديدة"
234+
235+#~ msgid "Music"
236+#~ msgstr "موسيقى"
237+
238+#~ msgid "Popular Online"
239+#~ msgstr "الشائع على الإنترنت"
240+
241+#~ msgid "Videos"
242+#~ msgstr "فيديوهات"
po/ast.ponew file+248
@@ -0,0 +1,248 @@
1+# Asturian translation for unity8
2+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11+"PO-Revision-Date: 2013-10-03 14:02+0000\n"
12+"Last-Translator: ivarela <ivarela@ubuntu.com>\n"
13+"Language-Team: Asturian <ast@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=2; plural=n != 1;\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
20+
21+#: Applications/applications.js:23
22+msgid "Phone"
23+msgstr "Teléfonu"
24+
25+#: Applications/applications.js:29
26+msgid "Camera"
27+msgstr "Cámara"
28+
29+#: Applications/applications.js:35
30+msgid "Gallery"
31+msgstr "Galería"
32+
33+#: Applications/applications.js:40
34+msgid "Facebook"
35+msgstr "Facebook"
36+
37+#: Applications/applications.js:46
38+msgid "Browser"
39+msgstr "Navegador"
40+
41+#: Applications/applications.js:51
42+msgid "Twitter"
43+msgstr "Twitter"
44+
45+#: Applications/applications.js:57
46+msgid "GMail"
47+msgstr "GMail"
48+
49+#: Applications/applications.js:62
50+msgid "Weather"
51+msgstr "Meteoroloxía"
52+
53+#: Applications/applications.js:68
54+msgid "Notepad"
55+msgstr "Bloc de notes"
56+
57+#: Applications/applications.js:74
58+msgid "Calendar"
59+msgstr "Calendariu"
60+
61+#: Applications/applications.js:80
62+msgid "Media Player"
63+msgstr "Reproductor multimedia"
64+
65+#: Applications/applications.js:86
66+msgid "Evernote"
67+msgstr "Evernote"
68+
69+#: Applications/applications.js:91
70+msgid "Map"
71+msgstr "Map"
72+
73+#: Applications/applications.js:96
74+msgid "Pinterest"
75+msgstr "Pinterest"
76+
77+#: Applications/applications.js:101
78+msgid "SoundCloud"
79+msgstr "SoundCloud"
80+
81+#: Applications/applications.js:106
82+msgid "Wikipedia"
83+msgstr "Wikipedia"
84+
85+#: Applications/applications.js:111
86+msgid "YouTube"
87+msgstr "YouTube"
88+
89+#: Components/EdgeDemoOverlay.qml:149
90+msgid "Skip intro"
91+msgstr "Omitir la intro"
92+
93+#: Components/EdgeDemo.qml:112
94+msgid "Right edge"
95+msgstr "Berbesu drechu"
96+
97+#: Components/EdgeDemo.qml:113
98+msgid "Try swiping from the right edge to unlock the phone"
99+msgstr "Esliza'l deu dende'l berbesu drechu pa desbloquiar el teléfonu"
100+
101+#: Components/EdgeDemo.qml:144
102+msgid "Top edge"
103+msgstr "Berbesu superior"
104+
105+#: Components/EdgeDemo.qml:145
106+msgid "Try swiping from the top edge to access the indicators"
107+msgstr "Esliza'l deu dende'l berbesu superior p'acceder a los menús"
108+
109+#: Components/EdgeDemo.qml:170
110+msgid "Close"
111+msgstr "Zarrar"
112+
113+#: Components/EdgeDemo.qml:171
114+msgid "Swipe up again to close the settings screen"
115+msgstr "Esliza hacia arriba pa zarrar la pantalla d'axustes"
116+
117+#: Components/EdgeDemo.qml:198
118+msgid "Left edge"
119+msgstr "Berbesu esquierdu"
120+
121+#: Components/EdgeDemo.qml:199
122+msgid "Swipe from the left to reveal the launcher for quick access to apps"
123+msgstr ""
124+"Esliza'l deu dende la esquierda p'amosar el llanzador y acceder rápidamente "
125+"a les aplicaciones"
126+
127+#: Components/EdgeDemo.qml:226
128+msgid "Well done"
129+msgstr "Bien fecho"
130+
131+#: Components/EdgeDemo.qml:227
132+msgid ""
133+"You have now mastered the edge gestures and can start using the "
134+"phone<br><br>Tap anywhere to start"
135+msgstr ""
136+"Agora domines los xestos de berbesos y pues usar el teléfonu<br><br>Toca la "
137+"pantalla pa entamar"
138+
139+#: Components/PageHeader.qml:341
140+msgid "Recent searches"
141+msgstr "Busques recientes"
142+
143+#. TRANSLATORS: Number of persons who rated this app
144+#. TRANSLATORS: Number of persons who rated this app/video/whatever
145+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
146+#, qt-format
147+msgid "(%1)"
148+msgstr "(%1)"
149+
150+#. TRANSLATORS: Number of persons who wrote reviews for this app
151+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
152+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
153+#, qt-format
154+msgid "%1 review"
155+msgid_plural "%1 reviews"
156+msgstr[0] "%1 reseña"
157+msgstr[1] "%1 reseñes"
158+
159+#: Dash/Apps/AppPreview.qml:126
160+msgid "Rate this"
161+msgstr "Valorar esto"
162+
163+#: Dash/Previews/Reviews.qml:74
164+msgid "Add a review"
165+msgstr "Amestar una reseña"
166+
167+#: Dash/Previews/Reviews.qml:86
168+msgid "Review"
169+msgstr "Revisar"
170+
171+#: Dash/Previews/Reviews.qml:121
172+msgid "Send"
173+msgstr "Unviar"
174+
175+#: Dash/Previews/Reviews.qml:139
176+msgid "Comments:"
177+msgstr "Comentarios:"
178+
179+#: Greeter/Lockscreen.qml:142
180+msgid "Emergency Call"
181+msgstr "Llamada d'emerxencia"
182+
183+#: Greeter/PassphraseLockscreen.qml:59
184+#, qt-format
185+msgid "Hello %1"
186+msgstr "Hola %1"
187+
188+#: Greeter/PassphraseLockscreen.qml:59
189+msgid "Hello"
190+msgstr "Hola"
191+
192+#: Hud/HudParametrizedActionsPage.qml:132
193+msgid "Confirm"
194+msgstr "Confirmar"
195+
196+#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
197+msgid "Type or say a command"
198+msgstr "Escribi o di una orde"
199+
200+#: Hud/Hud.qml:84
201+msgid "Loading. Please Wait..."
202+msgstr "Cargando, espera…"
203+
204+#: Hud/Hud.qml:89
205+msgid "Speak Now..."
206+msgstr "Fala agora…"
207+
208+#: Hud/Hud.qml:94
209+msgid "Speaking..."
210+msgstr "Falando…"
211+
212+#: Panel/SearchIndicator.qml:27
213+msgid "Search"
214+msgstr "Guetar"
215+
216+#: plugins/Unity/scope.cpp:398
217+msgid "Sorry, there is nothing that matches your search."
218+msgstr "Sentímoslo, nun hai res que concase cola gueta"
219+
220+#: plugins/Unity/showallfilteroption.cpp:41
221+msgid "All"
222+msgstr "Too"
223+
224+#: Shell.qml:438
225+#, qt-format
226+msgid "Please enter %1"
227+msgstr "Introduz %1"
228+
229+#~ msgid "New Releases"
230+#~ msgstr "Llanzamientos nuevos"
231+
232+#~ msgid "Featured"
233+#~ msgstr "Destacaos"
234+
235+#~ msgid "Top Charting"
236+#~ msgstr "Meyor posicionaes"
237+
238+#~ msgid "Recent"
239+#~ msgstr "Recientes"
240+
241+#~ msgid "Videos"
242+#~ msgstr "Vídeos"
243+
244+#~ msgid "Music"
245+#~ msgstr "Música"
246+
247+#~ msgid "Popular Online"
248+#~ msgstr "Populares en llinia"
po/az.po+40−66
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11"PO-Revision-Date: 2013-06-26 23:48+0000\n"
11"PO-Revision-Date: 2013-06-26 23:48+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Azerbaijani <az@li.org>\n"
13"Language-Team: Azerbaijani <az@li.org>\n"
@@ -15,8 +15,8 @@ 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: 2013-08-30 05:37+0000\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
19+"X-Generator: Launchpad (build 16799)\n"
20
20
21#: Applications/applications.js:23
21#: Applications/applications.js:23
22msgid "Phone"
22msgid "Phone"
@@ -86,129 +86,93 @@ msgstr ""
86msgid "YouTube"
86msgid "YouTube"
87msgstr ""
87msgstr ""
88
88
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
90msgid "Skip intro"
90msgid "Skip intro"
91msgstr ""
91msgstr ""
92
92
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
94msgid "Right edge"
94msgid "Right edge"
95msgstr ""
95msgstr ""
96
96
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
98msgid "Try swiping from the right edge to unlock the phone"
98msgid "Try swiping from the right edge to unlock the phone"
99msgstr ""
99msgstr ""
100
100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102msgid "Top edge"
102msgid "Top edge"
103msgstr ""
103msgstr ""
104
104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106msgid "Try swiping from the top edge to access the indicators"
106msgid "Try swiping from the top edge to access the indicators"
107msgstr ""
107msgstr ""
108
108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110msgid "Close"
110msgid "Close"
111msgstr ""
111msgstr ""
112
112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114msgid "Swipe up again to close the settings screen"
114msgid "Swipe up again to close the settings screen"
115msgstr ""
115msgstr ""
116
116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118msgid "Left edge"
118msgid "Left edge"
119msgstr ""
119msgstr ""
120
120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123msgstr ""
123msgstr ""
124
124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126msgid "Well done"
126msgid "Well done"
127msgstr ""
127msgstr ""
128
128
129−#: Components/EdgeDemo.qml:218
129+#: Components/EdgeDemo.qml:227
130+msgid ""
130−msgid "You have now mastered the edge gestures and can start using the phone"
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131msgstr ""
133msgstr ""
132
134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134msgid "Recent searches"
136msgid "Recent searches"
135msgstr "Son axtarışlar"
137msgstr "Son axtarışlar"
136
138
137#. TRANSLATORS: Number of persons who rated this app
139#. TRANSLATORS: Number of persons who rated this app
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
138−#: Dash/Apps/AppInfo.qml:73
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139#, qt-format
142#, qt-format
140msgid "(%1)"
143msgid "(%1)"
141msgstr ""
144msgstr ""
142
145
143#. TRANSLATORS: Number of persons who wrote reviews for this app
146#. TRANSLATORS: Number of persons who wrote reviews for this app
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
144−#: Dash/Apps/AppInfo.qml:85
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145#, qt-format
149#, qt-format
146msgid "%1 review"
150msgid "%1 review"
147msgid_plural "%1 reviews"
151msgid_plural "%1 reviews"
148msgstr[0] ""
152msgstr[0] ""
149msgstr[1] ""
153msgstr[1] ""
150
154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152msgid "Rate this"
156msgid "Rate this"
153msgstr ""
157msgstr ""
154
158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156msgid "Add a review"
160msgid "Add a review"
157msgstr ""
161msgstr ""
158
162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160msgid "Review"
164msgid "Review"
161msgstr ""
165msgstr ""
162
166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164msgid "Send"
168msgid "Send"
165msgstr ""
169msgstr ""
166
170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168msgid "Comments:"
172msgid "Comments:"
169msgstr ""
173msgstr ""
170
174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Musiqi"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Videolar"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212msgid "Emergency Call"
176msgid "Emergency Call"
213msgstr ""
177msgstr ""
214
178
@@ -245,11 +209,21 @@ msgstr "Söylənilir..."
245msgid "Search"
209msgid "Search"
246msgstr "Axtar"
210msgstr "Axtar"
247
211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249msgid "Sorry, there is nothing that matches your search."
213msgid "Sorry, there is nothing that matches your search."
250msgstr "Bağışlayın, amma axtarışınıza heç bir nəticə uyğun gəlmir."
214msgstr "Bağışlayın, amma axtarışınıza heç bir nəticə uyğun gəlmir."
251
215
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
252−#: Shell.qml:429
220+#: Shell.qml:438
253#, qt-format
221#, qt-format
254msgid "Please enter %1"
222msgid "Please enter %1"
255msgstr ""
223msgstr ""
224+
225+#~ msgid "Music"
226+#~ msgstr "Musiqi"
227+
228+#~ msgid "Videos"
229+#~ msgstr "Videolar"
po/bg.po+46−66
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11"PO-Revision-Date: 2013-06-27 00:06+0000\n"
11"PO-Revision-Date: 2013-06-27 00:06+0000\n"
12"Last-Translator: Miroslav E. Hadzhiev (Хаджиев) "
12"Last-Translator: Miroslav E. Hadzhiev (Хаджиев) "
13"<miroslav.hadzhiev@gmail.com>\n"
13"<miroslav.hadzhiev@gmail.com>\n"
@@ -16,8 +16,8 @@ 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: 2013-08-30 05:37+0000\n"
19+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
20−"X-Generator: Launchpad (build 16750)\n"
20+"X-Generator: Launchpad (build 16799)\n"
21
21
22#: Applications/applications.js:23
22#: Applications/applications.js:23
23msgid "Phone"
23msgid "Phone"
@@ -87,129 +87,93 @@ msgstr "Уикипедия"
87msgid "YouTube"
87msgid "YouTube"
88msgstr "YouTube"
88msgstr "YouTube"
89
89
90−#: Components/EdgeDemoOverlay.qml:145
90+#: Components/EdgeDemoOverlay.qml:149
91msgid "Skip intro"
91msgid "Skip intro"
92msgstr ""
92msgstr ""
93
93
94−#: Components/EdgeDemo.qml:98
94+#: Components/EdgeDemo.qml:112
95msgid "Right edge"
95msgid "Right edge"
96msgstr ""
96msgstr ""
97
97
98−#: Components/EdgeDemo.qml:99
98+#: Components/EdgeDemo.qml:113
99msgid "Try swiping from the right edge to unlock the phone"
99msgid "Try swiping from the right edge to unlock the phone"
100msgstr ""
100msgstr ""
101
101
102−#: Components/EdgeDemo.qml:135
102+#: Components/EdgeDemo.qml:144
103msgid "Top edge"
103msgid "Top edge"
104msgstr ""
104msgstr ""
105
105
106−#: Components/EdgeDemo.qml:136
106+#: Components/EdgeDemo.qml:145
107msgid "Try swiping from the top edge to access the indicators"
107msgid "Try swiping from the top edge to access the indicators"
108msgstr ""
108msgstr ""
109
109
110−#: Components/EdgeDemo.qml:161
110+#: Components/EdgeDemo.qml:170
111msgid "Close"
111msgid "Close"
112msgstr ""
112msgstr ""
113
113
114−#: Components/EdgeDemo.qml:162
114+#: Components/EdgeDemo.qml:171
115msgid "Swipe up again to close the settings screen"
115msgid "Swipe up again to close the settings screen"
116msgstr ""
116msgstr ""
117
117
118−#: Components/EdgeDemo.qml:189
118+#: Components/EdgeDemo.qml:198
119msgid "Left edge"
119msgid "Left edge"
120msgstr ""
120msgstr ""
121
121
122−#: Components/EdgeDemo.qml:190
122+#: Components/EdgeDemo.qml:199
123msgid "Swipe from the left to reveal the launcher for quick access to apps"
123msgid "Swipe from the left to reveal the launcher for quick access to apps"
124msgstr ""
124msgstr ""
125
125
126−#: Components/EdgeDemo.qml:217
126+#: Components/EdgeDemo.qml:226
127msgid "Well done"
127msgid "Well done"
128msgstr ""
128msgstr ""
129
129
130−#: Components/EdgeDemo.qml:218
130+#: Components/EdgeDemo.qml:227
131+msgid ""
131−msgid "You have now mastered the edge gestures and can start using the phone"
132+"You have now mastered the edge gestures and can start using the "
133+"phone<br><br>Tap anywhere to start"
132msgstr ""
134msgstr ""
133
135
134−#: Components/PageHeader.qml:298
136+#: Components/PageHeader.qml:341
135msgid "Recent searches"
137msgid "Recent searches"
136msgstr "Скорошни търсения"
138msgstr "Скорошни търсения"
137
139
138#. TRANSLATORS: Number of persons who rated this app
140#. TRANSLATORS: Number of persons who rated this app
141+#. TRANSLATORS: Number of persons who rated this app/video/whatever
139−#: Dash/Apps/AppInfo.qml:73
142+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
140#, qt-format
143#, qt-format
141msgid "(%1)"
144msgid "(%1)"
142msgstr ""
145msgstr ""
143
146
144#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app
148+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
145−#: Dash/Apps/AppInfo.qml:85
149+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
146#, qt-format
150#, qt-format
147msgid "%1 review"
151msgid "%1 review"
148msgid_plural "%1 reviews"
152msgid_plural "%1 reviews"
149msgstr[0] ""
153msgstr[0] ""
150msgstr[1] ""
154msgstr[1] ""
151
155
152−#: Dash/Apps/AppPreview.qml:175
156+#: Dash/Apps/AppPreview.qml:126
153msgid "Rate this"
157msgid "Rate this"
154msgstr ""
158msgstr ""
155
159
156−#: Dash/Apps/AppReviews.qml:72
160+#: Dash/Previews/Reviews.qml:74
157msgid "Add a review"
161msgid "Add a review"
158msgstr ""
162msgstr ""
159
163
160−#: Dash/Apps/AppReviews.qml:84
164+#: Dash/Previews/Reviews.qml:86
161msgid "Review"
165msgid "Review"
162msgstr ""
166msgstr ""
163
167
164−#: Dash/Apps/AppReviews.qml:118
168+#: Dash/Previews/Reviews.qml:121
165msgid "Send"
169msgid "Send"
166msgstr ""
170msgstr ""
167
171
168−#: Dash/Apps/AppReviews.qml:136
172+#: Dash/Previews/Reviews.qml:139
169msgid "Comments:"
173msgid "Comments:"
170msgstr ""
174msgstr ""
171
175
172−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
173−msgid "Featured"
174−msgstr "Най-отличени"
175−
176−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
177−msgid "Recent"
178−msgstr "Най-нови"
179−
180−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
181−msgid "New Releases"
182−msgstr ""
183−
184−#: Dash/DashMusic.qml:30
185−msgid "Top Charting"
186−msgstr ""
187−
188−#: Dash/DashMusic.qml:91
189−msgid "Music"
190−msgstr "Музика"
191−
192−#: Dash/DashVideos.qml:31
193−msgid "Popular Online"
194−msgstr ""
195−
196−#: Dash/DashVideos.qml:146
197−msgid "Videos"
198−msgstr "Видеоклипове"
199−
200−#: Dash/Video/VideoPreview.qml:130
201−msgid "Directed by:"
202−msgstr ""
203−
204−#: Dash/Video/VideoPreview.qml:153
205−msgid "Starring:"
206−msgstr ""
207−
208−#: Dash/Video/VideoPreview.qml:176
209−msgid "Author:"
210−msgstr "Автор:"
211−
212−#: Greeter/Lockscreen.qml:134
176+#: Greeter/Lockscreen.qml:142
213msgid "Emergency Call"
177msgid "Emergency Call"
214msgstr ""
178msgstr ""
215
179
@@ -246,11 +210,27 @@ msgstr ""
246msgid "Search"
210msgid "Search"
247msgstr "Търсене"
211msgstr "Търсене"
248
212
249−#: plugins/Unity/scope.cpp:317
213+#: plugins/Unity/scope.cpp:398
250msgid "Sorry, there is nothing that matches your search."
214msgid "Sorry, there is nothing that matches your search."
251msgstr "Съжаляваме, няма нищо, което да отговаря на вашето търсене."
215msgstr "Съжаляваме, няма нищо, което да отговаря на вашето търсене."
252
216
217+#: plugins/Unity/showallfilteroption.cpp:41
218+msgid "All"
219+msgstr ""
220+
253−#: Shell.qml:429
221+#: Shell.qml:438
254#, qt-format
222#, qt-format
255msgid "Please enter %1"
223msgid "Please enter %1"
256msgstr ""
224msgstr ""
225+
226+#~ msgid "Featured"
227+#~ msgstr "Най-отличени"
228+
229+#~ msgid "Recent"
230+#~ msgstr "Най-нови"
231+
232+#~ msgid "Music"
233+#~ msgstr "Музика"
234+
235+#~ msgid "Videos"
236+#~ msgstr "Видеоклипове"
po/ca.po+71−76
@@ -7,16 +7,16 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11−"PO-Revision-Date: 2013-09-11 10:30+0000\n"
11+"PO-Revision-Date: 2013-09-28 07:38+0000\n"
12"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
12"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
13"Language-Team: Catalan <ca@li.org>\n"
13"Language-Team: Catalan <ca@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: 2013-09-12 08:06+0000\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19−"X-Generator: Launchpad (build 16761)\n"
19+"X-Generator: Launchpad (build 16799)\n"
20
20
21#: Applications/applications.js:23
21#: Applications/applications.js:23
22msgid "Phone"
22msgid "Phone"
@@ -86,136 +86,106 @@ msgstr "Viquipèdia"
86msgid "YouTube"
86msgid "YouTube"
87msgstr "YouTube"
87msgstr "YouTube"
88
88
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
90msgid "Skip intro"
90msgid "Skip intro"
91−msgstr ""
91+msgstr "Omet la introducció"
92
92
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
94msgid "Right edge"
94msgid "Right edge"
95msgstr "Vora dreta"
95msgstr "Vora dreta"
96
96
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
98msgid "Try swiping from the right edge to unlock the phone"
98msgid "Try swiping from the right edge to unlock the phone"
99msgstr ""
99msgstr ""
100+"Proveu de lliscar el dit des de la vora dreta per desblocar el telèfon"
100
101
101−#: Components/EdgeDemo.qml:135
102+#: Components/EdgeDemo.qml:144
102msgid "Top edge"
103msgid "Top edge"
103msgstr "Vora superior"
104msgstr "Vora superior"
104
105
105−#: Components/EdgeDemo.qml:136
106+#: Components/EdgeDemo.qml:145
106msgid "Try swiping from the top edge to access the indicators"
107msgid "Try swiping from the top edge to access the indicators"
107msgstr ""
108msgstr ""
109+"Proveu de lliscar el dit des de la vora superior per accedir als indicadors"
108
110
109−#: Components/EdgeDemo.qml:161
111+#: Components/EdgeDemo.qml:170
110msgid "Close"
112msgid "Close"
111−msgstr ""
113+msgstr "Tanca"
112
114
113−#: Components/EdgeDemo.qml:162
115+#: Components/EdgeDemo.qml:171
114msgid "Swipe up again to close the settings screen"
116msgid "Swipe up again to close the settings screen"
115msgstr ""
117msgstr ""
118+"Llisqueu el dit cap amunt una altra vegada per tancar la pantalla de "
119+"configuració"
116
120
117−#: Components/EdgeDemo.qml:189
121+#: Components/EdgeDemo.qml:198
118msgid "Left edge"
122msgid "Left edge"
119msgstr "Vora esquerra"
123msgstr "Vora esquerra"
120
124
121−#: Components/EdgeDemo.qml:190
125+#: Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
126msgid "Swipe from the left to reveal the launcher for quick access to apps"
123msgstr ""
127msgstr ""
128+"Llisqueu el dit des de la vora esquerra per mostrar el llançador i accedir "
129+"ràpidament a les aplicacions"
124
130
125−#: Components/EdgeDemo.qml:217
131+#: Components/EdgeDemo.qml:226
126msgid "Well done"
132msgid "Well done"
127msgstr "Enhorabona!"
133msgstr "Enhorabona!"
128
134
129−#: Components/EdgeDemo.qml:218
135+#: Components/EdgeDemo.qml:227
136+msgid ""
130−msgid "You have now mastered the edge gestures and can start using the phone"
137+"You have now mastered the edge gestures and can start using the "
138+"phone<br><br>Tap anywhere to start"
131msgstr ""
139msgstr ""
132
140
133−#: Components/PageHeader.qml:298
141+#: Components/PageHeader.qml:341
134msgid "Recent searches"
142msgid "Recent searches"
135msgstr "Cerques recents"
143msgstr "Cerques recents"
136
144
137#. TRANSLATORS: Number of persons who rated this app
145#. TRANSLATORS: Number of persons who rated this app
146+#. TRANSLATORS: Number of persons who rated this app/video/whatever
138−#: Dash/Apps/AppInfo.qml:73
147+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139#, qt-format
148#, qt-format
140msgid "(%1)"
149msgid "(%1)"
141msgstr "(%1)"
150msgstr "(%1)"
142
151
143#. TRANSLATORS: Number of persons who wrote reviews for this app
152#. TRANSLATORS: Number of persons who wrote reviews for this app
153+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
144−#: Dash/Apps/AppInfo.qml:85
154+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145#, qt-format
155#, qt-format
146msgid "%1 review"
156msgid "%1 review"
147msgid_plural "%1 reviews"
157msgid_plural "%1 reviews"
148−msgstr[0] ""
158+msgstr[0] "%1 ressenya"
149−msgstr[1] ""
159+msgstr[1] "%1 ressenyes"
150
160
151−#: Dash/Apps/AppPreview.qml:175
161+#: Dash/Apps/AppPreview.qml:126
152msgid "Rate this"
162msgid "Rate this"
153msgstr ""
163msgstr ""
154
164
155−#: Dash/Apps/AppReviews.qml:72
165+#: Dash/Previews/Reviews.qml:74
156msgid "Add a review"
166msgid "Add a review"
157−msgstr ""
167+msgstr "Afegiu una ressenya"
158
168
159−#: Dash/Apps/AppReviews.qml:84
169+#: Dash/Previews/Reviews.qml:86
160msgid "Review"
170msgid "Review"
161msgstr "Ressenya"
171msgstr "Ressenya"
162
172
163−#: Dash/Apps/AppReviews.qml:118
173+#: Dash/Previews/Reviews.qml:121
164msgid "Send"
174msgid "Send"
165−msgstr ""
175+msgstr "Envia"
166
176
167−#: Dash/Apps/AppReviews.qml:136
177+#: Dash/Previews/Reviews.qml:139
168msgid "Comments:"
178msgid "Comments:"
169msgstr "Comentaris:"
179msgstr "Comentaris:"
170
180
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr "Destacats"
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr "Recents"
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Música"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Vídeos"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr "Autor:"
210−
211−#: Greeter/Lockscreen.qml:134
181+#: Greeter/Lockscreen.qml:142
212msgid "Emergency Call"
182msgid "Emergency Call"
213−msgstr ""
183+msgstr "Trucada d'emergència"
214
184
215#: Greeter/PassphraseLockscreen.qml:59
185#: Greeter/PassphraseLockscreen.qml:59
216#, qt-format
186#, qt-format
217msgid "Hello %1"
187msgid "Hello %1"
218−msgstr ""
188+msgstr "Hola %1"
219
189
220#: Greeter/PassphraseLockscreen.qml:59
190#: Greeter/PassphraseLockscreen.qml:59
221msgid "Hello"
191msgid "Hello"
@@ -245,11 +215,36 @@ msgstr "S'està parlant..."
245msgid "Search"
215msgid "Search"
246msgstr "Cerca"
216msgstr "Cerca"
247
217
248−#: plugins/Unity/scope.cpp:317
218+#: plugins/Unity/scope.cpp:398
249msgid "Sorry, there is nothing that matches your search."
219msgid "Sorry, there is nothing that matches your search."
250msgstr "No hi ha res que coincideixi amb la cerca"
220msgstr "No hi ha res que coincideixi amb la cerca"
251
221
222+#: plugins/Unity/showallfilteroption.cpp:41
223+msgid "All"
224+msgstr ""
225+
252−#: Shell.qml:429
226+#: Shell.qml:438
253#, qt-format
227#, qt-format
254msgid "Please enter %1"
228msgid "Please enter %1"
255−msgstr ""
229+msgstr "Introduïu %1"
230+
231+#~ msgid "Music"
232+#~ msgstr "Música"
233+
234+#~ msgid "Videos"
235+#~ msgstr "Vídeos"
236+
237+#~ msgid "Recent"
238+#~ msgstr "Recents"
239+
240+#~ msgid "Featured"
241+#~ msgstr "Destacats"
242+
243+#~ msgid "New Releases"
244+#~ msgstr "Novetats"
245+
246+#~ msgid "Top Charting"
247+#~ msgstr "El millor de les llistes"
248+
249+#~ msgid "Popular Online"
250+#~ msgstr "Popular a la xarxa"
po/cs.ponew file+239
@@ -0,0 +1,239 @@
1+# Czech translation for unity8
2+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11+"PO-Revision-Date: 2013-10-08 08:09+0000\n"
12+"Last-Translator: Tadeáš Pařík <tadeas.parik@gmail.com>\n"
13+"Language-Team: Czech <cs@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
20+
21+#: Applications/applications.js:23
22+msgid "Phone"
23+msgstr "Telefon"
24+
25+#: Applications/applications.js:29
26+msgid "Camera"
27+msgstr "Fotoaparát"
28+
29+#: Applications/applications.js:35
30+msgid "Gallery"
31+msgstr "Galerie"
32+
33+#: Applications/applications.js:40
34+msgid "Facebook"
35+msgstr "Facebook"
36+
37+#: Applications/applications.js:46
38+msgid "Browser"
39+msgstr "Prohlížeč"
40+
41+#: Applications/applications.js:51
42+msgid "Twitter"
43+msgstr "Twitter"
44+
45+#: Applications/applications.js:57
46+msgid "GMail"
47+msgstr "GMail"
48+
49+#: Applications/applications.js:62
50+msgid "Weather"
51+msgstr "Počasí"
52+
53+#: Applications/applications.js:68
54+msgid "Notepad"
55+msgstr "Poznámkový blok"
56+
57+#: Applications/applications.js:74
58+msgid "Calendar"
59+msgstr "Kalendář"
60+
61+#: Applications/applications.js:80
62+msgid "Media Player"
63+msgstr "Přehrávač multimédií"
64+
65+#: Applications/applications.js:86
66+msgid "Evernote"
67+msgstr "Evernote"
68+
69+#: Applications/applications.js:91
70+msgid "Map"
71+msgstr "Mapa"
72+
73+#: Applications/applications.js:96
74+msgid "Pinterest"
75+msgstr "Pinterest"
76+
77+#: Applications/applications.js:101
78+msgid "SoundCloud"
79+msgstr "Hudební Cloud"
80+
81+#: Applications/applications.js:106
82+msgid "Wikipedia"
83+msgstr "Wikipedie"
84+
85+#: Applications/applications.js:111
86+msgid "YouTube"
87+msgstr "YouTube"
88+
89+#: Components/EdgeDemoOverlay.qml:149
90+msgid "Skip intro"
91+msgstr "Přeskočit intro"
92+
93+#: Components/EdgeDemo.qml:112
94+msgid "Right edge"
95+msgstr "Pravý okraj"
96+
97+#: Components/EdgeDemo.qml:113
98+msgid "Try swiping from the right edge to unlock the phone"
99+msgstr "Pokuste se odemknout telefon potažením prstu z pravého okraje."
100+
101+#: Components/EdgeDemo.qml:144
102+msgid "Top edge"
103+msgstr "Horní okraj"
104+
105+#: Components/EdgeDemo.qml:145
106+msgid "Try swiping from the top edge to access the indicators"
107+msgstr "Pokuste se zpřístupnit indikátory potažením prstu z horního okraje"
108+
109+#: Components/EdgeDemo.qml:170
110+msgid "Close"
111+msgstr "Uzavřít"
112+
113+#: Components/EdgeDemo.qml:171
114+msgid "Swipe up again to close the settings screen"
115+msgstr ""
116+
117+#: Components/EdgeDemo.qml:198
118+msgid "Left edge"
119+msgstr "Levý okraj"
120+
121+#: Components/EdgeDemo.qml:199
122+msgid "Swipe from the left to reveal the launcher for quick access to apps"
123+msgstr "Pro rychlý přístup k aplikacím potáhněte prst z levého okraje."
124+
125+#: Components/EdgeDemo.qml:226
126+msgid "Well done"
127+msgstr "Výborně"
128+
129+#: Components/EdgeDemo.qml:227
130+msgid ""
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
133+msgstr ""
134+
135+#: Components/PageHeader.qml:341
136+msgid "Recent searches"
137+msgstr "Poslední vyhledávání"
138+
139+#. TRANSLATORS: Number of persons who rated this app
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
142+#, qt-format
143+msgid "(%1)"
144+msgstr "(%1)"
145+
146+#. TRANSLATORS: Number of persons who wrote reviews for this app
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
149+#, qt-format
150+msgid "%1 review"
151+msgid_plural "%1 reviews"
152+msgstr[0] "%1 recenze"
153+msgstr[1] "%1 recenze"
154+msgstr[2] "%1 recenzí"
155+
156+#: Dash/Apps/AppPreview.qml:126
157+msgid "Rate this"
158+msgstr "Ohodnoťte to"
159+
160+#: Dash/Previews/Reviews.qml:74
161+msgid "Add a review"
162+msgstr "Přidat recenzi"
163+
164+#: Dash/Previews/Reviews.qml:86
165+msgid "Review"
166+msgstr "Recenze"
167+
168+#: Dash/Previews/Reviews.qml:121
169+msgid "Send"
170+msgstr "Odeslat"
171+
172+#: Dash/Previews/Reviews.qml:139
173+msgid "Comments:"
174+msgstr "Komentáře:"
175+
176+#: Greeter/Lockscreen.qml:142
177+msgid "Emergency Call"
178+msgstr "Tísňové volání"
179+
180+#: Greeter/PassphraseLockscreen.qml:59
181+#, qt-format
182+msgid "Hello %1"
183+msgstr "Ahoj %1"
184+
185+#: Greeter/PassphraseLockscreen.qml:59
186+msgid "Hello"
187+msgstr "Ahoj"
188+
189+#: Hud/HudParametrizedActionsPage.qml:132
190+msgid "Confirm"
191+msgstr "Potvrdit"
192+
193+#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
194+msgid "Type or say a command"
195+msgstr "Napište nebo řekněte příkaz"
196+
197+#: Hud/Hud.qml:84
198+msgid "Loading. Please Wait..."
199+msgstr "Načítám. Čekejte prosím..."
200+
201+#: Hud/Hud.qml:89
202+msgid "Speak Now..."
203+msgstr "Mluvte..."
204+
205+#: Hud/Hud.qml:94
206+msgid "Speaking..."
207+msgstr "Mluvte..."
208+
209+#: Panel/SearchIndicator.qml:27
210+msgid "Search"
211+msgstr "Hledat"
212+
213+#: plugins/Unity/scope.cpp:398
214+msgid "Sorry, there is nothing that matches your search."
215+msgstr "Je nám líto, ale nic neodpovídá zadání"
216+
217+#: plugins/Unity/showallfilteroption.cpp:41
218+msgid "All"
219+msgstr "Vše"
220+
221+#: Shell.qml:438
222+#, qt-format
223+msgid "Please enter %1"
224+msgstr "Zadejte prosím %1"
225+
226+#~ msgid "Featured"
227+#~ msgstr "Oblíbené"
228+
229+#~ msgid "Recent"
230+#~ msgstr "Nedávné"
231+
232+#~ msgid "Videos"
233+#~ msgstr "Videa"
234+
235+#~ msgid "Music"
236+#~ msgstr "Hudba"
237+
238+#~ msgid "Popular Online"
239+#~ msgstr "Oblíbené on-line"
po/de.po+73−84
@@ -7,16 +7,16 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11−"PO-Revision-Date: 2013-06-27 00:37+0000\n"
11+"PO-Revision-Date: 2013-10-06 10:57+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12+"Last-Translator: SaGrLand <sg@samuel-greef.de>\n"
13"Language-Team: German <de@li.org>\n"
13"Language-Team: German <de@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: 2013-08-30 05:37+0000\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
19+"X-Generator: Launchpad (build 16799)\n"
20
20
21#: Applications/applications.js:23
21#: Applications/applications.js:23
22msgid "Phone"
22msgid "Phone"
@@ -86,131 +86,95 @@ msgstr "Wikipedia"
86msgid "YouTube"
86msgid "YouTube"
87msgstr "YouTube"
87msgstr "YouTube"
88
88
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
90msgid "Skip intro"
90msgid "Skip intro"
91−msgstr ""
91+msgstr "Überspringe Einführung"
92
92
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
94msgid "Right edge"
94msgid "Right edge"
95−msgstr ""
95+msgstr "Rechter Rand"
96
96
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
98msgid "Try swiping from the right edge to unlock the phone"
98msgid "Try swiping from the right edge to unlock the phone"
99msgstr ""
99msgstr ""
100
100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102msgid "Top edge"
102msgid "Top edge"
103−msgstr ""
103+msgstr "Oberer Rand"
104
104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106msgid "Try swiping from the top edge to access the indicators"
106msgid "Try swiping from the top edge to access the indicators"
107msgstr ""
107msgstr ""
108
108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110msgid "Close"
110msgid "Close"
111−msgstr ""
111+msgstr "Schließen"
112
112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114msgid "Swipe up again to close the settings screen"
114msgid "Swipe up again to close the settings screen"
115msgstr ""
115msgstr ""
116
116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118msgid "Left edge"
118msgid "Left edge"
119−msgstr ""
119+msgstr "Linker Rand"
120
120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123msgstr ""
123msgstr ""
124
124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126msgid "Well done"
126msgid "Well done"
127−msgstr ""
127+msgstr "Gut gemacht"
128
128
129−#: Components/EdgeDemo.qml:218
129+#: Components/EdgeDemo.qml:227
130+msgid ""
130−msgid "You have now mastered the edge gestures and can start using the phone"
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131msgstr ""
133msgstr ""
132
134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134msgid "Recent searches"
136msgid "Recent searches"
135msgstr "Letzte Suchbegriffe"
137msgstr "Letzte Suchbegriffe"
136
138
137#. TRANSLATORS: Number of persons who rated this app
139#. TRANSLATORS: Number of persons who rated this app
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
138−#: Dash/Apps/AppInfo.qml:73
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139#, qt-format
142#, qt-format
140msgid "(%1)"
143msgid "(%1)"
141−msgstr ""
144+msgstr "(%1)"
142
145
143#. TRANSLATORS: Number of persons who wrote reviews for this app
146#. TRANSLATORS: Number of persons who wrote reviews for this app
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
144−#: Dash/Apps/AppInfo.qml:85
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145#, qt-format
149#, qt-format
146msgid "%1 review"
150msgid "%1 review"
147msgid_plural "%1 reviews"
151msgid_plural "%1 reviews"
148−msgstr[0] ""
152+msgstr[0] "%1 Bewertung"
149−msgstr[1] ""
153+msgstr[1] "%1 Bewertungen"
150
154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152msgid "Rate this"
156msgid "Rate this"
153−msgstr ""
157+msgstr "Bewerten"
154
158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156msgid "Add a review"
160msgid "Add a review"
157−msgstr ""
161+msgstr "Bewertung hinzufügen"
158
162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160msgid "Review"
164msgid "Review"
161−msgstr ""
165+msgstr "Bewertung"
162
166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164msgid "Send"
168msgid "Send"
165−msgstr ""
169+msgstr "Senden"
166
170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168msgid "Comments:"
172msgid "Comments:"
169−msgstr ""
173+msgstr "Kommentare:"
170−
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr "Empfehlungen"
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr "Zuletzt verwendet"
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr "Neue Veröffentlichungen"
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr "Top Tabellenplatz"
186
174
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Musik"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr "Online Beliebt"
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Videos"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr "Regie:"
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr "Darsteller:"
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr "Autor:"
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212msgid "Emergency Call"
176msgid "Emergency Call"
213−msgstr ""
177+msgstr "Notruf"
214
178
215#: Greeter/PassphraseLockscreen.qml:59
179#: Greeter/PassphraseLockscreen.qml:59
216#, qt-format
180#, qt-format
@@ -245,11 +209,36 @@ msgstr "Sie sprechen …"
245msgid "Search"
209msgid "Search"
246msgstr "Suchen"
210msgstr "Suchen"
247
211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249msgid "Sorry, there is nothing that matches your search."
213msgid "Sorry, there is nothing that matches your search."
250msgstr "Entschuldigung, es wurden keine Treffer erzielt."
214msgstr "Entschuldigung, es wurden keine Treffer erzielt."
251
215
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr "Alle"
219+
252−#: Shell.qml:429
220+#: Shell.qml:438
253#, qt-format
221#, qt-format
254msgid "Please enter %1"
222msgid "Please enter %1"
255−msgstr ""
223+msgstr "Bitte geben Sie %1 ein"
224+
225+#~ msgid "Featured"
226+#~ msgstr "Empfehlungen"
227+
228+#~ msgid "Recent"
229+#~ msgstr "Zuletzt verwendet"
230+
231+#~ msgid "New Releases"
232+#~ msgstr "Neue Veröffentlichungen"
233+
234+#~ msgid "Top Charting"
235+#~ msgstr "Top Tabellenplatz"
236+
237+#~ msgid "Music"
238+#~ msgstr "Musik"
239+
240+#~ msgid "Popular Online"
241+#~ msgstr "Online Beliebt"
242+
243+#~ msgid "Videos"
244+#~ msgstr "Videos"
po/el.po+40−66
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11"PO-Revision-Date: 2013-06-27 00:53+0000\n"
11"PO-Revision-Date: 2013-06-27 00:53+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Greek <el@li.org>\n"
13"Language-Team: Greek <el@li.org>\n"
@@ -15,8 +15,8 @@ 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: 2013-08-30 05:37+0000\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
19+"X-Generator: Launchpad (build 16799)\n"
20
20
21#: Applications/applications.js:23
21#: Applications/applications.js:23
22msgid "Phone"
22msgid "Phone"
@@ -86,129 +86,93 @@ msgstr ""
86msgid "YouTube"
86msgid "YouTube"
87msgstr ""
87msgstr ""
88
88
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
90msgid "Skip intro"
90msgid "Skip intro"
91msgstr ""
91msgstr ""
92
92
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
94msgid "Right edge"
94msgid "Right edge"
95msgstr ""
95msgstr ""
96
96
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
98msgid "Try swiping from the right edge to unlock the phone"
98msgid "Try swiping from the right edge to unlock the phone"
99msgstr ""
99msgstr ""
100
100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102msgid "Top edge"
102msgid "Top edge"
103msgstr ""
103msgstr ""
104
104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106msgid "Try swiping from the top edge to access the indicators"
106msgid "Try swiping from the top edge to access the indicators"
107msgstr ""
107msgstr ""
108
108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110msgid "Close"
110msgid "Close"
111msgstr ""
111msgstr ""
112
112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114msgid "Swipe up again to close the settings screen"
114msgid "Swipe up again to close the settings screen"
115msgstr ""
115msgstr ""
116
116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118msgid "Left edge"
118msgid "Left edge"
119msgstr ""
119msgstr ""
120
120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123msgstr ""
123msgstr ""
124
124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126msgid "Well done"
126msgid "Well done"
127msgstr ""
127msgstr ""
128
128
129−#: Components/EdgeDemo.qml:218
129+#: Components/EdgeDemo.qml:227
130+msgid ""
130−msgid "You have now mastered the edge gestures and can start using the phone"
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131msgstr ""
133msgstr ""
132
134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134msgid "Recent searches"
136msgid "Recent searches"
135msgstr "Πρόσφατες αναζητήσεις"
137msgstr "Πρόσφατες αναζητήσεις"
136
138
137#. TRANSLATORS: Number of persons who rated this app
139#. TRANSLATORS: Number of persons who rated this app
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
138−#: Dash/Apps/AppInfo.qml:73
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139#, qt-format
142#, qt-format
140msgid "(%1)"
143msgid "(%1)"
141msgstr ""
144msgstr ""
142
145
143#. TRANSLATORS: Number of persons who wrote reviews for this app
146#. TRANSLATORS: Number of persons who wrote reviews for this app
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
144−#: Dash/Apps/AppInfo.qml:85
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145#, qt-format
149#, qt-format
146msgid "%1 review"
150msgid "%1 review"
147msgid_plural "%1 reviews"
151msgid_plural "%1 reviews"
148msgstr[0] ""
152msgstr[0] ""
149msgstr[1] ""
153msgstr[1] ""
150
154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152msgid "Rate this"
156msgid "Rate this"
153msgstr ""
157msgstr ""
154
158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156msgid "Add a review"
160msgid "Add a review"
157msgstr ""
161msgstr ""
158
162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160msgid "Review"
164msgid "Review"
161msgstr ""
165msgstr ""
162
166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164msgid "Send"
168msgid "Send"
165msgstr ""
169msgstr ""
166
170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168msgid "Comments:"
172msgid "Comments:"
169msgstr ""
173msgstr ""
170
174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Μουσική"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Βίντεο"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212msgid "Emergency Call"
176msgid "Emergency Call"
213msgstr ""
177msgstr ""
214
178
@@ -245,11 +209,21 @@ msgstr "Ομιλία..."
245msgid "Search"
209msgid "Search"
246msgstr "Αναζήτηση"
210msgstr "Αναζήτηση"
247
211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249msgid "Sorry, there is nothing that matches your search."
213msgid "Sorry, there is nothing that matches your search."
250msgstr "Λυπούμαστε, δεν υπάρχει τίποτα που να ταιριάζει στην αναζήτησή σας."
214msgstr "Λυπούμαστε, δεν υπάρχει τίποτα που να ταιριάζει στην αναζήτησή σας."
251
215
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
252−#: Shell.qml:429
220+#: Shell.qml:438
253#, qt-format
221#, qt-format
254msgid "Please enter %1"
222msgid "Please enter %1"
255msgstr ""
223msgstr ""
224+
225+#~ msgid "Music"
226+#~ msgstr "Μουσική"
227+
228+#~ msgid "Videos"
229+#~ msgstr "Βίντεο"
po/en_AU.po+79−90
@@ -7,16 +7,16 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11−"PO-Revision-Date: 2013-06-27 01:13+0000\n"
11+"PO-Revision-Date: 2013-09-28 07:46+0000\n"
12−"Last-Translator: Jackson Doak <Doak.jackson@gmail.com>\n"
12+"Last-Translator: Jared Norris <jarednorris@ubuntu.com>\n"
13"Language-Team: English (Australia) <en_AU@li.org>\n"
13"Language-Team: English (Australia) <en_AU@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: 2013-08-30 05:37+0000\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
19+"X-Generator: Launchpad (build 16799)\n"
20
20
21#: Applications/applications.js:23
21#: Applications/applications.js:23
22msgid "Phone"
22msgid "Phone"
@@ -86,140 +86,104 @@ msgstr "Wikipedia"
86msgid "YouTube"
86msgid "YouTube"
87msgstr "YouTube"
87msgstr "YouTube"
88
88
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
90msgid "Skip intro"
90msgid "Skip intro"
91−msgstr ""
91+msgstr "Skip intro"
92
92
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
94msgid "Right edge"
94msgid "Right edge"
95−msgstr ""
95+msgstr "Right edge"
96
96
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
98msgid "Try swiping from the right edge to unlock the phone"
98msgid "Try swiping from the right edge to unlock the phone"
99−msgstr ""
99+msgstr "Try swiping from the right edge to unlock the phone"
100
100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102msgid "Top edge"
102msgid "Top edge"
103−msgstr ""
103+msgstr "Top edge"
104
104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106msgid "Try swiping from the top edge to access the indicators"
106msgid "Try swiping from the top edge to access the indicators"
107−msgstr ""
107+msgstr "Try swiping from the top edge to access the indicators"
108
108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110msgid "Close"
110msgid "Close"
111−msgstr ""
111+msgstr "Close"
112
112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114msgid "Swipe up again to close the settings screen"
114msgid "Swipe up again to close the settings screen"
115−msgstr ""
115+msgstr "Swipe up again to close the settings screen"
116
116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118msgid "Left edge"
118msgid "Left edge"
119−msgstr ""
119+msgstr "Left edge"
120
120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123−msgstr ""
123+msgstr "Swipe from the left to reveal the launcher for quick access to apps"
124
124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126msgid "Well done"
126msgid "Well done"
127−msgstr ""
127+msgstr "Well done"
128
128
129−#: Components/EdgeDemo.qml:218
129+#: Components/EdgeDemo.qml:227
130+msgid ""
130−msgid "You have now mastered the edge gestures and can start using the phone"
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131msgstr ""
133msgstr ""
132
134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134msgid "Recent searches"
136msgid "Recent searches"
135msgstr "Recent searches"
137msgstr "Recent searches"
136
138
137#. TRANSLATORS: Number of persons who rated this app
139#. TRANSLATORS: Number of persons who rated this app
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
138−#: Dash/Apps/AppInfo.qml:73
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139#, qt-format
142#, qt-format
140msgid "(%1)"
143msgid "(%1)"
141−msgstr ""
144+msgstr "(%1)"
142
145
143#. TRANSLATORS: Number of persons who wrote reviews for this app
146#. TRANSLATORS: Number of persons who wrote reviews for this app
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
144−#: Dash/Apps/AppInfo.qml:85
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145#, qt-format
149#, qt-format
146msgid "%1 review"
150msgid "%1 review"
147msgid_plural "%1 reviews"
151msgid_plural "%1 reviews"
148−msgstr[0] ""
152+msgstr[0] "%1 review"
149−msgstr[1] ""
153+msgstr[1] "%1 reviews"
150
154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152msgid "Rate this"
156msgid "Rate this"
153−msgstr ""
157+msgstr "Rate this"
154
158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156msgid "Add a review"
160msgid "Add a review"
157−msgstr ""
161+msgstr "Add a review"
158
162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160msgid "Review"
164msgid "Review"
161−msgstr ""
165+msgstr "Review"
162
166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164msgid "Send"
168msgid "Send"
165−msgstr ""
169+msgstr "Send"
166
170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168msgid "Comments:"
172msgid "Comments:"
169−msgstr ""
173+msgstr "Comments:"
170−
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr "Featured"
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr "Recent"
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr "New Releases"
182
174
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr "Top Charting"
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Music"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr "Popular Online"
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Videos"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr "Directed by:"
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr "Starring:"
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr "Author:"
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212msgid "Emergency Call"
176msgid "Emergency Call"
213−msgstr ""
177+msgstr "Emergency Call"
214
178
215#: Greeter/PassphraseLockscreen.qml:59
179#: Greeter/PassphraseLockscreen.qml:59
216#, qt-format
180#, qt-format
217msgid "Hello %1"
181msgid "Hello %1"
218−msgstr ""
182+msgstr "Hello %1"
219
183
220#: Greeter/PassphraseLockscreen.qml:59
184#: Greeter/PassphraseLockscreen.qml:59
221msgid "Hello"
185msgid "Hello"
222−msgstr ""
186+msgstr "Hello"
223
187
224#: Hud/HudParametrizedActionsPage.qml:132
188#: Hud/HudParametrizedActionsPage.qml:132
225msgid "Confirm"
189msgid "Confirm"
@@ -245,11 +209,36 @@ msgstr "Speaking..."
245msgid "Search"
209msgid "Search"
246msgstr "Search"
210msgstr "Search"
247
211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249msgid "Sorry, there is nothing that matches your search."
213msgid "Sorry, there is nothing that matches your search."
250msgstr "Sorry, there is nothing that matches your search."
214msgstr "Sorry, there is nothing that matches your search."
251
215
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
252−#: Shell.qml:429
220+#: Shell.qml:438
253#, qt-format
221#, qt-format
254msgid "Please enter %1"
222msgid "Please enter %1"
255−msgstr ""
223+msgstr "Please enter %1"
224+
225+#~ msgid "Featured"
226+#~ msgstr "Featured"
227+
228+#~ msgid "Recent"
229+#~ msgstr "Recent"
230+
231+#~ msgid "New Releases"
232+#~ msgstr "New Releases"
233+
234+#~ msgid "Top Charting"
235+#~ msgstr "Top Charting"
236+
237+#~ msgid "Music"
238+#~ msgstr "Music"
239+
240+#~ msgid "Popular Online"
241+#~ msgstr "Popular Online"
242+
243+#~ msgid "Videos"
244+#~ msgstr "Videos"
po/en_GB.po+55−66
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11"PO-Revision-Date: 2013-06-27 08:53+0000\n"
11"PO-Revision-Date: 2013-06-27 08:53+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
13"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
@@ -15,8 +15,8 @@ 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: 2013-08-30 05:37+0000\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
19+"X-Generator: Launchpad (build 16799)\n"
20
20
21#: Applications/applications.js:23
21#: Applications/applications.js:23
22msgid "Phone"
22msgid "Phone"
@@ -86,129 +86,93 @@ msgstr "Wikipedia"
86msgid "YouTube"
86msgid "YouTube"
87msgstr "YouTube"
87msgstr "YouTube"
88
88
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
90msgid "Skip intro"
90msgid "Skip intro"
91msgstr ""
91msgstr ""
92
92
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
94msgid "Right edge"
94msgid "Right edge"
95msgstr ""
95msgstr ""
96
96
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
98msgid "Try swiping from the right edge to unlock the phone"
98msgid "Try swiping from the right edge to unlock the phone"
99msgstr ""
99msgstr ""
100
100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102msgid "Top edge"
102msgid "Top edge"
103msgstr ""
103msgstr ""
104
104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106msgid "Try swiping from the top edge to access the indicators"
106msgid "Try swiping from the top edge to access the indicators"
107msgstr ""
107msgstr ""
108
108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110msgid "Close"
110msgid "Close"
111msgstr ""
111msgstr ""
112
112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114msgid "Swipe up again to close the settings screen"
114msgid "Swipe up again to close the settings screen"
115msgstr ""
115msgstr ""
116
116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118msgid "Left edge"
118msgid "Left edge"
119msgstr ""
119msgstr ""
120
120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123msgstr ""
123msgstr ""
124
124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126msgid "Well done"
126msgid "Well done"
127msgstr ""
127msgstr ""
128
128
129−#: Components/EdgeDemo.qml:218
129+#: Components/EdgeDemo.qml:227
130+msgid ""
130−msgid "You have now mastered the edge gestures and can start using the phone"
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131msgstr ""
133msgstr ""
132
134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134msgid "Recent searches"
136msgid "Recent searches"
135msgstr "Recent searches"
137msgstr "Recent searches"
136
138
137#. TRANSLATORS: Number of persons who rated this app
139#. TRANSLATORS: Number of persons who rated this app
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
138−#: Dash/Apps/AppInfo.qml:73
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139#, qt-format
142#, qt-format
140msgid "(%1)"
143msgid "(%1)"
141msgstr ""
144msgstr ""
142
145
143#. TRANSLATORS: Number of persons who wrote reviews for this app
146#. TRANSLATORS: Number of persons who wrote reviews for this app
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
144−#: Dash/Apps/AppInfo.qml:85
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145#, qt-format
149#, qt-format
146msgid "%1 review"
150msgid "%1 review"
147msgid_plural "%1 reviews"
151msgid_plural "%1 reviews"
148msgstr[0] ""
152msgstr[0] ""
149msgstr[1] ""
153msgstr[1] ""
150
154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152msgid "Rate this"
156msgid "Rate this"
153msgstr ""
157msgstr ""
154
158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156msgid "Add a review"
160msgid "Add a review"
157msgstr ""
161msgstr ""
158
162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160msgid "Review"
164msgid "Review"
161msgstr ""
165msgstr ""
162
166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164msgid "Send"
168msgid "Send"
165msgstr ""
169msgstr ""
166
170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168msgid "Comments:"
172msgid "Comments:"
169msgstr ""
173msgstr ""
170
174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr "Featured"
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr "Recent"
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr "New Releases"
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr "Top Charting"
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Music"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr "Popular Online"
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Videos"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr "Directed by:"
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr "Starring:"
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr "Author:"
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212msgid "Emergency Call"
176msgid "Emergency Call"
213msgstr ""
177msgstr ""
214
178
@@ -245,11 +209,36 @@ msgstr "Speaking..."
245msgid "Search"
209msgid "Search"
246msgstr "Search"
210msgstr "Search"
247
211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249msgid "Sorry, there is nothing that matches your search."
213msgid "Sorry, there is nothing that matches your search."
250msgstr "Sorry, there is nothing that matches your search."
214msgstr "Sorry, there is nothing that matches your search."
251
215
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
252−#: Shell.qml:429
220+#: Shell.qml:438
253#, qt-format
221#, qt-format
254msgid "Please enter %1"
222msgid "Please enter %1"
255msgstr "Please enter %1"
223msgstr "Please enter %1"
224+
225+#~ msgid "Featured"
226+#~ msgstr "Featured"
227+
228+#~ msgid "Recent"
229+#~ msgstr "Recent"
230+
231+#~ msgid "New Releases"
232+#~ msgstr "New Releases"
233+
234+#~ msgid "Top Charting"
235+#~ msgstr "Top Charting"
236+
237+#~ msgid "Music"
238+#~ msgstr "Music"
239+
240+#~ msgid "Popular Online"
241+#~ msgstr "Popular Online"
242+
243+#~ msgid "Videos"
244+#~ msgstr "Videos"
po/eo.po+34−66
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11"PO-Revision-Date: 2013-06-26 22:35+0000\n"
11"PO-Revision-Date: 2013-06-26 22:35+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Esperanto <eo@li.org>\n"
13"Language-Team: Esperanto <eo@li.org>\n"
@@ -15,8 +15,8 @@ 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: 2013-08-30 05:37+0000\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
19+"X-Generator: Launchpad (build 16799)\n"
20
20
21#: Applications/applications.js:23
21#: Applications/applications.js:23
22msgid "Phone"
22msgid "Phone"
@@ -86,129 +86,93 @@ msgstr ""
86msgid "YouTube"
86msgid "YouTube"
87msgstr ""
87msgstr ""
88
88
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
90msgid "Skip intro"
90msgid "Skip intro"
91msgstr ""
91msgstr ""
92
92
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
94msgid "Right edge"
94msgid "Right edge"
95msgstr ""
95msgstr ""
96
96
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
98msgid "Try swiping from the right edge to unlock the phone"
98msgid "Try swiping from the right edge to unlock the phone"
99msgstr ""
99msgstr ""
100
100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102msgid "Top edge"
102msgid "Top edge"
103msgstr ""
103msgstr ""
104
104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106msgid "Try swiping from the top edge to access the indicators"
106msgid "Try swiping from the top edge to access the indicators"
107msgstr ""
107msgstr ""
108
108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110msgid "Close"
110msgid "Close"
111msgstr ""
111msgstr ""
112
112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114msgid "Swipe up again to close the settings screen"
114msgid "Swipe up again to close the settings screen"
115msgstr ""
115msgstr ""
116
116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118msgid "Left edge"
118msgid "Left edge"
119msgstr ""
119msgstr ""
120
120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123msgstr ""
123msgstr ""
124
124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126msgid "Well done"
126msgid "Well done"
127msgstr ""
127msgstr ""
128
128
129−#: Components/EdgeDemo.qml:218
129+#: Components/EdgeDemo.qml:227
130+msgid ""
130−msgid "You have now mastered the edge gestures and can start using the phone"
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131msgstr ""
133msgstr ""
132
134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134msgid "Recent searches"
136msgid "Recent searches"
135msgstr ""
137msgstr ""
136
138
137#. TRANSLATORS: Number of persons who rated this app
139#. TRANSLATORS: Number of persons who rated this app
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
138−#: Dash/Apps/AppInfo.qml:73
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139#, qt-format
142#, qt-format
140msgid "(%1)"
143msgid "(%1)"
141msgstr ""
144msgstr ""
142
145
143#. TRANSLATORS: Number of persons who wrote reviews for this app
146#. TRANSLATORS: Number of persons who wrote reviews for this app
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
144−#: Dash/Apps/AppInfo.qml:85
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145#, qt-format
149#, qt-format
146msgid "%1 review"
150msgid "%1 review"
147msgid_plural "%1 reviews"
151msgid_plural "%1 reviews"
148msgstr[0] ""
152msgstr[0] ""
149msgstr[1] ""
153msgstr[1] ""
150
154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152msgid "Rate this"
156msgid "Rate this"
153msgstr ""
157msgstr ""
154
158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156msgid "Add a review"
160msgid "Add a review"
157msgstr ""
161msgstr ""
158
162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160msgid "Review"
164msgid "Review"
161msgstr ""
165msgstr ""
162
166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164msgid "Send"
168msgid "Send"
165msgstr ""
169msgstr ""
166
170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168msgid "Comments:"
172msgid "Comments:"
169msgstr ""
173msgstr ""
170
174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr ""
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr ""
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212msgid "Emergency Call"
176msgid "Emergency Call"
213msgstr ""
177msgstr ""
214
178
@@ -245,11 +209,15 @@ msgstr ""
245msgid "Search"
209msgid "Search"
246msgstr ""
210msgstr ""
247
211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249msgid "Sorry, there is nothing that matches your search."
213msgid "Sorry, there is nothing that matches your search."
250msgstr ""
214msgstr ""
251
215
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
252−#: Shell.qml:429
220+#: Shell.qml:438
253#, qt-format
221#, qt-format
254msgid "Please enter %1"
222msgid "Please enter %1"
255msgstr ""
223msgstr ""
po/es.po+60−69
@@ -7,16 +7,16 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11−"PO-Revision-Date: 2013-09-04 22:12+0000\n"
11+"PO-Revision-Date: 2013-10-02 04:59+0000\n"
12"Last-Translator: Adolfo Jayme Barrientos <fitoschido@gmail.com>\n"
12"Last-Translator: Adolfo Jayme Barrientos <fitoschido@gmail.com>\n"
13"Language-Team: Spanish <es@li.org>\n"
13"Language-Team: Spanish <es@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: 2013-09-05 05:35+0000\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19−"X-Generator: Launchpad (build 16758)\n"
19+"X-Generator: Launchpad (build 16799)\n"
20
20
21#: Applications/applications.js:23
21#: Applications/applications.js:23
22msgid "Phone"
22msgid "Phone"
@@ -48,7 +48,7 @@ msgstr "GMail"
48
48
49#: Applications/applications.js:62
49#: Applications/applications.js:62
50msgid "Weather"
50msgid "Weather"
51−msgstr "Metereología"
51+msgstr "Meteorología"
52
52
53#: Applications/applications.js:68
53#: Applications/applications.js:68
54msgid "Notepad"
54msgid "Notepad"
@@ -86,131 +86,97 @@ msgstr "Wikipedia"
86msgid "YouTube"
86msgid "YouTube"
87msgstr "YouTube"
87msgstr "YouTube"
88
88
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
90msgid "Skip intro"
90msgid "Skip intro"
91msgstr "Omitir la introducción"
91msgstr "Omitir la introducción"
92
92
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
94msgid "Right edge"
94msgid "Right edge"
95msgstr "Borde derecho"
95msgstr "Borde derecho"
96
96
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
98msgid "Try swiping from the right edge to unlock the phone"
98msgid "Try swiping from the right edge to unlock the phone"
99msgstr "Deslice el dedo desde el borde derecho para desbloquear el teléfono"
99msgstr "Deslice el dedo desde el borde derecho para desbloquear el teléfono"
100
100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102msgid "Top edge"
102msgid "Top edge"
103msgstr "Borde superior"
103msgstr "Borde superior"
104
104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106msgid "Try swiping from the top edge to access the indicators"
106msgid "Try swiping from the top edge to access the indicators"
107msgstr "Deslice el dedo desde el borde superior para acceder a los menús"
107msgstr "Deslice el dedo desde el borde superior para acceder a los menús"
108
108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110msgid "Close"
110msgid "Close"
111msgstr "Cerrar"
111msgstr "Cerrar"
112
112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114msgid "Swipe up again to close the settings screen"
114msgid "Swipe up again to close the settings screen"
115msgstr "Deslice hacia arriba para cerrar la pantalla de configuración"
115msgstr "Deslice hacia arriba para cerrar la pantalla de configuración"
116
116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118msgid "Left edge"
118msgid "Left edge"
119msgstr "Borde izquierdo"
119msgstr "Borde izquierdo"
120
120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123msgstr ""
123msgstr ""
124"Deslice el dedo desde la izquierda para mostrar el lanzador y acceder "
124"Deslice el dedo desde la izquierda para mostrar el lanzador y acceder "
125"rápidamente a las aplicaciones"
125"rápidamente a las aplicaciones"
126
126
127−#: Components/EdgeDemo.qml:217
127+#: Components/EdgeDemo.qml:226
128msgid "Well done"
128msgid "Well done"
129msgstr "Bien hecho"
129msgstr "Bien hecho"
130
130
131−#: Components/EdgeDemo.qml:218
131+#: Components/EdgeDemo.qml:227
132+msgid ""
132−msgid "You have now mastered the edge gestures and can start using the phone"
133+"You have now mastered the edge gestures and can start using the "
134+"phone<br><br>Tap anywhere to start"
135+msgstr ""
133−msgstr "Ahora domina el uso de gestos de los bordes. Puede usar el teléfono"
136+"Ahora domina los gestos de bordes y puede usar el teléfono<br><br>Toque la "
137+"pantalla para comenzar"
134
138
135−#: Components/PageHeader.qml:298
139+#: Components/PageHeader.qml:341
136msgid "Recent searches"
140msgid "Recent searches"
137msgstr "Búsquedas recientes"
141msgstr "Búsquedas recientes"
138
142
139#. TRANSLATORS: Number of persons who rated this app
143#. TRANSLATORS: Number of persons who rated this app
144+#. TRANSLATORS: Number of persons who rated this app/video/whatever
140−#: Dash/Apps/AppInfo.qml:73
145+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
141#, qt-format
146#, qt-format
142msgid "(%1)"
147msgid "(%1)"
143msgstr "(%1)"
148msgstr "(%1)"
144
149
145#. TRANSLATORS: Number of persons who wrote reviews for this app
150#. TRANSLATORS: Number of persons who wrote reviews for this app
151+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
146−#: Dash/Apps/AppInfo.qml:85
152+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
147#, qt-format
153#, qt-format
148msgid "%1 review"
154msgid "%1 review"
149msgid_plural "%1 reviews"
155msgid_plural "%1 reviews"
150msgstr[0] "%1 reseña"
156msgstr[0] "%1 reseña"
151msgstr[1] "%1 reseñas"
157msgstr[1] "%1 reseñas"
152
158
153−#: Dash/Apps/AppPreview.qml:175
159+#: Dash/Apps/AppPreview.qml:126
154msgid "Rate this"
160msgid "Rate this"
155msgstr "Valorar esto"
161msgstr "Valorar esto"
156
162
157−#: Dash/Apps/AppReviews.qml:72
163+#: Dash/Previews/Reviews.qml:74
158msgid "Add a review"
164msgid "Add a review"
159msgstr "Añadir una reseña"
165msgstr "Añadir una reseña"
160
166
161−#: Dash/Apps/AppReviews.qml:84
167+#: Dash/Previews/Reviews.qml:86
162msgid "Review"
168msgid "Review"
163msgstr "Reseñar"
169msgstr "Reseñar"
164
170
165−#: Dash/Apps/AppReviews.qml:118
171+#: Dash/Previews/Reviews.qml:121
166msgid "Send"
172msgid "Send"
167msgstr "Enviar"
173msgstr "Enviar"
168
174
169−#: Dash/Apps/AppReviews.qml:136
175+#: Dash/Previews/Reviews.qml:139
170msgid "Comments:"
176msgid "Comments:"
171msgstr "Comentarios:"
177msgstr "Comentarios:"
172
178
173−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
174−msgid "Featured"
175−msgstr "Destacados"
176−
177−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
178−msgid "Recent"
179−msgstr "Recientes"
180−
181−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
182−msgid "New Releases"
183−msgstr "Lanzamientos nuevos"
184−
185−#: Dash/DashMusic.qml:30
186−msgid "Top Charting"
187−msgstr "Mejor posicionadas"
188−
189−#: Dash/DashMusic.qml:91
190−msgid "Music"
191−msgstr "Música"
192−
193−#: Dash/DashVideos.qml:31
194−msgid "Popular Online"
195−msgstr "Populares en línea"
196−
197−#: Dash/DashVideos.qml:146
198−msgid "Videos"
199−msgstr "Vídeos"
200−
201−#: Dash/Video/VideoPreview.qml:130
202−msgid "Directed by:"
203−msgstr "Dirigida por:"
204−
205−#: Dash/Video/VideoPreview.qml:153
206−msgid "Starring:"
207−msgstr "Protagonistas:"
208−
209−#: Dash/Video/VideoPreview.qml:176
210−msgid "Author:"
211−msgstr "Autor:"
212−
213−#: Greeter/Lockscreen.qml:134
179+#: Greeter/Lockscreen.qml:142
214msgid "Emergency Call"
180msgid "Emergency Call"
215msgstr "Llamada de emergencia"
181msgstr "Llamada de emergencia"
216
182
@@ -247,11 +213,36 @@ msgstr "Hablando…"
247msgid "Search"
213msgid "Search"
248msgstr "Buscar"
214msgstr "Buscar"
249
215
250−#: plugins/Unity/scope.cpp:317
216+#: plugins/Unity/scope.cpp:398
251msgid "Sorry, there is nothing that matches your search."
217msgid "Sorry, there is nothing that matches your search."
252msgstr "No hay nada que coincida con su búsqueda."
218msgstr "No hay nada que coincida con su búsqueda."
253
219
220+#: plugins/Unity/showallfilteroption.cpp:41
221+msgid "All"
222+msgstr "Todo"
223+
254−#: Shell.qml:429
224+#: Shell.qml:438
255#, qt-format
225#, qt-format
256msgid "Please enter %1"
226msgid "Please enter %1"
257msgstr "Introduzca %1"
227msgstr "Introduzca %1"
228+
229+#~ msgid "Featured"
230+#~ msgstr "Destacados"
231+
232+#~ msgid "Recent"
233+#~ msgstr "Recientes"
234+
235+#~ msgid "New Releases"
236+#~ msgstr "Lanzamientos nuevos"
237+
238+#~ msgid "Top Charting"
239+#~ msgstr "Mejor posicionadas"
240+
241+#~ msgid "Music"
242+#~ msgstr "Música"
243+
244+#~ msgid "Popular Online"
245+#~ msgstr "Populares en línea"
246+
247+#~ msgid "Videos"
248+#~ msgstr "Vídeos"
po/fi.po+69−78
@@ -7,16 +7,16 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11−"PO-Revision-Date: 2013-08-23 16:15+0000\n"
11+"PO-Revision-Date: 2013-10-03 09:21+0000\n"
12−"Last-Translator: Timo Jyrinki <timo.jyrinki@canonical.com>\n"
12+"Last-Translator: Jiri Grönroos <Unknown>\n"
13"Language-Team: Finnish <fi@li.org>\n"
13"Language-Team: Finnish <fi@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: 2013-08-30 05:37+0000\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
19+"X-Generator: Launchpad (build 16799)\n"
20
20
21#: Applications/applications.js:23
21#: Applications/applications.js:23
22msgid "Phone"
22msgid "Phone"
@@ -86,129 +86,95 @@ msgstr "Wikipedia"
86msgid "YouTube"
86msgid "YouTube"
87msgstr "YouTube"
87msgstr "YouTube"
88
88
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
90msgid "Skip intro"
90msgid "Skip intro"
91−msgstr ""
91+msgstr "Ohita esittely"
92
92
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
94msgid "Right edge"
94msgid "Right edge"
95−msgstr ""
95+msgstr "Oikea reuna"
96
96
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
98msgid "Try swiping from the right edge to unlock the phone"
98msgid "Try swiping from the right edge to unlock the phone"
99−msgstr ""
99+msgstr "Vedä oikealta avataksesi puhelimen lukituksen"
100
100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102msgid "Top edge"
102msgid "Top edge"
103−msgstr ""
103+msgstr "Yläreuna"
104
104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106msgid "Try swiping from the top edge to access the indicators"
106msgid "Try swiping from the top edge to access the indicators"
107−msgstr ""
107+msgstr "Vedä yläreunasta käyttääksesi ilmaisimia"
108
108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110msgid "Close"
110msgid "Close"
111−msgstr ""
111+msgstr "Sulje"
112
112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114msgid "Swipe up again to close the settings screen"
114msgid "Swipe up again to close the settings screen"
115−msgstr ""
115+msgstr "Vedä uudestaan sulkeaksesi asetusnäkymän"
116
116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118msgid "Left edge"
118msgid "Left edge"
119−msgstr ""
119+msgstr "Vasen reuna"
120
120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123−msgstr ""
123+msgstr "Vedä vasemmalta saattaaksesi sovellusten käynnistimen esiin"
124
124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126msgid "Well done"
126msgid "Well done"
127−msgstr ""
127+msgstr "Hyvin tehty"
128
128
129−#: Components/EdgeDemo.qml:218
129+#: Components/EdgeDemo.qml:227
130+msgid ""
130−msgid "You have now mastered the edge gestures and can start using the phone"
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131msgstr ""
133msgstr ""
134+"Hallitset nyt reunaeleet, joten voit aloittaa puhelimen "
135+"käytön<br><br>Napauta missä tahansa aloittaaksesi"
132
136
133−#: Components/PageHeader.qml:298
137+#: Components/PageHeader.qml:341
134msgid "Recent searches"
138msgid "Recent searches"
135msgstr "Viimeisimmät haut"
139msgstr "Viimeisimmät haut"
136
140
137#. TRANSLATORS: Number of persons who rated this app
141#. TRANSLATORS: Number of persons who rated this app
142+#. TRANSLATORS: Number of persons who rated this app/video/whatever
138−#: Dash/Apps/AppInfo.qml:73
143+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139#, qt-format
144#, qt-format
140msgid "(%1)"
145msgid "(%1)"
141msgstr "(%1)"
146msgstr "(%1)"
142
147
143#. TRANSLATORS: Number of persons who wrote reviews for this app
148#. TRANSLATORS: Number of persons who wrote reviews for this app
149+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
144−#: Dash/Apps/AppInfo.qml:85
150+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145#, qt-format
151#, qt-format
146msgid "%1 review"
152msgid "%1 review"
147msgid_plural "%1 reviews"
153msgid_plural "%1 reviews"
148msgstr[0] "%1 arvostelu"
154msgstr[0] "%1 arvostelu"
149msgstr[1] "%1 arvostelua"
155msgstr[1] "%1 arvostelua"
150
156
151−#: Dash/Apps/AppPreview.qml:175
157+#: Dash/Apps/AppPreview.qml:126
152msgid "Rate this"
158msgid "Rate this"
153msgstr "Arvioi tämä"
159msgstr "Arvioi tämä"
154
160
155−#: Dash/Apps/AppReviews.qml:72
161+#: Dash/Previews/Reviews.qml:74
156msgid "Add a review"
162msgid "Add a review"
157msgstr "Lisää arvostelu"
163msgstr "Lisää arvostelu"
158
164
159−#: Dash/Apps/AppReviews.qml:84
165+#: Dash/Previews/Reviews.qml:86
160msgid "Review"
166msgid "Review"
161msgstr "Arvostelu"
167msgstr "Arvostelu"
162
168
163−#: Dash/Apps/AppReviews.qml:118
169+#: Dash/Previews/Reviews.qml:121
164msgid "Send"
170msgid "Send"
165msgstr "Lähetä"
171msgstr "Lähetä"
166
172
167−#: Dash/Apps/AppReviews.qml:136
173+#: Dash/Previews/Reviews.qml:139
168msgid "Comments:"
174msgid "Comments:"
169msgstr "Kommentit:"
175msgstr "Kommentit:"
170
176
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr "Suositellut"
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr "Viimeisimmät"
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr "Uudet julkaisut"
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr "Nousukiidossa"
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Musiikki"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr "Suosittua verkossa"
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Videot"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr "Ohjannut:"
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr "Pääosissa:"
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr "Tekijä:"
210−
211−#: Greeter/Lockscreen.qml:134
177+#: Greeter/Lockscreen.qml:142
212msgid "Emergency Call"
178msgid "Emergency Call"
213msgstr "Hätäpuhelu"
179msgstr "Hätäpuhelu"
214
180
@@ -245,11 +211,36 @@ msgstr "Puhutaan..."
245msgid "Search"
211msgid "Search"
246msgstr "Hae"
212msgstr "Hae"
247
213
248−#: plugins/Unity/scope.cpp:317
214+#: plugins/Unity/scope.cpp:398
249msgid "Sorry, there is nothing that matches your search."
215msgid "Sorry, there is nothing that matches your search."
250msgstr "Hakuun täsmääviä tuloksia ei löydy."
216msgstr "Hakuun täsmääviä tuloksia ei löydy."
251
217
218+#: plugins/Unity/showallfilteroption.cpp:41
219+msgid "All"
220+msgstr "Kaikki"
221+
252−#: Shell.qml:429
222+#: Shell.qml:438
253#, qt-format
223#, qt-format
254msgid "Please enter %1"
224msgid "Please enter %1"
255msgstr "Kirjoita %1"
225msgstr "Kirjoita %1"
226+
227+#~ msgid "Featured"
228+#~ msgstr "Suositellut"
229+
230+#~ msgid "Recent"
231+#~ msgstr "Viimeisimmät"
232+
233+#~ msgid "New Releases"
234+#~ msgstr "Uudet julkaisut"
235+
236+#~ msgid "Top Charting"
237+#~ msgstr "Nousukiidossa"
238+
239+#~ msgid "Music"
240+#~ msgstr "Musiikki"
241+
242+#~ msgid "Popular Online"
243+#~ msgstr "Suosittua verkossa"
244+
245+#~ msgid "Videos"
246+#~ msgstr "Videot"
po/fo.po+52−78
@@ -7,56 +7,56 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11−"PO-Revision-Date: 2013-06-27 02:57+0000\n"
11+"PO-Revision-Date: 2013-10-01 15:13+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12+"Last-Translator: Jógvan Olsen <jeggy@jebster.net>\n"
13"Language-Team: Faroese <fo@li.org>\n"
13"Language-Team: Faroese <fo@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: 2013-08-30 05:37+0000\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
19+"X-Generator: Launchpad (build 16799)\n"
20
20
21#: Applications/applications.js:23
21#: Applications/applications.js:23
22msgid "Phone"
22msgid "Phone"
23−msgstr ""
23+msgstr "Fartelefon"
24
24
25#: Applications/applications.js:29
25#: Applications/applications.js:29
26msgid "Camera"
26msgid "Camera"
27−msgstr ""
27+msgstr "Myndatól"
28
28
29#: Applications/applications.js:35
29#: Applications/applications.js:35
30msgid "Gallery"
30msgid "Gallery"
31−msgstr ""
31+msgstr "Myndasavn"
32
32
33#: Applications/applications.js:40
33#: Applications/applications.js:40
34msgid "Facebook"
34msgid "Facebook"
35−msgstr ""
35+msgstr "Facebook"
36
36
37#: Applications/applications.js:46
37#: Applications/applications.js:46
38msgid "Browser"
38msgid "Browser"
39−msgstr ""
39+msgstr "Kagi"
40
40
41#: Applications/applications.js:51
41#: Applications/applications.js:51
42msgid "Twitter"
42msgid "Twitter"
43−msgstr ""
43+msgstr "Twitter"
44
44
45#: Applications/applications.js:57
45#: Applications/applications.js:57
46msgid "GMail"
46msgid "GMail"
47−msgstr ""
47+msgstr "GMail"
48
48
49#: Applications/applications.js:62
49#: Applications/applications.js:62
50msgid "Weather"
50msgid "Weather"
51−msgstr ""
51+msgstr "Veðrið"
52
52
53#: Applications/applications.js:68
53#: Applications/applications.js:68
54msgid "Notepad"
54msgid "Notepad"
55−msgstr ""
55+msgstr "Skriviblokkur"
56
56
57#: Applications/applications.js:74
57#: Applications/applications.js:74
58msgid "Calendar"
58msgid "Calendar"
59−msgstr ""
59+msgstr "Kalendari"
60
60
61#: Applications/applications.js:80
61#: Applications/applications.js:80
62msgid "Media Player"
62msgid "Media Player"
@@ -86,129 +86,93 @@ msgstr ""
86msgid "YouTube"
86msgid "YouTube"
87msgstr ""
87msgstr ""
88
88
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
90msgid "Skip intro"
90msgid "Skip intro"
91msgstr ""
91msgstr ""
92
92
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
94msgid "Right edge"
94msgid "Right edge"
95msgstr ""
95msgstr ""
96
96
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
98msgid "Try swiping from the right edge to unlock the phone"
98msgid "Try swiping from the right edge to unlock the phone"
99msgstr ""
99msgstr ""
100
100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102msgid "Top edge"
102msgid "Top edge"
103msgstr ""
103msgstr ""
104
104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106msgid "Try swiping from the top edge to access the indicators"
106msgid "Try swiping from the top edge to access the indicators"
107msgstr ""
107msgstr ""
108
108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110msgid "Close"
110msgid "Close"
111msgstr ""
111msgstr ""
112
112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114msgid "Swipe up again to close the settings screen"
114msgid "Swipe up again to close the settings screen"
115msgstr ""
115msgstr ""
116
116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118msgid "Left edge"
118msgid "Left edge"
119msgstr ""
119msgstr ""
120
120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123msgstr ""
123msgstr ""
124
124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126msgid "Well done"
126msgid "Well done"
127msgstr ""
127msgstr ""
128
128
129−#: Components/EdgeDemo.qml:218
129+#: Components/EdgeDemo.qml:227
130+msgid ""
130−msgid "You have now mastered the edge gestures and can start using the phone"
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131msgstr ""
133msgstr ""
132
134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134msgid "Recent searches"
136msgid "Recent searches"
135msgstr ""
137msgstr ""
136
138
137#. TRANSLATORS: Number of persons who rated this app
139#. TRANSLATORS: Number of persons who rated this app
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
138−#: Dash/Apps/AppInfo.qml:73
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139#, qt-format
142#, qt-format
140msgid "(%1)"
143msgid "(%1)"
141msgstr ""
144msgstr ""
142
145
143#. TRANSLATORS: Number of persons who wrote reviews for this app
146#. TRANSLATORS: Number of persons who wrote reviews for this app
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
144−#: Dash/Apps/AppInfo.qml:85
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145#, qt-format
149#, qt-format
146msgid "%1 review"
150msgid "%1 review"
147msgid_plural "%1 reviews"
151msgid_plural "%1 reviews"
148msgstr[0] ""
152msgstr[0] ""
149msgstr[1] ""
153msgstr[1] ""
150
154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152msgid "Rate this"
156msgid "Rate this"
153msgstr ""
157msgstr ""
154
158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156msgid "Add a review"
160msgid "Add a review"
157msgstr ""
161msgstr ""
158
162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160msgid "Review"
164msgid "Review"
161msgstr ""
165msgstr ""
162
166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164msgid "Send"
168msgid "Send"
165msgstr ""
169msgstr ""
166
170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168msgid "Comments:"
172msgid "Comments:"
169msgstr ""
173msgstr ""
170
174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Tónleikur"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Sjónbond"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212msgid "Emergency Call"
176msgid "Emergency Call"
213msgstr ""
177msgstr ""
214
178
@@ -245,11 +209,21 @@ msgstr "Snakkar..."
245msgid "Search"
209msgid "Search"
246msgstr "Leita"
210msgstr "Leita"
247
211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249msgid "Sorry, there is nothing that matches your search."
213msgid "Sorry, there is nothing that matches your search."
250msgstr "Tíanverri er tað einki sum hóskar til tína leiting."
214msgstr "Tíanverri er tað einki sum hóskar til tína leiting."
251
215
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
252−#: Shell.qml:429
220+#: Shell.qml:438
253#, qt-format
221#, qt-format
254msgid "Please enter %1"
222msgid "Please enter %1"
255msgstr ""
223msgstr ""
224+
225+#~ msgid "Music"
226+#~ msgstr "Tónleikur"
227+
228+#~ msgid "Videos"
229+#~ msgstr "Sjónbond"
po/fr.po+40−66
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11"PO-Revision-Date: 2013-06-27 03:21+0000\n"
11"PO-Revision-Date: 2013-06-27 03:21+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: French <fr@li.org>\n"
13"Language-Team: French <fr@li.org>\n"
@@ -15,8 +15,8 @@ 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: 2013-08-30 05:37+0000\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
19+"X-Generator: Launchpad (build 16799)\n"
20
20
21#: Applications/applications.js:23
21#: Applications/applications.js:23
22msgid "Phone"
22msgid "Phone"
@@ -86,129 +86,93 @@ msgstr ""
86msgid "YouTube"
86msgid "YouTube"
87msgstr ""
87msgstr ""
88
88
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
90msgid "Skip intro"
90msgid "Skip intro"
91msgstr ""
91msgstr ""
92
92
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
94msgid "Right edge"
94msgid "Right edge"
95msgstr ""
95msgstr ""
96
96
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
98msgid "Try swiping from the right edge to unlock the phone"
98msgid "Try swiping from the right edge to unlock the phone"
99msgstr ""
99msgstr ""
100
100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102msgid "Top edge"
102msgid "Top edge"
103msgstr ""
103msgstr ""
104
104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106msgid "Try swiping from the top edge to access the indicators"
106msgid "Try swiping from the top edge to access the indicators"
107msgstr ""
107msgstr ""
108
108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110msgid "Close"
110msgid "Close"
111msgstr ""
111msgstr ""
112
112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114msgid "Swipe up again to close the settings screen"
114msgid "Swipe up again to close the settings screen"
115msgstr ""
115msgstr ""
116
116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118msgid "Left edge"
118msgid "Left edge"
119msgstr ""
119msgstr ""
120
120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123msgstr ""
123msgstr ""
124
124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126msgid "Well done"
126msgid "Well done"
127msgstr ""
127msgstr ""
128
128
129−#: Components/EdgeDemo.qml:218
129+#: Components/EdgeDemo.qml:227
130+msgid ""
130−msgid "You have now mastered the edge gestures and can start using the phone"
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131msgstr ""
133msgstr ""
132
134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134msgid "Recent searches"
136msgid "Recent searches"
135msgstr ""
137msgstr ""
136
138
137#. TRANSLATORS: Number of persons who rated this app
139#. TRANSLATORS: Number of persons who rated this app
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
138−#: Dash/Apps/AppInfo.qml:73
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139#, qt-format
142#, qt-format
140msgid "(%1)"
143msgid "(%1)"
141msgstr ""
144msgstr ""
142
145
143#. TRANSLATORS: Number of persons who wrote reviews for this app
146#. TRANSLATORS: Number of persons who wrote reviews for this app
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
144−#: Dash/Apps/AppInfo.qml:85
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145#, qt-format
149#, qt-format
146msgid "%1 review"
150msgid "%1 review"
147msgid_plural "%1 reviews"
151msgid_plural "%1 reviews"
148msgstr[0] ""
152msgstr[0] ""
149msgstr[1] ""
153msgstr[1] ""
150
154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152msgid "Rate this"
156msgid "Rate this"
153msgstr ""
157msgstr ""
154
158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156msgid "Add a review"
160msgid "Add a review"
157msgstr ""
161msgstr ""
158
162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160msgid "Review"
164msgid "Review"
161msgstr ""
165msgstr ""
162
166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164msgid "Send"
168msgid "Send"
165msgstr ""
169msgstr ""
166
170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168msgid "Comments:"
172msgid "Comments:"
169msgstr ""
173msgstr ""
170
174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Musique"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Vidéos"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212msgid "Emergency Call"
176msgid "Emergency Call"
213msgstr ""
177msgstr ""
214
178
@@ -245,11 +209,21 @@ msgstr ""
245msgid "Search"
209msgid "Search"
246msgstr ""
210msgstr ""
247
211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249msgid "Sorry, there is nothing that matches your search."
213msgid "Sorry, there is nothing that matches your search."
250msgstr ""
214msgstr ""
251
215
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
252−#: Shell.qml:429
220+#: Shell.qml:438
253#, qt-format
221#, qt-format
254msgid "Please enter %1"
222msgid "Please enter %1"
255msgstr ""
223msgstr ""
224+
225+#~ msgid "Music"
226+#~ msgstr "Musique"
227+
228+#~ msgid "Videos"
229+#~ msgstr "Vidéos"
po/gd.ponew file+253
@@ -0,0 +1,253 @@
1+# Gaelic; Scottish translation for unity8
2+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11+"PO-Revision-Date: 2013-09-30 10:34+0000\n"
12+"Last-Translator: Akerbeltz <fios@akerbeltz.org>\n"
13+"Language-Team: Gaelic; Scottish <gd@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
18+"(n > 2 && n < 20) ? 2 : 3;\n"
19+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
20+"X-Generator: Launchpad (build 16799)\n"
21+
22+#: Applications/applications.js:23
23+msgid "Phone"
24+msgstr "Fòn"
25+
26+#: Applications/applications.js:29
27+msgid "Camera"
28+msgstr "Camara"
29+
30+#: Applications/applications.js:35
31+msgid "Gallery"
32+msgstr "Gailearaidh"
33+
34+#: Applications/applications.js:40
35+msgid "Facebook"
36+msgstr "Facebook"
37+
38+#: Applications/applications.js:46
39+msgid "Browser"
40+msgstr "Brabhsair"
41+
42+#: Applications/applications.js:51
43+msgid "Twitter"
44+msgstr "Twitter"
45+
46+#: Applications/applications.js:57
47+msgid "GMail"
48+msgstr "GMail"
49+
50+#: Applications/applications.js:62
51+msgid "Weather"
52+msgstr "An aimsir"
53+
54+#: Applications/applications.js:68
55+msgid "Notepad"
56+msgstr "Pada nan nòtaichean"
57+
58+#: Applications/applications.js:74
59+msgid "Calendar"
60+msgstr "Am mìosachan"
61+
62+#: Applications/applications.js:80
63+msgid "Media Player"
64+msgstr "Cluicheadair mheadhanan"
65+
66+#: Applications/applications.js:86
67+msgid "Evernote"
68+msgstr "Evernote"
69+
70+#: Applications/applications.js:91
71+msgid "Map"
72+msgstr "Mapa"
73+
74+#: Applications/applications.js:96
75+msgid "Pinterest"
76+msgstr "Pinterest"
77+
78+#: Applications/applications.js:101
79+msgid "SoundCloud"
80+msgstr "SoundCloud"
81+
82+#: Applications/applications.js:106
83+msgid "Wikipedia"
84+msgstr "An Uicipeid"
85+
86+#: Applications/applications.js:111
87+msgid "YouTube"
88+msgstr "YouTube"
89+
90+#: Components/EdgeDemoOverlay.qml:149
91+msgid "Skip intro"
92+msgstr "Gearr leum thairis air an ro-ràdh"
93+
94+#: Components/EdgeDemo.qml:112
95+msgid "Right edge"
96+msgstr "An oir dheas"
97+
98+#: Components/EdgeDemo.qml:113
99+msgid "Try swiping from the right edge to unlock the phone"
100+msgstr ""
101+"Feuch is dèan grad-shlaighdeadh a-steach on oir dheas gus a' ghlas a thoirt "
102+"far an fhòn"
103+
104+#: Components/EdgeDemo.qml:144
105+msgid "Top edge"
106+msgstr "An oir aig a' bharr"
107+
108+#: Components/EdgeDemo.qml:145
109+msgid "Try swiping from the top edge to access the indicators"
110+msgstr ""
111+"Feuch is dèan grad-shlaighdeadh a-steach on oir aig a' bharr gus greim "
112+"fhaighinn air na taisbeanairean"
113+
114+#: Components/EdgeDemo.qml:170
115+msgid "Close"
116+msgstr "Dùin"
117+
118+#: Components/EdgeDemo.qml:171
119+msgid "Swipe up again to close the settings screen"
120+msgstr "Dèan grad-shlaighdeadh a-nìos gus sgrìn nan roghainnean a dhùnadh"
121+
122+#: Components/EdgeDemo.qml:198
123+msgid "Left edge"
124+msgstr "An oir chlì"
125+
126+#: Components/EdgeDemo.qml:199
127+msgid "Swipe from the left to reveal the launcher for quick access to apps"
128+msgstr ""
129+"Dèan grad-shlaighdeadh on oir chlì air an lòinseir a bheir dhut cothrom "
130+"luath air na h-aplacaidean"
131+
132+#: Components/EdgeDemo.qml:226
133+msgid "Well done"
134+msgstr "Gasta!"
135+
136+#: Components/EdgeDemo.qml:227
137+msgid ""
138+"You have now mastered the edge gestures and can start using the "
139+"phone<br><br>Tap anywhere to start"
140+msgstr ""
141+
142+#: Components/PageHeader.qml:341
143+msgid "Recent searches"
144+msgstr "Na lorg thu o chionn goirid"
145+
146+#. TRANSLATORS: Number of persons who rated this app
147+#. TRANSLATORS: Number of persons who rated this app/video/whatever
148+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
149+#, qt-format
150+msgid "(%1)"
151+msgstr "(%1)"
152+
153+#. TRANSLATORS: Number of persons who wrote reviews for this app
154+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
155+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
156+#, qt-format
157+msgid "%1 review"
158+msgid_plural "%1 reviews"
159+msgstr[0] "%1 lèirmheas"
160+msgstr[1] "%1 lèirmheas"
161+msgstr[2] "%1 lèirmheasan"
162+msgstr[3] "%1 lèirmheas"
163+
164+#: Dash/Apps/AppPreview.qml:126
165+msgid "Rate this"
166+msgstr "Rangaich seo"
167+
168+#: Dash/Previews/Reviews.qml:74
169+msgid "Add a review"
170+msgstr "Cuir lèirmheas ris"
171+
172+#: Dash/Previews/Reviews.qml:86
173+msgid "Review"
174+msgstr "Lèirmheas"
175+
176+#: Dash/Previews/Reviews.qml:121
177+msgid "Send"
178+msgstr "Cuir"
179+
180+#: Dash/Previews/Reviews.qml:139
181+msgid "Comments:"
182+msgstr "Beachdan"
183+
184+#: Greeter/Lockscreen.qml:142
185+msgid "Emergency Call"
186+msgstr "Gairm èiginn"
187+
188+#: Greeter/PassphraseLockscreen.qml:59
189+#, qt-format
190+msgid "Hello %1"
191+msgstr "Shin thu, %1"
192+
193+#: Greeter/PassphraseLockscreen.qml:59
194+msgid "Hello"
195+msgstr "Shin thu"
196+
197+#: Hud/HudParametrizedActionsPage.qml:132
198+msgid "Confirm"
199+msgstr "Dearbhaich"
200+
201+#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
202+msgid "Type or say a command"
203+msgstr "Sgrìobh no can àithne"
204+
205+#: Hud/Hud.qml:84
206+msgid "Loading. Please Wait..."
207+msgstr "'Ga luchdadh, fuirich ort..."
208+
209+#: Hud/Hud.qml:89
210+msgid "Speak Now..."
211+msgstr "Can rud a-nis..."
212+
213+#: Hud/Hud.qml:94
214+msgid "Speaking..."
215+msgstr "A' bruidhinn..."
216+
217+#: Panel/SearchIndicator.qml:27
218+msgid "Search"
219+msgstr "Lorg"
220+
221+#: plugins/Unity/scope.cpp:398
222+msgid "Sorry, there is nothing that matches your search."
223+msgstr "Tha sinn duilich ach chan eil dad a' freagairt ris na lorg thu."
224+
225+#: plugins/Unity/showallfilteroption.cpp:41
226+msgid "All"
227+msgstr ""
228+
229+#: Shell.qml:438
230+#, qt-format
231+msgid "Please enter %1"
232+msgstr "Cuir a-steach %1"
233+
234+#~ msgid "Top Charting"
235+#~ msgstr "Gràinnean-mullaich nan cairt"
236+
237+#~ msgid "Featured"
238+#~ msgstr "Brosnaichte"
239+
240+#~ msgid "Recent"
241+#~ msgstr "O chionn goirid"
242+
243+#~ msgid "New Releases"
244+#~ msgstr "Air ùr-sgaoileadh"
245+
246+#~ msgid "Videos"
247+#~ msgstr "Videothan"
248+
249+#~ msgid "Music"
250+#~ msgstr "Ceòl"
251+
252+#~ msgid "Popular Online"
253+#~ msgstr "Fèill mhòr air air loidhne"
po/gl.po+95−107
@@ -7,219 +7,185 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11−"PO-Revision-Date: 2013-06-27 03:38+0000\n"
11+"PO-Revision-Date: 2013-10-03 18:49+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12+"Last-Translator: Marcos Lans <Unknown>\n"
13"Language-Team: Galician <gl@li.org>\n"
13"Language-Team: Galician <gl@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: 2013-08-30 05:37+0000\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
19+"X-Generator: Launchpad (build 16799)\n"
20
20
21#: Applications/applications.js:23
21#: Applications/applications.js:23
22msgid "Phone"
22msgid "Phone"
23−msgstr ""
23+msgstr "Teléfono"
24
24
25#: Applications/applications.js:29
25#: Applications/applications.js:29
26msgid "Camera"
26msgid "Camera"
27−msgstr ""
27+msgstr "Cámara"
28
28
29#: Applications/applications.js:35
29#: Applications/applications.js:35
30msgid "Gallery"
30msgid "Gallery"
31−msgstr ""
31+msgstr "Galería"
32
32
33#: Applications/applications.js:40
33#: Applications/applications.js:40
34msgid "Facebook"
34msgid "Facebook"
35−msgstr ""
35+msgstr "Facebook"
36
36
37#: Applications/applications.js:46
37#: Applications/applications.js:46
38msgid "Browser"
38msgid "Browser"
39−msgstr ""
39+msgstr "Navegador"
40
40
41#: Applications/applications.js:51
41#: Applications/applications.js:51
42msgid "Twitter"
42msgid "Twitter"
43−msgstr ""
43+msgstr "Twitter"
44
44
45#: Applications/applications.js:57
45#: Applications/applications.js:57
46msgid "GMail"
46msgid "GMail"
47−msgstr ""
47+msgstr "GMail"
48
48
49#: Applications/applications.js:62
49#: Applications/applications.js:62
50msgid "Weather"
50msgid "Weather"
51−msgstr ""
51+msgstr "O tempo"
52
52
53#: Applications/applications.js:68
53#: Applications/applications.js:68
54msgid "Notepad"
54msgid "Notepad"
55−msgstr ""
55+msgstr "Bloc de notas"
56
56
57#: Applications/applications.js:74
57#: Applications/applications.js:74
58msgid "Calendar"
58msgid "Calendar"
59−msgstr ""
59+msgstr "Calendario"
60
60
61#: Applications/applications.js:80
61#: Applications/applications.js:80
62msgid "Media Player"
62msgid "Media Player"
63−msgstr ""
63+msgstr "Reprodutor multimedia"
64
64
65#: Applications/applications.js:86
65#: Applications/applications.js:86
66msgid "Evernote"
66msgid "Evernote"
67−msgstr ""
67+msgstr "Evernote"
68
68
69#: Applications/applications.js:91
69#: Applications/applications.js:91
70msgid "Map"
70msgid "Map"
71−msgstr ""
71+msgstr "Mapa"
72
72
73#: Applications/applications.js:96
73#: Applications/applications.js:96
74msgid "Pinterest"
74msgid "Pinterest"
75−msgstr ""
75+msgstr "Pinterest"
76
76
77#: Applications/applications.js:101
77#: Applications/applications.js:101
78msgid "SoundCloud"
78msgid "SoundCloud"
79−msgstr ""
79+msgstr "SoundCloud"
80
80
81#: Applications/applications.js:106
81#: Applications/applications.js:106
82msgid "Wikipedia"
82msgid "Wikipedia"
83−msgstr ""
83+msgstr "Wikipedia"
84
84
85#: Applications/applications.js:111
85#: Applications/applications.js:111
86msgid "YouTube"
86msgid "YouTube"
87−msgstr ""
87+msgstr "YouTube"
88
88
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
90msgid "Skip intro"
90msgid "Skip intro"
91−msgstr ""
91+msgstr "Saltar introdución"
92
92
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
94msgid "Right edge"
94msgid "Right edge"
95−msgstr ""
95+msgstr "Bordo dereito"
96
96
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
98msgid "Try swiping from the right edge to unlock the phone"
98msgid "Try swiping from the right edge to unlock the phone"
99−msgstr ""
99+msgstr "Probe o arrastre desde o bordo dereito para desbloquear o teléfono"
100
100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102msgid "Top edge"
102msgid "Top edge"
103−msgstr ""
103+msgstr "Bordo superior"
104
104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106msgid "Try swiping from the top edge to access the indicators"
106msgid "Try swiping from the top edge to access the indicators"
107−msgstr ""
107+msgstr "Esvare desde o bordo superior para acceder aos indicadores."
108
108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110msgid "Close"
110msgid "Close"
111−msgstr ""
111+msgstr "Pechar"
112
112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114msgid "Swipe up again to close the settings screen"
114msgid "Swipe up again to close the settings screen"
115−msgstr ""
115+msgstr "Esvare cara a arriba para pechar os axustes"
116
116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118msgid "Left edge"
118msgid "Left edge"
119−msgstr ""
119+msgstr "Bordo esquerdo"
120
120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123−msgstr ""
123+msgstr "Esvare desde a esquerda para mostrar o iniciador de acceso rápido"
124
124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126msgid "Well done"
126msgid "Well done"
127−msgstr ""
127+msgstr "Ben feito"
128
128
129−#: Components/EdgeDemo.qml:218
129+#: Components/EdgeDemo.qml:227
130+msgid ""
130−msgid "You have now mastered the edge gestures and can start using the phone"
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131msgstr ""
133msgstr ""
134+"Xa domina os xestos desde os bordos e pode comezar a usar o "
135+"móbil<br><br>Toque en calquera sitio para comezar"
132
136
133−#: Components/PageHeader.qml:298
137+#: Components/PageHeader.qml:341
134msgid "Recent searches"
138msgid "Recent searches"
135msgstr "Buscas recentes"
139msgstr "Buscas recentes"
136
140
137#. TRANSLATORS: Number of persons who rated this app
141#. TRANSLATORS: Number of persons who rated this app
142+#. TRANSLATORS: Number of persons who rated this app/video/whatever
138−#: Dash/Apps/AppInfo.qml:73
143+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139#, qt-format
144#, qt-format
140msgid "(%1)"
145msgid "(%1)"
141−msgstr ""
146+msgstr "(%1)"
142
147
143#. TRANSLATORS: Number of persons who wrote reviews for this app
148#. TRANSLATORS: Number of persons who wrote reviews for this app
149+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
144−#: Dash/Apps/AppInfo.qml:85
150+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145#, qt-format
151#, qt-format
146msgid "%1 review"
152msgid "%1 review"
147msgid_plural "%1 reviews"
153msgid_plural "%1 reviews"
148−msgstr[0] ""
154+msgstr[0] "%1 opinión"
149−msgstr[1] ""
155+msgstr[1] "%1 opinións"
150
156
151−#: Dash/Apps/AppPreview.qml:175
157+#: Dash/Apps/AppPreview.qml:126
152msgid "Rate this"
158msgid "Rate this"
153−msgstr ""
159+msgstr "Valore isto"
154
160
155−#: Dash/Apps/AppReviews.qml:72
161+#: Dash/Previews/Reviews.qml:74
156msgid "Add a review"
162msgid "Add a review"
157−msgstr ""
163+msgstr "Engadir unha opinión"
158
164
159−#: Dash/Apps/AppReviews.qml:84
165+#: Dash/Previews/Reviews.qml:86
160msgid "Review"
166msgid "Review"
161−msgstr ""
167+msgstr "Opinión"
162
168
163−#: Dash/Apps/AppReviews.qml:118
169+#: Dash/Previews/Reviews.qml:121
164msgid "Send"
170msgid "Send"
165−msgstr ""
171+msgstr "Enviar"
166
172
167−#: Dash/Apps/AppReviews.qml:136
173+#: Dash/Previews/Reviews.qml:139
168msgid "Comments:"
174msgid "Comments:"
169−msgstr ""
175+msgstr "Comentarios:"
170−
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Música"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Vídeos"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202
176
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
177+#: Greeter/Lockscreen.qml:142
212msgid "Emergency Call"
178msgid "Emergency Call"
213−msgstr ""
179+msgstr "Chamada de emerxencia"
214
180
215#: Greeter/PassphraseLockscreen.qml:59
181#: Greeter/PassphraseLockscreen.qml:59
216#, qt-format
182#, qt-format
217msgid "Hello %1"
183msgid "Hello %1"
218−msgstr ""
184+msgstr "Ola %1"
219
185
220#: Greeter/PassphraseLockscreen.qml:59
186#: Greeter/PassphraseLockscreen.qml:59
221msgid "Hello"
187msgid "Hello"
222−msgstr ""
188+msgstr "Ola"
223
189
224#: Hud/HudParametrizedActionsPage.qml:132
190#: Hud/HudParametrizedActionsPage.qml:132
225msgid "Confirm"
191msgid "Confirm"
@@ -245,11 +211,33 @@ msgstr "Falando…"
245msgid "Search"
211msgid "Search"
246msgstr "Buscar"
212msgstr "Buscar"
247
213
248−#: plugins/Unity/scope.cpp:317
214+#: plugins/Unity/scope.cpp:398
249msgid "Sorry, there is nothing that matches your search."
215msgid "Sorry, there is nothing that matches your search."
250msgstr "Sentímolo, non hai nada que coincida con esta busca."
216msgstr "Sentímolo, non hai nada que coincida con esta busca."
251
217
218+#: plugins/Unity/showallfilteroption.cpp:41
219+msgid "All"
220+msgstr "Todo"
221+
252−#: Shell.qml:429
222+#: Shell.qml:438
253#, qt-format
223#, qt-format
254msgid "Please enter %1"
224msgid "Please enter %1"
255−msgstr ""
225+msgstr "Introduza %1"
226+
227+#~ msgid "Music"
228+#~ msgstr "Música"
229+
230+#~ msgid "Videos"
231+#~ msgstr "Vídeos"
232+
233+#~ msgid "Featured"
234+#~ msgstr "Destacado"
235+
236+#~ msgid "Recent"
237+#~ msgstr "Recentes"
238+
239+#~ msgid "New Releases"
240+#~ msgstr "Novas versións"
241+
242+#~ msgid "Popular Online"
243+#~ msgstr "Populares en liña"
po/he.po+97−108
@@ -7,219 +7,183 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11−"PO-Revision-Date: 2013-06-27 03:54+0000\n"
11+"PO-Revision-Date: 2013-10-01 09:19+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12+"Last-Translator: Yaron <sh.yaron@gmail.com>\n"
13"Language-Team: Hebrew <he@li.org>\n"
13"Language-Team: Hebrew <he@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: 2013-08-30 05:37+0000\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
19+"X-Generator: Launchpad (build 16799)\n"
20
20
21#: Applications/applications.js:23
21#: Applications/applications.js:23
22msgid "Phone"
22msgid "Phone"
23−msgstr ""
23+msgstr "טלפון"
24
24
25#: Applications/applications.js:29
25#: Applications/applications.js:29
26msgid "Camera"
26msgid "Camera"
27−msgstr ""
27+msgstr "מצלמה"
28
28
29#: Applications/applications.js:35
29#: Applications/applications.js:35
30msgid "Gallery"
30msgid "Gallery"
31−msgstr ""
31+msgstr "גלריה"
32
32
33#: Applications/applications.js:40
33#: Applications/applications.js:40
34msgid "Facebook"
34msgid "Facebook"
35−msgstr ""
35+msgstr "Facebook"
36
36
37#: Applications/applications.js:46
37#: Applications/applications.js:46
38msgid "Browser"
38msgid "Browser"
39−msgstr ""
39+msgstr "דפדפן"
40
40
41#: Applications/applications.js:51
41#: Applications/applications.js:51
42msgid "Twitter"
42msgid "Twitter"
43−msgstr ""
43+msgstr "Twitter"
44
44
45#: Applications/applications.js:57
45#: Applications/applications.js:57
46msgid "GMail"
46msgid "GMail"
47−msgstr ""
47+msgstr "GMail"
48
48
49#: Applications/applications.js:62
49#: Applications/applications.js:62
50msgid "Weather"
50msgid "Weather"
51−msgstr ""
51+msgstr "מזג אוויר"
52
52
53#: Applications/applications.js:68
53#: Applications/applications.js:68
54msgid "Notepad"
54msgid "Notepad"
55−msgstr ""
55+msgstr "פנקס רשימות"
56
56
57#: Applications/applications.js:74
57#: Applications/applications.js:74
58msgid "Calendar"
58msgid "Calendar"
59−msgstr ""
59+msgstr "לוח שנה"
60
60
61#: Applications/applications.js:80
61#: Applications/applications.js:80
62msgid "Media Player"
62msgid "Media Player"
63−msgstr ""
63+msgstr "נגן מדיה"
64
64
65#: Applications/applications.js:86
65#: Applications/applications.js:86
66msgid "Evernote"
66msgid "Evernote"
67−msgstr ""
67+msgstr "Evernote"
68
68
69#: Applications/applications.js:91
69#: Applications/applications.js:91
70msgid "Map"
70msgid "Map"
71−msgstr ""
71+msgstr "מפה"
72
72
73#: Applications/applications.js:96
73#: Applications/applications.js:96
74msgid "Pinterest"
74msgid "Pinterest"
75−msgstr ""
75+msgstr "Pinterest"
76
76
77#: Applications/applications.js:101
77#: Applications/applications.js:101
78msgid "SoundCloud"
78msgid "SoundCloud"
79−msgstr ""
79+msgstr "SoundCloud"
80
80
81#: Applications/applications.js:106
81#: Applications/applications.js:106
82msgid "Wikipedia"
82msgid "Wikipedia"
83−msgstr ""
83+msgstr "ויקיפדיה"
84
84
85#: Applications/applications.js:111
85#: Applications/applications.js:111
86msgid "YouTube"
86msgid "YouTube"
87−msgstr ""
87+msgstr "YouTube"
88
88
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
90msgid "Skip intro"
90msgid "Skip intro"
91−msgstr ""
91+msgstr "לדלג על הפתיחה"
92
92
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
94msgid "Right edge"
94msgid "Right edge"
95−msgstr ""
95+msgstr "שול ימני"
96
96
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
98msgid "Try swiping from the right edge to unlock the phone"
98msgid "Try swiping from the right edge to unlock the phone"
99−msgstr ""
99+msgstr "נא לנסות למשוך מהשול הימני כדי לשחרר את נעילת הטלפון"
100
100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102msgid "Top edge"
102msgid "Top edge"
103−msgstr ""
103+msgstr "השול העליון"
104
104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106msgid "Try swiping from the top edge to access the indicators"
106msgid "Try swiping from the top edge to access the indicators"
107−msgstr ""
107+msgstr "נא לנסות למשוך מהשול העליון כדי לגשת למחוונים"
108
108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110msgid "Close"
110msgid "Close"
111−msgstr ""
111+msgstr "סגירה"
112
112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114msgid "Swipe up again to close the settings screen"
114msgid "Swipe up again to close the settings screen"
115−msgstr ""
115+msgstr "ניתן למשוך שוב כדי לסגור את מסך ההגדרות"
116
116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118msgid "Left edge"
118msgid "Left edge"
119−msgstr ""
119+msgstr "שול שמאלי"
120
120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123−msgstr ""
123+msgstr "יש למשוך משמאל כדי לחשוף את המשגר לצורך גישה מהירה ליישומים"
124
124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126msgid "Well done"
126msgid "Well done"
127−msgstr ""
127+msgstr "כל הכבוד"
128
128
129−#: Components/EdgeDemo.qml:218
129+#: Components/EdgeDemo.qml:227
130+msgid ""
130−msgid "You have now mastered the edge gestures and can start using the phone"
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131msgstr ""
133msgstr ""
132
134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134msgid "Recent searches"
136msgid "Recent searches"
135msgstr "חיפושים אחרונים"
137msgstr "חיפושים אחרונים"
136
138
137#. TRANSLATORS: Number of persons who rated this app
139#. TRANSLATORS: Number of persons who rated this app
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
138−#: Dash/Apps/AppInfo.qml:73
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139#, qt-format
142#, qt-format
140msgid "(%1)"
143msgid "(%1)"
141−msgstr ""
144+msgstr "(%1)"
142
145
143#. TRANSLATORS: Number of persons who wrote reviews for this app
146#. TRANSLATORS: Number of persons who wrote reviews for this app
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
144−#: Dash/Apps/AppInfo.qml:85
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145#, qt-format
149#, qt-format
146msgid "%1 review"
150msgid "%1 review"
147msgid_plural "%1 reviews"
151msgid_plural "%1 reviews"
148−msgstr[0] ""
152+msgstr[0] "סקירה %1"
149−msgstr[1] ""
153+msgstr[1] "%1 סקירות"
150
154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152msgid "Rate this"
156msgid "Rate this"
153−msgstr ""
157+msgstr "דירוג היישום"
154
158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156msgid "Add a review"
160msgid "Add a review"
157−msgstr ""
161+msgstr "הוספת סקירה"
158
162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160msgid "Review"
164msgid "Review"
161−msgstr ""
165+msgstr "סקירה"
162
166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164msgid "Send"
168msgid "Send"
165−msgstr ""
169+msgstr "שליחה"
166
170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168msgid "Comments:"
172msgid "Comments:"
169−msgstr ""
173+msgstr "הערות:"
170−
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "מוזיקה"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "סרטונים"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210
174
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212msgid "Emergency Call"
176msgid "Emergency Call"
213−msgstr ""
177+msgstr "שיחת חירום"
214
178
215#: Greeter/PassphraseLockscreen.qml:59
179#: Greeter/PassphraseLockscreen.qml:59
216#, qt-format
180#, qt-format
217msgid "Hello %1"
181msgid "Hello %1"
218−msgstr ""
182+msgstr "שלום %1"
219
183
220#: Greeter/PassphraseLockscreen.qml:59
184#: Greeter/PassphraseLockscreen.qml:59
221msgid "Hello"
185msgid "Hello"
222−msgstr ""
186+msgstr "שלום"
223
187
224#: Hud/HudParametrizedActionsPage.qml:132
188#: Hud/HudParametrizedActionsPage.qml:132
225msgid "Confirm"
189msgid "Confirm"
@@ -239,17 +203,42 @@ msgstr "יש לדבר כעת..."
239
203
240#: Hud/Hud.qml:94
204#: Hud/Hud.qml:94
241msgid "Speaking..."
205msgid "Speaking..."
242−msgstr "מושמע דיבור..."
206+msgstr "הדיבור מושמע…"
243
207
244#: Panel/SearchIndicator.qml:27
208#: Panel/SearchIndicator.qml:27
245msgid "Search"
209msgid "Search"
246msgstr "חיפוש"
210msgstr "חיפוש"
247
211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249msgid "Sorry, there is nothing that matches your search."
213msgid "Sorry, there is nothing that matches your search."
250msgstr "שום דבר אינו תואם לחיפוש שלך, עמך הסליחה."
214msgstr "שום דבר אינו תואם לחיפוש שלך, עמך הסליחה."
251
215
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
252−#: Shell.qml:429
220+#: Shell.qml:438
253#, qt-format
221#, qt-format
254msgid "Please enter %1"
222msgid "Please enter %1"
255−msgstr ""
223+msgstr "נא להזין %1"
224+
225+#~ msgid "Music"
226+#~ msgstr "מוזיקה"
227+
228+#~ msgid "Videos"
229+#~ msgstr "סרטונים"
230+
231+#~ msgid "Top Charting"
232+#~ msgstr "בראש הטבלה"
233+
234+#~ msgid "Featured"
235+#~ msgstr "מומלצים"
236+
237+#~ msgid "Recent"
238+#~ msgstr "אחרונים"
239+
240+#~ msgid "New Releases"
241+#~ msgstr "מהדורות חדשות"
242+
243+#~ msgid "Popular Online"
244+#~ msgstr "פופולריים ברחבי הרשת"
po/hr.po+40−66
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11"PO-Revision-Date: 2013-06-27 04:14+0000\n"
11"PO-Revision-Date: 2013-06-27 04:14+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Croatian <hr@li.org>\n"
13"Language-Team: Croatian <hr@li.org>\n"
@@ -16,8 +16,8 @@ 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: 2013-08-30 05:37+0000\n"
19+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
20−"X-Generator: Launchpad (build 16750)\n"
20+"X-Generator: Launchpad (build 16799)\n"
21
21
22#: Applications/applications.js:23
22#: Applications/applications.js:23
23msgid "Phone"
23msgid "Phone"
@@ -87,129 +87,93 @@ msgstr ""
87msgid "YouTube"
87msgid "YouTube"
88msgstr ""
88msgstr ""
89
89
90−#: Components/EdgeDemoOverlay.qml:145
90+#: Components/EdgeDemoOverlay.qml:149
91msgid "Skip intro"
91msgid "Skip intro"
92msgstr ""
92msgstr ""
93
93
94−#: Components/EdgeDemo.qml:98
94+#: Components/EdgeDemo.qml:112
95msgid "Right edge"
95msgid "Right edge"
96msgstr ""
96msgstr ""
97
97
98−#: Components/EdgeDemo.qml:99
98+#: Components/EdgeDemo.qml:113
99msgid "Try swiping from the right edge to unlock the phone"
99msgid "Try swiping from the right edge to unlock the phone"
100msgstr ""
100msgstr ""
101
101
102−#: Components/EdgeDemo.qml:135
102+#: Components/EdgeDemo.qml:144
103msgid "Top edge"
103msgid "Top edge"
104msgstr ""
104msgstr ""
105
105
106−#: Components/EdgeDemo.qml:136
106+#: Components/EdgeDemo.qml:145
107msgid "Try swiping from the top edge to access the indicators"
107msgid "Try swiping from the top edge to access the indicators"
108msgstr ""
108msgstr ""
109
109
110−#: Components/EdgeDemo.qml:161
110+#: Components/EdgeDemo.qml:170
111msgid "Close"
111msgid "Close"
112msgstr ""
112msgstr ""
113
113
114−#: Components/EdgeDemo.qml:162
114+#: Components/EdgeDemo.qml:171
115msgid "Swipe up again to close the settings screen"
115msgid "Swipe up again to close the settings screen"
116msgstr ""
116msgstr ""
117
117
118−#: Components/EdgeDemo.qml:189
118+#: Components/EdgeDemo.qml:198
119msgid "Left edge"
119msgid "Left edge"
120msgstr ""
120msgstr ""
121
121
122−#: Components/EdgeDemo.qml:190
122+#: Components/EdgeDemo.qml:199
123msgid "Swipe from the left to reveal the launcher for quick access to apps"
123msgid "Swipe from the left to reveal the launcher for quick access to apps"
124msgstr ""
124msgstr ""
125
125
126−#: Components/EdgeDemo.qml:217
126+#: Components/EdgeDemo.qml:226
127msgid "Well done"
127msgid "Well done"
128msgstr ""
128msgstr ""
129
129
130−#: Components/EdgeDemo.qml:218
130+#: Components/EdgeDemo.qml:227
131+msgid ""
131−msgid "You have now mastered the edge gestures and can start using the phone"
132+"You have now mastered the edge gestures and can start using the "
133+"phone<br><br>Tap anywhere to start"
132msgstr ""
134msgstr ""
133
135
134−#: Components/PageHeader.qml:298
136+#: Components/PageHeader.qml:341
135msgid "Recent searches"
137msgid "Recent searches"
136msgstr "Nedavne pretrage"
138msgstr "Nedavne pretrage"
137
139
138#. TRANSLATORS: Number of persons who rated this app
140#. TRANSLATORS: Number of persons who rated this app
141+#. TRANSLATORS: Number of persons who rated this app/video/whatever
139−#: Dash/Apps/AppInfo.qml:73
142+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
140#, qt-format
143#, qt-format
141msgid "(%1)"
144msgid "(%1)"
142msgstr ""
145msgstr ""
143
146
144#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app
148+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
145−#: Dash/Apps/AppInfo.qml:85
149+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
146#, qt-format
150#, qt-format
147msgid "%1 review"
151msgid "%1 review"
148msgid_plural "%1 reviews"
152msgid_plural "%1 reviews"
149msgstr[0] ""
153msgstr[0] ""
150msgstr[1] ""
154msgstr[1] ""
151
155
152−#: Dash/Apps/AppPreview.qml:175
156+#: Dash/Apps/AppPreview.qml:126
153msgid "Rate this"
157msgid "Rate this"
154msgstr ""
158msgstr ""
155
159
156−#: Dash/Apps/AppReviews.qml:72
160+#: Dash/Previews/Reviews.qml:74
157msgid "Add a review"
161msgid "Add a review"
158msgstr ""
162msgstr ""
159
163
160−#: Dash/Apps/AppReviews.qml:84
164+#: Dash/Previews/Reviews.qml:86
161msgid "Review"
165msgid "Review"
162msgstr ""
166msgstr ""
163
167
164−#: Dash/Apps/AppReviews.qml:118
168+#: Dash/Previews/Reviews.qml:121
165msgid "Send"
169msgid "Send"
166msgstr ""
170msgstr ""
167
171
168−#: Dash/Apps/AppReviews.qml:136
172+#: Dash/Previews/Reviews.qml:139
169msgid "Comments:"
173msgid "Comments:"
170msgstr ""
174msgstr ""
171
175
172−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
173−msgid "Featured"
174−msgstr ""
175−
176−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
177−msgid "Recent"
178−msgstr ""
179−
180−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
181−msgid "New Releases"
182−msgstr ""
183−
184−#: Dash/DashMusic.qml:30
185−msgid "Top Charting"
186−msgstr ""
187−
188−#: Dash/DashMusic.qml:91
189−msgid "Music"
190−msgstr "Glazba"
191−
192−#: Dash/DashVideos.qml:31
193−msgid "Popular Online"
194−msgstr ""
195−
196−#: Dash/DashVideos.qml:146
197−msgid "Videos"
198−msgstr "Video"
199−
200−#: Dash/Video/VideoPreview.qml:130
201−msgid "Directed by:"
202−msgstr ""
203−
204−#: Dash/Video/VideoPreview.qml:153
205−msgid "Starring:"
206−msgstr ""
207−
208−#: Dash/Video/VideoPreview.qml:176
209−msgid "Author:"
210−msgstr ""
211−
212−#: Greeter/Lockscreen.qml:134
176+#: Greeter/Lockscreen.qml:142
213msgid "Emergency Call"
177msgid "Emergency Call"
214msgstr ""
178msgstr ""
215
179
@@ -246,11 +210,21 @@ msgstr "Govor..."
246msgid "Search"
210msgid "Search"
247msgstr "Pretraživanje"
211msgstr "Pretraživanje"
248
212
249−#: plugins/Unity/scope.cpp:317
213+#: plugins/Unity/scope.cpp:398
250msgid "Sorry, there is nothing that matches your search."
214msgid "Sorry, there is nothing that matches your search."
251msgstr "Nažalost, ne postoji ništa što odgovara vašoj pretrazi."
215msgstr "Nažalost, ne postoji ništa što odgovara vašoj pretrazi."
252
216
217+#: plugins/Unity/showallfilteroption.cpp:41
218+msgid "All"
219+msgstr ""
220+
253−#: Shell.qml:429
221+#: Shell.qml:438
254#, qt-format
222#, qt-format
255msgid "Please enter %1"
223msgid "Please enter %1"
256msgstr ""
224msgstr ""
225+
226+#~ msgid "Music"
227+#~ msgstr "Glazba"
228+
229+#~ msgid "Videos"
230+#~ msgstr "Video"
po/hu.po+40−66
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11"PO-Revision-Date: 2013-06-27 04:28+0000\n"
11"PO-Revision-Date: 2013-06-27 04:28+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Hungarian <hu@li.org>\n"
13"Language-Team: Hungarian <hu@li.org>\n"
@@ -15,8 +15,8 @@ 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: 2013-08-30 05:37+0000\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
19+"X-Generator: Launchpad (build 16799)\n"
20
20
21#: Applications/applications.js:23
21#: Applications/applications.js:23
22msgid "Phone"
22msgid "Phone"
@@ -86,129 +86,93 @@ msgstr ""
86msgid "YouTube"
86msgid "YouTube"
87msgstr ""
87msgstr ""
88
88
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
90msgid "Skip intro"
90msgid "Skip intro"
91msgstr ""
91msgstr ""
92
92
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
94msgid "Right edge"
94msgid "Right edge"
95msgstr ""
95msgstr ""
96
96
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
98msgid "Try swiping from the right edge to unlock the phone"
98msgid "Try swiping from the right edge to unlock the phone"
99msgstr ""
99msgstr ""
100
100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102msgid "Top edge"
102msgid "Top edge"
103msgstr ""
103msgstr ""
104
104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106msgid "Try swiping from the top edge to access the indicators"
106msgid "Try swiping from the top edge to access the indicators"
107msgstr ""
107msgstr ""
108
108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110msgid "Close"
110msgid "Close"
111msgstr ""
111msgstr ""
112
112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114msgid "Swipe up again to close the settings screen"
114msgid "Swipe up again to close the settings screen"
115msgstr ""
115msgstr ""
116
116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118msgid "Left edge"
118msgid "Left edge"
119msgstr ""
119msgstr ""
120
120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123msgstr ""
123msgstr ""
124
124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126msgid "Well done"
126msgid "Well done"
127msgstr ""
127msgstr ""
128
128
129−#: Components/EdgeDemo.qml:218
129+#: Components/EdgeDemo.qml:227
130+msgid ""
130−msgid "You have now mastered the edge gestures and can start using the phone"
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131msgstr ""
133msgstr ""
132
134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134msgid "Recent searches"
136msgid "Recent searches"
135msgstr "Legutóbbi keresések"
137msgstr "Legutóbbi keresések"
136
138
137#. TRANSLATORS: Number of persons who rated this app
139#. TRANSLATORS: Number of persons who rated this app
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
138−#: Dash/Apps/AppInfo.qml:73
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139#, qt-format
142#, qt-format
140msgid "(%1)"
143msgid "(%1)"
141msgstr ""
144msgstr ""
142
145
143#. TRANSLATORS: Number of persons who wrote reviews for this app
146#. TRANSLATORS: Number of persons who wrote reviews for this app
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
144−#: Dash/Apps/AppInfo.qml:85
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145#, qt-format
149#, qt-format
146msgid "%1 review"
150msgid "%1 review"
147msgid_plural "%1 reviews"
151msgid_plural "%1 reviews"
148msgstr[0] ""
152msgstr[0] ""
149msgstr[1] ""
153msgstr[1] ""
150
154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152msgid "Rate this"
156msgid "Rate this"
153msgstr ""
157msgstr ""
154
158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156msgid "Add a review"
160msgid "Add a review"
157msgstr ""
161msgstr ""
158
162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160msgid "Review"
164msgid "Review"
161msgstr ""
165msgstr ""
162
166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164msgid "Send"
168msgid "Send"
165msgstr ""
169msgstr ""
166
170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168msgid "Comments:"
172msgid "Comments:"
169msgstr ""
173msgstr ""
170
174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Zene"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Videók"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212msgid "Emergency Call"
176msgid "Emergency Call"
213msgstr ""
177msgstr ""
214
178
@@ -245,11 +209,21 @@ msgstr "Beszéd…"
245msgid "Search"
209msgid "Search"
246msgstr "Keresés"
210msgstr "Keresés"
247
211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249msgid "Sorry, there is nothing that matches your search."
213msgid "Sorry, there is nothing that matches your search."
250msgstr "Elnézést, nincs találat a keresésre."
214msgstr "Elnézést, nincs találat a keresésre."
251
215
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
252−#: Shell.qml:429
220+#: Shell.qml:438
253#, qt-format
221#, qt-format
254msgid "Please enter %1"
222msgid "Please enter %1"
255msgstr ""
223msgstr ""
224+
225+#~ msgid "Music"
226+#~ msgstr "Zene"
227+
228+#~ msgid "Videos"
229+#~ msgstr "Videók"
po/hy.po+40−66
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11"PO-Revision-Date: 2013-06-27 04:43+0000\n"
11"PO-Revision-Date: 2013-06-27 04:43+0000\n"
12"Last-Translator: iAbaS <sosabazyan@yandex.ru>\n"
12"Last-Translator: iAbaS <sosabazyan@yandex.ru>\n"
13"Language-Team: Armenian <hy@li.org>\n"
13"Language-Team: Armenian <hy@li.org>\n"
@@ -15,8 +15,8 @@ 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: 2013-08-30 05:37+0000\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
19+"X-Generator: Launchpad (build 16799)\n"
20
20
21#: Applications/applications.js:23
21#: Applications/applications.js:23
22msgid "Phone"
22msgid "Phone"
@@ -86,129 +86,93 @@ msgstr ""
86msgid "YouTube"
86msgid "YouTube"
87msgstr ""
87msgstr ""
88
88
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
90msgid "Skip intro"
90msgid "Skip intro"
91msgstr ""
91msgstr ""
92
92
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
94msgid "Right edge"
94msgid "Right edge"
95msgstr ""
95msgstr ""
96
96
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
98msgid "Try swiping from the right edge to unlock the phone"
98msgid "Try swiping from the right edge to unlock the phone"
99msgstr ""
99msgstr ""
100
100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102msgid "Top edge"
102msgid "Top edge"
103msgstr ""
103msgstr ""
104
104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106msgid "Try swiping from the top edge to access the indicators"
106msgid "Try swiping from the top edge to access the indicators"
107msgstr ""
107msgstr ""
108
108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110msgid "Close"
110msgid "Close"
111msgstr ""
111msgstr ""
112
112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114msgid "Swipe up again to close the settings screen"
114msgid "Swipe up again to close the settings screen"
115msgstr ""
115msgstr ""
116
116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118msgid "Left edge"
118msgid "Left edge"
119msgstr ""
119msgstr ""
120
120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123msgstr ""
123msgstr ""
124
124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126msgid "Well done"
126msgid "Well done"
127msgstr ""
127msgstr ""
128
128
129−#: Components/EdgeDemo.qml:218
129+#: Components/EdgeDemo.qml:227
130+msgid ""
130−msgid "You have now mastered the edge gestures and can start using the phone"
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131msgstr ""
133msgstr ""
132
134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134msgid "Recent searches"
136msgid "Recent searches"
135msgstr "Վերջին որոնումներ"
137msgstr "Վերջին որոնումներ"
136
138
137#. TRANSLATORS: Number of persons who rated this app
139#. TRANSLATORS: Number of persons who rated this app
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
138−#: Dash/Apps/AppInfo.qml:73
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139#, qt-format
142#, qt-format
140msgid "(%1)"
143msgid "(%1)"
141msgstr ""
144msgstr ""
142
145
143#. TRANSLATORS: Number of persons who wrote reviews for this app
146#. TRANSLATORS: Number of persons who wrote reviews for this app
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
144−#: Dash/Apps/AppInfo.qml:85
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145#, qt-format
149#, qt-format
146msgid "%1 review"
150msgid "%1 review"
147msgid_plural "%1 reviews"
151msgid_plural "%1 reviews"
148msgstr[0] ""
152msgstr[0] ""
149msgstr[1] ""
153msgstr[1] ""
150
154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152msgid "Rate this"
156msgid "Rate this"
153msgstr ""
157msgstr ""
154
158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156msgid "Add a review"
160msgid "Add a review"
157msgstr ""
161msgstr ""
158
162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160msgid "Review"
164msgid "Review"
161msgstr ""
165msgstr ""
162
166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164msgid "Send"
168msgid "Send"
165msgstr ""
169msgstr ""
166
170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168msgid "Comments:"
172msgid "Comments:"
169msgstr ""
173msgstr ""
170
174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Երգեր"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Վիդեոներ"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212msgid "Emergency Call"
176msgid "Emergency Call"
213msgstr ""
177msgstr ""
214
178
@@ -245,11 +209,21 @@ msgstr "Խոսում եմ..."
245msgid "Search"
209msgid "Search"
246msgstr "Որոնում"
210msgstr "Որոնում"
247
211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249msgid "Sorry, there is nothing that matches your search."
213msgid "Sorry, there is nothing that matches your search."
250msgstr "Կներերք, բայց Ձեր հարցումով ոչինչ չկար"
214msgstr "Կներերք, բայց Ձեր հարցումով ոչինչ չկար"
251
215
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
252−#: Shell.qml:429
220+#: Shell.qml:438
253#, qt-format
221#, qt-format
254msgid "Please enter %1"
222msgid "Please enter %1"
255msgstr ""
223msgstr ""
224+
225+#~ msgid "Music"
226+#~ msgstr "Երգեր"
227+
228+#~ msgid "Videos"
229+#~ msgstr "Վիդեոներ"
po/id.po+34−66
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11"PO-Revision-Date: 2013-06-26 22:35+0000\n"
11"PO-Revision-Date: 2013-06-26 22:35+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Indonesian <id@li.org>\n"
13"Language-Team: Indonesian <id@li.org>\n"
@@ -15,8 +15,8 @@ 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: 2013-08-30 05:37+0000\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
19+"X-Generator: Launchpad (build 16799)\n"
20
20
21#: Applications/applications.js:23
21#: Applications/applications.js:23
22msgid "Phone"
22msgid "Phone"
@@ -86,129 +86,93 @@ msgstr ""
86msgid "YouTube"
86msgid "YouTube"
87msgstr ""
87msgstr ""
88
88
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
90msgid "Skip intro"
90msgid "Skip intro"
91msgstr ""
91msgstr ""
92
92
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
94msgid "Right edge"
94msgid "Right edge"
95msgstr ""
95msgstr ""
96
96
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
98msgid "Try swiping from the right edge to unlock the phone"
98msgid "Try swiping from the right edge to unlock the phone"
99msgstr ""
99msgstr ""
100
100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102msgid "Top edge"
102msgid "Top edge"
103msgstr ""
103msgstr ""
104
104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106msgid "Try swiping from the top edge to access the indicators"
106msgid "Try swiping from the top edge to access the indicators"
107msgstr ""
107msgstr ""
108
108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110msgid "Close"
110msgid "Close"
111msgstr ""
111msgstr ""
112
112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114msgid "Swipe up again to close the settings screen"
114msgid "Swipe up again to close the settings screen"
115msgstr ""
115msgstr ""
116
116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118msgid "Left edge"
118msgid "Left edge"
119msgstr ""
119msgstr ""
120
120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123msgstr ""
123msgstr ""
124
124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126msgid "Well done"
126msgid "Well done"
127msgstr ""
127msgstr ""
128
128
129−#: Components/EdgeDemo.qml:218
129+#: Components/EdgeDemo.qml:227
130+msgid ""
130−msgid "You have now mastered the edge gestures and can start using the phone"
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131msgstr ""
133msgstr ""
132
134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134msgid "Recent searches"
136msgid "Recent searches"
135msgstr ""
137msgstr ""
136
138
137#. TRANSLATORS: Number of persons who rated this app
139#. TRANSLATORS: Number of persons who rated this app
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
138−#: Dash/Apps/AppInfo.qml:73
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139#, qt-format
142#, qt-format
140msgid "(%1)"
143msgid "(%1)"
141msgstr ""
144msgstr ""
142
145
143#. TRANSLATORS: Number of persons who wrote reviews for this app
146#. TRANSLATORS: Number of persons who wrote reviews for this app
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
144−#: Dash/Apps/AppInfo.qml:85
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145#, qt-format
149#, qt-format
146msgid "%1 review"
150msgid "%1 review"
147msgid_plural "%1 reviews"
151msgid_plural "%1 reviews"
148msgstr[0] ""
152msgstr[0] ""
149msgstr[1] ""
153msgstr[1] ""
150
154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152msgid "Rate this"
156msgid "Rate this"
153msgstr ""
157msgstr ""
154
158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156msgid "Add a review"
160msgid "Add a review"
157msgstr ""
161msgstr ""
158
162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160msgid "Review"
164msgid "Review"
161msgstr ""
165msgstr ""
162
166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164msgid "Send"
168msgid "Send"
165msgstr ""
169msgstr ""
166
170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168msgid "Comments:"
172msgid "Comments:"
169msgstr ""
173msgstr ""
170
174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr ""
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr ""
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212msgid "Emergency Call"
176msgid "Emergency Call"
213msgstr ""
177msgstr ""
214
178
@@ -245,11 +209,15 @@ msgstr ""
245msgid "Search"
209msgid "Search"
246msgstr ""
210msgstr ""
247
211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249msgid "Sorry, there is nothing that matches your search."
213msgid "Sorry, there is nothing that matches your search."
250msgstr ""
214msgstr ""
251
215
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
252−#: Shell.qml:429
220+#: Shell.qml:438
253#, qt-format
221#, qt-format
254msgid "Please enter %1"
222msgid "Please enter %1"
255msgstr ""
223msgstr ""
po/is.po+55−66
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11"PO-Revision-Date: 2013-09-18 16:22+0000\n"
11"PO-Revision-Date: 2013-09-18 16:22+0000\n"
12"Last-Translator: Andri Thorlacius <Unknown>\n"
12"Last-Translator: Andri Thorlacius <Unknown>\n"
13"Language-Team: Icelandic <is@li.org>\n"
13"Language-Team: Icelandic <is@li.org>\n"
@@ -15,8 +15,8 @@ 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: 2013-09-19 05:14+0000\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19−"X-Generator: Launchpad (build 16765)\n"
19+"X-Generator: Launchpad (build 16799)\n"
20
20
21#: Applications/applications.js:23
21#: Applications/applications.js:23
22msgid "Phone"
22msgid "Phone"
@@ -86,130 +86,94 @@ msgstr "Wikipedia"
86msgid "YouTube"
86msgid "YouTube"
87msgstr "YouTube"
87msgstr "YouTube"
88
88
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
90msgid "Skip intro"
90msgid "Skip intro"
91msgstr "Hoppa yfir kynningu"
91msgstr "Hoppa yfir kynningu"
92
92
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
94msgid "Right edge"
94msgid "Right edge"
95msgstr "Hægri brún"
95msgstr "Hægri brún"
96
96
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
98msgid "Try swiping from the right edge to unlock the phone"
98msgid "Try swiping from the right edge to unlock the phone"
99msgstr ""
99msgstr ""
100"Prufaðu að renna puttanum frá hægri brúninni til að aflæsa símanum þínum."
100"Prufaðu að renna puttanum frá hægri brúninni til að aflæsa símanum þínum."
101
101
102−#: Components/EdgeDemo.qml:135
102+#: Components/EdgeDemo.qml:144
103msgid "Top edge"
103msgid "Top edge"
104msgstr "Efri brún"
104msgstr "Efri brún"
105
105
106−#: Components/EdgeDemo.qml:136
106+#: Components/EdgeDemo.qml:145
107msgid "Try swiping from the top edge to access the indicators"
107msgid "Try swiping from the top edge to access the indicators"
108msgstr ""
108msgstr ""
109
109
110−#: Components/EdgeDemo.qml:161
110+#: Components/EdgeDemo.qml:170
111msgid "Close"
111msgid "Close"
112msgstr "Loka"
112msgstr "Loka"
113
113
114−#: Components/EdgeDemo.qml:162
114+#: Components/EdgeDemo.qml:171
115msgid "Swipe up again to close the settings screen"
115msgid "Swipe up again to close the settings screen"
116msgstr ""
116msgstr ""
117
117
118−#: Components/EdgeDemo.qml:189
118+#: Components/EdgeDemo.qml:198
119msgid "Left edge"
119msgid "Left edge"
120msgstr "Vinstri brún"
120msgstr "Vinstri brún"
121
121
122−#: Components/EdgeDemo.qml:190
122+#: Components/EdgeDemo.qml:199
123msgid "Swipe from the left to reveal the launcher for quick access to apps"
123msgid "Swipe from the left to reveal the launcher for quick access to apps"
124msgstr ""
124msgstr ""
125
125
126−#: Components/EdgeDemo.qml:217
126+#: Components/EdgeDemo.qml:226
127msgid "Well done"
127msgid "Well done"
128msgstr "Vel gert"
128msgstr "Vel gert"
129
129
130−#: Components/EdgeDemo.qml:218
130+#: Components/EdgeDemo.qml:227
131+msgid ""
131−msgid "You have now mastered the edge gestures and can start using the phone"
132+"You have now mastered the edge gestures and can start using the "
133+"phone<br><br>Tap anywhere to start"
132msgstr ""
134msgstr ""
133
135
134−#: Components/PageHeader.qml:298
136+#: Components/PageHeader.qml:341
135msgid "Recent searches"
137msgid "Recent searches"
136msgstr "Nýlegar leitir"
138msgstr "Nýlegar leitir"
137
139
138#. TRANSLATORS: Number of persons who rated this app
140#. TRANSLATORS: Number of persons who rated this app
141+#. TRANSLATORS: Number of persons who rated this app/video/whatever
139−#: Dash/Apps/AppInfo.qml:73
142+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
140#, qt-format
143#, qt-format
141msgid "(%1)"
144msgid "(%1)"
142msgstr "(%1)"
145msgstr "(%1)"
143
146
144#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app
148+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
145−#: Dash/Apps/AppInfo.qml:85
149+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
146#, qt-format
150#, qt-format
147msgid "%1 review"
151msgid "%1 review"
148msgid_plural "%1 reviews"
152msgid_plural "%1 reviews"
149msgstr[0] "%1 ummæli"
153msgstr[0] "%1 ummæli"
150msgstr[1] "%1 ummæli"
154msgstr[1] "%1 ummæli"
151
155
152−#: Dash/Apps/AppPreview.qml:175
156+#: Dash/Apps/AppPreview.qml:126
153msgid "Rate this"
157msgid "Rate this"
154msgstr "Gefa þessu einkunn"
158msgstr "Gefa þessu einkunn"
155
159
156−#: Dash/Apps/AppReviews.qml:72
160+#: Dash/Previews/Reviews.qml:74
157msgid "Add a review"
161msgid "Add a review"
158msgstr "Gefa umsögn"
162msgstr "Gefa umsögn"
159
163
160−#: Dash/Apps/AppReviews.qml:84
164+#: Dash/Previews/Reviews.qml:86
161msgid "Review"
165msgid "Review"
162msgstr "Umsögn"
166msgstr "Umsögn"
163
167
164−#: Dash/Apps/AppReviews.qml:118
168+#: Dash/Previews/Reviews.qml:121
165msgid "Send"
169msgid "Send"
166msgstr "Senda"
170msgstr "Senda"
167
171
168−#: Dash/Apps/AppReviews.qml:136
172+#: Dash/Previews/Reviews.qml:139
169msgid "Comments:"
173msgid "Comments:"
170msgstr "Athugasemdir:"
174msgstr "Athugasemdir:"
171
175
172−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
173−msgid "Featured"
174−msgstr "Efst á baugi"
175−
176−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
177−msgid "Recent"
178−msgstr "Nýlegt"
179−
180−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
181−msgid "New Releases"
182−msgstr "Nýjar Útgáfur"
183−
184−#: Dash/DashMusic.qml:30
185−msgid "Top Charting"
186−msgstr "Topp Listi"
187−
188−#: Dash/DashMusic.qml:91
189−msgid "Music"
190−msgstr "Tónlist"
191−
192−#: Dash/DashVideos.qml:31
193−msgid "Popular Online"
194−msgstr "Vinsælt á Netinu"
195−
196−#: Dash/DashVideos.qml:146
197−msgid "Videos"
198−msgstr "Myndbönd"
199−
200−#: Dash/Video/VideoPreview.qml:130
201−msgid "Directed by:"
202−msgstr "Leikstýrt af:"
203−
204−#: Dash/Video/VideoPreview.qml:153
205−msgid "Starring:"
206−msgstr "Meðal leikara eru:"
207−
208−#: Dash/Video/VideoPreview.qml:176
209−msgid "Author:"
210−msgstr "Höfundur:"
211−
212−#: Greeter/Lockscreen.qml:134
176+#: Greeter/Lockscreen.qml:142
213msgid "Emergency Call"
177msgid "Emergency Call"
214msgstr "Neyðarsímtal"
178msgstr "Neyðarsímtal"
215
179
@@ -246,11 +210,36 @@ msgstr "Tala..."
246msgid "Search"
210msgid "Search"
247msgstr "Leita"
211msgstr "Leita"
248
212
249−#: plugins/Unity/scope.cpp:317
213+#: plugins/Unity/scope.cpp:398
250msgid "Sorry, there is nothing that matches your search."
214msgid "Sorry, there is nothing that matches your search."
251msgstr "Því miður, það var ekkert sem passaði við leitarorðið þitt."
215msgstr "Því miður, það var ekkert sem passaði við leitarorðið þitt."
252
216
217+#: plugins/Unity/showallfilteroption.cpp:41
218+msgid "All"
219+msgstr ""
220+
253−#: Shell.qml:429
221+#: Shell.qml:438
254#, qt-format
222#, qt-format
255msgid "Please enter %1"
223msgid "Please enter %1"
256msgstr ""
224msgstr ""
225+
226+#~ msgid "Top Charting"
227+#~ msgstr "Topp Listi"
228+
229+#~ msgid "Featured"
230+#~ msgstr "Efst á baugi"
231+
232+#~ msgid "Recent"
233+#~ msgstr "Nýlegt"
234+
235+#~ msgid "New Releases"
236+#~ msgstr "Nýjar Útgáfur"
237+
238+#~ msgid "Videos"
239+#~ msgstr "Myndbönd"
240+
241+#~ msgid "Music"
242+#~ msgstr "Tónlist"
243+
244+#~ msgid "Popular Online"
245+#~ msgstr "Vinsælt á Netinu"
po/it.po+100−104
@@ -7,219 +7,190 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11−"PO-Revision-Date: 2013-06-27 05:14+0000\n"
11+"PO-Revision-Date: 2013-10-07 09:34+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12+"Last-Translator: Claudio Arseni <claudio.arseni@gmail.com>\n"
13"Language-Team: Italian <it@li.org>\n"
13"Language-Team: Italian <it@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: 2013-08-30 05:37+0000\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
19+"X-Generator: Launchpad (build 16799)\n"
20
20
21#: Applications/applications.js:23
21#: Applications/applications.js:23
22msgid "Phone"
22msgid "Phone"
23−msgstr ""
23+msgstr "Telefono"
24
24
25#: Applications/applications.js:29
25#: Applications/applications.js:29
26msgid "Camera"
26msgid "Camera"
27−msgstr ""
27+msgstr "Fotocamera"
28
28
29#: Applications/applications.js:35
29#: Applications/applications.js:35
30msgid "Gallery"
30msgid "Gallery"
31−msgstr ""
31+msgstr "Galleria"
32
32
33#: Applications/applications.js:40
33#: Applications/applications.js:40
34msgid "Facebook"
34msgid "Facebook"
35−msgstr ""
35+msgstr "Facebook"
36
36
37#: Applications/applications.js:46
37#: Applications/applications.js:46
38msgid "Browser"
38msgid "Browser"
39−msgstr ""
39+msgstr "Browser"
40
40
41#: Applications/applications.js:51
41#: Applications/applications.js:51
42msgid "Twitter"
42msgid "Twitter"
43−msgstr ""
43+msgstr "Twitter"
44
44
45#: Applications/applications.js:57
45#: Applications/applications.js:57
46msgid "GMail"
46msgid "GMail"
47−msgstr ""
47+msgstr "GMail"
48
48
49#: Applications/applications.js:62
49#: Applications/applications.js:62
50msgid "Weather"
50msgid "Weather"
51−msgstr ""
51+msgstr "Meteo"
52
52
53#: Applications/applications.js:68
53#: Applications/applications.js:68
54msgid "Notepad"
54msgid "Notepad"
55−msgstr ""
55+msgstr "Blocco note"
56
56
57#: Applications/applications.js:74
57#: Applications/applications.js:74
58msgid "Calendar"
58msgid "Calendar"
59−msgstr ""
59+msgstr "Calendario"
60
60
61#: Applications/applications.js:80
61#: Applications/applications.js:80
62msgid "Media Player"
62msgid "Media Player"
63−msgstr ""
63+msgstr "Riproduttore multimediale"
64
64
65#: Applications/applications.js:86
65#: Applications/applications.js:86
66msgid "Evernote"
66msgid "Evernote"
67−msgstr ""
67+msgstr "Evernote"
68
68
69#: Applications/applications.js:91
69#: Applications/applications.js:91
70msgid "Map"
70msgid "Map"
71−msgstr ""
71+msgstr "Mappa"
72
72
73#: Applications/applications.js:96
73#: Applications/applications.js:96
74msgid "Pinterest"
74msgid "Pinterest"
75−msgstr ""
75+msgstr "Pinterest"
76
76
77#: Applications/applications.js:101
77#: Applications/applications.js:101
78msgid "SoundCloud"
78msgid "SoundCloud"
79−msgstr ""
79+msgstr "SoundCloud"
80
80
81#: Applications/applications.js:106
81#: Applications/applications.js:106
82msgid "Wikipedia"
82msgid "Wikipedia"
83−msgstr ""
83+msgstr "Wikipedia"
84
84
85#: Applications/applications.js:111
85#: Applications/applications.js:111
86msgid "YouTube"
86msgid "YouTube"
87−msgstr ""
87+msgstr "YouTube"
88
88
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
90msgid "Skip intro"
90msgid "Skip intro"
91−msgstr ""
91+msgstr "Salta introduzione"
92
92
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
94msgid "Right edge"
94msgid "Right edge"
95−msgstr ""
95+msgstr "Bordo destro"
96
96
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
98msgid "Try swiping from the right edge to unlock the phone"
98msgid "Try swiping from the right edge to unlock the phone"
99−msgstr ""
99+msgstr "Provare a far scorrere dal bordo destro per sbloccare il telefono"
100
100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102msgid "Top edge"
102msgid "Top edge"
103−msgstr ""
103+msgstr "Bordo superiore"
104
104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106msgid "Try swiping from the top edge to access the indicators"
106msgid "Try swiping from the top edge to access the indicators"
107msgstr ""
107msgstr ""
108+"Provare a far scorrere dal bordo in alto per accedere agli indicatori"
108
109
109−#: Components/EdgeDemo.qml:161
110+#: Components/EdgeDemo.qml:170
110msgid "Close"
111msgid "Close"
111−msgstr ""
112+msgstr "Chiudi"
112
113
113−#: Components/EdgeDemo.qml:162
114+#: Components/EdgeDemo.qml:171
114msgid "Swipe up again to close the settings screen"
115msgid "Swipe up again to close the settings screen"
115msgstr ""
116msgstr ""
117+"Far scorrere verso l'alto nuovamente per chiudere la schermata delle "
118+"impostazioni"
116
119
117−#: Components/EdgeDemo.qml:189
120+#: Components/EdgeDemo.qml:198
118msgid "Left edge"
121msgid "Left edge"
119−msgstr ""
122+msgstr "Bordo sinistro"
120
123
121−#: Components/EdgeDemo.qml:190
124+#: Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
125msgid "Swipe from the left to reveal the launcher for quick access to apps"
123msgstr ""
126msgstr ""
127+"Far scorrere il bordo sinistro per mostrare il Launcher e avere un rapido "
128+"accesso alle applicazioni"
124
129
125−#: Components/EdgeDemo.qml:217
130+#: Components/EdgeDemo.qml:226
126msgid "Well done"
131msgid "Well done"
127−msgstr ""
132+msgstr "Ben fatto"
128
133
129−#: Components/EdgeDemo.qml:218
134+#: Components/EdgeDemo.qml:227
135+msgid ""
130−msgid "You have now mastered the edge gestures and can start using the phone"
136+"You have now mastered the edge gestures and can start using the "
137+"phone<br><br>Tap anywhere to start"
131msgstr ""
138msgstr ""
139+"I gesti sui bordi sono stati configurati ed è possibile iniziare a usare il "
140+"telefono<br><br>Toccare in un punto qualunque per iniziare"
132
141
133−#: Components/PageHeader.qml:298
142+#: Components/PageHeader.qml:341
134msgid "Recent searches"
143msgid "Recent searches"
135msgstr "Ricerche recenti"
144msgstr "Ricerche recenti"
136
145
137#. TRANSLATORS: Number of persons who rated this app
146#. TRANSLATORS: Number of persons who rated this app
147+#. TRANSLATORS: Number of persons who rated this app/video/whatever
138−#: Dash/Apps/AppInfo.qml:73
148+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139#, qt-format
149#, qt-format
140msgid "(%1)"
150msgid "(%1)"
141−msgstr ""
151+msgstr "(%1)"
142
152
143#. TRANSLATORS: Number of persons who wrote reviews for this app
153#. TRANSLATORS: Number of persons who wrote reviews for this app
154+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
144−#: Dash/Apps/AppInfo.qml:85
155+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145#, qt-format
156#, qt-format
146msgid "%1 review"
157msgid "%1 review"
147msgid_plural "%1 reviews"
158msgid_plural "%1 reviews"
148−msgstr[0] ""
159+msgstr[0] "%1 recensione"
149−msgstr[1] ""
160+msgstr[1] "%1 recensioni"
150
161
151−#: Dash/Apps/AppPreview.qml:175
162+#: Dash/Apps/AppPreview.qml:126
152msgid "Rate this"
163msgid "Rate this"
153−msgstr ""
164+msgstr "Valuta"
154
165
155−#: Dash/Apps/AppReviews.qml:72
166+#: Dash/Previews/Reviews.qml:74
156msgid "Add a review"
167msgid "Add a review"
157−msgstr ""
168+msgstr "Aggiungi una recensione"
158
169
159−#: Dash/Apps/AppReviews.qml:84
170+#: Dash/Previews/Reviews.qml:86
160msgid "Review"
171msgid "Review"
161−msgstr ""
172+msgstr "Recensisci"
162
173
163−#: Dash/Apps/AppReviews.qml:118
174+#: Dash/Previews/Reviews.qml:121
164msgid "Send"
175msgid "Send"
165−msgstr ""
176+msgstr "Invia"
166
177
167−#: Dash/Apps/AppReviews.qml:136
178+#: Dash/Previews/Reviews.qml:139
168msgid "Comments:"
179msgid "Comments:"
169−msgstr ""
180+msgstr "Commenti:"
170
181
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Musica"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Video"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
182+#: Greeter/Lockscreen.qml:142
212msgid "Emergency Call"
183msgid "Emergency Call"
213−msgstr ""
184+msgstr "Chiamata di emergenza"
214
185
215#: Greeter/PassphraseLockscreen.qml:59
186#: Greeter/PassphraseLockscreen.qml:59
216#, qt-format
187#, qt-format
217msgid "Hello %1"
188msgid "Hello %1"
218−msgstr ""
189+msgstr "Ciao %1"
219
190
220#: Greeter/PassphraseLockscreen.qml:59
191#: Greeter/PassphraseLockscreen.qml:59
221msgid "Hello"
192msgid "Hello"
222−msgstr ""
193+msgstr "Ciao"
223
194
224#: Hud/HudParametrizedActionsPage.qml:132
195#: Hud/HudParametrizedActionsPage.qml:132
225msgid "Confirm"
196msgid "Confirm"
@@ -245,11 +216,36 @@ msgstr "Sto parlando..."
245msgid "Search"
216msgid "Search"
246msgstr "Cerca"
217msgstr "Cerca"
247
218
248−#: plugins/Unity/scope.cpp:317
219+#: plugins/Unity/scope.cpp:398
249msgid "Sorry, there is nothing that matches your search."
220msgid "Sorry, there is nothing that matches your search."
250msgstr "Nessun risultato corrispondente alla ricerca."
221msgstr "Nessun risultato corrispondente alla ricerca."
251
222
223+#: plugins/Unity/showallfilteroption.cpp:41
224+msgid "All"
225+msgstr "Tutto"
226+
252−#: Shell.qml:429
227+#: Shell.qml:438
253#, qt-format
228#, qt-format
254msgid "Please enter %1"
229msgid "Please enter %1"
255−msgstr ""
230+msgstr "Inserire %1"
231+
232+#~ msgid "Music"
233+#~ msgstr "Musica"
234+
235+#~ msgid "Videos"
236+#~ msgstr "Video"
237+
238+#~ msgid "Recent"
239+#~ msgstr "Recenti"
240+
241+#~ msgid "New Releases"
242+#~ msgstr "Nuovi rilasci"
243+
244+#~ msgid "Featured"
245+#~ msgstr "In evidenza"
246+
247+#~ msgid "Popular Online"
248+#~ msgstr "Popolari online"
249+
250+#~ msgid "Top Charting"
251+#~ msgstr "Più votate"
po/ja.po+34−66
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11"PO-Revision-Date: 2013-06-26 22:36+0000\n"
11"PO-Revision-Date: 2013-06-26 22:36+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Japanese <ja@li.org>\n"
13"Language-Team: Japanese <ja@li.org>\n"
@@ -15,8 +15,8 @@ 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: 2013-08-30 05:37+0000\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
19+"X-Generator: Launchpad (build 16799)\n"
20
20
21#: Applications/applications.js:23
21#: Applications/applications.js:23
22msgid "Phone"
22msgid "Phone"
@@ -86,129 +86,93 @@ msgstr ""
86msgid "YouTube"
86msgid "YouTube"
87msgstr ""
87msgstr ""
88
88
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
90msgid "Skip intro"
90msgid "Skip intro"
91msgstr ""
91msgstr ""
92
92
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
94msgid "Right edge"
94msgid "Right edge"
95msgstr ""
95msgstr ""
96
96
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
98msgid "Try swiping from the right edge to unlock the phone"
98msgid "Try swiping from the right edge to unlock the phone"
99msgstr ""
99msgstr ""
100
100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102msgid "Top edge"
102msgid "Top edge"
103msgstr ""
103msgstr ""
104
104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106msgid "Try swiping from the top edge to access the indicators"
106msgid "Try swiping from the top edge to access the indicators"
107msgstr ""
107msgstr ""
108
108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110msgid "Close"
110msgid "Close"
111msgstr ""
111msgstr ""
112
112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114msgid "Swipe up again to close the settings screen"
114msgid "Swipe up again to close the settings screen"
115msgstr ""
115msgstr ""
116
116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118msgid "Left edge"
118msgid "Left edge"
119msgstr ""
119msgstr ""
120
120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123msgstr ""
123msgstr ""
124
124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126msgid "Well done"
126msgid "Well done"
127msgstr ""
127msgstr ""
128
128
129−#: Components/EdgeDemo.qml:218
129+#: Components/EdgeDemo.qml:227
130+msgid ""
130−msgid "You have now mastered the edge gestures and can start using the phone"
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131msgstr ""
133msgstr ""
132
134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134msgid "Recent searches"
136msgid "Recent searches"
135msgstr ""
137msgstr ""
136
138
137#. TRANSLATORS: Number of persons who rated this app
139#. TRANSLATORS: Number of persons who rated this app
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
138−#: Dash/Apps/AppInfo.qml:73
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139#, qt-format
142#, qt-format
140msgid "(%1)"
143msgid "(%1)"
141msgstr ""
144msgstr ""
142
145
143#. TRANSLATORS: Number of persons who wrote reviews for this app
146#. TRANSLATORS: Number of persons who wrote reviews for this app
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
144−#: Dash/Apps/AppInfo.qml:85
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145#, qt-format
149#, qt-format
146msgid "%1 review"
150msgid "%1 review"
147msgid_plural "%1 reviews"
151msgid_plural "%1 reviews"
148msgstr[0] ""
152msgstr[0] ""
149msgstr[1] ""
153msgstr[1] ""
150
154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152msgid "Rate this"
156msgid "Rate this"
153msgstr ""
157msgstr ""
154
158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156msgid "Add a review"
160msgid "Add a review"
157msgstr ""
161msgstr ""
158
162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160msgid "Review"
164msgid "Review"
161msgstr ""
165msgstr ""
162
166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164msgid "Send"
168msgid "Send"
165msgstr ""
169msgstr ""
166
170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168msgid "Comments:"
172msgid "Comments:"
169msgstr ""
173msgstr ""
170
174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr ""
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr ""
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212msgid "Emergency Call"
176msgid "Emergency Call"
213msgstr ""
177msgstr ""
214
178
@@ -245,11 +209,15 @@ msgstr ""
245msgid "Search"
209msgid "Search"
246msgstr ""
210msgstr ""
247
211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249msgid "Sorry, there is nothing that matches your search."
213msgid "Sorry, there is nothing that matches your search."
250msgstr ""
214msgstr ""
251
215
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
252−#: Shell.qml:429
220+#: Shell.qml:438
253#, qt-format
221#, qt-format
254msgid "Please enter %1"
222msgid "Please enter %1"
255msgstr ""
223msgstr ""
po/km.ponew file+248
@@ -0,0 +1,248 @@
1+# Khmer translation for unity8
2+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11+"PO-Revision-Date: 2013-10-11 08:49+0000\n"
12+"Last-Translator: Khoem Sokhem <khoemsokhem@khmeros.info>\n"
13+"Language-Team: Khmer <km@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=1; plural=0;\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
20+
21+#: Applications/applications.js:23
22+msgid "Phone"
23+msgstr "ទូរស័ព្ទ"
24+
25+#: Applications/applications.js:29
26+msgid "Camera"
27+msgstr "ម៉ាស៊ីន​ថ​ត"
28+
29+#: Applications/applications.js:35
30+msgid "Gallery"
31+msgstr "វិចិត្រសាល"
32+
33+#: Applications/applications.js:40
34+msgid "Facebook"
35+msgstr "Facebook"
36+
37+#: Applications/applications.js:46
38+msgid "Browser"
39+msgstr "កម្មវិធី​រុករក"
40+
41+#: Applications/applications.js:51
42+msgid "Twitter"
43+msgstr "Twitter"
44+
45+#: Applications/applications.js:57
46+msgid "GMail"
47+msgstr "GMail"
48+
49+#: Applications/applications.js:62
50+msgid "Weather"
51+msgstr "អាកាសធាតុ"
52+
53+#: Applications/applications.js:68
54+msgid "Notepad"
55+msgstr "Notepad"
56+
57+#: Applications/applications.js:74
58+msgid "Calendar"
59+msgstr "ប្រតិទិន"
60+
61+#: Applications/applications.js:80
62+msgid "Media Player"
63+msgstr "កម្មវិធី​ចាក់​មេឌៀ"
64+
65+#: Applications/applications.js:86
66+msgid "Evernote"
67+msgstr "Evernote"
68+
69+#: Applications/applications.js:91
70+msgid "Map"
71+msgstr "ផែនទី"
72+
73+#: Applications/applications.js:96
74+msgid "Pinterest"
75+msgstr "Pinterest"
76+
77+#: Applications/applications.js:101
78+msgid "SoundCloud"
79+msgstr "SoundCloud"
80+
81+#: Applications/applications.js:106
82+msgid "Wikipedia"
83+msgstr "វីគីភីឌៀ"
84+
85+#: Applications/applications.js:111
86+msgid "YouTube"
87+msgstr "YouTube"
88+
89+#: Components/EdgeDemoOverlay.qml:149
90+msgid "Skip intro"
91+msgstr "រំលង​ការ​ណែនាំ"
92+
93+#: Components/EdgeDemo.qml:112
94+msgid "Right edge"
95+msgstr "គែម​ស្ដាំ"
96+
97+#: Components/EdgeDemo.qml:113
98+msgid "Try swiping from the right edge to unlock the phone"
99+msgstr "សាកល្បង​​អូស​ពី​គែម​ស្ដាំ​ ដើម្បី​ដោះ​សោ​ទូរស័ព្ទ"
100+
101+#: Components/EdgeDemo.qml:144
102+msgid "Top edge"
103+msgstr "គែម​ខាង​លើ"
104+
105+#: Components/EdgeDemo.qml:145
106+msgid "Try swiping from the top edge to access the indicators"
107+msgstr "សាកល្បង​អូស​ពី​គែម​ខាង​លើ ដើម្បី​ចូល​ដំណើរការ​សញ្ញា"
108+
109+#: Components/EdgeDemo.qml:170
110+msgid "Close"
111+msgstr "បិទ"
112+
113+#: Components/EdgeDemo.qml:171
114+msgid "Swipe up again to close the settings screen"
115+msgstr "អូស​ឡើង​លើ​ម្ដងទៀត ដើម្បី​បិទ​ការ​កំណត់​អេក្រង់"
116+
117+#: Components/EdgeDemo.qml:198
118+msgid "Left edge"
119+msgstr "គែមឆ្វេង"
120+
121+#: Components/EdgeDemo.qml:199
122+msgid "Swipe from the left to reveal the launcher for quick access to apps"
123+msgstr ""
124+"អូស​ពី​គែម​ឆ្វេង "
125+"ដើម្បី​បង្ហាញ​កម្មវិធី​ចាប់ផ្ដើម​សម្រាប់​ចូល​ដំណើរ​ការ​កម្មវិធី​រហ័ស"
126+
127+#: Components/EdgeDemo.qml:226
128+msgid "Well done"
129+msgstr "ធ្វើ​បាន​ល្អ"
130+
131+#: Components/EdgeDemo.qml:227
132+msgid ""
133+"You have now mastered the edge gestures and can start using the "
134+"phone<br><br>Tap anywhere to start"
135+msgstr ""
136+"ឥឡូវ​អ្នក​បាន​គ្រប់គ្រង​កាយវិការ​គែម "
137+"និង​អាច​ចាប់ផ្ដើម​ប្រើ​ទូរស័ព្ទ​បាន<br><br>ប៉ះ​កន្លែង​ណា​មួយ​ "
138+"ដើម្បី​ចាប់ផ្ដើម"
139+
140+#: Components/PageHeader.qml:341
141+msgid "Recent searches"
142+msgstr "ការ​ស្វែងរក​ថ្មី"
143+
144+#. TRANSLATORS: Number of persons who rated this app
145+#. TRANSLATORS: Number of persons who rated this app/video/whatever
146+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
147+#, qt-format
148+msgid "(%1)"
149+msgstr "(%1)"
150+
151+#. TRANSLATORS: Number of persons who wrote reviews for this app
152+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
153+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
154+#, qt-format
155+msgid "%1 review"
156+msgid_plural "%1 reviews"
157+msgstr[0] "ពិនិត្យ​មើល %1"
158+
159+#: Dash/Apps/AppPreview.qml:126
160+msgid "Rate this"
161+msgstr "វាយតម្លៃ​វា"
162+
163+#: Dash/Previews/Reviews.qml:74
164+msgid "Add a review"
165+msgstr "បន្ថែម​ការ​ពិនិត្យ"
166+
167+#: Dash/Previews/Reviews.qml:86
168+msgid "Review"
169+msgstr "ការ​ពិនិត្យ"
170+
171+#: Dash/Previews/Reviews.qml:121
172+msgid "Send"
173+msgstr "ផ្ញើ"
174+
175+#: Dash/Previews/Reviews.qml:139
176+msgid "Comments:"
177+msgstr "មតិយោបល់៖"
178+
179+#: Greeter/Lockscreen.qml:142
180+msgid "Emergency Call"
181+msgstr "ការ​ហៅ​ពេល​អាសន្ន"
182+
183+#: Greeter/PassphraseLockscreen.qml:59
184+#, qt-format
185+msgid "Hello %1"
186+msgstr "សួស្ដី %1"
187+
188+#: Greeter/PassphraseLockscreen.qml:59
189+msgid "Hello"
190+msgstr "សួស្តី"
191+
192+#: Hud/HudParametrizedActionsPage.qml:132
193+msgid "Confirm"
194+msgstr "បញ្ជាក់"
195+
196+#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
197+msgid "Type or say a command"
198+msgstr "បញ្ចូល ឬ​និយាយ​ពាក្យ​បញ្ជា"
199+
200+#: Hud/Hud.qml:84
201+msgid "Loading. Please Wait..."
202+msgstr "សូម​រង់ចាំ កំពុង​ផ្ទុក..."
203+
204+#: Hud/Hud.qml:89
205+msgid "Speak Now..."
206+msgstr "និយាយ​ឥឡូវ..."
207+
208+#: Hud/Hud.qml:94
209+msgid "Speaking..."
210+msgstr "កំពុង​និយាយ..."
211+
212+#: Panel/SearchIndicator.qml:27
213+msgid "Search"
214+msgstr "ស្វែង​រក"
215+
216+#: plugins/Unity/scope.cpp:398
217+msgid "Sorry, there is nothing that matches your search."
218+msgstr "សូម​ទោស មិនមាន​ពាក្យ​ដែល​អ្នក​ស្វែងរក​ទេ​។"
219+
220+#: plugins/Unity/showallfilteroption.cpp:41
221+msgid "All"
222+msgstr "ទាំង​អស់"
223+
224+#: Shell.qml:438
225+#, qt-format
226+msgid "Please enter %1"
227+msgstr "សូម​បញ្ចូល %1"
228+
229+#~ msgid "Popular Online"
230+#~ msgstr "លើ​បណ្ដាញ​ប្រជាប្រិយ"
231+
232+#~ msgid "Music"
233+#~ msgstr "តន្ត្រី"
234+
235+#~ msgid "New Releases"
236+#~ msgstr "ការ​ចេញ​ផ្សាយ​ថ្មី"
237+
238+#~ msgid "Top Charting"
239+#~ msgstr "តារាង​ខាង​លើ"
240+
241+#~ msgid "Featured"
242+#~ msgstr "ដែល​ល្បី"
243+
244+#~ msgid "Recent"
245+#~ msgstr "ថ្មីៗ"
246+
247+#~ msgid "Videos"
248+#~ msgstr "វីដេអូ"
po/kn.po+40−66
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11"PO-Revision-Date: 2013-06-27 05:43+0000\n"
11"PO-Revision-Date: 2013-06-27 05:43+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Kannada <kn@li.org>\n"
13"Language-Team: Kannada <kn@li.org>\n"
@@ -15,8 +15,8 @@ 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: 2013-08-30 05:37+0000\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
19+"X-Generator: Launchpad (build 16799)\n"
20
20
21#: Applications/applications.js:23
21#: Applications/applications.js:23
22msgid "Phone"
22msgid "Phone"
@@ -86,129 +86,93 @@ msgstr ""
86msgid "YouTube"
86msgid "YouTube"
87msgstr ""
87msgstr ""
88
88
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
90msgid "Skip intro"
90msgid "Skip intro"
91msgstr ""
91msgstr ""
92
92
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
94msgid "Right edge"
94msgid "Right edge"
95msgstr ""
95msgstr ""
96
96
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
98msgid "Try swiping from the right edge to unlock the phone"
98msgid "Try swiping from the right edge to unlock the phone"
99msgstr ""
99msgstr ""
100
100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102msgid "Top edge"
102msgid "Top edge"
103msgstr ""
103msgstr ""
104
104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106msgid "Try swiping from the top edge to access the indicators"
106msgid "Try swiping from the top edge to access the indicators"
107msgstr ""
107msgstr ""
108
108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110msgid "Close"
110msgid "Close"
111msgstr ""
111msgstr ""
112
112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114msgid "Swipe up again to close the settings screen"
114msgid "Swipe up again to close the settings screen"
115msgstr ""
115msgstr ""
116
116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118msgid "Left edge"
118msgid "Left edge"
119msgstr ""
119msgstr ""
120
120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123msgstr ""
123msgstr ""
124
124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126msgid "Well done"
126msgid "Well done"
127msgstr ""
127msgstr ""
128
128
129−#: Components/EdgeDemo.qml:218
129+#: Components/EdgeDemo.qml:227
130+msgid ""
130−msgid "You have now mastered the edge gestures and can start using the phone"
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131msgstr ""
133msgstr ""
132
134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134msgid "Recent searches"
136msgid "Recent searches"
135msgstr "ಇತ್ತೀಚಿನ ಹುಡುಕಾಟಗಳು"
137msgstr "ಇತ್ತೀಚಿನ ಹುಡುಕಾಟಗಳು"
136
138
137#. TRANSLATORS: Number of persons who rated this app
139#. TRANSLATORS: Number of persons who rated this app
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
138−#: Dash/Apps/AppInfo.qml:73
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139#, qt-format
142#, qt-format
140msgid "(%1)"
143msgid "(%1)"
141msgstr ""
144msgstr ""
142
145
143#. TRANSLATORS: Number of persons who wrote reviews for this app
146#. TRANSLATORS: Number of persons who wrote reviews for this app
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
144−#: Dash/Apps/AppInfo.qml:85
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145#, qt-format
149#, qt-format
146msgid "%1 review"
150msgid "%1 review"
147msgid_plural "%1 reviews"
151msgid_plural "%1 reviews"
148msgstr[0] ""
152msgstr[0] ""
149msgstr[1] ""
153msgstr[1] ""
150
154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152msgid "Rate this"
156msgid "Rate this"
153msgstr ""
157msgstr ""
154
158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156msgid "Add a review"
160msgid "Add a review"
157msgstr ""
161msgstr ""
158
162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160msgid "Review"
164msgid "Review"
161msgstr ""
165msgstr ""
162
166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164msgid "Send"
168msgid "Send"
165msgstr ""
169msgstr ""
166
170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168msgid "Comments:"
172msgid "Comments:"
169msgstr ""
173msgstr ""
170
174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "ಸಂಗೀತ"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "ವೀಡಿಯೋಗಳು"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212msgid "Emergency Call"
176msgid "Emergency Call"
213msgstr ""
177msgstr ""
214
178
@@ -245,11 +209,21 @@ msgstr "ಮಾತನಾಡುತಿದ್ದೀರಿ"
245msgid "Search"
209msgid "Search"
246msgstr "ಹುಡುಕು"
210msgstr "ಹುಡುಕು"
247
211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249msgid "Sorry, there is nothing that matches your search."
213msgid "Sorry, there is nothing that matches your search."
250msgstr "ಕ್ಷಮಿಸಿ ನಿಮ್ಮ ಶೋಧನೆಗೆ ಸರಿಯಾದ ಹೊಂದಾಣಿಕೆಗಳು ದೊರಕುತ್ತಿಲ್ಲ"
214msgstr "ಕ್ಷಮಿಸಿ ನಿಮ್ಮ ಶೋಧನೆಗೆ ಸರಿಯಾದ ಹೊಂದಾಣಿಕೆಗಳು ದೊರಕುತ್ತಿಲ್ಲ"
251
215
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
252−#: Shell.qml:429
220+#: Shell.qml:438
253#, qt-format
221#, qt-format
254msgid "Please enter %1"
222msgid "Please enter %1"
255msgstr ""
223msgstr ""
224+
225+#~ msgid "Music"
226+#~ msgstr "ಸಂಗೀತ"
227+
228+#~ msgid "Videos"
229+#~ msgstr "ವೀಡಿಯೋಗಳು"
po/ko.po+60−89
@@ -7,208 +7,172 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11−"PO-Revision-Date: 2013-06-27 05:59+0000\n"
11+"PO-Revision-Date: 2013-10-10 07:04+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12+"Last-Translator: Kim Boram <boramism@gmail.com>\n"
13"Language-Team: Korean <ko@li.org>\n"
13"Language-Team: Korean <ko@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=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
19+"X-Generator: Launchpad (build 16799)\n"
20
20
21#: Applications/applications.js:23
21#: Applications/applications.js:23
22msgid "Phone"
22msgid "Phone"
23−msgstr ""
23+msgstr "전화"
24
24
25#: Applications/applications.js:29
25#: Applications/applications.js:29
26msgid "Camera"
26msgid "Camera"
27−msgstr ""
27+msgstr "카메라"
28
28
29#: Applications/applications.js:35
29#: Applications/applications.js:35
30msgid "Gallery"
30msgid "Gallery"
31−msgstr ""
31+msgstr "갤러리"
32
32
33#: Applications/applications.js:40
33#: Applications/applications.js:40
34msgid "Facebook"
34msgid "Facebook"
35−msgstr ""
35+msgstr "페이스북"
36
36
37#: Applications/applications.js:46
37#: Applications/applications.js:46
38msgid "Browser"
38msgid "Browser"
39−msgstr ""
39+msgstr "브라우저"
40
40
41#: Applications/applications.js:51
41#: Applications/applications.js:51
42msgid "Twitter"
42msgid "Twitter"
43−msgstr ""
43+msgstr "트위터"
44
44
45#: Applications/applications.js:57
45#: Applications/applications.js:57
46msgid "GMail"
46msgid "GMail"
47−msgstr ""
47+msgstr "지메일"
48
48
49#: Applications/applications.js:62
49#: Applications/applications.js:62
50msgid "Weather"
50msgid "Weather"
51−msgstr ""
51+msgstr "날씨"
52
52
53#: Applications/applications.js:68
53#: Applications/applications.js:68
54msgid "Notepad"
54msgid "Notepad"
55−msgstr ""
55+msgstr "메모장"
56
56
57#: Applications/applications.js:74
57#: Applications/applications.js:74
58msgid "Calendar"
58msgid "Calendar"
59−msgstr ""
59+msgstr "달력"
60
60
61#: Applications/applications.js:80
61#: Applications/applications.js:80
62msgid "Media Player"
62msgid "Media Player"
63−msgstr ""
63+msgstr "미디어 재생기"
64
64
65#: Applications/applications.js:86
65#: Applications/applications.js:86
66msgid "Evernote"
66msgid "Evernote"
67−msgstr ""
67+msgstr "에버노트"
68
68
69#: Applications/applications.js:91
69#: Applications/applications.js:91
70msgid "Map"
70msgid "Map"
71−msgstr ""
71+msgstr "지도"
72
72
73#: Applications/applications.js:96
73#: Applications/applications.js:96
74msgid "Pinterest"
74msgid "Pinterest"
75−msgstr ""
75+msgstr "핀터레스트"
76
76
77#: Applications/applications.js:101
77#: Applications/applications.js:101
78msgid "SoundCloud"
78msgid "SoundCloud"
79−msgstr ""
79+msgstr "사운드클라우드"
80
80
81#: Applications/applications.js:106
81#: Applications/applications.js:106
82msgid "Wikipedia"
82msgid "Wikipedia"
83−msgstr ""
83+msgstr "위키백과"
84
84
85#: Applications/applications.js:111
85#: Applications/applications.js:111
86msgid "YouTube"
86msgid "YouTube"
87−msgstr ""
87+msgstr "유튜브"
88
88
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
90msgid "Skip intro"
90msgid "Skip intro"
91−msgstr ""
91+msgstr "도입부 건너뛰기"
92
92
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
94msgid "Right edge"
94msgid "Right edge"
95−msgstr ""
95+msgstr "오른쪽 끝"
96
96
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
98msgid "Try swiping from the right edge to unlock the phone"
98msgid "Try swiping from the right edge to unlock the phone"
99msgstr ""
99msgstr ""
100
100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102msgid "Top edge"
102msgid "Top edge"
103msgstr ""
103msgstr ""
104
104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106msgid "Try swiping from the top edge to access the indicators"
106msgid "Try swiping from the top edge to access the indicators"
107msgstr ""
107msgstr ""
108
108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110msgid "Close"
110msgid "Close"
111msgstr ""
111msgstr ""
112
112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114msgid "Swipe up again to close the settings screen"
114msgid "Swipe up again to close the settings screen"
115msgstr ""
115msgstr ""
116
116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118msgid "Left edge"
118msgid "Left edge"
119msgstr ""
119msgstr ""
120
120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123msgstr ""
123msgstr ""
124
124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126msgid "Well done"
126msgid "Well done"
127msgstr ""
127msgstr ""
128
128
129−#: Components/EdgeDemo.qml:218
129+#: Components/EdgeDemo.qml:227
130+msgid ""
130−msgid "You have now mastered the edge gestures and can start using the phone"
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131msgstr ""
133msgstr ""
132
134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134msgid "Recent searches"
136msgid "Recent searches"
135−msgstr "요즈음 찿은 것들"
137+msgstr "최근 검색"
136
138
137#. TRANSLATORS: Number of persons who rated this app
139#. TRANSLATORS: Number of persons who rated this app
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
138−#: Dash/Apps/AppInfo.qml:73
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139#, qt-format
142#, qt-format
140msgid "(%1)"
143msgid "(%1)"
141msgstr ""
144msgstr ""
142
145
143#. TRANSLATORS: Number of persons who wrote reviews for this app
146#. TRANSLATORS: Number of persons who wrote reviews for this app
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
144−#: Dash/Apps/AppInfo.qml:85
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145#, qt-format
149#, qt-format
146msgid "%1 review"
150msgid "%1 review"
147msgid_plural "%1 reviews"
151msgid_plural "%1 reviews"
148msgstr[0] ""
152msgstr[0] ""
149msgstr[1] ""
153msgstr[1] ""
150
154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152msgid "Rate this"
156msgid "Rate this"
153msgstr ""
157msgstr ""
154
158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156msgid "Add a review"
160msgid "Add a review"
157msgstr ""
161msgstr ""
158
162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160msgid "Review"
164msgid "Review"
161msgstr ""
165msgstr ""
162
166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164msgid "Send"
168msgid "Send"
165msgstr ""
169msgstr ""
166
170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168msgid "Comments:"
172msgid "Comments:"
169msgstr ""
173msgstr ""
170
174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "음악"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr ""
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212msgid "Emergency Call"
176msgid "Emergency Call"
213msgstr ""
177msgstr ""
214
178
@@ -243,13 +207,20 @@ msgstr ""
243
207
244#: Panel/SearchIndicator.qml:27
208#: Panel/SearchIndicator.qml:27
245msgid "Search"
209msgid "Search"
246−msgstr "찾기"
210+msgstr "검색"
247
211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249msgid "Sorry, there is nothing that matches your search."
213msgid "Sorry, there is nothing that matches your search."
250msgstr ""
214msgstr ""
251
215
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
252−#: Shell.qml:429
220+#: Shell.qml:438
253#, qt-format
221#, qt-format
254msgid "Please enter %1"
222msgid "Please enter %1"
255msgstr ""
223msgstr ""
224+
225+#~ msgid "Music"
226+#~ msgstr "음악"
po/ky.po+40−66
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11"PO-Revision-Date: 2013-06-27 06:17+0000\n"
11"PO-Revision-Date: 2013-06-27 06:17+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Kirghiz <ky@li.org>\n"
13"Language-Team: Kirghiz <ky@li.org>\n"
@@ -15,8 +15,8 @@ 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: 2013-08-30 05:37+0000\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
19+"X-Generator: Launchpad (build 16799)\n"
20
20
21#: Applications/applications.js:23
21#: Applications/applications.js:23
22msgid "Phone"
22msgid "Phone"
@@ -86,129 +86,93 @@ msgstr ""
86msgid "YouTube"
86msgid "YouTube"
87msgstr ""
87msgstr ""
88
88
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
90msgid "Skip intro"
90msgid "Skip intro"
91msgstr ""
91msgstr ""
92
92
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
94msgid "Right edge"
94msgid "Right edge"
95msgstr ""
95msgstr ""
96
96
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
98msgid "Try swiping from the right edge to unlock the phone"
98msgid "Try swiping from the right edge to unlock the phone"
99msgstr ""
99msgstr ""
100
100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102msgid "Top edge"
102msgid "Top edge"
103msgstr ""
103msgstr ""
104
104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106msgid "Try swiping from the top edge to access the indicators"
106msgid "Try swiping from the top edge to access the indicators"
107msgstr ""
107msgstr ""
108
108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110msgid "Close"
110msgid "Close"
111msgstr ""
111msgstr ""
112
112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114msgid "Swipe up again to close the settings screen"
114msgid "Swipe up again to close the settings screen"
115msgstr ""
115msgstr ""
116
116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118msgid "Left edge"
118msgid "Left edge"
119msgstr ""
119msgstr ""
120
120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123msgstr ""
123msgstr ""
124
124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126msgid "Well done"
126msgid "Well done"
127msgstr ""
127msgstr ""
128
128
129−#: Components/EdgeDemo.qml:218
129+#: Components/EdgeDemo.qml:227
130+msgid ""
130−msgid "You have now mastered the edge gestures and can start using the phone"
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131msgstr ""
133msgstr ""
132
134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134msgid "Recent searches"
136msgid "Recent searches"
135msgstr "Соңку издөөлөр"
137msgstr "Соңку издөөлөр"
136
138
137#. TRANSLATORS: Number of persons who rated this app
139#. TRANSLATORS: Number of persons who rated this app
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
138−#: Dash/Apps/AppInfo.qml:73
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139#, qt-format
142#, qt-format
140msgid "(%1)"
143msgid "(%1)"
141msgstr ""
144msgstr ""
142
145
143#. TRANSLATORS: Number of persons who wrote reviews for this app
146#. TRANSLATORS: Number of persons who wrote reviews for this app
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
144−#: Dash/Apps/AppInfo.qml:85
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145#, qt-format
149#, qt-format
146msgid "%1 review"
150msgid "%1 review"
147msgid_plural "%1 reviews"
151msgid_plural "%1 reviews"
148msgstr[0] ""
152msgstr[0] ""
149msgstr[1] ""
153msgstr[1] ""
150
154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152msgid "Rate this"
156msgid "Rate this"
153msgstr ""
157msgstr ""
154
158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156msgid "Add a review"
160msgid "Add a review"
157msgstr ""
161msgstr ""
158
162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160msgid "Review"
164msgid "Review"
161msgstr ""
165msgstr ""
162
166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164msgid "Send"
168msgid "Send"
165msgstr ""
169msgstr ""
166
170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168msgid "Comments:"
172msgid "Comments:"
169msgstr ""
173msgstr ""
170
174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Музыка"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Видеолор"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212msgid "Emergency Call"
176msgid "Emergency Call"
213msgstr ""
177msgstr ""
214
178
@@ -245,11 +209,21 @@ msgstr "Сүйлөнүүдө..."
245msgid "Search"
209msgid "Search"
246msgstr "Издөө"
210msgstr "Издөө"
247
211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249msgid "Sorry, there is nothing that matches your search."
213msgid "Sorry, there is nothing that matches your search."
250msgstr "Тилекке каршы, сиздин издөөңүзгө эч нерсе дал келген жок."
214msgstr "Тилекке каршы, сиздин издөөңүзгө эч нерсе дал келген жок."
251
215
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
252−#: Shell.qml:429
220+#: Shell.qml:438
253#, qt-format
221#, qt-format
254msgid "Please enter %1"
222msgid "Please enter %1"
255msgstr ""
223msgstr ""
224+
225+#~ msgid "Music"
226+#~ msgstr "Музыка"
227+
228+#~ msgid "Videos"
229+#~ msgstr "Видеолор"
po/lo.ponew file+229
@@ -0,0 +1,229 @@
1+# Lao translation for unity8
2+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11+"PO-Revision-Date: 2013-10-02 10:00+0000\n"
12+"Last-Translator: Anousak <anousak@gmail.com>\n"
13+"Language-Team: Lao <lo@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=1; plural=0;\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
20+
21+#: Applications/applications.js:23
22+msgid "Phone"
23+msgstr "ໂທລະສັບ"
24+
25+#: Applications/applications.js:29
26+msgid "Camera"
27+msgstr "ກ້ອງ"
28+
29+#: Applications/applications.js:35
30+msgid "Gallery"
31+msgstr "Gallery"
32+
33+#: Applications/applications.js:40
34+msgid "Facebook"
35+msgstr "Facebook"
36+
37+#: Applications/applications.js:46
38+msgid "Browser"
39+msgstr "ບາວເຊິ"
40+
41+#: Applications/applications.js:51
42+msgid "Twitter"
43+msgstr "Twitter"
44+
45+#: Applications/applications.js:57
46+msgid "GMail"
47+msgstr "GMail"
48+
49+#: Applications/applications.js:62
50+msgid "Weather"
51+msgstr "ສະພາບອາກາດ"
52+
53+#: Applications/applications.js:68
54+msgid "Notepad"
55+msgstr "Noetpad"
56+
57+#: Applications/applications.js:74
58+msgid "Calendar"
59+msgstr "ປະຕິທິນ"
60+
61+#: Applications/applications.js:80
62+msgid "Media Player"
63+msgstr ""
64+
65+#: Applications/applications.js:86
66+msgid "Evernote"
67+msgstr ""
68+
69+#: Applications/applications.js:91
70+msgid "Map"
71+msgstr "ເເຜນທີ່"
72+
73+#: Applications/applications.js:96
74+msgid "Pinterest"
75+msgstr ""
76+
77+#: Applications/applications.js:101
78+msgid "SoundCloud"
79+msgstr ""
80+
81+#: Applications/applications.js:106
82+msgid "Wikipedia"
83+msgstr ""
84+
85+#: Applications/applications.js:111
86+msgid "YouTube"
87+msgstr "ິYouTube"
88+
89+#: Components/EdgeDemoOverlay.qml:149
90+msgid "Skip intro"
91+msgstr ""
92+
93+#: Components/EdgeDemo.qml:112
94+msgid "Right edge"
95+msgstr ""
96+
97+#: Components/EdgeDemo.qml:113
98+msgid "Try swiping from the right edge to unlock the phone"
99+msgstr ""
100+
101+#: Components/EdgeDemo.qml:144
102+msgid "Top edge"
103+msgstr ""
104+
105+#: Components/EdgeDemo.qml:145
106+msgid "Try swiping from the top edge to access the indicators"
107+msgstr ""
108+
109+#: Components/EdgeDemo.qml:170
110+msgid "Close"
111+msgstr "ປິດ"
112+
113+#: Components/EdgeDemo.qml:171
114+msgid "Swipe up again to close the settings screen"
115+msgstr ""
116+
117+#: Components/EdgeDemo.qml:198
118+msgid "Left edge"
119+msgstr ""
120+
121+#: Components/EdgeDemo.qml:199
122+msgid "Swipe from the left to reveal the launcher for quick access to apps"
123+msgstr ""
124+
125+#: Components/EdgeDemo.qml:226
126+msgid "Well done"
127+msgstr "ດີຫຼາຍ"
128+
129+#: Components/EdgeDemo.qml:227
130+msgid ""
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
133+msgstr ""
134+
135+#: Components/PageHeader.qml:341
136+msgid "Recent searches"
137+msgstr ""
138+
139+#. TRANSLATORS: Number of persons who rated this app
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
142+#, qt-format
143+msgid "(%1)"
144+msgstr "(%1)"
145+
146+#. TRANSLATORS: Number of persons who wrote reviews for this app
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
149+#, qt-format
150+msgid "%1 review"
151+msgid_plural "%1 reviews"
152+msgstr[0] ""
153+msgstr[1] ""
154+
155+#: Dash/Apps/AppPreview.qml:126
156+msgid "Rate this"
157+msgstr ""
158+
159+#: Dash/Previews/Reviews.qml:74
160+msgid "Add a review"
161+msgstr ""
162+
163+#: Dash/Previews/Reviews.qml:86
164+msgid "Review"
165+msgstr ""
166+
167+#: Dash/Previews/Reviews.qml:121
168+msgid "Send"
169+msgstr "ສົ່ງ"
170+
171+#: Dash/Previews/Reviews.qml:139
172+msgid "Comments:"
173+msgstr "ຄໍ່ເຫັນ"
174+
175+#: Greeter/Lockscreen.qml:142
176+msgid "Emergency Call"
177+msgstr ""
178+
179+#: Greeter/PassphraseLockscreen.qml:59
180+#, qt-format
181+msgid "Hello %1"
182+msgstr "ສະບາຍດີ %1"
183+
184+#: Greeter/PassphraseLockscreen.qml:59
185+msgid "Hello"
186+msgstr "ສະບາຍດີ"
187+
188+#: Hud/HudParametrizedActionsPage.qml:132
189+msgid "Confirm"
190+msgstr "ຢືນຢັນ"
191+
192+#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
193+msgid "Type or say a command"
194+msgstr ""
195+
196+#: Hud/Hud.qml:84
197+msgid "Loading. Please Wait..."
198+msgstr ""
199+
200+#: Hud/Hud.qml:89
201+msgid "Speak Now..."
202+msgstr "ເວົ້າໂລດ"
203+
204+#: Hud/Hud.qml:94
205+msgid "Speaking..."
206+msgstr "ກໍາລັງເວົ້າ"
207+
208+#: Panel/SearchIndicator.qml:27
209+msgid "Search"
210+msgstr "ຊອກຫາ"
211+
212+#: plugins/Unity/scope.cpp:398
213+msgid "Sorry, there is nothing that matches your search."
214+msgstr ""
215+
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr "ທັງໝົດ"
219+
220+#: Shell.qml:438
221+#, qt-format
222+msgid "Please enter %1"
223+msgstr "ກະລູນາປ້ອນ %1"
224+
225+#~ msgid "Videos"
226+#~ msgstr "ວິດີໂອ"
227+
228+#~ msgid "Music"
229+#~ msgstr "ດົນຕີ"
po/lv.po+59−85
@@ -7,60 +7,60 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11−"PO-Revision-Date: 2013-06-27 06:31+0000\n"
11+"PO-Revision-Date: 2013-09-28 16:29+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12+"Last-Translator: Jānis-Marks Gailis <jeanmarc.gailis@gmail.com>\n"
13"Language-Team: Latvian <lv@li.org>\n"
13"Language-Team: Latvian <lv@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=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
19+"X-Generator: Launchpad (build 16799)\n"
20
20
21#: Applications/applications.js:23
21#: Applications/applications.js:23
22msgid "Phone"
22msgid "Phone"
23−msgstr ""
23+msgstr "Tālrunis"
24
24
25#: Applications/applications.js:29
25#: Applications/applications.js:29
26msgid "Camera"
26msgid "Camera"
27−msgstr ""
27+msgstr "Fotokamera"
28
28
29#: Applications/applications.js:35
29#: Applications/applications.js:35
30msgid "Gallery"
30msgid "Gallery"
31−msgstr ""
31+msgstr "Galerija"
32
32
33#: Applications/applications.js:40
33#: Applications/applications.js:40
34msgid "Facebook"
34msgid "Facebook"
35−msgstr ""
35+msgstr "Facebook"
36
36
37#: Applications/applications.js:46
37#: Applications/applications.js:46
38msgid "Browser"
38msgid "Browser"
39−msgstr ""
39+msgstr "Pārlūkprogramma"
40
40
41#: Applications/applications.js:51
41#: Applications/applications.js:51
42msgid "Twitter"
42msgid "Twitter"
43−msgstr ""
43+msgstr "Twitter"
44
44
45#: Applications/applications.js:57
45#: Applications/applications.js:57
46msgid "GMail"
46msgid "GMail"
47−msgstr ""
47+msgstr "GMail"
48
48
49#: Applications/applications.js:62
49#: Applications/applications.js:62
50msgid "Weather"
50msgid "Weather"
51−msgstr ""
51+msgstr "Laikapstākļi"
52
52
53#: Applications/applications.js:68
53#: Applications/applications.js:68
54msgid "Notepad"
54msgid "Notepad"
55−msgstr ""
55+msgstr "Bloknots"
56
56
57#: Applications/applications.js:74
57#: Applications/applications.js:74
58msgid "Calendar"
58msgid "Calendar"
59−msgstr ""
59+msgstr "Kalendārs"
60
60
61#: Applications/applications.js:80
61#: Applications/applications.js:80
62msgid "Media Player"
62msgid "Media Player"
63−msgstr ""
63+msgstr "Mēdiju Atskaņotājs"
64
64
65#: Applications/applications.js:86
65#: Applications/applications.js:86
66msgid "Evernote"
66msgid "Evernote"
@@ -68,147 +68,111 @@ msgstr ""
68
68
69#: Applications/applications.js:91
69#: Applications/applications.js:91
70msgid "Map"
70msgid "Map"
71−msgstr ""
71+msgstr "Karte"
72
72
73#: Applications/applications.js:96
73#: Applications/applications.js:96
74msgid "Pinterest"
74msgid "Pinterest"
75−msgstr ""
75+msgstr "Pinterest"
76
76
77#: Applications/applications.js:101
77#: Applications/applications.js:101
78msgid "SoundCloud"
78msgid "SoundCloud"
79−msgstr ""
79+msgstr "SoundCloud"
80
80
81#: Applications/applications.js:106
81#: Applications/applications.js:106
82msgid "Wikipedia"
82msgid "Wikipedia"
83−msgstr ""
83+msgstr "Vikipēdija"
84
84
85#: Applications/applications.js:111
85#: Applications/applications.js:111
86msgid "YouTube"
86msgid "YouTube"
87−msgstr ""
87+msgstr "YouTube"
88
88
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
90msgid "Skip intro"
90msgid "Skip intro"
91msgstr ""
91msgstr ""
92
92
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
94msgid "Right edge"
94msgid "Right edge"
95−msgstr ""
95+msgstr "Labā mala"
96
96
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
98msgid "Try swiping from the right edge to unlock the phone"
98msgid "Try swiping from the right edge to unlock the phone"
99msgstr ""
99msgstr ""
100
100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102msgid "Top edge"
102msgid "Top edge"
103msgstr ""
103msgstr ""
104
104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106msgid "Try swiping from the top edge to access the indicators"
106msgid "Try swiping from the top edge to access the indicators"
107msgstr ""
107msgstr ""
108
108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110msgid "Close"
110msgid "Close"
111msgstr ""
111msgstr ""
112
112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114msgid "Swipe up again to close the settings screen"
114msgid "Swipe up again to close the settings screen"
115msgstr ""
115msgstr ""
116
116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118msgid "Left edge"
118msgid "Left edge"
119msgstr ""
119msgstr ""
120
120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123msgstr ""
123msgstr ""
124
124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126msgid "Well done"
126msgid "Well done"
127msgstr ""
127msgstr ""
128
128
129−#: Components/EdgeDemo.qml:218
129+#: Components/EdgeDemo.qml:227
130+msgid ""
130−msgid "You have now mastered the edge gestures and can start using the phone"
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131msgstr ""
133msgstr ""
132
134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134msgid "Recent searches"
136msgid "Recent searches"
135msgstr "Nesen veiktās meklēšanas"
137msgstr "Nesen veiktās meklēšanas"
136
138
137#. TRANSLATORS: Number of persons who rated this app
139#. TRANSLATORS: Number of persons who rated this app
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
138−#: Dash/Apps/AppInfo.qml:73
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139#, qt-format
142#, qt-format
140msgid "(%1)"
143msgid "(%1)"
141msgstr ""
144msgstr ""
142
145
143#. TRANSLATORS: Number of persons who wrote reviews for this app
146#. TRANSLATORS: Number of persons who wrote reviews for this app
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
144−#: Dash/Apps/AppInfo.qml:85
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145#, qt-format
149#, qt-format
146msgid "%1 review"
150msgid "%1 review"
147msgid_plural "%1 reviews"
151msgid_plural "%1 reviews"
148msgstr[0] ""
152msgstr[0] ""
149msgstr[1] ""
153msgstr[1] ""
150
154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152msgid "Rate this"
156msgid "Rate this"
153msgstr ""
157msgstr ""
154
158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156msgid "Add a review"
160msgid "Add a review"
157msgstr ""
161msgstr ""
158
162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160msgid "Review"
164msgid "Review"
161msgstr ""
165msgstr ""
162
166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164msgid "Send"
168msgid "Send"
165msgstr ""
169msgstr ""
166
170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168msgid "Comments:"
172msgid "Comments:"
169msgstr ""
173msgstr ""
170
174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Mūzika"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Video"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212msgid "Emergency Call"
176msgid "Emergency Call"
213msgstr ""
177msgstr ""
214
178
@@ -245,11 +209,21 @@ msgstr "Runa..."
245msgid "Search"
209msgid "Search"
246msgstr "Meklēt"
210msgstr "Meklēt"
247
211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249msgid "Sorry, there is nothing that matches your search."
213msgid "Sorry, there is nothing that matches your search."
250msgstr "Diemžēl nekas neatbilst jūsu meklētajam."
214msgstr "Diemžēl nekas neatbilst jūsu meklētajam."
251
215
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
252−#: Shell.qml:429
220+#: Shell.qml:438
253#, qt-format
221#, qt-format
254msgid "Please enter %1"
222msgid "Please enter %1"
255msgstr ""
223msgstr ""
224+
225+#~ msgid "Music"
226+#~ msgstr "Mūzika"
227+
228+#~ msgid "Videos"
229+#~ msgstr "Video"
po/my.po+78−95
@@ -7,208 +7,172 @@ msgid ""
7msgstr ""
7msgstr ""
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: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11−"PO-Revision-Date: 2013-06-27 06:47+0000\n"
11+"PO-Revision-Date: 2013-10-09 11:35+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12+"Last-Translator: Pyae Sone <Unknown>\n"
13"Language-Team: Burmese <my@li.org>\n"
13"Language-Team: Burmese <my@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=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
19+"X-Generator: Launchpad (build 16799)\n"
20
20
21#: Applications/applications.js:23
21#: Applications/applications.js:23
22msgid "Phone"
22msgid "Phone"
23−msgstr ""
23+msgstr "ဖုန်း"
24
24
25#: Applications/applications.js:29
25#: Applications/applications.js:29
26msgid "Camera"
26msgid "Camera"
27−msgstr ""
27+msgstr "ကင်မရာ"
28
28
29#: Applications/applications.js:35
29#: Applications/applications.js:35
30msgid "Gallery"
30msgid "Gallery"
31−msgstr ""
31+msgstr "ဓာတ်ပုံသိမ်းထားသည့်နေရာ"
32
32
33#: Applications/applications.js:40
33#: Applications/applications.js:40
34msgid "Facebook"
34msgid "Facebook"
35−msgstr ""
35+msgstr "Facebook"
36
36
37#: Applications/applications.js:46
37#: Applications/applications.js:46
38msgid "Browser"
38msgid "Browser"
39−msgstr ""
39+msgstr "Browser"
40
40
41#: Applications/applications.js:51
41#: Applications/applications.js:51
42msgid "Twitter"
42msgid "Twitter"
43−msgstr ""
43+msgstr "Twitter"
44
44
45#: Applications/applications.js:57
45#: Applications/applications.js:57
46msgid "GMail"
46msgid "GMail"
47−msgstr ""
47+msgstr "ဂျီမေးလ်"
48
48
49#: Applications/applications.js:62
49#: Applications/applications.js:62
50msgid "Weather"
50msgid "Weather"
51−msgstr ""
51+msgstr "ရာသီဥတု"
52
52
53#: Applications/applications.js:68
53#: Applications/applications.js:68
54msgid "Notepad"
54msgid "Notepad"
55−msgstr ""
55+msgstr "Notepad"
56
56
57#: Applications/applications.js:74
57#: Applications/applications.js:74
58msgid "Calendar"
58msgid "Calendar"
59−msgstr ""
59+msgstr "ပြက္ခဒိန်"
60
60
61#: Applications/applications.js:80
61#: Applications/applications.js:80
62msgid "Media Player"
62msgid "Media Player"
63−msgstr ""
63+msgstr "မီဒီယာဖွင့်စက်"
64
64
65#: Applications/applications.js:86
65#: Applications/applications.js:86
66msgid "Evernote"
66msgid "Evernote"
67−msgstr ""
67+msgstr "Evernote"
68
68
69#: Applications/applications.js:91
69#: Applications/applications.js:91
70msgid "Map"
70msgid "Map"
71−msgstr ""
71+msgstr "မြေပုံ"
72
72
73#: Applications/applications.js:96
73#: Applications/applications.js:96
74msgid "Pinterest"
74msgid "Pinterest"
75−msgstr ""
75+msgstr "Pinterest"
76
76
77#: Applications/applications.js:101
77#: Applications/applications.js:101
78msgid "SoundCloud"
78msgid "SoundCloud"
79−msgstr ""
79+msgstr "SoundCloud"
80
80
81#: Applications/applications.js:106
81#: Applications/applications.js:106
82msgid "Wikipedia"
82msgid "Wikipedia"
83−msgstr ""
83+msgstr "ဝီကီပီဒီးယား"
84
84
85#: Applications/applications.js:111
85#: Applications/applications.js:111
86msgid "YouTube"
86msgid "YouTube"
87−msgstr ""
87+msgstr "YouTube"
88
88
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
90msgid "Skip intro"
90msgid "Skip intro"
91−msgstr ""
91+msgstr "မိတ်ဆက်ကိုကျော်မည်"
92
92
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
94msgid "Right edge"
94msgid "Right edge"
95−msgstr ""
95+msgstr "ညာဖက် အစွန်း"
96
96
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
98msgid "Try swiping from the right edge to unlock the phone"
98msgid "Try swiping from the right edge to unlock the phone"
99msgstr ""
99msgstr ""
100
100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102msgid "Top edge"
102msgid "Top edge"
103−msgstr ""
103+msgstr "ထိပ် အစွန်း"
104
104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106msgid "Try swiping from the top edge to access the indicators"
106msgid "Try swiping from the top edge to access the indicators"
107msgstr ""
107msgstr ""
108
108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110msgid "Close"
110msgid "Close"
111−msgstr ""
111+msgstr "ပိတ်"
112
112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114msgid "Swipe up again to close the settings screen"
114msgid "Swipe up again to close the settings screen"
115msgstr ""
115msgstr ""
116
116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118msgid "Left edge"
118msgid "Left edge"
119−msgstr ""
119+msgstr "ဘယ်​ဖက် အစွန်း"
120
120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123msgstr ""
123msgstr ""
124
124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126msgid "Well done"
126msgid "Well done"
127−msgstr ""
127+msgstr "ကောင်းအောင်ပြုလုပ်ခဲ့သည်"
128
128
129−#: Components/EdgeDemo.qml:218
129+#: Components/EdgeDemo.qml:227
130+msgid ""
130−msgid "You have now mastered the edge gestures and can start using the phone"
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131msgstr ""
133msgstr ""
132
134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134msgid "Recent searches"
136msgid "Recent searches"
135msgstr "မကြာသေးခင်က ရှာဖွေခြင်း"
137msgstr "မကြာသေးခင်က ရှာဖွေခြင်း"
136
138
137#. TRANSLATORS: Number of persons who rated this app
139#. TRANSLATORS: Number of persons who rated this app
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
138−#: Dash/Apps/AppInfo.qml:73
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139#, qt-format
142#, qt-format
140msgid "(%1)"
143msgid "(%1)"
141−msgstr ""
144+msgstr "(%1)"
142
145
143#. TRANSLATORS: Number of persons who wrote reviews for this app
146#. TRANSLATORS: Number of persons who wrote reviews for this app
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
144−#: Dash/Apps/AppInfo.qml:85
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145#, qt-format
149#, qt-format
146msgid "%1 review"
150msgid "%1 review"
147msgid_plural "%1 reviews"
151msgid_plural "%1 reviews"
148msgstr[0] ""
152msgstr[0] ""
149msgstr[1] ""
153msgstr[1] ""
150
154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152msgid "Rate this"
156msgid "Rate this"
153−msgstr ""
157+msgstr "ဒီဟာကိုအမှတ်ပေးမည်"
154
158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156msgid "Add a review"
160msgid "Add a review"
157msgstr ""
161msgstr ""
158
162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160msgid "Review"
164msgid "Review"
161msgstr ""
165msgstr ""
162
166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164msgid "Send"
168msgid "Send"
165−msgstr ""
169+msgstr "ပို့မည်"
166
170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168msgid "Comments:"
172msgid "Comments:"
169−msgstr ""
173+msgstr "မှတ်ချက်များ-"
170−
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "တေးဂီတ"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "ဗီဒီယိုများ"
198
174
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212msgid "Emergency Call"
176msgid "Emergency Call"
213msgstr ""
177msgstr ""
214
178
@@ -245,11 +209,30 @@ msgstr "ပြောနေသည်"
245msgid "Search"
209msgid "Search"
246msgstr "ရှာဖွေ"
210msgstr "ရှာဖွေ"
247
211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249msgid "Sorry, there is nothing that matches your search."
213msgid "Sorry, there is nothing that matches your search."
250msgstr "ဆောရီး၊ သင်၏ရှာဖွေမူနှင့်တူညီတာဘာမှမရှိပါ။"
214msgstr "ဆောရီး၊ သင်၏ရှာဖွေမူနှင့်တူညီတာဘာမှမရှိပါ။"
251
215
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
252−#: Shell.qml:429
220+#: Shell.qml:438
253#, qt-format
221#, qt-format
254msgid "Please enter %1"
222msgid "Please enter %1"
255msgstr ""
223msgstr ""
224+
225+#~ msgid "Music"
226+#~ msgstr "တေးဂီတ"
227+
228+#~ msgid "Videos"
229+#~ msgstr "ဗီဒီယိုများ"
230+
231+#~ msgid "New Releases"
232+#~ msgstr "အသစ်ထွက်ရှိသော"
233+
234+#~ msgid "Recent"
235+#~ msgstr "မကြာသေးခင်က"
236+
237+#~ msgid "Popular Online"
238+#~ msgstr "အွန်လိုင်းတွင်ပေါ်ပြူလာဖြစ်သော"
po/nb.po+40−66

This diff is too big to show here.

po/nl.po+40−66

This diff is too big to show here.

po/pl.po+59−86

This diff is too big to show here.

po/pt_BR.po+97−106

This diff is too big to show here.

po/ro.po+40−66

This diff is too big to show here.

po/ru.po+81−88

This diff is too big to show here.

po/shn.ponew file+223

This diff is too big to show here.

po/si.po+34−66

This diff is too big to show here.

po/sl.po+58−68

This diff is too big to show here.

po/sr.po+40−66

This diff is too big to show here.

po/sv.po+34−66

This diff is too big to show here.

po/te.po+37−66

This diff is too big to show here.

po/tr.po+81−91

This diff is too big to show here.

po/ug.po+61−79

This diff is too big to show here.

po/uk.po+78−85

This diff is too big to show here.

po/unity8.pot+32−64

This diff is too big to show here.

po/xh.ponew file+223

This diff is too big to show here.

po/zh_CN.po+57−68

This diff is too big to show here.

po/zh_TW.po+40−66

This diff is too big to show here.

run_on_device+1−1

This diff is too big to show here.

src/Panel/Indicators/CMakeLists.txt−1

This diff is too big to show here.

src/Panel/Indicators/servicefiles/CMakeLists.txtdeleted−14

This diff is too big to show here.

src/Panel/Indicators/servicefiles/com.canonical.indicator.messagesdeleted−10

This diff is too big to show here.

tests/autopilot/unity8/application_lifecycle/tests/test_application_lifecycle.py−3

This diff is too big to show here.

tests/autopilot/unity8/indicators_client/__init__.pydeleted−8

This diff is too big to show here.

tests/autopilot/unity8/indicators_client/emulators/__init__.pydeleted−31

This diff is too big to show here.

tests/autopilot/unity8/indicators_client/emulators/common.pydeleted−14

This diff is too big to show here.

tests/autopilot/unity8/indicators_client/emulators/main_window.pydeleted−27

This diff is too big to show here.

tests/autopilot/unity8/indicators_client/tests/__init__.pydeleted−91

This diff is too big to show here.

tests/autopilot/unity8/indicators_client/tests/test_battery.pydeleted−114

This diff is too big to show here.

tests/autopilot/unity8/shell/__init__.py+14

This diff is too big to show here.

tests/autopilot/unity8/shell/emulators/dash.py+15−6

This diff is too big to show here.

tests/autopilot/unity8/shell/emulators/hud.py+8−9

This diff is too big to show here.

tests/autopilot/unity8/shell/emulators/main_window.py+3

This diff is too big to show here.

tests/autopilot/unity8/shell/tests/__init__.py+140−14

This diff is too big to show here.

tests/autopilot/unity8/shell/tests/test_hud.py+43−8

This diff is too big to show here.

tests/mocks/AccountsService/AccountsService.cpp+13−1

This diff is too big to show here.

tests/mocks/AccountsService/AccountsService.h+8

This diff is too big to show here.

plugins/Unity/Indicators/Network/plugin.cpp → tests/mocks/QMenuModel/UnityMenuModel.qmlrenamed+9−14

This diff is too big to show here.

tests/mocks/QMenuModel/qmldir+1

This diff is too big to show here.

tests/mocks/SessionManager/SessionManager.cpp+12−2

This diff is too big to show here.

tests/mocks/SessionManager/SessionManager.h+9−1

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationInfo.h+1

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationManager.h+1

This diff is too big to show here.

tests/mocks/Unity/Indicators/CMakeLists.txt+1−1

This diff is too big to show here.

Panel/Indicators/MessagingIndicatorWidget.qml → tests/mocks/Unity/Indicators/CachedUnityMenuModel.qmlrenamed+8−3

This diff is too big to show here.

tests/mocks/Unity/Indicators/IndicatorsModel.qml+5−15

This diff is too big to show here.

Panel/Indicators/SoundIndicatorWidget.qml → tests/mocks/Unity/Indicators/RootActionState.qmlrenamed+11−4

This diff is too big to show here.

tests/mocks/Unity/Indicators/qmldir+2

This diff is too big to show here.

tests/mocks/Unity/fake_applications_scope.cpp+7

This diff is too big to show here.

tests/mocks/Unity/fake_categories.cpp+6

This diff is too big to show here.

tests/mocks/Unity/fake_categories.h+1

This diff is too big to show here.

tests/mocks/Unity/fake_preview.cpp+2−5

This diff is too big to show here.

tests/mocks/Unity/fake_preview.h−2

This diff is too big to show here.

tests/mocks/Unity/fake_scope.cpp+26

This diff is too big to show here.

tests/mocks/Unity/fake_scope.h+10−1

This diff is too big to show here.

tests/mocks/libusermetrics/UserMetrics.cpp+6−2

This diff is too big to show here.

tests/plugins/ListViewWithPageHeader/listviewwithpageheadertest.cpp+124

This diff is too big to show here.

tests/plugins/Unity/CMakeLists.txt+1−1

This diff is too big to show here.

tests/plugins/Unity/Indicators/CMakeLists.txt+5

This diff is too big to show here.

tests/plugins/Unity/Indicators/indicatorsmodeltest.cpp−15

This diff is too big to show here.

tests/plugins/Unity/Indicators/rootactionstatetest.cppnew file+58

This diff is too big to show here.

tests/plugins/Unity/Launcher/launcherbackendtest.cpp+2−23

This diff is too big to show here.

tests/plugins/Unity/previewbindingstest.cpp+27

This diff is too big to show here.

tests/plugins/Unity/resultstest.cpp+100−9

This diff is too big to show here.

tests/plugins/Unity/resultstest.h+2

This diff is too big to show here.

tests/qmltests/CMakeLists.txt+6−4

This diff is too big to show here.

tests/qmltests/Components/tst_LazyImage.qmlnew file+185

This diff is too big to show here.

tests/qmltests/Components/tst_LazyImage/ImageControls.qmlnew file+67

This diff is too big to show here.

tests/qmltests/Components/tst_LazyImage/portrait.pngnew file

Binary file not shown.

tests/qmltests/Components/tst_LazyImage/square.pngnew file

Binary file not shown.

tests/qmltests/Components/tst_LazyImage/wide.pngnew file

Binary file not shown.

tests/qmltests/Components/tst_PageHeader.qml+28

This diff is too big to show here.

tests/qmltests/Components/tst_Showable.qml+27

This diff is too big to show here.

tests/qmltests/Dash/Apps/tst_AppPreview.qml+60−24

This diff is too big to show here.

tests/qmltests/Dash/Apps/tst_RunningApplicationsGrid.qml+24−4

This diff is too big to show here.

tests/qmltests/Dash/Movie/tst_MoviePreview.qmlnew file+85

This diff is too big to show here.

tests/qmltests/Dash/Video/tst_VideoPreview.qmldeleted−63

This diff is too big to show here.

tests/qmltests/Dash/qml/FakeScopeView.qml+3−9

This diff is too big to show here.

tests/qmltests/Dash/tst_DashContent.qml+29−5

This diff is too big to show here.

tests/qmltests/Dash/tst_DashPreview.qml+66−19

This diff is too big to show here.

tests/qmltests/Dash/tst_FilterGrids.qml+1−1

This diff is too big to show here.

tests/qmltests/Dash/tst_GenericPreview.qmlnew file+116

This diff is too big to show here.

tests/qmltests/Greeter/tst_Clock.qml+8−22

This diff is too big to show here.

tests/qmltests/Greeter/tst_Infographics.qml+4−4

This diff is too big to show here.

tests/qmltests/Greeter/tst_Phone.qml+16

This diff is too big to show here.

tests/qmltests/Notifications/tst_Notifications.qml+7−2

This diff is too big to show here.

tests/qmltests/Panel/tst_IndicatorRow.qml+3−3

This diff is too big to show here.

tests/qmltests/tst_GreeterShell.qml+1−1

This diff is too big to show here.

tests/qmltests/tst_Shell.qml+119−1

This diff is too big to show here.