on xenial help sign in
Merge trunk.
86a23ffMichał Sawicz
.bzrignore+1−4
@@ -3,8 +3,5 @@
3# QtCreator project files
3# QtCreator project files
4/*.user
4/*.user
5# Eclipse project files
5# Eclipse project files
6−/.project
7−/.cproject
8−/.settings
6+.settings
9−/.pydevproject
10message.txt
7message.txt
Applications/Application.qmldeleted−54
@@ -1,54 +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.js" as ApplicationsModel
19−import Unity.Application 0.1
20−
21−/* This class is temporary. It is meant to be API compatible with qthybris' Application
22− class.
23− This class can be removed as soon as qthybris' Application is instantiable from QML
24− and its 'desktopFile' property becomes writable.
25− This also requires qthybris to be easily compilable on the desktop.
26−*/
27−QtObject {
28− id: application
29−
30− property string desktopFile
31− property string name
32− property string comment
33− property string icon
34− property string exec
35− property string stage
36− property bool fullscreen
37−
38− onDesktopFileChanged: {
39− var applicationData = ApplicationsModel.__availableApplications[desktopFile];
40− if (applicationData) {
41− application.name = applicationData.name;
42− application.icon = applicationData.icon;
43− application.exec = applicationData.exec;
44− application.stage = applicationData.stage ? applicationData.stage : ApplicationInfo.MainStage;
45− application.fullscreen = applicationData.fullscreen ? applicationData.fullscreen : false;
46− } else {
47− application.name = "";
48− application.icon = "";
49− application.exec = "";
50− application.stage = "";
51− application.fullscreen = false;
52− }
53− }
54−}
Applications/applications.jsdeleted−115
@@ -1,115 +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−// mimic qtubuntu's Application.Stage enum
18−var MainStage = 0;
19−var SideStage = 1;
20−
21−var __availableApplications = {
22− '/usr/share/applications/phone-app.desktop': {
23− 'name': i18n.tr("Phone"),
24− 'icon': 'phone-app',
25− 'exec': '/usr/bin/phone-app',
26− 'stage': SideStage
27− },
28− '/usr/share/applications/camera-app.desktop': {
29− 'name': i18n.tr("Camera"),
30− 'icon': 'camera',
31− 'fullscreen': true,
32− 'exec': '/usr/bin/camera-app --fullscreen'
33− },
34− '/usr/share/applications/gallery-app.desktop': {
35− 'name': i18n.tr("Gallery"),
36− 'icon': 'gallery',
37− 'exec': '/usr/bin/gallery-app'
38− },
39− '/usr/share/applications/facebook-webapp.desktop': {
40− 'name': i18n.tr("Facebook"),
41− 'icon': 'facebook',
42− 'exec': '/usr/bin/webbrowser-app --chromeless http://m.facebook.com',
43− 'stage': SideStage
44− },
45− '/usr/share/applications/webbrowser-app.desktop': {
46− 'name': i18n.tr("Browser"),
47− 'icon': 'browser',
48− 'exec': '/usr/bin/webbrowser-app'
49− },
50− '/usr/share/applications/twitter-webapp.desktop': {
51− 'name': i18n.tr("Twitter"),
52− 'icon': 'twitter',
53− 'exec': '/usr/bin/webbrowser-app --chromeless http://www.twitter.com',
54− 'stage': SideStage
55− },
56− '/usr/share/applications/gmail-webapp.desktop': {
57− 'name': i18n.tr("GMail"),
58− 'icon': 'gmail',
59− 'exec': '/usr/bin/webbrowser-app --chromeless http://m.gmail.com'
60− },
61− '/usr/share/applications/ubuntu-weather-app.desktop': {
62− 'name': i18n.tr("Weather"),
63− 'icon': 'weather',
64− 'exec': '/usr/bin/qmlscene /usr/share/ubuntu-weather-app/ubuntu-weather-app.qml',
65− 'stage': SideStage
66− },
67− '/usr/share/applications/notes-app.desktop': {
68− 'name': i18n.tr("Notepad"),
69− 'icon': 'notepad',
70− 'exec': '/usr/bin/qmlscene /usr/share/notes-app/NotesApp.qml',
71− 'stage': SideStage
72− },
73− '/usr/share/applications/calendar-app.desktop': {
74− 'name': i18n.tr("Calendar"),
75− 'icon': 'calendar',
76− 'exec': '/usr/bin/qmlscene /usr/share/calendar-app/calendar.qml',
77− 'stage': SideStage
78− },
79− '/usr/share/applications/mediaplayer-app.desktop': {
80− 'name': i18n.tr("Media Player"),
81− 'icon': 'mediaplayer-app',
82− 'fullscreen': true,
83− 'exec': '/usr/bin/mediaplayer-app'
84− },
85− '/usr/share/applications/evernote.desktop': {
86− 'name': i18n.tr("Evernote"),
87− 'icon': 'evernote',
88− 'exec': ''
89− },
90− '/usr/share/applications/map.desktop': {
91− 'name': i18n.tr("Map"),
92− 'icon': 'map',
93− 'exec': ''
94− },
95− '/usr/share/applications/pinterest.desktop': {
96− 'name': i18n.tr("Pinterest"),
97− 'icon': 'pinterest',
98− 'exec': ''
99− },
100− '/usr/share/applications/soundcloud.desktop': {
101− 'name': i18n.tr("SoundCloud"),
102− 'icon': 'soundcloud',
103− 'exec': ''
104− },
105− '/usr/share/applications/wikipedia.desktop': {
106− 'name': i18n.tr("Wikipedia"),
107− 'icon': 'wikipedia',
108− 'exec': ''
109− },
110− '/usr/share/applications/youtube.desktop': {
111− 'name': i18n.tr("YouTube"),
112− 'icon': 'youtube',
113− 'exec': ''
114− },
115−}
CMakeLists.txt+13−73
@@ -69,17 +69,6 @@ if(SHELL_PLUGINDIR STREQUAL "")
69 message(FATAL_ERROR "Could not determine plugin import dir.")
69 message(FATAL_ERROR "Could not determine plugin import dir.")
70endif()
70endif()
71
71
72−configure_file(paths.h.in ${CMAKE_CURRENT_BINARY_DIR}/paths.h @ONLY)
73−
74−pkg_check_modules(UNITY-MIR REQUIRED unity-mir)
75−
76−include_directories(
77− ${CMAKE_CURRENT_BINARY_DIR}
78− ${CMAKE_CURRENT_SOURCE_DIR}
79− ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
80− ${UNITY-MIR_INCLUDE_DIRS}
81− )
82−
83set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
72set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
84
73
85set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fno-permissive -pedantic -Wall -Wextra")
74set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fno-permissive -pedantic -Wall -Wextra")
@@ -107,74 +96,25 @@ include(autopilot)
107declare_autopilot_test(shell unity8.shell ${CMAKE_SOURCE_DIR}/tests/autopilot/)
96declare_autopilot_test(shell unity8.shell ${CMAKE_SOURCE_DIR}/tests/autopilot/)
108
97
109set(SHELL_APP unity8)
98set(SHELL_APP unity8)
99+set(SCOPE_TOOL unity-scope-tool)
110
100
111−set(shell_app_HDRS
101+include_directories(
112− )
102+ ${CMAKE_SOURCE_DIR}/include
113−
103+ ${CMAKE_BINARY_DIR}/include
114−add_executable(${SHELL_APP}
115− ${shellapplication_MOC_SRCS}
116− ApplicationArguments.h
117− main.cpp
118− MouseTouchAdaptor.cpp
119− )
120−
121−qt5_use_modules(${SHELL_APP} Qml Quick Test)
122−pkg_check_modules(XCB REQUIRED xcb)
123−
124−if (NOT "${XCB_INCLUDE_DIRS}" STREQUAL "")
125− set_target_properties(${SHELL_APP} PROPERTIES INCLUDE_DIRECTORIES ${XCB_INCLUDE_DIRS})
126−endif()
127−
128−target_link_libraries(${SHELL_APP}
129− ${Qt5Qml_LIBRARIES}
130− ${Qt5Quick_LIBRARIES}
131− ${XCB_LDFLAGS}
132− ${CMAKE_DL_LIBS}
133− )
134−
135−# install binaries
136−install(TARGETS ${SHELL_APP}
137− RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
138− )
139−
140−# install top level qml and js files
141−file(GLOB QML_JS_FILES *.qml *.js)
142−
143−install(FILES ${QML_JS_FILES}
144− DESTINATION ${SHELL_APP_DIR}
145− )
104+)
146
105
147# add subdirectories to build
106# add subdirectories to build
107+add_subdirectory(include)
108+add_subdirectory(src)
109+add_subdirectory(tools)
110+add_subdirectory(qml)
148add_subdirectory(tests)
111add_subdirectory(tests)
149add_subdirectory(plugins)
112add_subdirectory(plugins)
150−add_subdirectory(src)
151
113
152−# install subdirectories
114+#
153−set(QML_DIRS
115+# Data files
154− Applications
116+#
155− Bottombar
117+add_subdirectory(data)
156− Components
157− Dash
158− graphics
159− Greeter
160− Hud
161− Panel
162− Launcher
163− SideStage
164− Notifications
165− )
166−
167−install(DIRECTORY ${QML_DIRS}
168− DESTINATION ${SHELL_APP_DIR}
169− )
170−
171−# generate desktop file
172−configure_file(${SHELL_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop @ONLY)
173−
174−# install desktop file
175−install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop
176− DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
177− )
178
118
179#
119#
180# Translation
120# Translation
CODING+70−2
@@ -1,7 +1,7 @@
1Building Unity 8
1Building Unity 8
2================
2================
3
3
4−Only Ubuntu 13.10 (saucy) is supported as a developement environment.
4+Only Ubuntu 14.04 (trusty) is supported as a developement environment.
5
5
6download source
6download source
7---------------
7---------------
@@ -68,7 +68,7 @@ Notes
68
68
69Running Unity 8 on devices
69Running Unity 8 on devices
70==========================
70==========================
71−- Ubuntu Touch builds are currently only available in 13.10 flavour
71+- Ubuntu Touch builds are currently only available in 14.04 flavour
72- supported hardware should match one of those listed here
72- supported hardware should match one of those listed here
73 https://wiki.ubuntu.com/Touch/Devices#Running_fine
73 https://wiki.ubuntu.com/Touch/Devices#Running_fine
74- follow the Ubuntu Touch install instructions for your chosen device
74- follow the Ubuntu Touch install instructions for your chosen device
@@ -127,3 +127,71 @@ Unity 8.
127If using VIM, make sure you install some syntax highlighting for QML, like
127If using VIM, make sure you install some syntax highlighting for QML, like
128https://github.com/peterhoeg/vim-qml
128https://github.com/peterhoeg/vim-qml
129
129
130+Running tests
131+=============
132+
133+Tests are run from the build directory (which will be ./builddir if you used
134+the ./build script).
135+
136+To run the tests that do not require any graphical capability and therefore
137+are pretty fast run:
138+
139+$ make test
140+
141+or, alternatively:
142+
143+$ ctest
144+
145+To run all graphical tests, which can take a couple of minutes:
146+
147+$ make qmluitests
148+
149+To run the tests for a single component/class:
150+
151+$ make testComponentName
152+
153+So, for the DragHandle component that would be:
154+
155+$ make testDragHandle
156+
157+To run a test application that allow you to manually test or to simply try out
158+a given component:
159+
160+$ make tryComponentName
161+
162+So to try out, for instance, the DragHandle component, you would do:
163+
164+$ make tryDragHandle
165+
166+NB: Manual test or interation doesn't make sense for all components or classes,
167+particularly the non-graphical ones. In such cases no "tryFoo" make target is
168+provided.
169+
170+NB: The tests expect the locale to be the C locale, they may fail if run
171+under a different locale, if you get failures others can not reproduce
172+prepend 'LC_ALL=C' to the 'make test' command
173+
174+Running autopilot tests
175+=======================
176+
177+Autopilot tests are run from the build directory (which will be ./builddir if you used
178+the ./build script).
179+
180+$ make autopilot
181+
182+If you want you can also run tests individually, for that you need to install first,
183+otherwise the tests will run on the system-installed version
184+
185+$ make install
186+
187+To see the list of existing autopilot tests you can do
188+
189+$ PYTHONPATH=../tests/autopilot autopilot list unity8
190+
191+And then run a single test with
192+
193+$ PYTHONPATH=../tests/autopilot autopilot run unity8.some.very.long.test.name
194+
195+or run them all with
196+
197+$ PYTHONPATH=../tests/autopilot autopilot run unity8
Dash/DashContent.qmldeleted−150
@@ -1,150 +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 Unity 0.1
20−
21−Item {
22− id: dashContent
23−
24− property var model: null
25− property var scopes: null
26− property real contentProgress: Math.max(0, Math.min(dashContentList.contentX / (dashContentList.contentWidth - dashContentList.width), units.dp(1)))
27− property alias currentIndex: dashContentList.currentIndex
28−
29− property ScopeDelegateMapper scopeMapper : ScopeDelegateMapper {}
30− property ListModel searchHistory
31−
32− signal movementStarted()
33− signal movementEnded()
34− signal contentFlickStarted()
35− signal contentEndReached()
36− signal previewShown()
37− signal scopeLoaded(string scopeId)
38− signal positionedAtBeginning()
39−
40− // If we set the current scope index before the scopes have been added,
41− // then we need to wait until the loaded signals gets emitted from the scopes
42− property var set_current_index: undefined
43− Connections {
44− target: scopes
45− onLoadedChanged: {
46− if (scopes.loaded && set_current_index != undefined) {
47− setCurrentScopeAtIndex(set_current_index[0], set_current_index[1], set_current_index[2]);
48− set_current_index = undefined;
49− }
50− }
51− }
52−
53− function setCurrentScopeAtIndex(index, animate, reset) {
54− var storedMoveDuration = dashContentList.highlightMoveDuration
55− var storedMoveSpeed = dashContentList.highlightMoveVelocity
56− if (!animate) {
57− dashContentList.highlightMoveVelocity = units.gu(4167)
58− dashContentList.highlightMoveDuration = 0
59− }
60−
61− // if the scopes haven't loaded yet, then wait until they are.
62− if (!scopes.loaded) {
63− set_current_index = [ index, animate, reset ]
64− return;
65− }
66− set_current_index = undefined;
67−
68− if (dashContentList.count > index)
69− {
70− dashContentList.currentIndex = index
71−
72− if (reset) {
73− dashContent.positionedAtBeginning()
74− }
75− }
76−
77− if (!animate) {
78− dashContentList.highlightMoveDuration = storedMoveDuration
79− dashContentList.highlightMoveVelocity = storedMoveSpeed
80− }
81− }
82−
83− ListView {
84− id: dashContentList
85− objectName: "dashContentList"
86−
87− interactive: dashContent.scopes.loaded && !currentItem.previewShown && !currentItem.moving
88−
89− anchors.fill: parent
90− model: dashContent.model
91− orientation: ListView.Horizontal
92− boundsBehavior: Flickable.DragAndOvershootBounds
93− flickDeceleration: units.gu(625)
94− maximumFlickVelocity: width * 5
95− snapMode: ListView.SnapOneItem
96− highlightMoveDuration: 250
97− highlightRangeMode: ListView.StrictlyEnforceRange
98− /* FIXME: workaround rendering issue due to use of ShaderEffectSource in
99− UbuntuShape. While switching from the home scope to the People scope the
100− rendering would block midway.
101− */
102− cacheBuffer: 2147483647
103− onMovementStarted: dashContent.movementStarted()
104− onMovementEnded: dashContent.movementEnded()
105−
106− // If the number of items is less than the current index, then need to reset to another item.
107− onCountChanged: {
108− if (currentIndex >= count)
109− dashContent.setCurrentScopeAtIndex(count-1, true, true)
110− }
111−
112− delegate:
113− Loader {
114− width: ListView.view.width
115− height: ListView.view.height
116− asynchronous: true
117− source: scopeMapper.map(scope.id)
118− objectName: scope.id + " loader"
119−
120− readonly property bool previewShown: item ? item.previewShown : false
121− readonly property bool moving: item ? item.moving : false
122−
123− // these are needed for autopilot tests
124− readonly property string scopeId: scope.id
125− readonly property bool isCurrent: ListView.isCurrentItem
126− readonly property bool isLoaded: status == Loader.Ready
127−
128− onLoaded: {
129− item.scope = Qt.binding(function() { return scope })
130− item.isCurrent = Qt.binding(function() { return visible && ListView.isCurrentItem })
131− item.searchHistory = Qt.binding(function() { return dashContent.searchHistory })
132− dashContentList.movementStarted.connect(item.movementStarted)
133− dashContent.positionedAtBeginning.connect(item.positionedAtBeginning)
134− dashContent.scopeLoaded(item.scope.id)
135− }
136− Connections {
137− target: item
138− ignoreUnknownSignals: true
139− onEndReached: contentEndReached()
140− onPreviewShownChanged: {
141− if (item.previewShown) {
142− dashContent.previewShown()
143− }
144− }
145− }
146−
147− Component.onDestruction: active = false
148− }
149− }
150−}
Notifications/Notification.qmldeleted−295
@@ -1,295 +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 Unity.Notifications 1.0
20−import QMenuModel 0.1
21−import Utils 0.1
22−
23−UbuntuShape {
24− id: notification
25−
26− property alias iconSource: icon.fileSource
27− property alias secondaryIconSource: secondaryIcon.source
28− property alias summary: summaryLabel.text
29− property alias body: bodyLabel.text
30− property var actions
31− property var notificationId
32− property var type
33− property var hints
34− property var notification
35−
36− objectName: "background"
37− implicitHeight: type != Notification.PlaceHolder ? contentColumn.height + contentColumn.spacing * 2 : 0
38− color: Qt.rgba(0.132, 0.117, 0.109, 0.97)
39− opacity: 0
40− radius: "medium"
41−
42− clip: true
43− visible: type != Notification.PlaceHolder
44−
45− UnityMenuModelPaths {
46− id: paths
47−
48− source: hints["x-canonical-private-menu-model"]
49−
50− busNameHint: "busName"
51− actionsHint: "actions"
52− menuObjectPathHint: "menuPath"
53− }
54−
55− UnityMenuModel {
56− id: unityMenuModel
57−
58− busName: paths.busName
59− actions: paths.actions
60− menuObjectPath: paths.menuObjectPath
61− }
62−
63− Behavior on implicitHeight {
64− id: heightBehavior
65−
66− enabled: false
67− UbuntuNumberAnimation {
68− duration: UbuntuAnimation.SnapDuration
69− }
70− }
71−
72− // delay enabling height behavior until the add transition is complete
73− onOpacityChanged: if (opacity == 1) heightBehavior.enabled = true
74−
75− MouseArea {
76− id: interactiveArea
77−
78− anchors.fill: contentColumn
79− objectName: "interactiveArea"
80− enabled: notification.type == Notification.Interactive
81− onClicked: notification.notification.invokeAction(actionRepeater.itemAt(0).actionId)
82− }
83−
84− Column {
85− id: contentColumn
86−
87− anchors {
88− left: parent.left
89− right: parent.right
90− top: parent.top
91− margins: spacing
92− }
93−
94− spacing: units.gu(1)
95−
96− Row {
97− id: topRow
98−
99− spacing: contentColumn.spacing
100− anchors {
101− left: parent.left
102− right: parent.right
103− }
104−
105− ShapedIcon {
106− id: icon
107−
108− objectName: "icon"
109− width: units.gu(6)
110− height: units.gu(6)
111− shaped: notification.hints["x-canonical-non-shaped-icon"] == "true" ? false : true
112− visible: iconSource !== undefined && iconSource != ""
113− }
114−
115− Image {
116− id: secondaryIcon
117−
118− objectName: "secondaryIcon"
119− width: units.gu(2)
120− height: units.gu(2)
121− visible: source !== undefined && source != ""
122− fillMode: Image.PreserveAspectCrop
123− }
124−
125− Column {
126− id: labelColumn
127− width: parent.width - x
128−
129− anchors.verticalCenter: (icon.visible && !bodyLabel.visible) ? icon.verticalCenter : undefined
130−
131− Label {
132− id: summaryLabel
133−
134− objectName: "summaryLabel"
135− anchors {
136− left: parent.left
137− right: parent.right
138− }
139− fontSize: "medium"
140− font.bold: true
141− color: Theme.palette.selected.backgroundText
142− elide: Text.ElideRight
143− }
144−
145− Label {
146− id: bodyLabel
147−
148− objectName: "bodyLabel"
149− anchors {
150− left: parent.left
151− right: parent.right
152− }
153− visible: body != ""
154− fontSize: "small"
155− color: Theme.palette.selected.backgroundText
156− opacity: 0.6
157− wrapMode: Text.WordWrap
158− maximumLineCount: 10
159− elide: Text.ElideRight
160− }
161− }
162− }
163−
164− Column {
165− objectName: "dialogListView"
166− spacing: units.gu(2)
167−
168− visible: count > 0
169−
170− anchors.left: parent.left; anchors.right: parent.right
171−
172− Repeater {
173− model: unityMenuModel
174−
175− NotificationMenuItemFactory {
176− anchors.left: parent.left; anchors.right: parent.right
177−
178− menuModel: unityMenuModel
179− menuData: model
180− menuIndex: index
181− }
182− }
183− }
184−
185− Item {
186− id: buttonRow
187−
188− objectName: "buttonRow"
189− anchors {
190− left: parent.left
191− right: parent.right
192− }
193− visible: notification.type == Notification.SnapDecision && actionRepeater.count > 0
194− height: units.gu(5)
195−
196− property real buttonWidth: (width - contentColumn.spacing) / 2
197− property bool expanded
198−
199− Button {
200− id: leftButton
201−
202− objectName: "button1"
203− width: parent.expanded ? parent.width : parent.buttonWidth
204− anchors {
205− top: parent.top
206− bottom: parent.bottom
207− }
208− text: notification.type == Notification.SnapDecision && actionRepeater.count >= 2 ? actionRepeater.itemAt(1).actionLabel : ""
209− gradient: UbuntuColors.greyGradient
210− onClicked: {
211− if (actionRepeater.count > 2) {
212− buttonRow.expanded = !buttonRow.expanded
213− } else {
214− notification.notification.invokeAction(actionRepeater.itemAt(1).actionId)
215− }
216− }
217−
218− Behavior on width {
219− UbuntuNumberAnimation {
220− duration: UbuntuAnimation.SnapDuration
221− }
222− }
223− }
224−
225− Button {
226− id: rightButton
227−
228− objectName: "button0"
229− anchors {
230− left: leftButton.right
231− leftMargin: contentColumn.spacing
232− right: parent.right
233− }
234− text: notification.type == Notification.SnapDecision && actionRepeater.count >= 1 ? actionRepeater.itemAt(0).actionLabel : ""
235− anchors {
236− top: parent.top
237− bottom: parent.bottom
238− }
239− gradient: notification.hints["x-canonical-private-button-tint"] == "true" ? UbuntuColors.orangeGradient : UbuntuColors.greyGradient
240− visible: width > 0
241− onClicked: notification.notification.invokeAction(actionRepeater.itemAt(0).actionId)
242− }
243− }
244−
245− Column {
246− objectName: "buttonColumn"
247− spacing: contentColumn.spacing
248− anchors {
249− left: parent.left
250− right: parent.right
251− }
252−
253− // calculate initial position before Column takes over
254− y: buttonRow.y + buttonRow.height + contentColumn.spacing
255−
256− visible: notification.type == Notification.SnapDecision
257− height: buttonRow.expanded ? implicitHeight : 0
258−
259− Repeater {
260− id: actionRepeater
261−
262− model: notification.actions
263− delegate: Loader {
264− id: loader
265−
266− property string actionId: id
267− property string actionLabel: label
268−
269− anchors {
270− left: parent.left
271− right: parent.right
272− }
273−
274− Component {
275− id: actionButton
276−
277− Button {
278− objectName: "button" + index
279− anchors {
280− left: parent.left
281− right: parent.right
282− }
283−
284− text: loader.actionLabel
285− height: units.gu(5)
286− gradient: UbuntuColors.greyGradient
287− onClicked: notification.notification.invokeAction(loader.actionId)
288− }
289− }
290− sourceComponent: (index == 0 || index == 1) ? undefined : actionButton
291− }
292− }
293− }
294− }
295−}
cmake/modules/autopilot.cmake+5−1
@@ -4,7 +4,11 @@ function(declare_autopilot_test TEST_NAME TEST_SUITE WORKING_DIR)
4 add_custom_target(autopilot-${TEST_NAME}
4 add_custom_target(autopilot-${TEST_NAME}
5 COMMAND LANG=C UBUNTU_ICON_THEME=ubuntu-mobile QML2_IMPORT_PATH=${SHELL_INSTALL_QML}/mocks autopilot run ${TEST_SUITE}
5 COMMAND LANG=C UBUNTU_ICON_THEME=ubuntu-mobile QML2_IMPORT_PATH=${SHELL_INSTALL_QML}/mocks autopilot run ${TEST_SUITE}
6 WORKING_DIRECTORY ${WORKING_DIR}
6 WORKING_DIRECTORY ${WORKING_DIR}
7− DEPENDS install
7+ DEPENDS fake_install
8+ )
9+
10+ add_custom_target(fake_install
11+ COMMAND cmake --build ${CMAKE_BINARY_DIR} --target install
8 )
12 )
9
13
10 add_dependencies(autopilot autopilot-${TEST_NAME})
14 add_dependencies(autopilot autopilot-${TEST_NAME})
data/CMakeLists.txtnew file+8
@@ -0,0 +1,8 @@
1+# generate desktop file
2+configure_file(${SHELL_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop @ONLY)
3+configure_file(${SCOPE_TOOL}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${SCOPE_TOOL}.desktop @ONLY)
4+
5+# install desktop files
6+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop ${CMAKE_CURRENT_BINARY_DIR}/${SCOPE_TOOL}.desktop
7+ DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
8+ )
data/unity-scope-tool.desktop.innew file+8
@@ -0,0 +1,8 @@
1+[Desktop Entry]
2+Type=Application
3+Name=Unity Scope Tool
4+Comment=Developer tool for Unity scopes.
5+Exec=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@/unity-scope-tool
6+Terminal=false
7+Icon=unity-scope-tool
8+X-Ubuntu-Touch=true
data/unity8.conf+1
@@ -5,6 +5,7 @@ start on ((xsession SESSION=ubuntu-touch) or (xsession SESSION=ubuntu-touch-surf
5stop on desktop-end
5stop on desktop-end
6
6
7respawn
7respawn
8+expect stop
8
9
9pre-start script
10pre-start script
10 if [ -n "$MIR_SOCKET" ]; then
11 if [ -n "$MIR_SOCKET" ]; then
unity8.desktop.in → data/unity8.desktop.inrenamed

The content is the same.

data/unity8.overridenew file+1
@@ -0,0 +1 @@
1+kill timeout 30
debian/changelog+270−2
@@ -1,8 +1,276 @@
1−unity8 (7.84-0ubuntu1) UNRELEASED; urgency=low
1+unity8 (7.84+14.04.20131220-0ubuntu1) trusty; urgency=low
2
2
3+ [ Michał Sawicz ]
4+ * Clean up root project file. Introduce include/ and qml/ and move
5+ files around to be where they fit, also adapt everything else to
6+ match.
7+
8+ [ Michael Hall ]
9+ * Update CODING to reflect the fact that only 14.04 is supported
10+ currently.
11+
12+ [ Christopher Lee ]
13+ * Make use of helpers in all tests. (LP: #1260860). (LP: #1260860)
14+
15+ [ Nic ]
16+ * Added kill time 30 to unity8 override. Added install path. (LP:
17+ #1260379)
18+
19+ [ Nick Dedekind ]
20+ * Added parser for strftime in TimeFormatter. Moved TimeFormatter to
21+ Utils plugin.
22+
23+ [ Mirco Müller ]
24+ * Support fullscreen for special-case extended snap-decision of the
25+ pin-unlock dialog.
26+
27+ [ Michael Zanetti ]
28+ * Change the default behaviour of the Lockscreen to have a variable
29+ PIN length, requiring the user to confirm with OK.
30+
31+ [ Daniel d'Andrada ]
32+ * Update CODING with instructions on how to run tests.
33+
34+ [ Dimitri John Ledkov ]
35+ * Fix cross-compilation.
36+
37+ [ Albert Astals ]
38+ * Vertical journal Comes from lp:~aacid/+junk/verticalJournal.
39+ * Add code and tests for incremental inserting/removing from the end.
40+
41+ [ Ubuntu daily release ]
42+ * Automatic snapshot from revision 603
43+
44+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 20 Dec 2013 03:23:08 +0000
45+
46+unity8 (7.84+14.04.20131212-0ubuntu1) trusty; urgency=low
47+
48+ [ Michał Sawicz ]
49+ * Add PyDev project files for autopilot tests. Also tweak .bzrignore
50+ to not ignore generic Eclipse project definitions.
51+ * Retry unlocking the greeter three times.
52+ * Reduce code duplication and clean up CMakeLists and includes in
53+ indicator tests.
54+
55+ [ Nick Dedekind ]
56+ * Replaced indicator page dynamic menuSelected binding with Connection
57+ to listview selectedIndex property. (LP: #1243146)
58+ * Indicators close when menu items are activated. (LP: #1238182)
59+ * Fixed up connections for changes to model data. (LP: #1253810)
60+
61+ [ Albert Astals ]
62+ * dashItemSelected -> showDashHome Because we are not using the index
63+ at all in the upper layers.
64+ * Fix filtering colllapsing/expanding again Also the delegate creation
65+ range stuff flows up->down not down->up so rearrange the bindings.
66+
67+ [ Ubuntu daily release ]
68+ * Automatic snapshot from revision 590
69+
70+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 12 Dec 2013 21:41:19 +0000
71+
72+unity8 (7.84+14.04.20131206.1-0ubuntu1) trusty; urgency=low
73+
74+ [ Michal Hruby ]
75+ * Ensure DashContent's ListView's currentItem is set if the model is
76+ not empty.
77+
78+ [ Michał Sawicz ]
79+ * Don't generate build-deps .deb twice and allow overriding
80+ QML2_IMPORT_PATH in ./run.
81+
82+ [ Albert Astals ]
83+ * Remove unused Applications/ folder .
84+ * Implement an 'interface' for Dash Renderers.
85+ * Use deelistmodel's conversion method Instead of a copy of the code .
86+ * Remove icons we don't use .
87+ * Do not start apps or go to dash on demo If you are pulling the
88+ launcher out while in demo mode it doesn't make sense to let you
89+ start applications. Besides it locks you out because it starts the
90+ app and the demo is still not finished so you can't really use any
91+ of the edges to escape Bug #1233696. (LP: #1233696)
92+ * Add a test for the carousel showing the preview when being clicked .
93+ * Fix collapsing of categories not working and the
94+ expansion/collapsing animation +test.
95+
96+ [ Timo Jyrinki ]
97+ * Depend on either Qt 5.2 or libqt5v8-5-private-dev.
98+ * qtdeclarative5-private-dev 5.0.2-6ubuntu5 now depends directly on Qt
99+ V8 private headers. The remaining "qtdeclarative5-private-dev"
100+ dependency is enough now both when compiling against 5.0.2 or 5.2.
101+
102+ [ Pete Woods ]
103+ * Handle optional parameterized action properties. (LP: #1256258)
104+
105+ [ Andrea Cimitan ]
106+ * Implement an 'interface' for Dash Renderers.
107+
108+ [ Michael Zanetti ]
109+ * Added music preview.
110+ * rename some parameters from desktopFile to appId as scopes are now
111+ changed to give us the appId.
112+ * unhardcode launcher's search paths for .desktop files.
113+ * Enable teasing of the phone greeter even though we have a
114+ lockscreen.
115+ * check if variant is valid to avoid asserting in debug mode when the
116+ connection to AccountsService doesn't work for some reason .
117+
118+ [ Michael Terry ]
119+ * Add the DBus greeter API from the desktop greeter into the unity8
120+ greeter.
121+
122+ [ Daniel d'Andrada ]
123+ * Dash: disable close mode when you click outside app thumbnails To
124+ leave the termination mode you can now just mouse/touch press
125+ anywhere outside the running applications' thumbnails The other way,
126+ which still works, is long-pressing a thumbnail once more. (LP:
127+ #1193414)
128+
129+ [ Ubuntu daily release ]
130+ * Automatic snapshot from revision 579
131+
132+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 06 Dec 2013 13:15:57 +0000
133+
134+unity8 (7.84+14.04.20131128.2-0ubuntu1) trusty; urgency=low
135+
136+ [ Michal Hruby ]
3 * Depend on the separate scopes plugin
137 * Depend on the separate scopes plugin
138+ * Move the BottomBar* DBus communicator to the Utils plugin.
139+
140+ [ Michał Sawicz ]
141+ * Wait for DashHome to be available in tst_Shell. (LP: #1254898)
142+ * Use plugindir from unity-shell-api.pc.
143+ * Expect stop in upstart job and raise in case of surfaceflinger. (LP:
144+ #1239876)
145+
146+ [ Albert Astals ]
147+ * Fix time test in Qt 5.2 Make factors an array instead of a
148+ object/dict Objects/dicts are unordered by definition, it happened
149+ that Qt 5.0 gave them in the orrder we wanted, but with Qt 5.2 is
150+ failing, and we don't even need the "key", so array works as well
151+ :).
152+ * Test that the dash hswipe is disabled while the inner stuff is
153+ moving .
154+ * Skip restMaximizeVisibleAreaMoveUpAndShowHeader, it's causing too
155+ many failed runs And we are confident it's failing because of the
156+ suboptimal scenegraph run in 5.0.x.
157+ * Make Dash::test_show_scope_on_load more robust If we are testing
158+ showScopeOnLoaded make sure we force a scope reload after we set it,
159+ otherwise it may just happen that the scope has already been loaded
160+ and the expectaction that we'll change the list to it is just wrong.
161+ * Dash renderer signals: No need to pass the model up and down Whoever
162+ is listening to the signal has access to the item that emits the
163+ signal and has the model right there accessible if needs it.
164+ * LVWPH: Fix header going bad when setContentHeight ends up moving the
165+ viewport How to reproduce the bug easily without the patch: * In the
166+ Dash Home, search for london * Scroll to the bottom * Start moving
167+ to the apps scope very slowly * At around 3/4 of the move you'll see
168+ the header in the home scope went to a bad position * Go back to the
169+ Dash Home. (LP: #1237942, #1246351)
170+ * Remove unused AppInfo and VideoInfo files .
171+ * Kill unused ApplicationsFilterGrid.qml .
172+ * Unify ScopeView and GenericScopeView .
173+ * Fix header getting lost as per bug 1245824. (LP: #1245824)
174+ * Remove unused Time.js and its test .
175+ * Do not include the QtQml megaheader Include only qqml.h which is
176+ what we need in these files.
177+ * Don't do stuff if our parent context is gone We'll be gone soon too
178+ (and crash probably) so don't do anything. This looks a bit like a
179+ workaround, wait for 5.2 better painting/dispatching loop to see if
180+ this is not needed anymore, we find a better way to do it, or we
181+ decide this is fine.
182+
183+ [ Lars Uebernickel ]
184+ * Allow setting different indicator positions for different profiles.
185+
186+ [ Mirco Müller ]
187+ * Added checkbox for toggling between echo-modes of password-
188+ entryfields in ext. snap-decisions.
189+ * Fixes bug #1200569. (LP: #1200569)
190+
191+ [ Andrea Cimitan ]
192+ * Switch to application scope when a dash swipe is taking place and an
193+ app is on foreground. (LP: #1231996)
194+ * Shifts wallpaper rendering for greeter lockscreen to be inline with
195+ shell. (LP: #1231731)
196+ * Dinamically load the Carousel/Filtergrid with more than 6 items.
197+ (LP: #1226288, #1234105)
198+ * Removes Math.js and its usage. Use SDK ones.
199+
200+ [ Gerry Boland ]
201+ * DragHandle: javascript argument name clashes with local variable.
202+ Yes it works, but is a little unsafe.
203+
204+ [ Nick Dedekind ]
205+ * Added UnityMenuModel submenu row removal awareness in
206+ UnityMenuModelStack.
207+ * Round indicator widget icon/label width up to closest gu for
208+ alignment. (LP: #1236267)
209+ * Indicator re-select by dragging from top when fully opened. (LP:
210+ #1213164)
211+ * Fixed a race condition causing search history popup to show up when
212+ it shouldn't. (LP: #1249369)
213+
214+ [ Christopher Lee ]
215+ * Unity8 tests now make use of the helper functions (added in the pre-
216+ req branch) so that the helper functions are tested as part of daily
217+ business.
218+
219+ [ Daniel d'Andrada ]
220+ * Improve DirectionalDragArea Removed Rejected status, simplifying
221+ state machine. Added compositionTime property. Multi-finger
222+ scenarios are better handled now. Refactored TimeSource in
223+ Ubuntu.Gestures plugin. Added an easy way to debug
224+ DirectionalDragArea by having switchable debug prints. Updated tests
225+ to also simulate the passage of time. Use touch point scene
226+ coordinates for gesture recognition so that moving the.
227+ DirectionalDragArea (as in a hinting DragHandle) won't affect it.
228+ (LP: #1228336)
229+ * Add right-edge drag hinting to Greeter To match with the existing
230+ teasing animation when you tap on the right half of the Greeter.
231+ Also has the side benefit of making the code look a bit nicer.
232+ * Refactor Ubuntu.Gesture tests to share common logic Take the common
233+ part out of tst_DirectionalDragArea and put it into a separate base
234+ class, GestureTest, so that it can be shared with other, future,
235+ tests. In CMakeLists.txt, create a macro out of DirectionalDragArea
236+ build script to be used by future tests with similar requirements
237+ and structure. Also add the "m_" prefix to member variables.
238+ * Remove dead code from Utils plugin They are not being used anywhere.
239+
240+ [ Michael Terry ]
241+ * Make EdgeDemoOverlay test more reliable by testing for what we
242+ really care about, not an indirect indicator of it. (LP: #1248232)
243+ * Explicitly set MIR_SOCKET for other upstart jobs, rather than
244+ relying on the default socket, since that won't work once we move to
245+ a nested Mir.
246+
247+ [ Michael Zanetti ]
248+ * don't add margins to RunningApplicationTile's label. (LP: #1245482)
249+ * allow SIM PIN entry to have a variable pin length (by adding a done-
250+ button). (LP: #1240561)
251+ * fix launcher wording for pinning actions. (LP: #1240891)
252+ * fix preview background positioning don't explicitly take originY
253+ into account as it's already in there implicitly. make sure we don't
254+ split the openeffect in a place where it can be covered by the
255+ header.
256+ * fix album artwork containing / in the name. (LP: #1237829)
257+ * small launcher tweaks fix fakeDragItem's initial position to match
258+ with real item. remove UbuntuShape's border glow. .
259+ * drop all references to LighDM from the Lockscreen This should make
260+ it generic enough to allow reusing it for SIM PIN entry .
261+
262+ [ Omer Akram ]
263+ * make the non working code in the screen unlocker helper work.
264+
265+ [ Nicolas d'Offay ]
266+ * Pushed up the z order of the clock in GreeterContent. (LP: #1233146)
267+ * Search history is now persistent across all scopes and remains in
268+ QML. (LP: #1226221)
269+
270+ [ Ubuntu daily release ]
271+ * Automatic snapshot from revision 556
4
272
5− -- Michal Hruby <michal.hruby@canonical.com> Wed, 13 Nov 2013 12:43:39 +0000
273+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 28 Nov 2013 18:09:17 +0000
6
274
7unity8 (7.83+14.04.20131106-0ubuntu1) trusty; urgency=low
275unity8 (7.83+14.04.20131106-0ubuntu1) trusty; urgency=low
8
276
debian/control+13−4
@@ -16,7 +16,6 @@ Build-Depends: cmake,
16 libnih-dev,
16 libnih-dev,
17 libpulse-dev,
17 libpulse-dev,
18 libqmenumodel-dev (>= 0.2.7),
18 libqmenumodel-dev (>= 0.2.7),
19− libqt5v8-5-private-dev,
20 libunity-api-dev (>= 7.80.4),
19 libunity-api-dev (>= 7.80.4),
21 libunity-mir-dev,
20 libunity-mir-dev,
22 libunity-scopes-json-def-phone,
21 libunity-scopes-json-def-phone,
@@ -34,6 +33,7 @@ Build-Depends: cmake,
34 qtbase5-private-dev,
33 qtbase5-private-dev,
35 qtdeclarative5-dev,
34 qtdeclarative5-dev,
36 qtdeclarative5-dev-tools,
35 qtdeclarative5-dev-tools,
36+ qtdeclarative5-qtmultimedia-plugin,
37 qtdeclarative5-private-dev,
37 qtdeclarative5-private-dev,
38 qtdeclarative5-qtquick2-plugin,
38 qtdeclarative5-qtquick2-plugin,
39 qtdeclarative5-test-plugin,
39 qtdeclarative5-test-plugin,
@@ -52,22 +52,30 @@ Vcs-Browser: https://bazaar.launchpad.net/~unity-team/unity8/trunk
52Package: indicators-client
52Package: indicators-client
53Architecture: amd64 armhf i386
53Architecture: amd64 armhf i386
54Depends: qmenumodel-qml (>= 0.2.7),
54Depends: qmenumodel-qml (>= 0.2.7),
55− qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 0.1.46+13.10.20130829.1-0ubuntu1),
55+ qtdeclarative5-ubuntu-ui-toolkit-plugin,
56 unity8 (= ${binary:Version}),
56 unity8 (= ${binary:Version}),
57 ${misc:Depends},
57 ${misc:Depends},
58 ${shlibs:Depends},
58 ${shlibs:Depends},
59Description: Indicators client test application
59Description: Indicators client test application
60 This package contains the client application for indicators used by autopilot
60 This package contains the client application for indicators used by autopilot
61
61
62+Package: unity-scope-tool
63+Architecture: any
64+Depends: unity8 (= ${binary:Version}),
65+ ${misc:Depends},
66+ ${shlibs:Depends},
67+Description: Development tool for Unity scopes
68+ This package contains the development tool for new generation Unity scopes, based
69+ on Unity8.
70+
62Package: unity8
71Package: unity8
63Architecture: any
72Architecture: any
64Provides: indicator-renderer,
73Provides: indicator-renderer,
65Depends: gsettings-desktop-schemas,
74Depends: gsettings-desktop-schemas,
66− libunity-mir1,
67 qmenumodel-qml (>= 0.2.7),
75 qmenumodel-qml (>= 0.2.7),
68 qtdeclarative5-dee-plugin,
76 qtdeclarative5-dee-plugin,
69 qtdeclarative5-gsettings1.0,
77 qtdeclarative5-gsettings1.0,
70− qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 0.1.46+13.10.20130829.1-0ubuntu1),
78+ qtdeclarative5-ubuntu-ui-toolkit-plugin,
71 qtdeclarative5-unity-notifications-plugin | unity-notifications-impl,
79 qtdeclarative5-unity-notifications-plugin | unity-notifications-impl,
72 qtdeclarative5-xmllistmodel-plugin,
80 qtdeclarative5-xmllistmodel-plugin,
73 unity-launcher-impl-3,
81 unity-launcher-impl-3,
@@ -95,6 +103,7 @@ Depends: gir1.2-glib-2.0,
95 libqt5widgets5,
103 libqt5widgets5,
96 python-evdev,
104 python-evdev,
97 python-gi,
105 python-gi,
106+ python-mock,
98 unity8 (>= ${source:Version}),
107 unity8 (>= ${source:Version}),
99 unity8-fake-env (>= ${source:Version}),
108 unity8-fake-env (>= ${source:Version}),
100 ${misc:Depends},
109 ${misc:Depends},
debian/unity-scope-tool.installnew file+3
@@ -0,0 +1,3 @@
1+usr/bin/unity-scope-tool
2+usr/share/applications/unity-scope-tool.desktop
3+usr/share/unity8/ScopeTool.qml
debian/unity8-autopilot.install+1
@@ -1 +1,2 @@
1usr/lib/python*/*/unity*
1usr/lib/python*/*/unity*
2+data/unity8.override usr/share/upstart/sessions
debian/unity8-private.install+1−1
@@ -1,7 +1,7 @@
1usr/lib/*/unity8/qml/AccountsService
1usr/lib/*/unity8/qml/AccountsService
2usr/lib/*/unity8/qml/HudClient
2usr/lib/*/unity8/qml/HudClient
3usr/lib/*/unity8/qml/LightDM
3usr/lib/*/unity8/qml/LightDM
4−usr/lib/*/unity8/qml/ListViewWithPageHeader
4+usr/lib/*/unity8/qml/DashViews
5usr/lib/*/unity8/qml/Powerd
5usr/lib/*/unity8/qml/Powerd
6usr/lib/*/unity8/qml/SessionBroadcast
6usr/lib/*/unity8/qml/SessionBroadcast
7usr/lib/*/unity8/qml/Ubuntu
7usr/lib/*/unity8/qml/Ubuntu
debian/unity8.install−1
@@ -1,7 +1,6 @@
1usr/bin/unity8
1usr/bin/unity8
2usr/share/applications/unity8.desktop
2usr/share/applications/unity8.desktop
3usr/share/locale
3usr/share/locale
4−usr/share/unity8/Applications
5usr/share/unity8/Bottombar
4usr/share/unity8/Bottombar
6usr/share/unity8/Components
5usr/share/unity8/Components
7usr/share/unity8/Dash
6usr/share/unity8/Dash
include/CMakeLists.txtnew file+1
@@ -0,0 +1 @@
1+configure_file(paths.h.in ${CMAKE_CURRENT_BINARY_DIR}/paths.h @ONLY)
paths.h.in → include/paths.h.inrenamed+42−3
@@ -23,6 +23,8 @@
23// Qt
23// Qt
24#include <QtCore/QCoreApplication>
24#include <QtCore/QCoreApplication>
25#include <QtCore/QDir>
25#include <QtCore/QDir>
26+#include <QtGui/QIcon>
27+#include <QtQml/QQmlEngine>
26#include <QStandardPaths>
28#include <QStandardPaths>
27
29
28inline bool isRunningInstalled() {
30inline bool isRunningInstalled() {
@@ -39,11 +41,11 @@ inline QString translationDirectory() {
39 }
41 }
40}
42}
41
43
42−inline QString shellAppDirectory() {
44+inline QString qmlDirectory() {
43 if (isRunningInstalled()) {
45 if (isRunningInstalled()) {
44 return QString("@CMAKE_INSTALL_PREFIX@/@SHELL_APP_DIR@/");
46 return QString("@CMAKE_INSTALL_PREFIX@/@SHELL_APP_DIR@/");
45 } else {
47 } else {
46− return QString("@CMAKE_SOURCE_DIR@/");
48+ return QString("@CMAKE_SOURCE_DIR@/qml/");
47 }
49 }
48}
50}
49
51
@@ -77,7 +79,7 @@ inline QStringList shellDataDirs() {
77 }
79 }
78 else {
80 else {
79 // append so by default we use xdg files.
81 // append so by default we use xdg files.
80− dirs.append(shellAppDirectory());
82+ dirs.append(qmlDirectory());
81 }
83 }
82 return dirs;
84 return dirs;
83}
85}
@@ -86,4 +88,41 @@ inline QString sourceDirectory() {
86 return QString("@CMAKE_SOURCE_DIR@/");
88 return QString("@CMAKE_SOURCE_DIR@/");
87}
89}
88
90
91+inline void prependImportPaths(QQmlEngine *engine, const QStringList &paths)
92+{
93+ QStringList importPathList = engine->importPathList();
94+ for (int i = paths.count() -1; i >= 0; i--) {
95+ // don't duplicate
96+ const QString& path = paths[i];
97+ QStringList::iterator iter = qFind(importPathList.begin(), importPathList.end(), path);
98+ if (iter == importPathList.end()) {
99+ engine->addImportPath(path);
100+ }
101+ }
102+}
103+
104+/* When you append and import path to the list of import paths it will be the *last*
105+ place where Qt will search for QML modules.
106+ The usual QQmlEngine::addImportPath() actually prepends the given path.*/
107+inline void appendImportPaths(QQmlEngine *engine, const QStringList &paths)
108+{
109+ QStringList importPathList = engine->importPathList();
110+ Q_FOREACH(const QString& path, paths) {
111+ // don't duplicate
112+ QStringList::iterator iter = qFind(importPathList.begin(), importPathList.end(), path);
113+ if (iter == importPathList.end()) {
114+ importPathList.append(path);
115+ }
116+ }
117+ engine->setImportPathList(importPathList);
118+}
119+
120+inline void resolveIconTheme() {
121+ const char *ubuntuIconTheme = getenv("UBUNTU_ICON_THEME");
122+ if (ubuntuIconTheme == NULL) {
123+ ubuntuIconTheme = "ubuntu-mobile";
124+ }
125+ QIcon::setThemeName(ubuntuIconTheme);
126+}
127+
89#endif
128#endif
plugins/CMakeLists.txt+1−1
@@ -1,7 +1,7 @@
1add_subdirectory(AccountsService)
1add_subdirectory(AccountsService)
2add_subdirectory(HudClient)
2add_subdirectory(HudClient)
3add_subdirectory(LightDM)
3add_subdirectory(LightDM)
4−add_subdirectory(ListViewWithPageHeader)
4+add_subdirectory(DashViews)
5add_subdirectory(Powerd)
5add_subdirectory(Powerd)
6add_subdirectory(SessionBroadcast)
6add_subdirectory(SessionBroadcast)
7add_subdirectory(Ubuntu)
7add_subdirectory(Ubuntu)
plugins/ListViewWithPageHeader/CMakeLists.txt → plugins/DashViews/CMakeLists.txtrenamed+8−5
@@ -24,19 +24,22 @@ remove_definitions(-DQT_NO_KEYWORDS)
24set(QMLPLUGIN_SRC
24set(QMLPLUGIN_SRC
25 plugin.cpp
25 plugin.cpp
26 listviewwithpageheader.cpp
26 listviewwithpageheader.cpp
27+ abstractjournal.cpp
28+ verticaljournal.cpp
29+ horizontaljournal.cpp
27 )
30 )
28
31
29−add_library(ListViewWithPageHeader-qml MODULE
32+add_library(DashViews-qml MODULE
30 ${QMLPLUGIN_SRC}
33 ${QMLPLUGIN_SRC}
31 )
34 )
32
35
33−target_link_libraries(ListViewWithPageHeader-qml
36+target_link_libraries(DashViews-qml
34 ${Qt5Gui_LIBRARIES}
37 ${Qt5Gui_LIBRARIES}
35 ${Qt5Quick_LIBRARIES}
38 ${Qt5Quick_LIBRARIES}
36 )
39 )
37
40
38−qt5_use_modules(ListViewWithPageHeader-qml Qml Quick)
41+qt5_use_modules(DashViews-qml Qml Quick)
39
42
40# export the qmldir qmltypes and plugin files
43# export the qmldir qmltypes and plugin files
41−export_qmlfiles(ListViewWithPageHeader ListViewWithPageHeader)
44+export_qmlfiles(DashViews DashViews)
42−export_qmlplugin(ListViewWithPageHeader 0.1 ListViewWithPageHeader TARGETS ListViewWithPageHeader-qml)
45+export_qmlplugin(DashViews 0.1 DashViews TARGETS DashViews-qml)
plugins/DashViews/abstractjournal.cppnew file+388
@@ -0,0 +1,388 @@
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+#include "abstractjournal.h"
18+
19+static const qreal bufferRatio = 0.5;
20+
21+AbstractJournal::AbstractJournal()
22+ : m_delegateModel(nullptr)
23+ , m_asyncRequestedIndex(-1)
24+ , m_columnSpacing(0)
25+ , m_rowSpacing(0)
26+ , m_delegateCreationBegin(0)
27+ , m_delegateCreationEnd(0)
28+ , m_delegateCreationBeginValid(false)
29+ , m_delegateCreationEndValid(false)
30+ , m_needsRelayout(false)
31+ , m_delegateValidated(false)
32+ , m_implicitHeightDirty(false)
33+{
34+ connect(this, SIGNAL(widthChanged()), this, SLOT(relayout()));
35+ connect(this, SIGNAL(heightChanged()), this, SLOT(onHeightChanged()));
36+}
37+
38+QAbstractItemModel *AbstractJournal::model() const
39+{
40+ return m_delegateModel ? m_delegateModel->model().value<QAbstractItemModel *>() : nullptr;
41+}
42+
43+void AbstractJournal::setModel(QAbstractItemModel *model)
44+{
45+ if (model != this->model()) {
46+ if (!m_delegateModel) {
47+ createDelegateModel();
48+ } else {
49+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
50+ disconnect(m_delegateModel, SIGNAL(modelUpdated(QQuickChangeSet,bool)), this, SLOT(onModelUpdated(QQuickChangeSet,bool)));
51+ }
52+ m_delegateModel->setModel(QVariant::fromValue<QAbstractItemModel *>(model));
53+ connect(m_delegateModel, SIGNAL(modelUpdated(QQuickChangeSet,bool)), this, SLOT(onModelUpdated(QQuickChangeSet,bool)));
54+#else
55+ disconnect(m_delegateModel, SIGNAL(modelUpdated(QQmlChangeSet,bool)), this, SLOT(onModelUpdated(QQmlChangeSet,bool)));
56+ }
57+ m_delegateModel->setModel(QVariant::fromValue<QAbstractItemModel *>(model));
58+ connect(m_delegateModel, SIGNAL(modelUpdated(QQmlChangeSet,bool)), this, SLOT(onModelUpdated(QQmlChangeSet,bool)));
59+#endif
60+
61+ cleanupExistingItems();
62+
63+ Q_EMIT modelChanged();
64+ polish();
65+ }
66+}
67+
68+QQmlComponent *AbstractJournal::delegate() const
69+{
70+ return m_delegateModel ? m_delegateModel->delegate() : nullptr;
71+}
72+
73+void AbstractJournal::setDelegate(QQmlComponent *delegate)
74+{
75+ if (delegate != this->delegate()) {
76+ if (!m_delegateModel) {
77+ createDelegateModel();
78+ }
79+
80+ cleanupExistingItems();
81+
82+ m_delegateModel->setDelegate(delegate);
83+
84+ Q_EMIT delegateChanged();
85+ m_delegateValidated = false;
86+ polish();
87+ }
88+}
89+
90+qreal AbstractJournal::columnSpacing() const
91+{
92+ return m_columnSpacing;
93+}
94+
95+void AbstractJournal::setColumnSpacing(qreal columnSpacing)
96+{
97+ if (columnSpacing != m_columnSpacing) {
98+ m_columnSpacing = columnSpacing;
99+ Q_EMIT columnSpacingChanged();
100+
101+ if (isComponentComplete()) {
102+ relayout();
103+ }
104+ }
105+}
106+
107+qreal AbstractJournal::rowSpacing() const
108+{
109+ return m_rowSpacing;
110+}
111+
112+void AbstractJournal::setRowSpacing(qreal rowSpacing)
113+{
114+ if (rowSpacing != m_rowSpacing) {
115+ m_rowSpacing = rowSpacing;
116+ Q_EMIT rowSpacingChanged();
117+
118+ if (isComponentComplete()) {
119+ relayout();
120+ }
121+ }
122+}
123+
124+qreal AbstractJournal::delegateCreationBegin() const
125+{
126+ return m_delegateCreationBegin;
127+}
128+
129+void AbstractJournal::setDelegateCreationBegin(qreal begin)
130+{
131+ m_delegateCreationBeginValid = true;
132+ if (m_delegateCreationBegin == begin)
133+ return;
134+ m_delegateCreationBegin = begin;
135+ if (isComponentComplete()) {
136+ polish();
137+ }
138+ emit delegateCreationBeginChanged();
139+}
140+
141+void AbstractJournal::resetDelegateCreationBegin()
142+{
143+ m_delegateCreationBeginValid = false;
144+ if (m_delegateCreationBegin == 0)
145+ return;
146+ m_delegateCreationBegin = 0;
147+ if (isComponentComplete()) {
148+ polish();
149+ }
150+ emit delegateCreationBeginChanged();
151+}
152+
153+qreal AbstractJournal::delegateCreationEnd() const
154+{
155+ return m_delegateCreationEnd;
156+}
157+
158+void AbstractJournal::setDelegateCreationEnd(qreal end)
159+{
160+ m_delegateCreationEndValid = true;
161+ if (m_delegateCreationEnd == end)
162+ return;
163+ m_delegateCreationEnd = end;
164+ if (isComponentComplete()) {
165+ polish();
166+ }
167+ emit delegateCreationEndChanged();
168+}
169+
170+void AbstractJournal::resetDelegateCreationEnd()
171+{
172+ m_delegateCreationEndValid = false;
173+ if (m_delegateCreationEnd == 0)
174+ return;
175+ m_delegateCreationEnd = 0;
176+ if (isComponentComplete()) {
177+ polish();
178+ }
179+ emit delegateCreationEndChanged();
180+}
181+
182+void AbstractJournal::createDelegateModel()
183+{
184+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
185+ m_delegateModel = new QQuickVisualDataModel(qmlContext(this), this);
186+ connect(m_delegateModel, SIGNAL(createdItem(int,QQuickItem*)), this, SLOT(itemCreated(int,QQuickItem*)));
187+#else
188+ m_delegateModel = new QQmlDelegateModel(qmlContext(this), this);
189+ connect(m_delegateModel, SIGNAL(createdItem(int,QObject*)), this, SLOT(itemCreated(int,QObject*)));
190+#endif
191+ if (isComponentComplete())
192+ m_delegateModel->componentComplete();
193+}
194+
195+void AbstractJournal::refill()
196+{
197+ if (!isComponentComplete()) {
198+ return;
199+ }
200+
201+ const bool delegateRangesValid = m_delegateCreationBeginValid && m_delegateCreationEndValid;
202+ const qreal from = delegateRangesValid ? m_delegateCreationBegin : 0;
203+ const qreal to = delegateRangesValid ? m_delegateCreationEnd : from + height();
204+ const qreal buffer = (to - from) * bufferRatio;
205+ const qreal bufferFrom = from - buffer;
206+ const qreal bufferTo = to + buffer;
207+
208+ bool added = addVisibleItems(from, to, false);
209+ bool removed = removeNonVisibleItems(bufferFrom, bufferTo);
210+ added |= addVisibleItems(bufferFrom, bufferTo, true);
211+
212+ if (added || removed) {
213+ m_implicitHeightDirty = true;
214+ polish();
215+ }
216+}
217+
218+bool AbstractJournal::addVisibleItems(qreal fillFromY, qreal fillToY, bool asynchronous)
219+{
220+ if (!delegate())
221+ return false;
222+
223+ if (m_delegateModel->count() == 0)
224+ return false;
225+
226+ int modelIndex;
227+ qreal yPos;
228+ findBottomModelIndexToAdd(&modelIndex, &yPos);
229+ bool changed = false;
230+ while (modelIndex < m_delegateModel->count() && yPos <= fillToY) {
231+ if (!createItem(modelIndex, asynchronous))
232+ break;
233+
234+ changed = true;
235+ findBottomModelIndexToAdd(&modelIndex, &yPos);
236+ }
237+
238+ findTopModelIndexToAdd(&modelIndex, &yPos);
239+ while (modelIndex >= 0 && yPos > fillFromY) {
240+ if (!createItem(modelIndex, asynchronous))
241+ break;
242+
243+ changed = true;
244+ findTopModelIndexToAdd(&modelIndex, &yPos);
245+ }
246+
247+ return changed;
248+}
249+
250+QQuickItem *AbstractJournal::createItem(int modelIndex, bool asynchronous)
251+{
252+ if (asynchronous && m_asyncRequestedIndex != -1)
253+ return nullptr;
254+
255+ m_asyncRequestedIndex = -1;
256+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
257+ QQuickItem *item = m_delegateModel->item(modelIndex, asynchronous);
258+#else
259+ QObject* object = m_delegateModel->object(modelIndex, asynchronous);
260+ QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
261+#endif
262+ if (!item) {
263+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
264+ m_asyncRequestedIndex = modelIndex;
265+#else
266+ if (object) {
267+ m_delegateModel->release(object);
268+ if (!m_delegateValidated) {
269+ m_delegateValidated = true;
270+ QObject* delegateObj = delegate();
271+ qmlInfo(delegateObj ? delegateObj : this) << "Delegate must be of Item type";
272+ }
273+ } else {
274+ m_asyncRequestedIndex = modelIndex;
275+ }
276+#endif
277+ return nullptr;
278+ } else {
279+ positionItem(modelIndex, item);
280+ return item;
281+ }
282+}
283+
284+void AbstractJournal::releaseItem(QQuickItem *item)
285+{
286+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
287+ QQuickVisualModel::ReleaseFlags flags = m_delegateModel->release(item);
288+ if (flags & QQuickVisualModel::Destroyed) {
289+#else
290+ QQmlDelegateModel::ReleaseFlags flags = m_delegateModel->release(item);
291+ if (flags & QQmlDelegateModel::Destroyed) {
292+#endif
293+ item->setParentItem(nullptr);
294+ }
295+}
296+
297+void AbstractJournal::setImplicitHeightDirty()
298+{
299+ m_implicitHeightDirty = true;
300+}
301+
302+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
303+void AbstractJournal::itemCreated(int modelIndex, QQuickItem *item)
304+{
305+#else
306+void AbstractJournal::itemCreated(int modelIndex, QObject *object)
307+{
308+ QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
309+ if (!item) {
310+ qWarning() << "AbstractJournal::itemCreated got a non item for index" << modelIndex;
311+ return;
312+ }
313+#endif
314+ item->setParentItem(this);
315+
316+ // We only need to call createItem if we are here because of an asynchronous generation
317+ // otherwise we are in this slot because createItem is creating the item sync
318+ // and thus we don't need to call createItem again, nor need to set m_implicitHeightDirty
319+ // and call polish because the sync createItem was called from addVisibleItems that
320+ // is called from refill that will already do those if an item was added
321+ if (modelIndex == m_asyncRequestedIndex) {
322+ createItem(modelIndex, false);
323+ m_implicitHeightDirty = true;
324+ polish();
325+ }
326+}
327+
328+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
329+void AbstractJournal::onModelUpdated(const QQuickChangeSet &changeSet, bool reset)
330+#else
331+void AbstractJournal::onModelUpdated(const QQmlChangeSet &changeSet, bool reset)
332+#endif
333+{
334+ if (reset) {
335+ cleanupExistingItems();
336+ } else {
337+ processModelRemoves(changeSet.removes());
338+ }
339+ polish();
340+}
341+
342+
343+void AbstractJournal::relayout()
344+{
345+ m_needsRelayout = true;
346+ polish();
347+}
348+
349+void AbstractJournal::onHeightChanged()
350+{
351+ polish();
352+}
353+
354+void AbstractJournal::updatePolish()
355+{
356+ if (!model())
357+ return;
358+
359+ if (m_needsRelayout) {
360+ doRelayout();
361+ m_needsRelayout = false;
362+ m_implicitHeightDirty = true;
363+ }
364+
365+ refill();
366+
367+ const bool delegateRangesValid = m_delegateCreationBeginValid && m_delegateCreationEndValid;
368+ const qreal from = delegateRangesValid ? m_delegateCreationBegin : 0;
369+ const qreal to = delegateRangesValid ? m_delegateCreationEnd : from + height();
370+ updateItemCulling(from, to);
371+
372+ if (m_implicitHeightDirty) {
373+ calculateImplicitHeight();
374+ m_implicitHeightDirty = false;
375+ }
376+}
377+
378+void AbstractJournal::componentComplete()
379+{
380+ if (m_delegateModel)
381+ m_delegateModel->componentComplete();
382+
383+ QQuickItem::componentComplete();
384+
385+ m_needsRelayout = true;
386+
387+ polish();
388+}
plugins/DashViews/abstractjournal.hnew file+145
@@ -0,0 +1,145 @@
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+#ifndef ABSTRACTJOURNAL_H
18+#define ABSTRACTJOURNAL_H
19+
20+#include <QQuickItem>
21+
22+class QAbstractItemModel;
23+class QQmlComponent;
24+#pragma GCC diagnostic push
25+#pragma GCC diagnostic ignored "-pedantic"
26+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
27+#include <private/qquickvisualdatamodel_p.h>
28+#else
29+#include <private/qqmldelegatemodel_p.h>
30+#include <qqmlinfo.h>
31+#endif
32+#pragma GCC diagnostic pop
33+
34+class AbstractJournal : public QQuickItem
35+{
36+ Q_OBJECT
37+
38+ Q_PROPERTY(QAbstractItemModel *model READ model WRITE setModel NOTIFY modelChanged)
39+ Q_PROPERTY(QQmlComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
40+ Q_PROPERTY(qreal columnSpacing READ columnSpacing WRITE setColumnSpacing NOTIFY columnSpacingChanged)
41+ Q_PROPERTY(qreal rowSpacing READ rowSpacing WRITE setRowSpacing NOTIFY rowSpacingChanged)
42+ Q_PROPERTY(qreal delegateCreationBegin READ delegateCreationBegin
43+ WRITE setDelegateCreationBegin
44+ NOTIFY delegateCreationBeginChanged
45+ RESET resetDelegateCreationBegin)
46+ Q_PROPERTY(qreal delegateCreationEnd READ delegateCreationEnd
47+ WRITE setDelegateCreationEnd
48+ NOTIFY delegateCreationEndChanged
49+ RESET resetDelegateCreationEnd)
50+
51+friend class VerticalJournalTest;
52+friend class HorizontalJournalTest;
53+
54+public:
55+ AbstractJournal();
56+
57+ QAbstractItemModel *model() const;
58+ void setModel(QAbstractItemModel *model);
59+
60+ QQmlComponent *delegate() const;
61+ void setDelegate(QQmlComponent *delegate);
62+
63+ qreal columnSpacing() const;
64+ void setColumnSpacing(qreal columnSpacing);
65+
66+ qreal rowSpacing() const;
67+ void setRowSpacing(qreal rowSpacing);
68+
69+ qreal delegateCreationBegin() const;
70+ void setDelegateCreationBegin(qreal);
71+ void resetDelegateCreationBegin();
72+
73+ qreal delegateCreationEnd() const;
74+ void setDelegateCreationEnd(qreal);
75+ void resetDelegateCreationEnd();
76+
77+Q_SIGNALS:
78+ void modelChanged();
79+ void delegateChanged();
80+ void columnSpacingChanged();
81+ void rowSpacingChanged();
82+ void delegateCreationBeginChanged();
83+ void delegateCreationEndChanged();
84+
85+protected Q_SLOTS:
86+ void relayout();
87+
88+protected:
89+ void updatePolish() override;
90+ void componentComplete() override;
91+
92+ void releaseItem(QQuickItem *item);
93+ void setImplicitHeightDirty();
94+
95+private Q_SLOTS:
96+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
97+ void itemCreated(int modelIndex, QQuickItem *item);
98+ void onModelUpdated(const QQuickChangeSet &changeSet, bool reset);
99+#else
100+ void itemCreated(int modelIndex, QObject *object);
101+ void onModelUpdated(const QQmlChangeSet &changeSet, bool reset);
102+#endif
103+ void onHeightChanged();
104+
105+private:
106+ void createDelegateModel();
107+ void refill();
108+ bool addVisibleItems(qreal fillFromY, qreal fillToY, bool asynchronous);
109+ QQuickItem *createItem(int modelIndex, bool asynchronous);
110+
111+ virtual void findBottomModelIndexToAdd(int *modelIndex, qreal *yPos) = 0;
112+ virtual void findTopModelIndexToAdd(int *modelIndex, qreal *yPos) = 0;
113+ virtual void positionItem(int modelIndex, QQuickItem *item) = 0;
114+ virtual bool removeNonVisibleItems(qreal bufferFromY, qreal bufferToY) = 0;
115+ virtual void cleanupExistingItems() = 0;
116+ virtual void doRelayout() = 0;
117+ virtual void updateItemCulling(qreal visibleFromY, qreal visibleToY) = 0;
118+ virtual void calculateImplicitHeight() = 0;
119+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
120+ virtual void processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes) = 0;
121+#else
122+ virtual void processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes) = 0;
123+#endif
124+
125+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
126+ QQuickVisualDataModel *m_delegateModel;
127+#else
128+ QQmlDelegateModel *m_delegateModel;
129+#endif
130+
131+ // Index we are waiting because we requested it asynchronously
132+ int m_asyncRequestedIndex;
133+
134+ int m_columnSpacing;
135+ int m_rowSpacing;
136+ qreal m_delegateCreationBegin;
137+ qreal m_delegateCreationEnd;
138+ bool m_delegateCreationBeginValid;
139+ bool m_delegateCreationEndValid;
140+ bool m_needsRelayout;
141+ bool m_delegateValidated;
142+ bool m_implicitHeightDirty;
143+};
144+
145+#endif
plugins/DashViews/horizontaljournal.cppnew file+253
@@ -0,0 +1,253 @@
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+/*
18+ * The implementation is centered around m_visibleItems
19+ * that a list for each of the items in the view.
20+ * m_firstVisibleIndex is the index of the first item in m_visibleItems
21+ * m_lastInRowIndexPosition is a map that contains the x position
22+ * of items that are the last ones of a row so we can reconstruct the rows
23+ * when building back
24+ */
25+
26+#include "horizontaljournal.h"
27+
28+#include <qqmlengine.h>
29+#pragma GCC diagnostic push
30+#pragma GCC diagnostic ignored "-pedantic"
31+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
32+#include <private/qquickvisualdatamodel_p.h>
33+#else
34+#include <private/qqmldelegatemodel_p.h>
35+#include <qqmlinfo.h>
36+#endif
37+#include <private/qquickitem_p.h>
38+#pragma GCC diagnostic pop
39+
40+static const qreal bufferRatio = 0.5;
41+
42+HorizontalJournal::HorizontalJournal()
43+ : m_firstVisibleIndex(-1)
44+ , m_rowHeight(0)
45+{
46+}
47+
48+qreal HorizontalJournal::rowHeight() const
49+{
50+ return m_rowHeight;
51+}
52+
53+void HorizontalJournal::setRowHeight(qreal rowHeight)
54+{
55+ if (rowHeight != m_rowHeight) {
56+ m_rowHeight = rowHeight;
57+ Q_EMIT rowHeightChanged();
58+
59+ if (isComponentComplete()) {
60+ Q_FOREACH(QQuickItem *item, m_visibleItems) {
61+ item->setHeight(rowHeight);
62+ }
63+ relayout();
64+ }
65+ }
66+}
67+
68+void HorizontalJournal::findBottomModelIndexToAdd(int *modelIndex, qreal *yPos)
69+{
70+ if (m_visibleItems.isEmpty()) {
71+ *modelIndex = 0;
72+ *yPos = 0;
73+ } else {
74+ *modelIndex = m_firstVisibleIndex + m_visibleItems.count();
75+ if (m_lastInRowIndexPosition.contains(*modelIndex - 1)) {
76+ *yPos = m_visibleItems.last()->y() + m_rowHeight + rowSpacing();
77+ } else {
78+ *yPos = m_visibleItems.last()->y();
79+ }
80+ }
81+}
82+
83+void HorizontalJournal::findTopModelIndexToAdd(int *modelIndex, qreal *yPos)
84+{
85+ if (m_visibleItems.isEmpty()) {
86+ *modelIndex = -1;
87+ *yPos = INT_MIN;
88+ } else {
89+ *modelIndex = m_firstVisibleIndex - 1;
90+ if (m_lastInRowIndexPosition.contains(*modelIndex)) {
91+ *yPos = m_visibleItems.first()->y() - rowSpacing() - m_rowHeight;
92+ } else {
93+ *yPos = m_visibleItems.first()->y();
94+ }
95+ }
96+}
97+
98+bool HorizontalJournal::removeNonVisibleItems(qreal bufferFromY, qreal bufferToY)
99+{
100+ bool changed = false;
101+
102+ while (!m_visibleItems.isEmpty() && m_visibleItems.first()->y() + m_rowHeight < bufferFromY) {
103+ releaseItem(m_visibleItems.takeFirst());
104+ changed = true;
105+ m_firstVisibleIndex++;
106+ }
107+
108+ while (!m_visibleItems.isEmpty() && m_visibleItems.last()->y() > bufferToY) {
109+ releaseItem(m_visibleItems.takeLast());
110+ changed = true;
111+ m_lastInRowIndexPosition.remove(m_firstVisibleIndex + m_visibleItems.count());
112+ }
113+
114+ if (m_visibleItems.isEmpty()) {
115+ m_firstVisibleIndex = -1;
116+ }
117+
118+ return changed;
119+}
120+
121+void HorizontalJournal::positionItem(int modelIndex, QQuickItem *item)
122+{
123+ if (item->height() != m_rowHeight) {
124+ qWarning() << "Item" << modelIndex << "height is not the one that the rowHeight mandates, resetting it";
125+ item->setHeight(m_rowHeight);
126+ }
127+
128+ if (m_visibleItems.isEmpty()) {
129+ Q_ASSERT(modelIndex == 0);
130+ item->setY(0);
131+ item->setX(0);
132+ m_visibleItems << item;
133+ m_firstVisibleIndex = 0;
134+ } else {
135+ // modelIndex has to be either m_firstVisibleIndex - 1 or m_firstVisibleIndex + m_visibleItems.count()
136+ if (modelIndex == m_firstVisibleIndex + m_visibleItems.count()) {
137+ QQuickItem *lastItem = m_visibleItems.last();
138+ if (lastItem->x() + lastItem->width() + columnSpacing() + item->width() <= width()) {
139+ // Fits in the row
140+ item->setY(lastItem->y());
141+ item->setX(lastItem->x() + lastItem->width() + columnSpacing());
142+ } else {
143+ // Starts a new row
144+ item->setY(lastItem->y() + m_rowHeight + rowSpacing());
145+ item->setX(0);
146+ m_lastInRowIndexPosition[modelIndex - 1] = lastItem->x();
147+ }
148+ m_visibleItems << item;
149+ } else if (modelIndex == m_firstVisibleIndex - 1) {
150+ QQuickItem *firstItem = m_visibleItems.first();
151+ if (m_lastInRowIndexPosition.contains(modelIndex)) {
152+ // It is the last item of its row, so start a new one since we're going back
153+ item->setY(firstItem->y() - rowSpacing() - m_rowHeight);
154+ item->setX(m_lastInRowIndexPosition[modelIndex]);
155+ } else {
156+ item->setY(firstItem->y());
157+ item->setX(firstItem->x() - columnSpacing() - item->width());
158+ }
159+ m_firstVisibleIndex = modelIndex;
160+ m_visibleItems.prepend(item);
161+ } else {
162+ qWarning() << "HorizontalJournal::positionItem - Got unexpected modelIndex"
163+ << modelIndex << m_firstVisibleIndex << m_visibleItems.count();
164+ }
165+ }
166+}
167+
168+void HorizontalJournal::cleanupExistingItems()
169+{
170+ // Cleanup the existing items
171+ Q_FOREACH(QQuickItem *item, m_visibleItems)
172+ releaseItem(item);
173+ m_visibleItems.clear();
174+ m_lastInRowIndexPosition.clear();
175+ m_firstVisibleIndex = -1;
176+}
177+
178+void HorizontalJournal::calculateImplicitHeight()
179+{
180+ if (m_firstVisibleIndex >= 0) {
181+ const int nIndexes = m_firstVisibleIndex + m_visibleItems.count();
182+ const double bottomMostY = m_visibleItems.last()->y() + m_rowHeight;
183+ const double averageHeight = bottomMostY / nIndexes;
184+ setImplicitHeight(bottomMostY + averageHeight * (model()->rowCount() - nIndexes));
185+ } else {
186+ setImplicitHeight(0);
187+ }
188+}
189+
190+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
191+void HorizontalJournal::processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes)
192+#else
193+void HorizontalJournal::processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes)
194+#endif
195+{
196+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
197+ Q_FOREACH(const QQuickChangeSet::Remove &remove, removes) {
198+#else
199+ Q_FOREACH(const QQmlChangeSet::Remove &remove, removes) {
200+#endif
201+ for (int i = remove.count - 1; i >= 0; --i) {
202+ const int indexToRemove = remove.index + i;
203+ // We only support removing from the end so
204+ // any of the last items of a column has to be indexToRemove
205+ const int lastIndex = m_firstVisibleIndex + m_visibleItems.count() - 1;
206+ if (indexToRemove == lastIndex) {
207+ releaseItem(m_visibleItems.takeLast());
208+ m_lastInRowIndexPosition.remove(indexToRemove);
209+ } else {
210+ if (indexToRemove < lastIndex) {
211+ qFatal("HorizontalJournal only supports removal from the end of the model");
212+ } else {
213+ setImplicitHeightDirty();
214+ }
215+ }
216+ }
217+ }
218+ if (m_visibleItems.isEmpty()) {
219+ m_firstVisibleIndex = -1;
220+ }
221+}
222+
223+
224+void HorizontalJournal::doRelayout()
225+{
226+ // If m_firstVisibleIndex is not 0 we need to drop all the delegates
227+ // since we can't consistently relayout without the first item being there
228+
229+ if (m_firstVisibleIndex == 0) {
230+ int i = 0;
231+ const QList<QQuickItem*> allItems = m_visibleItems;
232+ m_visibleItems.clear();
233+ m_lastInRowIndexPosition.clear();
234+ Q_FOREACH(QQuickItem *item, allItems) {
235+ positionItem(i, item);
236+ ++i;
237+ }
238+ } else {
239+ Q_FOREACH(QQuickItem *item, m_visibleItems) {
240+ releaseItem(item);
241+ }
242+ m_visibleItems.clear();
243+ m_lastInRowIndexPosition.clear();
244+ m_firstVisibleIndex = -1;
245+ }
246+}
247+
248+void HorizontalJournal::updateItemCulling(qreal visibleFromY, qreal visibleToY)
249+{
250+ Q_FOREACH(QQuickItem *item, m_visibleItems) {
251+ QQuickItemPrivate::get(item)->setCulled(item->y() + m_rowHeight <= visibleFromY || item->y() >= visibleToY);
252+ }
253+}
plugins/DashViews/horizontaljournal.hnew file+67
@@ -0,0 +1,67 @@
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+#ifndef HORIZONTALJOURNAL_H
18+#define HORIZONTALJOURNAL_H
19+
20+#include "abstractjournal.h"
21+
22+ /** A horizontal journal is a view that creates delegates
23+ * based on a model and layouts them one after the other
24+ * in the same row until there is no more free space for the next item
25+ * and so that item is layouted in the next row
26+ *
27+ * All delegates are forced to rowHeight if they don't have it.
28+ */
29+ class HorizontalJournal : public AbstractJournal
30+{
31+ Q_OBJECT
32+
33+ Q_PROPERTY(qreal rowHeight READ rowHeight WRITE setRowHeight NOTIFY rowHeightChanged)
34+
35+friend class HorizontalJournalTest;
36+
37+public:
38+ HorizontalJournal();
39+
40+ qreal rowHeight() const;
41+ void setRowHeight(qreal rowHeight);
42+
43+Q_SIGNALS:
44+ void rowHeightChanged();
45+
46+private:
47+ void findBottomModelIndexToAdd(int *modelIndex, qreal *yPos) override;
48+ void findTopModelIndexToAdd(int *modelIndex, qreal *yPos) override;
49+ bool removeNonVisibleItems(qreal bufferFromY, qreal bufferToY) override;
50+ void positionItem(int modelIndex, QQuickItem *item) override;
51+ void cleanupExistingItems() override;
52+ void calculateImplicitHeight() override;
53+ void doRelayout() override;
54+ void updateItemCulling(qreal visibleFromY, qreal visibleToY) override;
55+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
56+ void processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes) override;
57+#else
58+ void processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes) override;
59+#endif
60+
61+ int m_firstVisibleIndex;
62+ QList<QQuickItem*> m_visibleItems;
63+ QMap<int, double> m_lastInRowIndexPosition;
64+ int m_rowHeight;
65+};
66+
67+#endif
plugins/ListViewWithPageHeader/listviewwithpageheader.cpp → plugins/DashViews/listviewwithpageheader.cpprenamed

The content is the same.

plugins/ListViewWithPageHeader/listviewwithpageheader.h → plugins/DashViews/listviewwithpageheader.hrenamed

The content is the same.

plugins/ListViewWithPageHeader/plugin.cpp → plugins/DashViews/plugin.cpprenamed+6−2
@@ -17,13 +17,17 @@
17
17
18#include "plugin.h"
18#include "plugin.h"
19
19
20+#include "horizontaljournal.h"
20#include "listviewwithpageheader.h"
21#include "listviewwithpageheader.h"
22+#include "verticaljournal.h"
21
23
22#include <QAbstractItemModel>
24#include <QAbstractItemModel>
23
25
24−void ListViewWithPageHeaderPlugin::registerTypes(const char *uri)
26+void DashViewsPlugin::registerTypes(const char *uri)
25{
27{
26− Q_ASSERT(uri == QLatin1String("ListViewWithPageHeader"));
28+ Q_ASSERT(uri == QLatin1String("DashViews"));
27 qmlRegisterType<QAbstractItemModel>();
29 qmlRegisterType<QAbstractItemModel>();
30+ qmlRegisterType<HorizontalJournal>(uri, 0, 1, "HorizontalJournal");
28 qmlRegisterType<ListViewWithPageHeader>(uri, 0, 1, "ListViewWithPageHeader");
31 qmlRegisterType<ListViewWithPageHeader>(uri, 0, 1, "ListViewWithPageHeader");
32+ qmlRegisterType<VerticalJournal>(uri, 0, 1, "VerticalJournal");
29}
33}
plugins/ListViewWithPageHeader/plugin.h → plugins/DashViews/plugin.hrenamed+3−3
@@ -15,13 +15,13 @@
15 *
15 *
16 */
16 */
17
17
18−#ifndef LISTVIEWWITHPAGEHEADER_PLUGIN_H
18+#ifndef DASHVIEWS_PLUGIN_H
19−#define LISTVIEWWITHPAGEHEADER_PLUGIN_H
19+#define DASHVIEWS_PLUGIN_H
20
20
21#include <QtQml/QQmlEngine>
21#include <QtQml/QQmlEngine>
22#include <QtQml/QQmlExtensionPlugin>
22#include <QtQml/QQmlExtensionPlugin>
23
23
24−class ListViewWithPageHeaderPlugin : public QQmlExtensionPlugin
24+class DashViewsPlugin : public QQmlExtensionPlugin
25{
25{
26 Q_OBJECT
26 Q_OBJECT
27 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
27 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
plugins/DashViews/qmldirnew file+3
@@ -0,0 +1,3 @@
1+module DashViews
2+plugin DashViews-qml
3+typeinfo plugin.qmltypes
plugins/DashViews/verticaljournal.cppnew file+280
@@ -0,0 +1,280 @@
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+/*
18+ * The implementation is centered around m_columnVisibleItems
19+ * that holds a vector of lists. There's a list for each of the
20+ * columns the view has. In the list the items of the column are
21+ * ordered as they appear topdown in the view. m_indexColumnMap is
22+ * used when re-building the list up since given a position
23+ * in the middle of the list and the need to create the previous does
24+ * not give us enough information to know in which column we have
25+ * to position the item so that when we reach the item the view is
26+ * correctly layouted at 0 for all the columns
27+ */
28+#include "verticaljournal.h"
29+
30+#pragma GCC diagnostic push
31+#pragma GCC diagnostic ignored "-pedantic"
32+#include <private/qquickitem_p.h>
33+#pragma GCC diagnostic pop
34+
35+static const qreal bufferRatio = 0.5;
36+
37+VerticalJournal::VerticalJournal()
38+ : m_columnWidth(0)
39+{
40+}
41+
42+qreal VerticalJournal::columnWidth() const
43+{
44+ return m_columnWidth;
45+}
46+
47+void VerticalJournal::setColumnWidth(qreal columnWidth)
48+{
49+ if (columnWidth != m_columnWidth) {
50+ m_columnWidth = columnWidth;
51+ Q_EMIT columnWidthChanged();
52+
53+ if (isComponentComplete()) {
54+ Q_FOREACH(const auto &column, m_columnVisibleItems) {
55+ Q_FOREACH(const ViewItem &item, column) {
56+ item.m_item->setWidth(columnWidth);
57+ }
58+ }
59+ relayout();
60+ }
61+ }
62+}
63+
64+void VerticalJournal::findBottomModelIndexToAdd(int *modelIndex, qreal *yPos)
65+{
66+ *modelIndex = 0;
67+ *yPos = std::numeric_limits<qreal>::max();
68+
69+ Q_FOREACH(const auto &column, m_columnVisibleItems) {
70+ if (!column.isEmpty()) {
71+ const ViewItem &item = column.last();
72+ *yPos = qMin(*yPos, item.y() + item.height() + rowSpacing());
73+ *modelIndex = qMax(*modelIndex, item.m_modelIndex + 1);
74+ } else {
75+ *yPos = 0;
76+ }
77+ }
78+}
79+
80+void VerticalJournal::findTopModelIndexToAdd(int *modelIndex, qreal *yPos)
81+{
82+ *modelIndex = INT_MAX;
83+ *yPos = std::numeric_limits<qreal>::lowest();
84+ int columnToAddTo = -1;
85+
86+ // Find the topmost free column
87+ for (int i = 0; i < m_columnVisibleItems.count(); ++i) {
88+ const auto &column = m_columnVisibleItems[i];
89+ if (!column.isEmpty()) {
90+ const ViewItem &item = column.first();
91+ const auto itemTopPos = item.y() - rowSpacing();
92+ if (itemTopPos > *yPos) {
93+ *yPos = itemTopPos;
94+ *modelIndex = item.m_modelIndex - 1;
95+ columnToAddTo = i;
96+ }
97+ }
98+ }
99+
100+ if (*modelIndex > 0) {
101+ Q_ASSERT(m_indexColumnMap.contains(*modelIndex));
102+ while (m_indexColumnMap[*modelIndex] != columnToAddTo) {
103+ // We found out that we have to add to columnToAddTo
104+ // and thought that we had to add *modelIndex, but history tells
105+ // it is not correct, so find up from *modelIndex until we found the index
106+ // that has to end up in columnToAddTo
107+ *modelIndex = *modelIndex - 1;
108+ Q_ASSERT(m_indexColumnMap.contains(*modelIndex));
109+ }
110+ }
111+}
112+
113+bool VerticalJournal::removeNonVisibleItems(qreal bufferFromY, qreal bufferToY)
114+{
115+ bool changed = false;
116+
117+ for (int i = 0; i < m_columnVisibleItems.count(); ++i) {
118+ QList<ViewItem> &column = m_columnVisibleItems[i];
119+ while (!column.isEmpty() && column.first().y() + column.first().height() < bufferFromY) {
120+ releaseItem(column.takeFirst().m_item);
121+ changed = true;
122+ }
123+
124+ while (!column.isEmpty() && column.last().y() > bufferToY) {
125+ releaseItem(column.takeLast().m_item);
126+ changed = true;
127+ }
128+ }
129+
130+ return changed;
131+}
132+
133+void VerticalJournal::positionItem(int modelIndex, QQuickItem *item)
134+{
135+ if (item->width() != m_columnWidth) {
136+ qWarning() << "Item" << modelIndex << "width is not the one that the columnWidth mandates, resetting it";
137+ item->setWidth(m_columnWidth);
138+ }
139+
140+ // Check if we add it to the bottom of existing column items
141+ const QList<ViewItem> &firstColumn = m_columnVisibleItems[0];
142+ qreal columnToAddY = !firstColumn.isEmpty() ? firstColumn.last().y() + firstColumn.last().height() : -rowSpacing();
143+ int columnToAddTo = 0;
144+ for (int i = 1; i < m_columnVisibleItems.count(); ++i) {
145+ const QList<ViewItem> &column = m_columnVisibleItems[i];
146+ const qreal iY = !column.isEmpty() ? column.last().y() + column.last().height() : -rowSpacing();
147+ if (iY < columnToAddY) {
148+ columnToAddTo = i;
149+ columnToAddY = iY;
150+ }
151+ }
152+
153+ const QList<ViewItem> &columnToAdd = m_columnVisibleItems[columnToAddTo];
154+ if (columnToAdd.isEmpty() || columnToAdd.last().m_modelIndex < modelIndex) {
155+ item->setX(columnToAddTo * (m_columnWidth + columnSpacing()));
156+ item->setY(columnToAddY + rowSpacing());
157+
158+ m_columnVisibleItems[columnToAddTo] << ViewItem(item, modelIndex);
159+ m_indexColumnMap[modelIndex] = columnToAddTo;
160+ } else {
161+ Q_ASSERT(m_indexColumnMap.contains(modelIndex));
162+ columnToAddTo = m_indexColumnMap[modelIndex];
163+ columnToAddY = m_columnVisibleItems[columnToAddTo].first().y();
164+
165+ item->setX(columnToAddTo * (m_columnWidth + columnSpacing()));
166+ item->setY(columnToAddY - rowSpacing() - item->height());
167+
168+ m_columnVisibleItems[columnToAddTo].prepend(ViewItem(item, modelIndex));
169+ }
170+}
171+
172+void VerticalJournal::cleanupExistingItems()
173+{
174+ // Cleanup the existing items
175+ for (int i = 0; i < m_columnVisibleItems.count(); ++i) {
176+ QList<ViewItem> &column = m_columnVisibleItems[i];
177+ Q_FOREACH(const ViewItem &item, column)
178+ releaseItem(item.m_item);
179+ column.clear();
180+ }
181+ m_indexColumnMap.clear();
182+}
183+
184+void VerticalJournal::calculateImplicitHeight()
185+{
186+ int lastModelIndex = -1;
187+ qreal bottomMostY = 0;
188+ Q_FOREACH(const auto &column, m_columnVisibleItems) {
189+ if (!column.isEmpty()) {
190+ const ViewItem &item = column.last();
191+ lastModelIndex = qMax(lastModelIndex, item.m_modelIndex);
192+ bottomMostY = qMax(bottomMostY, item.y() + item.height());
193+ }
194+ }
195+ if (lastModelIndex >= 0) {
196+ const double averageHeight = bottomMostY / (lastModelIndex + 1);
197+ setImplicitHeight(bottomMostY + averageHeight * (model()->rowCount() - lastModelIndex - 1));
198+ } else {
199+ setImplicitHeight(0);
200+ }
201+}
202+
203+void VerticalJournal::doRelayout()
204+{
205+ QList<ViewItem> allItems;
206+ Q_FOREACH(const auto &column, m_columnVisibleItems)
207+ allItems << column;
208+
209+ qSort(allItems);
210+
211+ const int nColumns = qMax(1., floor((double)(width() + columnSpacing()) / (m_columnWidth + columnSpacing())));
212+ m_columnVisibleItems.resize(nColumns);
213+ m_indexColumnMap.clear();
214+ for (int i = 0; i < nColumns; ++i)
215+ m_columnVisibleItems[i].clear();
216+
217+ // If the first of allItems doesn't contain index 0 we need to drop them
218+ // all since we can't consistently relayout without the first item being there
219+
220+ if (!allItems.isEmpty()) {
221+ if (allItems.first().m_modelIndex == 0) {
222+ Q_FOREACH(const ViewItem &item, allItems)
223+ positionItem(item.m_modelIndex, item.m_item);
224+ } else {
225+ Q_FOREACH(const ViewItem &item, allItems)
226+ releaseItem(item.m_item);
227+ }
228+ }
229+}
230+
231+void VerticalJournal::updateItemCulling(qreal visibleFromY, qreal visibleToY)
232+{
233+ Q_FOREACH(const auto &column, m_columnVisibleItems) {
234+ Q_FOREACH(const ViewItem &item, column) {
235+ const bool cull = item.y() + item.height() <= visibleFromY || item.y() >= visibleToY;
236+ QQuickItemPrivate::get(item.m_item)->setCulled(cull);
237+ }
238+ }
239+}
240+
241+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
242+void VerticalJournal::processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes)
243+#else
244+void VerticalJournal::processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes)
245+#endif
246+{
247+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
248+ Q_FOREACH(const QQuickChangeSet::Remove &remove, removes) {
249+#else
250+ Q_FOREACH(const QQmlChangeSet::Remove &remove, removes) {
251+#endif
252+ for (int i = remove.count - 1; i >= 0; --i) {
253+ const int indexToRemove = remove.index + i;
254+ // Since we only support removing from the end, indexToRemove
255+ // must refer to the last item of one of the columns or
256+ // be bigger than them (because it's not in the viewport and
257+ // thus we have not created a delegate for it)
258+ bool found = false;
259+ int lastCreatedIndex = INT_MIN;
260+ for (int i = 0; !found && i < m_columnVisibleItems.count(); ++i) {
261+ QList<ViewItem> &column = m_columnVisibleItems[i];
262+ if (!column.isEmpty()) {
263+ const int lastColumnIndex = column.last().m_modelIndex;
264+ if (lastColumnIndex == indexToRemove) {
265+ releaseItem(column.takeLast().m_item);
266+ found = true;
267+ }
268+ lastCreatedIndex = qMax(lastCreatedIndex, lastColumnIndex);
269+ }
270+ }
271+ if (!found) {
272+ if (indexToRemove < lastCreatedIndex) {
273+ qFatal("VerticalJournal only supports removal from the end of the model");
274+ } else {
275+ setImplicitHeightDirty();
276+ }
277+ }
278+ }
279+ }
280+}
plugins/DashViews/verticaljournal.hnew file+104
@@ -0,0 +1,104 @@
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+#ifndef VERTICALJOURNAL_H
18+#define VERTICALJOURNAL_H
19+
20+#include "abstractjournal.h"
21+
22+ /** A vertical journal is a view that creates delegates
23+ * based on a model and layouts them in columns following
24+ * a top-left most position rule.
25+ *
26+ * The number of columns is calculated using the width of
27+ * the view itself, the columnWidth (i.e. the width of each individual delegate)
28+ * and the columnSpacing between columns.
29+ *
30+ * All delegates are forced to columnWidth if they don't have it.
31+ *
32+ * The first nColumns items are layouted at row 0 from column 0
33+ * to column nColumns-1 in order. After that every new item
34+ * is positioned in the column which provides the free topmost
35+ * position as possible. If more than one column tie in providing
36+ * the topmost free position the leftmost column will be used.
37+ *
38+ * Example:
39+ *
40+ * +-----+ +-----+ +-----+
41+ * | | | 2 | | |
42+ * | | | | | |
43+ * | 1 | +-----+ | 3 |
44+ * | | +-----+ | |
45+ * | | | | +-----+
46+ * +-----+ | 4 | +-----+
47+ * +-----+ | | | 5 |
48+ * | 6 | +-----+ | |
49+ * | | +-----+
50+ * +-----+
51+ *
52+ */
53+
54+class VerticalJournal : public AbstractJournal
55+{
56+ Q_OBJECT
57+
58+ Q_PROPERTY(qreal columnWidth READ columnWidth WRITE setColumnWidth NOTIFY columnWidthChanged)
59+
60+friend class VerticalJournalTest;
61+
62+public:
63+ VerticalJournal();
64+
65+ qreal columnWidth() const;
66+ void setColumnWidth(qreal columnWidth);
67+
68+Q_SIGNALS:
69+ void columnWidthChanged();
70+
71+private:
72+ class ViewItem
73+ {
74+ public:
75+ ViewItem(QQuickItem *item, int modelIndex) : m_item(item), m_modelIndex(modelIndex) {}
76+ qreal x() const { return m_item->x(); }
77+ qreal y() const { return m_item->y(); }
78+ qreal height() const { return m_item->height(); }
79+ bool operator<(const ViewItem &v) const { return m_modelIndex < v.m_modelIndex; }
80+
81+ QQuickItem *m_item;
82+ int m_modelIndex;
83+ };
84+
85+ void findBottomModelIndexToAdd(int *modelIndex, qreal *yPos) override;
86+ void findTopModelIndexToAdd(int *modelIndex, qreal *yPos) override;
87+ bool removeNonVisibleItems(qreal bufferFromY, qreal bufferToY) override;
88+ void positionItem(int modelIndex, QQuickItem *item) override;
89+ void cleanupExistingItems() override;
90+ void calculateImplicitHeight() override;
91+ void doRelayout() override;
92+ void updateItemCulling(qreal visibleFromY, qreal visibleToY) override;
93+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
94+ void processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes) override;
95+#else
96+ void processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes) override;
97+#endif
98+
99+ QVector<QList<ViewItem>> m_columnVisibleItems;
100+ QHash<int, int> m_indexColumnMap;
101+ int m_columnWidth;
102+};
103+
104+#endif
plugins/HudClient/hudclient.cpp+1−16
@@ -243,28 +243,13 @@ void HudClient::modelReady(bool needDisconnect)
243 }
243 }
244}
244}
245
245
246−static QVariant QVariantFromGVariant(GVariant *value)
247−{
248− // Only handle the cases we care for now
249− switch (g_variant_classify(value)) {
250− case G_VARIANT_CLASS_BOOLEAN:
251− return QVariant((bool) g_variant_get_boolean(value));
252− case G_VARIANT_CLASS_DOUBLE:
253− return QVariant(g_variant_get_double(value));
254− case G_VARIANT_CLASS_STRING:
255− return QVariant(QString::fromUtf8(g_variant_get_string(value, NULL)));
256− default:
257− return QVariant();
258− }
259−}
260−
261static void addAttribute(QVariantMap &properties, GMenuModel *menuModel, int item, const char *attribute) {
246static void addAttribute(QVariantMap &properties, GMenuModel *menuModel, int item, const char *attribute) {
262 GVariant *v = g_menu_model_get_item_attribute_value(menuModel, item, attribute, NULL);
247 GVariant *v = g_menu_model_get_item_attribute_value(menuModel, item, attribute, NULL);
263
248
264 if (v == NULL)
249 if (v == NULL)
265 return;
250 return;
266
251
267− properties.insert(attribute, QVariantFromGVariant(v));
252+ properties.insert(attribute, DeeListModel::VariantForData(v));
268 g_variant_unref(v);
253 g_variant_unref(v);
269}
254}
270
255
plugins/LightDM/CMakeLists.txt+3−1
@@ -10,6 +10,7 @@ pkg_check_modules(LIBUSERMETRICSOUTPUT REQUIRED libusermetricsoutput-1)
10include_directories(
10include_directories(
11 ${CMAKE_CURRENT_SOURCE_DIR}
11 ${CMAKE_CURRENT_SOURCE_DIR}
12 ${CMAKE_CURRENT_BINARY_DIR}
12 ${CMAKE_CURRENT_BINARY_DIR}
13+ ${CMAKE_SOURCE_DIR}/plugins/Utils
13 ${CMAKE_SOURCE_DIR}/tests/mocks/LightDM
14 ${CMAKE_SOURCE_DIR}/tests/mocks/LightDM
14 #${LIBLIGHTDM_INCLUDE_DIRS}
15 #${LIBLIGHTDM_INCLUDE_DIRS}
15 ${LIBUSERMETRICSOUTPUT_INCLUDE_DIRS}
16 ${LIBUSERMETRICSOUTPUT_INCLUDE_DIRS}
@@ -17,6 +18,7 @@ include_directories(
17
18
18set(QMLPLUGIN_SRC
19set(QMLPLUGIN_SRC
19 ../Utils/qsortfilterproxymodelqml.cpp # FIXME evaluate a more generic approach for using other plugins
20 ../Utils/qsortfilterproxymodelqml.cpp # FIXME evaluate a more generic approach for using other plugins
21+ DBusGreeterList.cpp
20 Greeter.cpp
22 Greeter.cpp
21 plugin.cpp
23 plugin.cpp
22 UsersModel.cpp
24 UsersModel.cpp
@@ -33,7 +35,7 @@ target_link_libraries(LightDM-qml
33 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
35 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
34 )
36 )
35
37
36−qt5_use_modules(LightDM-qml Gui Qml)
38+qt5_use_modules(LightDM-qml DBus Gui Qml)
37
39
38# export the qmldir qmltypes and plugin files
40# export the qmldir qmltypes and plugin files
39export_qmlfiles(LightDM LightDM)
41export_qmlfiles(LightDM LightDM)
plugins/LightDM/DBusGreeterList.cppnew file+77
@@ -0,0 +1,77 @@
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+#include "DBusGreeterList.h"
18+#include "Greeter.h"
19+
20+#include <QDBusMessage>
21+#include <QStringList>
22+
23+DBusGreeterList::DBusGreeterList(Greeter *greeter, const QDBusConnection &connection, const QString &path)
24+ : QObject(greeter),
25+ m_greeter(greeter),
26+ m_connection(connection),
27+ m_path(path)
28+{
29+ connect(m_greeter, SIGNAL(authenticationUserChanged(const QString &)), this, SLOT(authenticationUserChangedHandler(const QString &)));
30+ connect(m_greeter, SIGNAL(promptlessChanged()), this, SLOT(promptlessChangedHandler()));
31+}
32+
33+QString DBusGreeterList::GetActiveEntry() const
34+{
35+ return m_greeter->authenticationUser();
36+}
37+
38+void DBusGreeterList::SetActiveEntry(const QString &entry)
39+{
40+ Q_EMIT m_greeter->requestAuthenticationUser(entry);
41+}
42+
43+bool DBusGreeterList::entryIsLocked() const
44+{
45+ return !m_greeter->promptless();
46+}
47+
48+void DBusGreeterList::authenticationUserChangedHandler(const QString &user)
49+{
50+ notifyPropertyChanged("ActiveEntry", user);
51+ Q_EMIT EntrySelected(user);
52+}
53+
54+void DBusGreeterList::promptlessChangedHandler()
55+{
56+ notifyPropertyChanged("EntryIsLocked", entryIsLocked());
57+ Q_EMIT entryIsLockedChanged();
58+}
59+
60+// Manually emit a PropertiesChanged signal over DBus, because QtDBus
61+// doesn't do it for us on Q_PROPERTIES, oddly enough.
62+void DBusGreeterList::notifyPropertyChanged(const QString& propertyName, const QVariant &value)
63+{
64+ QDBusMessage message;
65+ QVariantMap changedProps;
66+
67+ changedProps.insert(propertyName, value);
68+
69+ message = QDBusMessage::createSignal(m_path,
70+ "org.freedesktop.DBus.Properties",
71+ "PropertiesChanged");
72+ message << "com.canonical.UnityGreeter.List";
73+ message << changedProps;
74+ message << QStringList();
75+
76+ m_connection.send(message);
77+}
plugins/LightDM/DBusGreeterList.hnew file+61
@@ -0,0 +1,61 @@
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+#ifndef UNITY_DBUSGREETERLIST_H
18+#define UNITY_DBUSGREETERLIST_H
19+
20+#include <QDBusConnection>
21+#include <QObject>
22+
23+class Greeter;
24+class QDBusInterface;
25+
26+/** This is an internal class used to talk with the indicators.
27+ */
28+
29+class DBusGreeterList : public QObject
30+{
31+ Q_OBJECT
32+ Q_CLASSINFO("D-Bus Interface", "com.canonical.UnityGreeter.List")
33+
34+ Q_PROPERTY(QString ActiveEntry READ GetActiveEntry WRITE SetActiveEntry NOTIFY EntrySelected) // since 14.04
35+ Q_PROPERTY(bool EntryIsLocked READ entryIsLocked NOTIFY entryIsLockedChanged) // since 14.04
36+
37+public:
38+ explicit DBusGreeterList(Greeter *greeter, const QDBusConnection &connection, const QString &path);
39+
40+ Q_SCRIPTABLE void SetActiveEntry(const QString &entry); // since 13.04
41+ Q_SCRIPTABLE QString GetActiveEntry() const; // since 13.10
42+
43+ bool entryIsLocked() const;
44+
45+Q_SIGNALS:
46+ Q_SCRIPTABLE void EntrySelected(const QString &entry); // since 13.10
47+
48+ void entryIsLockedChanged();
49+
50+private Q_SLOTS:
51+ void authenticationUserChangedHandler(const QString &user);
52+ void promptlessChangedHandler();
53+ void notifyPropertyChanged(const QString &propertyName, const QVariant &value);
54+
55+private:
56+ Greeter *m_greeter;
57+ QDBusConnection m_connection;
58+ QString m_path;
59+};
60+
61+#endif
plugins/LightDM/Greeter.cpp+1
@@ -88,6 +88,7 @@ void Greeter::authenticate(const QString &username)
88 }
88 }
89
89
90 d->m_greeter->authenticate(username);
90 d->m_greeter->authenticate(username);
91+ Q_EMIT authenticationUserChanged(username);
91}
92}
92
93
93void Greeter::respond(const QString &response)
94void Greeter::respond(const QString &response)
plugins/LightDM/Greeter.h+6−1
@@ -35,7 +35,7 @@ class Greeter : public QObject
35 Q_OBJECT
35 Q_OBJECT
36
36
37 Q_PROPERTY(bool authenticated READ isAuthenticated)
37 Q_PROPERTY(bool authenticated READ isAuthenticated)
38− Q_PROPERTY(QString authenticationUser READ authenticationUser)
38+ Q_PROPERTY(QString authenticationUser READ authenticationUser NOTIFY authenticationUserChanged)
39 Q_PROPERTY(bool promptless READ promptless NOTIFY promptlessChanged)
39 Q_PROPERTY(bool promptless READ promptless NOTIFY promptlessChanged)
40
40
41public:
41public:
@@ -54,8 +54,13 @@ Q_SIGNALS:
54 void showMessage(const QString &text, bool isError);
54 void showMessage(const QString &text, bool isError);
55 void showPrompt(const QString &text, bool isSecret);
55 void showPrompt(const QString &text, bool isSecret);
56 void authenticationComplete();
56 void authenticationComplete();
57+ void authenticationUserChanged(const QString &user);
57 void promptlessChanged();
58 void promptlessChanged();
58
59
60+ // This signal is emitted by external agents like indicators, and the UI
61+ // should switch to this user if possible.
62+ void requestAuthenticationUser(const QString &user);
63+
59private:
64private:
60 GreeterPrivate * const d_ptr;
65 GreeterPrivate * const d_ptr;
61
66
plugins/LightDM/UsersModel.h+1−1
@@ -23,7 +23,7 @@
23#ifndef UNITY_USERSMODEL_H
23#ifndef UNITY_USERSMODEL_H
24#define UNITY_USERSMODEL_H
24#define UNITY_USERSMODEL_H
25
25
26−#include "plugins/Utils/qsortfilterproxymodelqml.h"
26+#include <qsortfilterproxymodelqml.h>
27#include <QtCore/QObject>
27#include <QtCore/QObject>
28
28
29class UsersModel : public QSortFilterProxyModelQML
29class UsersModel : public QSortFilterProxyModelQML
plugins/LightDM/plugin.cpp+14−2
@@ -18,20 +18,32 @@
18 */
18 */
19
19
20#include "plugin.h"
20#include "plugin.h"
21+#include "DBusGreeterList.h"
21#include "Greeter.h"
22#include "Greeter.h"
22#include "UsersModel.h"
23#include "UsersModel.h"
23#include <libusermetricsoutput/ColorTheme.h>
24#include <libusermetricsoutput/ColorTheme.h>
24#include <libusermetricsoutput/UserMetrics.h>
25#include <libusermetricsoutput/UserMetrics.h>
25#include <QLightDM/UsersModel>
26#include <QLightDM/UsersModel>
26
27
27−#include <QtCore/QAbstractItemModel>
28+#include <QAbstractItemModel>
29+#include <QDBusConnection>
28#include <QtQml/qqml.h>
30#include <QtQml/qqml.h>
29
31
32+static const char* GREETER_LIST_DBUS_PATH = "/list";
33+static const char* GREETER_DBUS_SERVICE = "com.canonical.UnityGreeter";
34+
30static QObject *greeter_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
35static QObject *greeter_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
31{
36{
32 Q_UNUSED(engine)
37 Q_UNUSED(engine)
33 Q_UNUSED(scriptEngine)
38 Q_UNUSED(scriptEngine)
39+
40+ Greeter *greeter = new Greeter();
41+ QDBusConnection connection = QDBusConnection::sessionBus();
42+ DBusGreeterList *list = new DBusGreeterList(greeter, connection, GREETER_LIST_DBUS_PATH);
43+ connection.registerObject(GREETER_LIST_DBUS_PATH, list, QDBusConnection::ExportScriptableContents);
44+ connection.registerService(GREETER_DBUS_SERVICE);
45+
34− return new Greeter();
46+ return greeter;
35}
47}
36
48
37static QObject *users_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
49static QObject *users_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
plugins/ListViewWithPageHeader/qmldirdeleted−3
@@ -1,3 +0,0 @@
1−module ListViewWithPageHeader
2−plugin ListViewWithPageHeader-qml
3−typeinfo plugin.qmltypes
plugins/Ubuntu/Gestures/CMakeLists.txt+1
@@ -6,6 +6,7 @@ set(UbuntuGestureQml_SOURCES
6 AxisVelocityCalculator.cpp
6 AxisVelocityCalculator.cpp
7 Direction.cpp
7 Direction.cpp
8 DirectionalDragArea.cpp
8 DirectionalDragArea.cpp
9+ PressedOutsideNotifier.cpp
9 TimeSource.cpp
10 TimeSource.cpp
10)
11)
11
12
plugins/Ubuntu/Gestures/PressedOutsideNotifier.cppnew file+119
@@ -0,0 +1,119 @@
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+#include "PressedOutsideNotifier.h"
18+
19+#include <QMouseEvent>
20+
21+PressedOutsideNotifier::PressedOutsideNotifier(QQuickItem *parent)
22+ : QQuickItem(parent)
23+{
24+ connect(this, &QQuickItem::enabledChanged,
25+ this, &PressedOutsideNotifier::setupOrTearDownEventFiltering);
26+
27+ m_signalEmissionTimer.setSingleShot(true);
28+ m_signalEmissionTimer.setInterval(0); // times out on the next iteration of the event loop
29+ connect(&m_signalEmissionTimer, &QTimer::timeout,
30+ this, &PressedOutsideNotifier::pressedOutside);
31+}
32+
33+bool PressedOutsideNotifier::eventFilter(QObject *watched, QEvent *event)
34+{
35+ Q_UNUSED(watched);
36+ Q_ASSERT(watched == m_filteredWindow);
37+
38+ // We are already going to emit pressedOutside() anyway, thus no need
39+ // for new checks.
40+ // This case takes place when a QTouchEvent comes in and isn't handled by any item,
41+ // causing QQuickWindow to synthesize a QMouseEvent out of it, which would
42+ // be filtered by us as well and count as a second press, which is wrong.
43+ if (m_signalEmissionTimer.isActive()) {
44+ return false;
45+ }
46+
47+ switch (event->type()) {
48+ case QEvent::MouseButtonPress: {
49+ QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
50+ QPointF p = mapFromScene(mouseEvent->windowPos());
51+ if (!contains(p)) {
52+ m_signalEmissionTimer.start();
53+ }
54+ break;
55+ }
56+ case QEvent::TouchBegin:
57+ processFilteredTouchBegin(static_cast<QTouchEvent*>(event));
58+ default:
59+ break;
60+ }
61+
62+ // let the event be handled further
63+ return false;
64+}
65+
66+void PressedOutsideNotifier::itemChange(ItemChange change, const ItemChangeData &value)
67+{
68+ if (change == QQuickItem::ItemSceneChange) {
69+ setupOrTearDownEventFiltering();
70+ }
71+
72+ QQuickItem::itemChange(change, value);
73+}
74+
75+void PressedOutsideNotifier::setupOrTearDownEventFiltering()
76+{
77+ if (isEnabled() && window()) {
78+ setupEventFiltering();
79+ } else if (m_filteredWindow) {
80+ tearDownEventFiltering();
81+ }
82+}
83+
84+void PressedOutsideNotifier::setupEventFiltering()
85+{
86+ QQuickWindow *currentWindow = window();
87+ Q_ASSERT(currentWindow != nullptr);
88+
89+ if (currentWindow == m_filteredWindow)
90+ return;
91+
92+ if (m_filteredWindow) {
93+ m_filteredWindow->removeEventFilter(this);
94+ }
95+
96+ currentWindow->installEventFilter(this);
97+ m_filteredWindow = currentWindow;
98+}
99+
100+void PressedOutsideNotifier::tearDownEventFiltering()
101+{
102+ m_filteredWindow->removeEventFilter(this);
103+ m_filteredWindow.clear();
104+}
105+
106+void PressedOutsideNotifier::processFilteredTouchBegin(QTouchEvent *event)
107+{
108+ const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints();
109+ for (int i = 0; i < touchPoints.count(); ++i) {
110+ const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i);
111+ if (touchPoint.state() == Qt::TouchPointPressed) {
112+ QPointF p = mapFromScene(touchPoint.pos());
113+ if (!contains(p)) {
114+ m_signalEmissionTimer.start();
115+ return;
116+ }
117+ }
118+ }
119+}
plugins/Ubuntu/Gestures/PressedOutsideNotifier.hnew file+62
@@ -0,0 +1,62 @@
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+#ifndef PRESSED_OUTSIDE_NOTIFIER_H
18+#define PRESSED_OUTSIDE_NOTIFIER_H
19+
20+#include <QQuickItem>
21+
22+#include <QQuickWindow>
23+#include <QPointer>
24+#include <QTimer>
25+
26+#include "UbuntuGesturesGlobal.h"
27+
28+/*
29+ Notifies when a point, mouse or touch, is pressed outside its area.
30+
31+ Only enable it while needed.
32+ */
33+class UBUNTUGESTURES_EXPORT PressedOutsideNotifier : public QQuickItem {
34+ Q_OBJECT
35+
36+public:
37+ PressedOutsideNotifier(QQuickItem * parent = nullptr);
38+
39+ // From QObject
40+ bool eventFilter(QObject *watched, QEvent *event) override;
41+
42+Q_SIGNALS:
43+ void pressedOutside();
44+
45+protected:
46+ void itemChange(ItemChange change, const ItemChangeData &value) override;
47+
48+private Q_SLOTS:
49+ void setupOrTearDownEventFiltering();
50+
51+private:
52+ void setupEventFiltering();
53+ void tearDownEventFiltering();
54+ void processFilteredTouchBegin(QTouchEvent *event);
55+
56+ QPointer<QQuickWindow> m_filteredWindow;
57+
58+ // Emits pressedOutside() signal on timeout
59+ QTimer m_signalEmissionTimer;
60+};
61+
62+#endif // PRESSED_OUTSIDE_NOTIFIER_H
plugins/Ubuntu/Gestures/plugin.cpp+2
@@ -18,6 +18,7 @@
18#include "AxisVelocityCalculator.h"
18#include "AxisVelocityCalculator.h"
19#include "Direction.h"
19#include "Direction.h"
20#include "DirectionalDragArea.h"
20#include "DirectionalDragArea.h"
21+#include "PressedOutsideNotifier.h"
21
22
22#include <qqml.h>
23#include <qqml.h>
23
24
@@ -32,4 +33,5 @@ void UbuntuGestureQmlPlugin::registerTypes(const char *uri)
32 qmlRegisterSingletonType<Direction>(uri, 0, 1, "Direction", directionSingleton);
33 qmlRegisterSingletonType<Direction>(uri, 0, 1, "Direction", directionSingleton);
33 qmlRegisterType<DirectionalDragArea>(uri, 0, 1, "DirectionalDragArea");
34 qmlRegisterType<DirectionalDragArea>(uri, 0, 1, "DirectionalDragArea");
34 qmlRegisterType<AxisVelocityCalculator>(uri, 0, 1, "AxisVelocityCalculator");
35 qmlRegisterType<AxisVelocityCalculator>(uri, 0, 1, "AxisVelocityCalculator");
36+ qmlRegisterType<PressedOutsideNotifier>(uri, 0, 1, "PressedOutsideNotifier");
35}
37}
plugins/Unity/Indicators/CMakeLists.txt−1
@@ -36,7 +36,6 @@ set(IndicatorsQML_SOURCES
36 unitymenumodelcache.cpp
36 unitymenumodelcache.cpp
37 unitymenumodelstack.cpp
37 unitymenumodelstack.cpp
38 visibleindicatorsmodel.cpp
38 visibleindicatorsmodel.cpp
39− timeformatter.cpp
40)
39)
41add_definitions(-DUNITYINDICATORS_LIBRARY)
40add_definitions(-DUNITYINDICATORS_LIBRARY)
42
41
plugins/Unity/Indicators/Messaging/qml/MessageMenuItemFactory.qml+93−60
@@ -24,124 +24,153 @@ import Unity.Indicators 0.1 as Indicators
24import QMenuModel 0.1 as QMenuModel
24import QMenuModel 0.1 as QMenuModel
25
25
26Indicators.BaseMenuItem {
26Indicators.BaseMenuItem {
27− id: menuItem
27+ id: messageFactoryItem
28− property var actionsDescription: menu ? menu.ext.xCanonicalMessageActions : undefined
28+ property var menuModel: null
29+ property QtObject menuData: null
30+ property int menuIndex: -1
29
31
30− implicitHeight: contents.status == Loader.Ready ? contents.item.implicitHeight : 0
32+ property var extendedData: menuData && menuData.ext || undefined
33+ property var actionsDescription: getExtendedProperty(extendedData, "xCanonicalMessageActions", undefined)
31
34
32− property var model: null
35+ onMenuModelChanged: {
36+ loadAttributes();
37+ }
38+ onMenuIndexChanged: {
39+ loadAttributes();
40+ }
33
41
34− Loader {
42+ function loadAttributes() {
35− id: contents
43+ if (!menuModel || menuIndex == undefined) return;
36− anchors.fill: parent
37
44
38− sourceComponent: loadMessage(actionsDescription);
45+ menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-time': 'int64',
46+ 'x-canonical-text': 'string',
47+ 'x-canonical-message-actions': 'variant',
48+ 'icon': 'icon',
49+ 'x-canonical-app-icon': 'icon'});
50+ }
39
51
40− // Binding all properties for the item, to make sure that any change in the
52+ function getExtendedProperty(object, propertyName, defaultValue) {
41− // property will be propagated to the contents.item at any time
53+ if (object && object.hasOwnProperty(propertyName)) {
42− Binding {
54+ return object[propertyName];
43− target: contents.item
44− property: "menuSelected"
45− value: menuSelected
46− when: (contents.status == Loader.Ready)
47 }
55 }
56+ return defaultValue;
57+ }
48
58
49− Binding {
50− target: contents.item
51− property: "menu"
52− value: menu
53− when: (contents.status == Loader.Ready)
59+ implicitHeight: contents.status == Loader.Ready ? contents.item.implicitHeight : 0
54− }
55
60
56− Connections {
61+ Loader {
57− target: contents.item ? contents.item : null
62+ id: contents
58− onSelectMenu: selectMenu()
63+ objectName: "loader"
59− onDeselectMenu: deselectMenu()
64+ anchors.fill: parent
60− }
65+
66+ sourceComponent: loadMessage(actionsDescription);
61
67
62 Component {
68 Component {
63 id: simpleTextMessage
69 id: simpleTextMessage
64 SimpleTextMessage {
70 SimpleTextMessage {
71+ objectName: "simpleTextMessage"
65 // text
72 // text
66− title: menu && menu.label ? menu.label : ""
73+ title: menuData && menuData.label || ""
67− time: menu ? menu.ext.xCanonicalTime : 0
74+ time: getExtendedProperty(extendedData, "xCanonicalTime", 0)
68− message: menu && menu.ext.xCanonicalText ? menu.ext.xCanonicalText : ""
75+ message: getExtendedProperty(extendedData, "xCanonicalText", "")
69 // icons
76 // icons
70− avatar: menu && menu.ext.icon !== undefined ? menu.ext.icon : "qrc:/indicators/artwork/messaging/default_contact.png"
77+ avatar: getExtendedProperty(extendedData, "icon", "qrc:/indicators/artwork/messaging/default_contact.png")
71− appIcon: menu && menu.ext.xCanonicalAppIcon !== undefined ? menu.ext.xCanonicalAppIcon : "qrc:/indicators/artwork/messaging/default_app.svg"
78+ appIcon: getExtendedProperty(extendedData, "xCanonicalAppIcon", "qrc:/indicators/artwork/messaging/default_app.svg")
79+ // actions
80+ enabled: menuData && menuData.sensitive || false
72
81
73 onActivateApp: {
82 onActivateApp: {
74− menuItem.model.activate(modelIndex, true);
83+ menuModel.activate(menuIndex, true);
84+ shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
75 }
85 }
76 onDismiss: {
86 onDismiss: {
77− menuItem.model.activate(modelIndex, false);
87+ menuModel.activate(menuIndex, false);
78 }
88 }
89+
90+ menuSelected: messageFactoryItem.menuSelected
91+ onSelectMenu: messageFactoryItem.selectMenu()
92+ onDeselectMenu: messageFactoryItem.deselectMenu()
79 }
93 }
80 }
94 }
81 Component {
95 Component {
82 id: textMessage
96 id: textMessage
83 TextMessage {
97 TextMessage {
98+ objectName: "textMessage"
99+ property var replyActionDescription: actionsDescription && actionsDescription.length > 0 ? actionsDescription[0] : undefined
100+
84 property var replyAction: QMenuModel.UnityMenuAction {
101 property var replyAction: QMenuModel.UnityMenuAction {
85− model: menuItem.model
102+ model: menuModel
86− index: modelIndex
103+ index: menuIndex
87− name: menu && actionsDescription[0].name ? actionsDescription[0].name : ""
104+ name: getExtendedProperty(replyActionDescription, "name", "")
88 }
105 }
89
106
90 // text
107 // text
91− title: menu && menu.label ? menu.label : ""
108+ title: menuData && menuData.label || ""
92− time: menu ? menu.ext.xCanonicalTime : 0
109+ time: getExtendedProperty(extendedData, "xCanonicalTime", 0)
93− message: menu && menu.ext.xCanonicalText ? menu.ext.xCanonicalText : ""
110+ message: getExtendedProperty(extendedData, "xCanonicalText", "")
94− replyButtonText: actionsDescription && actionsDescription[0].label ? actionsDescription[0].label : "Send"
111+ replyButtonText: getExtendedProperty(replyActionDescription, "label", "Send")
95 // icons
112 // icons
96− avatar: menu && menu.ext.icon !== undefined ? menu.ext.icon : "qrc:/indicators/artwork/messaging/default_contact.png"
113+ avatar: getExtendedProperty(extendedData, "icon", "qrc:/indicators/artwork/messaging/default_contact.png")
97− appIcon: menu && menu.ext.xCanonicalAppIcon !== undefined ? menu.ext.xCanonicalAppIcon : "qrc:/indicators/artwork/messaging/default_app.svg"
114+ appIcon: getExtendedProperty(extendedData, "xCanonicalAppIcon", "qrc:/indicators/artwork/messaging/default_app.svg")
98 // actions
115 // actions
99 replyEnabled: replyAction.valid && replyAction.enabled
116 replyEnabled: replyAction.valid && replyAction.enabled
117+ enabled: menuData && menuData.sensitive || false
100
118
101 onActivateApp: {
119 onActivateApp: {
102− menuItem.model.activate(modelIndex, true);
120+ menuModel.activate(menuIndex, true);
121+ shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
103 }
122 }
104 onDismiss: {
123 onDismiss: {
105− menuItem.model.activate(modelIndex, false);
124+ menuModel.activate(menuIndex, false);
106 }
125 }
107 onReply: {
126 onReply: {
108 replyAction.activate(value);
127 replyAction.activate(value);
109 }
128 }
129+
130+ menuSelected: messageFactoryItem.menuSelected
131+ onSelectMenu: messageFactoryItem.selectMenu()
132+ onDeselectMenu: messageFactoryItem.deselectMenu()
110 }
133 }
111 }
134 }
112 Component {
135 Component {
113 id: snapDecision
136 id: snapDecision
114 SnapDecision {
137 SnapDecision {
138+ objectName: "snapDecision"
139+ property var activateActionDescription: actionsDescription && actionsDescription.length > 0 ? actionsDescription[0] : undefined
140+ property var replyActionDescription: actionsDescription && actionsDescription.length > 1 ? actionsDescription[1] : undefined
141+
115 property var activateAction: QMenuModel.UnityMenuAction {
142 property var activateAction: QMenuModel.UnityMenuAction {
116− model: menuItem.model
143+ model: menuModel
117− index: modelIndex
144+ index: menuIndex
118− name: menu && actionsDescription[0].name ? actionsDescription[0].name : ""
145+ name: getExtendedProperty(activateActionDescription, "name", "")
119 }
146 }
120 property var replyAction: QMenuModel.UnityMenuAction {
147 property var replyAction: QMenuModel.UnityMenuAction {
121− model: menuItem.model
148+ model: menuModel
122− index: modelIndex
149+ index: menuIndex
123− name: menu && actionsDescription[1].name ? actionsDescription[1].name : ""
150+ name: getExtendedProperty(replyActionDescription, "name", "")
124 }
151 }
125
152
126 // text
153 // text
127− title: menu && menu.label ? menu.label : ""
154+ title: menuData && menuData.label || ""
128− time: menu ? menu.ext.xCanonicalTime : ""
155+ time: getExtendedProperty(extendedData, "xCanonicalTime", 0)
129− message: menu && menu.ext.xCanonicalText ? menu.ext.xCanonicalText : ""
156+ message: getExtendedProperty(extendedData, "xCanonicalText", "")
130− actionButtonText: actionsDescription && actionsDescription[0].label ? actionsDescription[0].label : "Call back"
157+ actionButtonText: getExtendedProperty(activateActionDescription, "label", "Call back")
131− replyButtonText: actionsDescription && actionsDescription[1].label ? actionsDescription[1].label : "Send"
158+ replyButtonText: getExtendedProperty(replyActionDescription, "label", "Send")
132− replyMessages: actionsDescription && actionsDescription[1]["parameter-hint"] ? actionsDescription[1]["parameter-hint"] : ""
159+ replyMessages: getExtendedProperty(replyActionDescription, "parameter-hint", "")
133 // icons
160 // icons
134− avatar: menu && menu.ext.icon !== undefined ? menu.ext.icon : "qrc:/indicators/artwork/messaging/default_contact.png"
161+ avatar: getExtendedProperty(extendedData, "icon", "qrc:/indicators/artwork/messaging/default_contact.png")
135− appIcon: menu && menu.ext.xCanonicalAppIcon !== undefined ? menu.ext.xCanonicalAppIcon : "qrc:/indicators/artwork/messaging/default_app.svg"
162+ appIcon: getExtendedProperty(extendedData, "xCanonicalAppIcon", "qrc:/indicators/artwork/messaging/default_app.svg")
136 // actions
163 // actions
137 activateEnabled: activateAction.valid && activateAction.enabled
164 activateEnabled: activateAction.valid && activateAction.enabled
138 replyEnabled: replyAction.valid && replyAction.enabled
165 replyEnabled: replyAction.valid && replyAction.enabled
166+ enabled: menuData && menuData.sensitive || false
139
167
140 onActivateApp: {
168 onActivateApp: {
141− menuItem.model.activate(modelIndex, true);
169+ menuModel.activate(menuIndex, true);
170+ shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
142 }
171 }
143 onDismiss: {
172 onDismiss: {
144− menuItem.model.activate(modelIndex, false);
173+ menuModel.activate(menuIndex, false);
145 }
174 }
146 onActivate: {
175 onActivate: {
147 activateAction.activate();
176 activateAction.activate();
@@ -149,6 +178,10 @@ Indicators.BaseMenuItem {
149 onReply: {
178 onReply: {
150 replyAction.activate(value);
179 replyAction.activate(value);
151 }
180 }
181+
182+ menuSelected: messageFactoryItem.menuSelected
183+ onSelectMenu: messageFactoryItem.selectMenu()
184+ onDeselectMenu: messageFactoryItem.deselectMenu()
152 }
185 }
153 }
186 }
154 }
187 }
plugins/Unity/Indicators/Messaging/qml/SimpleTextMessage.qml+2−1
@@ -21,6 +21,7 @@
21import QtQuick 2.0
21import QtQuick 2.0
22import Ubuntu.Components 0.1
22import Ubuntu.Components 0.1
23import Unity.Indicators 0.1
23import Unity.Indicators 0.1
24+import Utils 0.1 as Utils
24
25
25HeroMessage {
26HeroMessage {
26 id: __heroMessage
27 id: __heroMessage
@@ -50,7 +51,7 @@ HeroMessage {
50 opacity: 0.0
51 opacity: 0.0
51 enabled: false
52 enabled: false
52
53
53− TimeFormatter {
54+ Utils.TimeFormatter {
54 id: timeFormatter
55 id: timeFormatter
55 time: __heroMessage.time
56 time: __heroMessage.time
56 format: "hh:mm - MMM dd"
57 format: "hh:mm - MMM dd"
plugins/Unity/Indicators/Messaging/qml/SnapDecision.qml+2−2
@@ -20,8 +20,8 @@
20
20
21import QtQuick 2.0
21import QtQuick 2.0
22import Ubuntu.Components 0.1
22import Ubuntu.Components 0.1
23−import Unity.Indicators 0.1 as Indicators
24import Unity.Indicators 0.1
23import Unity.Indicators 0.1
24+import Utils 0.1 as Utils
25
25
26HeroMessage {
26HeroMessage {
27 id: snapDecision
27 id: snapDecision
@@ -59,7 +59,7 @@ HeroMessage {
59 height: units.gu(4)
59 height: units.gu(4)
60 opacity: 0.0
60 opacity: 0.0
61
61
62− TimeFormatter {
62+ Utils.TimeFormatter {
63 id: timeFormatter
63 id: timeFormatter
64 time: snapDecision.time
64 time: snapDecision.time
65 format: "hh:mm - MMM dd"
65 format: "hh:mm - MMM dd"
plugins/Unity/Indicators/Network/qml/AccessPoint.qml+2−2
@@ -30,7 +30,7 @@ Indicators.BaseMenuItem {
30 property bool secure: false
30 property bool secure: false
31 property bool adHoc: false
31 property bool adHoc: false
32 property int signalStrength: 0
32 property int signalStrength: 0
33− property alias text: label.text
33+ property alias label: _label.text
34
34
35 signal activate()
35 signal activate()
36
36
@@ -89,7 +89,7 @@ Indicators.BaseMenuItem {
89 }
89 }
90
90
91 Label {
91 Label {
92− id: label
92+ id: _label
93 anchors {
93 anchors {
94 left: iconSignal.right
94 left: iconSignal.right
95 leftMargin: units.gu(1)
95 leftMargin: units.gu(1)
plugins/Unity/Indicators/indicatorsmanager.cpp+1−1
@@ -24,7 +24,7 @@
24#include <upstart.h>
24#include <upstart.h>
25#include <nih/alloc.h>
25#include <nih/alloc.h>
26
26
27−#include "paths.h"
27+#include <paths.h>
28
28
29const QString profile = "phone";
29const QString profile = "phone";
30
30
plugins/Unity/Indicators/indicatorsmodel.cpp+4−3
@@ -21,7 +21,8 @@
21#include "indicatorsmanager.h"
21#include "indicatorsmanager.h"
22#include "indicator.h"
22#include "indicator.h"
23#include "indicators.h"
23#include "indicators.h"
24+
24−#include "paths.h"
25+#include <paths.h>
25
26
26#include <QQmlContext>
27#include <QQmlContext>
27#include <QQmlEngine>
28#include <QQmlEngine>
@@ -248,9 +249,9 @@ QVariant IndicatorsModel::data(const QModelIndex &index, int role) const
248 }
249 }
249 break;
250 break;
250 case IndicatorsModelRole::WidgetSource:
251 case IndicatorsModelRole::WidgetSource:
251− return shellAppDirectory()+"/Panel/Indicators/DefaultIndicatorWidget.qml";
252+ return qmlDirectory()+"/Panel/Indicators/DefaultIndicatorWidget.qml";
252 case IndicatorsModelRole::PageSource:
253 case IndicatorsModelRole::PageSource:
253− return shellAppDirectory()+"/Panel/Indicators/DefaultIndicatorPage.qml";
254+ return qmlDirectory()+"/Panel/Indicators/DefaultIndicatorPage.qml";
254 default:
255 default:
255 break;
256 break;
256 }
257 }
plugins/Unity/Indicators/plugin.cpp−2
@@ -33,7 +33,6 @@
33#include "unitymenumodelcache.h"
33#include "unitymenumodelcache.h"
34#include "unitymenumodelstack.h"
34#include "unitymenumodelstack.h"
35#include "visibleindicatorsmodel.h"
35#include "visibleindicatorsmodel.h"
36−#include "timeformatter.h"
37
36
38static QObject* menuModelCacheSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
37static QObject* menuModelCacheSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
39 Q_UNUSED(engine);
38 Q_UNUSED(engine);
@@ -52,7 +51,6 @@ void Indicators2Plugin::registerTypes(const char *uri)
52 qmlRegisterType<RootActionState>(uri, 0, 1, "RootActionState");
51 qmlRegisterType<RootActionState>(uri, 0, 1, "RootActionState");
53 qmlRegisterType<ModelPrinter>(uri, 0, 1, "ModelPrinter");
52 qmlRegisterType<ModelPrinter>(uri, 0, 1, "ModelPrinter");
54 qmlRegisterType<VisibleIndicatorsModel>(uri, 0, 1, "VisibleIndicatorsModel");
53 qmlRegisterType<VisibleIndicatorsModel>(uri, 0, 1, "VisibleIndicatorsModel");
55− qmlRegisterType<TimeFormatter>(uri, 0, 1, "TimeFormatter");
56
54
57 qmlRegisterSingletonType<UnityMenuModelCache>(uri, 0, 1, "UnityMenuModelCache", menuModelCacheSingleton);
55 qmlRegisterSingletonType<UnityMenuModelCache>(uri, 0, 1, "UnityMenuModelCache", menuModelCacheSingleton);
58
56
plugins/Unity/Indicators/qml/ButtonMenuItem.qml+1−1
@@ -26,7 +26,7 @@ BaseMenuItem {
26 id: menuItem
26 id: menuItem
27 implicitHeight: units.gu(7)
27 implicitHeight: units.gu(7)
28
28
29− property alias text: button.text
29+ property alias buttonText: button.text
30
30
31 signal activate()
31 signal activate()
32
32
plugins/Unity/Indicators/qml/IndicatorWidget.qmldeleted−28
@@ -1,28 +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−IndicatorBase {
24− id: indicatorWidget
25−
26− enabled: false
27− property int iconSize: height
28−}
plugins/Unity/Indicators/qml/MenuItemFactory.qml+157−89
@@ -22,11 +22,12 @@ import Unity.Indicators 0.1 as Indicators
22import Unity.Indicators.Network 0.1 as ICNetwork
22import Unity.Indicators.Network 0.1 as ICNetwork
23import Unity.Indicators.Messaging 0.1 as ICMessaging
23import Unity.Indicators.Messaging 0.1 as ICMessaging
24import QMenuModel 0.1 as QMenuModel
24import QMenuModel 0.1 as QMenuModel
25+import Ubuntu.Components 0.1
25
26
26Item {
27Item {
27 id: menuFactory
28 id: menuFactory
28
29
29− property var model: null
30+ property var menuModel: null
30
31
31 property var _map: {
32 property var _map: {
32 "unity.widgets.systemsettings.tablet.volumecontrol" : sliderMenu,
33 "unity.widgets.systemsettings.tablet.volumecontrol" : sliderMenu,
@@ -49,38 +50,61 @@ Item {
49 "unity.widgets.systemsettings.tablet.accesspoint" : accessPoint,
50 "unity.widgets.systemsettings.tablet.accesspoint" : accessPoint,
50 }
51 }
51
52
53+ function getExtendedProperty(object, propertyName, defaultValue) {
54+ if (object && object.hasOwnProperty(propertyName)) {
55+ return object[propertyName];
56+ }
57+ return defaultValue;
58+ }
59+
60+ Component {
61+ id: divMenu;
52− Component { id: divMenu; Indicators.DivMenuItem {} }
62+ Indicators.DivMenuItem {
63+ objectName: "divMenu"
64+ }
65+ }
53
66
54 Component {
67 Component {
55 id: sliderMenu;
68 id: sliderMenu;
56 Indicators.SliderMenuItem {
69 Indicators.SliderMenuItem {
70+ objectName: "sliderMenu"
57− property QtObject menu: null
71+ property QtObject menuData: null
58−
72+ property var menuModel: menuFactory.menuModel
59− text: menu && menu.label ? menu.label : ""
73+ property int menuIndex: -1
60− icon: menu && menu.icon ? menu.icon : ""
74+ property var extendedData: menuData && menuData.ext || undefined
61− minIcon: menu && menu.ext.minIcon ? menu.ext.minIcon : ""
75+
62− maxIcon: menu && menu.ext.maxIcon ? menu.ext.maxIcon : ""
76+ text: menuData && menuData.label || ""
63−
77+ iconSource: menuData && menuData.icon || ""
78+ minIcon: getExtendedProperty(extendedData, "minIcon", "")
79+ maxIcon: getExtendedProperty(extendedData, "maxIcon", "")
80+
64− minimumValue: menu.ext.minValue ? menu.ext.minValue : 0.0
81+ minimumValue: getExtendedProperty(extendedData, "minValue", 0.0)
65 maximumValue: {
82 maximumValue: {
66− var maximum = menu.ext.maxValue ? menu.ext.maxValue : 1.0
83+ var maximum = getExtendedProperty(extendedData, "maxValue", 1.0);
67 if (maximum <= minimumValue) {
84 if (maximum <= minimumValue) {
68 return minimumValue + 1;
85 return minimumValue + 1;
69 }
86 }
70 return maximum;
87 return maximum;
71 }
88 }
72− value: menu ? menu.actionState : 0.0
89+ value: menuData && menuData.actionState || 0.0
73− enabled: menu ? menu.sensitive : false
90+ enabled: menuData && menuData.sensitive || false
74
91
75− Component.onCompleted: {
92+ onMenuModelChanged: {
76− model.loadExtendedAttributes(modelIndex, {'min-value': 'double',
93+ loadAttributes();
77− 'max-value': 'double',
94+ }
78− 'min-icon': 'icon',
95+ onMenuIndexChanged: {
79− 'max-icon': 'icon'});
96+ loadAttributes();
80 }
97 }
81−
82 onChangeState: {
98 onChangeState: {
83− model.changeState(modelIndex, value);
99+ menuModel.changeState(menuIndex, value);
100+ }
101+
102+ function loadAttributes() {
103+ if (!menuModel || menuIndex == undefined) return;
104+ menuModel.loadExtendedAttributes(menuIndex, {'min-value': 'double',
105+ 'max-value': 'double',
106+ 'min-icon': 'icon',
107+ 'max-icon': 'icon'});
84 }
108 }
85 }
109 }
86 }
110 }
@@ -88,50 +112,61 @@ Item {
88 Component {
112 Component {
89 id: buttonMenu;
113 id: buttonMenu;
90 Indicators.ButtonMenuItem {
114 Indicators.ButtonMenuItem {
115+ objectName: "buttonMenu"
91− property QtObject menu: null
116+ property QtObject menuData: null
117+ property var menuModel: menuFactory.menuModel
118+ property int menuIndex: -1
92
119
93− text: menu && menu.label ? menu.label : ""
120+ buttonText: menuData && menuData.label || ""
94− enabled: menu ? menu.sensitive : false
121+ enabled: menuData && menuData.sensitive || false
95
122
96 onActivate: {
123 onActivate: {
97− model.activate(modelIndex);
124+ menuModel.activate(menuIndex);
125+ shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
98 }
126 }
99 }
127 }
100 }
128 }
101 Component {
129 Component {
102 id: sectionMenu;
130 id: sectionMenu;
103 Indicators.SectionMenuItem {
131 Indicators.SectionMenuItem {
132+ objectName: "sectionMenu"
104− property QtObject menu: null
133+ property QtObject menuData: null
134+ property var menuIndex: undefined
105
135
106− text: menu && menu.label ? menu.label : ""
136+ text: menuData && menuData.label || ""
107 }
137 }
108 }
138 }
109
139
110 Component {
140 Component {
111 id: progressMenu;
141 id: progressMenu;
112 Indicators.ProgressMenuItem {
142 Indicators.ProgressMenuItem {
143+ objectName: "progressMenu"
113− property QtObject menu: null
144+ property QtObject menuData: null
114−
145+ property int menuIndex: -1
115− text: menu && menu.label ? menu.label : ""
146+
116− icon: menu ? menu.icon : ""
147+ text: menuData && menuData.label || ""
148+ iconSource: menuData && menuData.icon || ""
117− value : menu ? menu.actionState : 0.0
149+ value : menuData && menuData.actionState || 0.0
118− enabled: menu ? menu.sensitive : false
150+ enabled: menuData && menuData.sensitive || false
119 }
151 }
120 }
152 }
121
153
122 Component {
154 Component {
123 id: standardMenu;
155 id: standardMenu;
124 Indicators.StandardMenuItem {
156 Indicators.StandardMenuItem {
157+ objectName: "standardMenu"
125− property QtObject menu: null
158+ property QtObject menuData: null
159+ property int menuIndex: -1
126
160
127− text: menu && menu.label ? menu.label : ""
161+ text: menuData && menuData.label || ""
128− icon: menu && menu.icon ? menu.icon : ""
162+ iconSource: menuData && menuData.icon || ""
163+ enabled: menuData && menuData.sensitive || false
129− checkable: menu ? (menu.isCheck || menu.isRadio) : false
164+ checkable: menuData ? (menuData.isCheck || menuData.isRadio) : false
130− checked: checkable ? menu.isToggled : false
165+ checked: checkable ? menuData.isToggled : false
131− enabled: menu ? menu.sensitive : false
132
166
133 onActivate: {
167 onActivate: {
134− model.activate(modelIndex);
168+ menuModel.activate(menuIndex);
169+ shell.hideIndicatorMenu(UbuntuAnimation.BriskDuration);
135 }
170 }
136 }
171 }
137 }
172 }
@@ -139,15 +174,18 @@ Item {
139 Component {
174 Component {
140 id: switchMenu;
175 id: switchMenu;
141 Indicators.SwitchMenuItem {
176 Indicators.SwitchMenuItem {
177+ objectName: "switchMenu"
142− property QtObject menu: null
178+ property QtObject menuData: null
179+ property int menuIndex: -1
143
180
144− text: menu && menu.label ? menu.label : ""
181+ text: menuData && menuData.label || ""
145− icon: menu && menu.icon ? menu.icon : ""
182+ iconSource: menuData && menuData.icon || ""
183+ enabled: menuData && menuData.sensitive || false
146− checked: menu ? menu.isToggled : false
184+ checked: menuData ? menuData.isToggled : false
147− enabled: menu ? menu.sensitive : false
148
185
149 onActivate: {
186 onActivate: {
150− model.activate(modelIndex);
187+ menuModel.activate(menuIndex);
188+ shell.hideIndicatorMenu(UbuntuAnimation.BriskDuration);
151 }
189 }
152 }
190 }
153 }
191 }
@@ -155,13 +193,25 @@ Item {
155 Component {
193 Component {
156 id: wifiSection;
194 id: wifiSection;
157 Indicators.SectionMenuItem {
195 Indicators.SectionMenuItem {
196+ objectName: "wifiSection"
158− property QtObject menu: null
197+ property QtObject menuData: null
198+ property var menuModel: menuFactory.menuModel
199+ property int menuIndex: -1
200+ property var extendedData: menuData && menuData.ext || undefined
201+
202+ text: menuData && menuData.label || ""
203+ busy: getExtendedProperty(extendedData, "xCanonicalBusyAction", false)
159
204
160− text: menu && menu.label ? menu.label : ""
205+ onMenuModelChanged: {
161− busy: menu ? menu.ext.xCanonicalBusyAction : false
206+ loadAttributes();
207+ }
208+ onMenuIndexChanged: {
209+ loadAttributes();
210+ }
162
211
163− Component.onCompleted: {
212+ function loadAttributes() {
213+ if (!menuModel || menuIndex == undefined) return;
164− model.loadExtendedAttributes(modelIndex, {'x-canonical-busy-action': 'bool'});
214+ menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-busy-action': 'bool'})
165 }
215 }
166 }
216 }
167 }
217 }
@@ -169,27 +219,41 @@ Item {
169 Component {
219 Component {
170 id: accessPoint;
220 id: accessPoint;
171 ICNetwork.AccessPoint {
221 ICNetwork.AccessPoint {
222+ objectName: "accessPoint"
172− property QtObject menu: null
223+ property QtObject menuData: null
224+ property var menuModel: menuFactory.menuModel
225+ property int menuIndex: -1
226+ property var extendedData: menuData && menuData.ext || undefined
227+
173 property var strengthAction: QMenuModel.UnityMenuAction {
228 property var strengthAction: QMenuModel.UnityMenuAction {
174− model: menuFactory.model ? menuFactory.model : null
229+ model: menuModel
175− index: modelIndex
230+ index: menuIndex
176− name: menu ? menu.ext.xCanonicalWifiApStrengthAction : ""
231+ name: getExtendedProperty(extendedData, "xCanonicalWifiApStrengthAction", "")
177 }
232 }
178
233
179− text: menu && menu.label ? menu.label : ""
234+ label: menuData && menuData.label || ""
235+ enabled: menuData && menuData.sensitive || false
180− secure: menu ? menu.ext.xCanonicalWifiApIsSecure : false
236+ secure: getExtendedProperty(extendedData, "xCanonicalWifiApIsSecure", false)
181− adHoc: menu ? menu.ext.xCanonicalWifiApIsAdhoc : false
237+ adHoc: getExtendedProperty(extendedData, "xCanonicalWifiApIsAdhoc", false)
182− checked: menu ? menu.isToggled : false
238+ checked: menuData ? menuData.isToggled : false
183 signalStrength: strengthAction.valid ? strengthAction.state : 0
239 signalStrength: strengthAction.valid ? strengthAction.state : 0
184− enabled: menu ? menu.sensitive : false
185
240
186− Component.onCompleted: {
241+ onMenuModelChanged: {
187− model.loadExtendedAttributes(modelIndex, {'x-canonical-wifi-ap-is-adhoc': 'bool',
242+ loadAttributes();
188− 'x-canonical-wifi-ap-is-secure': 'bool',
243+ }
189− 'x-canonical-wifi-ap-strength-action': 'string'});
244+ onMenuIndexChanged: {
245+ loadAttributes();
190 }
246 }
191 onActivate: {
247 onActivate: {
192− model.activate(modelIndex);
248+ menuModel.activate(menuIndex);
249+ shell.hideIndicatorMenu(UbuntuAnimation.BriskDuration);
250+ }
251+
252+ function loadAttributes() {
253+ if (!menuModel || menuIndex == undefined) return;
254+ menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-wifi-ap-is-adhoc': 'bool',
255+ 'x-canonical-wifi-ap-is-secure': 'bool',
256+ 'x-canonical-wifi-ap-strength-action': 'string'});
193 }
257 }
194 }
258 }
195 }
259 }
@@ -197,37 +261,42 @@ Item {
197 Component {
261 Component {
198 id: messageItem
262 id: messageItem
199 ICMessaging.MessageMenuItemFactory {
263 ICMessaging.MessageMenuItemFactory {
200−
264+ objectName: "messageItem"
201− property QtObject menu: null
265+ menuModel: menuFactory.menuModel
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 }
266 }
212 }
267 }
213
268
214 Component {
269 Component {
215 id: groupedMessage
270 id: groupedMessage
216 ICMessaging.GroupedMessage {
271 ICMessaging.GroupedMessage {
272+ objectName: "groupedMessage"
217− property QtObject menu: null
273+ property QtObject menuData: null
218−
274+ property var menuModel: menuFactory.menuModel
219− title: menu && menu.label ? menu.label : ""
275+ property int menuIndex: -1
220− count: menu && menu.actionState[0] ? menu.actionState[0] : "0"
276+ property var extendedData: menuData && menuData.ext || undefined
277+
278+ title: menuData && menuData.label || ""
221− appIcon: menu && menu.ext.icon !== undefined ? menu.ext.icon : "qrc:/indicators/artwork/messaging/default_app.svg"
279+ appIcon: getExtendedProperty(extendedData, "icon", "qrc:/indicators/artwork/messaging/default_app.svg")
222−
280+ count: menuData && menuData.actionState.length > 0 ? menuData.actionState[0] : "0"
223− Component.onCompleted: {
281+ enabled: menuData && menuData.sensitive || false
224− model.loadExtendedAttributes(modelIndex, {'icon': 'icon'});
282+
283+ onMenuModelChanged: {
284+ loadAttributes();
285+ }
286+ onMenuIndexChanged: {
287+ loadAttributes();
225 }
288 }
226 onActivateApp: {
289 onActivateApp: {
227− model.activate(modelIndex, true);
290+ menuModel.activate(menuIndex, true);
291+ shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
228 }
292 }
229 onDismiss: {
293 onDismiss: {
230− model.activate(modelIndex, false);
294+ menuModel.activate(menuIndex, false);
295+ }
296+
297+ function loadAttributes() {
298+ if (!menuModel || menuIndex == undefined) return;
299+ menuModel.loadExtendedAttributes(modelIndex, {'icon': 'icon'});
231 }
300 }
232 }
301 }
233 }
302 }
@@ -238,10 +307,9 @@ Item {
238 if (component !== undefined) {
307 if (component !== undefined) {
239 return component;
308 return component;
240 }
309 }
241− } else {
310+ }
242− if (modelData.isSeparator) {
311+ if (modelData.isSeparator) {
243− return divMenu;
312+ return divMenu;
244− }
245 }
313 }
246 return standardMenu;
314 return standardMenu;
247 }
315 }
plugins/Unity/Indicators/qml/qmldir−2
@@ -9,8 +9,6 @@ DivMenuItem 0.1 DivMenuItem.qml
9FramedMenuItem 0.1 FramedMenuItem.qml
9FramedMenuItem 0.1 FramedMenuItem.qml
10HLine 0.1 HLine.qml
10HLine 0.1 HLine.qml
11IndicatorBase 0.1 IndicatorBase.qml
11IndicatorBase 0.1 IndicatorBase.qml
12−IndicatorPage 0.1 IndicatorPage.qml
13−IndicatorWidget 0.1 IndicatorWidget.qml
14MenuActionBinding 0.1 MenuActionBinding.qml
12MenuActionBinding 0.1 MenuActionBinding.qml
15MenuItemFactory 0.1 MenuItemFactory.qml
13MenuItemFactory 0.1 MenuItemFactory.qml
16ProgressMenuItem 0.1 ProgressMenuItem.qml
14ProgressMenuItem 0.1 ProgressMenuItem.qml
plugins/Unity/Launcher/backend/launcherbackend.cpp+6−6
@@ -26,6 +26,7 @@
26#include <QFileInfo>
26#include <QFileInfo>
27#include <QGSettings>
27#include <QGSettings>
28#include <QDebug>
28#include <QDebug>
29+#include <QStandardPaths>
29
30
30class LauncherBackendItem
31class LauncherBackendItem
31{
32{
@@ -182,8 +183,10 @@ void LauncherBackend::syncFromAccounts()
182
183
183 if (m_accounts && !m_user.isEmpty()) {
184 if (m_accounts && !m_user.isEmpty()) {
184 QVariant variant = m_accounts->getUserProperty(m_user, "com.canonical.unity.AccountsService", "launcher-items");
185 QVariant variant = m_accounts->getUserProperty(m_user, "com.canonical.unity.AccountsService", "launcher-items");
186+ if (variant.isValid() && variant.canConvert<QDBusArgument>()) {
185− apps = qdbus_cast<QList<QVariantMap>>(variant.value<QDBusArgument>());
187+ apps = qdbus_cast<QList<QVariantMap>>(variant.value<QDBusArgument>());
186− defaults = isDefaultsItem(apps);
188+ defaults = isDefaultsItem(apps);
189+ }
187 }
190 }
188
191
189 if (m_accounts && defaults) { // Checking accounts as it'll be null when !useStorage
192 if (m_accounts && defaults) { // Checking accounts as it'll be null when !useStorage
@@ -232,10 +235,7 @@ QString LauncherBackend::findDesktopFile(const QString &appId) const
232 int dashPos = -1;
235 int dashPos = -1;
233 QString helper = appId;
236 QString helper = appId;
234
237
235− QStringList searchDirs;
238+ QStringList searchDirs = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation);
236− searchDirs << QDir::homePath() + "/.local/share/applications";
237− searchDirs << "/usr/share/applications";
238−
239#ifdef LAUNCHER_TESTING
239#ifdef LAUNCHER_TESTING
240 searchDirs << "";
240 searchDirs << "";
241#endif
241#endif
plugins/Utils/CMakeLists.txt+1
@@ -16,6 +16,7 @@ set(QMLPLUGIN_SRC
16 mediaartcache.cpp
16 mediaartcache.cpp
17 qlimitproxymodelqml.cpp
17 qlimitproxymodelqml.cpp
18 qsortfilterproxymodelqml.cpp
18 qsortfilterproxymodelqml.cpp
19+ timeformatter.cpp
19 unitymenumodelpaths.cpp
20 unitymenumodelpaths.cpp
20 plugin.cpp
21 plugin.cpp
21 )
22 )
plugins/Utils/plugin.cpp+3
@@ -30,6 +30,7 @@
30#include "bottombarvisibilitycommunicatorshell.h"
30#include "bottombarvisibilitycommunicatorshell.h"
31#include "qlimitproxymodelqml.h"
31#include "qlimitproxymodelqml.h"
32#include "qsortfilterproxymodelqml.h"
32#include "qsortfilterproxymodelqml.h"
33+#include "timeformatter.h"
33#include "unitymenumodelpaths.h"
34#include "unitymenumodelpaths.h"
34
35
35static const char* BOTTOM_BAR_VISIBILITY_COMMUNICATOR_DBUS_PATH = "/BottomBarVisibilityCommunicator";
36static const char* BOTTOM_BAR_VISIBILITY_COMMUNICATOR_DBUS_PATH = "/BottomBarVisibilityCommunicator";
@@ -42,6 +43,8 @@ void UtilsPlugin::registerTypes(const char *uri)
42 qmlRegisterType<QLimitProxyModelQML>(uri, 0, 1, "LimitProxyModel");
43 qmlRegisterType<QLimitProxyModelQML>(uri, 0, 1, "LimitProxyModel");
43 qmlRegisterType<QSortFilterProxyModelQML>(uri, 0, 1, "SortFilterProxyModel");
44 qmlRegisterType<QSortFilterProxyModelQML>(uri, 0, 1, "SortFilterProxyModel");
44 qmlRegisterType<UnityMenuModelPaths>(uri, 0, 1, "UnityMenuModelPaths");
45 qmlRegisterType<UnityMenuModelPaths>(uri, 0, 1, "UnityMenuModelPaths");
46+ qmlRegisterType<TimeFormatter>(uri, 0, 1, "TimeFormatter");
47+ qmlRegisterType<GDateTimeFormatter>(uri, 0, 1, "GDateTimeFormatter");
45 qmlRegisterUncreatableType<BottomBarVisibilityCommunicatorShell>(uri, 0, 1, "BottomBarVisibilityCommunicatorShell", "Can't create BottomBarVisibilityCommunicatorShell");
48 qmlRegisterUncreatableType<BottomBarVisibilityCommunicatorShell>(uri, 0, 1, "BottomBarVisibilityCommunicatorShell", "Can't create BottomBarVisibilityCommunicatorShell");
46}
49}
47
50
plugins/Utils/qsortfilterproxymodelqml.cpp+12
@@ -68,6 +68,18 @@ QSortFilterProxyModelQML::setModel(QAbstractItemModel *itemModel)
68 }
68 }
69}
69}
70
70
71+QVariantMap
72+QSortFilterProxyModelQML::get(int row)
73+{
74+ QVariantMap res;
75+ const QHash<int, QByteArray> roles = roleNames();
76+ auto it = roles.begin();
77+ for ( ; it != roles.end(); ++it) {
78+ res[*it] = data(row, it.key());
79+ }
80+ return res;
81+}
82+
71QVariant
83QVariant
72QSortFilterProxyModelQML::data(int row, int role)
84QSortFilterProxyModelQML::data(int row, int role)
73{
85{
plugins/Utils/qsortfilterproxymodelqml.h+1
@@ -31,6 +31,7 @@ class QSortFilterProxyModelQML : public QSortFilterProxyModel
31public:
31public:
32 explicit QSortFilterProxyModelQML(QObject *parent = 0);
32 explicit QSortFilterProxyModelQML(QObject *parent = 0);
33
33
34+ Q_INVOKABLE QVariantMap get(int row); // Use with caution, it can be slow to query all the roles
34 Q_INVOKABLE QVariant data(int row, int role);
35 Q_INVOKABLE QVariant data(int row, int role);
35 Q_INVOKABLE int count();
36 Q_INVOKABLE int count();
36 Q_INVOKABLE int findFirst(int role, const QVariant& value) const;
37 Q_INVOKABLE int findFirst(int role, const QVariant& value) const;
plugins/Unity/Indicators/timeformatter.cpp → plugins/Utils/timeformatter.cpprenamed+30−1
@@ -167,6 +167,35 @@ void TimeFormatter::setTime(qint64 time)
167
167
168void TimeFormatter::update()
168void TimeFormatter::update()
169{
169{
170− priv->timeString = QDateTime::fromMSecsSinceEpoch(priv->time / 1000).toString(priv->format);
170+ priv->timeString = formatTime();
171 Q_EMIT timeStringChanged(priv->timeString);
171 Q_EMIT timeStringChanged(priv->timeString);
172}
172}
173+
174+QString TimeFormatter::formatTime() const
175+{
176+ return QDateTime::fromMSecsSinceEpoch(time() / 1000).toString(format());
177+}
178+
179+GDateTimeFormatter::GDateTimeFormatter(QObject* parent)
180+: TimeFormatter(parent)
181+{
182+}
183+
184+QString GDateTimeFormatter::formatTime() const
185+{
186+ gchar* time_string;
187+ GDateTime* datetime;
188+ QByteArray formatBytes = format().toUtf8();
189+
190+ datetime = g_date_time_new_from_unix_local(time());
191+ if (!datetime) {
192+ return "";
193+ }
194+
195+ time_string = g_date_time_format(datetime, formatBytes.constData());
196+ QString formattedTime(QString::fromUtf8(time_string));
197+
198+ g_free(time_string);
199+ g_date_time_unref(datetime);
200+ return formattedTime;
201+}
plugins/Unity/Indicators/timeformatter.h → plugins/Utils/timeformatter.hrenamed+15−3
@@ -19,10 +19,10 @@
19#ifndef TIME_FORMATTER_H
19#ifndef TIME_FORMATTER_H
20#define TIME_FORMATTER_H
20#define TIME_FORMATTER_H
21
21
22−#include "unityindicatorsglobal.h"
23#include <QObject>
22#include <QObject>
24
23
24+// TODO - bug #1260728
25−class UNITYINDICATORS_EXPORT TimeFormatter : public QObject
25+class TimeFormatter : public QObject
26{
26{
27 Q_OBJECT
27 Q_OBJECT
28 Q_PROPERTY(QString format READ format WRITE setFormat NOTIFY formatChanged)
28 Q_PROPERTY(QString format READ format WRITE setFormat NOTIFY formatChanged)
@@ -31,7 +31,7 @@ class UNITYINDICATORS_EXPORT TimeFormatter : public QObject
31
31
32public:
32public:
33 TimeFormatter(QObject *parent = 0);
33 TimeFormatter(QObject *parent = 0);
34− ~TimeFormatter();
34+ virtual ~TimeFormatter();
35
35
36 QString format() const;
36 QString format() const;
37 QString timeString() const;
37 QString timeString() const;
@@ -47,8 +47,20 @@ Q_SIGNALS:
47 void timeStringChanged(const QString &timeString);
47 void timeStringChanged(const QString &timeString);
48 void timeChanged(qint64 time);
48 void timeChanged(qint64 time);
49
49
50+protected:
51+ virtual QString formatTime() const;
52+
50private:
53private:
51 struct TimeFormatterPrivate *priv;
54 struct TimeFormatterPrivate *priv;
52};
55};
53
56
57+class GDateTimeFormatter : public TimeFormatter
58+{
59+public:
60+ GDateTimeFormatter(QObject *parent = 0);
61+
62+protected:
63+ virtual QString formatTime() const;
64+};
65+
54#endif
66#endif
po/ar.po+15−93
@@ -7,8 +7,8 @@ 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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-11-15 12:29+0000\n"
11+"PO-Revision-Date: 2013-12-05 06:55+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"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
@@ -16,76 +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-11-19 05:59+0000\n"
19+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
20−"X-Generator: Launchpad (build 16831)\n"
20+"X-Generator: Launchpad (build 16877)\n"
21−
22−#: Applications/applications.js:23
23−msgid "Phone"
24−msgstr "الهاتف"
25−
26−#: Applications/applications.js:29
27−msgid "Camera"
28−msgstr "الكاميرا"
29−
30−#: Applications/applications.js:35
31−msgid "Gallery"
32−msgstr "المعرض"
33−
34−#: Applications/applications.js:40
35−msgid "Facebook"
36−msgstr "فيسبوك"
37−
38−#: Applications/applications.js:46
39−msgid "Browser"
40−msgstr "المتصفح"
41−
42−#: Applications/applications.js:51
43−msgid "Twitter"
44−msgstr "تويتر"
45−
46−#: Applications/applications.js:57
47−msgid "GMail"
48−msgstr "جي ميل"
49−
50−#: Applications/applications.js:62
51−msgid "Weather"
52−msgstr "الطقس"
53−
54−#: Applications/applications.js:68
55−msgid "Notepad"
56−msgstr "المذكرة"
57−
58−#: Applications/applications.js:74
59−msgid "Calendar"
60−msgstr "التقويم"
61−
62−#: Applications/applications.js:80
63−msgid "Media Player"
64−msgstr "مشغّل الوسائط"
65−
66−#: Applications/applications.js:86
67−msgid "Evernote"
68−msgstr "Evernote"
69−
70−#: Applications/applications.js:91
71−msgid "Map"
72−msgstr "الخريطة"
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 "ويكيبيديا"
85−
86−#: Applications/applications.js:111
87−msgid "YouTube"
88−msgstr "يوتيوب"
89
21
90#: Components/EdgeDemoOverlay.qml:151
22#: Components/EdgeDemoOverlay.qml:151
91msgid "Skip intro"
23msgid "Skip intro"
@@ -136,20 +68,22 @@ msgstr ""
136"لقد أتقنت الآن إيماءات الحواف ويمكنك البدء باستخدام الهاتف<br><br>انقر في أي "
68"لقد أتقنت الآن إيماءات الحواف ويمكنك البدء باستخدام الهاتف<br><br>انقر في أي "
137"مكان للبدء"
69"مكان للبدء"
138
70
139−#: Components/PageHeader.qml:345
71+#: Components/PageHeader.qml:364
140msgid "Recent searches"
72msgid "Recent searches"
141msgstr "عمليات البحث الأخيرة"
73msgstr "عمليات البحث الأخيرة"
142
74
143−#. TRANSLATORS: Number of persons who rated this app
75+#: Dash/Apps/AppPreview.qml:135
76+msgid "Rate this"
77+msgstr "قيّم ذلك"
78+
144#. TRANSLATORS: Number of persons who rated this app/video/whatever
79#. TRANSLATORS: Number of persons who rated this app/video/whatever
145−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
80+#: Dash/Previews/Header.qml:93
146#, qt-format
81#, qt-format
147msgid "(%1)"
82msgid "(%1)"
148msgstr "(%1)"
83msgstr "(%1)"
149
84
150−#. TRANSLATORS: Number of persons who wrote reviews for this app
151#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
85#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
152−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
86+#: Dash/Previews/Header.qml:105
153#, qt-format
87#, qt-format
154msgid "%1 review"
88msgid "%1 review"
155msgid_plural "%1 reviews"
89msgid_plural "%1 reviews"
@@ -160,10 +94,6 @@ msgstr[3] "%1 تعليقات"
160msgstr[4] "%1 تعليقا"
94msgstr[4] "%1 تعليقا"
161msgstr[5] "%1 تعليق"
95msgstr[5] "%1 تعليق"
162
96
163−#: Dash/Apps/AppPreview.qml:135
164−msgid "Rate this"
165−msgstr "قيّم ذلك"
166−
167#: Dash/Previews/Reviews.qml:74
97#: Dash/Previews/Reviews.qml:74
168msgid "Add a review"
98msgid "Add a review"
169msgstr "أضف تعليق"
99msgstr "أضف تعليق"
@@ -180,7 +110,7 @@ msgstr "أرسل"
180msgid "Comments:"
110msgid "Comments:"
181msgstr "التعليقات:"
111msgstr "التعليقات:"
182
112
183−#: Greeter/Lockscreen.qml:146
113+#: Greeter/Lockscreen.qml:149
184msgid "Emergency Call"
114msgid "Emergency Call"
185msgstr "مكالمة طوارئ"
115msgstr "مكالمة طوارئ"
186
116
@@ -224,21 +154,13 @@ msgstr "ابحث"
224#: plugins/Unity/Launcher/launcheritem.cpp:43
154#: plugins/Unity/Launcher/launcheritem.cpp:43
225#: plugins/Unity/Launcher/launcheritem.cpp:73
155#: plugins/Unity/Launcher/launcheritem.cpp:73
226msgid "Lock to Launcher"
156msgid "Lock to Launcher"
227−msgstr ""
157+msgstr "ثبّت في الشريط"
228
158
229#: plugins/Unity/Launcher/launcheritem.cpp:73
159#: plugins/Unity/Launcher/launcheritem.cpp:73
230msgid "Unlock from Launcher"
160msgid "Unlock from Launcher"
231−msgstr ""
161+msgstr "فُك التثبيت من الشريط"
232−
233−#: plugins/Unity/scope.cpp:408
234−msgid "Sorry, there is nothing that matches your search."
235−msgstr "عذراً، لا يوجد ما يطابق بحثك."
236−
237−#: plugins/Unity/showallfilteroption.cpp:41
238−msgid "All"
239−msgstr "الكل"
240
162
241−#: Shell.qml:441
163+#: Shell.qml:439
242#, qt-format
164#, qt-format
243msgid "Please enter %1"
165msgid "Please enter %1"
244msgstr "من فضلك أدخِل %1"
166msgstr "من فضلك أدخِل %1"
po/ast.po+16−94
@@ -7,84 +7,16 @@ 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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-10-03 14:02+0000\n"
11+"PO-Revision-Date: 2013-12-11 20:45+0000\n"
12"Last-Translator: ivarela <ivarela@ubuntu.com>\n"
12"Last-Translator: ivarela <ivarela@ubuntu.com>\n"
13"Language-Team: Asturian <ast@li.org>\n"
13"Language-Team: Asturian <ast@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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -136,30 +68,28 @@ msgstr ""
136"Agora domines los xestos de berbesos y pues usar el teléfonu<br><br>Toca la "
68"Agora domines los xestos de berbesos y pues usar el teléfonu<br><br>Toca la "
137"pantalla pa entamar"
69"pantalla pa entamar"
138
70
139−#: Components/PageHeader.qml:345
71+#: Components/PageHeader.qml:364
140msgid "Recent searches"
72msgid "Recent searches"
141msgstr "Busques recientes"
73msgstr "Busques recientes"
142
74
143−#. TRANSLATORS: Number of persons who rated this app
75+#: Dash/Apps/AppPreview.qml:135
76+msgid "Rate this"
77+msgstr "Valorar esto"
78+
144#. TRANSLATORS: Number of persons who rated this app/video/whatever
79#. TRANSLATORS: Number of persons who rated this app/video/whatever
145−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
80+#: Dash/Previews/Header.qml:93
146#, qt-format
81#, qt-format
147msgid "(%1)"
82msgid "(%1)"
148msgstr "(%1)"
83msgstr "(%1)"
149
84
150−#. TRANSLATORS: Number of persons who wrote reviews for this app
151#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
85#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
152−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
86+#: Dash/Previews/Header.qml:105
153#, qt-format
87#, qt-format
154msgid "%1 review"
88msgid "%1 review"
155msgid_plural "%1 reviews"
89msgid_plural "%1 reviews"
156msgstr[0] "%1 reseña"
90msgstr[0] "%1 reseña"
157msgstr[1] "%1 reseñes"
91msgstr[1] "%1 reseñes"
158
92
159−#: Dash/Apps/AppPreview.qml:135
160−msgid "Rate this"
161−msgstr "Valorar esto"
162−
163#: Dash/Previews/Reviews.qml:74
93#: Dash/Previews/Reviews.qml:74
164msgid "Add a review"
94msgid "Add a review"
165msgstr "Amestar una reseña"
95msgstr "Amestar una reseña"
@@ -176,7 +106,7 @@ msgstr "Unviar"
176msgid "Comments:"
106msgid "Comments:"
177msgstr "Comentarios:"
107msgstr "Comentarios:"
178
108
179−#: Greeter/Lockscreen.qml:146
109+#: Greeter/Lockscreen.qml:149
180msgid "Emergency Call"
110msgid "Emergency Call"
181msgstr "Llamada d'emerxencia"
111msgstr "Llamada d'emerxencia"
182
112
@@ -211,7 +141,7 @@ msgstr "Falando…"
211
141
212#: Notifications/NotificationMenuItemFactory.qml:89
142#: Notifications/NotificationMenuItemFactory.qml:89
213msgid "Show password"
143msgid "Show password"
214−msgstr ""
144+msgstr "Amosar contraseña"
215
145
216#: Panel/SearchIndicator.qml:27
146#: Panel/SearchIndicator.qml:27
217msgid "Search"
147msgid "Search"
@@ -220,21 +150,13 @@ msgstr "Guetar"
220#: plugins/Unity/Launcher/launcheritem.cpp:43
150#: plugins/Unity/Launcher/launcheritem.cpp:43
221#: plugins/Unity/Launcher/launcheritem.cpp:73
151#: plugins/Unity/Launcher/launcheritem.cpp:73
222msgid "Lock to Launcher"
152msgid "Lock to Launcher"
223−msgstr ""
153+msgstr "Caltener nel Llanzador"
224
154
225#: plugins/Unity/Launcher/launcheritem.cpp:73
155#: plugins/Unity/Launcher/launcheritem.cpp:73
226msgid "Unlock from Launcher"
156msgid "Unlock from Launcher"
227−msgstr ""
157+msgstr "Nun caltener nel llanzador"
228−
229−#: plugins/Unity/scope.cpp:408
230−msgid "Sorry, there is nothing that matches your search."
231−msgstr "Sentímoslo, nun hai res que concase cola gueta"
232−
233−#: plugins/Unity/showallfilteroption.cpp:41
234−msgid "All"
235−msgstr "Too"
236
158
237−#: Shell.qml:441
159+#: Shell.qml:439
238#, qt-format
160#, qt-format
239msgid "Please enter %1"
161msgid "Please enter %1"
240msgstr "Introduz %1"
162msgstr "Introduz %1"
po/az.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\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,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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 ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
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 ""
88
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr "Son axtarışlar"
69msgstr "Son axtarışlar"
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr ""
79msgstr ""
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] ""
86msgstr[0] ""
153msgstr[1] ""
87msgstr[1] ""
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr ""
91msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172msgid "Comments:"
102msgid "Comments:"
173msgstr ""
103msgstr ""
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177msgstr ""
107msgstr ""
178
108
@@ -222,15 +152,7 @@ msgstr ""
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223msgstr ""
153msgstr ""
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "Bağışlayın, amma axtarışınıza heç bir nəticə uyğun gəlmir."
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236msgstr ""
158msgstr ""
po/bg.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\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,76 +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-11-19 05:59+0000\n"
19+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
20−"X-Generator: Launchpad (build 16831)\n"
20+"X-Generator: Launchpad (build 16877)\n"
21−
22−#: Applications/applications.js:23
23−msgid "Phone"
24−msgstr "Телефон"
25−
26−#: Applications/applications.js:29
27−msgid "Camera"
28−msgstr "Камера"
29−
30−#: Applications/applications.js:35
31−msgid "Gallery"
32−msgstr "Колекция"
33−
34−#: Applications/applications.js:40
35−msgid "Facebook"
36−msgstr "Фейсбук"
37−
38−#: Applications/applications.js:46
39−msgid "Browser"
40−msgstr "Браузър"
41−
42−#: Applications/applications.js:51
43−msgid "Twitter"
44−msgstr "Туитър"
45−
46−#: Applications/applications.js:57
47−msgid "GMail"
48−msgstr "Е-поща от Гугъл"
49−
50−#: Applications/applications.js:62
51−msgid "Weather"
52−msgstr "Метеоусловия"
53−
54−#: Applications/applications.js:68
55−msgid "Notepad"
56−msgstr "Бележник"
57−
58−#: Applications/applications.js:74
59−msgid "Calendar"
60−msgstr "Календар"
61−
62−#: Applications/applications.js:80
63−msgid "Media Player"
64−msgstr "Мултимедиен плеър"
65−
66−#: Applications/applications.js:86
67−msgid "Evernote"
68−msgstr ""
69−
70−#: Applications/applications.js:91
71−msgid "Map"
72−msgstr "Карта"
73−
74−#: Applications/applications.js:96
75−msgid "Pinterest"
76−msgstr ""
77−
78−#: Applications/applications.js:101
79−msgid "SoundCloud"
80−msgstr ""
81−
82−#: Applications/applications.js:106
83−msgid "Wikipedia"
84−msgstr "Уикипедия"
85−
86−#: Applications/applications.js:111
87−msgid "YouTube"
88−msgstr "YouTube"
89
21
90#: Components/EdgeDemoOverlay.qml:151
22#: Components/EdgeDemoOverlay.qml:151
91msgid "Skip intro"
23msgid "Skip intro"
@@ -133,30 +65,28 @@ msgid ""
133"phone<br><br>Tap anywhere to start"
65"phone<br><br>Tap anywhere to start"
134msgstr ""
66msgstr ""
135
67
136−#: Components/PageHeader.qml:345
68+#: Components/PageHeader.qml:364
137msgid "Recent searches"
69msgid "Recent searches"
138msgstr "Скорошни търсения"
70msgstr "Скорошни търсения"
139
71
140−#. TRANSLATORS: Number of persons who rated this app
72+#: Dash/Apps/AppPreview.qml:135
73+msgid "Rate this"
74+msgstr ""
75+
141#. TRANSLATORS: Number of persons who rated this app/video/whatever
76#. TRANSLATORS: Number of persons who rated this app/video/whatever
142−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
77+#: Dash/Previews/Header.qml:93
143#, qt-format
78#, qt-format
144msgid "(%1)"
79msgid "(%1)"
145msgstr ""
80msgstr ""
146
81
147−#. TRANSLATORS: Number of persons who wrote reviews for this app
148#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
82#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
149−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
83+#: Dash/Previews/Header.qml:105
150#, qt-format
84#, qt-format
151msgid "%1 review"
85msgid "%1 review"
152msgid_plural "%1 reviews"
86msgid_plural "%1 reviews"
153msgstr[0] ""
87msgstr[0] ""
154msgstr[1] ""
88msgstr[1] ""
155
89
156−#: Dash/Apps/AppPreview.qml:135
157−msgid "Rate this"
158−msgstr ""
159−
160#: Dash/Previews/Reviews.qml:74
90#: Dash/Previews/Reviews.qml:74
161msgid "Add a review"
91msgid "Add a review"
162msgstr ""
92msgstr ""
@@ -173,7 +103,7 @@ msgstr ""
173msgid "Comments:"
103msgid "Comments:"
174msgstr ""
104msgstr ""
175
105
176−#: Greeter/Lockscreen.qml:146
106+#: Greeter/Lockscreen.qml:149
177msgid "Emergency Call"
107msgid "Emergency Call"
178msgstr ""
108msgstr ""
179
109
@@ -223,15 +153,7 @@ msgstr ""
223msgid "Unlock from Launcher"
153msgid "Unlock from Launcher"
224msgstr ""
154msgstr ""
225
155
226−#: plugins/Unity/scope.cpp:408
227−msgid "Sorry, there is nothing that matches your search."
228−msgstr "Съжаляваме, няма нищо, което да отговаря на вашето търсене."
229−
230−#: plugins/Unity/showallfilteroption.cpp:41
231−msgid "All"
232−msgstr ""
233−
234−#: Shell.qml:441
156+#: Shell.qml:439
235#, qt-format
157#, qt-format
236msgid "Please enter %1"
158msgid "Please enter %1"
237msgstr ""
159msgstr ""
po/ca.po+17−95
@@ -7,84 +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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-09-28 07:38+0000\n"
11+"PO-Revision-Date: 2014-01-10 07:45+0000\n"
12−"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
12+"Last-Translator: Adolfo Jayme <fitoschido@gmail.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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-01-11 06:38+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16890)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Telèfon"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Càmera"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "Galeria"
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 "El temps"
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 "Calendari"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "Reproductor multimèdia"
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 "SoundCloud"
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr "Viquipèdia"
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr "YouTube"
88
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -138,30 +70,28 @@ msgid ""
138"phone<br><br>Tap anywhere to start"
70"phone<br><br>Tap anywhere to start"
139msgstr ""
71msgstr ""
140
72
141−#: Components/PageHeader.qml:345
73+#: Components/PageHeader.qml:364
142msgid "Recent searches"
74msgid "Recent searches"
143msgstr "Cerques recents"
75msgstr "Cerques recents"
144
76
145−#. TRANSLATORS: Number of persons who rated this app
77+#: Dash/Apps/AppPreview.qml:135
78+msgid "Rate this"
79+msgstr ""
80+
146#. TRANSLATORS: Number of persons who rated this app/video/whatever
81#. TRANSLATORS: Number of persons who rated this app/video/whatever
147−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
82+#: Dash/Previews/Header.qml:93
148#, qt-format
83#, qt-format
149msgid "(%1)"
84msgid "(%1)"
150msgstr "(%1)"
85msgstr "(%1)"
151
86
152−#. TRANSLATORS: Number of persons who wrote reviews for this app
153#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
87#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
154−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
88+#: Dash/Previews/Header.qml:105
155#, qt-format
89#, qt-format
156msgid "%1 review"
90msgid "%1 review"
157msgid_plural "%1 reviews"
91msgid_plural "%1 reviews"
158msgstr[0] "%1 ressenya"
92msgstr[0] "%1 ressenya"
159msgstr[1] "%1 ressenyes"
93msgstr[1] "%1 ressenyes"
160
94
161−#: Dash/Apps/AppPreview.qml:135
162−msgid "Rate this"
163−msgstr ""
164−
165#: Dash/Previews/Reviews.qml:74
95#: Dash/Previews/Reviews.qml:74
166msgid "Add a review"
96msgid "Add a review"
167msgstr "Afegiu una ressenya"
97msgstr "Afegiu una ressenya"
@@ -178,7 +108,7 @@ msgstr "Envia"
178msgid "Comments:"
108msgid "Comments:"
179msgstr "Comentaris:"
109msgstr "Comentaris:"
180
110
181−#: Greeter/Lockscreen.qml:146
111+#: Greeter/Lockscreen.qml:149
182msgid "Emergency Call"
112msgid "Emergency Call"
183msgstr "Trucada d'emergència"
113msgstr "Trucada d'emergència"
184
114
@@ -213,7 +143,7 @@ msgstr "S'està parlant..."
213
143
214#: Notifications/NotificationMenuItemFactory.qml:89
144#: Notifications/NotificationMenuItemFactory.qml:89
215msgid "Show password"
145msgid "Show password"
216−msgstr ""
146+msgstr "Mostra la contrasenya"
217
147
218#: Panel/SearchIndicator.qml:27
148#: Panel/SearchIndicator.qml:27
219msgid "Search"
149msgid "Search"
@@ -222,21 +152,13 @@ msgstr "Cerca"
222#: plugins/Unity/Launcher/launcheritem.cpp:43
152#: plugins/Unity/Launcher/launcheritem.cpp:43
223#: plugins/Unity/Launcher/launcheritem.cpp:73
153#: plugins/Unity/Launcher/launcheritem.cpp:73
224msgid "Lock to Launcher"
154msgid "Lock to Launcher"
225−msgstr ""
155+msgstr "Mantén-la al llançador"
226
156
227#: plugins/Unity/Launcher/launcheritem.cpp:73
157#: plugins/Unity/Launcher/launcheritem.cpp:73
228msgid "Unlock from Launcher"
158msgid "Unlock from Launcher"
229−msgstr ""
159+msgstr "No la mantinguis al llançador"
230−
231−#: plugins/Unity/scope.cpp:408
232−msgid "Sorry, there is nothing that matches your search."
233−msgstr "No hi ha res que coincideixi amb la cerca"
234−
235−#: plugins/Unity/showallfilteroption.cpp:41
236−msgid "All"
237−msgstr ""
238
160
239−#: Shell.qml:441
161+#: Shell.qml:439
240#, qt-format
162#, qt-format
241msgid "Please enter %1"
163msgid "Please enter %1"
242msgstr "Introduïu %1"
164msgstr "Introduïu %1"
po/cs.po+19−95
@@ -7,84 +7,16 @@ 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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-10-08 08:09+0000\n"
11+"PO-Revision-Date: 2014-01-08 10:11+0000\n"
12"Last-Translator: Tadeáš Pařík <tadeas.parik@gmail.com>\n"
12"Last-Translator: Tadeáš Pařík <tadeas.parik@gmail.com>\n"
13"Language-Team: Czech <cs@li.org>\n"
13"Language-Team: Czech <cs@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==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
17"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-01-09 05:41+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16884)\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
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -112,7 +44,7 @@ msgstr "Uzavřít"
112
44
113#: Components/EdgeDemo.qml:171
45#: Components/EdgeDemo.qml:171
114msgid "Swipe up again to close the settings screen"
46msgid "Swipe up again to close the settings screen"
115−msgstr ""
47+msgstr "Přetažením nahoru dojde k uzavření obrazovky nastavení"
116
48
117#: Components/EdgeDemo.qml:198
49#: Components/EdgeDemo.qml:198
118msgid "Left edge"
50msgid "Left edge"
@@ -131,21 +63,25 @@ msgid ""
131"You have now mastered the edge gestures and can start using the "
63"You have now mastered the edge gestures and can start using the "
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
66+"Nyní jste si osvojili gesta potřebná k ovládání telefonu, můžete ho začít "
67+"používat <br><br>Klepnutím kdekoli začnete"
134
68
135−#: Components/PageHeader.qml:345
69+#: Components/PageHeader.qml:364
136msgid "Recent searches"
70msgid "Recent searches"
137msgstr "Poslední vyhledávání"
71msgstr "Poslední vyhledávání"
138
72
139−#. TRANSLATORS: Number of persons who rated this app
73+#: Dash/Apps/AppPreview.qml:135
74+msgid "Rate this"
75+msgstr "Ohodnoťte to"
76+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
77#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
78+#: Dash/Previews/Header.qml:93
142#, qt-format
79#, qt-format
143msgid "(%1)"
80msgid "(%1)"
144msgstr "(%1)"
81msgstr "(%1)"
145
82
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
83#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
84+#: Dash/Previews/Header.qml:105
149#, qt-format
85#, qt-format
150msgid "%1 review"
86msgid "%1 review"
151msgid_plural "%1 reviews"
87msgid_plural "%1 reviews"
@@ -153,10 +89,6 @@ msgstr[0] "%1 recenze"
153msgstr[1] "%1 recenze"
89msgstr[1] "%1 recenze"
154msgstr[2] "%1 recenzí"
90msgstr[2] "%1 recenzí"
155
91
156−#: Dash/Apps/AppPreview.qml:135
157−msgid "Rate this"
158−msgstr "Ohodnoťte to"
159−
160#: Dash/Previews/Reviews.qml:74
92#: Dash/Previews/Reviews.qml:74
161msgid "Add a review"
93msgid "Add a review"
162msgstr "Přidat recenzi"
94msgstr "Přidat recenzi"
@@ -173,7 +105,7 @@ msgstr "Odeslat"
173msgid "Comments:"
105msgid "Comments:"
174msgstr "Komentáře:"
106msgstr "Komentáře:"
175
107
176−#: Greeter/Lockscreen.qml:146
108+#: Greeter/Lockscreen.qml:149
177msgid "Emergency Call"
109msgid "Emergency Call"
178msgstr "Tísňové volání"
110msgstr "Tísňové volání"
179
111
@@ -208,7 +140,7 @@ msgstr "Mluvte..."
208
140
209#: Notifications/NotificationMenuItemFactory.qml:89
141#: Notifications/NotificationMenuItemFactory.qml:89
210msgid "Show password"
142msgid "Show password"
211−msgstr ""
143+msgstr "Zobrazit heslo"
212
144
213#: Panel/SearchIndicator.qml:27
145#: Panel/SearchIndicator.qml:27
214msgid "Search"
146msgid "Search"
@@ -217,21 +149,13 @@ msgstr "Hledat"
217#: plugins/Unity/Launcher/launcheritem.cpp:43
149#: plugins/Unity/Launcher/launcheritem.cpp:43
218#: plugins/Unity/Launcher/launcheritem.cpp:73
150#: plugins/Unity/Launcher/launcheritem.cpp:73
219msgid "Lock to Launcher"
151msgid "Lock to Launcher"
220−msgstr ""
152+msgstr "Přidat do Launcheru"
221
153
222#: plugins/Unity/Launcher/launcheritem.cpp:73
154#: plugins/Unity/Launcher/launcheritem.cpp:73
223msgid "Unlock from Launcher"
155msgid "Unlock from Launcher"
224−msgstr ""
156+msgstr "Odebrat z Launcheru"
225−
226−#: plugins/Unity/scope.cpp:408
227−msgid "Sorry, there is nothing that matches your search."
228−msgstr "Je nám líto, ale nic neodpovídá zadání"
229−
230−#: plugins/Unity/showallfilteroption.cpp:41
231−msgid "All"
232−msgstr "Vše"
233
157
234−#: Shell.qml:441
158+#: Shell.qml:439
235#, qt-format
159#, qt-format
236msgid "Please enter %1"
160msgid "Please enter %1"
237msgstr "Zadejte prosím %1"
161msgstr "Zadejte prosím %1"
po/de.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11"PO-Revision-Date: 2013-10-18 12:26+0000\n"
11"PO-Revision-Date: 2013-10-18 12:26+0000\n"
12"Last-Translator: Phillip Sz <Unknown>\n"
12"Last-Translator: Phillip Sz <Unknown>\n"
13"Language-Team: German <de@li.org>\n"
13"Language-Team: German <de@li.org>\n"
@@ -15,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Telefon"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Kamera"
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 "Browser"
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 "Wetter"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Notizen"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Kalender"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "Medienwiedergabe"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr "Evernote"
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "Karte"
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
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -136,30 +68,28 @@ msgstr ""
136"Sie haben nun die Einführung abgeschlossen und können Ihr Gerät nun "
68"Sie haben nun die Einführung abgeschlossen und können Ihr Gerät nun "
137"verwenden<br><br>Antippen um zu starten"
69"verwenden<br><br>Antippen um zu starten"
138
70
139−#: Components/PageHeader.qml:345
71+#: Components/PageHeader.qml:364
140msgid "Recent searches"
72msgid "Recent searches"
141msgstr "Letzte Suchbegriffe"
73msgstr "Letzte Suchbegriffe"
142
74
143−#. TRANSLATORS: Number of persons who rated this app
75+#: Dash/Apps/AppPreview.qml:135
76+msgid "Rate this"
77+msgstr "Bewerten"
78+
144#. TRANSLATORS: Number of persons who rated this app/video/whatever
79#. TRANSLATORS: Number of persons who rated this app/video/whatever
145−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
80+#: Dash/Previews/Header.qml:93
146#, qt-format
81#, qt-format
147msgid "(%1)"
82msgid "(%1)"
148msgstr "(%1)"
83msgstr "(%1)"
149
84
150−#. TRANSLATORS: Number of persons who wrote reviews for this app
151#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
85#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
152−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
86+#: Dash/Previews/Header.qml:105
153#, qt-format
87#, qt-format
154msgid "%1 review"
88msgid "%1 review"
155msgid_plural "%1 reviews"
89msgid_plural "%1 reviews"
156msgstr[0] "%1 Bewertung"
90msgstr[0] "%1 Bewertung"
157msgstr[1] "%1 Bewertungen"
91msgstr[1] "%1 Bewertungen"
158
92
159−#: Dash/Apps/AppPreview.qml:135
160−msgid "Rate this"
161−msgstr "Bewerten"
162−
163#: Dash/Previews/Reviews.qml:74
93#: Dash/Previews/Reviews.qml:74
164msgid "Add a review"
94msgid "Add a review"
165msgstr "Bewertung hinzufügen"
95msgstr "Bewertung hinzufügen"
@@ -176,7 +106,7 @@ msgstr "Senden"
176msgid "Comments:"
106msgid "Comments:"
177msgstr "Kommentare:"
107msgstr "Kommentare:"
178
108
179−#: Greeter/Lockscreen.qml:146
109+#: Greeter/Lockscreen.qml:149
180msgid "Emergency Call"
110msgid "Emergency Call"
181msgstr "Notruf"
111msgstr "Notruf"
182
112
@@ -226,15 +156,7 @@ msgstr ""
226msgid "Unlock from Launcher"
156msgid "Unlock from Launcher"
227msgstr ""
157msgstr ""
228
158
229−#: plugins/Unity/scope.cpp:408
230−msgid "Sorry, there is nothing that matches your search."
231−msgstr "Entschuldigung, es wurden keine Treffer erzielt."
232−
233−#: plugins/Unity/showallfilteroption.cpp:41
234−msgid "All"
235−msgstr "Alle"
236−
237−#: Shell.qml:441
159+#: Shell.qml:439
238#, qt-format
160#, qt-format
239msgid "Please enter %1"
161msgid "Please enter %1"
240msgstr "Bitte geben Sie %1 ein"
162msgstr "Bitte geben Sie %1 ein"
po/el.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\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,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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 ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
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 ""
88
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr "Πρόσφατες αναζητήσεις"
69msgstr "Πρόσφατες αναζητήσεις"
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr ""
79msgstr ""
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] ""
86msgstr[0] ""
153msgstr[1] ""
87msgstr[1] ""
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr ""
91msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172msgid "Comments:"
102msgid "Comments:"
173msgstr ""
103msgstr ""
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177msgstr ""
107msgstr ""
178
108
@@ -222,15 +152,7 @@ msgstr ""
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223msgstr ""
153msgstr ""
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "Λυπούμαστε, δεν υπάρχει τίποτα που να ταιριάζει στην αναζήτησή σας."
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236msgstr ""
158msgstr ""
po/en_AU.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11"PO-Revision-Date: 2013-09-28 07:46+0000\n"
11"PO-Revision-Date: 2013-09-28 07:46+0000\n"
12"Last-Translator: Jared Norris <jarednorris@ubuntu.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"
@@ -15,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Phone"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Camera"
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 "Browser"
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 "Weather"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Notepad"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Calendar"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "Media Player"
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
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr "Recent searches"
69msgstr "Recent searches"
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr "Rate this"
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr "(%1)"
79msgstr "(%1)"
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] "%1 review"
86msgstr[0] "%1 review"
153msgstr[1] "%1 reviews"
87msgstr[1] "%1 reviews"
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr "Rate this"
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr "Add a review"
91msgstr "Add a review"
@@ -172,7 +102,7 @@ msgstr "Send"
172msgid "Comments:"
102msgid "Comments:"
173msgstr "Comments:"
103msgstr "Comments:"
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177msgstr "Emergency Call"
107msgstr "Emergency Call"
178
108
@@ -222,15 +152,7 @@ msgstr ""
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223msgstr ""
153msgstr ""
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "Sorry, there is nothing that matches your search."
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236msgstr "Please enter %1"
158msgstr "Please enter %1"
po/en_GB.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\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,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Phone"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Camera"
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 "Browser"
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 "Weather"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Notepad"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Calendar"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "Media Player"
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
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr "Recent searches"
69msgstr "Recent searches"
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr ""
79msgstr ""
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] ""
86msgstr[0] ""
153msgstr[1] ""
87msgstr[1] ""
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr ""
91msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172msgid "Comments:"
102msgid "Comments:"
173msgstr ""
103msgstr ""
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177msgstr ""
107msgstr ""
178
108
@@ -222,15 +152,7 @@ msgstr ""
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223msgstr ""
153msgstr ""
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "Sorry, there is nothing that matches your search."
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236msgstr "Please enter %1"
158msgstr "Please enter %1"
po/eo.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\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,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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 ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
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 ""
88
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr ""
69msgstr ""
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr ""
79msgstr ""
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] ""
86msgstr[0] ""
153msgstr[1] ""
87msgstr[1] ""
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr ""
91msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172msgid "Comments:"
102msgid "Comments:"
173msgstr ""
103msgstr ""
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177msgstr ""
107msgstr ""
178
108
@@ -222,15 +152,7 @@ msgstr ""
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223msgstr ""
153msgstr ""
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr ""
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236msgstr ""
158msgstr ""
po/es.po+13−91
@@ -7,84 +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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11"PO-Revision-Date: 2013-11-20 08:46+0000\n"
11"PO-Revision-Date: 2013-11-20 08:46+0000\n"
12−"Last-Translator: Adolfo Jayme Barrientos <fitoschido@gmail.com>\n"
12+"Last-Translator: Adolfo Jayme <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-11-21 06:43+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Teléfono"
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 "Meteorología"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Bloc de notas"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Calendario"
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 "Mapa"
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
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -136,30 +68,28 @@ msgstr ""
136"Ahora domina los gestos de bordes y puede usar el teléfono<br><br>Toque la "
68"Ahora domina los gestos de bordes y puede usar el teléfono<br><br>Toque la "
137"pantalla para comenzar"
69"pantalla para comenzar"
138
70
139−#: Components/PageHeader.qml:345
71+#: Components/PageHeader.qml:364
140msgid "Recent searches"
72msgid "Recent searches"
141msgstr "Búsquedas recientes"
73msgstr "Búsquedas recientes"
142
74
143−#. TRANSLATORS: Number of persons who rated this app
75+#: Dash/Apps/AppPreview.qml:135
76+msgid "Rate this"
77+msgstr "Valorar esto"
78+
144#. TRANSLATORS: Number of persons who rated this app/video/whatever
79#. TRANSLATORS: Number of persons who rated this app/video/whatever
145−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
80+#: Dash/Previews/Header.qml:93
146#, qt-format
81#, qt-format
147msgid "(%1)"
82msgid "(%1)"
148msgstr "(%1)"
83msgstr "(%1)"
149
84
150−#. TRANSLATORS: Number of persons who wrote reviews for this app
151#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
85#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
152−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
86+#: Dash/Previews/Header.qml:105
153#, qt-format
87#, qt-format
154msgid "%1 review"
88msgid "%1 review"
155msgid_plural "%1 reviews"
89msgid_plural "%1 reviews"
156msgstr[0] "%1 reseña"
90msgstr[0] "%1 reseña"
157msgstr[1] "%1 reseñas"
91msgstr[1] "%1 reseñas"
158
92
159−#: Dash/Apps/AppPreview.qml:135
160−msgid "Rate this"
161−msgstr "Valorar esto"
162−
163#: Dash/Previews/Reviews.qml:74
93#: Dash/Previews/Reviews.qml:74
164msgid "Add a review"
94msgid "Add a review"
165msgstr "Añadir una reseña"
95msgstr "Añadir una reseña"
@@ -176,7 +106,7 @@ msgstr "Enviar"
176msgid "Comments:"
106msgid "Comments:"
177msgstr "Comentarios:"
107msgstr "Comentarios:"
178
108
179−#: Greeter/Lockscreen.qml:146
109+#: Greeter/Lockscreen.qml:149
180msgid "Emergency Call"
110msgid "Emergency Call"
181msgstr "Llamada de emergencia"
111msgstr "Llamada de emergencia"
182
112
@@ -226,15 +156,7 @@ msgstr "Mantener en el lanzador"
226msgid "Unlock from Launcher"
156msgid "Unlock from Launcher"
227msgstr "No mantener en el lanzador"
157msgstr "No mantener en el lanzador"
228
158
229−#: plugins/Unity/scope.cpp:408
230−msgid "Sorry, there is nothing that matches your search."
231−msgstr "No hay nada que coincida con su búsqueda."
232−
233−#: plugins/Unity/showallfilteroption.cpp:41
234−msgid "All"
235−msgstr "Todo"
236−
237−#: Shell.qml:441
159+#: Shell.qml:439
238#, qt-format
160#, qt-format
239msgid "Please enter %1"
161msgid "Please enter %1"
240msgstr "Introduzca %1"
162msgstr "Introduzca %1"
po/fa.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11"PO-Revision-Date: 2013-10-31 19:02+0000\n"
11"PO-Revision-Date: 2013-10-31 19:02+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Persian <fa@li.org>\n"
13"Language-Team: Persian <fa@li.org>\n"
@@ -15,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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 ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
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 ""
88
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr ""
69msgstr ""
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr ""
79msgstr ""
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] ""
86msgstr[0] ""
153msgstr[1] ""
87msgstr[1] ""
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr ""
91msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172msgid "Comments:"
102msgid "Comments:"
173msgstr ""
103msgstr ""
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177msgstr ""
107msgstr ""
178
108
@@ -222,15 +152,7 @@ msgstr ""
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223msgstr ""
153msgstr ""
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr ""
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236msgstr ""
158msgstr ""
po/fi.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11"PO-Revision-Date: 2013-11-20 08:09+0000\n"
11"PO-Revision-Date: 2013-11-20 08:09+0000\n"
12"Last-Translator: Jiri Grönroos <Unknown>\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"
@@ -15,76 +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-11-21 06:43+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Puhelin"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Kamera"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "Galleria"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "Facebook"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "Selain"
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 "Sää"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Muistio"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Kalenteri"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "Mediasoitin"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr "Evernote"
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "Kartta"
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
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -134,30 +66,28 @@ msgstr ""
134"Hallitset nyt reunaeleet, joten voit aloittaa puhelimen "
66"Hallitset nyt reunaeleet, joten voit aloittaa puhelimen "
135"käytön<br><br>Napauta missä tahansa aloittaaksesi"
67"käytön<br><br>Napauta missä tahansa aloittaaksesi"
136
68
137−#: Components/PageHeader.qml:345
69+#: Components/PageHeader.qml:364
138msgid "Recent searches"
70msgid "Recent searches"
139msgstr "Viimeisimmät haut"
71msgstr "Viimeisimmät haut"
140
72
141−#. TRANSLATORS: Number of persons who rated this app
73+#: Dash/Apps/AppPreview.qml:135
74+msgid "Rate this"
75+msgstr "Arvioi tämä"
76+
142#. TRANSLATORS: Number of persons who rated this app/video/whatever
77#. TRANSLATORS: Number of persons who rated this app/video/whatever
143−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
78+#: Dash/Previews/Header.qml:93
144#, qt-format
79#, qt-format
145msgid "(%1)"
80msgid "(%1)"
146msgstr "(%1)"
81msgstr "(%1)"
147
82
148−#. TRANSLATORS: Number of persons who wrote reviews for this app
149#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
83#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
150−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
84+#: Dash/Previews/Header.qml:105
151#, qt-format
85#, qt-format
152msgid "%1 review"
86msgid "%1 review"
153msgid_plural "%1 reviews"
87msgid_plural "%1 reviews"
154msgstr[0] "%1 arvostelu"
88msgstr[0] "%1 arvostelu"
155msgstr[1] "%1 arvostelua"
89msgstr[1] "%1 arvostelua"
156
90
157−#: Dash/Apps/AppPreview.qml:135
158−msgid "Rate this"
159−msgstr "Arvioi tämä"
160−
161#: Dash/Previews/Reviews.qml:74
91#: Dash/Previews/Reviews.qml:74
162msgid "Add a review"
92msgid "Add a review"
163msgstr "Lisää arvostelu"
93msgstr "Lisää arvostelu"
@@ -174,7 +104,7 @@ msgstr "Lähetä"
174msgid "Comments:"
104msgid "Comments:"
175msgstr "Kommentit:"
105msgstr "Kommentit:"
176
106
177−#: Greeter/Lockscreen.qml:146
107+#: Greeter/Lockscreen.qml:149
178msgid "Emergency Call"
108msgid "Emergency Call"
179msgstr "Hätäpuhelu"
109msgstr "Hätäpuhelu"
180
110
@@ -224,15 +154,7 @@ msgstr "Kiinnitä käynnistimeen"
224msgid "Unlock from Launcher"
154msgid "Unlock from Launcher"
225msgstr "Poista käynnistimestä"
155msgstr "Poista käynnistimestä"
226
156
227−#: plugins/Unity/scope.cpp:408
228−msgid "Sorry, there is nothing that matches your search."
229−msgstr "Hakuun täsmääviä tuloksia ei löydy."
230−
231−#: plugins/Unity/showallfilteroption.cpp:41
232−msgid "All"
233−msgstr "Kaikki"
234−
235−#: Shell.qml:441
157+#: Shell.qml:439
236#, qt-format
158#, qt-format
237msgid "Please enter %1"
159msgid "Please enter %1"
238msgstr "Kirjoita %1"
160msgstr "Kirjoita %1"
po/fo.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11"PO-Revision-Date: 2013-10-01 15:13+0000\n"
11"PO-Revision-Date: 2013-10-01 15:13+0000\n"
12"Last-Translator: Jógvan Olsen <jeggy@jebster.net>\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"
@@ -15,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Fartelefon"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Myndatól"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "Myndasavn"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "Facebook"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "Kagi"
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 "Veðrið"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Skriviblokkur"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Kalendari"
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 ""
88
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr ""
69msgstr ""
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr ""
79msgstr ""
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] ""
86msgstr[0] ""
153msgstr[1] ""
87msgstr[1] ""
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr ""
91msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172msgid "Comments:"
102msgid "Comments:"
173msgstr ""
103msgstr ""
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177msgstr ""
107msgstr ""
178
108
@@ -222,15 +152,7 @@ msgstr ""
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223msgstr ""
153msgstr ""
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "Tíanverri er tað einki sum hóskar til tína leiting."
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236msgstr ""
158msgstr ""
po/fr.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\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,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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 ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
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 ""
88
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr ""
69msgstr ""
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr ""
79msgstr ""
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] ""
86msgstr[0] ""
153msgstr[1] ""
87msgstr[1] ""
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr ""
91msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172msgid "Comments:"
102msgid "Comments:"
173msgstr ""
103msgstr ""
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177msgstr ""
107msgstr ""
178
108
@@ -222,15 +152,7 @@ msgstr ""
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223msgstr ""
153msgstr ""
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr ""
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236msgstr ""
158msgstr ""
po/gd.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11"PO-Revision-Date: 2013-09-30 10:34+0000\n"
11"PO-Revision-Date: 2013-09-30 10:34+0000\n"
12"Last-Translator: Akerbeltz <fios@akerbeltz.org>\n"
12"Last-Translator: Akerbeltz <fios@akerbeltz.org>\n"
13"Language-Team: Gaelic; Scottish <gd@li.org>\n"
13"Language-Team: Gaelic; Scottish <gd@li.org>\n"
@@ -16,76 +16,8 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
17"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
18"(n > 2 && n < 20) ? 2 : 3;\n"
18"(n > 2 && n < 20) ? 2 : 3;\n"
19−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
20−"X-Generator: Launchpad (build 16831)\n"
20+"X-Generator: Launchpad (build 16877)\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
21
90#: Components/EdgeDemoOverlay.qml:151
22#: Components/EdgeDemoOverlay.qml:151
91msgid "Skip intro"
23msgid "Skip intro"
@@ -139,20 +71,22 @@ msgid ""
139"phone<br><br>Tap anywhere to start"
71"phone<br><br>Tap anywhere to start"
140msgstr ""
72msgstr ""
141
73
142−#: Components/PageHeader.qml:345
74+#: Components/PageHeader.qml:364
143msgid "Recent searches"
75msgid "Recent searches"
144msgstr "Na lorg thu o chionn goirid"
76msgstr "Na lorg thu o chionn goirid"
145
77
146−#. TRANSLATORS: Number of persons who rated this app
78+#: Dash/Apps/AppPreview.qml:135
79+msgid "Rate this"
80+msgstr "Rangaich seo"
81+
147#. TRANSLATORS: Number of persons who rated this app/video/whatever
82#. TRANSLATORS: Number of persons who rated this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
83+#: Dash/Previews/Header.qml:93
149#, qt-format
84#, qt-format
150msgid "(%1)"
85msgid "(%1)"
151msgstr "(%1)"
86msgstr "(%1)"
152
87
153−#. TRANSLATORS: Number of persons who wrote reviews for this app
154#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
88#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
155−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
89+#: Dash/Previews/Header.qml:105
156#, qt-format
90#, qt-format
157msgid "%1 review"
91msgid "%1 review"
158msgid_plural "%1 reviews"
92msgid_plural "%1 reviews"
@@ -161,10 +95,6 @@ msgstr[1] "%1 lèirmheas"
161msgstr[2] "%1 lèirmheasan"
95msgstr[2] "%1 lèirmheasan"
162msgstr[3] "%1 lèirmheas"
96msgstr[3] "%1 lèirmheas"
163
97
164−#: Dash/Apps/AppPreview.qml:135
165−msgid "Rate this"
166−msgstr "Rangaich seo"
167−
168#: Dash/Previews/Reviews.qml:74
98#: Dash/Previews/Reviews.qml:74
169msgid "Add a review"
99msgid "Add a review"
170msgstr "Cuir lèirmheas ris"
100msgstr "Cuir lèirmheas ris"
@@ -181,7 +111,7 @@ msgstr "Cuir"
181msgid "Comments:"
111msgid "Comments:"
182msgstr "Beachdan"
112msgstr "Beachdan"
183
113
184−#: Greeter/Lockscreen.qml:146
114+#: Greeter/Lockscreen.qml:149
185msgid "Emergency Call"
115msgid "Emergency Call"
186msgstr "Gairm èiginn"
116msgstr "Gairm èiginn"
187
117
@@ -231,15 +161,7 @@ msgstr ""
231msgid "Unlock from Launcher"
161msgid "Unlock from Launcher"
232msgstr ""
162msgstr ""
233
163
234−#: plugins/Unity/scope.cpp:408
235−msgid "Sorry, there is nothing that matches your search."
236−msgstr "Tha sinn duilich ach chan eil dad a' freagairt ris na lorg thu."
237−
238−#: plugins/Unity/showallfilteroption.cpp:41
239−msgid "All"
240−msgstr ""
241−
242−#: Shell.qml:441
164+#: Shell.qml:439
243#, qt-format
165#, qt-format
244msgid "Please enter %1"
166msgid "Please enter %1"
245msgstr "Cuir a-steach %1"
167msgstr "Cuir a-steach %1"
po/gl.po+16−94
@@ -7,84 +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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-10-03 18:49+0000\n"
11+"PO-Revision-Date: 2013-12-06 17:15+0000\n"
12"Last-Translator: Marcos Lans <Unknown>\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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Teléfono"
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 "O tempo"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Bloc de notas"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Calendario"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "Reprodutor multimedia"
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 "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
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -134,30 +66,28 @@ msgstr ""
134"Xa domina os xestos desde os bordos e pode comezar a usar o "
66"Xa domina os xestos desde os bordos e pode comezar a usar o "
135"móbil<br><br>Toque en calquera sitio para comezar"
67"móbil<br><br>Toque en calquera sitio para comezar"
136
68
137−#: Components/PageHeader.qml:345
69+#: Components/PageHeader.qml:364
138msgid "Recent searches"
70msgid "Recent searches"
139msgstr "Buscas recentes"
71msgstr "Buscas recentes"
140
72
141−#. TRANSLATORS: Number of persons who rated this app
73+#: Dash/Apps/AppPreview.qml:135
74+msgid "Rate this"
75+msgstr "Valore isto"
76+
142#. TRANSLATORS: Number of persons who rated this app/video/whatever
77#. TRANSLATORS: Number of persons who rated this app/video/whatever
143−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
78+#: Dash/Previews/Header.qml:93
144#, qt-format
79#, qt-format
145msgid "(%1)"
80msgid "(%1)"
146msgstr "(%1)"
81msgstr "(%1)"
147
82
148−#. TRANSLATORS: Number of persons who wrote reviews for this app
149#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
83#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
150−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
84+#: Dash/Previews/Header.qml:105
151#, qt-format
85#, qt-format
152msgid "%1 review"
86msgid "%1 review"
153msgid_plural "%1 reviews"
87msgid_plural "%1 reviews"
154msgstr[0] "%1 opinión"
88msgstr[0] "%1 opinión"
155msgstr[1] "%1 opinións"
89msgstr[1] "%1 opinións"
156
90
157−#: Dash/Apps/AppPreview.qml:135
158−msgid "Rate this"
159−msgstr "Valore isto"
160−
161#: Dash/Previews/Reviews.qml:74
91#: Dash/Previews/Reviews.qml:74
162msgid "Add a review"
92msgid "Add a review"
163msgstr "Engadir unha opinión"
93msgstr "Engadir unha opinión"
@@ -174,7 +104,7 @@ msgstr "Enviar"
174msgid "Comments:"
104msgid "Comments:"
175msgstr "Comentarios:"
105msgstr "Comentarios:"
176
106
177−#: Greeter/Lockscreen.qml:146
107+#: Greeter/Lockscreen.qml:149
178msgid "Emergency Call"
108msgid "Emergency Call"
179msgstr "Chamada de emerxencia"
109msgstr "Chamada de emerxencia"
180
110
@@ -209,7 +139,7 @@ msgstr "Falando…"
209
139
210#: Notifications/NotificationMenuItemFactory.qml:89
140#: Notifications/NotificationMenuItemFactory.qml:89
211msgid "Show password"
141msgid "Show password"
212−msgstr ""
142+msgstr "Mostrar contrasinal"
213
143
214#: Panel/SearchIndicator.qml:27
144#: Panel/SearchIndicator.qml:27
215msgid "Search"
145msgid "Search"
@@ -218,21 +148,13 @@ msgstr "Buscar"
218#: plugins/Unity/Launcher/launcheritem.cpp:43
148#: plugins/Unity/Launcher/launcheritem.cpp:43
219#: plugins/Unity/Launcher/launcheritem.cpp:73
149#: plugins/Unity/Launcher/launcheritem.cpp:73
220msgid "Lock to Launcher"
150msgid "Lock to Launcher"
221−msgstr ""
151+msgstr "Manter no Iniciador"
222
152
223#: plugins/Unity/Launcher/launcheritem.cpp:73
153#: plugins/Unity/Launcher/launcheritem.cpp:73
224msgid "Unlock from Launcher"
154msgid "Unlock from Launcher"
225−msgstr ""
155+msgstr "Non manter no Iniciador"
226−
227−#: plugins/Unity/scope.cpp:408
228−msgid "Sorry, there is nothing that matches your search."
229−msgstr "Sentímolo, non hai nada que coincida con esta busca."
230−
231−#: plugins/Unity/showallfilteroption.cpp:41
232−msgid "All"
233−msgstr "Todo"
234
156
235−#: Shell.qml:441
157+#: Shell.qml:439
236#, qt-format
158#, qt-format
237msgid "Please enter %1"
159msgid "Please enter %1"
238msgstr "Introduza %1"
160msgstr "Introduza %1"
po/he.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11"PO-Revision-Date: 2013-11-20 08:30+0000\n"
11"PO-Revision-Date: 2013-11-20 08:30+0000\n"
12"Last-Translator: Yaron <sh.yaron@gmail.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"
@@ -15,76 +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-11-21 06:43+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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 "פנקס רשימות"
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
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -134,30 +66,28 @@ msgstr ""
134"עתה מכשסיימת את ההשתלמות לשימוש במחוות קצה יש לך את הכלים להשתמש "
66"עתה מכשסיימת את ההשתלמות לשימוש במחוות קצה יש לך את הכלים להשתמש "
135"בטלפון<br><br>ניתן לגעת במקום כלשהו במסך כדי להתחיל"
67"בטלפון<br><br>ניתן לגעת במקום כלשהו במסך כדי להתחיל"
136
68
137−#: Components/PageHeader.qml:345
69+#: Components/PageHeader.qml:364
138msgid "Recent searches"
70msgid "Recent searches"
139msgstr "חיפושים אחרונים"
71msgstr "חיפושים אחרונים"
140
72
141−#. TRANSLATORS: Number of persons who rated this app
73+#: Dash/Apps/AppPreview.qml:135
74+msgid "Rate this"
75+msgstr "דירוג היישום"
76+
142#. TRANSLATORS: Number of persons who rated this app/video/whatever
77#. TRANSLATORS: Number of persons who rated this app/video/whatever
143−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
78+#: Dash/Previews/Header.qml:93
144#, qt-format
79#, qt-format
145msgid "(%1)"
80msgid "(%1)"
146msgstr "(%1)"
81msgstr "(%1)"
147
82
148−#. TRANSLATORS: Number of persons who wrote reviews for this app
149#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
83#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
150−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
84+#: Dash/Previews/Header.qml:105
151#, qt-format
85#, qt-format
152msgid "%1 review"
86msgid "%1 review"
153msgid_plural "%1 reviews"
87msgid_plural "%1 reviews"
154msgstr[0] "סקירה %1"
88msgstr[0] "סקירה %1"
155msgstr[1] "%1 סקירות"
89msgstr[1] "%1 סקירות"
156
90
157−#: Dash/Apps/AppPreview.qml:135
158−msgid "Rate this"
159−msgstr "דירוג היישום"
160−
161#: Dash/Previews/Reviews.qml:74
91#: Dash/Previews/Reviews.qml:74
162msgid "Add a review"
92msgid "Add a review"
163msgstr "הוספת סקירה"
93msgstr "הוספת סקירה"
@@ -174,7 +104,7 @@ msgstr "שליחה"
174msgid "Comments:"
104msgid "Comments:"
175msgstr "הערות:"
105msgstr "הערות:"
176
106
177−#: Greeter/Lockscreen.qml:146
107+#: Greeter/Lockscreen.qml:149
178msgid "Emergency Call"
108msgid "Emergency Call"
179msgstr "שיחת חירום"
109msgstr "שיחת חירום"
180
110
@@ -224,15 +154,7 @@ msgstr "נעילה למשגר"
224msgid "Unlock from Launcher"
154msgid "Unlock from Launcher"
225msgstr "הפרדה מהמשגר"
155msgstr "הפרדה מהמשגר"
226
156
227−#: plugins/Unity/scope.cpp:408
228−msgid "Sorry, there is nothing that matches your search."
229−msgstr "שום דבר אינו תואם לחיפוש שלך, עמך הסליחה."
230−
231−#: plugins/Unity/showallfilteroption.cpp:41
232−msgid "All"
233−msgstr "הכול"
234−
235−#: Shell.qml:441
157+#: Shell.qml:439
236#, qt-format
158#, qt-format
237msgid "Please enter %1"
159msgid "Please enter %1"
238msgstr "נא להזין %1"
160msgstr "נא להזין %1"
po/hr.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\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,76 +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-11-19 05:59+0000\n"
19+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
20−"X-Generator: Launchpad (build 16831)\n"
20+"X-Generator: Launchpad (build 16877)\n"
21−
22−#: Applications/applications.js:23
23−msgid "Phone"
24−msgstr ""
25−
26−#: Applications/applications.js:29
27−msgid "Camera"
28−msgstr ""
29−
30−#: Applications/applications.js:35
31−msgid "Gallery"
32−msgstr ""
33−
34−#: Applications/applications.js:40
35−msgid "Facebook"
36−msgstr ""
37−
38−#: Applications/applications.js:46
39−msgid "Browser"
40−msgstr ""
41−
42−#: Applications/applications.js:51
43−msgid "Twitter"
44−msgstr ""
45−
46−#: Applications/applications.js:57
47−msgid "GMail"
48−msgstr ""
49−
50−#: Applications/applications.js:62
51−msgid "Weather"
52−msgstr ""
53−
54−#: Applications/applications.js:68
55−msgid "Notepad"
56−msgstr ""
57−
58−#: Applications/applications.js:74
59−msgid "Calendar"
60−msgstr ""
61−
62−#: Applications/applications.js:80
63−msgid "Media Player"
64−msgstr ""
65−
66−#: Applications/applications.js:86
67−msgid "Evernote"
68−msgstr ""
69−
70−#: Applications/applications.js:91
71−msgid "Map"
72−msgstr ""
73−
74−#: Applications/applications.js:96
75−msgid "Pinterest"
76−msgstr ""
77−
78−#: Applications/applications.js:101
79−msgid "SoundCloud"
80−msgstr ""
81−
82−#: Applications/applications.js:106
83−msgid "Wikipedia"
84−msgstr ""
85−
86−#: Applications/applications.js:111
87−msgid "YouTube"
88−msgstr ""
89
21
90#: Components/EdgeDemoOverlay.qml:151
22#: Components/EdgeDemoOverlay.qml:151
91msgid "Skip intro"
23msgid "Skip intro"
@@ -133,30 +65,28 @@ msgid ""
133"phone<br><br>Tap anywhere to start"
65"phone<br><br>Tap anywhere to start"
134msgstr ""
66msgstr ""
135
67
136−#: Components/PageHeader.qml:345
68+#: Components/PageHeader.qml:364
137msgid "Recent searches"
69msgid "Recent searches"
138msgstr "Nedavne pretrage"
70msgstr "Nedavne pretrage"
139
71
140−#. TRANSLATORS: Number of persons who rated this app
72+#: Dash/Apps/AppPreview.qml:135
73+msgid "Rate this"
74+msgstr ""
75+
141#. TRANSLATORS: Number of persons who rated this app/video/whatever
76#. TRANSLATORS: Number of persons who rated this app/video/whatever
142−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
77+#: Dash/Previews/Header.qml:93
143#, qt-format
78#, qt-format
144msgid "(%1)"
79msgid "(%1)"
145msgstr ""
80msgstr ""
146
81
147−#. TRANSLATORS: Number of persons who wrote reviews for this app
148#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
82#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
149−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
83+#: Dash/Previews/Header.qml:105
150#, qt-format
84#, qt-format
151msgid "%1 review"
85msgid "%1 review"
152msgid_plural "%1 reviews"
86msgid_plural "%1 reviews"
153msgstr[0] ""
87msgstr[0] ""
154msgstr[1] ""
88msgstr[1] ""
155
89
156−#: Dash/Apps/AppPreview.qml:135
157−msgid "Rate this"
158−msgstr ""
159−
160#: Dash/Previews/Reviews.qml:74
90#: Dash/Previews/Reviews.qml:74
161msgid "Add a review"
91msgid "Add a review"
162msgstr ""
92msgstr ""
@@ -173,7 +103,7 @@ msgstr ""
173msgid "Comments:"
103msgid "Comments:"
174msgstr ""
104msgstr ""
175
105
176−#: Greeter/Lockscreen.qml:146
106+#: Greeter/Lockscreen.qml:149
177msgid "Emergency Call"
107msgid "Emergency Call"
178msgstr ""
108msgstr ""
179
109
@@ -223,15 +153,7 @@ msgstr ""
223msgid "Unlock from Launcher"
153msgid "Unlock from Launcher"
224msgstr ""
154msgstr ""
225
155
226−#: plugins/Unity/scope.cpp:408
227−msgid "Sorry, there is nothing that matches your search."
228−msgstr "Nažalost, ne postoji ništa što odgovara vašoj pretrazi."
229−
230−#: plugins/Unity/showallfilteroption.cpp:41
231−msgid "All"
232−msgstr ""
233−
234−#: Shell.qml:441
156+#: Shell.qml:439
235#, qt-format
157#, qt-format
236msgid "Please enter %1"
158msgid "Please enter %1"
237msgstr ""
159msgstr ""
po/hu.po+41−115
@@ -7,183 +7,117 @@ 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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-06-27 04:28+0000\n"
11+"PO-Revision-Date: 2014-01-07 18:02+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12+"Last-Translator: Gabor Kelemen <kelemeng@gnome.hu>\n"
13"Language-Team: Hungarian <hu@li.org>\n"
13"Language-Team: Hungarian <hu@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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-01-08 05:43+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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 ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
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 ""
88
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
91−msgstr ""
23+msgstr "A bemutató kihagyása"
92
24
93#: Components/EdgeDemo.qml:112
25#: Components/EdgeDemo.qml:112
94msgid "Right edge"
26msgid "Right edge"
95−msgstr ""
27+msgstr "Jobb szél"
96
28
97#: Components/EdgeDemo.qml:113
29#: Components/EdgeDemo.qml:113
98msgid "Try swiping from the right edge to unlock the phone"
30msgid "Try swiping from the right edge to unlock the phone"
99−msgstr ""
31+msgstr "A telefon feloldásához csúsztassa ujját a jobb szélről"
100
32
101#: Components/EdgeDemo.qml:144
33#: Components/EdgeDemo.qml:144
102msgid "Top edge"
34msgid "Top edge"
103−msgstr ""
35+msgstr "Felső szél"
104
36
105#: Components/EdgeDemo.qml:145
37#: Components/EdgeDemo.qml:145
106msgid "Try swiping from the top edge to access the indicators"
38msgid "Try swiping from the top edge to access the indicators"
107−msgstr ""
39+msgstr "A jelzők eléréséhez csúsztassa ujját a felső szélről"
108
40
109#: Components/EdgeDemo.qml:170
41#: Components/EdgeDemo.qml:170
110msgid "Close"
42msgid "Close"
111−msgstr ""
43+msgstr "Bezárás"
112
44
113#: Components/EdgeDemo.qml:171
45#: Components/EdgeDemo.qml:171
114msgid "Swipe up again to close the settings screen"
46msgid "Swipe up again to close the settings screen"
115−msgstr ""
47+msgstr "A beállítások bezárásához csúsztassa ujját újra felfelé"
116
48
117#: Components/EdgeDemo.qml:198
49#: Components/EdgeDemo.qml:198
118msgid "Left edge"
50msgid "Left edge"
119−msgstr ""
51+msgstr "Bal szél"
120
52
121#: Components/EdgeDemo.qml:199
53#: Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
54msgid "Swipe from the left to reveal the launcher for quick access to apps"
123msgstr ""
55msgstr ""
56+"Csúsztassa ujját a bal szélről az indítón található alkalmazások gyors "
57+"eléréséhez"
124
58
125#: Components/EdgeDemo.qml:226
59#: Components/EdgeDemo.qml:226
126msgid "Well done"
60msgid "Well done"
127−msgstr ""
61+msgstr "Rendben"
128
62
129#: Components/EdgeDemo.qml:227
63#: Components/EdgeDemo.qml:227
130msgid ""
64msgid ""
131"You have now mastered the edge gestures and can start using the "
65"You have now mastered the edge gestures and can start using the "
132"phone<br><br>Tap anywhere to start"
66"phone<br><br>Tap anywhere to start"
133msgstr ""
67msgstr ""
68+"Miután megismerte a szélek használatát, nincs más hátra...<br><br>Koppintson "
69+"a folytatáshoz!"
134
70
135−#: Components/PageHeader.qml:345
71+#: Components/PageHeader.qml:364
136msgid "Recent searches"
72msgid "Recent searches"
137msgstr "Legutóbbi keresések"
73msgstr "Legutóbbi keresések"
138
74
139−#. TRANSLATORS: Number of persons who rated this app
75+#: Dash/Apps/AppPreview.qml:135
76+msgid "Rate this"
77+msgstr "Osztályzás"
78+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
79#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
80+#: Dash/Previews/Header.qml:93
142#, qt-format
81#, qt-format
143msgid "(%1)"
82msgid "(%1)"
144−msgstr ""
83+msgstr "(%1)"
145
84
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
85#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
86+#: Dash/Previews/Header.qml:105
149#, qt-format
87#, qt-format
150msgid "%1 review"
88msgid "%1 review"
151msgid_plural "%1 reviews"
89msgid_plural "%1 reviews"
152−msgstr[0] ""
90+msgstr[0] "%1 értékelés"
153−msgstr[1] ""
91+msgstr[1] "%1 értékelés"
154−
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158
92
159#: Dash/Previews/Reviews.qml:74
93#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
94msgid "Add a review"
161−msgstr ""
95+msgstr "Értékelés hozzáadása"
162
96
163#: Dash/Previews/Reviews.qml:86
97#: Dash/Previews/Reviews.qml:86
164msgid "Review"
98msgid "Review"
165−msgstr ""
99+msgstr "Értékelés"
166
100
167#: Dash/Previews/Reviews.qml:121
101#: Dash/Previews/Reviews.qml:121
168msgid "Send"
102msgid "Send"
169−msgstr ""
103+msgstr "Küldés"
170
104
171#: Dash/Previews/Reviews.qml:139
105#: Dash/Previews/Reviews.qml:139
172msgid "Comments:"
106msgid "Comments:"
173−msgstr ""
107+msgstr "Hozzászólások:"
174
108
175−#: Greeter/Lockscreen.qml:146
109+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
110msgid "Emergency Call"
177−msgstr ""
111+msgstr "Vészhívás"
178
112
179#: Greeter/PassphraseLockscreen.qml:59
113#: Greeter/PassphraseLockscreen.qml:59
180#, qt-format
114#, qt-format
181msgid "Hello %1"
115msgid "Hello %1"
182−msgstr ""
116+msgstr "Szia %1"
183
117
184#: Greeter/PassphraseLockscreen.qml:59
118#: Greeter/PassphraseLockscreen.qml:59
185msgid "Hello"
119msgid "Hello"
186−msgstr ""
120+msgstr "Szia"
187
121
188#: Hud/HudParametrizedActionsPage.qml:132
122#: Hud/HudParametrizedActionsPage.qml:132
189msgid "Confirm"
123msgid "Confirm"
@@ -207,7 +141,7 @@ msgstr "Beszéd…"
207
141
208#: Notifications/NotificationMenuItemFactory.qml:89
142#: Notifications/NotificationMenuItemFactory.qml:89
209msgid "Show password"
143msgid "Show password"
210−msgstr ""
144+msgstr "Jelszó megjelenítése"
211
145
212#: Panel/SearchIndicator.qml:27
146#: Panel/SearchIndicator.qml:27
213msgid "Search"
147msgid "Search"
@@ -216,21 +150,13 @@ msgstr "Keresés"
216#: plugins/Unity/Launcher/launcheritem.cpp:43
150#: plugins/Unity/Launcher/launcheritem.cpp:43
217#: plugins/Unity/Launcher/launcheritem.cpp:73
151#: plugins/Unity/Launcher/launcheritem.cpp:73
218msgid "Lock to Launcher"
152msgid "Lock to Launcher"
219−msgstr ""
153+msgstr "Indítóban tartás"
220
154
221#: plugins/Unity/Launcher/launcheritem.cpp:73
155#: plugins/Unity/Launcher/launcheritem.cpp:73
222msgid "Unlock from Launcher"
156msgid "Unlock from Launcher"
223−msgstr ""
157+msgstr "Eltávolítás az Indítóból"
224
158
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "Elnézést, nincs találat a keresésre."
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
159+#: Shell.qml:439
234#, qt-format
160#, qt-format
235msgid "Please enter %1"
161msgid "Please enter %1"
236−msgstr ""
162+msgstr "Adja meg a következőt: %1"
po/hy.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\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,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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 ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
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 ""
88
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr "Վերջին որոնումներ"
69msgstr "Վերջին որոնումներ"
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr ""
79msgstr ""
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] ""
86msgstr[0] ""
153msgstr[1] ""
87msgstr[1] ""
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr ""
91msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172msgid "Comments:"
102msgid "Comments:"
173msgstr ""
103msgstr ""
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177msgstr ""
107msgstr ""
178
108
@@ -222,15 +152,7 @@ msgstr ""
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223msgstr ""
153msgstr ""
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "Կներերք, բայց Ձեր հարցումով ոչինչ չկար"
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236msgstr ""
158msgstr ""
po/id.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\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,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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 ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
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 ""
88
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr ""
69msgstr ""
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr ""
79msgstr ""
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] ""
86msgstr[0] ""
153msgstr[1] ""
87msgstr[1] ""
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr ""
91msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172msgid "Comments:"
102msgid "Comments:"
173msgstr ""
103msgstr ""
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177msgstr ""
107msgstr ""
178
108
@@ -222,15 +152,7 @@ msgstr ""
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223msgstr ""
153msgstr ""
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr ""
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236msgstr ""
158msgstr ""
po/is.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\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,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Sími"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Myndavél"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "Myndasafn"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "Facebook"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "Vafri"
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 "Veður"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Skrifblokk"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Dagatal"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "Margmiðlunarspilari"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr "Evernote"
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "Kort"
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
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -133,30 +65,28 @@ msgid ""
133"phone<br><br>Tap anywhere to start"
65"phone<br><br>Tap anywhere to start"
134msgstr ""
66msgstr ""
135
67
136−#: Components/PageHeader.qml:345
68+#: Components/PageHeader.qml:364
137msgid "Recent searches"
69msgid "Recent searches"
138msgstr "Nýlegar leitir"
70msgstr "Nýlegar leitir"
139
71
140−#. TRANSLATORS: Number of persons who rated this app
72+#: Dash/Apps/AppPreview.qml:135
73+msgid "Rate this"
74+msgstr "Gefa þessu einkunn"
75+
141#. TRANSLATORS: Number of persons who rated this app/video/whatever
76#. TRANSLATORS: Number of persons who rated this app/video/whatever
142−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
77+#: Dash/Previews/Header.qml:93
143#, qt-format
78#, qt-format
144msgid "(%1)"
79msgid "(%1)"
145msgstr "(%1)"
80msgstr "(%1)"
146
81
147−#. TRANSLATORS: Number of persons who wrote reviews for this app
148#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
82#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
149−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
83+#: Dash/Previews/Header.qml:105
150#, qt-format
84#, qt-format
151msgid "%1 review"
85msgid "%1 review"
152msgid_plural "%1 reviews"
86msgid_plural "%1 reviews"
153msgstr[0] "%1 ummæli"
87msgstr[0] "%1 ummæli"
154msgstr[1] "%1 ummæli"
88msgstr[1] "%1 ummæli"
155
89
156−#: Dash/Apps/AppPreview.qml:135
157−msgid "Rate this"
158−msgstr "Gefa þessu einkunn"
159−
160#: Dash/Previews/Reviews.qml:74
90#: Dash/Previews/Reviews.qml:74
161msgid "Add a review"
91msgid "Add a review"
162msgstr "Gefa umsögn"
92msgstr "Gefa umsögn"
@@ -173,7 +103,7 @@ msgstr "Senda"
173msgid "Comments:"
103msgid "Comments:"
174msgstr "Athugasemdir:"
104msgstr "Athugasemdir:"
175
105
176−#: Greeter/Lockscreen.qml:146
106+#: Greeter/Lockscreen.qml:149
177msgid "Emergency Call"
107msgid "Emergency Call"
178msgstr "Neyðarsímtal"
108msgstr "Neyðarsímtal"
179
109
@@ -223,15 +153,7 @@ msgstr ""
223msgid "Unlock from Launcher"
153msgid "Unlock from Launcher"
224msgstr ""
154msgstr ""
225
155
226−#: plugins/Unity/scope.cpp:408
227−msgid "Sorry, there is nothing that matches your search."
228−msgstr "Því miður, það var ekkert sem passaði við leitarorðið þitt."
229−
230−#: plugins/Unity/showallfilteroption.cpp:41
231−msgid "All"
232−msgstr ""
233−
234−#: Shell.qml:441
156+#: Shell.qml:439
235#, qt-format
157#, qt-format
236msgid "Please enter %1"
158msgid "Please enter %1"
237msgstr ""
159msgstr ""
po/it.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11"PO-Revision-Date: 2013-10-07 09:34+0000\n"
11"PO-Revision-Date: 2013-10-07 09:34+0000\n"
12"Last-Translator: Claudio Arseni <claudio.arseni@gmail.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"
@@ -15,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Telefono"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Fotocamera"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "Galleria"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "Facebook"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "Browser"
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 "Meteo"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Blocco note"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Calendario"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "Riproduttore multimediale"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr "Evernote"
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "Mappa"
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
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -139,30 +71,28 @@ msgstr ""
139"I gesti sui bordi sono stati configurati ed è possibile iniziare a usare il "
71"I gesti sui bordi sono stati configurati ed è possibile iniziare a usare il "
140"telefono<br><br>Toccare in un punto qualunque per iniziare"
72"telefono<br><br>Toccare in un punto qualunque per iniziare"
141
73
142−#: Components/PageHeader.qml:345
74+#: Components/PageHeader.qml:364
143msgid "Recent searches"
75msgid "Recent searches"
144msgstr "Ricerche recenti"
76msgstr "Ricerche recenti"
145
77
146−#. TRANSLATORS: Number of persons who rated this app
78+#: Dash/Apps/AppPreview.qml:135
79+msgid "Rate this"
80+msgstr "Valuta"
81+
147#. TRANSLATORS: Number of persons who rated this app/video/whatever
82#. TRANSLATORS: Number of persons who rated this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
83+#: Dash/Previews/Header.qml:93
149#, qt-format
84#, qt-format
150msgid "(%1)"
85msgid "(%1)"
151msgstr "(%1)"
86msgstr "(%1)"
152
87
153−#. TRANSLATORS: Number of persons who wrote reviews for this app
154#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
88#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
155−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
89+#: Dash/Previews/Header.qml:105
156#, qt-format
90#, qt-format
157msgid "%1 review"
91msgid "%1 review"
158msgid_plural "%1 reviews"
92msgid_plural "%1 reviews"
159msgstr[0] "%1 recensione"
93msgstr[0] "%1 recensione"
160msgstr[1] "%1 recensioni"
94msgstr[1] "%1 recensioni"
161
95
162−#: Dash/Apps/AppPreview.qml:135
163−msgid "Rate this"
164−msgstr "Valuta"
165−
166#: Dash/Previews/Reviews.qml:74
96#: Dash/Previews/Reviews.qml:74
167msgid "Add a review"
97msgid "Add a review"
168msgstr "Aggiungi una recensione"
98msgstr "Aggiungi una recensione"
@@ -179,7 +109,7 @@ msgstr "Invia"
179msgid "Comments:"
109msgid "Comments:"
180msgstr "Commenti:"
110msgstr "Commenti:"
181
111
182−#: Greeter/Lockscreen.qml:146
112+#: Greeter/Lockscreen.qml:149
183msgid "Emergency Call"
113msgid "Emergency Call"
184msgstr "Chiamata di emergenza"
114msgstr "Chiamata di emergenza"
185
115
@@ -229,15 +159,7 @@ msgstr ""
229msgid "Unlock from Launcher"
159msgid "Unlock from Launcher"
230msgstr ""
160msgstr ""
231
161
232−#: plugins/Unity/scope.cpp:408
233−msgid "Sorry, there is nothing that matches your search."
234−msgstr "Nessun risultato corrispondente alla ricerca."
235−
236−#: plugins/Unity/showallfilteroption.cpp:41
237−msgid "All"
238−msgstr "Tutto"
239−
240−#: Shell.qml:441
162+#: Shell.qml:439
241#, qt-format
163#, qt-format
242msgid "Please enter %1"
164msgid "Please enter %1"
243msgstr "Inserire %1"
165msgstr "Inserire %1"
po/ja.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\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,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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 ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
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 ""
88
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr ""
69msgstr ""
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr ""
79msgstr ""
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] ""
86msgstr[0] ""
153msgstr[1] ""
87msgstr[1] ""
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr ""
91msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172msgid "Comments:"
102msgid "Comments:"
173msgstr ""
103msgstr ""
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177msgstr ""
107msgstr ""
178
108
@@ -222,15 +152,7 @@ msgstr ""
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223msgstr ""
153msgstr ""
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr ""
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236msgstr ""
158msgstr ""
po/km.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11"PO-Revision-Date: 2013-11-20 07:34+0000\n"
11"PO-Revision-Date: 2013-11-20 07:34+0000\n"
12"Last-Translator: Khoem Sokhem <khoemsokhem@khmeros.info>\n"
12"Last-Translator: Khoem Sokhem <khoemsokhem@khmeros.info>\n"
13"Language-Team: Khmer <km@li.org>\n"
13"Language-Team: Khmer <km@li.org>\n"
@@ -15,76 +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-11-21 06:43+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -137,29 +69,27 @@ msgstr ""
137"និង​អាច​ចាប់ផ្ដើម​ប្រើ​ទូរស័ព្ទ​បាន<br><br>ប៉ះ​កន្លែង​ណា​មួយ​ "
69"និង​អាច​ចាប់ផ្ដើម​ប្រើ​ទូរស័ព្ទ​បាន<br><br>ប៉ះ​កន្លែង​ណា​មួយ​ "
138"ដើម្បី​ចាប់ផ្ដើម"
70"ដើម្បី​ចាប់ផ្ដើម"
139
71
140−#: Components/PageHeader.qml:345
72+#: Components/PageHeader.qml:364
141msgid "Recent searches"
73msgid "Recent searches"
142msgstr "ការ​ស្វែងរក​ថ្មី"
74msgstr "ការ​ស្វែងរក​ថ្មី"
143
75
144−#. TRANSLATORS: Number of persons who rated this app
76+#: Dash/Apps/AppPreview.qml:135
77+msgid "Rate this"
78+msgstr "វាយតម្លៃ​វា"
79+
145#. TRANSLATORS: Number of persons who rated this app/video/whatever
80#. TRANSLATORS: Number of persons who rated this app/video/whatever
146−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
81+#: Dash/Previews/Header.qml:93
147#, qt-format
82#, qt-format
148msgid "(%1)"
83msgid "(%1)"
149msgstr "(%1)"
84msgstr "(%1)"
150
85
151−#. TRANSLATORS: Number of persons who wrote reviews for this app
152#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
86#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
153−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
87+#: Dash/Previews/Header.qml:105
154#, qt-format
88#, qt-format
155msgid "%1 review"
89msgid "%1 review"
156msgid_plural "%1 reviews"
90msgid_plural "%1 reviews"
157msgstr[0] "ពិនិត្យ​មើល %1"
91msgstr[0] "ពិនិត្យ​មើល %1"
158
92
159−#: Dash/Apps/AppPreview.qml:135
160−msgid "Rate this"
161−msgstr "វាយតម្លៃ​វា"
162−
163#: Dash/Previews/Reviews.qml:74
93#: Dash/Previews/Reviews.qml:74
164msgid "Add a review"
94msgid "Add a review"
165msgstr "បន្ថែម​ការ​ពិនិត្យ"
95msgstr "បន្ថែម​ការ​ពិនិត្យ"
@@ -176,7 +106,7 @@ msgstr "ផ្ញើ"
176msgid "Comments:"
106msgid "Comments:"
177msgstr "មតិយោបល់៖"
107msgstr "មតិយោបល់៖"
178
108
179−#: Greeter/Lockscreen.qml:146
109+#: Greeter/Lockscreen.qml:149
180msgid "Emergency Call"
110msgid "Emergency Call"
181msgstr "ការ​ហៅ​ពេល​អាសន្ន"
111msgstr "ការ​ហៅ​ពេល​អាសន្ន"
182
112
@@ -226,15 +156,7 @@ msgstr "ចាក់​សោ​​ទៅ​កម្មវិធី​ចាប
226msgid "Unlock from Launcher"
156msgid "Unlock from Launcher"
227msgstr "ដោះសោ​ពី​កម្មវិធី​ចាប់ផ្ដើម"
157msgstr "ដោះសោ​ពី​កម្មវិធី​ចាប់ផ្ដើម"
228
158
229−#: plugins/Unity/scope.cpp:408
230−msgid "Sorry, there is nothing that matches your search."
231−msgstr "សូម​ទោស មិនមាន​ពាក្យ​ដែល​អ្នក​ស្វែងរក​ទេ​។"
232−
233−#: plugins/Unity/showallfilteroption.cpp:41
234−msgid "All"
235−msgstr "ទាំង​អស់"
236−
237−#: Shell.qml:441
159+#: Shell.qml:439
238#, qt-format
160#, qt-format
239msgid "Please enter %1"
161msgid "Please enter %1"
240msgstr "សូម​បញ្ចូល %1"
162msgstr "សូម​បញ្ចូល %1"
po/kn.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\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,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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 ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
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 ""
88
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr "ಇತ್ತೀಚಿನ ಹುಡುಕಾಟಗಳು"
69msgstr "ಇತ್ತೀಚಿನ ಹುಡುಕಾಟಗಳು"
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr ""
79msgstr ""
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] ""
86msgstr[0] ""
153msgstr[1] ""
87msgstr[1] ""
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr ""
91msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172msgid "Comments:"
102msgid "Comments:"
173msgstr ""
103msgstr ""
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177msgstr ""
107msgstr ""
178
108
@@ -222,15 +152,7 @@ msgstr ""
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223msgstr ""
153msgstr ""
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "ಕ್ಷಮಿಸಿ ನಿಮ್ಮ ಶೋಧನೆಗೆ ಸರಿಯಾದ ಹೊಂದಾಣಿಕೆಗಳು ದೊರಕುತ್ತಿಲ್ಲ"
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236msgstr ""
158msgstr ""
po/ko.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11"PO-Revision-Date: 2013-10-10 07:04+0000\n"
11"PO-Revision-Date: 2013-10-10 07:04+0000\n"
12"Last-Translator: Kim Boram <boramism@gmail.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"
@@ -15,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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 "페이스북"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "브라우저"
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr "트위터"
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr "지메일"
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "날씨"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "메모장"
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 "유튜브"
88
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr "최근 검색"
69msgstr "최근 검색"
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr ""
79msgstr ""
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] ""
86msgstr[0] ""
153msgstr[1] ""
87msgstr[1] ""
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr ""
91msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172msgid "Comments:"
102msgid "Comments:"
173msgstr ""
103msgstr ""
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177msgstr ""
107msgstr ""
178
108
@@ -222,15 +152,7 @@ msgstr ""
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223msgstr ""
153msgstr ""
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr ""
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236msgstr ""
158msgstr ""
po/ky.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\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,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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 ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
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 ""
88
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr "Соңку издөөлөр"
69msgstr "Соңку издөөлөр"
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr ""
79msgstr ""
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] ""
86msgstr[0] ""
153msgstr[1] ""
87msgstr[1] ""
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr ""
91msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172msgid "Comments:"
102msgid "Comments:"
173msgstr ""
103msgstr ""
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177msgstr ""
107msgstr ""
178
108
@@ -222,15 +152,7 @@ msgstr ""
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223msgstr ""
153msgstr ""
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "Тилекке каршы, сиздин издөөңүзгө эч нерсе дал келген жок."
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236msgstr ""
158msgstr ""
po/lo.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11"PO-Revision-Date: 2013-10-02 10:00+0000\n"
11"PO-Revision-Date: 2013-10-02 10:00+0000\n"
12"Last-Translator: Anousak <anousak@gmail.com>\n"
12"Last-Translator: Anousak <anousak@gmail.com>\n"
13"Language-Team: Lao <lo@li.org>\n"
13"Language-Team: Lao <lo@li.org>\n"
@@ -15,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr ""
69msgstr ""
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr "(%1)"
79msgstr "(%1)"
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] ""
86msgstr[0] ""
153msgstr[1] ""
87msgstr[1] ""
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr ""
91msgstr ""
@@ -172,7 +102,7 @@ msgstr "ສົ່ງ"
172msgid "Comments:"
102msgid "Comments:"
173msgstr "ຄໍ່ເຫັນ"
103msgstr "ຄໍ່ເຫັນ"
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177msgstr ""
107msgstr ""
178
108
@@ -222,15 +152,7 @@ msgstr ""
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223msgstr ""
153msgstr ""
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr ""
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr "ທັງໝົດ"
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236msgstr "ກະລູນາປ້ອນ %1"
158msgstr "ກະລູນາປ້ອນ %1"
po/lv.po+16−94
@@ -7,84 +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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-09-28 16:29+0000\n"
11+"PO-Revision-Date: 2014-01-11 16:48+0000\n"
12"Last-Translator: Jānis-Marks Gailis <jeanmarc.gailis@gmail.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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-01-12 05:52+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16890)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Tālrunis"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Fotokamera"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "Galerija"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "Facebook"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "Pārlūkprogramma"
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 "Laikapstākļi"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Bloknots"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Kalendārs"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "Mēdiju Atskaņotājs"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr ""
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "Karte"
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 "Vikipēdija"
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr "YouTube"
88
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -100,7 +32,7 @@ msgstr ""
100
32
101#: Components/EdgeDemo.qml:144
33#: Components/EdgeDemo.qml:144
102msgid "Top edge"
34msgid "Top edge"
103−msgstr ""
35+msgstr "Augšējā mala"
104
36
105#: Components/EdgeDemo.qml:145
37#: Components/EdgeDemo.qml:145
106msgid "Try swiping from the top edge to access the indicators"
38msgid "Try swiping from the top edge to access the indicators"
@@ -108,7 +40,7 @@ msgstr ""
108
40
109#: Components/EdgeDemo.qml:170
41#: Components/EdgeDemo.qml:170
110msgid "Close"
42msgid "Close"
111−msgstr ""
43+msgstr "Aizvērt"
112
44
113#: Components/EdgeDemo.qml:171
45#: Components/EdgeDemo.qml:171
114msgid "Swipe up again to close the settings screen"
46msgid "Swipe up again to close the settings screen"
@@ -116,7 +48,7 @@ msgstr ""
116
48
117#: Components/EdgeDemo.qml:198
49#: Components/EdgeDemo.qml:198
118msgid "Left edge"
50msgid "Left edge"
119−msgstr ""
51+msgstr "Kreisā mala"
120
52
121#: Components/EdgeDemo.qml:199
53#: Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
54msgid "Swipe from the left to reveal the launcher for quick access to apps"
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr "Nesen veiktās meklēšanas"
69msgstr "Nesen veiktās meklēšanas"
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr ""
79msgstr ""
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] ""
86msgstr[0] ""
153msgstr[1] ""
87msgstr[1] ""
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr ""
91msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172msgid "Comments:"
102msgid "Comments:"
173msgstr ""
103msgstr ""
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177msgstr ""
107msgstr ""
178
108
@@ -222,15 +152,7 @@ msgstr ""
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223msgstr ""
153msgstr ""
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "Diemžēl nekas neatbilst jūsu meklētajam."
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236msgstr ""
158msgstr ""
po/ml.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11"PO-Revision-Date: 2013-11-23 11:44+0000\n"
11"PO-Revision-Date: 2013-11-23 11:44+0000\n"
12"Last-Translator: STyM Alfazz <Unknown>\n"
12"Last-Translator: STyM Alfazz <Unknown>\n"
13"Language-Team: Malayalam <ml@li.org>\n"
13"Language-Team: Malayalam <ml@li.org>\n"
@@ -15,76 +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-11-24 05:50+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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 "ഫേസ്ബുക്ക്"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "ബ്രൗസര്‍"
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr "ട്വിറ്റര്‍"
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr "ജിമെയില്‍"
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "കാലാവസ്ഥ"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "നോട്പാഡ്"
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 "യുട്യൂബ്"
88
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -136,30 +68,28 @@ msgstr ""
136"നിങ്ങളിപ്പോള്‍ സ്വൈപുകളും മറ്റും പഠിച്ചിരിക്കുന്നു<br><br>തുടങ്ങാന്‍ "
68"നിങ്ങളിപ്പോള്‍ സ്വൈപുകളും മറ്റും പഠിച്ചിരിക്കുന്നു<br><br>തുടങ്ങാന്‍ "
137"എവിടെയെങ്കിലും ടാപ് ചെയ്യുക"
69"എവിടെയെങ്കിലും ടാപ് ചെയ്യുക"
138
70
139−#: Components/PageHeader.qml:345
71+#: Components/PageHeader.qml:364
140msgid "Recent searches"
72msgid "Recent searches"
141msgstr "സമീപകാല തിരയലുകള്‍"
73msgstr "സമീപകാല തിരയലുകള്‍"
142
74
143−#. TRANSLATORS: Number of persons who rated this app
75+#: Dash/Apps/AppPreview.qml:135
76+msgid "Rate this"
77+msgstr "ഇത് അവലോകനം ചെയ്യുക"
78+
144#. TRANSLATORS: Number of persons who rated this app/video/whatever
79#. TRANSLATORS: Number of persons who rated this app/video/whatever
145−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
80+#: Dash/Previews/Header.qml:93
146#, qt-format
81#, qt-format
147msgid "(%1)"
82msgid "(%1)"
148msgstr "(%1)"
83msgstr "(%1)"
149
84
150−#. TRANSLATORS: Number of persons who wrote reviews for this app
151#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
85#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
152−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
86+#: Dash/Previews/Header.qml:105
153#, qt-format
87#, qt-format
154msgid "%1 review"
88msgid "%1 review"
155msgid_plural "%1 reviews"
89msgid_plural "%1 reviews"
156msgstr[0] "%1 അവലോകനം"
90msgstr[0] "%1 അവലോകനം"
157msgstr[1] "%1 അവലോകനങ്ങള്‍"
91msgstr[1] "%1 അവലോകനങ്ങള്‍"
158
92
159−#: Dash/Apps/AppPreview.qml:135
160−msgid "Rate this"
161−msgstr "ഇത് അവലോകനം ചെയ്യുക"
162−
163#: Dash/Previews/Reviews.qml:74
93#: Dash/Previews/Reviews.qml:74
164msgid "Add a review"
94msgid "Add a review"
165msgstr "ഒരു അവലോകനം ചേര്‍ക്കുക"
95msgstr "ഒരു അവലോകനം ചേര്‍ക്കുക"
@@ -176,7 +106,7 @@ msgstr "അയയ്‌ക്കുക"
176msgid "Comments:"
106msgid "Comments:"
177msgstr "അഭിപ്രായങ്ങള്‍:"
107msgstr "അഭിപ്രായങ്ങള്‍:"
178
108
179−#: Greeter/Lockscreen.qml:146
109+#: Greeter/Lockscreen.qml:149
180msgid "Emergency Call"
110msgid "Emergency Call"
181msgstr "അടിയന്തിര വിളി"
111msgstr "അടിയന്തിര വിളി"
182
112
@@ -226,15 +156,7 @@ msgstr "വിക്ഷേപികയില്‍ സ്ഥിരപ്പെ
226msgid "Unlock from Launcher"
156msgid "Unlock from Launcher"
227msgstr "വിക്ഷേപികാ സ്ഥിരപ്പെടുത്തല്‍ ഒഴിവാക്കുക"
157msgstr "വിക്ഷേപികാ സ്ഥിരപ്പെടുത്തല്‍ ഒഴിവാക്കുക"
228
158
229−#: plugins/Unity/scope.cpp:408
230−msgid "Sorry, there is nothing that matches your search."
231−msgstr "ക്ഷമിക്കണം, താങ്കളുടെ തിരച്ചിലുമായി ഒത്തുപോകുന്ന ഒന്നും തന്നെയില്ല"
232−
233−#: plugins/Unity/showallfilteroption.cpp:41
234−msgid "All"
235−msgstr "എല്ലാം"
236−
237−#: Shell.qml:441
159+#: Shell.qml:439
238#, qt-format
160#, qt-format
239msgid "Please enter %1"
161msgid "Please enter %1"
240msgstr "ദയവായി %1 നല്‍കുക"
162msgstr "ദയവായി %1 നല്‍കുക"
po/my.po+20−98
@@ -7,84 +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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-10-09 11:35+0000\n"
11+"PO-Revision-Date: 2013-12-12 11:12+0000\n"
12"Last-Translator: Pyae Sone <Unknown>\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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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 "Browser"
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr "Twitter"
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr "ဂျီမေးလ်"
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
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr "မကြာသေးခင်က ရှာဖွေခြင်း"
69msgstr "မကြာသေးခင်က ရှာဖွေခြင်း"
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr "ဒီဟာကိုအမှတ်ပေးမည်"
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr "(%1)"
79msgstr "(%1)"
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] ""
86msgstr[0] ""
153msgstr[1] ""
87msgstr[1] ""
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr "ဒီဟာကိုအမှတ်ပေးမည်"
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr ""
91msgstr ""
@@ -172,18 +102,18 @@ msgstr "ပို့မည်"
172msgid "Comments:"
102msgid "Comments:"
173msgstr "မှတ်ချက်များ-"
103msgstr "မှတ်ချက်များ-"
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177−msgstr ""
107+msgstr "အရေးပေါ်ခေါ်မည်"
178
108
179#: Greeter/PassphraseLockscreen.qml:59
109#: Greeter/PassphraseLockscreen.qml:59
180#, qt-format
110#, qt-format
181msgid "Hello %1"
111msgid "Hello %1"
182−msgstr ""
112+msgstr "ဟဲလို %1"
183
113
184#: Greeter/PassphraseLockscreen.qml:59
114#: Greeter/PassphraseLockscreen.qml:59
185msgid "Hello"
115msgid "Hello"
186−msgstr ""
116+msgstr "ဟဲလို"
187
117
188#: Hud/HudParametrizedActionsPage.qml:132
118#: Hud/HudParametrizedActionsPage.qml:132
189msgid "Confirm"
119msgid "Confirm"
@@ -207,7 +137,7 @@ msgstr "ပြောနေသည်"
207
137
208#: Notifications/NotificationMenuItemFactory.qml:89
138#: Notifications/NotificationMenuItemFactory.qml:89
209msgid "Show password"
139msgid "Show password"
210−msgstr ""
140+msgstr "စကားဝှက်ကိုပြ"
211
141
212#: Panel/SearchIndicator.qml:27
142#: Panel/SearchIndicator.qml:27
213msgid "Search"
143msgid "Search"
@@ -216,21 +146,13 @@ msgstr "ရှာဖွေ"
216#: plugins/Unity/Launcher/launcheritem.cpp:43
146#: plugins/Unity/Launcher/launcheritem.cpp:43
217#: plugins/Unity/Launcher/launcheritem.cpp:73
147#: plugins/Unity/Launcher/launcheritem.cpp:73
218msgid "Lock to Launcher"
148msgid "Lock to Launcher"
219−msgstr ""
149+msgstr "Launcher တွင်ထားမည်"
220
150
221#: plugins/Unity/Launcher/launcheritem.cpp:73
151#: plugins/Unity/Launcher/launcheritem.cpp:73
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223−msgstr ""
153+msgstr "Launcher မှဖြုတ်မည်"
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "ဆောရီး၊ သင်၏ရှာဖွေမူနှင့်တူညီတာဘာမှမရှိပါ။"
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236−msgstr ""
158+msgstr "%1ကိုရိုက်ထည့်ပါ"
po/nb.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11"PO-Revision-Date: 2013-06-27 07:02+0000\n"
11"PO-Revision-Date: 2013-06-27 07:02+0000\n"
12"Last-Translator: Joakim Langvand <jlangvand@gmail.com>\n"
12"Last-Translator: Joakim Langvand <jlangvand@gmail.com>\n"
13"Language-Team: Norwegian Bokmal <nb@li.org>\n"
13"Language-Team: Norwegian Bokmal <nb@li.org>\n"
@@ -15,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Telefon"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Kamera"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr ""
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "Vær"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Notisblokk"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Kalender"
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 ""
88
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr "Siste søk"
69msgstr "Siste søk"
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr ""
79msgstr ""
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] ""
86msgstr[0] ""
153msgstr[1] ""
87msgstr[1] ""
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr ""
91msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172msgid "Comments:"
102msgid "Comments:"
173msgstr ""
103msgstr ""
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177msgstr ""
107msgstr ""
178
108
@@ -222,15 +152,7 @@ msgstr ""
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223msgstr ""
153msgstr ""
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "Søket ga ingen treff."
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236msgstr ""
158msgstr ""
po/nl.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11"PO-Revision-Date: 2013-06-27 07:19+0000\n"
11"PO-Revision-Date: 2013-06-27 07:19+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: Dutch <nl@li.org>\n"
13"Language-Team: Dutch <nl@li.org>\n"
@@ -15,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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 ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
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 ""
88
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr "Recente zoekopdrachten"
69msgstr "Recente zoekopdrachten"
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr ""
79msgstr ""
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] ""
86msgstr[0] ""
153msgstr[1] ""
87msgstr[1] ""
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr ""
91msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172msgid "Comments:"
102msgid "Comments:"
173msgstr ""
103msgstr ""
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177msgstr ""
107msgstr ""
178
108
@@ -222,15 +152,7 @@ msgstr ""
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223msgstr ""
153msgstr ""
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "Er is helaas niets dat met uw zoekopdracht overeenkomt."
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236msgstr ""
158msgstr ""
po/pl.po+17−95
@@ -7,85 +7,17 @@ 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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-10-13 13:44+0000\n"
11+"PO-Revision-Date: 2014-01-10 11:38+0000\n"
12−"Last-Translator: GTriderXC <gtriderxc@yahoo.com>\n"
12+"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Polish <pl@li.org>\n"
13"Language-Team: Polish <pl@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==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
17"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
18"|| n%100>=20) ? 1 : 2;\n"
18"|| n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19+"X-Launchpad-Export-Date: 2014-01-11 06:38+0000\n"
20−"X-Generator: Launchpad (build 16831)\n"
20+"X-Generator: Launchpad (build 16890)\n"
21−
22−#: Applications/applications.js:23
23−msgid "Phone"
24−msgstr "Telefon"
25−
26−#: Applications/applications.js:29
27−msgid "Camera"
28−msgstr "Aparat"
29−
30−#: Applications/applications.js:35
31−msgid "Gallery"
32−msgstr "Galeria"
33−
34−#: Applications/applications.js:40
35−msgid "Facebook"
36−msgstr "Facebook"
37−
38−#: Applications/applications.js:46
39−msgid "Browser"
40−msgstr "Internet"
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 "Pogoda"
53−
54−#: Applications/applications.js:68
55−msgid "Notepad"
56−msgstr "Notatki"
57−
58−#: Applications/applications.js:74
59−msgid "Calendar"
60−msgstr "Kalendarz"
61−
62−#: Applications/applications.js:80
63−msgid "Media Player"
64−msgstr "Odtwarzacz multimediów"
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 "Wikipedia"
85−
86−#: Applications/applications.js:111
87−msgid "YouTube"
88−msgstr "YouTube"
89
21
90#: Components/EdgeDemoOverlay.qml:151
22#: Components/EdgeDemoOverlay.qml:151
91msgid "Skip intro"
23msgid "Skip intro"
@@ -137,20 +69,22 @@ msgstr ""
137"Polecenia aktywatorów krawędzi ekranu zostały opanowane<br><br>Dotknij "
69"Polecenia aktywatorów krawędzi ekranu zostały opanowane<br><br>Dotknij "
138"gdziekolwiek aby kontynuować"
70"gdziekolwiek aby kontynuować"
139
71
140−#: Components/PageHeader.qml:345
72+#: Components/PageHeader.qml:364
141msgid "Recent searches"
73msgid "Recent searches"
142msgstr "Ostatnie wyszukiwania"
74msgstr "Ostatnie wyszukiwania"
143
75
144−#. TRANSLATORS: Number of persons who rated this app
76+#: Dash/Apps/AppPreview.qml:135
77+msgid "Rate this"
78+msgstr "Oceń to"
79+
145#. TRANSLATORS: Number of persons who rated this app/video/whatever
80#. TRANSLATORS: Number of persons who rated this app/video/whatever
146−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
81+#: Dash/Previews/Header.qml:93
147#, qt-format
82#, qt-format
148msgid "(%1)"
83msgid "(%1)"
149msgstr "(%1)"
84msgstr "(%1)"
150
85
151−#. TRANSLATORS: Number of persons who wrote reviews for this app
152#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
86#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
153−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
87+#: Dash/Previews/Header.qml:105
154#, qt-format
88#, qt-format
155msgid "%1 review"
89msgid "%1 review"
156msgid_plural "%1 reviews"
90msgid_plural "%1 reviews"
@@ -158,10 +92,6 @@ msgstr[0] "%1 opinia"
158msgstr[1] "%1 opinie"
92msgstr[1] "%1 opinie"
159msgstr[2] "%1 opinii"
93msgstr[2] "%1 opinii"
160
94
161−#: Dash/Apps/AppPreview.qml:135
162−msgid "Rate this"
163−msgstr "Oceń to"
164−
165#: Dash/Previews/Reviews.qml:74
95#: Dash/Previews/Reviews.qml:74
166msgid "Add a review"
96msgid "Add a review"
167msgstr "Dodaj recenzję"
97msgstr "Dodaj recenzję"
@@ -178,7 +108,7 @@ msgstr "Wyślij"
178msgid "Comments:"
108msgid "Comments:"
179msgstr "Komentarze:"
109msgstr "Komentarze:"
180
110
181−#: Greeter/Lockscreen.qml:146
111+#: Greeter/Lockscreen.qml:149
182msgid "Emergency Call"
112msgid "Emergency Call"
183msgstr "Telefon ratunkowy"
113msgstr "Telefon ratunkowy"
184
114
@@ -213,7 +143,7 @@ msgstr "Rozpoznanie..."
213
143
214#: Notifications/NotificationMenuItemFactory.qml:89
144#: Notifications/NotificationMenuItemFactory.qml:89
215msgid "Show password"
145msgid "Show password"
216−msgstr ""
146+msgstr "Wyświetl hasło"
217
147
218#: Panel/SearchIndicator.qml:27
148#: Panel/SearchIndicator.qml:27
219msgid "Search"
149msgid "Search"
@@ -222,21 +152,13 @@ msgstr "Szukaj"
222#: plugins/Unity/Launcher/launcheritem.cpp:43
152#: plugins/Unity/Launcher/launcheritem.cpp:43
223#: plugins/Unity/Launcher/launcheritem.cpp:73
153#: plugins/Unity/Launcher/launcheritem.cpp:73
224msgid "Lock to Launcher"
154msgid "Lock to Launcher"
225−msgstr ""
155+msgstr "Dodaj do panelu uruchamiania"
226
156
227#: plugins/Unity/Launcher/launcheritem.cpp:73
157#: plugins/Unity/Launcher/launcheritem.cpp:73
228msgid "Unlock from Launcher"
158msgid "Unlock from Launcher"
229−msgstr ""
159+msgstr "Usuń z panelu uruchamiania"
230−
231−#: plugins/Unity/scope.cpp:408
232−msgid "Sorry, there is nothing that matches your search."
233−msgstr "Nie znaleziono pasujących wyników."
234−
235−#: plugins/Unity/showallfilteroption.cpp:41
236−msgid "All"
237−msgstr "Wszystko"
238
160
239−#: Shell.qml:441
161+#: Shell.qml:439
240#, qt-format
162#, qt-format
241msgid "Please enter %1"
163msgid "Please enter %1"
242msgstr "Wprowadź %1"
164msgstr "Wprowadź %1"
po/pt_BR.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11"PO-Revision-Date: 2013-10-01 13:05+0000\n"
11"PO-Revision-Date: 2013-10-01 13:05+0000\n"
12"Last-Translator: Rafael Neri <Unknown>\n"
12"Last-Translator: Rafael Neri <Unknown>\n"
13"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
13"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
@@ -15,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Telefone"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Câmera"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "Galeria"
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 "Clima"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Bloco de notas"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Calendário"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "Media Player"
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 "SoundCloud"
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr "Wikipédia"
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr "YouTube"
88
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -134,30 +66,28 @@ msgid ""
134"phone<br><br>Tap anywhere to start"
66"phone<br><br>Tap anywhere to start"
135msgstr ""
67msgstr ""
136
68
137−#: Components/PageHeader.qml:345
69+#: Components/PageHeader.qml:364
138msgid "Recent searches"
70msgid "Recent searches"
139msgstr "Pesquisas recentes"
71msgstr "Pesquisas recentes"
140
72
141−#. TRANSLATORS: Number of persons who rated this app
73+#: Dash/Apps/AppPreview.qml:135
74+msgid "Rate this"
75+msgstr "Avaliar isto"
76+
142#. TRANSLATORS: Number of persons who rated this app/video/whatever
77#. TRANSLATORS: Number of persons who rated this app/video/whatever
143−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
78+#: Dash/Previews/Header.qml:93
144#, qt-format
79#, qt-format
145msgid "(%1)"
80msgid "(%1)"
146msgstr "(%1)"
81msgstr "(%1)"
147
82
148−#. TRANSLATORS: Number of persons who wrote reviews for this app
149#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
83#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
150−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
84+#: Dash/Previews/Header.qml:105
151#, qt-format
85#, qt-format
152msgid "%1 review"
86msgid "%1 review"
153msgid_plural "%1 reviews"
87msgid_plural "%1 reviews"
154msgstr[0] "%1 análise"
88msgstr[0] "%1 análise"
155msgstr[1] "%1 análises"
89msgstr[1] "%1 análises"
156
90
157−#: Dash/Apps/AppPreview.qml:135
158−msgid "Rate this"
159−msgstr "Avaliar isto"
160−
161#: Dash/Previews/Reviews.qml:74
91#: Dash/Previews/Reviews.qml:74
162msgid "Add a review"
92msgid "Add a review"
163msgstr "Adicionar uma análise"
93msgstr "Adicionar uma análise"
@@ -174,7 +104,7 @@ msgstr "Enviar"
174msgid "Comments:"
104msgid "Comments:"
175msgstr "Comentários:"
105msgstr "Comentários:"
176
106
177−#: Greeter/Lockscreen.qml:146
107+#: Greeter/Lockscreen.qml:149
178msgid "Emergency Call"
108msgid "Emergency Call"
179msgstr "Chamada de emergência"
109msgstr "Chamada de emergência"
180
110
@@ -224,15 +154,7 @@ msgstr ""
224msgid "Unlock from Launcher"
154msgid "Unlock from Launcher"
225msgstr ""
155msgstr ""
226
156
227−#: plugins/Unity/scope.cpp:408
228−msgid "Sorry, there is nothing that matches your search."
229−msgstr "Desculpe, não há nada que corresponda à sua pesquisa."
230−
231−#: plugins/Unity/showallfilteroption.cpp:41
232−msgid "All"
233−msgstr ""
234−
235−#: Shell.qml:441
157+#: Shell.qml:439
236#, qt-format
158#, qt-format
237msgid "Please enter %1"
159msgid "Please enter %1"
238msgstr "Por favor, digite %1"
160msgstr "Por favor, digite %1"
po/ro.po+12−91
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11"PO-Revision-Date: 2013-06-27 07:53+0000\n"
11"PO-Revision-Date: 2013-06-27 07: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: Romanian <ro@li.org>\n"
13"Language-Team: Romanian <ro@li.org>\n"
@@ -16,76 +16,8 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 "
17"Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 "
18"== 0) && (n != 0))) ? 2: 1));\n"
18"== 0) && (n != 0))) ? 2: 1));\n"
19−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
20−"X-Generator: Launchpad (build 16831)\n"
20+"X-Generator: Launchpad (build 16877)\n"
21−
22−#: Applications/applications.js:23
23−msgid "Phone"
24−msgstr ""
25−
26−#: Applications/applications.js:29
27−msgid "Camera"
28−msgstr ""
29−
30−#: Applications/applications.js:35
31−msgid "Gallery"
32−msgstr ""
33−
34−#: Applications/applications.js:40
35−msgid "Facebook"
36−msgstr ""
37−
38−#: Applications/applications.js:46
39−msgid "Browser"
40−msgstr ""
41−
42−#: Applications/applications.js:51
43−msgid "Twitter"
44−msgstr ""
45−
46−#: Applications/applications.js:57
47−msgid "GMail"
48−msgstr ""
49−
50−#: Applications/applications.js:62
51−msgid "Weather"
52−msgstr ""
53−
54−#: Applications/applications.js:68
55−msgid "Notepad"
56−msgstr ""
57−
58−#: Applications/applications.js:74
59−msgid "Calendar"
60−msgstr ""
61−
62−#: Applications/applications.js:80
63−msgid "Media Player"
64−msgstr ""
65−
66−#: Applications/applications.js:86
67−msgid "Evernote"
68−msgstr ""
69−
70−#: Applications/applications.js:91
71−msgid "Map"
72−msgstr ""
73−
74−#: Applications/applications.js:96
75−msgid "Pinterest"
76−msgstr ""
77−
78−#: Applications/applications.js:101
79−msgid "SoundCloud"
80−msgstr ""
81−
82−#: Applications/applications.js:106
83−msgid "Wikipedia"
84−msgstr ""
85−
86−#: Applications/applications.js:111
87−msgid "YouTube"
88−msgstr ""
89
21
90#: Components/EdgeDemoOverlay.qml:151
22#: Components/EdgeDemoOverlay.qml:151
91msgid "Skip intro"
23msgid "Skip intro"
@@ -133,30 +65,28 @@ msgid ""
133"phone<br><br>Tap anywhere to start"
65"phone<br><br>Tap anywhere to start"
134msgstr ""
66msgstr ""
135
67
136−#: Components/PageHeader.qml:345
68+#: Components/PageHeader.qml:364
137msgid "Recent searches"
69msgid "Recent searches"
138msgstr "Căutări recente"
70msgstr "Căutări recente"
139
71
140−#. TRANSLATORS: Number of persons who rated this app
72+#: Dash/Apps/AppPreview.qml:135
73+msgid "Rate this"
74+msgstr ""
75+
141#. TRANSLATORS: Number of persons who rated this app/video/whatever
76#. TRANSLATORS: Number of persons who rated this app/video/whatever
142−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
77+#: Dash/Previews/Header.qml:93
143#, qt-format
78#, qt-format
144msgid "(%1)"
79msgid "(%1)"
145msgstr ""
80msgstr ""
146
81
147−#. TRANSLATORS: Number of persons who wrote reviews for this app
148#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
82#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
149−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
83+#: Dash/Previews/Header.qml:105
150#, qt-format
84#, qt-format
151msgid "%1 review"
85msgid "%1 review"
152msgid_plural "%1 reviews"
86msgid_plural "%1 reviews"
153msgstr[0] ""
87msgstr[0] ""
154msgstr[1] ""
88msgstr[1] ""
155
89
156−#: Dash/Apps/AppPreview.qml:135
157−msgid "Rate this"
158−msgstr ""
159−
160#: Dash/Previews/Reviews.qml:74
90#: Dash/Previews/Reviews.qml:74
161msgid "Add a review"
91msgid "Add a review"
162msgstr ""
92msgstr ""
@@ -173,7 +103,7 @@ msgstr ""
173msgid "Comments:"
103msgid "Comments:"
174msgstr ""
104msgstr ""
175
105
176−#: Greeter/Lockscreen.qml:146
106+#: Greeter/Lockscreen.qml:149
177msgid "Emergency Call"
107msgid "Emergency Call"
178msgstr ""
108msgstr ""
179
109
@@ -223,16 +153,7 @@ msgstr ""
223msgid "Unlock from Launcher"
153msgid "Unlock from Launcher"
224msgstr ""
154msgstr ""
225
155
226−#: plugins/Unity/scope.cpp:408
227−msgid "Sorry, there is nothing that matches your search."
228−msgstr ""
229−"Ne pare rău, nu este nimic care se potrivește căutării dumneavoastră."
230−
231−#: plugins/Unity/showallfilteroption.cpp:41
232−msgid "All"
233−msgstr ""
234−
235−#: Shell.qml:441
156+#: Shell.qml:439
236#, qt-format
157#, qt-format
237msgid "Please enter %1"
158msgid "Please enter %1"
238msgstr ""
159msgstr ""
po/ru.po+19−96
@@ -7,85 +7,17 @@ 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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-10-01 05:55+0000\n"
11+"PO-Revision-Date: 2014-01-07 05:21+0000\n"
12−"Last-Translator: Zonov Roman <Unknown>\n"
12+"Last-Translator: Ivlev Denis <Unknown>\n"
13"Language-Team: Russian <ru@li.org>\n"
13"Language-Team: Russian <ru@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%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-11-19 05:59+0000\n"
19+"X-Launchpad-Export-Date: 2014-01-08 05:43+0000\n"
20−"X-Generator: Launchpad (build 16831)\n"
20+"X-Generator: Launchpad (build 16877)\n"
21−
22−#: Applications/applications.js:23
23−msgid "Phone"
24−msgstr "Телефон"
25−
26−#: Applications/applications.js:29
27−msgid "Camera"
28−msgstr "Камера"
29−
30−#: Applications/applications.js:35
31−msgid "Gallery"
32−msgstr "Галерея"
33−
34−#: Applications/applications.js:40
35−msgid "Facebook"
36−msgstr "Facebook"
37−
38−#: Applications/applications.js:46
39−msgid "Browser"
40−msgstr "Обозреватель"
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 "Погода"
53−
54−#: Applications/applications.js:68
55−msgid "Notepad"
56−msgstr "Блокнот"
57−
58−#: Applications/applications.js:74
59−msgid "Calendar"
60−msgstr "Календарь"
61−
62−#: Applications/applications.js:80
63−msgid "Media Player"
64−msgstr "Медиапроигрыватель"
65−
66−#: Applications/applications.js:86
67−msgid "Evernote"
68−msgstr "Evernote"
69−
70−#: Applications/applications.js:91
71−msgid "Map"
72−msgstr "Карты"
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 "Википедия"
85−
86−#: Applications/applications.js:111
87−msgid "YouTube"
88−msgstr "YouTube"
89
21
90#: Components/EdgeDemoOverlay.qml:151
22#: Components/EdgeDemoOverlay.qml:151
91msgid "Skip intro"
23msgid "Skip intro"
@@ -138,28 +70,27 @@ msgid ""
138"phone<br><br>Tap anywhere to start"
70"phone<br><br>Tap anywhere to start"
139msgstr ""
71msgstr ""
140
72
141−#: Components/PageHeader.qml:345
73+#: Components/PageHeader.qml:364
142msgid "Recent searches"
74msgid "Recent searches"
143msgstr "Последние поисковые запросы"
75msgstr "Последние поисковые запросы"
144
76
145−#. TRANSLATORS: Number of persons who rated this app
77+#: Dash/Apps/AppPreview.qml:135
78+msgid "Rate this"
79+msgstr "Оцените это"
80+
146#. TRANSLATORS: Number of persons who rated this app/video/whatever
81#. TRANSLATORS: Number of persons who rated this app/video/whatever
147−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
82+#: Dash/Previews/Header.qml:93
148#, qt-format
83#, qt-format
149msgid "(%1)"
84msgid "(%1)"
150msgstr "(%1)"
85msgstr "(%1)"
151
86
152−#. TRANSLATORS: Number of persons who wrote reviews for this app
153#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
87#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
154−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
88+#: Dash/Previews/Header.qml:105
155#, qt-format
89#, qt-format
156msgid "%1 review"
90msgid "%1 review"
157msgid_plural "%1 reviews"
91msgid_plural "%1 reviews"
158−msgstr[0] "%1 отзыв"
92+msgstr[0] "%1 отзыва"
159−
93+msgstr[1] "%1 отзывов"
160−#: Dash/Apps/AppPreview.qml:135
161−msgid "Rate this"
162−msgstr "Оцените это"
163
94
164#: Dash/Previews/Reviews.qml:74
95#: Dash/Previews/Reviews.qml:74
165msgid "Add a review"
96msgid "Add a review"
@@ -177,7 +108,7 @@ msgstr "Отправить"
177msgid "Comments:"
108msgid "Comments:"
178msgstr "Комментарии:"
109msgstr "Комментарии:"
179
110
180−#: Greeter/Lockscreen.qml:146
111+#: Greeter/Lockscreen.qml:149
181msgid "Emergency Call"
112msgid "Emergency Call"
182msgstr "Экстренный вызов"
113msgstr "Экстренный вызов"
183
114
@@ -212,7 +143,7 @@ msgstr "Говорите..."
212
143
213#: Notifications/NotificationMenuItemFactory.qml:89
144#: Notifications/NotificationMenuItemFactory.qml:89
214msgid "Show password"
145msgid "Show password"
215−msgstr ""
146+msgstr "Показать пароль"
216
147
217#: Panel/SearchIndicator.qml:27
148#: Panel/SearchIndicator.qml:27
218msgid "Search"
149msgid "Search"
@@ -221,21 +152,13 @@ msgstr "Поиск"
221#: plugins/Unity/Launcher/launcheritem.cpp:43
152#: plugins/Unity/Launcher/launcheritem.cpp:43
222#: plugins/Unity/Launcher/launcheritem.cpp:73
153#: plugins/Unity/Launcher/launcheritem.cpp:73
223msgid "Lock to Launcher"
154msgid "Lock to Launcher"
224−msgstr ""
155+msgstr "Закрепить на панели"
225
156
226#: plugins/Unity/Launcher/launcheritem.cpp:73
157#: plugins/Unity/Launcher/launcheritem.cpp:73
227msgid "Unlock from Launcher"
158msgid "Unlock from Launcher"
228−msgstr ""
159+msgstr "Убрать с панели"
229−
230−#: plugins/Unity/scope.cpp:408
231−msgid "Sorry, there is nothing that matches your search."
232−msgstr "Извините, поиск не дал результатов."
233−
234−#: plugins/Unity/showallfilteroption.cpp:41
235−msgid "All"
236−msgstr ""
237
160
238−#: Shell.qml:441
161+#: Shell.qml:439
239#, qt-format
162#, qt-format
240msgid "Please enter %1"
163msgid "Please enter %1"
241msgstr "Пожалуйста, введите %1"
164msgstr "Пожалуйста, введите %1"
po/shn.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11"PO-Revision-Date: 2013-10-07 11:46+0000\n"
11"PO-Revision-Date: 2013-10-07 11:46+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Shan <shn@li.org>\n"
13"Language-Team: Shan <shn@li.org>\n"
@@ -15,76 +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) ? 0 : 1;\n"
17"Plural-Forms: nplurals=2; plural=(n == 1) ? 0 : 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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 ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
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 ""
88
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr ""
69msgstr ""
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr ""
79msgstr ""
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] ""
86msgstr[0] ""
153msgstr[1] ""
87msgstr[1] ""
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr ""
91msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172msgid "Comments:"
102msgid "Comments:"
173msgstr ""
103msgstr ""
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177msgstr ""
107msgstr ""
178
108
@@ -222,15 +152,7 @@ msgstr ""
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223msgstr ""
153msgstr ""
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr ""
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236msgstr ""
158msgstr ""
po/si.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\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: Sinhalese <si@li.org>\n"
13"Language-Team: Sinhalese <si@li.org>\n"
@@ -15,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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 ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
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 ""
88
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr ""
69msgstr ""
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr ""
79msgstr ""
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] ""
86msgstr[0] ""
153msgstr[1] ""
87msgstr[1] ""
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr ""
91msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172msgid "Comments:"
102msgid "Comments:"
173msgstr ""
103msgstr ""
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177msgstr ""
107msgstr ""
178
108
@@ -222,15 +152,7 @@ msgstr ""
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223msgstr ""
153msgstr ""
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr ""
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236msgstr ""
158msgstr ""
po/sl.po+16−94
@@ -7,8 +7,8 @@ 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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-10-02 10:55+0000\n"
11+"PO-Revision-Date: 2013-11-30 08:20+0000\n"
12"Last-Translator: Damir Jerovšek <Unknown>\n"
12"Last-Translator: Damir Jerovšek <Unknown>\n"
13"Language-Team: Slovenian <sl@li.org>\n"
13"Language-Team: Slovenian <sl@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
@@ -16,76 +16,8 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
17"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
18"n%100==4 ? 3 : 0);\n"
18"n%100==4 ? 3 : 0);\n"
19−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
20−"X-Generator: Launchpad (build 16831)\n"
20+"X-Generator: Launchpad (build 16877)\n"
21−
22−#: Applications/applications.js:23
23−msgid "Phone"
24−msgstr "Telefon"
25−
26−#: Applications/applications.js:29
27−msgid "Camera"
28−msgstr "Fotoaparat"
29−
30−#: Applications/applications.js:35
31−msgid "Gallery"
32−msgstr "Galerija"
33−
34−#: Applications/applications.js:40
35−msgid "Facebook"
36−msgstr "Facebook"
37−
38−#: Applications/applications.js:46
39−msgid "Browser"
40−msgstr "Brskalnik"
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 "Vreme"
53−
54−#: Applications/applications.js:68
55−msgid "Notepad"
56−msgstr "Beležnica"
57−
58−#: Applications/applications.js:74
59−msgid "Calendar"
60−msgstr "Koledar"
61−
62−#: Applications/applications.js:80
63−msgid "Media Player"
64−msgstr "Predvajalnik predstavnosti"
65−
66−#: Applications/applications.js:86
67−msgid "Evernote"
68−msgstr "Evernote"
69−
70−#: Applications/applications.js:91
71−msgid "Map"
72−msgstr "Zemljevid"
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 "Wikipedija"
85−
86−#: Applications/applications.js:111
87−msgid "YouTube"
88−msgstr "YouTube"
89
21
90#: Components/EdgeDemoOverlay.qml:151
22#: Components/EdgeDemoOverlay.qml:151
91msgid "Skip intro"
23msgid "Skip intro"
@@ -137,20 +69,22 @@ msgstr ""
137"Sedaj ste osvojili poteze robov ter lahko začnete uporabljati "
69"Sedaj ste osvojili poteze robov ter lahko začnete uporabljati "
138"telefon<br><br>Tapnite kjerkoli na začetek"
70"telefon<br><br>Tapnite kjerkoli na začetek"
139
71
140−#: Components/PageHeader.qml:345
72+#: Components/PageHeader.qml:364
141msgid "Recent searches"
73msgid "Recent searches"
142msgstr "Nedavna iskanja"
74msgstr "Nedavna iskanja"
143
75
144−#. TRANSLATORS: Number of persons who rated this app
76+#: Dash/Apps/AppPreview.qml:135
77+msgid "Rate this"
78+msgstr "Ocenite"
79+
145#. TRANSLATORS: Number of persons who rated this app/video/whatever
80#. TRANSLATORS: Number of persons who rated this app/video/whatever
146−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
81+#: Dash/Previews/Header.qml:93
147#, qt-format
82#, qt-format
148msgid "(%1)"
83msgid "(%1)"
149msgstr "(%1)"
84msgstr "(%1)"
150
85
151−#. TRANSLATORS: Number of persons who wrote reviews for this app
152#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
86#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
153−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
87+#: Dash/Previews/Header.qml:105
154#, qt-format
88#, qt-format
155msgid "%1 review"
89msgid "%1 review"
156msgid_plural "%1 reviews"
90msgid_plural "%1 reviews"
@@ -159,10 +93,6 @@ msgstr[1] "%1 ocena"
159msgstr[2] "%1 oceni"
93msgstr[2] "%1 oceni"
160msgstr[3] "%1 ocene"
94msgstr[3] "%1 ocene"
161
95
162−#: Dash/Apps/AppPreview.qml:135
163−msgid "Rate this"
164−msgstr "Ocenite"
165−
166#: Dash/Previews/Reviews.qml:74
96#: Dash/Previews/Reviews.qml:74
167msgid "Add a review"
97msgid "Add a review"
168msgstr "Dodaj oceno"
98msgstr "Dodaj oceno"
@@ -179,7 +109,7 @@ msgstr "Pošlji"
179msgid "Comments:"
109msgid "Comments:"
180msgstr "Opombe:"
110msgstr "Opombe:"
181
111
182−#: Greeter/Lockscreen.qml:146
112+#: Greeter/Lockscreen.qml:149
183msgid "Emergency Call"
113msgid "Emergency Call"
184msgstr "Klic v sili"
114msgstr "Klic v sili"
185
115
@@ -214,7 +144,7 @@ msgstr "Govorjenje ..."
214
144
215#: Notifications/NotificationMenuItemFactory.qml:89
145#: Notifications/NotificationMenuItemFactory.qml:89
216msgid "Show password"
146msgid "Show password"
217−msgstr ""
147+msgstr "Pokaži geslo"
218
148
219#: Panel/SearchIndicator.qml:27
149#: Panel/SearchIndicator.qml:27
220msgid "Search"
150msgid "Search"
@@ -223,21 +153,13 @@ msgstr "Iskanje"
223#: plugins/Unity/Launcher/launcheritem.cpp:43
153#: plugins/Unity/Launcher/launcheritem.cpp:43
224#: plugins/Unity/Launcher/launcheritem.cpp:73
154#: plugins/Unity/Launcher/launcheritem.cpp:73
225msgid "Lock to Launcher"
155msgid "Lock to Launcher"
226−msgstr ""
156+msgstr "Zakleni na zaganjalnik"
227
157
228#: plugins/Unity/Launcher/launcheritem.cpp:73
158#: plugins/Unity/Launcher/launcheritem.cpp:73
229msgid "Unlock from Launcher"
159msgid "Unlock from Launcher"
230−msgstr ""
160+msgstr "Odkleni z zaganjalnika"
231−
232−#: plugins/Unity/scope.cpp:408
233−msgid "Sorry, there is nothing that matches your search."
234−msgstr "Nič se ne ujema z vašim iskalnim nizom."
235−
236−#: plugins/Unity/showallfilteroption.cpp:41
237−msgid "All"
238−msgstr "Vse"
239
161
240−#: Shell.qml:441
162+#: Shell.qml:439
241#, qt-format
163#, qt-format
242msgid "Please enter %1"
164msgid "Please enter %1"
243msgstr "Vnesite %1"
165msgstr "Vnesite %1"
po/sr.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11"PO-Revision-Date: 2013-06-27 09:19+0000\n"
11"PO-Revision-Date: 2013-06-27 09:19+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: Serbian <sr@li.org>\n"
13"Language-Team: Serbian <sr@li.org>\n"
@@ -16,76 +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-11-19 05:59+0000\n"
19+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
20−"X-Generator: Launchpad (build 16831)\n"
20+"X-Generator: Launchpad (build 16877)\n"
21−
22−#: Applications/applications.js:23
23−msgid "Phone"
24−msgstr ""
25−
26−#: Applications/applications.js:29
27−msgid "Camera"
28−msgstr ""
29−
30−#: Applications/applications.js:35
31−msgid "Gallery"
32−msgstr ""
33−
34−#: Applications/applications.js:40
35−msgid "Facebook"
36−msgstr ""
37−
38−#: Applications/applications.js:46
39−msgid "Browser"
40−msgstr ""
41−
42−#: Applications/applications.js:51
43−msgid "Twitter"
44−msgstr ""
45−
46−#: Applications/applications.js:57
47−msgid "GMail"
48−msgstr ""
49−
50−#: Applications/applications.js:62
51−msgid "Weather"
52−msgstr ""
53−
54−#: Applications/applications.js:68
55−msgid "Notepad"
56−msgstr ""
57−
58−#: Applications/applications.js:74
59−msgid "Calendar"
60−msgstr ""
61−
62−#: Applications/applications.js:80
63−msgid "Media Player"
64−msgstr ""
65−
66−#: Applications/applications.js:86
67−msgid "Evernote"
68−msgstr ""
69−
70−#: Applications/applications.js:91
71−msgid "Map"
72−msgstr ""
73−
74−#: Applications/applications.js:96
75−msgid "Pinterest"
76−msgstr ""
77−
78−#: Applications/applications.js:101
79−msgid "SoundCloud"
80−msgstr ""
81−
82−#: Applications/applications.js:106
83−msgid "Wikipedia"
84−msgstr ""
85−
86−#: Applications/applications.js:111
87−msgid "YouTube"
88−msgstr ""
89
21
90#: Components/EdgeDemoOverlay.qml:151
22#: Components/EdgeDemoOverlay.qml:151
91msgid "Skip intro"
23msgid "Skip intro"
@@ -133,30 +65,28 @@ msgid ""
133"phone<br><br>Tap anywhere to start"
65"phone<br><br>Tap anywhere to start"
134msgstr ""
66msgstr ""
135
67
136−#: Components/PageHeader.qml:345
68+#: Components/PageHeader.qml:364
137msgid "Recent searches"
69msgid "Recent searches"
138msgstr "Скорашње претраге"
70msgstr "Скорашње претраге"
139
71
140−#. TRANSLATORS: Number of persons who rated this app
72+#: Dash/Apps/AppPreview.qml:135
73+msgid "Rate this"
74+msgstr ""
75+
141#. TRANSLATORS: Number of persons who rated this app/video/whatever
76#. TRANSLATORS: Number of persons who rated this app/video/whatever
142−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
77+#: Dash/Previews/Header.qml:93
143#, qt-format
78#, qt-format
144msgid "(%1)"
79msgid "(%1)"
145msgstr ""
80msgstr ""
146
81
147−#. TRANSLATORS: Number of persons who wrote reviews for this app
148#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
82#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
149−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
83+#: Dash/Previews/Header.qml:105
150#, qt-format
84#, qt-format
151msgid "%1 review"
85msgid "%1 review"
152msgid_plural "%1 reviews"
86msgid_plural "%1 reviews"
153msgstr[0] ""
87msgstr[0] ""
154msgstr[1] ""
88msgstr[1] ""
155
89
156−#: Dash/Apps/AppPreview.qml:135
157−msgid "Rate this"
158−msgstr ""
159−
160#: Dash/Previews/Reviews.qml:74
90#: Dash/Previews/Reviews.qml:74
161msgid "Add a review"
91msgid "Add a review"
162msgstr ""
92msgstr ""
@@ -173,7 +103,7 @@ msgstr ""
173msgid "Comments:"
103msgid "Comments:"
174msgstr ""
104msgstr ""
175
105
176−#: Greeter/Lockscreen.qml:146
106+#: Greeter/Lockscreen.qml:149
177msgid "Emergency Call"
107msgid "Emergency Call"
178msgstr ""
108msgstr ""
179
109
@@ -223,15 +153,7 @@ msgstr ""
223msgid "Unlock from Launcher"
153msgid "Unlock from Launcher"
224msgstr ""
154msgstr ""
225
155
226−#: plugins/Unity/scope.cpp:408
227−msgid "Sorry, there is nothing that matches your search."
228−msgstr "Нажалост, претрага није наишла на икакво подударање."
229−
230−#: plugins/Unity/showallfilteroption.cpp:41
231−msgid "All"
232−msgstr ""
233−
234−#: Shell.qml:441
156+#: Shell.qml:439
235#, qt-format
157#, qt-format
236msgid "Please enter %1"
158msgid "Please enter %1"
237msgstr ""
159msgstr ""
po/sv.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\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: Swedish <sv@li.org>\n"
13"Language-Team: Swedish <sv@li.org>\n"
@@ -15,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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 ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
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 ""
88
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr ""
69msgstr ""
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr ""
79msgstr ""
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] ""
86msgstr[0] ""
153msgstr[1] ""
87msgstr[1] ""
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr ""
91msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172msgid "Comments:"
102msgid "Comments:"
173msgstr ""
103msgstr ""
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177msgstr ""
107msgstr ""
178
108
@@ -222,15 +152,7 @@ msgstr ""
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223msgstr ""
153msgstr ""
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr ""
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236msgstr ""
158msgstr ""
po/ta.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11"PO-Revision-Date: 2013-10-24 11:36+0000\n"
11"PO-Revision-Date: 2013-10-24 11:36+0000\n"
12"Last-Translator: Thangamani Arun - தங்கமணி அருண் <thangam.arunx@gmail.com>\n"
12"Last-Translator: Thangamani Arun - தங்கமணி அருண் <thangam.arunx@gmail.com>\n"
13"Language-Team: Ubuntu Tamil Team/Free Tamil Computing/Thamizha\n"
13"Language-Team: Ubuntu Tamil Team/Free Tamil Computing/Thamizha\n"
@@ -15,78 +15,10 @@ 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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\n"
20"Language: ta\n"
20"Language: ta\n"
21
21
22−#: Applications/applications.js:23
23−msgid "Phone"
24−msgstr "தொலைபேசி"
25−
26−#: Applications/applications.js:29
27−msgid "Camera"
28−msgstr "புகைப்பட கருவி"
29−
30−#: Applications/applications.js:35
31−msgid "Gallery"
32−msgstr "படத்தொகுப்பு"
33−
34−#: Applications/applications.js:40
35−msgid "Facebook"
36−msgstr "முகநுல்"
37−
38−#: Applications/applications.js:46
39−msgid "Browser"
40−msgstr "உலாவி"
41−
42−#: Applications/applications.js:51
43−msgid "Twitter"
44−msgstr "ட்விட்டர்"
45−
46−#: Applications/applications.js:57
47−msgid "GMail"
48−msgstr "ஜிமெயில்"
49−
50−#: Applications/applications.js:62
51−msgid "Weather"
52−msgstr "வானிலை"
53−
54−#: Applications/applications.js:68
55−msgid "Notepad"
56−msgstr "குறிப்புபலகை"
57−
58−#: Applications/applications.js:74
59−msgid "Calendar"
60−msgstr "நாள்காட்டி"
61−
62−#: Applications/applications.js:80
63−msgid "Media Player"
64−msgstr "ஊடக இயக்கி"
65−
66−#: Applications/applications.js:86
67−msgid "Evernote"
68−msgstr "எப்போதும்குறிப்பெடு"
69−
70−#: Applications/applications.js:91
71−msgid "Map"
72−msgstr "வரைபடம்"
73−
74−#: Applications/applications.js:96
75−msgid "Pinterest"
76−msgstr "விசைத்தட்டு"
77−
78−#: Applications/applications.js:101
79−msgid "SoundCloud"
80−msgstr "ஒலி கிளவுட்"
81−
82−#: Applications/applications.js:106
83−msgid "Wikipedia"
84−msgstr "விக்கிப்பீடியா"
85−
86−#: Applications/applications.js:111
87−msgid "YouTube"
88−msgstr "யூட்யுப்"
89−
90#: Components/EdgeDemoOverlay.qml:151
22#: Components/EdgeDemoOverlay.qml:151
91msgid "Skip intro"
23msgid "Skip intro"
92msgstr "அறிமுகத்தை தவிர்"
24msgstr "அறிமுகத்தை தவிர்"
@@ -138,30 +70,28 @@ msgstr ""
138"பயன்படுத்த தொடங்கவும் <br> <br>தட்டுவதன் மூலம் எங்க வேண்டுமானாலும் "
70"பயன்படுத்த தொடங்கவும் <br> <br>தட்டுவதன் மூலம் எங்க வேண்டுமானாலும் "
139"தொடங்கலாம்."
71"தொடங்கலாம்."
140
72
141−#: Components/PageHeader.qml:345
73+#: Components/PageHeader.qml:364
142msgid "Recent searches"
74msgid "Recent searches"
143msgstr "கடையாக தேடப்பட்டவைகள்"
75msgstr "கடையாக தேடப்பட்டவைகள்"
144
76
145−#. TRANSLATORS: Number of persons who rated this app
77+#: Dash/Apps/AppPreview.qml:135
78+msgid "Rate this"
79+msgstr "இதை மதிப்பிடு"
80+
146#. TRANSLATORS: Number of persons who rated this app/video/whatever
81#. TRANSLATORS: Number of persons who rated this app/video/whatever
147−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
82+#: Dash/Previews/Header.qml:93
148#, qt-format
83#, qt-format
149msgid "(%1)"
84msgid "(%1)"
150msgstr "(%1)"
85msgstr "(%1)"
151
86
152−#. TRANSLATORS: Number of persons who wrote reviews for this app
153#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
87#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
154−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
88+#: Dash/Previews/Header.qml:105
155#, qt-format
89#, qt-format
156msgid "%1 review"
90msgid "%1 review"
157msgid_plural "%1 reviews"
91msgid_plural "%1 reviews"
158msgstr[0] "%1 பரிசீலனை"
92msgstr[0] "%1 பரிசீலனை"
159msgstr[1] "%1 பரிசீலனைகள்"
93msgstr[1] "%1 பரிசீலனைகள்"
160
94
161−#: Dash/Apps/AppPreview.qml:135
162−msgid "Rate this"
163−msgstr "இதை மதிப்பிடு"
164−
165#: Dash/Previews/Reviews.qml:74
95#: Dash/Previews/Reviews.qml:74
166msgid "Add a review"
96msgid "Add a review"
167msgstr "ஒரு பரிசீலனையை சேர்"
97msgstr "ஒரு பரிசீலனையை சேர்"
@@ -178,7 +108,7 @@ msgstr "அனுப்பு"
178msgid "Comments:"
108msgid "Comments:"
179msgstr "கருத்துகள்:"
109msgstr "கருத்துகள்:"
180
110
181−#: Greeter/Lockscreen.qml:146
111+#: Greeter/Lockscreen.qml:149
182msgid "Emergency Call"
112msgid "Emergency Call"
183msgstr "அவசர அழைப்பு"
113msgstr "அவசர அழைப்பு"
184
114
@@ -228,15 +158,7 @@ msgstr ""
228msgid "Unlock from Launcher"
158msgid "Unlock from Launcher"
229msgstr ""
159msgstr ""
230
160
231−#: plugins/Unity/scope.cpp:408
232−msgid "Sorry, there is nothing that matches your search."
233−msgstr "மன்னிக்கவும், உங்களுடைய தேடலுக்கு தகுந்த பொருத்தம் கிடைக்கவில்லை."
234−
235−#: plugins/Unity/showallfilteroption.cpp:41
236−msgid "All"
237−msgstr "அனைத்தும்"
238−
239−#: Shell.qml:441
161+#: Shell.qml:439
240#, qt-format
162#, qt-format
241msgid "Please enter %1"
163msgid "Please enter %1"
242msgstr "தயவுச்செய்து %1 உள்ளிடு"
164msgstr "தயவுச்செய்து %1 உள்ளிடு"
po/te.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11"PO-Revision-Date: 2013-06-27 09:57+0000\n"
11"PO-Revision-Date: 2013-06-27 09:57+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: Telugu <te@li.org>\n"
13"Language-Team: Telugu <te@li.org>\n"
@@ -15,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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 ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
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 ""
88
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr ""
69msgstr ""
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr ""
79msgstr ""
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] ""
86msgstr[0] ""
153msgstr[1] ""
87msgstr[1] ""
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr ""
91msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172msgid "Comments:"
102msgid "Comments:"
173msgstr ""
103msgstr ""
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177msgstr ""
107msgstr ""
178
108
@@ -222,15 +152,7 @@ msgstr ""
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223msgstr ""
153msgstr ""
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr ""
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236msgstr ""
158msgstr ""
po/tr.po+17−95
@@ -7,84 +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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-10-01 13:21+0000\n"
11+"PO-Revision-Date: 2013-12-12 16:06+0000\n"
12−"Last-Translator: Volkan Gezer <Unknown>\n"
12+"Last-Translator: Arda Ünlü <aarda.uunlu@gmail.com>\n"
13"Language-Team: Turkish <tr@li.org>\n"
13"Language-Team: Turkish <tr@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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Telefon"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Kamera"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "Galeri"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "Facebook"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "Tarayıcı"
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 "Hava Durumu"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Not Defteri"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Takvim"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "Ortam Oynatıcı"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr "Evernote"
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "Harita"
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 "Vikipedi"
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr "YouTube"
88
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -133,30 +65,28 @@ msgid ""
133"phone<br><br>Tap anywhere to start"
65"phone<br><br>Tap anywhere to start"
134msgstr ""
66msgstr ""
135
67
136−#: Components/PageHeader.qml:345
68+#: Components/PageHeader.qml:364
137msgid "Recent searches"
69msgid "Recent searches"
138msgstr "Son Arananlar"
70msgstr "Son Arananlar"
139
71
140−#. TRANSLATORS: Number of persons who rated this app
72+#: Dash/Apps/AppPreview.qml:135
73+msgid "Rate this"
74+msgstr "Oyla"
75+
141#. TRANSLATORS: Number of persons who rated this app/video/whatever
76#. TRANSLATORS: Number of persons who rated this app/video/whatever
142−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
77+#: Dash/Previews/Header.qml:93
143#, qt-format
78#, qt-format
144msgid "(%1)"
79msgid "(%1)"
145msgstr "(%1)"
80msgstr "(%1)"
146
81
147−#. TRANSLATORS: Number of persons who wrote reviews for this app
148#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
82#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
149−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
83+#: Dash/Previews/Header.qml:105
150#, qt-format
84#, qt-format
151msgid "%1 review"
85msgid "%1 review"
152msgid_plural "%1 reviews"
86msgid_plural "%1 reviews"
153msgstr[0] "%1 inceleme"
87msgstr[0] "%1 inceleme"
154msgstr[1] "%1 inceleme"
88msgstr[1] "%1 inceleme"
155
89
156−#: Dash/Apps/AppPreview.qml:135
157−msgid "Rate this"
158−msgstr "Oyla"
159−
160#: Dash/Previews/Reviews.qml:74
90#: Dash/Previews/Reviews.qml:74
161msgid "Add a review"
91msgid "Add a review"
162msgstr "Bir inceleme ekle"
92msgstr "Bir inceleme ekle"
@@ -173,7 +103,7 @@ msgstr "Gönder"
173msgid "Comments:"
103msgid "Comments:"
174msgstr "Yorumlar:"
104msgstr "Yorumlar:"
175
105
176−#: Greeter/Lockscreen.qml:146
106+#: Greeter/Lockscreen.qml:149
177msgid "Emergency Call"
107msgid "Emergency Call"
178msgstr "Acil Arama"
108msgstr "Acil Arama"
179
109
@@ -208,7 +138,7 @@ msgstr "Konuşuyor..."
208
138
209#: Notifications/NotificationMenuItemFactory.qml:89
139#: Notifications/NotificationMenuItemFactory.qml:89
210msgid "Show password"
140msgid "Show password"
211−msgstr ""
141+msgstr "Parolayı göster"
212
142
213#: Panel/SearchIndicator.qml:27
143#: Panel/SearchIndicator.qml:27
214msgid "Search"
144msgid "Search"
@@ -217,21 +147,13 @@ msgstr "Ara"
217#: plugins/Unity/Launcher/launcheritem.cpp:43
147#: plugins/Unity/Launcher/launcheritem.cpp:43
218#: plugins/Unity/Launcher/launcheritem.cpp:73
148#: plugins/Unity/Launcher/launcheritem.cpp:73
219msgid "Lock to Launcher"
149msgid "Lock to Launcher"
220−msgstr ""
150+msgstr "Başlatıcıya Sabitle"
221
151
222#: plugins/Unity/Launcher/launcheritem.cpp:73
152#: plugins/Unity/Launcher/launcheritem.cpp:73
223msgid "Unlock from Launcher"
153msgid "Unlock from Launcher"
224−msgstr ""
154+msgstr "Başlatıcıdan Ayır"
225−
226−#: plugins/Unity/scope.cpp:408
227−msgid "Sorry, there is nothing that matches your search."
228−msgstr "Üzgünüz, aramanızla eşleşen hiçbir şey yok."
229−
230−#: plugins/Unity/showallfilteroption.cpp:41
231−msgid "All"
232−msgstr ""
233
155
234−#: Shell.qml:441
156+#: Shell.qml:439
235#, qt-format
157#, qt-format
236msgid "Please enter %1"
158msgid "Please enter %1"
237msgstr "Lütfen %1 girin"
159msgstr "Lütfen %1 girin"
po/ug.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11"PO-Revision-Date: 2013-10-09 22:38+0000\n"
11"PO-Revision-Date: 2013-10-09 22:38+0000\n"
12"Last-Translator: Gheyret T.Kenji <Unknown>\n"
12"Last-Translator: Gheyret T.Kenji <Unknown>\n"
13"Language-Team: Uyghur <ug@li.org>\n"
13"Language-Team: Uyghur <ug@li.org>\n"
@@ -15,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -132,29 +64,27 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr "يېقىنقى ئىزدەشلەر"
69msgstr "يېقىنقى ئىزدەشلەر"
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr "(%1)"
79msgstr "(%1)"
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] "%1 باھا"
86msgstr[0] "%1 باھا"
153
87
154−#: Dash/Apps/AppPreview.qml:135
155−msgid "Rate this"
156−msgstr ""
157−
158#: Dash/Previews/Reviews.qml:74
88#: Dash/Previews/Reviews.qml:74
159msgid "Add a review"
89msgid "Add a review"
160msgstr ""
90msgstr ""
@@ -171,7 +101,7 @@ msgstr "ئەۋەت"
171msgid "Comments:"
101msgid "Comments:"
172msgstr "ئىنكاس:"
102msgstr "ئىنكاس:"
173
103
174−#: Greeter/Lockscreen.qml:146
104+#: Greeter/Lockscreen.qml:149
175msgid "Emergency Call"
105msgid "Emergency Call"
176msgstr ""
106msgstr ""
177
107
@@ -221,15 +151,7 @@ msgstr ""
221msgid "Unlock from Launcher"
151msgid "Unlock from Launcher"
222msgstr ""
152msgstr ""
223
153
224−#: plugins/Unity/scope.cpp:408
225−msgid "Sorry, there is nothing that matches your search."
226−msgstr "كەچۈرۈڭ، ئىزدىگىنىڭىزگە ماس نەتىجە تېپىلمىدى."
227−
228−#: plugins/Unity/showallfilteroption.cpp:41
229−msgid "All"
230−msgstr "ھەممىسى"
231−
232−#: Shell.qml:441
154+#: Shell.qml:439
233#, qt-format
155#, qt-format
234msgid "Please enter %1"
156msgid "Please enter %1"
235msgstr "%1 نى كىرگۈزۈڭ"
157msgstr "%1 نى كىرگۈزۈڭ"
po/uk.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11"PO-Revision-Date: 2013-11-23 12:37+0000\n"
11"PO-Revision-Date: 2013-11-23 12:37+0000\n"
12"Last-Translator: Ignat Kizenko <Unknown>\n"
12"Last-Translator: Ignat Kizenko <Unknown>\n"
13"Language-Team: Ukrainian <uk@li.org>\n"
13"Language-Team: Ukrainian <uk@li.org>\n"
@@ -16,76 +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-11-24 05:50+0000\n"
19+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
20−"X-Generator: Launchpad (build 16831)\n"
20+"X-Generator: Launchpad (build 16877)\n"
21−
22−#: Applications/applications.js:23
23−msgid "Phone"
24−msgstr "Телефон"
25−
26−#: Applications/applications.js:29
27−msgid "Camera"
28−msgstr "Фотоапарат"
29−
30−#: Applications/applications.js:35
31−msgid "Gallery"
32−msgstr "Галерея"
33−
34−#: Applications/applications.js:40
35−msgid "Facebook"
36−msgstr "Facebook"
37−
38−#: Applications/applications.js:46
39−msgid "Browser"
40−msgstr "Навігатор"
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 "Погода"
53−
54−#: Applications/applications.js:68
55−msgid "Notepad"
56−msgstr "Блокнот"
57−
58−#: Applications/applications.js:74
59−msgid "Calendar"
60−msgstr "Календар"
61−
62−#: Applications/applications.js:80
63−msgid "Media Player"
64−msgstr "Програвач"
65−
66−#: Applications/applications.js:86
67−msgid "Evernote"
68−msgstr "Evernote"
69−
70−#: Applications/applications.js:91
71−msgid "Map"
72−msgstr "Карта"
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 "Вікіпедія"
85−
86−#: Applications/applications.js:111
87−msgid "YouTube"
88−msgstr "YouTube"
89
21
90#: Components/EdgeDemoOverlay.qml:151
22#: Components/EdgeDemoOverlay.qml:151
91msgid "Skip intro"
23msgid "Skip intro"
@@ -138,20 +70,22 @@ msgstr ""
138"Тепер жести налаштовано, ви можете почати користуватися "
70"Тепер жести налаштовано, ви можете почати користуватися "
139"телефоном.<br><br>Натисніть у довільному місці екрана."
71"телефоном.<br><br>Натисніть у довільному місці екрана."
140
72
141−#: Components/PageHeader.qml:345
73+#: Components/PageHeader.qml:364
142msgid "Recent searches"
74msgid "Recent searches"
143msgstr "Нещодавні пошуки"
75msgstr "Нещодавні пошуки"
144
76
145−#. TRANSLATORS: Number of persons who rated this app
77+#: Dash/Apps/AppPreview.qml:135
78+msgid "Rate this"
79+msgstr "Оцінити"
80+
146#. TRANSLATORS: Number of persons who rated this app/video/whatever
81#. TRANSLATORS: Number of persons who rated this app/video/whatever
147−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
82+#: Dash/Previews/Header.qml:93
148#, qt-format
83#, qt-format
149msgid "(%1)"
84msgid "(%1)"
150msgstr "(%1)"
85msgstr "(%1)"
151
86
152−#. TRANSLATORS: Number of persons who wrote reviews for this app
153#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
87#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
154−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
88+#: Dash/Previews/Header.qml:105
155#, qt-format
89#, qt-format
156msgid "%1 review"
90msgid "%1 review"
157msgid_plural "%1 reviews"
91msgid_plural "%1 reviews"
@@ -159,10 +93,6 @@ msgstr[0] "%1 рецензія"
159msgstr[1] "%1 рецензії"
93msgstr[1] "%1 рецензії"
160msgstr[2] "%1 рецензій"
94msgstr[2] "%1 рецензій"
161
95
162−#: Dash/Apps/AppPreview.qml:135
163−msgid "Rate this"
164−msgstr "Оцінити"
165−
166#: Dash/Previews/Reviews.qml:74
96#: Dash/Previews/Reviews.qml:74
167msgid "Add a review"
97msgid "Add a review"
168msgstr "Додати рецензію"
98msgstr "Додати рецензію"
@@ -179,7 +109,7 @@ msgstr "Надіслати"
179msgid "Comments:"
109msgid "Comments:"
180msgstr "Коментарі:"
110msgstr "Коментарі:"
181
111
182−#: Greeter/Lockscreen.qml:146
112+#: Greeter/Lockscreen.qml:149
183msgid "Emergency Call"
113msgid "Emergency Call"
184msgstr "Терміновий виклик"
114msgstr "Терміновий виклик"
185
115
@@ -229,15 +159,7 @@ msgstr "Зафіксувати на панелі запуску"
229msgid "Unlock from Launcher"
159msgid "Unlock from Launcher"
230msgstr "Від’єднати від панелі запуску"
160msgstr "Від’єднати від панелі запуску"
231
161
232−#: plugins/Unity/scope.cpp:408
233−msgid "Sorry, there is nothing that matches your search."
234−msgstr "Вибачте, для вказаних вами ключових слів нічого не знайдено."
235−
236−#: plugins/Unity/showallfilteroption.cpp:41
237−msgid "All"
238−msgstr "Усе"
239−
240−#: Shell.qml:441
162+#: Shell.qml:439
241#, qt-format
163#, qt-format
242msgid "Please enter %1"
164msgid "Please enter %1"
243msgstr "Будь ласка, введіть %1"
165msgstr "Будь ласка, введіть %1"
po/unity8.pot+10−88
@@ -8,7 +8,7 @@ msgid ""
8msgstr ""
8msgstr ""
9"Project-Id-Version: unity8\n"
9"Project-Id-Version: unity8\n"
10"Report-Msgid-Bugs-To: \n"
10"Report-Msgid-Bugs-To: \n"
11−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
11+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14"Language-Team: LANGUAGE <LL@li.org>\n"
14"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,74 +18,6 @@ msgstr ""
18"Content-Transfer-Encoding: 8bit\n"
18"Content-Transfer-Encoding: 8bit\n"
19"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
19"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
20
20
21−#: 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 ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
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 ""
88−
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
91msgstr ""
23msgstr ""
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr ""
69msgstr ""
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr ""
79msgstr ""
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] ""
86msgstr[0] ""
153msgstr[1] ""
87msgstr[1] ""
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr ""
91msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172msgid "Comments:"
102msgid "Comments:"
173msgstr ""
103msgstr ""
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177msgstr ""
107msgstr ""
178
108
@@ -222,15 +152,7 @@ msgstr ""
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223msgstr ""
153msgstr ""
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr ""
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236msgstr ""
158msgstr ""
po/xh.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11"PO-Revision-Date: 2013-09-28 13:20+0000\n"
11"PO-Revision-Date: 2013-09-28 13:20+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Xhosa <xh@li.org>\n"
13"Language-Team: Xhosa <xh@li.org>\n"
@@ -15,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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 ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
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 ""
88
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr ""
69msgstr ""
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr ""
79msgstr ""
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] ""
86msgstr[0] ""
153msgstr[1] ""
87msgstr[1] ""
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr ""
91msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172msgid "Comments:"
102msgid "Comments:"
173msgstr ""
103msgstr ""
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177msgstr ""
107msgstr ""
178
108
@@ -222,15 +152,7 @@ msgstr ""
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223msgstr ""
153msgstr ""
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr ""
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236msgstr ""
158msgstr ""
po/zh_CN.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11"PO-Revision-Date: 2013-10-09 13:51+0000\n"
11"PO-Revision-Date: 2013-10-09 13:51+0000\n"
12"Last-Translator: Aron Xu <Unknown>\n"
12"Last-Translator: Aron Xu <Unknown>\n"
13"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
13"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
@@ -15,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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 "记事本"
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 "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
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr "近期搜索"
69msgstr "近期搜索"
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr ""
79msgstr ""
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] ""
86msgstr[0] ""
153msgstr[1] ""
87msgstr[1] ""
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr ""
91msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172msgid "Comments:"
102msgid "Comments:"
173msgstr ""
103msgstr ""
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177msgstr ""
107msgstr ""
178
108
@@ -222,15 +152,7 @@ msgstr ""
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223msgstr ""
153msgstr ""
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "对不起,没有找到您想要的结果。"
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236msgstr ""
158msgstr ""
po/zh_TW.po+12−90
@@ -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-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11"PO-Revision-Date: 2013-06-27 10:24+0000\n"
11"PO-Revision-Date: 2013-06-27 10:24+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: Chinese (Traditional) <zh_TW@li.org>\n"
13"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
@@ -15,76 +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-11-19 05:59+0000\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
19+"X-Generator: Launchpad (build 16877)\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 ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
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 ""
88
20
89#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
90msgid "Skip intro"
22msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
132"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
133msgstr ""
65msgstr ""
134
66
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
136msgid "Recent searches"
68msgid "Recent searches"
137msgstr "最近搜尋"
69msgstr "最近搜尋"
138
70
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
140#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
142#, qt-format
77#, qt-format
143msgid "(%1)"
78msgid "(%1)"
144msgstr ""
79msgstr ""
145
80
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
147#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
149#, qt-format
83#, qt-format
150msgid "%1 review"
84msgid "%1 review"
151msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
152msgstr[0] ""
86msgstr[0] ""
153msgstr[1] ""
87msgstr[1] ""
154
88
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
159#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
160msgid "Add a review"
90msgid "Add a review"
161msgstr ""
91msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172msgid "Comments:"
102msgid "Comments:"
173msgstr ""
103msgstr ""
174
104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176msgid "Emergency Call"
106msgid "Emergency Call"
177msgstr ""
107msgstr ""
178
108
@@ -222,15 +152,7 @@ msgstr ""
222msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
223msgstr ""
153msgstr ""
224
154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "很抱歉,找不到符合您想搜尋的結果。"
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234#, qt-format
156#, qt-format
235msgid "Please enter %1"
157msgid "Please enter %1"
236msgstr ""
158msgstr ""
Bottombar/Bottombar.qml → qml/Bottombar/Bottombar.qmlrenamed

The content is the same.

Bottombar/HudButton.qml → qml/Bottombar/HudButton.qmlrenamed

The content is the same.

Bottombar/graphics/hud@20.png → qml/Bottombar/graphics/hud@20.pngrenamed

Binary file not shown.

Bottombar/graphics/hud_invoke_button_active@20.png → qml/Bottombar/graphics/hud_invoke_button_active@20.pngrenamed

Binary file not shown.

qml/CMakeLists.txtnew file+22
@@ -0,0 +1,22 @@
1+file(GLOB QML_JS_FILES *.qml *.js)
2+
3+install(FILES ${QML_JS_FILES}
4+ DESTINATION ${SHELL_APP_DIR}
5+ )
6+
7+set(QML_DIRS
8+ Bottombar
9+ Components
10+ Dash
11+ graphics
12+ Greeter
13+ Hud
14+ Panel
15+ Launcher
16+ SideStage
17+ Notifications
18+ )
19+
20+install(DIRECTORY ${QML_DIRS}
21+ DESTINATION ${SHELL_APP_DIR}
22+ )
Components/AnimationControllerWithSignals.qml → qml/Components/AnimationControllerWithSignals.qmlrenamed

The content is the same.

Components/ApplicationManagerWrapper.qml → qml/Components/ApplicationManagerWrapper.qmlrenamed

The content is the same.

Components/ApplicationScreenshot.qml → qml/Components/ApplicationScreenshot.qmlrenamed

The content is the same.

Components/ApplicationsModelStageFiltered.qml → qml/Components/ApplicationsModelStageFiltered.qmlrenamed

The content is the same.

Components/BaseCarouselDelegate.qml → qml/Components/BaseCarouselDelegate.qmlrenamed

The content is the same.

Components/Carousel.qml → qml/Components/Carousel.qmlrenamed+2−3
@@ -63,6 +63,7 @@ Item {
63 signal pressAndHold(int index, real itemY)
63 signal pressAndHold(int index, real itemY)
64
64
65 implicitHeight: listView.tileHeight * selectedItemScaleFactor
65 implicitHeight: listView.tileHeight * selectedItemScaleFactor
66+ opacity: listView.highlightIndex === -1 ? 1 : 0.6
66
67
67 /* Basic idea behind the carousel effect is to move the items of the delegates (compacting /stuffing them).
68 /* Basic idea behind the carousel effect is to move the items of the delegates (compacting /stuffing them).
68 One drawback is, that more delegates have to be drawn than usually. As some items are moved from the
69 One drawback is, that more delegates have to be drawn than usually. As some items are moved from the
@@ -75,11 +76,11 @@ Item {
75 ListView {
76 ListView {
76 id: listView
77 id: listView
77
78
79+ property int highlightIndex: -1
78 property real minimumTileWidth: 0
80 property real minimumTileWidth: 0
79 property real newContentX: disabledNewContentX
81 property real newContentX: disabledNewContentX
80 property real pathItemCount: referenceWidth / referenceTileWidth
82 property real pathItemCount: referenceWidth / referenceTileWidth
81 property real tileAspectRatio: 1
83 property real tileAspectRatio: 1
82− property int highlightIndex: -1
83
84
84 /* The positioning and scaling of the items in the carousel is based on the variable
85 /* The positioning and scaling of the items in the carousel is based on the variable
85 'continuousIndex', a continuous real variable between [0, 'carousel.model.count'],
86 'continuousIndex', a continuous real variable between [0, 'carousel.model.count'],
@@ -293,7 +294,6 @@ Item {
293 scale: itemScale * explicitScaleFactor
294 scale: itemScale * explicitScaleFactor
294 sourceComponent: itemComponent
295 sourceComponent: itemComponent
295 z: cachedTiles - Math.abs(index - listView.selectedIndex)
296 z: cachedTiles - Math.abs(index - listView.selectedIndex)
296− opacity: highlightIndex == -1 ? 1 : (highlightIndex == index ? 0.6 : 0.2)
297
297
298 transform: Translate {
298 transform: Translate {
299 x: xTransform
299 x: xTransform
@@ -333,7 +333,6 @@ Item {
333 onPressAndHold: {
333 onPressAndHold: {
334 listView.itemPressAndHold(index, item)
334 listView.itemPressAndHold(index, item)
335 }
335 }
336−
337 }
336 }
338 }
337 }
339 }
338 }
Components/Circle.qml → qml/Components/Circle.qmlrenamed

The content is the same.

Components/DragHandle.qml → qml/Components/DragHandle.qmlrenamed

The content is the same.

Components/DraggingArea.qml → qml/Components/DraggingArea.qmlrenamed

The content is the same.

Components/EdgeDemo.qml → qml/Components/EdgeDemo.qmlrenamed+1
@@ -31,6 +31,7 @@ Item {
31 property bool dashEnabled: true
31 property bool dashEnabled: true
32 property bool panelEnabled: true
32 property bool panelEnabled: true
33 property bool panelContentEnabled: true
33 property bool panelContentEnabled: true
34+ property bool running: !launcherEnabled || !dashEnabled || !panelEnabled || !panelContentEnabled
34
35
35 property bool paused: false
36 property bool paused: false
36
37
Components/EdgeDemoOverlay.qml → qml/Components/EdgeDemoOverlay.qmlrenamed

The content is the same.

Components/EdgeDragArea.qml → qml/Components/EdgeDragArea.qmlrenamed

The content is the same.

Components/EdgeDragEvaluator.qml → qml/Components/EdgeDragEvaluator.qmlrenamed

The content is the same.

Components/FilterGrid.qml → qml/Components/FilterGrid.qmlrenamed+2−1
@@ -41,11 +41,12 @@ Item {
41
41
42 /* Maximum number of rows to be show when filter=true. */
42 /* Maximum number of rows to be show when filter=true. */
43 property int collapsedRowCount: 2
43 property int collapsedRowCount: 2
44+ property int uncollapsedRowCount: Math.ceil(model.count / columns)
44 readonly property int collapsedHeight: {
45 readonly property int collapsedHeight: {
45 return iconTileGrid.contentHeightForRows(Math.min(collapsedRowCount, Math.ceil(model.count / columns)))
46 return iconTileGrid.contentHeightForRows(Math.min(collapsedRowCount, Math.ceil(model.count / columns)))
46 }
47 }
47 readonly property int uncollapsedHeight: {
48 readonly property int uncollapsedHeight: {
48− return iconTileGrid.contentHeightForRows(Math.ceil(model.count / columns))
49+ return iconTileGrid.contentHeightForRows(uncollapsedRowCount)
49 }
50 }
50
51
51 property alias minimumHorizontalSpacing: iconTileGrid.minimumHorizontalSpacing
52 property alias minimumHorizontalSpacing: iconTileGrid.minimumHorizontalSpacing
Components/LazyImage.qml → qml/Components/LazyImage.qmlrenamed

The content is the same.

Components/ListItems/Base.qml → qml/Components/ListItems/Base.qmlrenamed

The content is the same.

Components/ListItems/Header.qml → qml/Components/ListItems/Header.qmlrenamed

The content is the same.

Components/ListItems/Highlight.qml → qml/Components/ListItems/Highlight.qmlrenamed

The content is the same.

Components/ListItems/ThinDivider.qml → qml/Components/ListItems/ThinDivider.qmlrenamed

The content is the same.

Components/ListItems/VerticalThinDivider.qml → qml/Components/ListItems/VerticalThinDivider.qmlrenamed

The content is the same.

Components/ListItems/graphics/ListItemDividerHorizontal@18.png → qml/Components/ListItems/graphics/ListItemDividerHorizontal@18.pngrenamed

Binary file not shown.

Components/ListItems/graphics/ListItemDividerVertical@18.png → qml/Components/ListItems/graphics/ListItemDividerVertical@18.pngrenamed

Binary file not shown.

Components/OpenEffect.qml → qml/Components/OpenEffect.qmlrenamed

The content is the same.

Components/PageHeader.qml → qml/Components/PageHeader.qmlrenamed+14−39
@@ -21,17 +21,12 @@ import Ubuntu.Components.ListItems 0.1 as ListItem
21import Unity 0.1
21import Unity 0.1
22
22
23Item {
23Item {
24− /*!
24+ id: root
25− \preliminary
26− The text that is shown inside the Page Header
27− \qmlproperty string text
28− */
29− property alias text: label.text
30−
31 property bool searchEntryEnabled: false
25 property bool searchEntryEnabled: false
32 property alias searchQuery: searchField.text
26 property alias searchQuery: searchField.text
33 property ListModel searchHistory
27 property ListModel searchHistory
34 property Scope scope
28 property Scope scope
29+ property alias childItem: itemContainer.children
35
30
36 height: units.gu(8.5)
31 height: units.gu(8.5)
37 implicitHeight: units.gu(8.5)
32 implicitHeight: units.gu(8.5)
@@ -82,29 +77,10 @@ Item {
82 height: childrenRect.height
77 height: childrenRect.height
83
78
84 Item {
79 Item {
85− id: textContainer
80+ id: itemContainer
86
81
87− width: header.width
82+ width: searchContainer.narrowMode ? header.width : header.width - searchContainer.width
88 height: header.height
83 height: header.height
89−
90− Label {
91− id: label
92− anchors {
93− left: parent.left
94− leftMargin: units.gu(2)
95− right: parent.right
96− verticalCenter: parent.verticalCenter
97− }
98−
99− color: Theme.palette.selected.backgroundText
100− opacity: 0.8
101− font.family: "Ubuntu"
102− font.weight: Font.Light
103− fontSize: "x-large"
104− elide: Text.ElideRight
105− style: Text.Raised
106− styleColor: "black"
107− }
108 }
84 }
109
85
110 Item {
86 Item {
@@ -115,12 +91,12 @@ Item {
115 property bool popoverShouldOpen: false
91 property bool popoverShouldOpen: false
116 property bool popoverShouldClose: false
92 property bool popoverShouldClose: false
117
93
118− property bool narrowMode: parent.width < label.contentWidth + units.gu(50)
94+ property bool narrowMode: parent.width < units.gu(80)
119
95
120 property bool active: searchField.text != "" || searchField.activeFocus
96 property bool active: searchField.text != "" || searchField.activeFocus
121 property var popover: null
97 property var popover: null
122
98
123− anchors.right: textContainer.right
99+ anchors.right: headerContainer.right
124 height: header.height
100 height: header.height
125
101
126 state:
102 state:
@@ -141,9 +117,8 @@ Item {
141
117
142 function openPopover() {
118 function openPopover() {
143 if (searchHistory.count > 0) {
119 if (searchHistory.count > 0) {
144− searchContainer.popover = PopupUtils.open(popoverComponent, searchField,
120+ searchContainer.popover = PopupUtils.open(popoverComponent, pointerPositioner,
145 {
121 {
146− "pointerTarget": pointerPositioner,
147 "contentWidth": searchField.width,
122 "contentWidth": searchField.width,
148 "edgeMargins": units.gu(1)
123 "edgeMargins": units.gu(1)
149 }
124 }
@@ -256,13 +231,13 @@ Item {
256 states: [
231 states: [
257 State {
232 State {
258 name: "wide"
233 name: "wide"
259− AnchorChanges { target: textContainer; anchors.top: headerContainer.top }
234+ AnchorChanges { target: itemContainer; anchors.top: headerContainer.top }
260− AnchorChanges { target: searchContainer; anchors.left: undefined; anchors.top: textContainer.top }
235+ AnchorChanges { target: searchContainer; anchors.left: undefined; anchors.top: itemContainer.top }
261 },
236 },
262 State {
237 State {
263 name: "narrow"
238 name: "narrow"
264 PropertyChanges { target: searchField; highlighted: true }
239 PropertyChanges { target: searchField; highlighted: true }
265− AnchorChanges { target: textContainer; anchors.top: searchContainer.bottom }
240+ AnchorChanges { target: itemContainer; anchors.top: searchContainer.bottom }
266 AnchorChanges { target: searchContainer; anchors.left: headerContainer.left; anchors.top: headerContainer.top }
241 AnchorChanges { target: searchContainer; anchors.left: headerContainer.left; anchors.top: headerContainer.top }
267 },
242 },
268 State {
243 State {
@@ -300,7 +275,7 @@ Item {
300 ParallelAnimation {
275 ParallelAnimation {
301 NumberAnimation { targets: [searchContainer, searchField]; property: "width"; duration: 200; easing.type: Easing.InOutQuad }
276 NumberAnimation { targets: [searchContainer, searchField]; property: "width"; duration: 200; easing.type: Easing.InOutQuad }
302 PropertyAction { target: primaryImage; property: "source" }
277 PropertyAction { target: primaryImage; property: "source" }
303− AnchorAnimation { targets: [searchContainer, textContainer]; duration: 200; easing.type: Easing.InOutQuad }
278+ AnchorAnimation { targets: [searchContainer, itemContainer]; duration: 200; easing.type: Easing.InOutQuad }
304 }
279 }
305 ScriptAction { script: if (searchContainer.popoverShouldOpen) { searchContainer.openPopover(); } }
280 ScriptAction { script: if (searchContainer.popoverShouldOpen) { searchContainer.openPopover(); } }
306 }
281 }
@@ -309,14 +284,14 @@ Item {
309 to: "inactive"
284 to: "inactive"
310 ScriptAction { script: if (searchContainer.popoverShouldClose) { searchContainer.closePopover(); } }
285 ScriptAction { script: if (searchContainer.popoverShouldClose) { searchContainer.closePopover(); } }
311 NumberAnimation { targets: [searchContainer, searchField] ; property: "width"; duration: 200; easing.type: Easing.InOutQuad }
286 NumberAnimation { targets: [searchContainer, searchField] ; property: "width"; duration: 200; easing.type: Easing.InOutQuad }
312− AnchorAnimation { targets: [searchContainer, textContainer]; duration: 200; easing.type: Easing.InOutQuad }
287+ AnchorAnimation { targets: [searchContainer, itemContainer]; duration: 200; easing.type: Easing.InOutQuad }
313 },
288 },
314 Transition {
289 Transition {
315 to: "narrowActive"
290 to: "narrowActive"
316 SequentialAnimation {
291 SequentialAnimation {
317 ParallelAnimation {
292 ParallelAnimation {
318 NumberAnimation { targets: [searchContainer, searchField] ; property: "width"; duration: 200; easing.type: Easing.OutQuad }
293 NumberAnimation { targets: [searchContainer, searchField] ; property: "width"; duration: 200; easing.type: Easing.OutQuad }
319− AnchorAnimation { targets: [searchContainer, textContainer]; duration: 200; easing.type: Easing.InOutQuad }
294+ AnchorAnimation { targets: [searchContainer, itemContainer]; duration: 200; easing.type: Easing.InOutQuad }
320 }
295 }
321 ScriptAction { script: if (searchContainer.popoverShouldOpen) { searchContainer.openPopover(); } }
296 ScriptAction { script: if (searchContainer.popoverShouldOpen) { searchContainer.openPopover(); } }
322 }
297 }
@@ -325,7 +300,7 @@ Item {
325 to: "narrowInactive"
300 to: "narrowInactive"
326 ScriptAction { script: if (searchContainer.popoverShouldClose) { searchContainer.closePopover(); } }
301 ScriptAction { script: if (searchContainer.popoverShouldClose) { searchContainer.closePopover(); } }
327 NumberAnimation { targets: [searchContainer, searchField] ; property: "width"; duration: 200; easing.type: Easing.OutQuad }
302 NumberAnimation { targets: [searchContainer, searchField] ; property: "width"; duration: 200; easing.type: Easing.OutQuad }
328− AnchorAnimation { targets: [searchContainer, textContainer]; duration: 200; easing.type: Easing.InOutQuad }
303+ AnchorAnimation { targets: [searchContainer, itemContainer]; duration: 200; easing.type: Easing.InOutQuad }
329 }
304 }
330 ]
305 ]
331
306
qml/Components/PageHeaderLabel.qmlnew file+41
@@ -0,0 +1,41 @@
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+PageHeader {
21+ property alias text: label.text
22+
23+ childItem: Label {
24+ id: label
25+ anchors {
26+ left: parent.left
27+ leftMargin: units.gu(2)
28+ right: parent.right
29+ verticalCenter: parent.verticalCenter
30+ }
31+
32+ color: Theme.palette.selected.backgroundText
33+ opacity: 0.8
34+ font.family: "Ubuntu"
35+ font.weight: Font.Light
36+ fontSize: "x-large"
37+ elide: Text.ElideRight
38+ style: Text.Raised
39+ styleColor: "black"
40+ }
41+}
Components/PinPadButton.qml → qml/Components/PinPadButton.qmlrenamed

The content is the same.

Components/RatingStars.qml → qml/Components/RatingStars.qmlrenamed

The content is the same.

Components/ResponsiveFlowView.qml → qml/Components/ResponsiveFlowView.qmlrenamed

The content is the same.

Components/ResponsiveGridView.qml → qml/Components/ResponsiveGridView.qmlrenamed

The content is the same.

Components/Revealer.qml → qml/Components/Revealer.qmlrenamed

The content is the same.

Components/SearchHistoryModel.qml → qml/Components/SearchHistoryModel.qmlrenamed

The content is the same.

Components/Showable.qml → qml/Components/Showable.qmlrenamed

The content is the same.

Components/Stage.qml → qml/Components/Stage.qmlrenamed

The content is the same.

Components/StandardAnimation.qml → qml/Components/StandardAnimation.qmlrenamed

The content is the same.

Components/Tile.qml → qml/Components/Tile.qmlrenamed

The content is the same.

Components/TileStyle.qml → qml/Components/TileStyle.qmlrenamed

The content is the same.

Components/UbuntuShapeForItem.qml → qml/Components/UbuntuShapeForItem.qmlrenamed

The content is the same.

Components/VolumeControl.qml → qml/Components/VolumeControl.qmlrenamed

The content is the same.

Components/WrongPasswordAnimation.qml → qml/Components/WrongPasswordAnimation.qmlrenamed

The content is the same.

Components/carousel.js → qml/Components/carousel.jsrenamed

The content is the same.

Components/graphics/PageHeaderBaseDivider@18.png → qml/Components/graphics/PageHeaderBaseDivider@18.pngrenamed

Binary file not shown.

Components/graphics/PageHeaderBaseDivider@18.sci → qml/Components/graphics/PageHeaderBaseDivider@18.scirenamed

The content is the same.

Components/graphics/close@20.png → qml/Components/graphics/close@20.pngrenamed

Binary file not shown.

Components/graphics/icon_star_off@20.png → qml/Components/graphics/icon_star_off@20.pngrenamed

Binary file not shown.

Components/graphics/icon_star_on@20.png → qml/Components/graphics/icon_star_on@20.pngrenamed

Binary file not shown.

Components/graphics/non-selected@18.png → qml/Components/graphics/non-selected@18.pngrenamed

Binary file not shown.

Components/graphics/non-selected@18.sci → qml/Components/graphics/non-selected@18.scirenamed

The content is the same.

Dash/Apps/AppPreview.qml → qml/Dash/Apps/AppPreview.qmlrenamed

The content is the same.

Dash/Apps/CloseIcon.qml → qml/Dash/Apps/CloseIcon.qmlrenamed

The content is the same.

Dash/Apps/DashPluginFilterGrid.qml → qml/Dash/Apps/DashPluginFilterGrid.qmlrenamed

The content is the same.

Dash/Apps/FrequentlyUsedAppsModel.qml → qml/Dash/Apps/FrequentlyUsedAppsModel.qmlrenamed

The content is the same.

Dash/Apps/RunningApplicationTile.qml → qml/Dash/Apps/RunningApplicationTile.qmlrenamed

The content is the same.

Dash/Apps/RunningApplicationsGrid.qml → qml/Dash/Apps/RunningApplicationsGrid.qmlrenamed+17
@@ -17,6 +17,8 @@
17import QtQuick 2.0
17import QtQuick 2.0
18import "../../Components"
18import "../../Components"
19
19
20+import Ubuntu.Gestures 0.1
21+
20ResponsiveFlowView {
22ResponsiveFlowView {
21 id: root
23 id: root
22 clip: true
24 clip: true
@@ -100,4 +102,19 @@ ResponsiveFlowView {
100 move: Transition {
102 move: Transition {
101 NumberAnimation { properties: "x,y"; duration: 400; easing.type: Easing.OutCubic }
103 NumberAnimation { properties: "x,y"; duration: 400; easing.type: Easing.OutCubic }
102 }
104 }
105+
106+ MouseArea {
107+ anchors.fill: parent
108+ z: -1 // behind all RunningApplicationTiles
109+ enabled: root.terminationModeEnabled
110+ onPressed: { root.terminationModeEnabled = false; }
111+ }
112+
113+ PressedOutsideNotifier {
114+ anchors.fill: parent
115+ enabled: root.terminationModeEnabled
116+ onPressedOutside: {
117+ root.terminationModeEnabled = false;
118+ }
119+ }
103}
120}
Dash/Apps/graphics/close_btn@9.png → qml/Dash/Apps/graphics/close_btn@9.pngrenamed

Binary file not shown.

qml/Dash/Card.qmlnew file+83
@@ -0,0 +1,83 @@
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: root
22+ property var template
23+ property var components
24+ property var cardData
25+
26+ width: {
27+ if (template !== undefined) {
28+ if (template["card-layout"] === "horizontal") return units.gu(38);
29+ switch (template['card-size']) {
30+ case "small": return units.gu(12);
31+ case "large": return units.gu(38);
32+ }
33+ }
34+ return units.gu(18.5);
35+ }
36+ height: childrenRect.height
37+
38+ UbuntuShape {
39+ id: artShape
40+ objectName: "artShape"
41+ width: image.fillMode === Image.PreserveAspectCrop || aspect < image.aspect ? image.width : height * image.aspect
42+ height: image.fillMode === Image.PreserveAspectCrop || aspect > image.aspect ? image.height : width / image.aspect
43+ anchors.horizontalCenter: template && template["card-layout"] === "horizontal" ? undefined : parent.horizontalCenter
44+
45+ property real aspect: components !== undefined ? components["art"]["aspect-ratio"] : 1
46+
47+ image: Image {
48+ width: template && template["card-layout"] === "horizontal" ? height * artShape.aspect : root.width
49+ height: template && template["card-layout"] === "horizontal" ? header.height : width / artShape.aspect
50+ objectName: "artImage"
51+ source: cardData && cardData["art"] || ""
52+ // FIXME uncomment when having investigated / fixed the crash
53+ //sourceSize.width: width > height ? width : 0
54+ //sourceSize.height: height > width ? height : 0
55+ fillMode: components["art"]["fill-mode"] === "fit" ? Image.PreserveAspectFit: Image.PreserveAspectCrop
56+
57+ property real aspect: implicitWidth / implicitHeight
58+ }
59+ }
60+
61+ CardHeader {
62+ id: header
63+ objectName: "cardHeader"
64+ anchors {
65+ top: template && template["card-layout"] === "horizontal" ? artShape.top : artShape.bottom
66+ left: template && template["card-layout"] === "horizontal" ? artShape.right : parent.left
67+ right: parent.right
68+ }
69+
70+ mascot: cardData && cardData["mascot"] || ""
71+ title: cardData && cardData["title"] || ""
72+ subtitle: cardData && cardData["subtitle"] || ""
73+ }
74+
75+ Label {
76+ objectName: "summaryLabel"
77+ anchors { top: header.bottom; left: parent.left; right: parent.right }
78+ wrapMode: Text.Wrap
79+ maximumLineCount: 5
80+ elide: Text.ElideRight
81+ text: cardData && cardData["summary"] || ""
82+ }
83+}
qml/Dash/CardHeader.qmlnew file+112
@@ -0,0 +1,112 @@
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: root
22+ property alias mascot: mascotImage.source
23+ property alias title: titleLabel.text
24+ property alias subtitle: subtitleLabel.text
25+ property alias price: priceLabel.text
26+ property alias oldPrice: oldPriceLabel.text
27+ property alias altPrice: altPriceLabel.text
28+
29+ visible: mascotImage.status === Image.Ready || title || price
30+ height: row.height > 0 ? row.height + row.spacing * 2 : 0
31+
32+ Row {
33+ id: row
34+ objectName: "outerRow"
35+
36+ anchors { top: parent.top; left: parent.left; right: parent.right; margins: spacing }
37+ spacing: units.gu(1)
38+
39+ UbuntuShape {
40+ id: mascotShape
41+ objectName: "mascotShape"
42+
43+ width: units.gu(8)
44+ height: units.gu(8)
45+ visible: image.status === Image.Ready
46+
47+ image: Image {
48+ id: mascotImage
49+ sourceSize { width: mascotShape.width; height: mascotShape.height }
50+ }
51+ }
52+
53+ Column {
54+ objectName: "column"
55+ width: parent.width - x
56+
57+ Label {
58+ id: titleLabel
59+ anchors { left: parent.left; right: parent.right }
60+ elide: Text.ElideRight
61+ objectName: "titleLabel"
62+ font.weight: Font.DemiBold
63+ wrapMode: Text.Wrap
64+ maximumLineCount: 2
65+ }
66+
67+ Label {
68+ id: subtitleLabel
69+ anchors { left: parent.left; right: parent.right }
70+ elide: Text.ElideRight
71+ visible: titleLabel.text && text
72+ }
73+
74+ Row {
75+ id: prices
76+ objectName: "prices"
77+ anchors { left: parent.left; right: parent.right }
78+
79+ property int labels: {
80+ var labels = 1; // price always visible
81+ if (oldPriceLabel.text !== "") labels += 1;
82+ if (altPriceLabel.text !== "") labels += 1;
83+ return labels;
84+ }
85+ property real labelWidth: width / labels
86+
87+ Label {
88+ id: priceLabel
89+ width: parent.labelWidth
90+ elide: Text.ElideRight
91+ font.weight: Font.DemiBold
92+ color: Theme.palette.selected.foreground
93+ }
94+
95+ Label {
96+ id: oldPriceLabel
97+ objectName: "oldPriceLabel"
98+ width: parent.labelWidth
99+ elide: Text.ElideRight
100+ horizontalAlignment: parent.labels === 3 ? Text.AlignHCenter : Text.AlignRight
101+ }
102+
103+ Label {
104+ id: altPriceLabel
105+ width: parent.labelWidth
106+ elide: Text.ElideRight
107+ horizontalAlignment: Text.AlignRight
108+ }
109+ }
110+ }
111+ }
112+}
Dash/Dash.qml → qml/Dash/Dash.qmlrenamed−18
@@ -66,11 +66,6 @@ Showable {
66 model: filteredScopes
66 model: filteredScopes
67 scopes: scopes
67 scopes: scopes
68 searchHistory: dash.searchHistory
68 searchHistory: dash.searchHistory
69− onMovementStarted: dashbar.startNavigation()
70− onMovementEnded: dashbar.stopNavigation()
71− onContentFlickStarted: dashbar.finishNavigation()
72− onContentEndReached: dashbar.finishNavigation()
73− onPreviewShown: dashbar.finishNavigation()
74 onScopeLoaded: {
69 onScopeLoaded: {
75 if (scopeId == dash.showScopeOnLoaded) {
70 if (scopeId == dash.showScopeOnLoaded) {
76 dash.setCurrentScope(scopeId, false, false)
71 dash.setCurrentScope(scopeId, false, false)
@@ -80,17 +75,4 @@ Showable {
80 scale: dash.contentScale
75 scale: dash.contentScale
81 clip: scale != 1.0
76 clip: scale != 1.0
82 }
77 }
83−
84− DashBar {
85− id: dashbar
86− objectName: "dashbar"
87− anchors.bottom: parent.bottom
88− anchors.left: parent.left
89− anchors.right: parent.right
90− model: filteredScopes
91− currentIndex: dashContent.currentIndex
92− onItemSelected: dashContent.setCurrentScopeAtIndex(index, true, false)
93− opacity: dash.contentScale == 1.0 ? 1.0 : 0.0
94− Behavior on opacity { NumberAnimation { easing.type: Easing.OutQuad; duration: 150 } }
95− }
96}
78}
Dash/DashApps.qml → qml/Dash/DashApps.qmlrenamed−4
@@ -19,7 +19,6 @@ import Ubuntu.Components 0.1
19import Utils 0.1
19import Utils 0.1
20import "../Components"
20import "../Components"
21import "../Components/ListItems"
21import "../Components/ListItems"
22−import "../Applications"
23import "Apps"
22import "Apps"
24
23
25GenericScopeView {
24GenericScopeView {
@@ -30,9 +29,6 @@ GenericScopeView {
30 property var mainStageApplicationsModel: shell.applicationManager.mainStageApplications
29 property var mainStageApplicationsModel: shell.applicationManager.mainStageApplications
31 property var sideStageApplicationModel: shell.applicationManager.sideStageApplications
30 property var sideStageApplicationModel: shell.applicationManager.sideStageApplications
32
31
33− //FIXME an alias to itself shouldn't be required. More than likely a Qt bug. Try removing with newer Qt.
34− property alias searchHistory: scopeView.searchHistory
35−
36 ListModel {
32 ListModel {
37 id: dummyVisibilityModifier
33 id: dummyVisibilityModifier
38
34
Dash/DashBar.qml → qml/Dash/DashBar.qmlrenamed

The content is the same.

qml/Dash/DashCarousel.qmlnew file+47
@@ -0,0 +1,47 @@
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+DashRenderer {
22+ id: dashCarousel
23+
24+ property alias cacheBuffer: carousel.cacheBuffer
25+ property alias itemComponent: carousel.itemComponent
26+ property alias minimumTileWidth: carousel.minimumTileWidth
27+ property alias selectedItemScaleFactor: carousel.selectedItemScaleFactor
28+ property alias tileAspectRatio: carousel.tileAspectRatio
29+
30+ currentItem: carousel.currentItem
31+ height: carousel.implicitHeight + units.gu(6)
32+ verticalSpacing: units.gu(3)
33+
34+ Carousel {
35+ id: carousel
36+ anchors.fill: parent
37+ tileAspectRatio: 198 / 288
38+ minimumTileWidth: units.gu(13)
39+ selectedItemScaleFactor: 1.14
40+ cacheBuffer: 1404 // 18px * 13gu * 6
41+ model: dashCarousel.model
42+ highlightIndex: dashCarousel.highlightIndex
43+
44+ onClicked: dashCarousel.clicked(index, itemY)
45+ onPressAndHold: dashCarousel.pressAndHold(index, itemY)
46+ }
47+}
qml/Dash/DashContent.qmlnew file+217
@@ -0,0 +1,217 @@
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 Unity 0.1
20+import "../Components"
21+
22+Item {
23+ id: dashContent
24+
25+ property var model: null
26+ property var scopes: null
27+ property real contentProgress: Math.max(0, Math.min(dashContentList.contentX / (dashContentList.contentWidth - dashContentList.width), units.dp(1)))
28+ property alias currentIndex: dashContentList.currentIndex
29+
30+ property ScopeDelegateMapper scopeMapper : ScopeDelegateMapper {}
31+ property ListModel searchHistory
32+
33+ signal movementStarted()
34+ signal movementEnded()
35+ signal contentFlickStarted()
36+ signal contentEndReached()
37+ signal scopeLoaded(string scopeId)
38+ signal positionedAtBeginning()
39+
40+ // If we set the current scope index before the scopes have been added,
41+ // then we need to wait until the loaded signals gets emitted from the scopes
42+ property var set_current_index: undefined
43+ Connections {
44+ target: scopes
45+ onLoadedChanged: {
46+ if (scopes.loaded && set_current_index != undefined) {
47+ setCurrentScopeAtIndex(set_current_index[0], set_current_index[1], set_current_index[2]);
48+ set_current_index = undefined;
49+ }
50+ }
51+ }
52+
53+ function setCurrentScopeAtIndex(index, animate, reset) {
54+ var storedMoveDuration = dashContentList.highlightMoveDuration
55+ var storedMoveSpeed = dashContentList.highlightMoveVelocity
56+ if (!animate) {
57+ dashContentList.highlightMoveVelocity = units.gu(4167)
58+ dashContentList.highlightMoveDuration = 0
59+ }
60+
61+ // if the scopes haven't loaded yet, then wait until they are.
62+ if (!scopes.loaded) {
63+ set_current_index = [ index, animate, reset ]
64+ return;
65+ }
66+ set_current_index = undefined;
67+
68+ if (dashContentList.count > index)
69+ {
70+ dashContentList.currentIndex = index
71+
72+ if (reset) {
73+ dashContent.positionedAtBeginning()
74+ }
75+ }
76+
77+ if (!animate) {
78+ dashContentList.highlightMoveDuration = storedMoveDuration
79+ dashContentList.highlightMoveVelocity = storedMoveSpeed
80+ }
81+ }
82+
83+ Item {
84+ id: dashContentListHolder
85+ anchors.fill: parent
86+
87+ ListView {
88+ id: dashContentList
89+ objectName: "dashContentList"
90+
91+ interactive: dashContent.scopes.loaded && !previewListView.onScreen && !currentItem.moving
92+
93+ anchors.fill: parent
94+ model: dashContent.model
95+ orientation: ListView.Horizontal
96+ boundsBehavior: Flickable.DragAndOvershootBounds
97+ flickDeceleration: units.gu(625)
98+ maximumFlickVelocity: width * 5
99+ snapMode: ListView.SnapOneItem
100+ highlightMoveDuration: 250
101+ highlightRangeMode: ListView.StrictlyEnforceRange
102+ // TODO Investigate if we can switch to a smaller cache buffer when/if UbuntuShape gets more performant
103+ cacheBuffer: 1073741823
104+ onMovementStarted: dashContent.movementStarted()
105+ onMovementEnded: dashContent.movementEnded()
106+
107+ // If the number of items is less than the current index, then need to reset to another item.
108+ onCountChanged: {
109+ if (count > 0) {
110+ if (currentIndex >= count) {
111+ dashContent.setCurrentScopeAtIndex(count-1, true, true)
112+ } else if (currentIndex < 0) {
113+ // setting currentIndex directly, cause we don't want to loose set_current_index
114+ dashContent.currentIndex = 0
115+ }
116+ }
117+ }
118+
119+ delegate:
120+ Loader {
121+ width: ListView.view.width
122+ height: ListView.view.height
123+ asynchronous: true
124+ source: scopeMapper.map(scope.id)
125+ objectName: scope.id + " loader"
126+
127+ readonly property bool moving: item ? item.moving : false
128+ readonly property var categoryView: item ? item.categoryView : null
129+ readonly property Scope theScope: scope
130+
131+ // these are needed for autopilot tests
132+ readonly property string scopeId: scope.id
133+ readonly property bool isCurrent: ListView.isCurrentItem
134+ readonly property bool isLoaded: status == Loader.Ready
135+
136+ onLoaded: {
137+ item.scope = Qt.binding(function() { return scope })
138+ item.isCurrent = Qt.binding(function() { return visible && ListView.isCurrentItem })
139+ item.tabBarHeight = pageHeader.implicitHeight;
140+ item.pageHeader = pageHeader;
141+ item.openEffect = openEffect;
142+ item.previewListView = previewListView;
143+ dashContentList.movementStarted.connect(item.movementStarted)
144+ dashContent.positionedAtBeginning.connect(item.positionedAtBeginning)
145+ dashContent.scopeLoaded(item.scope.id)
146+ }
147+ Connections {
148+ target: item
149+ ignoreUnknownSignals: true
150+ onEndReached: contentEndReached()
151+ }
152+
153+ Component.onDestruction: active = false
154+ }
155+ }
156+
157+ PageHeader {
158+ id: pageHeader
159+ width: parent.width
160+ searchEntryEnabled: true
161+ searchHistory: dashContent.searchHistory
162+
163+ childItem: TabBar {
164+ id: tabBar
165+ objectName: "tabbar"
166+ height: units.gu(7)
167+ width: parent.width
168+ selectionMode: false
169+ style: DashContentTabBarStyle {}
170+
171+ model: dashContentList.model
172+
173+ onSelectedIndexChanged: {
174+ dashContentList.currentIndex = selectedIndex;
175+ }
176+
177+ Connections {
178+ target: dashContentList
179+ onCurrentIndexChanged: {
180+ tabBar.selectedIndex = dashContentList.currentIndex
181+ }
182+ }
183+
184+ Connections {
185+ target: model
186+ onCountChanged: {
187+ if (tabBar.selectedIndex < 0 && model.count > 0)
188+ tabBar.selectedIndex = 0;
189+ }
190+ }
191+
192+ Component.onCompleted: {
193+ __styleInstance.headerTextStyle = Text.Raised
194+ __styleInstance.headerTextStyleColor = "black"
195+ }
196+ }
197+ }
198+ }
199+
200+ DashContentOpenEffect {
201+ id: openEffect
202+ anchors {
203+ fill: parent
204+ bottomMargin: -bottomOverflow
205+ }
206+ sourceItem: dashContentListHolder
207+ previewListView: previewListView
208+ }
209+
210+ PreviewListView {
211+ id: previewListView
212+ openEffect: openEffect
213+ categoryView: dashContentList.currentItem ? dashContentList.currentItem.categoryView : null
214+ scope: dashContentList.currentItem ? dashContentList.currentItem.theScope : null
215+ anchors.fill: parent
216+ }
217+}
qml/Dash/DashContentOpenEffect.qmlnew file+57
@@ -0,0 +1,57 @@
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+OpenEffect {
22+ property PreviewListView previewListView: null
23+
24+ objectName: "openEffect"
25+ anchors {
26+ fill: parent
27+ bottomMargin: -bottomOverflow
28+ }
29+
30+ enabled: gap > 0.0
31+
32+ topGapPx: (1 - gap) * positionPx
33+ topOpacity: (1 - gap * 1.2)
34+ bottomGapPx: positionPx + gap * (targetBottomGapPx - positionPx)
35+ bottomOverflow: units.gu(20)
36+ live: !expansionAnimation.running
37+
38+ property int targetBottomGapPx: height - units.gu(8) - bottomOverflow
39+ property real gap: previewListView.open ? 1.0 : 0.0
40+
41+ Behavior on gap {
42+ NumberAnimation {
43+ id: expansionAnimation
44+ duration: 200
45+ easing.type: Easing.InOutQuad
46+ onRunningChanged: {
47+ if (!previewListView.open && !running) {
48+ previewListView.onScreen = false
49+ }
50+ }
51+ }
52+ }
53+ Behavior on positionPx {
54+ enabled: previewListView.open
55+ UbuntuNumberAnimation {}
56+ }
57+}
qml/Dash/DashContentTabBarStyle.qmlnew file+21
@@ -0,0 +1,21 @@
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 Ubuntu.Components.Themes.Ambiance 0.1
18+
19+TabBarStyle {
20+ indicatorImageSource: "graphics/tabbarchevron.png"
21+}
qml/Dash/DashFilterGrid.qmlnew file+65
@@ -0,0 +1,65 @@
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 "../Components"
19+import ".."
20+
21+DashRenderer {
22+ id: dashFilterGrid
23+
24+ property alias cellWidth: filterGrid.cellWidth
25+ property alias cellHeight: filterGrid.cellHeight
26+ property alias delegate: filterGrid.delegate
27+ property alias delegateWidth: filterGrid.delegateWidth
28+ property alias delegateHeight: filterGrid.delegateHeight
29+ property alias maximumNumberOfColumns: filterGrid.maximumNumberOfColumns
30+ property alias minimumHorizontalSpacing: filterGrid.minimumHorizontalSpacing
31+
32+ collapsedHeight: filterGrid.collapsedHeight
33+ collapsedRowCount: filterGrid.collapsedRowCount
34+ columns: filterGrid.columns
35+ rows: filter ? filterGrid.collapsedRowCount : filterGrid.uncollapsedRowCount
36+ currentItem: filterGrid.currentItem
37+ expandable: filterGrid.expandable
38+ height: filterGrid.height
39+ margins: filterGrid.margins
40+ uncollapsedHeight: filterGrid.uncollapsedHeight
41+ verticalSpacing: filterGrid.verticalSpacing
42+
43+ function startFilterAnimation(filter) {
44+ filterGrid.startFilterAnimation(filter)
45+ }
46+
47+ FilterGrid {
48+ id: filterGrid
49+ width: dashFilterGrid.width
50+ minimumHorizontalSpacing: units.gu(0.5)
51+ delegateWidth: units.gu(11)
52+ delegateHeight: units.gu(9.5)
53+ verticalSpacing: units.gu(2)
54+ model: dashFilterGrid.model
55+ filter: dashFilterGrid.filter
56+ highlightIndex: dashFilterGrid.highlightIndex
57+ delegateCreationBegin: dashFilterGrid.delegateCreationBegin
58+ delegateCreationEnd: dashFilterGrid.delegateCreationEnd
59+
60+ onFilterChanged: {
61+ dashFilterGrid.filter = filter
62+ filter = Qt.binding(function() { return dashFilterGrid.filter })
63+ }
64+ }
65+}
Dash/DashHome.qml → qml/Dash/DashHome.qmlrenamed

The content is the same.

Dash/DashPreview.qml → qml/Dash/DashPreview.qmlrenamed+1
@@ -25,6 +25,7 @@ Item {
25 property alias showProcessingAction: waitingForActionMouseArea.enabled
25 property alias showProcessingAction: waitingForActionMouseArea.enabled
26
26
27 property real previewWidthRatio: 0.5
27 property real previewWidthRatio: 0.5
28+ property bool isCurrent: false
28
29
29 property Component previewImages
30 property Component previewImages
30 property Component header
31 property Component header
Dash/DashPreviewPlaceholder.qml → qml/Dash/DashPreviewPlaceholder.qmlrenamed

The content is the same.

qml/Dash/DashRenderer.qmlnew file+65
@@ -0,0 +1,65 @@
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+
19+Item {
20+ // Can the item be expanded?
21+ property bool expandable: false
22+
23+ // In case it can be expanded, should we filter it
24+ property bool filter: true
25+
26+ property int collapsedRowCount: 1
27+
28+ property int collapsedHeight: height
29+
30+ property int columns: 1
31+
32+ property int rows: 1
33+
34+ // Index of the highlighted item
35+ property int highlightIndex: -1
36+
37+ property int margins: 0
38+
39+ property int uncollapsedHeight: height
40+
41+ property var delegateCreationBegin: undefined
42+
43+ property var delegateCreationEnd: undefined
44+
45+ property real verticalSpacing: 0
46+
47+ // The current item of the renderer
48+ property var currentItem
49+
50+ // The model to renderer
51+ property var model
52+
53+ /// Emitted when the user clicked on an item
54+ /// @param index is the index of the clicked item
55+ /// @param itemY is y of the clicked delegate
56+ signal clicked(int index, real itemY)
57+
58+ /// Emitted when the user pressed and held on an item
59+ /// @param index is the index of the held item
60+ /// @param itemY is y of the held delegate
61+ signal pressAndHold(int index, real itemY)
62+
63+ function startFilterAnimation(filter) {
64+ }
65+}
Dash/Generic/FlatTileStyle.qml → qml/Dash/Generic/FlatTileStyle.qmlrenamed

The content is the same.

Dash/Generic/GenericCarousel.qml → qml/Dash/Generic/GenericCarousel.qmlrenamed+3−7
@@ -17,22 +17,18 @@
17import QtQuick 2.0
17import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19import "../../Components"
19import "../../Components"
20+import ".."
20
21
21−Carousel {
22+DashCarousel {
22 id: genericCarousel
23 id: genericCarousel
23−
24− tileAspectRatio: 198 / 288
25− minimumTileWidth: units.gu(13)
26 itemComponent: carouselDelegateGeneric
24 itemComponent: carouselDelegateGeneric
27− selectedItemScaleFactor: 1.14
28− cacheBuffer: 1404 // 18px * 13gu * 6
29− height: implicitHeight + units.gu(6)
30
25
31 Component {
26 Component {
32 id: carouselDelegateGeneric
27 id: carouselDelegateGeneric
33
28
34 BaseCarouselDelegate {
29 BaseCarouselDelegate {
35 id: item
30 id: item
31+ objectName: "carouselDelegate"
36
32
37 UbuntuShape {
33 UbuntuShape {
38 anchors.fill: parent
34 anchors.fill: parent
Dash/Generic/GenericCarouselLoader.qml → qml/Dash/Generic/GenericCarouselLoader.qmlrenamed

The content is the same.

Dash/Generic/GenericFilterGrid.qml → qml/Dash/Generic/GenericFilterGrid.qmlrenamed+13−19
@@ -15,38 +15,32 @@
15 */
15 */
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18+import Ubuntu.Components 0.1
18import "../../Components"
19import "../../Components"
20+import ".."
19
21
20−FilterGrid {
22+DashFilterGrid {
21− id: filtergrid
23+ id: genericFilterGrid
24+
25+ property int iconWidth: units.gu(8)
26+ property int iconHeight: units.gu(7.5)
22
27
23 minimumHorizontalSpacing: units.gu(0.5)
28 minimumHorizontalSpacing: units.gu(0.5)
24 delegateWidth: units.gu(11)
29 delegateWidth: units.gu(11)
25 delegateHeight: units.gu(9.5)
30 delegateHeight: units.gu(9.5)
26 verticalSpacing: units.gu(2)
31 verticalSpacing: units.gu(2)
27
32
28− property int iconWidth: units.gu(8)
29− property int iconHeight: units.gu(7.5)
30−
31− signal clicked(int index, real itemY)
32− signal pressAndHold(int index, real itemY)
33−
34 delegate: Tile {
33 delegate: Tile {
35 id: tile
34 id: tile
36 objectName: "delegate" + index
35 objectName: "delegate" + index
37− width: filtergrid.cellWidth
36+ width: genericFilterGrid.cellWidth
38− height: filtergrid.cellHeight
37+ height: genericFilterGrid.cellHeight
39 text: model.title
38 text: model.title
40− imageWidth: filtergrid.iconWidth
39+ imageWidth: genericFilterGrid.iconWidth
41− imageHeight: filtergrid.iconHeight
40+ imageHeight: genericFilterGrid.iconHeight
42 source: model.icon
41 source: model.icon
43
42
44− onClicked: {
45− filtergrid.clicked(index, tile.y)
43+ onClicked: genericFilterGrid.clicked(index, tile.y)
46− }
47−
48− onPressAndHold: {
49− filtergrid.pressAndHold(index, tile.y)
44+ onPressAndHold: genericFilterGrid.pressAndHold(index, tile.y)
50− }
51 }
45 }
52}
46}
Dash/Generic/GenericFilterGridPotrait.qml → qml/Dash/Generic/GenericFilterGridPotrait.qmlrenamed+1−3
@@ -15,16 +15,14 @@
15 */
15 */
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18+import Ubuntu.Components 0.1
18import "../../Components"
19import "../../Components"
19
20
20GenericFilterGrid {
21GenericFilterGrid {
21− id: filtergrid
22−
23 minimumHorizontalSpacing: units.gu(0.5)
22 minimumHorizontalSpacing: units.gu(0.5)
24 delegateWidth: units.gu(11)
23 delegateWidth: units.gu(11)
25 delegateHeight: units.gu(18)
24 delegateHeight: units.gu(18)
26 verticalSpacing: units.gu(2)
25 verticalSpacing: units.gu(2)
27−
28 iconWidth: (width / columns) * 0.8
26 iconWidth: (width / columns) * 0.8
29 iconHeight: iconWidth * 16 / 11
27 iconHeight: iconWidth * 16 / 11
30}
28}
Dash/Generic/GenericPreview.qml → qml/Dash/Generic/GenericPreview.qmlrenamed

The content is the same.

Dash/Generic/WeatherFilterGrid.qml → qml/Dash/Generic/WeatherFilterGrid.qmlrenamed

The content is the same.

Dash/GenericScopeView.qml → qml/Dash/GenericScopeView.qmlrenamed+45−234
@@ -27,15 +27,18 @@ FocusScope {
27 property Scope scope
27 property Scope scope
28 property SortFilterProxyModel categories: categoryFilter
28 property SortFilterProxyModel categories: categoryFilter
29 property bool isCurrent
29 property bool isCurrent
30− property ListModel searchHistory
31 property alias moving: categoryView.moving
30 property alias moving: categoryView.moving
31+ property int tabBarHeight: 0
32+ property PageHeader pageHeader: null
33+ property OpenEffect openEffect: null
34+ property Item previewListView: null
32
35
33 signal endReached
36 signal endReached
34 signal movementStarted
37 signal movementStarted
35 signal positionedAtBeginning
38 signal positionedAtBeginning
36
39
37− readonly property alias previewShown: previewListView.onScreen
38 property bool enableHeightBehaviorOnNextCreation: false
40 property bool enableHeightBehaviorOnNextCreation: false
41+ property var categoryView: categoryView
39
42
40 // FIXME delay the search so that daemons have time to settle, note that
43 // FIXME delay the search so that daemons have time to settle, note that
41 // removing this will break ScopeView::test_changeScope
44 // removing this will break ScopeView::test_changeScope
@@ -46,8 +49,8 @@ FocusScope {
46 }
49 }
47 }
50 }
48
51
49− function activateApp(desktopFilePath) {
52+ function activateApp(appId) {
50− shell.activateApplication(desktopFilePath);
53+ shell.activateApplication(appId);
51 }
54 }
52
55
53 Binding {
56 Binding {
@@ -84,12 +87,14 @@ FocusScope {
84 target: scopeView.scope
87 target: scopeView.scope
85 property: "searchQuery"
88 property: "searchQuery"
86 value: pageHeader.searchQuery
89 value: pageHeader.searchQuery
90+ when: isCurrent
87 }
91 }
88
92
89 Binding {
93 Binding {
90 target: pageHeader
94 target: pageHeader
91 property: "searchQuery"
95 property: "searchQuery"
92 value: scopeView.scope.searchQuery
96 value: scopeView.scope.searchQuery
97+ when: isCurrent
93 }
98 }
94
99
95 Connections {
100 Connections {
@@ -119,6 +124,10 @@ FocusScope {
119 property string expandedCategoryId: ""
124 property string expandedCategoryId: ""
120 signal correctExpandedCategory();
125 signal correctExpandedCategory();
121
126
127+ onContentYChanged: pageHeader.positionRealHeader();
128+ onOriginYChanged: pageHeader.positionRealHeader();
129+ onContentHeightChanged: pageHeader.positionRealHeader();
130+
122 Behavior on contentY {
131 Behavior on contentY {
123 enabled: previewListView.open
132 enabled: previewListView.open
124 UbuntuNumberAnimation {}
133 UbuntuNumberAnimation {}
@@ -126,6 +135,7 @@ FocusScope {
126
135
127 delegate: ListItems.Base {
136 delegate: ListItems.Base {
128 id: baseItem
137 id: baseItem
138+ objectName: "dashCategory" + category
129 highlightWhenPressed: false
139 highlightWhenPressed: false
130
140
131 readonly property bool expandable: rendererLoader.item ? rendererLoader.item.expandable : false
141 readonly property bool expandable: rendererLoader.item ? rendererLoader.item.expandable : false
@@ -140,7 +150,7 @@ FocusScope {
140 right: parent.right
150 right: parent.right
141 }
151 }
142
152
143− source: getRenderer(model.renderer, model.contentType, model.rendererHint)
153+ source: getRenderer(model.renderer, model.contentType, model.rendererHint, results)
144
154
145 onLoaded: {
155 onLoaded: {
146 if (item.enableHeightBehavior !== undefined && item.enableHeightBehaviorOnNextCreation !== undefined) {
156 if (item.enableHeightBehavior !== undefined && item.enableHeightBehaviorOnNextCreation !== undefined) {
@@ -175,7 +185,7 @@ FocusScope {
175 target: rendererLoader.item
185 target: rendererLoader.item
176 onClicked: {
186 onClicked: {
177 // Prepare the preview in case activate() triggers a preview only
187 // Prepare the preview in case activate() triggers a preview only
178− effect.positionPx = Math.max(mapToItem(categoryView, 0, itemY).y, pageHeader.height + categoryView.stickyHeaderHeight);
188+ openEffect.positionPx = Math.max(mapToItem(categoryView, 0, itemY).y, pageHeader.height + categoryView.stickyHeaderHeight);
179 previewListView.categoryId = categoryId
189 previewListView.categoryId = categoryId
180 previewListView.categoryDelegate = rendererLoader.item
190 previewListView.categoryDelegate = rendererLoader.item
181 previewListView.model = target.model;
191 previewListView.model = target.model;
@@ -191,12 +201,12 @@ FocusScope {
191 } else {
201 } else {
192 previewListView.open = true
202 previewListView.open = true
193
203
194− scopeView.scope.preview( item.uri, item.icon, item.category, 0, item.mimetype, item.title,
204+ scopeView.scope.preview(item.uri, item.icon, item.category, 0, item.mimetype, item.title,
195− item.comment, item.dndUri, item.metadata)
205+ item.comment, item.dndUri, item.metadata)
196 }
206 }
197 }
207 }
198 onPressAndHold: {
208 onPressAndHold: {
199− effect.positionPx = Math.max(mapToItem(categoryView, 0, itemY).y, pageHeader.height + categoryView.stickyHeaderHeight);
209+ openEffect.positionPx = Math.max(mapToItem(categoryView, 0, itemY).y, pageHeader.height + categoryView.stickyHeaderHeight);
200 previewListView.categoryId = categoryId
210 previewListView.categoryId = categoryId
201 previewListView.categoryDelegate = rendererLoader.item
211 previewListView.categoryDelegate = rendererLoader.item
202 previewListView.model = target.model;
212 previewListView.model = target.model;
@@ -205,7 +215,7 @@ FocusScope {
205 previewListView.open = true
215 previewListView.open = true
206
216
207 var item = target.model.get(index)
217 var item = target.model.get(index)
208− scopeView.scope.preview( item.uri, item.icon, item.category, 0, item.mimetype, item.title,
218+ scopeView.scope.preview(item.uri, item.icon, item.category, 0, item.mimetype, item.title,
209 item.comment, item.dndUri, item.metadata)
219 item.comment, item.dndUri, item.metadata)
210 }
220 }
211 }
221 }
@@ -271,6 +281,7 @@ FocusScope {
271
281
272 sectionProperty: "name"
282 sectionProperty: "name"
273 sectionDelegate: ListItems.Header {
283 sectionDelegate: ListItems.Header {
284+ objectName: "dashSectionHeader" + delegate.category
274 property var delegate: categoryView.item(delegateIndex)
285 property var delegate: categoryView.item(delegateIndex)
275 width: categoryView.width
286 width: categoryView.width
276 text: section
287 text: section
@@ -286,14 +297,20 @@ FocusScope {
286 categoryView.expandedCategoryId = "";
297 categoryView.expandedCategoryId = "";
287 }
298 }
288 }
299 }
289− pageHeader: PageHeader {
300+ pageHeader: Item {
290− id: pageHeader
301+ implicitHeight: scopeView.tabBarHeight
291− objectName: "pageHeader"
302+ onHeightChanged: {
292− width: categoryView.width
303+ if (scopeView.pageHeader) {
293− text: scopeView.scope.name
304+ scopeView.pageHeader.height = height;
294− searchEntryEnabled: true
305+ }
306+ }
307+ onYChanged: positionRealHeader();
308+
309+ function positionRealHeader() {
295− scope: scopeView.scope
310+ if (scopeView.pageHeader) {
296− searchHistory: scopeView.searchHistory
311+ scopeView.pageHeader.y = y + parent.y;
312+ }
313+ }
297 }
314 }
298 }
315 }
299
316
@@ -303,16 +320,21 @@ FocusScope {
303 }
320 }
304 }
321 }
305
322
306− function getRenderer(rendererId, contentType, rendererHint) {
323+ function getRenderer(rendererId, contentType, rendererHint, results) {
307 if (rendererId == "default") {
324 if (rendererId == "default") {
308 rendererId = getDefaultRendererId(contentType);
325 rendererId = getDefaultRendererId(contentType);
309 }
326 }
327+ if (rendererId == "carousel") {
328+ // Selectively disable carousel, 6 is fixed for now, should change on the form factor
329+ if (results.count <= 6)
330+ rendererId = "grid"
331+ }
310 switch (rendererId) {
332 switch (rendererId) {
311 case "carousel": {
333 case "carousel": {
312 switch (contentType) {
334 switch (contentType) {
313− case "music": return "Music/MusicCarouselLoader.qml";
335+ case "music": return "Music/MusicCarousel.qml";
314− case "video": return "Video/VideoCarouselLoader.qml";
336+ case "video": return "Video/VideoCarousel.qml";
315− default: return "Generic/GenericCarouselLoader.qml";
337+ default: return "Generic/GenericCarousel.qml";
316 }
338 }
317 }
339 }
318 case "grid": {
340 case "grid": {
@@ -339,44 +361,6 @@ FocusScope {
339 }
361 }
340 }
362 }
341
363
342− OpenEffect {
343− id: effect
344− objectName: "openEffect"
345− anchors {
346− fill: parent
347− bottomMargin: -bottomOverflow
348− }
349− sourceItem: categoryView
350−
351− enabled: gap > 0.0
352−
353− topGapPx: (1 - gap) * positionPx
354− topOpacity: (1 - gap * 1.2)
355− bottomGapPx: positionPx + gap * (targetBottomGapPx - positionPx)
356− bottomOverflow: units.gu(20)
357− live: !expansionAnimation.running
358−
359− property int targetBottomGapPx: height - units.gu(8) - bottomOverflow
360− property real gap: previewListView.open ? 1.0 : 0.0
361−
362− Behavior on gap {
363− NumberAnimation {
364− id: expansionAnimation
365− duration: 200
366− easing.type: Easing.InOutQuad
367− onRunningChanged: {
368− if (!previewListView.open && !running) {
369− previewListView.onScreen = false
370− }
371− }
372− }
373− }
374− Behavior on positionPx {
375− enabled: previewListView.open
376− UbuntuNumberAnimation {}
377− }
378− }
379−
380 Connections {
364 Connections {
381 target: scopeView.scope
365 target: scopeView.scope
382 onPreviewReady: {
366 onPreviewReady: {
@@ -395,186 +379,13 @@ FocusScope {
395 }
379 }
396 }
380 }
397
381
398− PreviewDelegateMapper {
399− id: previewDelegateMapper
400− }
401−
402− ListView {
403− id: previewListView
404− objectName: "previewListView"
405− height: effect.bottomGapPx - effect.topGapPx
406− anchors {
407− top: parent.top
408− topMargin: effect.topGapPx
409− left: parent.left
410− right: parent.right
411− }
412− orientation: ListView.Horizontal
413− highlightRangeMode: ListView.StrictlyEnforceRange
414− snapMode: ListView.SnapOneItem
415− boundsBehavior: Flickable.DragAndOvershootBounds
416− highlightMoveDuration: 250
417− flickDeceleration: units.gu(625)
418− maximumFlickVelocity: width * 5
419− cacheBuffer: 0
420−
421− // To be set before opening the preview
422− property string categoryId: ""
423− property var categoryDelegate
424−
425− // because the ListView is built asynchronous, setting the
426− // currentIndex directly won't work. We need to refresh it
427− // when the first preview is ready to be displayed.
428− property bool init: true
429−
430− onCurrentIndexChanged: {
431− var row = Math.floor(currentIndex / categoryDelegate.columns);
432− if (categoryDelegate.collapsedRowCount <= row) {
433− categoryView.expandedCategoryId = categoryId
434− }
435−
436− if (open) {
437− categoryDelegate.highlightIndex = currentIndex
438− }
439−
440− if (!init && model !== undefined) {
441− var item = model.get(currentIndex)
442− scopeView.scope.preview(item.uri, item.icon, item.category, 0, item.mimetype, item.title, item.comment, item.dndUri, item.metadata)
443− }
444−
445− var itemY = categoryView.contentItem.mapFromItem(categoryDelegate.currentItem).y;
446−
447− // Find new contentY and effect.postionPx
448− var newContentY = itemY - effect.positionPx - categoryDelegate.verticalSpacing;
449−
450− // Make sure the item is not covered by a header. Move the effect split down if necessary
451− var headerHeight = pageHeader.height + categoryView.stickyHeaderHeight;
452− var effectAdjust = Math.max(effect.positionPx, headerHeight);
453−
454− // Make sure we don't overscroll the listview. If yes, adjust effect position
455− if (newContentY < 0) {
456− effectAdjust += newContentY;
457− newContentY = 0;
458− }
459− if (newContentY > Math.max(0, categoryView.contentHeight - categoryView.height)) {
460− effectAdjust += -(categoryView.contentHeight - categoryView.height) + newContentY
461− newContentY = categoryView.contentHeight - categoryView.height;
462− }
463−
464− effect.positionPx = effectAdjust;
465− categoryView.contentY = newContentY;
466− }
467−
468− property bool open: false
469− property bool onScreen: false
470−
471− onOpenChanged: {
472− if (open) {
473− onScreen = true;
474− categoryDelegate.highlightIndex = currentIndex;
475− pageHeader.unfocus();
476− } else {
477− // Cancel any pending preview requests or actions
478− if (previewListView.currentItem.previewData !== undefined) {
479− previewListView.currentItem.previewData.cancelAction();
480− }
481− scopeView.scope.cancelActivation();
482− model = undefined;
483− categoryView.correctExpandedCategory();
484− categoryDelegate.highlightIndex = -1;
485− }
486− }
487−
488− Rectangle {
489− anchors.fill: parent
490− color: Qt.rgba(0, 0, 0, .3)
491− z: -1
492− }
493−
494− delegate: Loader {
495− id: previewLoader
496− objectName: "previewLoader" + index
497− height: previewListView.height
498− width: previewListView.width
499− asynchronous: true
500− source: previewListView.onScreen ?
501− (previewData !== undefined ? previewDelegateMapper.map(previewData.rendererName) : "DashPreviewPlaceholder.qml") : ""
502−
503− onPreviewDataChanged: {
504− if (previewData !== undefined && source.toString().indexOf("DashPreviewPlaceholder.qml") != -1) {
505− previewLoader.opacity = 0;
506− }
507− }
508−
509− onSourceChanged: {
510− if (previewData !== undefined) {
511− fadeIn.start()
512− }
513− }
514−
515− PropertyAnimation {
516− id: fadeIn
517− target: previewLoader
518− property: "opacity"
519− from: 0.0
520− to: 1.0
521− duration: UbuntuAnimation.BriskDuration
522− }
523−
524− property var previewData
525− property bool valid: item !== null
526−
527− onLoaded: {
528− if (previewListView.onScreen && previewData !== undefined) {
529− item.previewData = Qt.binding(function() { return previewData })
530− }
531− }
532−
533− Connections {
534− ignoreUnknownSignals: true
535− target: item
536− onClose: {
537− previewListView.open = false
538− }
539− }
540−
541− function closePreviewSpinner() {
542− if(item) {
543− item.showProcessingAction = false;
544− }
545− }
546− }
547− }
548−
549− Image {
550− objectName: "pointerArrow"
551− anchors {
552− top: previewListView.bottom
553− left: parent.left
554− leftMargin: previewListView.categoryDelegate !== undefined && previewListView.categoryDelegate.currentItem ?
555− previewListView.categoryDelegate.currentItem.center + (-width + margins) / 2 : 0
556−
557− Behavior on leftMargin {
558− SmoothedAnimation {
559− duration: UbuntuAnimation.FastDuration
560− }
561− }
562− }
563− height: units.gu(1)
564− width: units.gu(2)
565− property int margins: previewListView.categoryDelegate ? previewListView.categoryDelegate.margins : 0
566− opacity: previewListView.open ? .5 : 0
567−
568− source: "graphics/tooltip_arrow.png"
569− }
570−
571 // TODO: Move as InverseMouseArea to DashPreview
382 // TODO: Move as InverseMouseArea to DashPreview
572 MouseArea {
383 MouseArea {
573 objectName: "closePreviewMouseArea"
384 objectName: "closePreviewMouseArea"
574 enabled: previewListView.onScreen
385 enabled: previewListView.onScreen
575 anchors {
386 anchors {
576 fill: parent
387 fill: parent
577− topMargin: effect.bottomGapPx
388+ topMargin: openEffect.bottomGapPx
578 }
389 }
579 onClicked: {
390 onClicked: {
580 previewListView.open = false;
391 previewListView.open = false;
Dash/Movie/MoviePreview.qml → qml/Dash/Movie/MoviePreview.qmlrenamed

The content is the same.

Dash/Music/CarouselDelegateMusic.qml → qml/Dash/Music/CarouselDelegateMusic.qmlrenamed

The content is the same.

Dash/Music/MusicCarousel.qml → qml/Dash/Music/MusicCarousel.qmlrenamed+2−2
@@ -16,15 +16,15 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import "../../Components"
18import "../../Components"
19+import ".."
19
20
20−Carousel {
21+DashCarousel {
21 id: musicCarousel
22 id: musicCarousel
22 tileAspectRatio: 1
23 tileAspectRatio: 1
23 minimumTileWidth: units.gu(13)
24 minimumTileWidth: units.gu(13)
24 itemComponent: carouselDelegateMusic
25 itemComponent: carouselDelegateMusic
25 selectedItemScaleFactor: 1.2
26 selectedItemScaleFactor: 1.2
26 cacheBuffer: 1404 // 18px * 13gu * 6
27 cacheBuffer: 1404 // 18px * 13gu * 6
27− height: implicitHeight + units.gu(6)
28
28
29 Component {
29 Component {
30 id: carouselDelegateMusic
30 id: carouselDelegateMusic
Dash/Music/MusicCarouselLoader.qml → qml/Dash/Music/MusicCarouselLoader.qmlrenamed

The content is the same.

Dash/Music/MusicFilterGrid.qml → qml/Dash/Music/MusicFilterGrid.qmlrenamed+7−13
@@ -19,22 +19,21 @@ import "../../Components"
19import "../Generic"
19import "../Generic"
20
20
21GenericFilterGrid {
21GenericFilterGrid {
22− id: filtergrid
22+ id: musicFilterGrid
23
23
24 delegateWidth: units.gu(11)
24 delegateWidth: units.gu(11)
25 delegateHeight: units.gu(16)
25 delegateHeight: units.gu(16)
26−
27 iconWidth: units.gu(11)
26 iconWidth: units.gu(11)
28 iconHeight: units.gu(11)
27 iconHeight: units.gu(11)
29
28
30 delegate: Tile {
29 delegate: Tile {
31 id: tile
30 id: tile
32 objectName: "delegate" + index
31 objectName: "delegate" + index
33− width: filtergrid.cellWidth
32+ width: musicFilterGrid.cellWidth
34− height: filtergrid.cellHeight
33+ height: musicFilterGrid.cellHeight
35 text: model.comment
34 text: model.comment
36− imageWidth: filtergrid.iconWidth
35+ imageWidth: musicFilterGrid.iconWidth
37− imageHeight: filtergrid.iconHeight
36+ imageHeight: musicFilterGrid.iconHeight
38 source: model.icon
37 source: model.icon
39 maximumLineCount: 2
38 maximumLineCount: 2
40 horizontalAlignment: Text.AlignLeft
39 horizontalAlignment: Text.AlignLeft
@@ -43,12 +42,7 @@ GenericFilterGrid {
43 artist: model.title
42 artist: model.title
44 }
43 }
45
44
46− onClicked: {
47− filtergrid.clicked(index, tile.y)
45+ onClicked: musicFilterGrid.clicked(index, tile.y)
48− }
49−
50− onPressAndHold: {
51− filtergrid.pressAndHold(index, tile.y)
46+ onPressAndHold: musicFilterGrid.pressAndHold(index, tile.y)
52− }
53 }
47 }
54}
48}
qml/Dash/Music/MusicPreview.qmlnew file+203
@@ -0,0 +1,203 @@
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 QtMultimedia 5.0
19+import Ubuntu.Components 0.1
20+import Ubuntu.Components.ListItems 0.1
21+import ".."
22+import "../Generic"
23+import "../../Components"
24+import "../Previews"
25+
26+GenericPreview {
27+ id: root
28+
29+ previewImages: previewImageComponent
30+ header: headerComponent
31+ description: descriptionComponent
32+
33+ Component {
34+ id: previewImageComponent
35+ LazyImage {
36+ height: units.gu(22)
37+ scaleTo: "height"
38+ source: previewData ? previewData.image : ""
39+ initialHeight: height
40+ initialWidth: height
41+ }
42+ }
43+
44+ Component {
45+ id: headerComponent
46+ Header {
47+ title: previewData.title
48+ subtitle: previewData.subtitle
49+ }
50+ }
51+
52+ Component {
53+ id: descriptionComponent
54+
55+ Item {
56+ height: childrenRect.height
57+ Audio {
58+ id: audioPlayer
59+ objectName: "audioPlayer"
60+ property real progress: audioPlayer.position / audioPlayer.duration
61+
62+ property Item playingItem
63+
64+ Component.onDestruction: {
65+ audioPlayer.stop();
66+ }
67+
68+ onErrorStringChanged: console.warn("Audio player error:", errorString)
69+
70+ }
71+
72+ Connections {
73+ target: root
74+ onIsCurrentChanged: {
75+ if (!root.isCurrent) {
76+ audioPlayer.stop();
77+ }
78+ }
79+ }
80+
81+ Column {
82+ anchors { left: parent.left; right: parent.right }
83+ visible: trackRepeater.count > 0
84+
85+ ThinDivider {
86+ objectName: "topDivider"
87+ anchors { left: parent.left; right: parent.right }
88+ }
89+
90+ Repeater {
91+ id: trackRepeater
92+ objectName: "trackRepeater"
93+
94+ model: previewData.tracks
95+
96+ delegate: Item {
97+ id: trackItem
98+ objectName: "trackItem" + index
99+ anchors { left: parent.left; right: parent.right }
100+ height: units.gu(5)
101+ property bool isPlayingItem: audioPlayer.playingItem == trackItem
102+
103+ function play() {
104+ audioPlayer.stop();
105+ // Make sure we change the source, even if two items point to the same uri location
106+ audioPlayer.source = "";
107+ audioPlayer.source = model.uri;
108+ audioPlayer.playingItem = trackItem;
109+ audioPlayer.play();
110+ }
111+
112+ Row {
113+ id: trackRow
114+ width: parent.width
115+ spacing: units.gu(1)
116+ property int column1Width: units.gu(3)
117+ property int column2Width: width - (2 * spacing) - column1Width - column3Width
118+ property int column3Width: units.gu(4)
119+ anchors.verticalCenter: parent.verticalCenter
120+
121+ Button {
122+ objectName: "playButton"
123+ width: trackRow.column1Width
124+ height: width
125+ iconSource: audioPlayer.playbackState == Audio.PlayingState && trackItem.isPlayingItem ? "image://theme/media-playback-pause" : "image://theme/media-playback-start"
126+
127+ // Can't be "transparent" or "#00xxxxxx" as the button optimizes away the surrounding shape
128+ // FIXME when this is resolved: https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1251685
129+ color: "#01000000"
130+
131+ onClicked: {
132+ if (trackItem.isPlayingItem) {
133+ if (audioPlayer.playbackState == Audio.PlayingState) {
134+ audioPlayer.pause();
135+ } else if (audioPlayer.playbackState == Audio.PausedState){
136+ audioPlayer.play();
137+ }
138+ } else {
139+ trackItem.play();
140+ }
141+ }
142+ }
143+
144+ Label {
145+ objectName: "trackTitleLabel"
146+ fontSize: "small"
147+ opacity: 0.9
148+ color: "white"
149+ horizontalAlignment: Text.AlignLeft
150+ anchors.verticalCenter: parent.verticalCenter
151+ width: parent.column2Width
152+ text: title
153+ style: Text.Raised
154+ styleColor: "black"
155+ elide: Text.ElideRight
156+
157+ UbuntuShape {
158+ id: progressBarFill
159+ objectName: "progressBarFill"
160+ color: UbuntuColors.orange
161+ anchors.left: progressBarImage.left
162+ anchors.right: progressBarImage.right
163+ anchors.verticalCenter: progressBarImage.verticalCenter
164+ height: units.dp(2)
165+ anchors.margins: units.dp(2)
166+ anchors.rightMargin: maxWidth - (maxWidth * audioPlayer.progress) + units.dp(2)
167+ visible: progressBarImage.visible
168+ property int maxWidth: progressBarImage.width - units.dp(4)
169+ }
170+
171+ Image {
172+ id: progressBarImage
173+ anchors { left: parent.left; top: parent.bottom; right: parent.right }
174+ height: units.dp(6)
175+ visible: audioPlayer.playbackState != Audio.StoppedState && trackItem.isPlayingItem && model.length.length > 0
176+ source: "graphics/music_progress_bg.png"
177+ }
178+ }
179+
180+ Label {
181+ id: valueLabel
182+ objectName: "timeLabel"
183+ fontSize: "small"
184+ opacity: 0.9
185+ color: "white"
186+ anchors.verticalCenter: parent.verticalCenter
187+ horizontalAlignment: Text.AlignRight
188+ width: parent.column3Width
189+ text: length
190+ style: Text.Raised
191+ styleColor: "black"
192+ }
193+ }
194+
195+ ThinDivider {
196+ anchors { left: parent.left; bottom: parent.bottom; right: parent.right }
197+ }
198+ }
199+ }
200+ }
201+ }
202+ }
203+}
Dash/Music/MusicTileStyle.qml → qml/Dash/Music/MusicTileStyle.qmlrenamed

The content is the same.

qml/Dash/Music/graphics/music_progress_bg.pngnew file

Binary file not shown.

Dash/PreviewDelegateMapper.qml → qml/Dash/PreviewDelegateMapper.qmlrenamed+1
@@ -23,6 +23,7 @@ QtObject {
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 "preview-movie": "Movie/MoviePreview.qml",
26+ "preview-music": "Music/MusicPreview.qml",
26 }
27 }
27 }
28 }
28
29
qml/Dash/PreviewListView.qmlnew file+212
@@ -0,0 +1,212 @@
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 Unity 0.1
20+import "../Components"
21+
22+Item {
23+ property OpenEffect openEffect: null
24+ property ScopeListView categoryView: null
25+ property Scope scope: null
26+
27+ property alias open: previewListView.open
28+ property alias onScreen: previewListView.onScreen
29+ property alias categoryId: previewListView.categoryId
30+ property alias categoryDelegate: previewListView.categoryDelegate
31+ property alias init: previewListView.init
32+ property alias model: previewListView.model
33+ property alias currentIndex: previewListView.currentIndex
34+ property alias currentItem: previewListView.currentItem
35+
36+ Image {
37+ objectName: "pointerArrow"
38+ anchors {
39+ top: previewListView.bottom
40+ left: parent.left
41+ leftMargin: previewListView.categoryDelegate !== undefined && previewListView.categoryDelegate.currentItem ?
42+ previewListView.categoryDelegate.currentItem.center + (-width + margins) / 2 : 0
43+
44+ Behavior on leftMargin {
45+ SmoothedAnimation {
46+ duration: UbuntuAnimation.FastDuration
47+ }
48+ }
49+ }
50+ height: units.gu(1)
51+ width: units.gu(2)
52+ property int margins: previewListView.categoryDelegate ? previewListView.categoryDelegate.margins : 0
53+ opacity: previewListView.open ? .5 : 0
54+
55+ source: "graphics/tooltip_arrow.png"
56+ }
57+
58+ ListView {
59+ id: previewListView
60+ objectName: "previewListView"
61+ height: openEffect.bottomGapPx - openEffect.topGapPx
62+ anchors {
63+ top: parent.top
64+ topMargin: openEffect.topGapPx
65+ left: parent.left
66+ right: parent.right
67+ }
68+ orientation: ListView.Horizontal
69+ highlightRangeMode: ListView.StrictlyEnforceRange
70+ snapMode: ListView.SnapOneItem
71+ boundsBehavior: Flickable.DragAndOvershootBounds
72+ highlightMoveDuration: 250
73+ flickDeceleration: units.gu(625)
74+ maximumFlickVelocity: width * 5
75+ cacheBuffer: 0
76+
77+ // To be set before opening the preview
78+ property string categoryId: ""
79+ property var categoryDelegate
80+
81+ // because the ListView is built asynchronous, setting the
82+ // currentIndex directly won't work. We need to refresh it
83+ // when the first preview is ready to be displayed.
84+ property bool init: true
85+
86+ PreviewDelegateMapper {
87+ id: previewDelegateMapper
88+ }
89+
90+ onCurrentIndexChanged: {
91+ var row = Math.floor(currentIndex / categoryDelegate.columns);
92+ if (categoryDelegate.collapsedRowCount <= row) {
93+ categoryView.expandedCategoryId = categoryId
94+ }
95+
96+ if (open) {
97+ categoryDelegate.highlightIndex = currentIndex
98+ }
99+
100+ if (!init && model !== undefined) {
101+ var item = model.get(currentIndex)
102+ scope.preview(item.uri, item.icon, item.category, 0, item.mimetype, item.title, item.comment, item.dndUri, item.metadata)
103+ }
104+
105+ // Adjust contentY in case we need to change to it to show the next row
106+ if (categoryDelegate.rows > 1) {
107+ var itemY = categoryView.contentItem.mapFromItem(categoryDelegate.currentItem).y;
108+
109+ // Find new contentY and effect.postionPx
110+ var newContentY = itemY - openEffect.positionPx - categoryDelegate.verticalSpacing;
111+
112+ // Make sure the item is not covered by a header. Move the effect split down if necessary
113+ var headerHeight = pageHeader.height + categoryView.stickyHeaderHeight;
114+ var effectAdjust = Math.max(openEffect.positionPx, headerHeight);
115+
116+ // Make sure we don't overscroll the listview. If yes, adjust effect position
117+ if (newContentY < 0) {
118+ effectAdjust += newContentY;
119+ newContentY = 0;
120+ }
121+ if (newContentY > Math.max(0, categoryView.contentHeight - categoryView.height)) {
122+ effectAdjust += -(categoryView.contentHeight - categoryView.height) + newContentY
123+ newContentY = categoryView.contentHeight - categoryView.height;
124+ }
125+
126+ openEffect.positionPx = effectAdjust;
127+ categoryView.contentY = newContentY;
128+ }
129+ }
130+
131+ property bool open: false
132+ property bool onScreen: false
133+
134+ onOpenChanged: {
135+ if (open) {
136+ onScreen = true;
137+ categoryDelegate.highlightIndex = currentIndex;
138+ pageHeader.unfocus();
139+ } else {
140+ // Cancel any pending preview requests or actions
141+ if (previewListView.currentItem.previewData !== undefined) {
142+ previewListView.currentItem.previewData.cancelAction();
143+ }
144+ scope.cancelActivation();
145+ model = undefined;
146+ categoryView.correctExpandedCategory();
147+ categoryDelegate.highlightIndex = -1;
148+ }
149+ }
150+
151+ Rectangle {
152+ anchors.fill: parent
153+ color: Qt.rgba(0, 0, 0, .3)
154+ z: -1
155+ }
156+
157+ delegate: Loader {
158+ id: previewLoader
159+ objectName: "previewLoader" + index
160+ height: previewListView.height
161+ width: previewListView.width
162+ asynchronous: true
163+ source: previewListView.onScreen ?
164+ (previewData !== undefined ? previewDelegateMapper.map(previewData.rendererName) : "DashPreviewPlaceholder.qml") : ""
165+
166+ onPreviewDataChanged: {
167+ if (previewData !== undefined && source.toString().indexOf("DashPreviewPlaceholder.qml") != -1) {
168+ previewLoader.opacity = 0;
169+ }
170+ }
171+
172+ onSourceChanged: {
173+ if (previewData !== undefined) {
174+ fadeIn.start()
175+ }
176+ }
177+
178+ PropertyAnimation {
179+ id: fadeIn
180+ target: previewLoader
181+ property: "opacity"
182+ from: 0.0
183+ to: 1.0
184+ duration: UbuntuAnimation.BriskDuration
185+ }
186+
187+ property var previewData
188+ property bool valid: item !== null
189+
190+ onLoaded: {
191+ if (previewListView.onScreen && previewData !== undefined) {
192+ item.previewData = Qt.binding(function() { return previewData })
193+ item.isCurrent = Qt.binding(function() { return ListView.isCurrentItem })
194+ }
195+ }
196+
197+ Connections {
198+ ignoreUnknownSignals: true
199+ target: item
200+ onClose: {
201+ previewListView.open = false
202+ }
203+ }
204+
205+ function closePreviewSpinner() {
206+ if (item) {
207+ item.showProcessingAction = false;
208+ }
209+ }
210+ }
211+ }
212+}
Dash/Previews/Header.qml → qml/Dash/Previews/Header.qmlrenamed

The content is the same.

Dash/Previews/Reviews.qml → qml/Dash/Previews/Reviews.qmlrenamed

The content is the same.

Dash/ScopeDelegateMapper.qml → qml/Dash/ScopeDelegateMapper.qmlrenamed

The content is the same.

Dash/ScopeListView.qml → qml/Dash/ScopeListView.qmlrenamed+1−1
@@ -15,7 +15,7 @@
15 */
15 */
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18−import ListViewWithPageHeader 0.1
18+import DashViews 0.1
19
19
20ListViewWithPageHeader {
20ListViewWithPageHeader {
21 maximumFlickVelocity: height * 10
21 maximumFlickVelocity: height * 10
Dash/SearchableResultModel.qml → qml/Dash/SearchableResultModel.qmlrenamed

The content is the same.

Dash/Video/CarouselDelegateVideo.qml → qml/Dash/Video/CarouselDelegateVideo.qmlrenamed

The content is the same.

Dash/Video/VideoCarousel.qml → qml/Dash/Video/VideoCarousel.qmlrenamed+2−2
@@ -16,15 +16,15 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import "../../Components"
18import "../../Components"
19+import ".."
19
20
20−Carousel {
21+DashCarousel {
21 id: videosCarousel
22 id: videosCarousel
22 tileAspectRatio: 198 / 288
23 tileAspectRatio: 198 / 288
23 minimumTileWidth: units.gu(13)
24 minimumTileWidth: units.gu(13)
24 itemComponent: carouselDelegateVideo
25 itemComponent: carouselDelegateVideo
25 selectedItemScaleFactor: 1.14
26 selectedItemScaleFactor: 1.14
26 cacheBuffer: 1404 // 18px * 13gu * 6
27 cacheBuffer: 1404 // 18px * 13gu * 6
27− height: implicitHeight + units.gu(6)
28
28
29 Component {
29 Component {
30 id: carouselDelegateVideo
30 id: carouselDelegateVideo
Dash/Video/VideoCarouselLoader.qml → qml/Dash/Video/VideoCarouselLoader.qmlrenamed

The content is the same.

Dash/Video/VideoFilterGrid.qml → qml/Dash/Video/VideoFilterGrid.qmlrenamed+8−13
@@ -15,38 +15,33 @@
15 */
15 */
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18+import Ubuntu.Components 0.1
18import "../../Components"
19import "../../Components"
19import "../Generic"
20import "../Generic"
20
21
21GenericFilterGrid {
22GenericFilterGrid {
22− id: filtergrid
23+ id: videoFilterGrid
23
24
24 delegateWidth: units.gu(11)
25 delegateWidth: units.gu(11)
25 delegateHeight: units.gu(15)
26 delegateHeight: units.gu(15)
26−
27 iconWidth: units.gu(11)
27 iconWidth: units.gu(11)
28 iconHeight: units.gu(11)
28 iconHeight: units.gu(11)
29
29
30 delegate: Tile {
30 delegate: Tile {
31 id: tile
31 id: tile
32 objectName: "delegate" + index
32 objectName: "delegate" + index
33− width: filtergrid.cellWidth
33+ width: videoFilterGrid.cellWidth
34− height: filtergrid.cellHeight
34+ height: videoFilterGrid.cellHeight
35 text: model.title
35 text: model.title
36− imageWidth: filtergrid.iconWidth
36+ imageWidth: videoFilterGrid.iconWidth
37− imageHeight: filtergrid.iconHeight
37+ imageHeight: videoFilterGrid.iconHeight
38 source: model.icon
38 source: model.icon
39 maximumLineCount: 2
39 maximumLineCount: 2
40 horizontalAlignment: Text.AlignLeft
40 horizontalAlignment: Text.AlignLeft
41
41
42 style: VideoTileStyle {}
42 style: VideoTileStyle {}
43
43
44− onClicked: {
45− filtergrid.clicked(index, tile.y)
44+ onClicked: videoFilterGrid.clicked(index, tile.y)
46− }
47−
48− onPressAndHold: {
49− filtergrid.pressAndHold(index, tile.y)
45+ onPressAndHold: videoFilterGrid.pressAndHold(index, tile.y)
50− }
51 }
46 }
52}
47}
Dash/Video/VideoTileStyle.qml → qml/Dash/Video/VideoTileStyle.qmlrenamed

The content is the same.

Dash/Video/graphics/icon_button_amazon@20.png → qml/Dash/Video/graphics/icon_button_amazon@20.pngrenamed

Binary file not shown.

Dash/Video/graphics/icon_button_u1@20.png → qml/Dash/Video/graphics/icon_button_u1@20.pngrenamed

Binary file not shown.

Dash/Video/graphics/movie_icon_holder@27.png → qml/Dash/Video/graphics/movie_icon_holder@27.pngrenamed

Binary file not shown.

Dash/graphics/header_handlearrow2@20.png → qml/Dash/graphics/header_handlearrow2@20.pngrenamed

Binary file not shown.

Dash/graphics/header_handlearrow@20.png → qml/Dash/graphics/header_handlearrow@20.pngrenamed

Binary file not shown.

Dash/graphics/icon_clear@20.png → qml/Dash/graphics/icon_clear@20.pngrenamed

Binary file not shown.

Dash/graphics/icon_listview_clear@20.png → qml/Dash/graphics/icon_listview_clear@20.pngrenamed

Binary file not shown.

Dash/graphics/icon_search_active@20.png → qml/Dash/graphics/icon_search_active@20.pngrenamed

Binary file not shown.

Dash/graphics/icon_search_inactive@20.png → qml/Dash/graphics/icon_search_inactive@20.pngrenamed

Binary file not shown.

Dash/graphics/phone/screenshots/angrybirds@12.png → qml/Dash/graphics/phone/screenshots/angrybirds@12.pngrenamed

Binary file not shown.

Dash/graphics/phone/screenshots/browser@12.png → qml/Dash/graphics/phone/screenshots/browser@12.pngrenamed

Binary file not shown.

Dash/graphics/phone/screenshots/camera@12.png → qml/Dash/graphics/phone/screenshots/camera@12.pngrenamed

Binary file not shown.

Dash/graphics/phone/screenshots/facebook@12.png → qml/Dash/graphics/phone/screenshots/facebook@12.pngrenamed

Binary file not shown.

Dash/graphics/phone/screenshots/gallery@12.png → qml/Dash/graphics/phone/screenshots/gallery@12.pngrenamed

Binary file not shown.

Dash/graphics/phone/screenshots/map@12.png → qml/Dash/graphics/phone/screenshots/map@12.pngrenamed

Binary file not shown.

Dash/graphics/phone/screenshots/music@12.png → qml/Dash/graphics/phone/screenshots/music@12.pngrenamed

Binary file not shown.

Dash/graphics/phone/screenshots/phone@12.png → qml/Dash/graphics/phone/screenshots/phone@12.pngrenamed

Binary file not shown.

Dash/graphics/phone/screenshots/settings@12.png → qml/Dash/graphics/phone/screenshots/settings@12.pngrenamed

Binary file not shown.

Dash/graphics/phone/screenshots/twitter@12.png → qml/Dash/graphics/phone/screenshots/twitter@12.pngrenamed

Binary file not shown.

Dash/graphics/play_button@18.png → qml/Dash/graphics/play_button@18.pngrenamed

Binary file not shown.

Dash/graphics/play_button_active@18.png → qml/Dash/graphics/play_button_active@18.pngrenamed

Binary file not shown.

Dash/graphics/play_button_active_big@20.png → qml/Dash/graphics/play_button_active_big@20.pngrenamed

Binary file not shown.

Dash/graphics/play_button_big@20.png → qml/Dash/graphics/play_button_big@20.pngrenamed

Binary file not shown.

qml/Dash/graphics/tabbarchevron@27.pngnew file

Binary file not shown.

Dash/graphics/tablet/icon_close_preview@20.png → qml/Dash/graphics/tablet/icon_close_preview@20.pngrenamed

Binary file not shown.

Dash/graphics/tooltip_arrow@27.png → qml/Dash/graphics/tooltip_arrow@27.pngrenamed

Binary file not shown.

Greeter/Clock.qml → qml/Greeter/Clock.qmlrenamed

The content is the same.

Greeter/Dot.qml → qml/Greeter/Dot.qmlrenamed

The content is the same.

Greeter/Gradient.js → qml/Greeter/Gradient.jsrenamed

The content is the same.

Greeter/Greeter.qml → qml/Greeter/Greeter.qmlrenamed+1−1
@@ -51,7 +51,7 @@ Showable {
51 signal unlocked(int uid)
51 signal unlocked(int uid)
52
52
53 onRightTeaserPressedChanged: {
53 onRightTeaserPressedChanged: {
54− if (rightTeaserPressed && !locked && x == 0) {
54+ if (rightTeaserPressed && (!locked || narrowMode) && x == 0) {
55 teasingTimer.start();
55 teasingTimer.start();
56 }
56 }
57 }
57 }
Greeter/GreeterContent.qml → qml/Greeter/GreeterContent.qmlrenamed

The content is the same.

Greeter/Infographics.qml → qml/Greeter/Infographics.qmlrenamed

The content is the same.

Greeter/Lockscreen.qml → qml/Greeter/Lockscreen.qmlrenamed+2−2
@@ -30,9 +30,9 @@ Showable {
30 // In case the Lockscreen can show a greeter message, this is the username
30 // In case the Lockscreen can show a greeter message, this is the username
31 property string username: ""
31 property string username: ""
32
32
33− // As the numeric PIN pad doesn't have a OK button by design, we need to auto-confirm on a certain length.
33+ // Set this to a value greater 0 to enable auto-confirm behavior for the lockscreen.
34 // This is ignored by the alphaNumeric lockscreen as that one is confirmed with pressing enter on the OSK.
34 // This is ignored by the alphaNumeric lockscreen as that one is confirmed with pressing enter on the OSK.
35− property int pinLength: 4
35+ property int pinLength: -1
36
36
37 property url background: ""
37 property url background: ""
38
38
Greeter/LoginList.qml → qml/Greeter/LoginList.qmlrenamed+11
@@ -289,5 +289,16 @@ Item {
289 }
289 }
290 passwordInput.text = "";
290 passwordInput.text = "";
291 }
291 }
292+
293+ onRequestAuthenticationUser: {
294+ // Find index for requested user, if it exists
295+ for (var i = 0; i < userList.model.count; i++) {
296+ if (user == userList.model.data(i, LightDM.UserRoles.NameRole)) {
297+ moveTimer.start();
298+ userList.currentIndex = i;
299+ return;
300+ }
301+ }
302+ }
292 }
303 }
293}
304}
Greeter/ObjectPositioner.qml → qml/Greeter/ObjectPositioner.qmlrenamed

The content is the same.

Greeter/PassphraseLockscreen.qml → qml/Greeter/PassphraseLockscreen.qmlrenamed

The content is the same.

Greeter/PinLockscreen.qml → qml/Greeter/PinLockscreen.qmlrenamed

The content is the same.

Greeter/graphics/dot_empty.png → qml/Greeter/graphics/dot_empty.pngrenamed

Binary file not shown.

Greeter/graphics/dot_filled.png → qml/Greeter/graphics/dot_filled.pngrenamed

Binary file not shown.

Greeter/graphics/dot_pointer.png → qml/Greeter/graphics/dot_pointer.pngrenamed

Binary file not shown.

Greeter/graphics/icon_arrow.png → qml/Greeter/graphics/icon_arrow.pngrenamed

Binary file not shown.

Greeter/graphics/infographic_circle_back.png → qml/Greeter/graphics/infographic_circle_back.pngrenamed

Binary file not shown.

Hud/Hud.qml → qml/Hud/Hud.qmlrenamed

The content is the same.

Hud/HudParametrizedActionsPage.qml → qml/Hud/HudParametrizedActionsPage.qmlrenamed+1−1
@@ -89,7 +89,7 @@ Item {
89 anchors.left: parent.left
89 anchors.left: parent.left
90 anchors.right: parent.right
90 anchors.right: parent.right
91
91
92− PageHeader {
92+ PageHeaderLabel {
93 id: header
93 id: header
94 anchors.top: parent.top
94 anchors.top: parent.top
95 anchors.left: parent.left
95 anchors.left: parent.left
Hud/Result.qml → qml/Hud/Result.qmlrenamed

The content is the same.

Hud/ResultList.qml → qml/Hud/ResultList.qmlrenamed

The content is the same.

Hud/SearchBar.qml → qml/Hud/SearchBar.qmlrenamed

The content is the same.

Hud/ShowingAnimation.qml → qml/Hud/ShowingAnimation.qmlrenamed

The content is the same.

Hud/SliderLabel.qml → qml/Hud/SliderLabel.qmlrenamed+4−2
@@ -36,10 +36,12 @@ Item {
36 label.text = sliderData["label"]
36 label.text = sliderData["label"]
37 slider.minimumValue = sliderData["min"]
37 slider.minimumValue = sliderData["min"]
38 slider.maximumValue = sliderData["max"]
38 slider.maximumValue = sliderData["max"]
39+ if("live" in sliderData)
39− slider.live = sliderData["live"]
40+ slider.live = sliderData["live"]
40 // SDK Slider does not support step yet
41 // SDK Slider does not support step yet
41// slider.step = sliderData["step"]
42// slider.step = sliderData["step"]
43+ if("value" in sliderData)
42− slider.value = sliderData["value"]
44+ slider.value = sliderData["value"]
43 action = sliderData["action"]
45 action = sliderData["action"]
44 }
46 }
45
47
Hud/SoundAmplitudeDelegate.qml → qml/Hud/SoundAmplitudeDelegate.qmlrenamed

The content is the same.

Hud/SoundAmplitudeVisual.qml → qml/Hud/SoundAmplitudeVisual.qmlrenamed

The content is the same.

Hud/ToolBar.qml → qml/Hud/ToolBar.qmlrenamed

The content is the same.

Hud/ToolBarIcon.qml → qml/Hud/ToolBarIcon.qmlrenamed

The content is the same.

Hud/graphics/divider@20.png → qml/Hud/graphics/divider@20.pngrenamed

Binary file not shown.

Hud/graphics/divider@20.sci → qml/Hud/graphics/divider@20.scirenamed

The content is the same.

Hud/graphics/dropshadow_right@20.png → qml/Hud/graphics/dropshadow_right@20.pngrenamed

Binary file not shown.

Hud/graphics/help@20.png → qml/Hud/graphics/help@20.pngrenamed

Binary file not shown.

Hud/graphics/hud_bg@20.png → qml/Hud/graphics/hud_bg@20.pngrenamed

Binary file not shown.

Hud/graphics/hud_handlearrow@20.png → qml/Hud/graphics/hud_handlearrow@20.pngrenamed

Binary file not shown.

Hud/graphics/hud_handlebar@20.png → qml/Hud/graphics/hud_handlebar@20.pngrenamed

Binary file not shown.

Hud/graphics/icon_arrow@20.png → qml/Hud/graphics/icon_arrow@20.pngrenamed

Binary file not shown.

Hud/graphics/icon_clear@20.png → qml/Hud/graphics/icon_clear@20.pngrenamed

Binary file not shown.

Hud/graphics/icon_search@20.png → qml/Hud/graphics/icon_search@20.pngrenamed

Binary file not shown.

Hud/graphics/microphone@20.png → qml/Hud/graphics/microphone@20.pngrenamed

Binary file not shown.

Hud/graphics/popup_triangle@20.png → qml/Hud/graphics/popup_triangle@20.pngrenamed

Binary file not shown.

Hud/graphics/settings@20.png → qml/Hud/graphics/settings@20.pngrenamed

Binary file not shown.

Hud/graphics/undo@20.png → qml/Hud/graphics/undo@20.pngrenamed

Binary file not shown.

Hud/graphics/view-fullscreen@20.png → qml/Hud/graphics/view-fullscreen@20.pngrenamed

Binary file not shown.

Launcher/FoldingLauncherDelegate.qml → qml/Launcher/FoldingLauncherDelegate.qmlrenamed

The content is the same.

Launcher/Launcher.qml → qml/Launcher/Launcher.qmlrenamed+3−3
@@ -41,7 +41,7 @@ Item {
41 signal dash()
41 signal dash()
42
42
43 // emitted when the dash icon in the launcher has been tapped
43 // emitted when the dash icon in the launcher has been tapped
44− signal dashItemSelected()
44+ signal showDashHome()
45
45
46 onStateChanged: {
46 onStateChanged: {
47 if (state == "") {
47 if (state == "") {
@@ -161,9 +161,9 @@ Item {
161 root.state = ""
161 root.state = ""
162 launcherApplicationSelected(appId)
162 launcherApplicationSelected(appId)
163 }
163 }
164− onDashItemSelected: {
164+ onShowDashHome: {
165 root.state = ""
165 root.state = ""
166− root.dashItemSelected(index)
166+ root.showDashHome();
167 }
167 }
168
168
169 onPreventHidingChanged: {
169 onPreventHidingChanged: {
Launcher/LauncherDelegate.qml → qml/Launcher/LauncherDelegate.qmlrenamed

The content is the same.

Launcher/LauncherPanel.qml → qml/Launcher/LauncherPanel.qmlrenamed+2−2
@@ -36,7 +36,7 @@ Item {
36 property int highlightIndex: -1
36 property int highlightIndex: -1
37
37
38 signal applicationSelected(string appId)
38 signal applicationSelected(string appId)
39− signal dashItemSelected(int index)
39+ signal showDashHome()
40
40
41 BorderImage {
41 BorderImage {
42 id: background
42 id: background
@@ -57,7 +57,7 @@ Item {
57 id: dashItem
57 id: dashItem
58 width: parent.width
58 width: parent.width
59 height: units.gu(7)
59 height: units.gu(7)
60− onClicked: root.dashItemSelected(0)
60+ onClicked: root.showDashHome()
61 z: 1
61 z: 1
62 Image {
62 Image {
63 objectName: "dashItem"
63 objectName: "dashItem"
Launcher/graphics/focused_app_arrow@30.png → qml/Launcher/graphics/focused_app_arrow@30.pngrenamed

Binary file not shown.

Launcher/graphics/highlight@18.png → qml/Launcher/graphics/highlight@18.pngrenamed

Binary file not shown.

Launcher/graphics/home@18.png → qml/Launcher/graphics/home@18.pngrenamed

Binary file not shown.

Launcher/graphics/launcher_bg@30.png → qml/Launcher/graphics/launcher_bg@30.pngrenamed

Binary file not shown.

Launcher/graphics/launcher_bg@30.sci → qml/Launcher/graphics/launcher_bg@30.scirenamed

The content is the same.

Launcher/graphics/non-selected@18.png → qml/Launcher/graphics/non-selected@18.pngrenamed

Binary file not shown.

Launcher/graphics/non-selected@18.sci → qml/Launcher/graphics/non-selected@18.scirenamed

The content is the same.

Launcher/graphics/notification@30.png → qml/Launcher/graphics/notification@30.pngrenamed

Binary file not shown.

Launcher/graphics/notification@30.sci → qml/Launcher/graphics/notification@30.scirenamed

The content is the same.

Launcher/graphics/progressbar-fill@30.png → qml/Launcher/graphics/progressbar-fill@30.pngrenamed

Binary file not shown.

Launcher/graphics/progressbar-fill@30.sci → qml/Launcher/graphics/progressbar-fill@30.scirenamed

The content is the same.

Launcher/graphics/progressbar-trough@30.png → qml/Launcher/graphics/progressbar-trough@30.pngrenamed

Binary file not shown.

Launcher/graphics/progressbar-trough@30.sci → qml/Launcher/graphics/progressbar-trough@30.scirenamed

The content is the same.

Launcher/graphics/quicklist_tooltip@30.png → qml/Launcher/graphics/quicklist_tooltip@30.pngrenamed

Binary file not shown.

Launcher/graphics/selected@18.png → qml/Launcher/graphics/selected@18.pngrenamed

Binary file not shown.

Launcher/graphics/selected@18.sci → qml/Launcher/graphics/selected@18.scirenamed

The content is the same.

Launcher/graphics/triangle@18.png → qml/Launcher/graphics/triangle@18.pngrenamed

Binary file not shown.

qml/Notifications/Notification.qmlnew file+335
@@ -0,0 +1,335 @@
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 Unity.Notifications 1.0
20+import QMenuModel 0.1
21+import Utils 0.1
22+
23+Item {
24+ id: notification
25+
26+ property alias iconSource: icon.fileSource
27+ property alias secondaryIconSource: secondaryIcon.source
28+ property alias summary: summaryLabel.text
29+ property alias body: bodyLabel.text
30+ property var actions
31+ property var notificationId
32+ property var type
33+ property var hints
34+ property var notification
35+ property color color
36+ property bool fullscreen
37+ property int maxHeight
38+ property int margins
39+
40+ fullscreen: false
41+ objectName: "background"
42+ implicitHeight: type !== Notification.PlaceHolder ? (fullscreen ? maxHeight : contentColumn.height + contentColumn.spacing * 4) : 0
43+
44+ color: Qt.rgba(0.132, 0.117, 0.109, 0.97)
45+ opacity: 0
46+
47+ clip: fullscreen ? false : true
48+ visible: type != Notification.PlaceHolder
49+
50+ UbuntuShape {
51+ id: shapedBack
52+
53+ visible: !fullscreen
54+ anchors.fill: parent
55+ anchors.margins: notification.margins
56+ color: parent.color
57+ opacity: parent.opacity
58+ radius: "medium"
59+ }
60+
61+ Rectangle {
62+ id: nonShapedBack
63+
64+ visible: fullscreen
65+ anchors.fill: parent
66+ color: parent.color
67+ opacity: parent.opacity
68+ }
69+
70+ Item {
71+ id: contents
72+ anchors.fill: fullscreen ? nonShapedBack : shapedBack
73+
74+ UnityMenuModelPaths {
75+ id: paths
76+
77+ source: hints["x-canonical-private-menu-model"]
78+
79+ busNameHint: "busName"
80+ actionsHint: "actions"
81+ menuObjectPathHint: "menuPath"
82+ }
83+
84+ UnityMenuModel {
85+ id: unityMenuModel
86+
87+ busName: paths.busName
88+ actions: paths.actions
89+ menuObjectPath: paths.menuObjectPath
90+ }
91+
92+ Behavior on implicitHeight {
93+ id: heightBehavior
94+
95+ enabled: false
96+ UbuntuNumberAnimation {
97+ duration: UbuntuAnimation.SnapDuration
98+ }
99+ }
100+
101+ // delay enabling height behavior until the add transition is complete
102+ onOpacityChanged: if (opacity == 1) heightBehavior.enabled = true
103+
104+ MouseArea {
105+ id: interactiveArea
106+
107+ anchors.fill: contentColumn
108+ objectName: "interactiveArea"
109+ onClicked: {
110+ if (notification.type == Notification.Interactive) {
111+ notification.notification.invokeAction(actionRepeater.itemAt(0).actionId)
112+ }
113+ }
114+ }
115+
116+ Column {
117+ id: contentColumn
118+
119+ anchors {
120+ left: parent.left
121+ right: parent.right
122+ top: parent.top
123+ margins: fullscreen ? 0 : spacing
124+ }
125+
126+ spacing: units.gu(1)
127+
128+ Row {
129+ id: topRow
130+
131+ spacing: contentColumn.spacing
132+ anchors {
133+ left: parent.left
134+ right: parent.right
135+ }
136+
137+ ShapedIcon {
138+ id: icon
139+
140+ objectName: "icon"
141+ width: units.gu(6)
142+ height: units.gu(6)
143+ shaped: notification.hints["x-canonical-non-shaped-icon"] == "true" ? false : true
144+ visible: iconSource !== undefined && iconSource != ""
145+ }
146+
147+ Image {
148+ id: secondaryIcon
149+
150+ objectName: "secondaryIcon"
151+ width: units.gu(2)
152+ height: units.gu(2)
153+ visible: source !== undefined && source != ""
154+ fillMode: Image.PreserveAspectCrop
155+ }
156+
157+ Column {
158+ id: labelColumn
159+ width: parent.width - x
160+
161+ anchors.verticalCenter: (icon.visible && !bodyLabel.visible) ? icon.verticalCenter : undefined
162+
163+ Label {
164+ id: summaryLabel
165+
166+ objectName: "summaryLabel"
167+ anchors {
168+ left: parent.left
169+ right: parent.right
170+ }
171+ fontSize: "medium"
172+ font.bold: true
173+ color: Theme.palette.selected.backgroundText
174+ elide: Text.ElideRight
175+ }
176+
177+ Label {
178+ id: bodyLabel
179+
180+ objectName: "bodyLabel"
181+ anchors {
182+ left: parent.left
183+ right: parent.right
184+ }
185+ visible: body != ""
186+ fontSize: "small"
187+ color: Theme.palette.selected.backgroundText
188+ opacity: 0.6
189+ wrapMode: Text.WordWrap
190+ maximumLineCount: 10
191+ elide: Text.ElideRight
192+ }
193+ }
194+ }
195+
196+ Column {
197+ objectName: "dialogListView"
198+ spacing: units.gu(2)
199+
200+ visible: count > 0
201+
202+ anchors.left: parent.left; anchors.right: parent.right
203+ anchors.top: fullscreen ? parent.top : undefined
204+ anchors.bottom: fullscreen ? parent.bottom : undefined
205+
206+ Repeater {
207+ model: unityMenuModel
208+
209+ NotificationMenuItemFactory {
210+ anchors.left: parent.left; anchors.right: parent.right
211+
212+ menuModel: unityMenuModel
213+ menuData: model
214+ menuIndex: index
215+ maxHeight: notification.maxHeight
216+
217+ onLoaded: {
218+ notification.fullscreen = Qt.binding(function() { return fullscreen; });
219+ }
220+ }
221+ }
222+ }
223+
224+ Item {
225+ id: buttonRow
226+
227+ objectName: "buttonRow"
228+ anchors {
229+ left: parent.left
230+ right: parent.right
231+ }
232+ visible: notification.type == Notification.SnapDecision && actionRepeater.count > 0
233+ height: units.gu(5)
234+
235+ property real buttonWidth: (width - contentColumn.spacing) / 2
236+ property bool expanded
237+
238+ Button {
239+ id: leftButton
240+
241+ objectName: "button1"
242+ width: parent.expanded ? parent.width : parent.buttonWidth
243+ anchors {
244+ top: parent.top
245+ bottom: parent.bottom
246+ }
247+ text: notification.type == Notification.SnapDecision && actionRepeater.count >= 2 ? actionRepeater.itemAt(1).actionLabel : ""
248+ gradient: UbuntuColors.greyGradient
249+ onClicked: {
250+ if (actionRepeater.count > 2) {
251+ buttonRow.expanded = !buttonRow.expanded
252+ } else {
253+ notification.notification.invokeAction(actionRepeater.itemAt(1).actionId)
254+ }
255+ }
256+
257+ Behavior on width {
258+ UbuntuNumberAnimation {
259+ duration: UbuntuAnimation.SnapDuration
260+ }
261+ }
262+ }
263+
264+ Button {
265+ id: rightButton
266+
267+ objectName: "button0"
268+ anchors {
269+ left: leftButton.right
270+ leftMargin: contentColumn.spacing
271+ right: parent.right
272+ }
273+ text: notification.type == Notification.SnapDecision && actionRepeater.count >= 1 ? actionRepeater.itemAt(0).actionLabel : ""
274+ anchors {
275+ top: parent.top
276+ bottom: parent.bottom
277+ }
278+ gradient: notification.hints["x-canonical-private-button-tint"] == "true" ? UbuntuColors.orangeGradient : UbuntuColors.greyGradient
279+ visible: width > 0
280+ onClicked: notification.notification.invokeAction(actionRepeater.itemAt(0).actionId)
281+ }
282+ }
283+
284+ Column {
285+ objectName: "buttonColumn"
286+ spacing: contentColumn.spacing
287+ anchors {
288+ left: parent.left
289+ right: parent.right
290+ }
291+
292+ // calculate initial position before Column takes over
293+ y: buttonRow.y + buttonRow.height + contentColumn.spacing
294+
295+ visible: notification.type == Notification.SnapDecision && buttonRow.expanded
296+ height: buttonRow.expanded ? implicitHeight : 0
297+
298+ Repeater {
299+ id: actionRepeater
300+
301+ model: notification.actions
302+ delegate: Loader {
303+ id: loader
304+
305+ property string actionId: id
306+ property string actionLabel: label
307+
308+ anchors {
309+ left: parent.left
310+ right: parent.right
311+ }
312+
313+ Component {
314+ id: actionButton
315+
316+ Button {
317+ objectName: "button" + index
318+ anchors {
319+ left: parent.left
320+ right: parent.right
321+ }
322+
323+ text: loader.actionLabel
324+ height: units.gu(5)
325+ gradient: UbuntuColors.greyGradient
326+ onClicked: notification.notification.invokeAction(loader.actionId)
327+ }
328+ }
329+ sourceComponent: (index == 0 || index == 1) ? undefined : actionButton
330+ }
331+ }
332+ }
333+ }
334+ }
335+}
Notifications/NotificationMenuItemFactory.qml → qml/Notifications/NotificationMenuItemFactory.qmlrenamed+8−2
@@ -28,7 +28,8 @@ Loader {
28 property QtObject menuModel: null
28 property QtObject menuModel: null
29 property QtObject menuData: null
29 property QtObject menuData: null
30 property int menuIndex
30 property int menuIndex
31− property var notification
31+ property int maxHeight
32+ readonly property bool fullscreen: menuData.type === "com.canonical.snapdecision.pinlock"
32
33
33 property var _map: {
34 property var _map: {
34 "com.canonical.snapdecision.textfield": textfield,
35 "com.canonical.snapdecision.textfield": textfield,
@@ -65,6 +66,7 @@ Loader {
65 TextField {
66 TextField {
66 id: textfield
67 id: textfield
67
68
69+ inputMethodHints: Qt.ImhNoAutoUppercase
68 anchors.left: parent.left; anchors.right: parent.right
70 anchors.left: parent.left; anchors.right: parent.right
69 echoMode: checkBox.checked ? TextInput.Normal : TextInput.Password
71 echoMode: checkBox.checked ? TextInput.Normal : TextInput.Password
70 height: units.gu(5)
72 height: units.gu(5)
@@ -94,8 +96,12 @@ Loader {
94
96
95 Component {
97 Component {
96 id: pinLock
98 id: pinLock
97− PinLockscreen {
99+
100+ Lockscreen {
98 anchors.left: parent.left; anchors.right: parent.right
101 anchors.left: parent.left; anchors.right: parent.right
102+ height: menuFactory.maxHeight
103+ placeholderText: i18n.tr("Please enter SIM PIN")
104+ background: shell.background
99
105
100 onEntered: {
106 onEntered: {
101 menuModel.changeState(menuIndex, passphrase);
107 menuModel.changeState(menuIndex, passphrase);
Notifications/Notifications.qml → qml/Notifications/Notifications.qmlrenamed+4−1
@@ -24,7 +24,8 @@ ListView {
24 objectName: "notificationList"
24 objectName: "notificationList"
25 interactive: false
25 interactive: false
26
26
27− spacing: units.gu(.5)
27+ property real margin
28+
28 delegate: Notification {
29 delegate: Notification {
29 objectName: "notification" + index
30 objectName: "notification" + index
30 anchors {
31 anchors {
@@ -40,6 +41,8 @@ ListView {
40 actions: model.actions
41 actions: model.actions
41 notificationId: model.id
42 notificationId: model.id
42 notification: notificationList.model.getRaw(notificationId)
43 notification: notificationList.model.getRaw(notificationId)
44+ maxHeight: notificationList.height
45+ margins: notificationList.margin
43
46
44 // make sure there's no opacity-difference between the several
47 // make sure there's no opacity-difference between the several
45 // elements in a notification
48 // elements in a notification
Notifications/ShapedIcon.qml → qml/Notifications/ShapedIcon.qmlrenamed

The content is the same.

Panel/IndicatorItem.qml → qml/Panel/IndicatorItem.qmlrenamed+6−12
@@ -23,10 +23,10 @@ Item {
23 id: indicatorItem
23 id: indicatorItem
24
24
25 property alias widgetSource: loader.source
25 property alias widgetSource: loader.source
26− property bool highlighted: false
27 property bool dimmed: false
26 property bool dimmed: false
28 property var indicatorProperties: undefined
27 property var indicatorProperties: undefined
29 property bool indicatorVisible: loader.item ? loader.item.enabled : false
28 property bool indicatorVisible: loader.item ? loader.item.enabled : false
29+ property string identifier
30
30
31 opacity: dimmed ? 0.4 : 1
31 opacity: dimmed ? 0.4 : 1
32 Behavior on opacity { StandardAnimation {} }
32 Behavior on opacity { StandardAnimation {} }
@@ -45,17 +45,11 @@ Item {
45 }
45 }
46 }
46 }
47 }
47 }
48− }
49−
50− Rectangle {
51− color: Theme.palette.selected.foreground
52− objectName: "highlight"
53− height: units.dp(2)
54− width: parent.width
55− anchors.top: parent.bottom
56− visible: highlighted
57
48
58− opacity: highlighted ? 1 : 0
49+ Binding {
59− Behavior on opacity { StandardAnimation {} }
50+ target: loader.item
51+ property: "objectName"
52+ value: identifier + "-widget"
53+ }
60 }
54 }
61}
55}
Panel/IndicatorRow.qml → qml/Panel/IndicatorRow.qmlrenamed+40−8
@@ -29,6 +29,8 @@ Item {
29 property var visibleIndicators: defined
29 property var visibleIndicators: defined
30 property int overFlowWidth: width
30 property int overFlowWidth: width
31 property bool showAll: false
31 property bool showAll: false
32+ property real currentItemOffset: 0.0
33+ property real unitProgress: 0.0
32
34
33 width: units.gu(40)
35 width: units.gu(40)
34 height: units.gu(3)
36 height: units.gu(3)
@@ -79,23 +81,24 @@ Item {
79 height: indicatorRow.height
81 height: indicatorRow.height
80 width: indicatorItem.width
82 width: indicatorItem.width
81 visible: indicatorItem.indicatorVisible
83 visible: indicatorItem.indicatorVisible
82− opacity: 1.0
84+ opacity: 1.0 * opacityMultiplier
83 y: 0
85 y: 0
84 state: "standard"
86 state: "standard"
85
87
86 property int ownIndex: index
88 property int ownIndex: index
87− property alias highlighted: indicatorItem.highlighted
89+ property bool highlighted: indicatorRow.state != "initial" ? ownIndex == indicatorRow.currentItemIndex : false
88− property alias dimmed: indicatorItem.dimmed
90+ property bool dimmed: indicatorRow.state != "initial" ? ownIndex != indicatorRow.currentItemIndex : false
89
91
90− property bool hidden: !showAll && !indicatorItem.highlighted && (indicatorRow.state == "locked" || indicatorRow.state == "commit")
92+ property bool hidden: !showAll && !highlighted && (indicatorRow.state == "locked" || indicatorRow.state == "commit")
91 property bool overflow: row.width - itemWrapper.x > overFlowWidth
93 property bool overflow: row.width - itemWrapper.x > overFlowWidth
94+ property real opacityMultiplier: highlighted ? 1 : (1 - indicatorRow.unitProgress)
92
95
93 IndicatorItem {
96 IndicatorItem {
94 id: indicatorItem
97 id: indicatorItem
98+ identifier: model.identifier
95 height: parent.height
99 height: parent.height
96
100
97− highlighted: indicatorRow.state != "initial" ? itemWrapper.ownIndex == indicatorRow.currentItemIndex : false
101+ dimmed: itemWrapper.dimmed
98− dimmed: indicatorRow.state != "initial" ? itemWrapper.ownIndex != indicatorRow.currentItemIndex : false
99
102
100 widgetSource: model.widgetSource
103 widgetSource: model.widgetSource
101 indicatorProperties : model.indicatorProperties
104 indicatorProperties : model.indicatorProperties
@@ -135,14 +138,43 @@ Item {
135
138
136 transitions: [
139 transitions: [
137 Transition {
140 Transition {
138− StandardAnimation {
141+ UbuntuNumberAnimation {
139 target: itemWrapper
142 target: itemWrapper
140 property: "opacity"
143 property: "opacity"
141− duration: 300
144+ duration: UbuntuAnimation.BriskDuration
142 }
145 }
143 }
146 }
144 ]
147 ]
145 }
148 }
146 }
149 }
147 }
150 }
151+
152+ Rectangle {
153+ id: highlight
154+ color: Theme.palette.selected.foreground
155+ objectName: "highlight"
156+ height: units.dp(2)
157+ anchors.top: row.bottom
158+ visible: indicatorRow.currentItem != null
159+ x: row.x + (indicatorRow.currentItem != null ? indicatorRow.currentItem.x + centerOffset : 0)
160+ width: indicatorRow.currentItem != null ? indicatorRow.currentItem.width : 0
161+
162+ property real centerOffset: {
163+ if (indicatorRow.currentItemOffset > 0.1) {
164+ return (indicatorRow.currentItemOffset - 0.1) * units.gu(0.4);
165+ } else if (indicatorRow.currentItemOffset < -0.1) {
166+ return (indicatorRow.currentItemOffset + 0.1) * units.gu(0.4);
167+ }
168+ return 0.0;
169+ }
170+
171+ Behavior on width {
172+ enabled: unitProgress > 0;
173+ UbuntuNumberAnimation { duration: UbuntuAnimation.FastDuration }
174+ }
175+ Behavior on x {
176+ enabled: unitProgress > 0;
177+ UbuntuNumberAnimation { duration: UbuntuAnimation.FastDuration }
178+ }
179+ }
148}
180}
Panel/Indicators.qml → qml/Panel/Indicators.qmlrenamed+22−11
@@ -39,6 +39,7 @@ Showable {
39 property bool contentEnabled: true
39 property bool contentEnabled: true
40 property bool initalizeItem: true
40 property bool initalizeItem: true
41 readonly property alias content: menuContent
41 readonly property alias content: menuContent
42+ property real unitProgress: 0.0
42
43
43 // TODO: Perhaps we need a animation standard for showing/hiding? Each showable seems to
44 // TODO: Perhaps we need a animation standard for showing/hiding? Each showable seems to
44 // use its own values. Need to ask design about this.
45 // use its own values. Need to ask design about this.
@@ -128,23 +129,31 @@ Showable {
128 rowCoordinates = indicatorRow.mapToItem(indicatorRow.row, xValue, 0);
129 rowCoordinates = indicatorRow.mapToItem(indicatorRow.row, xValue, 0);
129 // get the current delegate
130 // get the current delegate
130 currentItem = indicatorRow.row.childAt(rowCoordinates.x, 0);
131 currentItem = indicatorRow.row.childAt(rowCoordinates.x, 0);
131− if (currentItem && currentItem != indicatorRow.currentItem ) {
132+ if (currentItem) {
132 itemCoordinates = indicatorRow.row.mapToItem(currentItem, rowCoordinates.x, 0);
133 itemCoordinates = indicatorRow.row.mapToItem(currentItem, rowCoordinates.x, 0);
133 distanceFromRightEdge = (currentItem.width - itemCoordinates.x) / (currentItem.width);
134 distanceFromRightEdge = (currentItem.width - itemCoordinates.x) / (currentItem.width);
135+ if (currentItem != indicatorRow.currentItem) {
134− if (Math.abs(currentItem.ownIndex - indicatorRow.currentItemIndex) > 1) {
136+ if (Math.abs(currentItem.ownIndex - indicatorRow.currentItemIndex) > 1) {
135− bufferExceeded = true;
136− } else {
137− if (indicatorRow.currentItemIndex < currentItem.ownIndex && distanceFromRightEdge < (1 - effectiveBufferThreshold)) {
138− bufferExceeded = true;
139− } else if (indicatorRow.currentItemIndex > currentItem.ownIndex && distanceFromRightEdge > effectiveBufferThreshold) {
140 bufferExceeded = true;
137 bufferExceeded = true;
138+ } else {
139+ if (indicatorRow.currentItemIndex < currentItem.ownIndex && distanceFromRightEdge < (1 - effectiveBufferThreshold)) {
140+ bufferExceeded = true;
141+ } else if (indicatorRow.currentItemIndex > currentItem.ownIndex && distanceFromRightEdge > effectiveBufferThreshold) {
142+ bufferExceeded = true;
143+ }
141 }
144 }
145+ if ((!useBuffer || (useBuffer && bufferExceeded)) || indicatorRow.currentItemIndex < 0 || indicatorRow.currentItem == null) {
146+ indicatorRow.currentItem = currentItem;
147+ }
148+
149+ // need to re-init the distanceFromRightEdge for offset calculation
150+ itemCoordinates = indicatorRow.row.mapToItem(indicatorRow.currentItem, rowCoordinates.x, 0);
151+ distanceFromRightEdge = (indicatorRow.currentItem.width - itemCoordinates.x) / (indicatorRow.currentItem.width);
142 }
152 }
143− if ((!useBuffer || (useBuffer && bufferExceeded)) || indicatorRow.currentItem < 0 || indicatorRow.currentItem == null) {
153+ indicatorRow.currentItemOffset = 1 - (distanceFromRightEdge * 2);
144− indicatorRow.currentItem = currentItem;
154+ } else {
145− }
146− } else if (!currentItem) {
147 indicatorRow.setDefaultItem();
155 indicatorRow.setDefaultItem();
156+ indicatorRow.currentItemOffset = 0;
148 }
157 }
149 initalizeItem = indicatorRow.currentItem == null;
158 initalizeItem = indicatorRow.currentItem == null;
150 }
159 }
@@ -268,6 +277,7 @@ Showable {
268 height: indicators.panelHeight
277 height: indicators.panelHeight
269 indicatorsModel: indicatorsModel
278 indicatorsModel: indicatorsModel
270 state: indicators.state
279 state: indicators.state
280+ unitProgress: indicators.unitProgress
271
281
272 Connections {
282 Connections {
273 property bool enableIndexChangeSignal: true
283 property bool enableIndexChangeSignal: true
@@ -326,6 +336,7 @@ Showable {
326 if (hideAnimation.running) {
336 if (hideAnimation.running) {
327 indicators.state = "initial";
337 indicators.state = "initial";
328 initalizeItem = true;
338 initalizeItem = true;
339+ menuContent.animateNextMenuChange = false;
329 }
340 }
330 }
341 }
331 }
342 }
plugins/Unity/Indicators/qml/IndicatorPage.qml → qml/Panel/Indicators/DefaultIndicatorPage.qmlrenamed+43−30
@@ -22,7 +22,7 @@ import QtQuick 2.0
22import Ubuntu.Components 0.1 as Components
22import Ubuntu.Components 0.1 as Components
23import Unity.Indicators 0.1 as Indicators
23import Unity.Indicators 0.1 as Indicators
24
24
25−IndicatorBase {
25+Indicators.IndicatorBase {
26 id: main
26 id: main
27
27
28 //const
28 //const
@@ -59,10 +59,17 @@ IndicatorBase {
59 menuStack.push(menuStack.rootMenu, 0);
59 menuStack.push(menuStack.rootMenu, 0);
60 }
60 }
61 }
61 }
62+ onModelReset: {
63+ if (menuStack.rootMenu !== menuStack.tail && menuStack.tail.get(0, "type") === rootMenuType) {
64+ menuStack.rootMenu = menuStack.tail.submenu(0);
65+ menuStack.push(menuStack.rootMenu, 0);
66+ }
67+ }
62 }
68 }
63
69
64 ListView {
70 ListView {
65 id: mainMenu
71 id: mainMenu
72+ objectName: "mainMenu"
66 model: menuStack.rootMenu
73 model: menuStack.rootMenu
67
74
68 anchors {
75 anchors {
@@ -115,56 +122,62 @@ IndicatorBase {
115 }
122 }
116 }
123 }
117
124
118− delegate: Item {
125+ delegate: Loader {
119− id: menuDelegate
126+ id: loader
127+ objectName: "menuItem" + index
128+ asynchronous: false
129+ visible: height > 0
130+
131+ property int modelIndex: index
120
132
121 anchors {
133 anchors {
122 left: parent.left
134 left: parent.left
123 right: parent.right
135 right: parent.right
124 }
136 }
125− height: loader.height
126− visible: height > 0
127
137
128− Loader {
138+ sourceComponent: factory.load(model)
129− id: loader
130− asynchronous: false
131
139
132− property int modelIndex: index
140+ onLoaded: {
133−
141+ if (item.hasOwnProperty("menuSelected")) {
134− anchors {
142+ item.menuSelected = mainMenu.selectedIndex == index;
135− left: parent.left
143+ item.selectMenu.connect(function() { mainMenu.selectedIndex = index; });
136− right: parent.right
144+ item.deselectMenu.connect(function() { mainMenu.selectedIndex = -1; });
145+ }
146+ if (item.hasOwnProperty("menuData")) {
147+ item.menuData = Qt.binding(function() { return model; });
137 }
148 }
149+ if (item.hasOwnProperty("menuIndex")) {
150+ item.menuIndex = Qt.binding(function() { return modelIndex; });
151+ }
152+ }
138
153
139− sourceComponent: factory.load(model)
154+ Binding {
155+ target: item ? item : null
156+ property: "objectName"
157+ value: model.action
158+ }
140
159
141− onLoaded: {
160+ // TODO: Fixes lp#1243146
161+ // This is a workaround for a Qt bug. https://bugreports.qt-project.org/browse/QTBUG-34351
162+ Connections {
163+ target: mainMenu
164+ onSelectedIndexChanged: {
142− if (item.hasOwnProperty("menuSelected")) {
165+ if (loader.item && loader.item.hasOwnProperty("menuSelected")) {
143− item.menuSelected = Qt.binding(function() { return mainMenu.selectedIndex == index; });
166+ loader.item.menuSelected = mainMenu.selectedIndex == index;
144− item.selectMenu.connect(function() { mainMenu.selectedIndex = index; });
145− item.deselectMenu.connect(function() { mainMenu.selectedIndex = -1; });
146− }
147− if (item.hasOwnProperty("menu")) {
148− item.menu = Qt.binding(function() { return model; });
149 }
167 }
150 }
168 }
151−
152− Binding {
153− target: item ? item : null
154− property: "objectName"
155− value: model.action
156− }
157 }
169 }
158 }
170 }
159 }
171 }
160
172
161− MenuItemFactory {
173+ Indicators.MenuItemFactory {
162 id: factory
174 id: factory
163− model: mainMenu.model
175+ menuModel: mainMenu.model ? mainMenu.model : null
164 }
176 }
165
177
166 Components.Label {
178 Components.Label {
167 id: emptyLabel
179 id: emptyLabel
180+ objectName: "emptyLabel"
168 visible: mainMenu.count == 0
181 visible: mainMenu.count == 0
169 anchors {
182 anchors {
170 top: parent.top
183 top: parent.top
Panel/Indicators/DefaultIndicatorWidget.qml → qml/Panel/Indicators/DefaultIndicatorWidget.qmlrenamed+5−3
@@ -21,15 +21,17 @@ import QtQuick 2.0
21import Ubuntu.Components 0.1
21import Ubuntu.Components 0.1
22import Unity.Indicators 0.1 as Indicators
22import Unity.Indicators 0.1 as Indicators
23
23
24−Indicators.IndicatorWidget {
24+Indicators.IndicatorBase {
25 id: indicatorWidget
25 id: indicatorWidget
26
26
27− width: itemRow.width
27+ property int iconSize: height
28−
29 property alias leftLabel: itemLeftLabel.text
28 property alias leftLabel: itemLeftLabel.text
30 property alias rightLabel: itemRightLabel.text
29 property alias rightLabel: itemRightLabel.text
31 property var icons: undefined
30 property var icons: undefined
32
31
32+ width: itemRow.width
33+ enabled: false
34+
33 Row {
35 Row {
34 id: itemRow
36 id: itemRow
35 width: childrenRect.width
37 width: childrenRect.width
Panel/Indicators/client/IndicatorsClient.qml → qml/Panel/Indicators/client/IndicatorsClient.qmlrenamed

The content is the same.

Panel/Indicators/client/IndicatorsList.qml → qml/Panel/Indicators/client/IndicatorsList.qmlrenamed

The content is the same.

Panel/Indicators/client/IndicatorsPage.qml → qml/Panel/Indicators/client/IndicatorsPage.qmlrenamed

The content is the same.

Panel/Indicators/client/IndicatorsTree.qml → qml/Panel/Indicators/client/IndicatorsTree.qmlrenamed

The content is the same.

Panel/MenuContent.qml → qml/Panel/MenuContent.qmlrenamed+3−1
@@ -33,6 +33,7 @@ MainView {
33 property int contentReleaseInterval: 20000
33 property int contentReleaseInterval: 20000
34 property bool activeHeader: false
34 property bool activeHeader: false
35 property alias visibleIndicators: visibleIndicatorsModel.visible
35 property alias visibleIndicators: visibleIndicatorsModel.visible
36+ property bool animateNextMenuChange: false
36
37
37 width: units.gu(40)
38 width: units.gu(40)
38 height: units.gu(42)
39 height: units.gu(42)
@@ -41,11 +42,12 @@ MainView {
41 var filteredIndex = filteredIndicators.mapFromSource(index)
42 var filteredIndex = filteredIndicators.mapFromSource(index)
42
43
43 if (tabs.selectedTabIndex !== filteredIndex) {
44 if (tabs.selectedTabIndex !== filteredIndex) {
44− if (tabs.selectedTabIndex == -1) {
45+ if (tabs.selectedTabIndex == -1 || !animateNextMenuChange) {
45 tabs.tabBar.animate = false;
46 tabs.tabBar.animate = false;
46 }
47 }
47 tabs.selectedTabIndex = filteredIndex;
48 tabs.selectedTabIndex = filteredIndex;
48 tabs.tabBar.animate = true;
49 tabs.tabBar.animate = true;
50+ animateNextMenuChange = true;
49 }
51 }
50 }
52 }
51
53
Panel/Panel.qml → qml/Panel/Panel.qmlrenamed+23−1
@@ -31,6 +31,28 @@ Item {
31
31
32 signal searchClicked
32 signal searchClicked
33
33
34+ function hideIndicatorMenu(delay) {
35+ if (delay !== undefined) {
36+ hideTimer.interval = delay;
37+ hideTimer.start();
38+ } else {
39+ indicatorsMenu.hide();
40+ }
41+ }
42+
43+ Timer {
44+ id: hideTimer
45+ running: false
46+ onTriggered: {
47+ indicatorsMenu.hide();
48+ }
49+ }
50+
51+ Connections {
52+ target: indicatorsMenu
53+ onShown: hideTimer.stop()
54+ }
55+
34 PanelBackground {
56 PanelBackground {
35 id: panelBackground
57 id: panelBackground
36 anchors {
58 anchors {
@@ -85,7 +107,7 @@ Item {
85 pinnedMode: !fullscreenMode
107 pinnedMode: !fullscreenMode
86 overFlowWidth: search.state=="hidden" ? parent.width : parent.width - search.width
108 overFlowWidth: search.state=="hidden" ? parent.width : parent.width - search.width
87
109
88− property real unitProgress: (height - panelHeight) / (openedHeight - panelHeight)
110+ unitProgress: (height - panelHeight) / (openedHeight - panelHeight)
89 }
111 }
90
112
91 PanelSeparatorLine {
113 PanelSeparatorLine {
Panel/PanelBackground.qml → qml/Panel/PanelBackground.qmlrenamed

The content is the same.

Panel/PanelSeparatorLine.qml → qml/Panel/PanelSeparatorLine.qmlrenamed

The content is the same.

Panel/SearchIndicator.qml → qml/Panel/SearchIndicator.qmlrenamed

The content is the same.

Panel/graphics/Battery@18.png → qml/Panel/graphics/Battery@18.pngrenamed

Binary file not shown.

Panel/graphics/Bluetooth@18.png → qml/Panel/graphics/Bluetooth@18.pngrenamed

Binary file not shown.

Panel/graphics/Clock@18.png → qml/Panel/graphics/Clock@18.pngrenamed

Binary file not shown.

Panel/graphics/Location@18.png → qml/Panel/graphics/Location@18.pngrenamed

Binary file not shown.

Panel/graphics/Messages@18.png → qml/Panel/graphics/Messages@18.pngrenamed

Binary file not shown.

Panel/graphics/Network@18.png → qml/Panel/graphics/Network@18.pngrenamed

Binary file not shown.

Panel/graphics/Sound@18.png → qml/Panel/graphics/Sound@18.pngrenamed

Binary file not shown.

Panel/graphics/Sync@18.png → qml/Panel/graphics/Sync@18.pngrenamed

Binary file not shown.

Panel/graphics/System@18.png → qml/Panel/graphics/System@18.pngrenamed

Binary file not shown.

Panel/graphics/Time@18.png → qml/Panel/graphics/Time@18.pngrenamed

Binary file not shown.

Panel/graphics/VerticalDivider@18.png → qml/Panel/graphics/VerticalDivider@18.pngrenamed

Binary file not shown.

Panel/graphics/handle@12.png → qml/Panel/graphics/handle@12.pngrenamed

Binary file not shown.

Panel/graphics/handle@12.sci → qml/Panel/graphics/handle@12.scirenamed

The content is the same.

Panel/graphics/rectangular_dropshadow@30.png → qml/Panel/graphics/rectangular_dropshadow@30.pngrenamed

Binary file not shown.

Panel/graphics/rectangular_dropshadow@30.sci → qml/Panel/graphics/rectangular_dropshadow@30.scirenamed

The content is the same.

Panel/graphics/search@12.png → qml/Panel/graphics/search@12.pngrenamed

Binary file not shown.

Panel/graphics/time_and_date@18.png → qml/Panel/graphics/time_and_date@18.pngrenamed

Binary file not shown.

qml/ScopeTool.qmlnew file+175
@@ -0,0 +1,175 @@
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 Ubuntu.Components.Popups 0.1
20+import Utils 0.1
21+import Unity 0.1
22+import "Components"
23+import "Dash"
24+
25+Rectangle {
26+ id: root
27+ width: units.gu(80)
28+ height: units.gu(72)
29+ color: "#88FFFFFF"
30+
31+ // Fake shell object
32+ QtObject {
33+ id: shell
34+ }
35+
36+ // Fake greeter object
37+ QtObject {
38+ id: greeter
39+ property bool shown
40+ }
41+
42+ // Fake panel object
43+ QtObject {
44+ id: panel
45+ signal searchClicked
46+ }
47+
48+ SortFilterProxyModel {
49+ id: filteredScopes
50+ model: Scopes {
51+ id: scopes
52+ }
53+ dynamicSortFilter: true
54+
55+ filterRole: Scopes.RoleVisible
56+ filterRegExp: RegExp("^true$")
57+ }
58+
59+ Rectangle {
60+ anchors.fill: dashContent
61+ color: "#FCFCFC"
62+ }
63+
64+ DashContent {
65+ id: dashContent
66+
67+ model: filteredScopes
68+ searchHistory: SearchHistoryModel { }
69+ property Scope scope: scopes.get(currentIndex)
70+
71+ anchors {
72+ top: parent.top
73+ bottom: parent.bottom
74+ left: parent.left
75+ right: controls.left
76+ }
77+ }
78+
79+ Rectangle {
80+ id: controls
81+ color: "lightgrey"
82+ width: units.gu(40)
83+ anchors {
84+ top: parent.top
85+ bottom: parent.bottom
86+ right: parent.right
87+ }
88+
89+ MouseArea {
90+ anchors.fill: parent
91+ }
92+
93+ Column {
94+ anchors { fill: parent; margins: units.gu(1) }
95+ spacing: units.gu(1)
96+
97+ Label {
98+ text: "Search query"
99+ }
100+
101+ TextField {
102+ id: searchField
103+ anchors { left: parent.left; right: parent.right }
104+
105+ onTextChanged: dashContent.scope.searchQuery = text
106+
107+ Connections {
108+ target: dashContent.scope
109+ onSearchQueryChanged: searchField.text = dashContent.scope.searchQuery
110+ }
111+ }
112+
113+ Label {
114+ text: "Category"
115+ height: units.gu(4)
116+ verticalAlignment: Text.AlignBottom
117+ }
118+
119+ OptionSelector {
120+ id: categorySelector
121+ anchors { left: parent.left; right: parent.right }
122+ model: dashContent.scope ? dashContent.scope.categories : null
123+
124+ property Item selectedItem
125+
126+ delegate: OptionSelectorDelegate {
127+ id: categoryDelegate
128+ text: model.name
129+ property string categoryId: model.categoryId
130+ property string template: JSON.stringify(JSON.parse(model.rawRendererTemplate), null, " ");
131+
132+ onSelectedChanged: if (selected) categorySelector.selectedItem = categoryDelegate
133+ }
134+ }
135+
136+ TextArea {
137+ id: categoryJson
138+ width: parent.width
139+ autoSize: true
140+ readOnly: true
141+ text: categorySelector.selectedItem && categorySelector.selectedItem.template
142+ }
143+
144+ Button {
145+ width: parent.width
146+ text: "Override category"
147+ onClicked: {
148+ PopupUtils.open(categoryEditor)
149+ }
150+ }
151+ }
152+ }
153+
154+ Component {
155+ id: categoryEditor
156+
157+ ComposerSheet {
158+ id: sheet
159+ title: "Editing category definition"
160+
161+ TextArea {
162+ id: categoryEditorArea
163+ anchors.fill: parent
164+ wrapMode: Text.WordWrap
165+ text: categoryJson.text
166+ }
167+
168+ onCancelClicked: PopupUtils.close(sheet)
169+ onConfirmClicked: {
170+ PopupUtils.close(sheet);
171+ dashContent.scope.categories.overrideCategoryJson(categorySelector.selectedItem.categoryId, categoryEditorArea.text);
172+ }
173+ }
174+ }
175+}
Shell.qml → qml/Shell.qmlrenamed+23−10
@@ -44,7 +44,7 @@ FocusScope {
44 height: tablet ? units.gu(100) : applicationArguments.hasGeometry() ? applicationArguments.height() : units.gu(71)
44 height: tablet ? units.gu(100) : applicationArguments.hasGeometry() ? applicationArguments.height() : units.gu(71)
45
45
46 property real edgeSize: units.gu(2)
46 property real edgeSize: units.gu(2)
47− property url defaultBackground: shell.width >= units.gu(60) ? "graphics/tablet_background.jpg" : "graphics/phone_background.jpg"
47+ property url defaultBackground: Qt.resolvedUrl(shell.width >= units.gu(60) ? "graphics/tablet_background.jpg" : "graphics/phone_background.jpg")
48 property url background
48 property url background
49 readonly property real panelHeight: panel.panelHeight
49 readonly property real panelHeight: panel.panelHeight
50
50
@@ -96,21 +96,21 @@ FocusScope {
96 }
96 }
97 }
97 }
98
98
99− function activateApplication(desktopFile, argument) {
99+ function activateApplication(appId, argument) {
100 if (applicationManager) {
100 if (applicationManager) {
101 // For newly started applications, as it takes them time to draw their first frame
101 // For newly started applications, as it takes them time to draw their first frame
102 // we add a delay before we hide the animation screenshots to compensate.
102 // we add a delay before we hide the animation screenshots to compensate.
103− var addDelay = !applicationManager.getApplicationFromDesktopFile(desktopFile);
103+ var addDelay = !applicationManager.getApplicationFromDesktopFile(appId);
104
104
105 var application;
105 var application;
106− application = applicationManager.activateApplication(desktopFile, argument);
106+ application = applicationManager.activateApplication(appId, argument);
107 if (application == null) {
107 if (application == null) {
108 return;
108 return;
109 }
109 }
110 if (application.stage == ApplicationInfo.MainStage || !sideStage.enabled) {
110 if (application.stage == ApplicationInfo.MainStage || !sideStage.enabled) {
111− mainStage.activateApplication(desktopFile, addDelay);
111+ mainStage.activateApplication(appId, addDelay);
112 } else {
112 } else {
113− sideStage.activateApplication(desktopFile, addDelay);
113+ sideStage.activateApplication(appId, addDelay);
114 }
114 }
115 stages.show();
115 stages.show();
116 }
116 }
@@ -413,6 +413,7 @@ FocusScope {
413 width: parent.width
413 width: parent.width
414 height: parent.height - panel.panelHeight
414 height: parent.height - panel.panelHeight
415 background: shell.background
415 background: shell.background
416+ pinLength: 4
416
417
417 onEntered: LightDM.Greeter.respond(passphrase);
418 onEntered: LightDM.Greeter.respond(passphrase);
418 onCancel: greeter.show()
419 onCancel: greeter.show()
@@ -576,6 +577,10 @@ FocusScope {
576 stages.hide()
577 stages.hide()
577 }
578 }
578
579
580+ function hideIndicatorMenu(delay) {
581+ panel.hideIndicatorMenu(delay);
582+ }
583+
579 Item {
584 Item {
580 id: overlay
585 id: overlay
581
586
@@ -667,7 +672,12 @@ FocusScope {
667 dragAreaWidth: shell.edgeSize
672 dragAreaWidth: shell.edgeSize
668 available: (!greeter.shown || greeter.narrowMode) && edgeDemo.launcherEnabled
673 available: (!greeter.shown || greeter.narrowMode) && edgeDemo.launcherEnabled
669
674
675+ onShowDashHome: {
676+ if (edgeDemo.running)
677+ return;
678+
670− onDashItemSelected: showHome()
679+ showHome()
680+ }
671 onDash: {
681 onDash: {
672 if (stages.shown) {
682 if (stages.shown) {
673 stages.hide();
683 stages.hide();
@@ -676,6 +686,9 @@ FocusScope {
676 }
686 }
677 onDashSwipeChanged: if (dashSwipe && stages.shown) dash.setCurrentScope("applications.scope", false, true)
687 onDashSwipeChanged: if (dashSwipe && stages.shown) dash.setCurrentScope("applications.scope", false, true)
678 onLauncherApplicationSelected:{
688 onLauncherApplicationSelected:{
689+ if (edgeDemo.running)
690+ return;
691+
679 greeter.hide()
692 greeter.hide()
680 shell.activateApplication(appId)
693 shell.activateApplication(appId)
681 }
694 }
@@ -692,13 +705,13 @@ FocusScope {
692 id: notifications
705 id: notifications
693
706
694 model: NotificationBackend.Model
707 model: NotificationBackend.Model
708+ margin: units.gu(1)
709+
695 anchors {
710 anchors {
696 top: parent.top
711 top: parent.top
697 right: parent.right
712 right: parent.right
698 bottom: parent.bottom
713 bottom: parent.bottom
699− leftMargin: units.gu(1)
700− rightMargin: units.gu(1)
701− topMargin: panel.panelHeight + units.gu(1)
714+ topMargin: panel.panelHeight
702 }
715 }
703 states: [
716 states: [
704 State {
717 State {
SideStage/SideStage.qml → qml/SideStage/SideStage.qmlrenamed

The content is the same.

SideStage/SidestageHandle.qml → qml/SideStage/SidestageHandle.qmlrenamed

The content is the same.

SideStage/graphics/sidestage_handle@20.png → qml/SideStage/graphics/sidestage_handle@20.pngrenamed

Binary file not shown.

SideStage/graphics/sidestage_handle@20.sci → qml/SideStage/graphics/sidestage_handle@20.scirenamed

The content is the same.

graphics/12_10_background_wide@12.png → qml/graphics/12_10_background_wide@12.pngrenamed

Binary file not shown.

graphics/applicationIcons/angrybirds@18.png → qml/graphics/applicationIcons/angrybirds@18.pngrenamed

Binary file not shown.

graphics/applicationIcons/browser@18.png → qml/graphics/applicationIcons/browser@18.pngrenamed

Binary file not shown.

graphics/applicationIcons/calendar@18.png → qml/graphics/applicationIcons/calendar@18.pngrenamed

Binary file not shown.

graphics/applicationIcons/camera@18.png → qml/graphics/applicationIcons/camera@18.pngrenamed

Binary file not shown.

graphics/applicationIcons/contacts-app@18.png → qml/graphics/applicationIcons/contacts-app@18.pngrenamed

Binary file not shown.

graphics/applicationIcons/dash@18.png → qml/graphics/applicationIcons/dash@18.pngrenamed

Binary file not shown.

graphics/applicationIcons/evernote@18.png → qml/graphics/applicationIcons/evernote@18.pngrenamed

Binary file not shown.

graphics/applicationIcons/facebook@18.png → qml/graphics/applicationIcons/facebook@18.pngrenamed

Binary file not shown.

graphics/applicationIcons/gallery@18.png → qml/graphics/applicationIcons/gallery@18.pngrenamed

Binary file not shown.

graphics/applicationIcons/gmail@18.png → qml/graphics/applicationIcons/gmail@18.pngrenamed

Binary file not shown.

graphics/applicationIcons/map@18.png → qml/graphics/applicationIcons/map@18.pngrenamed

Binary file not shown.

graphics/applicationIcons/media-player@18.png → qml/graphics/applicationIcons/media-player@18.pngrenamed

Binary file not shown.

graphics/applicationIcons/messages-app@18.png → qml/graphics/applicationIcons/messages-app@18.pngrenamed

Binary file not shown.

graphics/applicationIcons/music@18.png → qml/graphics/applicationIcons/music@18.pngrenamed

Binary file not shown.

graphics/applicationIcons/notepad@18.png → qml/graphics/applicationIcons/notepad@18.pngrenamed

Binary file not shown.

graphics/applicationIcons/phone-app@18.png → qml/graphics/applicationIcons/phone-app@18.pngrenamed

Binary file not shown.

graphics/applicationIcons/pinterest@18.png → qml/graphics/applicationIcons/pinterest@18.pngrenamed

Binary file not shown.

graphics/applicationIcons/ski_safari@18.png → qml/graphics/applicationIcons/ski_safari@18.pngrenamed

Binary file not shown.

graphics/applicationIcons/skype@18.png → qml/graphics/applicationIcons/skype@18.pngrenamed

Binary file not shown.

graphics/applicationIcons/soundcloud@18.png → qml/graphics/applicationIcons/soundcloud@18.pngrenamed

Binary file not shown.

graphics/applicationIcons/system-settings@18.png → qml/graphics/applicationIcons/system-settings@18.pngrenamed

Binary file not shown.

graphics/applicationIcons/twitter@18.png → qml/graphics/applicationIcons/twitter@18.pngrenamed

Binary file not shown.

graphics/applicationIcons/weather@18.png → qml/graphics/applicationIcons/weather@18.pngrenamed

Binary file not shown.

graphics/applicationIcons/wikipedia@18.png → qml/graphics/applicationIcons/wikipedia@18.pngrenamed

Binary file not shown.

graphics/applicationIcons/youtube@18.png → qml/graphics/applicationIcons/youtube@18.pngrenamed

Binary file not shown.

graphics/avatars/amanda@12.png → qml/graphics/avatars/amanda@12.pngrenamed

Binary file not shown.

graphics/avatars/anna_olsson@12.png → qml/graphics/avatars/anna_olsson@12.pngrenamed

Binary file not shown.

graphics/avatars/funky@12.png → qml/graphics/avatars/funky@12.pngrenamed

Binary file not shown.

graphics/clock@18.png → qml/graphics/clock@18.pngrenamed

Binary file not shown.

graphics/phone_background.jpg → qml/graphics/phone_background.jpgrenamed

Binary file not shown.

graphics/tablet_background.jpg → qml/graphics/tablet_background.jpgrenamed

Binary file not shown.

run+7−6
@@ -1,6 +1,9 @@
1#!/bin/sh
1#!/bin/sh
2
2
3+. /etc/environment
4+export QML2_IMPORT_PATH
5+
3−QML_PHONE_SHELL_PATH=./builddir/unity8
6+QML_PHONE_SHELL_PATH=./builddir/src/unity8
4GDB=false
7GDB=false
5FAKE=false
8FAKE=false
6PINLOCK=false
9PINLOCK=false
@@ -40,19 +43,17 @@ do
40done
43done
41
44
42if $FAKE; then
45if $FAKE; then
43− export QML2_IMPORT_PATH=$PWD/builddir/tests/mocks:$PWD/builddir/plugins:$PWD/builddir/modules
46+ export QML2_IMPORT_PATH=$QML2_IMPORT_PATH:$PWD/builddir/tests/mocks:$PWD/builddir/plugins:$PWD/builddir/modules
44 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/builddir/tests/mocks/libusermetrics:$PWD/builddir/tests/mocks/LightDM/single
47 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/builddir/tests/mocks/libusermetrics:$PWD/builddir/tests/mocks/LightDM/single
45−else
46− export QML2_IMPORT_PATH=`pkg-config --variable=plugindir unity-shell-api`
47fi
48fi
48
49
49if $PINLOCK; then
50if $PINLOCK; then
50− export QML2_IMPORT_PATH=$PWD/builddir/tests/mocks:$PWD/builddir/plugins:$PWD/builddir/modules
51+ export QML2_IMPORT_PATH=$QML2_IMPORT_PATH:$PWD/builddir/tests/mocks:$PWD/builddir/plugins:$PWD/builddir/modules
51 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/builddir/tests/mocks/libusermetrics:$PWD/builddir/tests/mocks/LightDM/single-pin
52 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/builddir/tests/mocks/libusermetrics:$PWD/builddir/tests/mocks/LightDM/single-pin
52fi
53fi
53
54
54if $KEYLOCK; then
55if $KEYLOCK; then
55− export QML2_IMPORT_PATH=$PWD/builddir/tests/mocks:$PWD/builddir/plugins:$PWD/builddir/modules
56+ export QML2_IMPORT_PATH=$QML2_IMPORT_PATH:$PWD/builddir/tests/mocks:$PWD/builddir/plugins:$PWD/builddir/modules
56 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/builddir/tests/mocks/libusermetrics:$PWD/builddir/tests/mocks/LightDM/single-passphrase
57 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/builddir/tests/mocks/libusermetrics:$PWD/builddir/tests/mocks/LightDM/single-passphrase
57fi
58fi
58
59
run_on_device−1
@@ -88,7 +88,6 @@ sync_code() {
88}
88}
89
89
90build() {
90build() {
91− exec_with_ssh "[ $CODE_DIR/debian/control -nt unity8-build-deps*deb ] && $SUDO mk-build-deps --tool=\\\"apt-get -y --no-install-recommends\\\" --build-dep --install $CODE_DIR/debian/control"
92 exec_with_ssh PATH=/usr/lib/ccache:$PATH "cd $CODE_DIR/ && PATH=/usr/lib/ccache:$PATH ./build"
91 exec_with_ssh PATH=/usr/lib/ccache:$PATH "cd $CODE_DIR/ && PATH=/usr/lib/ccache:$PATH ./build"
93}
92}
94
93
runtests.sh+1−13
@@ -26,19 +26,7 @@
26# floating point operations and xml writing is natively supported.
26# floating point operations and xml writing is natively supported.
27
27
28
28
29−if test -e Shell.qml; then
29+SRCDIR=`dirname "$(readlink -f "$0")"`
30− echo In-source build detected.
31− SRCDIR=`pwd`
32−elif test -e ../Shell.qml; then
33− echo Out-of-source build detected. Found source dir at ..
34− SRCDIR=`pwd`/..
35−else
36− echo Out-of-source build detected. Source dir not found at ..
37− echo Only in-source builds or out-of-source builds with source dir at .. are supported.
38− exit 1
39−fi
40−
41−cd $SRCDIR
42
30
43file_list=""
31file_list=""
44
32
ApplicationArguments.h → src/ApplicationArguments.hrenamed

The content is the same.

src/CMakeLists.txt+38
@@ -1 +1,39 @@
1+pkg_check_modules(UNITY-MIR REQUIRED unity-mir)
2+
3+include_directories(
4+ ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
5+ ${UNITY-MIR_INCLUDE_DIRS}
6+)
7+
8+file(GLOB_RECURSE QML_FILES
9+ ${CMAKE_SOURCE_DIR}/qml/*
10+ ${CMAKE_SOURCE_DIR}/tests/*.qml
11+ ${CMAKE_SOURCE_DIR}/tests/*.js
12+ ${CMAKE_SOURCE_DIR}/tests/*.jpg
13+ ${CMAKE_SOURCE_DIR}/tests/*.png
14+ ${CMAKE_SOURCE_DIR}/tests/*.sci
15+ ${CMAKE_SOURCE_DIR}/tests/*.svg
16+)
17+
18+add_executable(${SHELL_APP}
19+ ApplicationArguments.h
20+ main.cpp
21+ MouseTouchAdaptor.cpp
22+ ${QML_FILES} # This is to make qml and image files appear in the IDE's project tree
23+)
24+
25+qt5_use_modules(${SHELL_APP} Gui Qml Quick Test)
26+pkg_check_modules(XCB REQUIRED xcb)
27+
28+if (NOT "${XCB_INCLUDE_DIRS}" STREQUAL "")
29+ set_target_properties(${SHELL_APP} PROPERTIES INCLUDE_DIRECTORIES ${XCB_INCLUDE_DIRS})
30+
31+ target_link_libraries(${SHELL_APP} ${XCB_LDFLAGS})
32+endif()
33+
34+# install binaries
35+install(TARGETS ${SHELL_APP}
36+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
37+ )
38+
1add_subdirectory(Panel)
39add_subdirectory(Panel)
MouseTouchAdaptor.cpp → src/MouseTouchAdaptor.cpprenamed

The content is the same.

MouseTouchAdaptor.h → src/MouseTouchAdaptor.hrenamed

The content is the same.

src/Panel/Indicators/client/CMakeLists.txt−4
@@ -14,10 +14,6 @@ add_executable(${INDICATORS_CLIENT_APP}
14 ${INDICATORS_CLIENT_HEADERS}
14 ${INDICATORS_CLIENT_HEADERS}
15)
15)
16
16
17−include_directories(
18− ${CMAKE_BINARY_DIR}
19−)
20−
21qt5_use_modules(${INDICATORS_CLIENT_APP} Core Widgets Quick)
17qt5_use_modules(${INDICATORS_CLIENT_APP} Core Widgets Quick)
22set_target_properties(${INDICATORS_CLIENT_APP} PROPERTIES COMPILE_FLAGS -fPIC)
18set_target_properties(${INDICATORS_CLIENT_APP} PROPERTIES COMPILE_FLAGS -fPIC)
23
19
src/Panel/Indicators/client/indicatorsclient.cpp+3−37
@@ -19,48 +19,14 @@
19 */
19 */
20
20
21#include "indicatorsclient.h"
21#include "indicatorsclient.h"
22+
22−#include "paths.h"
23+#include <paths.h>
23
24
24#include <QQuickView>
25#include <QQuickView>
25#include <QQmlContext>
26#include <QQmlContext>
26#include <QQmlEngine>
27#include <QQmlEngine>
27#include <QDebug>
28#include <QDebug>
28
29
29−namespace {
30−
31−void prependImportPaths(QQmlEngine *engine, const QStringList &paths)
32−{
33− QStringList importPathList = engine->importPathList();
34− for (int i = paths.count()-1; i >= 0; i--) {
35− importPathList.prepend(paths[i]);
36− }
37− engine->setImportPathList(importPathList);
38−}
39−
40−/* When you append and import path to the list of import paths it will be the *last*
41− place where Qt will search for QML modules.
42− The usual QQmlEngine::addImportPath() actually prepends the given path.*/
43−void appendImportPaths(QQmlEngine *engine, const QStringList &paths)
44−{
45− QStringList importPathList = engine->importPathList();
46− Q_FOREACH(const QString& path, paths) {
47− // don't duplicate
48− QStringList::iterator iter = qFind(importPathList.begin(), importPathList.end(), path);
49− if (iter == importPathList.end()) {
50− importPathList.append(path);
51− }
52− }
53− engine->setImportPathList(importPathList);
54−}
55−
56−void resolveIconTheme() {
57− QString ubuntuIconTheme = getenv("UBUNTU_ICON_THEME");
58− if (ubuntuIconTheme.isEmpty()) {
59− QIcon::setThemeName("ubuntu-mobile");
60− }
61−}
62−} // namespace
63−
64IndicatorsClient::IndicatorsClient(int &argc, char **argv)
30IndicatorsClient::IndicatorsClient(int &argc, char **argv)
65 : QObject(0),
31 : QObject(0),
66 m_view(0)
32 m_view(0)
@@ -71,7 +37,7 @@ IndicatorsClient::IndicatorsClient(int &argc, char **argv)
71 QStringList args = m_application->arguments();
37 QStringList args = m_application->arguments();
72
38
73 m_view = new QQuickView;
39 m_view = new QQuickView;
74− m_view->engine()->setBaseUrl(QUrl::fromLocalFile(::shellAppDirectory()+"Panel/Indicators/client/"));
40+ m_view->engine()->setBaseUrl(QUrl::fromLocalFile(::qmlDirectory()+"Panel/Indicators/client/"));
75 prependImportPaths(m_view->engine(), ::overrideImportPaths());
41 prependImportPaths(m_view->engine(), ::overrideImportPaths());
76 appendImportPaths(m_view->engine(), ::fallbackImportPaths());
42 appendImportPaths(m_view->engine(), ::fallbackImportPaths());
77
43
main.cpp → src/main.cpprenamed+9−43
@@ -19,7 +19,6 @@
19
19
20// Qt
20// Qt
21#include <QtQuick/QQuickView>
21#include <QtQuick/QQuickView>
22−#include <QtGui/QIcon>
23#include <QtGui/QGuiApplication>
22#include <QtGui/QGuiApplication>
24#include <QtQml/QQmlEngine>
23#include <QtQml/QQmlEngine>
25#include <QtQml/QQmlContext>
24#include <QtQml/QQmlContext>
@@ -28,53 +27,15 @@
28#include <QDebug>
27#include <QDebug>
29#include <libintl.h>
28#include <libintl.h>
30#include <dlfcn.h>
29#include <dlfcn.h>
30+#include <csignal>
31
31
32// local
32// local
33−#include "paths.h"
33+#include <paths.h>
34#include "MouseTouchAdaptor.h"
34#include "MouseTouchAdaptor.h"
35#include "ApplicationArguments.h"
35#include "ApplicationArguments.h"
36
36
37#include <unity-mir/qmirserver.h>
37#include <unity-mir/qmirserver.h>
38
38
39−namespace {
40−
41−void prependImportPaths(QQmlEngine *engine, const QStringList &paths)
42−{
43− QStringList importPathList = engine->importPathList();
44− for (int i = paths.count() -1; i >= 0; i--) {
45− // don't duplicate
46− const QString& path = paths[i];
47− QStringList::iterator iter = qFind(importPathList.begin(), importPathList.end(), path);
48− if (iter == importPathList.end()) {
49− engine->addImportPath(path);
50− }
51− }
52−}
53−
54−/* When you append and import path to the list of import paths it will be the *last*
55− place where Qt will search for QML modules.
56− The usual QQmlEngine::addImportPath() actually prepends the given path.*/
57−void appendImportPaths(QQmlEngine *engine, const QStringList &paths)
58−{
59− QStringList importPathList = engine->importPathList();
60− Q_FOREACH(const QString& path, paths) {
61− // don't duplicate
62− QStringList::iterator iter = qFind(importPathList.begin(), importPathList.end(), path);
63− if (iter == importPathList.end()) {
64− importPathList.append(path);
65− }
66− }
67− engine->setImportPathList(importPathList);
68−}
69−
70−void resolveIconTheme() {
71− const char *ubuntuIconTheme = getenv("UBUNTU_ICON_THEME");
72− if (ubuntuIconTheme == NULL) {
73− ubuntuIconTheme = "ubuntu-mobile";
74− }
75− QIcon::setThemeName(ubuntuIconTheme);
76−}
77−} // namespace {
78
39
79int startShell(int argc, const char** argv, void* server)
40int startShell(int argc, const char** argv, void* server)
80{
41{
@@ -125,7 +86,7 @@ int startShell(int argc, const char** argv, void* server)
125 QQuickView* view = new QQuickView();
86 QQuickView* view = new QQuickView();
126 view->setResizeMode(QQuickView::SizeRootObjectToView);
87 view->setResizeMode(QQuickView::SizeRootObjectToView);
127 view->setTitle("Qml Phone Shell");
88 view->setTitle("Qml Phone Shell");
128− view->engine()->setBaseUrl(QUrl::fromLocalFile(::shellAppDirectory()));
89+ view->engine()->setBaseUrl(QUrl::fromLocalFile(::qmlDirectory()));
129 view->rootContext()->setContextProperty("applicationArguments", &qmlArgs);
90 view->rootContext()->setContextProperty("applicationArguments", &qmlArgs);
130 if (args.contains(QLatin1String("-frameless"))) {
91 if (args.contains(QLatin1String("-frameless"))) {
131 view->setFlags(Qt::FramelessWindowHint);
92 view->setFlags(Qt::FramelessWindowHint);
@@ -148,7 +109,7 @@ int startShell(int argc, const char** argv, void* server)
148 nativeInterface->setProperty("ubuntuSessionType", 1);
109 nativeInterface->setProperty("ubuntuSessionType", 1);
149 view->setProperty("role", 2); // INDICATOR_ACTOR_ROLE
110 view->setProperty("role", 2); // INDICATOR_ACTOR_ROLE
150
111
151− QUrl source("Shell.qml");
112+ QUrl source(::qmlDirectory()+"Shell.qml");
152 prependImportPaths(view->engine(), ::overrideImportPaths());
113 prependImportPaths(view->engine(), ::overrideImportPaths());
153 appendImportPaths(view->engine(), ::fallbackImportPaths());
114 appendImportPaths(view->engine(), ::fallbackImportPaths());
154
115
@@ -218,6 +179,11 @@ int main(int argc, const char *argv[])
218
179
219 return runWithClient(mirServer, startShell);
180 return runWithClient(mirServer, startShell);
220 } else {
181 } else {
182+ if (qgetenv("UPSTART_JOB") == "unity8") {
183+ // Emit SIGSTOP as expected by upstart, under Mir it's unity-mir that will raise it.
184+ // see http://upstart.ubuntu.com/cookbook/#expect-stop
185+ raise(SIGSTOP);
186+ }
221 return startShell(argc, argv, nullptr);
187 return startShell(argc, argv, nullptr);
222 }
188 }
223}
189}
tests/autopilot/.projectnew file+17
@@ -0,0 +1,17 @@
1+<?xml version="1.0" encoding="UTF-8"?>
2+<projectDescription>
3+ <name>Unity8 Autopilot</name>
4+ <comment></comment>
5+ <projects>
6+ </projects>
7+ <buildSpec>
8+ <buildCommand>
9+ <name>org.python.pydev.PyDevBuilder</name>
10+ <arguments>
11+ </arguments>
12+ </buildCommand>
13+ </buildSpec>
14+ <natures>
15+ <nature>org.python.pydev.pythonNature</nature>
16+ </natures>
17+</projectDescription>
tests/autopilot/.pydevprojectnew file+8
@@ -0,0 +1,8 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<?eclipse-pydev version="1.0"?><pydev_project>
3+<pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH">
4+<path>/Unity8 Autopilot</path>
5+</pydev_pathproperty>
6+<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property>
7+<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
8+</pydev_project>
tests/autopilot/unity8/application_lifecycle/tests/test_application_lifecycle.py+7−6
@@ -21,6 +21,7 @@
21
21
22from __future__ import absolute_import
22from __future__ import absolute_import
23
23
24+from unity8.process_helpers import unlock_unity
24from unity8.shell import disable_qml_mocking
25from unity8.shell import disable_qml_mocking
25from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
26from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
26
27
@@ -78,8 +79,8 @@ class ApplicationLifecycleTests(UnityTestCase):
78 @disable_qml_mocking
79 @disable_qml_mocking
79 def test_can_launch_application(self):
80 def test_can_launch_application(self):
80 """Must be able to launch an application."""
81 """Must be able to launch an application."""
81− self.launch_unity()
82+ unity_proxy = self.launch_unity()
82− self.main_window.get_greeter().swipe()
83+ unlock_unity(unity_proxy)
83
84
84 app = self._launch_app("messaging-app")
85 app = self._launch_app("messaging-app")
85
86
@@ -92,8 +93,8 @@ class ApplicationLifecycleTests(UnityTestCase):
92 @disable_qml_mocking
93 @disable_qml_mocking
93 def test_can_launch_multiple_applications(self):
94 def test_can_launch_multiple_applications(self):
94 """A second application launched must be focused."""
95 """A second application launched must be focused."""
95− self.launch_unity()
96+ unity_proxy = self.launch_unity()
96− self.main_window.get_greeter().swipe()
97+ unlock_unity(unity_proxy)
97
98
98 self._launch_app("messaging-app")
99 self._launch_app("messaging-app")
99 self.assertThat(
100 self.assertThat(
@@ -113,8 +114,8 @@ class ApplicationLifecycleTests(UnityTestCase):
113 brought back to the focused state.
114 brought back to the focused state.
114
115
115 """
116 """
116− self.launch_unity()
117+ unity_proxy = self.launch_unity()
117− self.main_window.get_greeter().swipe()
118+ unlock_unity(unity_proxy)
118
119
119 self._launch_app("messaging-app")
120 self._launch_app("messaging-app")
120 self.assertThat(
121 self.assertThat(
tests/autopilot/unity8/indicators/__init__.pynew file

No changes to the content.

tests/autopilot/unity8/indicators/tests/__init__.pynew file

No changes to the content.

tests/autopilot/unity8/indicators/tests/test_indicators.pynew file+50
@@ -0,0 +1,50 @@
1+# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2+#
3+# Unity - Indicators Autopilot Test Suite
4+# Copyright (C) 2013 Canonical
5+#
6+# This program is free software: you can redistribute it and/or modify
7+# it under the terms of the GNU General Public License as published by
8+# the Free Software Foundation, either version 3 of the License, or
9+# (at your option) any later version.
10+#
11+# This program is distributed in the hope that it will be useful,
12+# but WITHOUT ANY WARRANTY; without even the implied warranty of
13+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+# GNU General Public License for more details.
15+#
16+# You should have received a copy of the GNU General Public License
17+# along with this program. If not, see <http://www.gnu.org/licenses/>.
18+#
19+
20+from __future__ import absolute_import
21+
22+from autopilot import platform
23+from testtools import skipIf
24+
25+from unity8.process_helpers import unlock_unity
26+from unity8.shell.tests import UnityTestCase
27+
28+
29+class IndicatorTestCase(UnityTestCase):
30+
31+ scenarios = [
32+ ('Bluetooth', dict(indicator_name='indicator-bluetooth')),
33+ ('Datetime', dict(indicator_name='indicator-datetime')),
34+ ('Location', dict(indicator_name='indicator-location')),
35+ ('Messaging', dict(indicator_name='indicator-messages')),
36+ ('Network', dict(indicator_name='indicator-network')),
37+ ('Power', dict(indicator_name='indicator-power')),
38+ ('Sound', dict(indicator_name='indicator-sound')),
39+ ]
40+
41+ @skipIf(platform.image_codename() == 'Desktop',
42+ "Unity8/phablet-only test!")
43+ def setUp(self):
44+ super(IndicatorTestCase, self).setUp()
45+
46+ def test_indicator_exists(self):
47+ unity_proxy = self.launch_unity()
48+ unlock_unity(unity_proxy)
49+ indicator = self.main_window.get_indicator(self.indicator_name)
50+ self.assertIsNotNone(indicator)
tests/autopilot/unity8/process_helpers.py+17−1
@@ -69,7 +69,23 @@ def unlock_unity(unity_proxy_obj=None):
69 greeter = main_window.get_greeter()
69 greeter = main_window.get_greeter()
70 if greeter.created == False:
70 if greeter.created == False:
71 raise RuntimeWarning("Greeter appears to be already unlocked.")
71 raise RuntimeWarning("Greeter appears to be already unlocked.")
72+
73+ # Because of potential input jerkiness under heavy load,
74+ # retry unlocking the greeter two times.
75+ # https://bugs.launchpad.net/ubuntu/+bug/1260113
76+
77+ retries = 3
78+ while retries > 0:
79+ try:
72− greeter.swipe()
80+ greeter.swipe()
81+ except AssertionError:
82+ retries -= 1
83+ if retries == 0:
84+ raise
85+ logger.info("Failed to unlock greeter, trying again...")
86+ else:
87+ logger.info("Greeter unlocked, continuing.")
88+ break
73
89
74
90
75def restart_unity_with_testability(*args):
91def restart_unity_with_testability(*args):
tests/autopilot/unity8/shell/emulators/__init__.py+11−4
@@ -1,7 +1,7 @@
1# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
1# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2#
2#
3# Unity Autopilot Test Suite
3# Unity Autopilot Test Suite
4−# Copyright (C) 2012-2013 Canonical
4+# Copyright (C) 2012, 2013, 2014 Canonical
5#
5#
6# This program is free software: you can redistribute it and/or modify
6# This program is free software: you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
7# it under the terms of the GNU General Public License as published by
@@ -17,9 +17,16 @@
17# along with this program. If not, see <http://www.gnu.org/licenses/>.
17# along with this program. If not, see <http://www.gnu.org/licenses/>.
18#
18#
19
19
20+from autopilot import input, introspection
20
21
21−from autopilot.introspection import CustomEmulatorBase
22
22
23−
24−class UnityEmulatorBase(CustomEmulatorBase):
23+class UnityEmulatorBase(introspection.CustomEmulatorBase):
25 """A base class for all unity emulators."""
24 """A base class for all unity emulators."""
25+
26+ def __init__(self, *args):
27+ super(UnityEmulatorBase, self).__init__(*args)
28+ self.pointing_device = input.Touch.create()
29+
30+
31+class UnityEmulatorException(Exception):
32+ """Exception raised when there is an error with the Unity emulators."""
tests/autopilot/unity8/shell/emulators/create_interactive_notification.py+1−1
@@ -87,7 +87,7 @@ if __name__ == '__main__':
87 action_id,
87 action_id,
88 action_label,
88 action_label,
89 action_callback,
89 action_callback,
90− None,
90+ (None, ),
91 None
91 None
92 )
92 )
93
93
tests/autopilot/unity8/shell/emulators/dash.py+102−8
@@ -1,7 +1,7 @@
1# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
1# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2#
2#
3# Unity Autopilot Test Suite
3# Unity Autopilot Test Suite
4−# Copyright (C) 2012-2013 Canonical
4+# Copyright (C) 2012, 2013, 2014 Canonical
5#
5#
6# This program is free software: you can redistribute it and/or modify
6# This program is free software: you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
7# it under the terms of the GNU General Public License as published by
@@ -17,13 +17,25 @@
17# along with this program. If not, see <http://www.gnu.org/licenses/>.
17# along with this program. If not, see <http://www.gnu.org/licenses/>.
18#
18#
19
19
20−from unity8.shell.emulators import UnityEmulatorBase
20+import logging
21
21
22+from unity8.shell import emulators
22
23
23−class Dash(UnityEmulatorBase):
24+from autopilot import logging as autopilot_logging
25+from autopilot.introspection import dbus
24
26
27+
28+logger = logging.getLogger(__name__)
29+
30+
31+class Dash(emulators.UnityEmulatorBase):
25 """An emulator that understands the Dash."""
32 """An emulator that understands the Dash."""
26
33
34+ def __init__(self, *args):
35+ super(Dash, self).__init__(*args)
36+ self.dash_content_list = self.wait_select_single(
37+ 'QQuickListView', objectName='dashContentList')
38+
27 def get_home_applications_grid(self):
39 def get_home_applications_grid(self):
28 get_grid = self.get_scope('home').wait_select_single(
40 get_grid = self.get_scope('home').wait_select_single(
29 "GenericFilterGrid",
41 "GenericFilterGrid",
@@ -43,9 +55,91 @@ class Dash(UnityEmulatorBase):
43 return resp_grid.select_single('Tile', text=text)
55 return resp_grid.select_single('Tile', text=text)
44
56
45 def get_scope(self, scope_name='home'):
57 def get_scope(self, scope_name='home'):
46− dash_content = self.wait_select_single(
47− 'QQuickListView',
48− objectName='dashContentList'
49− )
50 scope_id = "%s.scope" % scope_name
58 scope_id = "%s.scope" % scope_name
59+ return self.dash_content_list.select_single(
51− return dash_content.select_single('QQuickLoader', scopeId=scope_id)
60+ 'QQuickLoader', scopeId=scope_id)
61+
62+ @autopilot_logging.log_action(logger.info)
63+ def open_scope(self, scope_name):
64+ """Open a dash scope.
65+
66+ :parameter scope_name: The name of the scope.
67+ :return: The scope.
68+
69+ """
70+ scope_id = "%s.scope" % scope_name
71+ scope_loader = self._get_scope_loader(scope_id)
72+ if scope_loader.isCurrent:
73+ logger.info('The scope is already open.')
74+ return self._get_scope_from_loader(scope_loader)
75+ else:
76+ return self._open_scope_scrolling(scope_loader)
77+
78+ def _get_scope_loader(self, scope_id):
79+ try:
80+ return self.dash_content_list.select_single(
81+ 'QQuickLoader', scopeId=scope_id)
82+ except dbus.StateNotFoundError:
83+ raise emulators.UnityEmulatorException(
84+ 'No scope found with id {0}'.format(scope_id))
85+
86+ def _get_scope_from_loader(self, loader):
87+ if loader.scopeId == 'applications.scope':
88+ return loader.select_single(DashApps)
89+ else:
90+ return loader.select_single(GenericScopeView)
91+
92+ def _open_scope_scrolling(self, scope_loader):
93+ scroll = self._get_scroll_direction(scope_loader)
94+
95+ while not scope_loader.isCurrent:
96+ scroll()
97+
98+ scope = self._get_scope_from_loader(scope_loader)
99+ scope.moving.wait_for(False)
100+ scope.isCurrent.wait_for(True)
101+ return scope
102+
103+ def _get_scroll_direction(self, scope_loader):
104+ current_scope_loader = self.dash_content_list.select_single(
105+ 'QQuickLoader', isCurrent=True)
106+ if scope_loader.globalRect.x < current_scope_loader.globalRect.x:
107+ return self._scroll_to_left_scope
108+ elif scope_loader.globalRect.x > current_scope_loader.globalRect.x:
109+ return self._scroll_to_right_scope
110+ else:
111+ raise emulators.UnityEmulatorException('The scope is already open')
112+
113+ @autopilot_logging.log_action(logger.info)
114+ def _scroll_to_left_scope(self):
115+ original_index = self.dash_content_list.currentIndex
116+ # Scroll on the border of the page header, because some scopes have
117+ # contents that can be scrolled horizontally.
118+ page_header = self.select_single('PageHeader')
119+ border = page_header.select_single('QQuickBorderImage')
120+ start_x = border.width / 3
121+ stop_x = border.width / 3 * 2
122+ start_y = stop_y = border.globalRect.y + border.height / 2
123+ self.pointing_device.drag(start_x, start_y, stop_x, stop_y)
124+ self.dash_content_list.currentIndex.wait_for(original_index - 1)
125+
126+ @autopilot_logging.log_action(logger.info)
127+ def _scroll_to_right_scope(self):
128+ original_index = self.dash_content_list.currentIndex
129+ # Scroll on the border of the page header, because some scopes have
130+ # contents that can be scrolled horizontally.
131+ page_header = self.select_single('PageHeader')
132+ border = page_header.select_single('QQuickBorderImage')
133+ start_x = border.width / 3 * 2
134+ stop_x = border.width / 3
135+ start_y = stop_y = border.globalRect.y + border.height / 2
136+ self.pointing_device.drag(start_x, start_y, stop_x, stop_y)
137+ self.dash_content_list.currentIndex.wait_for(original_index + 1)
138+
139+
140+class GenericScopeView(emulators.UnityEmulatorBase):
141+ """Autopilot emulators for generic scopes."""
142+
143+
144+class DashApps(emulators.UnityEmulatorBase):
145+ """Autopilot emulators for the applications scope."""
tests/autopilot/unity8/shell/emulators/greeter.py+2−5
@@ -1,7 +1,7 @@
1# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
1# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2#
2#
3# Unity Autopilot Test Suite
3# Unity Autopilot Test Suite
4−# Copyright (C) 2012-2013 Canonical
4+# Copyright (C) 2012, 2013, 2014 Canonical
5#
5#
6# This program is free software: you can redistribute it and/or modify
6# This program is free software: you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
7# it under the terms of the GNU General Public License as published by
@@ -18,24 +18,21 @@
18#
18#
19
19
20from unity8.shell.emulators import UnityEmulatorBase
20from unity8.shell.emulators import UnityEmulatorBase
21−from autopilot.input import Touch
22
21
23
22
24class Greeter(UnityEmulatorBase):
23class Greeter(UnityEmulatorBase):
25−
26 """An emulator that understands the greeter screen."""
24 """An emulator that understands the greeter screen."""
27
25
28 def swipe(self):
26 def swipe(self):
29 """Swipe the greeter screen away."""
27 """Swipe the greeter screen away."""
30 self.created.wait_for(True)
28 self.created.wait_for(True)
31− touch = Touch.create()
32
29
33 rect = self.globalRect
30 rect = self.globalRect
34 start_x = rect[0] + rect[2] - 3
31 start_x = rect[0] + rect[2] - 3
35 start_y = int(rect[1] + rect[3] / 2)
32 start_y = int(rect[1] + rect[3] / 2)
36 stop_x = int(rect[0] + rect[2] * 0.2)
33 stop_x = int(rect[0] + rect[2] * 0.2)
37 stop_y = start_y
34 stop_y = start_y
38− touch.drag(start_x, start_y, stop_x, stop_y)
35+ self.pointing_device.drag(start_x, start_y, stop_x, stop_y)
39
36
40 self.created.wait_for(False)
37 self.created.wait_for(False)
41
38
tests/autopilot/unity8/shell/emulators/main_window.py+6
@@ -91,5 +91,11 @@ class MainWindow(object):
91 def get_pinentryField(self):
91 def get_pinentryField(self):
92 return self.app.select_single(objectName="pinentryField")
92 return self.app.select_single(objectName="pinentryField")
93
93
94+ def get_indicator(self, indicator_name):
95+ return self.app.select_single(
96+ 'DefaultIndicatorWidget',
97+ objectName=indicator_name+'-widget'
98+ )
99+
94 def get_shell_background(self):
100 def get_shell_background(self):
95 return self.app.select_single("CrossFadeImage", objectName="backgroundImage")
101 return self.app.select_single("CrossFadeImage", objectName="backgroundImage")
tests/autopilot/unity8/shell/tests/__init__.py+1
@@ -147,6 +147,7 @@ class UnityTestCase(AutopilotTestCase):
147 if model() != "Desktop":
147 if model() != "Desktop":
148 from autopilot.input import _uinput
148 from autopilot.input import _uinput
149 _uinput._touch_device = _uinput.create_touch_device()
149 _uinput._touch_device = _uinput.create_touch_device()
150+ self.addCleanup(_uinput._touch_device.close)
150 ####
151 ####
151
152
152 self.touch = Touch.create()
153 self.touch = Touch.create()
tests/autopilot/unity8/shell/tests/test_emulators.pynew file+120
@@ -0,0 +1,120 @@
1+# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2+#
3+# Unity Autopilot Test Suite
4+# Copyright (C) 2014 Canonical
5+#
6+# This program is free software: you can redistribute it and/or modify
7+# it under the terms of the GNU General Public License as published by
8+# the Free Software Foundation, either version 3 of the License, or
9+# (at your option) any later version.
10+#
11+# This program is distributed in the hope that it will be useful,
12+# but WITHOUT ANY WARRANTY; without even the implied warranty of
13+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+# GNU General Public License for more details.
15+#
16+# You should have received a copy of the GNU General Public License
17+# along with this program. If not, see <http://www.gnu.org/licenses/>.
18+#
19+
20+import mock
21+
22+from unity8 import process_helpers
23+from unity8.shell import emulators, tests
24+from unity8.shell.emulators import dash as dash_emulators
25+
26+
27+class DashEmulatorTestCase(tests.UnityTestCase):
28+
29+ scenarios = tests._get_device_emulation_scenarios()
30+
31+ def setUp(self):
32+ super(DashEmulatorTestCase, self).setUp()
33+ unity_proxy = self.launch_unity()
34+ process_helpers.unlock_unity(unity_proxy)
35+ self.dash = self.main_window.get_dash()
36+
37+ def test_open_unexisting_scope(self):
38+ scope_name = 'unexisting'
39+ with mock.patch.object(self.dash, 'pointing_device') as mock_pointer:
40+ exception = self.assertRaises(
41+ emulators.UnityEmulatorException,
42+ self.dash.open_scope, scope_name)
43+
44+ self.assertEqual(
45+ 'No scope found with id unexisting.scope', str(exception))
46+ self.assertFalse(mock_pointer.called)
47+
48+ def test_open_already_opened_scope(self):
49+ scope_id = self._get_current_scope_id()
50+ with mock.patch.object(self.dash, 'pointing_device') as mock_pointer:
51+ scope = self.dash.open_scope(self._get_scope_name_from_id(
52+ scope_id))
53+
54+ self.assertFalse(mock_pointer.called)
55+ self._assert_scope_is_opened(scope, scope_id)
56+
57+ def _assert_scope_is_opened(self, scope, scope_id):
58+ self.assertTrue(scope.isCurrent)
59+ scope_loader = scope.get_parent()
60+ self.assertEqual(scope_loader.scopeId, scope_id)
61+
62+ def _get_current_scope_id(self):
63+ scope = self.dash.dash_content_list.select_single(
64+ 'QQuickLoader', isCurrent=True)
65+ return scope.scopeId
66+
67+ def test_open_scope_to_the_right(self):
68+ leftmost_scope = self._get_scope_name_from_id(
69+ self._get_leftmost_scope_id())
70+ self.dash.open_scope(leftmost_scope)
71+
72+ scope_id = self._get_rightmost_scope_id()
73+ scope = self.dash.open_scope(self._get_scope_name_from_id(scope_id))
74+ self._assert_scope_is_opened(scope, scope_id)
75+
76+ def _get_leftmost_scope_id(self):
77+ scope_loaders = self._get_scope_loaders()
78+ leftmost_scope_loader = scope_loaders[0]
79+ for loader in scope_loaders[1:]:
80+ if loader.globalRect.x < leftmost_scope_loader.globalRect.x:
81+ leftmost_scope_loader = loader
82+ return leftmost_scope_loader.scopeId
83+
84+ def _get_scope_loaders(self):
85+ item = self.dash.dash_content_list.get_children_by_type(
86+ 'QQuickItem')[0]
87+ return item.get_children_by_type('QQuickLoader')
88+
89+ def _get_scope_name_from_id(self, scope_id):
90+ if scope_id.endswith('.scope'):
91+ return scope_id[:-6]
92+
93+ def _get_rightmost_scope_id(self):
94+ scope_loaders = self._get_scope_loaders()
95+ rightmost_scope_loader = scope_loaders[0]
96+ for loader in scope_loaders[1:]:
97+ if loader.globalRect.x > rightmost_scope_loader.globalRect.x:
98+ rightmost_scope_loader = loader
99+ return rightmost_scope_loader.scopeId
100+
101+ def test_open_scope_to_the_left(self):
102+ rightmost_scope = self._get_scope_name_from_id(
103+ self._get_rightmost_scope_id())
104+ self.dash.open_scope(rightmost_scope)
105+
106+ scope_id = self._get_leftmost_scope_id()
107+ scope = self.dash.open_scope(self._get_scope_name_from_id(scope_id))
108+ self._assert_scope_is_opened(scope, scope_id)
109+
110+ def test_open_generic_scope(self):
111+ scope_id = 'home.scope'
112+ scope = self.dash.open_scope(self._get_scope_name_from_id(scope_id))
113+ self._assert_scope_is_opened(scope, scope_id)
114+ self.assertIsInstance(scope, dash_emulators.GenericScopeView)
115+
116+ def test_open_applications_scope(self):
117+ scope_id = 'applications.scope'
118+ scope = self.dash.open_scope(self._get_scope_name_from_id(scope_id))
119+ self._assert_scope_is_opened(scope, scope_id)
120+ self.assertIsInstance(scope, dash_emulators.DashApps)
tests/autopilot/unity8/shell/tests/test_lock_screen.py+9−8
@@ -20,6 +20,7 @@
20
20
21from __future__ import absolute_import
21from __future__ import absolute_import
22
22
23+from unity8.process_helpers import unlock_unity
23from unity8.shell import with_lightdm_mock
24from unity8.shell import with_lightdm_mock
24from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
25from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
25
26
@@ -40,11 +41,11 @@ class TestLockscreen(UnityTestCase):
40 @with_lightdm_mock("single-pin")
41 @with_lightdm_mock("single-pin")
41 def test_can_unlock_pin_screen(self):
42 def test_can_unlock_pin_screen(self):
42 """Must be able to unlock the PIN entry lock screen."""
43 """Must be able to unlock the PIN entry lock screen."""
43− self.launch_unity()
44+ unity_proxy = self.launch_unity()
44 greeter = self.main_window.get_greeter()
45 greeter = self.main_window.get_greeter()
45
46
46 if greeter.narrowMode:
47 if greeter.narrowMode:
47− greeter.swipe()
48+ unlock_unity(unity_proxy)
48 lockscreen = self._wait_for_lockscreen()
49 lockscreen = self._wait_for_lockscreen()
49 self._enter_pincode("1234")
50 self._enter_pincode("1234")
50 self.assertThat(lockscreen.shown, Eventually(Equals(False)))
51 self.assertThat(lockscreen.shown, Eventually(Equals(False)))
@@ -55,11 +56,11 @@ class TestLockscreen(UnityTestCase):
55 @with_lightdm_mock("single-passphrase")
56 @with_lightdm_mock("single-passphrase")
56 def test_can_unlock_passphrase_screen(self):
57 def test_can_unlock_passphrase_screen(self):
57 """Must be able to unlock the passphrase entry screen."""
58 """Must be able to unlock the passphrase entry screen."""
58− self.launch_unity()
59+ unity_proxy = self.launch_unity()
59 greeter = self.main_window.get_greeter()
60 greeter = self.main_window.get_greeter()
60
61
61 if greeter.narrowMode:
62 if greeter.narrowMode:
62− greeter.swipe()
63+ unlock_unity(unity_proxy)
63 lockscreen = self._wait_for_lockscreen()
64 lockscreen = self._wait_for_lockscreen()
64 self._enter_pin_passphrase("password")
65 self._enter_pin_passphrase("password")
65 self.assertThat(lockscreen.shown, Eventually(Equals(False)))
66 self.assertThat(lockscreen.shown, Eventually(Equals(False)))
@@ -70,11 +71,11 @@ class TestLockscreen(UnityTestCase):
70 @with_lightdm_mock("single-pin")
71 @with_lightdm_mock("single-pin")
71 def test_pin_screen_wrong_code(self):
72 def test_pin_screen_wrong_code(self):
72 """Entering the wrong pin code must not dismiss the lock screen."""
73 """Entering the wrong pin code must not dismiss the lock screen."""
73− self.launch_unity()
74+ unity_proxy = self.launch_unity()
74 greeter = self.main_window.get_greeter()
75 greeter = self.main_window.get_greeter()
75
76
76 if greeter.narrowMode:
77 if greeter.narrowMode:
77− greeter.swipe()
78+ unlock_unity(unity_proxy)
78 lockscreen = self._wait_for_lockscreen()
79 lockscreen = self._wait_for_lockscreen()
79 self._enter_pincode("4321")
80 self._enter_pincode("4321")
80 pinentryField = self.main_window.get_pinentryField()
81 pinentryField = self.main_window.get_pinentryField()
@@ -89,11 +90,11 @@ class TestLockscreen(UnityTestCase):
89 @with_lightdm_mock("single-passphrase")
90 @with_lightdm_mock("single-passphrase")
90 def test_passphrase_screen_wrong_password(self):
91 def test_passphrase_screen_wrong_password(self):
91 """Entering the wrong password must not dismiss the lock screen."""
92 """Entering the wrong password must not dismiss the lock screen."""
92− self.launch_unity()
93+ unity_proxy = self.launch_unity()
93 greeter = self.main_window.get_greeter()
94 greeter = self.main_window.get_greeter()
94
95
95 if greeter.narrowMode:
96 if greeter.narrowMode:
96− greeter.swipe()
97+ unlock_unity(unity_proxy)
97 lockscreen = self._wait_for_lockscreen()
98 lockscreen = self._wait_for_lockscreen()
98 self._enter_pin_passphrase("foobar")
99 self._enter_pin_passphrase("foobar")
99 pinentryField = self.main_window.get_pinentryField()
100 pinentryField = self.main_window.get_pinentryField()
tests/autopilot/unity8/shell/tests/test_notifications.py+1−1
@@ -65,7 +65,7 @@ class NotificationsBase(UnityTestCase):
65 def _get_notifications_list(self):
65 def _get_notifications_list(self):
66 main_view = self.main_window.get_qml_view()
66 main_view = self.main_window.get_qml_view()
67 return main_view.select_single(
67 return main_view.select_single(
68− "QQuickListView",
68+ "Notifications",
69 objectName='notificationList'
69 objectName='notificationList'
70 )
70 )
71
71
tests/autopilot/unity8/shell/tests/test_upstart.pynew file+99
@@ -0,0 +1,99 @@
1+# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2+#
3+# Unity Autopilot Test Suite
4+# Copyright (C) 2013 Canonical
5+#
6+# This program is free software: you can redistribute it and/or modify
7+# it under the terms of the GNU General Public License as published by
8+# the Free Software Foundation, either version 3 of the License, or
9+# (at your option) any later version.
10+#
11+# This program is distributed in the hope that it will be useful,
12+# but WITHOUT ANY WARRANTY; without even the implied warranty of
13+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+# GNU General Public License for more details.
15+#
16+# You should have received a copy of the GNU General Public License
17+# along with this program. If not, see <http://www.gnu.org/licenses/>.
18+#
19+
20+"""Tests for upstart integration."""
21+
22+import os
23+import signal
24+import subprocess
25+import time
26+
27+from testtools.matchers._basic import Equals
28+from autopilot.matchers import Eventually
29+from autopilot.introspection import get_proxy_object_for_existing_process
30+
31+from unity8 import get_binary_path
32+from unity8.shell.emulators import UnityEmulatorBase
33+from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
34+
35+import logging
36+
37+logger = logging.getLogger(__name__)
38+
39+
40+class UpstartIntegrationTests(UnityTestCase):
41+
42+ scenarios = _get_device_emulation_scenarios()
43+
44+ def _get_status(self):
45+ pid, status = os.waitpid(self.process.pid, os.WUNTRACED | os.WCONTINUED | os.WNOHANG)
46+ logger.debug("Got status: {0}; stopped: {1}; continued: {2}"\
47+ .format(status, os.WIFSTOPPED(status), os.WIFCONTINUED(status)))
48+ return status
49+
50+ def _launch_unity(self):
51+ self.patch_environment("QT_LOAD_TESTABILITY", "1")
52+ self.process = subprocess.Popen([get_binary_path()] + self.unity_geometry_args)
53+ def ensure_stopped():
54+ self.process.terminate()
55+ for i in xrange(10):
56+ try:
57+ self._get_status()
58+ except OSError:
59+ break
60+ else:
61+ time.sleep(1)
62+ try:
63+ self._get_status()
64+ except OSError:
65+ pass
66+ else:
67+ self.process.kill()
68+
69+ self.process.wait()
70+
71+ self.addCleanup(ensure_stopped)
72+
73+ def _set_proxy(self):
74+ super(UpstartIntegrationTests, self)._set_proxy(get_proxy_object_for_existing_process(
75+ pid=self.process.pid,
76+ emulator_base=UnityEmulatorBase,
77+ ))
78+
79+ def test_no_sigstop(self):
80+ self.patch_environment("UPSTART_JOB", "foo")
81+ self._launch_unity()
82+ self._set_proxy()
83+
84+ logger.debug("Unity started, waiting for it to be ready.")
85+ self.assertUnityReady()
86+ logger.debug("Unity loaded and ready.")
87+
88+ def test_expect_sigstop(self):
89+ self.patch_environment("UPSTART_JOB", "unity8")
90+ self._launch_unity()
91+ self.assertThat(lambda: os.WIFSTOPPED(self._get_status()), Eventually(Equals(True)), "Unity8 should raise SIGSTOP when ready")
92+
93+ self.process.send_signal(signal.SIGCONT)
94+ self.assertThat(lambda: os.WIFCONTINUED(self._get_status()), Eventually(Equals(True)), "Unity8 should have resumed")
95+
96+ logger.debug("Unity started, waiting for it to be ready.")
97+ self._set_proxy()
98+ self.assertUnityReady()
99+ logger.debug("Unity loaded and ready.")
tests/mocks/CMakeLists.txt+1
@@ -7,6 +7,7 @@ add_subdirectory(Powerd)
7add_subdirectory(QMenuModel)
7add_subdirectory(QMenuModel)
8add_subdirectory(Ubuntu)
8add_subdirectory(Ubuntu)
9add_subdirectory(Unity)
9add_subdirectory(Unity)
10+add_subdirectory(QtMultimedia)
10
11
11install(
12install(
12 DIRECTORY data
13 DIRECTORY data
tests/mocks/LightDM/CMakeLists.txt+3−1
@@ -13,10 +13,12 @@ add_subdirectory(single-passphrase)
13include_directories(
13include_directories(
14 ${CMAKE_CURRENT_SOURCE_DIR}
14 ${CMAKE_CURRENT_SOURCE_DIR}
15 ${CMAKE_CURRENT_BINARY_DIR}
15 ${CMAKE_CURRENT_BINARY_DIR}
16+ ${CMAKE_SOURCE_DIR}/plugins/Utils
16 ${CMAKE_SOURCE_DIR}/tests/mocks/libusermetrics
17 ${CMAKE_SOURCE_DIR}/tests/mocks/libusermetrics
17)
18)
18
19
19set(QMLPLUGIN_SRC
20set(QMLPLUGIN_SRC
21+ ${CMAKE_SOURCE_DIR}/plugins/LightDM/DBusGreeterList.cpp
20 ${CMAKE_SOURCE_DIR}/plugins/LightDM/Greeter.cpp
22 ${CMAKE_SOURCE_DIR}/plugins/LightDM/Greeter.cpp
21 ${CMAKE_SOURCE_DIR}/plugins/LightDM/plugin.cpp
23 ${CMAKE_SOURCE_DIR}/plugins/LightDM/plugin.cpp
22 ${CMAKE_SOURCE_DIR}/plugins/LightDM/UsersModel.cpp
24 ${CMAKE_SOURCE_DIR}/plugins/LightDM/UsersModel.cpp
@@ -39,7 +41,7 @@ target_link_libraries(MockLightDM-qml
39 -lusermetricsoutput
41 -lusermetricsoutput
40 )
42 )
41
43
42−qt5_use_modules(MockLightDM-qml Gui Qml)
44+qt5_use_modules(MockLightDM-qml DBus Gui Qml)
43
45
44# copy qmldir file into build directory for shadow builds
46# copy qmldir file into build directory for shadow builds
45file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/qmldir"
47file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/qmldir"
tests/mocks/LightDM/demo/CMakeLists.txt−1
@@ -1,4 +1,3 @@
1−include(FindPkgConfig)
2pkg_check_modules(LIBUSERMETRICSOUTPUT REQUIRED libusermetricsoutput-1)
1pkg_check_modules(LIBUSERMETRICSOUTPUT REQUIRED libusermetricsoutput-1)
3
2
4set(LibLightDM_SOURCES
3set(LibLightDM_SOURCES
tests/mocks/QMenuModel/unitymenumodel.cpp+3
@@ -143,6 +143,9 @@ QVariant UnityMenuModel::data(const QModelIndex &index, int role) const
143
143
144QVariantMap UnityMenuModel::rowData(int row) const
144QVariantMap UnityMenuModel::rowData(int row) const
145{
145{
146+ if (m_modelData.count() <= row) {
147+ return QVariantMap();
148+ }
146 return m_modelData[row].toMap()["rowData"].toMap();
149 return m_modelData[row].toMap()["rowData"].toMap();
147}
150}
148
151
tests/mocks/QtMultimedia/CMakeLists.txtnew file+19
@@ -0,0 +1,19 @@
1+add_library(QtMultimedia-qml MODULE
2+ plugin.cpp
3+ audio.cpp
4+ )
5+
6+qt5_use_modules(QtMultimedia-qml Qml)
7+
8+# copy qmldir file into build directory for shadow builds
9+file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/qmldir"
10+ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
11+ )
12+
13+install(TARGETS QtMultimedia-qml
14+ DESTINATION ${SHELL_INSTALL_QML}/mocks/QtMultimedia
15+ )
16+
17+install(FILES qmldir
18+ DESTINATION ${SHELL_INSTALL_QML}/mocks/QtMultimedia
19+ )
tests/mocks/QtMultimedia/audio.cppnew file+107
@@ -0,0 +1,107 @@
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: Michael Zanetti <michael.zanetti@canonical.com>
17+ */
18+
19+#include "audio.h"
20+
21+Audio::Audio(QObject* parent):
22+ QObject(parent),
23+ m_playbackState(StoppedState)
24+{
25+ qsrand(time(NULL));
26+ m_timer.setInterval(1000);
27+ connect(&m_timer, SIGNAL(timeout()), SLOT(timerEvent()));
28+}
29+
30+QUrl Audio::source() const
31+{
32+ return m_source;
33+}
34+
35+void Audio::setSource(const QUrl &source)
36+{
37+ if (m_source != source) {
38+ m_source = source;
39+ Q_EMIT sourceChanged(source);
40+
41+ m_position = 0;
42+ Q_EMIT positionChanged(m_position);
43+
44+ m_duration = (qrand() % 20000) + 10000;
45+ Q_EMIT durationChanged(m_duration);
46+ }
47+}
48+
49+Audio::PlaybackState Audio::playbackState() const
50+{
51+ return m_playbackState;
52+}
53+
54+int Audio::position() const
55+{
56+ return m_position;
57+}
58+
59+int Audio::duration() const
60+{
61+ return m_duration;
62+}
63+
64+QString Audio::errorString() const
65+{
66+ return QString();
67+}
68+
69+void Audio::pause()
70+{
71+ if (m_playbackState == PlayingState) {
72+ m_playbackState = PausedState;
73+ Q_EMIT playbackStateChanged(m_playbackState);
74+ m_timer.stop();
75+ }
76+}
77+
78+void Audio::play()
79+{
80+ if (m_playbackState != PlayingState && m_source.isValid()) {
81+ m_playbackState = PlayingState;
82+ Q_EMIT playbackStateChanged(m_playbackState);
83+
84+ m_timer.start();
85+ }
86+}
87+
88+void Audio::stop()
89+{
90+ if (m_playbackState != StoppedState) {
91+ m_playbackState = StoppedState;
92+ Q_EMIT playbackStateChanged(m_playbackState);
93+ m_timer.stop();
94+ m_position = 0;
95+ Q_EMIT positionChanged(m_position);
96+ }
97+}
98+
99+void Audio::timerEvent()
100+{
101+ if (m_position + 1000 < m_duration) {
102+ m_position += 1000;
103+ Q_EMIT positionChanged(m_position);
104+ } else {
105+ stop();
106+ }
107+}
tests/mocks/QtMultimedia/audio.hnew file+78
@@ -0,0 +1,78 @@
1+/*
2+ * Copyright (C) 2012,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+ * Authors: Michael Zanetti <michael.zanetti@canonical.com>
17+ */
18+
19+#ifndef MOCK_AUDIO_H
20+#define MOCK_AUDIO_H
21+
22+#include <QObject>
23+#include <QUrl>
24+#include <QTimer>
25+
26+class Audio: public QObject
27+{
28+ Q_OBJECT
29+ Q_ENUMS(PlaybackState)
30+ Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
31+ Q_PROPERTY(PlaybackState playbackState READ playbackState NOTIFY playbackStateChanged)
32+ Q_PROPERTY(int position READ position NOTIFY positionChanged)
33+ Q_PROPERTY(int duration READ duration NOTIFY durationChanged)
34+ Q_PROPERTY(QString errorString READ errorString NOTIFY errorStringChanged)
35+public:
36+ enum PlaybackState {
37+ PlayingState,
38+ PausedState,
39+ StoppedState
40+ };
41+
42+ explicit Audio(QObject *parent = 0);
43+
44+ QUrl source() const;
45+ void setSource(const QUrl &source);
46+
47+ PlaybackState playbackState() const;
48+
49+ int position() const;
50+
51+ int duration() const;
52+
53+ QString errorString() const;
54+
55+public Q_SLOTS:
56+ void pause();
57+ void play();
58+ void stop();
59+
60+Q_SIGNALS:
61+ void sourceChanged(const QUrl &source);
62+ void playbackStateChanged(PlaybackState playbackState);
63+ void positionChanged(int position);
64+ void durationChanged(int duration);
65+ void errorStringChanged(const QString &errorString);
66+
67+private Q_SLOTS:
68+ void timerEvent();
69+
70+private:
71+ QUrl m_source;
72+ PlaybackState m_playbackState;
73+ QTimer m_timer;
74+ int m_position;
75+ int m_duration;
76+};
77+
78+#endif
tests/mocks/QtMultimedia/plugin.cppnew file+28
@@ -0,0 +1,28 @@
1+/*
2+ * Copyright (C) 2012,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+ * Authors: Michael Zanetti <michael.zanetti@canonical.com>
17+ */
18+
19+#include "plugin.h"
20+#include "audio.h"
21+
22+#include <QtQml/qqml.h>
23+
24+void MockQtMultimediaPlugin::registerTypes(const char *uri)
25+{
26+ Q_ASSERT(uri == QLatin1String("QtMultimedia"));
27+ qmlRegisterType<Audio>(uri, 5, 0, "Audio");
28+}
tests/mocks/QtMultimedia/plugin.hnew file+34
@@ -0,0 +1,34 @@
1+/*
2+ * Copyright (C) 2012,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+ * Authors: Michael Zanetti <michael.zanetti@canonical.com>
17+ */
18+
19+#ifndef MOCK_QTMULTIMEDIA_PLUGIN_H
20+#define MOCK_QTMULTIMEDIA_PLUGIN_H
21+
22+#include <QtQml/QQmlEngine>
23+#include <QtQml/QQmlExtensionPlugin>
24+
25+class MockQtMultimediaPlugin : public QQmlExtensionPlugin
26+{
27+ Q_OBJECT
28+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29+
30+public:
31+ void registerTypes(const char *uri);
32+};
33+
34+#endif
tests/mocks/QtMultimedia/qmldirnew file+2
@@ -0,0 +1,2 @@
1+module QtMultimedia
2+plugin QtMultimedia-qml
tests/mocks/Unity/Application/ApplicationManager.cpp+4−3
@@ -16,7 +16,8 @@
16
16
17#include "ApplicationManager.h"
17#include "ApplicationManager.h"
18#include "ApplicationInfo.h"
18#include "ApplicationInfo.h"
19+
19−#include "paths.h"
20+#include <paths.h>
20
21
21#include <QDir>
22#include <QDir>
22#include <QGuiApplication>
23#include <QGuiApplication>
@@ -273,7 +274,7 @@ void ApplicationManager::generateQmlStrings(ApplicationInfo *application)
273 " smooth: true\n"
274 " smooth: true\n"
274 " fillMode: Image.PreserveAspectCrop\n"
275 " fillMode: Image.PreserveAspectCrop\n"
275 "}").arg(topMargin)
276 "}").arg(topMargin)
276− .arg(shellAppDirectory())
277+ .arg(qmlDirectory())
277 .arg(application->icon().toString());
278 .arg(application->icon().toString());
278 application->setWindowQml(windowQml);
279 application->setWindowQml(windowQml);
279
280
@@ -284,7 +285,7 @@ void ApplicationManager::generateQmlStrings(ApplicationInfo *application)
284 " source: \"file://%1/Dash/graphics/phone/screenshots/%2.png\"\n"
285 " source: \"file://%1/Dash/graphics/phone/screenshots/%2.png\"\n"
285 " smooth: true\n"
286 " smooth: true\n"
286 " fillMode: Image.PreserveAspectCrop\n"
287 " fillMode: Image.PreserveAspectCrop\n"
287− "}").arg(shellAppDirectory())
288+ "}").arg(qmlDirectory())
288 .arg(application->icon().toString());
289 .arg(application->icon().toString());
289 application->setImageQml(imageQml);
290 application->setImageQml(imageQml);
290}
291}
tests/mocks/Unity/Application/CMakeLists.txt−1
@@ -1,4 +1,3 @@
1−include(FindPkgConfig)
2pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application)
1pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application)
3
2
4set(FakeUnityApplicationQml_SOURCES
3set(FakeUnityApplicationQml_SOURCES
tests/mocks/Unity/Indicators/CMakeLists.txt+2
@@ -7,12 +7,14 @@ include_directories(
7 ${CMAKE_CURRENT_SOURCE_DIR}
7 ${CMAKE_CURRENT_SOURCE_DIR}
8 ${CMAKE_CURRENT_BINARY_DIR}
8 ${CMAKE_CURRENT_BINARY_DIR}
9 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators
9 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators
10+ ${CMAKE_SOURCE_DIR}/tests/mocks/QMenuModel
10)
11)
11
12
12set(IndicatorsFakeQml_SOURCES
13set(IndicatorsFakeQml_SOURCES
13 fakeplugin.cpp
14 fakeplugin.cpp
14 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/indicators.h
15 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/indicators.h
15 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/menucontentactivator.cpp
16 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/menucontentactivator.cpp
17+ ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/unitymenumodelstack.cpp
16 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/visibleindicatorsmodel.cpp
18 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/visibleindicatorsmodel.cpp
17)
19)
18
20
tests/mocks/Unity/Indicators/IndicatorBase.qml+2−1
@@ -26,8 +26,9 @@ Item {
26 //const
26 //const
27 property string busName
27 property string busName
28 property string actionsObjectPath
28 property string actionsObjectPath
29+ property string menuObjectPath
29 property string rootMenuType: "com.canonical.indicator.root"
30 property string rootMenuType: "com.canonical.indicator.root"
30− property string deviceMenuObjectPath
31+ property string deviceMenuObjectPath: menuObjectPath
31
32
32 property var menuModel: UnityMenuModel {}
33 property var menuModel: UnityMenuModel {}
33
34
tests/mocks/Unity/Indicators/IndicatorWidget.qml → tests/mocks/Unity/Indicators/MenuItemFactory.qmlrenamed+15−5
@@ -18,11 +18,21 @@
18 */
18 */
19
19
20import QtQuick 2.0
20import QtQuick 2.0
21−import Unity.Indicators 0.1 as Indicators
21+import Ubuntu.Components.ListItems 0.1 as ListItem
22
22
23−IndicatorBase {
23+Item {
24− id: indicatorWidget
24+ id: menuFactory
25
25
26− enabled: false
26+ property var menuModel: null
27− property int iconSize: height
27+
28+ Component {
29+ id: standardMenu;
30+ ListItem.Standard {
31+ objectName: "standardMenu"
32+ }
33+ }
34+
35+ function load(modelData) {
36+ return standardMenu;
37+ }
28}
38}
tests/mocks/Unity/Indicators/fakeplugin.cpp+2
@@ -25,6 +25,7 @@
25// local
25// local
26#include "indicators.h"
26#include "indicators.h"
27#include "menucontentactivator.h"
27#include "menucontentactivator.h"
28+#include "unitymenumodelstack.h"
28#include "visibleindicatorsmodel.h"
29#include "visibleindicatorsmodel.h"
29
30
30void IndicatorsFakePlugin::registerTypes(const char * uri)
31void IndicatorsFakePlugin::registerTypes(const char * uri)
@@ -32,6 +33,7 @@ void IndicatorsFakePlugin::registerTypes(const char * uri)
32 Q_INIT_RESOURCE(indicators_fake);
33 Q_INIT_RESOURCE(indicators_fake);
33
34
34 qmlRegisterType<MenuContentActivator>(uri, 0, 1, "MenuContentActivator");
35 qmlRegisterType<MenuContentActivator>(uri, 0, 1, "MenuContentActivator");
36+ qmlRegisterType<UnityMenuModelStack>(uri, 0, 1, "UnityMenuModelStack");
35 qmlRegisterType<VisibleIndicatorsModel>(uri, 0, 1, "VisibleIndicatorsModel");
37 qmlRegisterType<VisibleIndicatorsModel>(uri, 0, 1, "VisibleIndicatorsModel");
36
38
37 qmlRegisterUncreatableType<MenuContentState>(uri, 0, 1, "MenuContentState", "Can't create MenuContentState class");
39 qmlRegisterUncreatableType<MenuContentState>(uri, 0, 1, "MenuContentState", "Can't create MenuContentState class");
tests/mocks/Unity/Indicators/qmldir+1−1
@@ -3,7 +3,7 @@ plugin IndicatorsFakeQml
3
3
4CachedUnityMenuModel 0.1 CachedUnityMenuModel.qml
4CachedUnityMenuModel 0.1 CachedUnityMenuModel.qml
5IndicatorBase 0.1 IndicatorBase.qml
5IndicatorBase 0.1 IndicatorBase.qml
6−IndicatorWidget 0.1 IndicatorWidget.qml
7IndicatorsModel 0.1 IndicatorsModel.qml
6IndicatorsModel 0.1 IndicatorsModel.qml
8FakeMenuPage 0.1 FakeMenuPage.qml
7FakeMenuPage 0.1 FakeMenuPage.qml
8+MenuItemFactory 0.1 MenuItemFactory.qml
9RootActionState 0.1 RootActionState.qml
9RootActionState 0.1 RootActionState.qml
tests/mocks/Unity/Launcher/CMakeLists.txt−1
@@ -1,4 +1,3 @@
1−include(FindPkgConfig)
2pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=3)
1pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=3)
3
2
4add_definitions(-DTOP_SRCDIR="${CMAKE_SOURCE_DIR}")
3add_definitions(-DTOP_SRCDIR="${CMAKE_SOURCE_DIR}")
tests/mocks/Unity/fake_scope.cpp+3−3
@@ -16,7 +16,7 @@
16
16
17#include "fake_scope.h"
17#include "fake_scope.h"
18#include "fake_preview.h"
18#include "fake_preview.h"
19−#include "paths.h"
19+#include <paths.h>
20
20
21#include <dee.h>
21#include <dee.h>
22
22
@@ -204,7 +204,7 @@ DeeModel* create_categories_model(unsigned category_count) {
204 std::to_string(i).c_str(),
204 std::to_string(i).c_str(),
205 ("Category "+std::to_string(i)).c_str(),
205 ("Category "+std::to_string(i)).c_str(),
206 "gtk-apply",
206 "gtk-apply",
207− "grid",
207+ i % 2 == 0 ? "grid" : "carousel",
208 hints);
208 hints);
209 }
209 }
210 return category_model;
210 return category_model;
@@ -236,7 +236,7 @@ DeeModel* create_results_model(unsigned category_count, unsigned result_count) {
236
236
237 dee_model_append(results_model,
237 dee_model_append(results_model,
238 ("uri://result."+std::to_string(i)).c_str(),
238 ("uri://result."+std::to_string(i)).c_str(),
239− (shellAppDirectory() + "graphics/applicationIcons/dash.png").toLatin1().data(),
239+ (qmlDirectory() + "graphics/applicationIcons/dash.png").toLatin1().data(),
240 category,
240 category,
241 0,
241 0,
242 "application/x-desktop",
242 "application/x-desktop",
tests/mocks/Unity/fake_scopes.cpp+3
@@ -35,6 +35,7 @@ Scopes::Scopes(QObject *parent)
35 m_roles[Scopes::RoleScope] = "scope";
35 m_roles[Scopes::RoleScope] = "scope";
36 m_roles[Scopes::RoleId] = "id";
36 m_roles[Scopes::RoleId] = "id";
37 m_roles[Scopes::RoleVisible] = "visible";
37 m_roles[Scopes::RoleVisible] = "visible";
38+ m_roles[Scopes::RoleTitle] = "title";
38
39
39 QObject::connect(this, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SIGNAL(countChanged()));
40 QObject::connect(this, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SIGNAL(countChanged()));
40 QObject::connect(this, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), this, SIGNAL(countChanged()));
41 QObject::connect(this, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), this, SIGNAL(countChanged()));
@@ -110,6 +111,8 @@ QVariant Scopes::data(const QModelIndex& index, int role) const
110 return QVariant::fromValue(scope->id());
111 return QVariant::fromValue(scope->id());
111 } else if (role == Scopes::RoleVisible) {
112 } else if (role == Scopes::RoleVisible) {
112 return QVariant::fromValue(scope->visible());
113 return QVariant::fromValue(scope->visible());
114+ } else if (role == Scopes::RoleTitle) {
115+ return QVariant::fromValue(scope->name());
113 } else {
116 } else {
114 return QVariant();
117 return QVariant();
115 }
118 }
tests/mocks/Unity/fake_scopes.h+2−1
@@ -41,7 +41,8 @@ public:
41 enum Roles {
41 enum Roles {
42 RoleScope,
42 RoleScope,
43 RoleId,
43 RoleId,
44− RoleVisible
44+ RoleVisible,
45+ RoleTitle
45 };
46 };
46
47
47 Q_INVOKABLE int rowCount(const QModelIndex& parent = QModelIndex()) const;
48 Q_INVOKABLE int rowCount(const QModelIndex& parent = QModelIndex()) const;
tests/mocks/libusermetrics/CMakeLists.txt+4
@@ -8,6 +8,10 @@ add_library(MockUserMetrics SHARED ${mock_SOURCES})
8
8
9qt5_use_modules(MockUserMetrics Gui)
9qt5_use_modules(MockUserMetrics Gui)
10
10
11+include_directories(
12+ ${CMAKE_SOURCE_DIR}/plugins/Utils
13+)
14+
11set_target_properties(MockUserMetrics PROPERTIES
15set_target_properties(MockUserMetrics PROPERTIES
12 OUTPUT_NAME usermetricsoutput
16 OUTPUT_NAME usermetricsoutput
13 VERSION 1)
17 VERSION 1)
tests/mocks/libusermetrics/UserMetrics.cpp+1−1
@@ -17,7 +17,7 @@
17 */
17 */
18
18
19#include "UserMetrics.h"
19#include "UserMetrics.h"
20−#include "plugins/Utils/qvariantlistmodel.h"
20+#include <qvariantlistmodel.h>
21
21
22#include <QtCore/QDir>
22#include <QtCore/QDir>
23#include <QtCore/QString>
23#include <QtCore/QString>
tests/plugins/AccountsService/CMakeLists.txt+6−1
@@ -1,6 +1,11 @@
1+if(DEFINED ENV{DEB_BUILD_MULTIARCH})
2+ set(QDBUSXML2CPP_EXECUTABLE "/usr/lib/$ENV{DEB_BUILD_MULTIARCH}/qt5/bin/qdbusxml2cpp")
3+else()
4+ FIND_PROGRAM(QDBUSXML2CPP_EXECUTABLE qdbusxml2cpp)
5+endif()
1macro(make_dbus_class NAME INTERFACE)
6macro(make_dbus_class NAME INTERFACE)
2 if(${CMAKE_CURRENT_SOURCE_DIR}/interfaces.xml IS_NEWER_THAN ${CMAKE_CURRENT_BINARY_DIR}/${NAME}Adaptor.h)
7 if(${CMAKE_CURRENT_SOURCE_DIR}/interfaces.xml IS_NEWER_THAN ${CMAKE_CURRENT_BINARY_DIR}/${NAME}Adaptor.h)
3− execute_process(COMMAND qdbusxml2cpp -c ${NAME}Adaptor -a ${CMAKE_CURRENT_BINARY_DIR}/${NAME}Adaptor ${CMAKE_CURRENT_SOURCE_DIR}/interfaces.xml ${INTERFACE})
8+ execute_process(COMMAND ${QDBUSXML2CPP_EXECUTABLE} -c ${NAME}Adaptor -a ${CMAKE_CURRENT_BINARY_DIR}/${NAME}Adaptor ${CMAKE_CURRENT_SOURCE_DIR}/interfaces.xml ${INTERFACE})
4 endif()
9 endif()
5endmacro(make_dbus_class)
10endmacro(make_dbus_class)
6
11
tests/plugins/CMakeLists.txt+2−1
@@ -1,5 +1,6 @@
1add_subdirectory(AccountsService)
1add_subdirectory(AccountsService)
2−add_subdirectory(ListViewWithPageHeader)
2+add_subdirectory(LightDM)
3+add_subdirectory(DashViews)
3add_subdirectory(Ubuntu)
4add_subdirectory(Ubuntu)
4add_subdirectory(Unity)
5add_subdirectory(Unity)
5add_subdirectory(Utils)
6add_subdirectory(Utils)
tests/plugins/ListViewWithPageHeader/CMakeLists.txt → tests/plugins/DashViews/CMakeLists.txtrenamed+43−5
@@ -16,30 +16,66 @@ include_directories(
16 ${Qt5Quick_INCLUDE_DIRS}
16 ${Qt5Quick_INCLUDE_DIRS}
17 ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
17 ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
18 ${Qt5V8_PRIVATE_INCLUDE_DIR}
18 ${Qt5V8_PRIVATE_INCLUDE_DIR}
19− ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/ListViewWithPageHeader
19+ ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews
20 ${CMAKE_CURRENT_BINARY_DIR}
20 ${CMAKE_CURRENT_BINARY_DIR}
21 )
21 )
22
22
23remove_definitions(-DQT_NO_KEYWORDS)
23remove_definitions(-DQT_NO_KEYWORDS)
24
24
25−add_definitions(-DLISTVIEWWITHPAGEHEADER_FOLDER="${CMAKE_CURRENT_SOURCE_DIR}")
25+add_definitions(-DDASHVIEWSTEST_FOLDER="${CMAKE_CURRENT_SOURCE_DIR}")
26add_definitions(-DBUILT_PLUGINS_DIR="${CMAKE_BINARY_DIR}/plugins")
26add_definitions(-DBUILT_PLUGINS_DIR="${CMAKE_BINARY_DIR}/plugins")
27
27
28−add_executable(listviewwithpageheadertestExec listviewwithpageheadertest.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/ListViewWithPageHeader/listviewwithpageheader.cpp)
28+add_executable(listviewwithpageheadertestExec listviewwithpageheadertest.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/listviewwithpageheader.cpp)
29qt5_use_modules(listviewwithpageheadertestExec Test Core Qml)
29qt5_use_modules(listviewwithpageheadertestExec Test Core Qml)
30target_link_libraries(listviewwithpageheadertestExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
30target_link_libraries(listviewwithpageheadertestExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
31add_custom_target(testlistviewwithpageheader ${CMAKE_CURRENT_BINARY_DIR}/listviewwithpageheadertestExec -o ${CMAKE_BINARY_DIR}/testlistviewwithpageheader.xml,xunitxml -o -,txt)
31add_custom_target(testlistviewwithpageheader ${CMAKE_CURRENT_BINARY_DIR}/listviewwithpageheadertestExec -o ${CMAKE_BINARY_DIR}/testlistviewwithpageheader.xml,xunitxml -o -,txt)
32
32
33−add_executable(listviewwithpageheadertestsectionExec listviewwithpageheadertestsection.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/ListViewWithPageHeader/listviewwithpageheader.cpp)
33+add_executable(listviewwithpageheadertestsectionExec listviewwithpageheadertestsection.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/listviewwithpageheader.cpp)
34qt5_use_modules(listviewwithpageheadertestsectionExec Test Core Qml)
34qt5_use_modules(listviewwithpageheadertestsectionExec Test Core Qml)
35target_link_libraries(listviewwithpageheadertestsectionExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
35target_link_libraries(listviewwithpageheadertestsectionExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
36add_custom_target(testlistviewwithpageheadersection ${CMAKE_CURRENT_BINARY_DIR}/listviewwithpageheadertestsectionExec -o ${CMAKE_BINARY_DIR}/testlistviewwithpageheadersection.xml,xunitxml -o -,txt)
36add_custom_target(testlistviewwithpageheadersection ${CMAKE_CURRENT_BINARY_DIR}/listviewwithpageheadertestsectionExec -o ${CMAKE_BINARY_DIR}/testlistviewwithpageheadersection.xml,xunitxml -o -,txt)
37
37
38−add_executable(listviewwithpageheadertestsectionexternalmodelExec listviewwithpageheadertestsectionexternalmodel.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/ListViewWithPageHeader/listviewwithpageheader.cpp)
38+add_executable(listviewwithpageheadertestsectionexternalmodelExec listviewwithpageheadertestsectionexternalmodel.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/listviewwithpageheader.cpp)
39qt5_use_modules(listviewwithpageheadertestsectionexternalmodelExec Test Core Qml)
39qt5_use_modules(listviewwithpageheadertestsectionexternalmodelExec Test Core Qml)
40target_link_libraries(listviewwithpageheadertestsectionexternalmodelExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
40target_link_libraries(listviewwithpageheadertestsectionexternalmodelExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
41add_custom_target(testlistviewwithpageheadersectionexternalmodel ${CMAKE_CURRENT_BINARY_DIR}/listviewwithpageheadertestsectionexternalmodelExec -o ${CMAKE_BINARY_DIR}/testlistviewwithpageheadersectionexternalmodel.xml,xunitxml -o -,txt)
41add_custom_target(testlistviewwithpageheadersectionexternalmodel ${CMAKE_CURRENT_BINARY_DIR}/listviewwithpageheadertestsectionexternalmodelExec -o ${CMAKE_BINARY_DIR}/testlistviewwithpageheadersectionexternalmodel.xml,xunitxml -o -,txt)
42
42
43+macro(add_journal_try_test FILENAME)
44+ # Capitalite the first letter for the test/try name targets
45+ string(SUBSTRING ${FILENAME} 0 1 FIRST_LETTER)
46+ string(TOUPPER ${FIRST_LETTER} FIRST_LETTER)
47+ string(REGEX REPLACE "^.(.*)" "${FIRST_LETTER}\\1" CUSTOM_TARGET_NAME "${FILENAME}")
48+
49+ add_executable(${FILENAME}testExec
50+ ${FILENAME}test.cpp
51+ ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/${FILENAME}.cpp
52+ ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/abstractjournal.cpp
53+ )
54+ qt5_use_modules(${FILENAME}testExec Test Core Qml)
55+ target_link_libraries(${FILENAME}testExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
56+ add_custom_target(test${CUSTOM_TARGET_NAME}
57+ ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}testExec
58+ -o ${CMAKE_BINARY_DIR}/test${CUSTOM_TARGET_NAME}.xml,xunitxml
59+ -o -,txt
60+ DEPENDS ${FILENAME}testExec DashViews-qml
61+ )
62+
63+ add_executable(${FILENAME}tryExec
64+ ${FILENAME}try.cpp
65+ ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/${FILENAME}.cpp
66+ ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/abstractjournal.cpp
67+ )
68+ qt5_use_modules(${FILENAME}tryExec Test Core Qml)
69+ target_link_libraries(${FILENAME}tryExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
70+ add_custom_target(try${CUSTOM_TARGET_NAME}
71+ ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}tryExec
72+ DEPENDS ${FILENAME}tryExec DashViews-qml
73+ )
74+endmacro()
75+
76+add_journal_try_test(verticaljournal)
77+add_journal_try_test(horizontaljournal)
78+
43set(qmltest_DEFAULT_NO_ADD_TEST TRUE)
79set(qmltest_DEFAULT_NO_ADD_TEST TRUE)
44add_qml_test(. listviewwithpageheaderqml IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
80add_qml_test(. listviewwithpageheaderqml IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
45
81
@@ -47,3 +83,5 @@ add_dependencies(qmluitests testlistviewwithpageheader)
47add_dependencies(qmluitests testlistviewwithpageheadersection)
83add_dependencies(qmluitests testlistviewwithpageheadersection)
48add_dependencies(qmluitests testlistviewwithpageheadersectionexternalmodel)
84add_dependencies(qmluitests testlistviewwithpageheadersectionexternalmodel)
49add_dependencies(qmluitests testlistviewwithpageheaderqml)
85add_dependencies(qmluitests testlistviewwithpageheaderqml)
86+add_dependencies(qmluitests testVerticaljournal)
87+add_dependencies(qmluitests testHorizontaljournal)
tests/plugins/DashViews/horizontaljournaltest.cppnew file+465
@@ -0,0 +1,465 @@
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+#include <QQuickView>
18+#include <QtTestGui>
19+#include <QDebug>
20+#include <QGuiApplication>
21+#include <QQuickView>
22+#include <QtQml/qqml.h>
23+#include <QStringListModel>
24+#include <QQmlContext>
25+#include <QQmlEngine>
26+#pragma GCC diagnostic push
27+#pragma GCC diagnostic ignored "-pedantic"
28+#include <private/qquickitem_p.h>
29+#pragma GCC diagnostic pop
30+
31+#include "horizontaljournal.h"
32+
33+class WidthModel : public QAbstractListModel {
34+public:
35+ QHash<int, QByteArray> roleNames() const
36+ {
37+ QHash<int, QByteArray> roles;
38+ roles.insert(Qt::DisplayRole, "modelWidth");
39+ return roles;
40+ }
41+
42+ int rowCount(const QModelIndex & /*parent*/) const
43+ {
44+ return m_list.count();
45+ }
46+
47+ QVariant data(const QModelIndex &index, int /*role*/) const
48+ {
49+ return m_list[index.row()];
50+ }
51+
52+ QStringList stringList() const
53+ {
54+ return m_list;
55+ }
56+
57+ void setStringList(const QStringList &list)
58+ {
59+ beginResetModel();
60+ m_list = list;
61+ endResetModel();
62+ }
63+
64+ void addString(const QString& string)
65+ {
66+ beginInsertRows(QModelIndex(), m_list.count(), m_list.count());
67+ m_list << string;
68+ endInsertRows();
69+ }
70+
71+ void removeLast()
72+ {
73+ beginRemoveRows(QModelIndex(), m_list.count() - 1, m_list.count() - 1);
74+ m_list.takeLast();
75+ endRemoveRows();
76+ }
77+
78+private:
79+ QStringList m_list;
80+};
81+
82+class HorizontalJournalTest : public QObject
83+{
84+ Q_OBJECT
85+
86+private:
87+ void verifyItem(const QQuickItem *item, int modelIndex, qreal x, qreal y, bool visible)
88+ {
89+ QTRY_COMPARE(item->x(), x);
90+ QTRY_COMPARE(item->y(), y);
91+ QTRY_COMPARE(item->width(), model->stringList()[modelIndex].toDouble());
92+ QTRY_COMPARE(QQuickItemPrivate::get(item)->culled, !visible);
93+ }
94+
95+ void checkInitialPositions()
96+ {
97+ QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
98+ QTRY_COMPARE(hj->m_visibleItems.count(), 14);
99+ verifyItem(hj->m_visibleItems[ 0], 0, 0, 0, true);
100+ verifyItem(hj->m_visibleItems[ 1], 1, 110, 0, true);
101+ verifyItem(hj->m_visibleItems[ 2], 2, 170, 0, true);
102+ verifyItem(hj->m_visibleItems[ 3], 3, 305, 0, true);
103+ verifyItem(hj->m_visibleItems[ 4], 4, 325, 0, true);
104+ verifyItem(hj->m_visibleItems[ 5], 5, 375, 0, true);
105+ verifyItem(hj->m_visibleItems[ 6], 6, 0, 160, true);
106+ verifyItem(hj->m_visibleItems[ 7], 7, 210, 160, true);
107+ verifyItem(hj->m_visibleItems[ 8], 8, 0, 320, true);
108+ verifyItem(hj->m_visibleItems[ 9], 9, 170, 320, true);
109+ verifyItem(hj->m_visibleItems[10], 10, 200, 320, true);
110+ verifyItem(hj->m_visibleItems[11], 11, 230, 320, true);
111+ verifyItem(hj->m_visibleItems[12], 12, 305, 320, true);
112+ verifyItem(hj->m_visibleItems[13], 13, 0, 480, false);
113+ QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 4);
114+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 5], 375.);
115+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 7], 210.);
116+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[12], 305.);
117+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[13], 0.);
118+ QCOMPARE(hj->implicitHeight(), 900.);
119+ }
120+
121+private Q_SLOTS:
122+ void init()
123+ {
124+ view = new QQuickView();
125+ view->setResizeMode(QQuickView::SizeRootObjectToView);
126+ view->engine()->addImportPath(BUILT_PLUGINS_DIR);
127+
128+ model = new WidthModel();
129+ QStringList heightList;
130+ heightList << "100" << "50" << "125" << "10" << "40" << "70" << "200" << "110" << "160" << "20" << "20" << "65" << "80" << "200" << "300" << "130" << "400" << "300" << "500" << "10";
131+ model->setStringList(heightList);
132+
133+ view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/horizontaljournaltest.qml"));
134+
135+ view->show();
136+ view->resize(470, 400);
137+ QTest::qWaitForWindowExposed(view);
138+
139+ hj = dynamic_cast<HorizontalJournal*>(view->rootObject()->findChild<QObject*>("hj"));
140+ hj->setModel(model);
141+
142+ checkInitialPositions();
143+ }
144+
145+ void cleanup()
146+ {
147+ delete view;
148+ delete model;
149+ }
150+
151+ void testWidthResize()
152+ {
153+ view->resize(629, 400);
154+ QTRY_COMPARE(hj->width(), 629.);
155+
156+ QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
157+ QTRY_COMPARE(hj->m_visibleItems.count(), 17);
158+ verifyItem(hj->m_visibleItems[ 0], 0, 0, 0, true);
159+ verifyItem(hj->m_visibleItems[ 1], 1, 110, 0, true);
160+ verifyItem(hj->m_visibleItems[ 2], 2, 170, 0, true);
161+ verifyItem(hj->m_visibleItems[ 3], 3, 305, 0, true);
162+ verifyItem(hj->m_visibleItems[ 4], 4, 325, 0, true);
163+ verifyItem(hj->m_visibleItems[ 5], 5, 375, 0, true);
164+ verifyItem(hj->m_visibleItems[ 6], 6, 0, 160, true);
165+ verifyItem(hj->m_visibleItems[ 7], 7, 210, 160, true);
166+ verifyItem(hj->m_visibleItems[ 8], 8, 330, 160, true);
167+ verifyItem(hj->m_visibleItems[ 9], 9, 500, 160, true);
168+ verifyItem(hj->m_visibleItems[10], 10, 530, 160, true);
169+ verifyItem(hj->m_visibleItems[11], 11, 560, 160, true);
170+ verifyItem(hj->m_visibleItems[12], 12, 0, 320, true);
171+ verifyItem(hj->m_visibleItems[13], 13, 90, 320, true);
172+ verifyItem(hj->m_visibleItems[14], 14, 300, 320, true);
173+ verifyItem(hj->m_visibleItems[15], 15, 0, 480, false);
174+ verifyItem(hj->m_visibleItems[16], 16, 140, 480, false);
175+ QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 4);
176+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 5], 375.);
177+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[11], 560.);
178+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[14], 300.);
179+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[16], 140.);
180+ QCOMPARE(hj->implicitHeight(), 630. + 3. * 630. / 17.);
181+
182+ view->resize(470, 400);
183+
184+ // This is exactly the same block as the first again
185+ checkInitialPositions();
186+ }
187+
188+ void testColumnSpacing()
189+ {
190+ hj->setColumnSpacing(11);
191+
192+ QTRY_COMPARE(hj->m_needsRelayout, false);
193+ QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
194+ QTRY_COMPARE(hj->m_visibleItems.count(), 14);
195+ verifyItem(hj->m_visibleItems[ 0], 0, 0, 0, true);
196+ verifyItem(hj->m_visibleItems[ 1], 1, 111, 0, true);
197+ verifyItem(hj->m_visibleItems[ 2], 2, 172, 0, true);
198+ verifyItem(hj->m_visibleItems[ 3], 3, 308, 0, true);
199+ verifyItem(hj->m_visibleItems[ 4], 4, 329, 0, true);
200+ verifyItem(hj->m_visibleItems[ 5], 5, 380, 0, true);
201+ verifyItem(hj->m_visibleItems[ 6], 6, 0, 160, true);
202+ verifyItem(hj->m_visibleItems[ 7], 7, 211, 160, true);
203+ verifyItem(hj->m_visibleItems[ 8], 8, 0, 320, true);
204+ verifyItem(hj->m_visibleItems[ 9], 9, 171, 320, true);
205+ verifyItem(hj->m_visibleItems[10], 10, 202, 320, true);
206+ verifyItem(hj->m_visibleItems[11], 11, 233, 320, true);
207+ verifyItem(hj->m_visibleItems[12], 12, 309, 320, true);
208+ verifyItem(hj->m_visibleItems[13], 13, 0, 480, false);
209+ QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 4);
210+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 5], 380.);
211+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 7], 211.);
212+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[12], 309.);
213+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[13], 0.);
214+ QCOMPARE(hj->implicitHeight(), 900.);
215+
216+ hj->setColumnSpacing(10);
217+ QTRY_COMPARE(hj->m_needsRelayout, false);
218+
219+ // This is exactly the same block as the first again
220+ checkInitialPositions();
221+ }
222+
223+ void testRowSpacing()
224+ {
225+ hj->setRowSpacing(11);
226+
227+ QTRY_COMPARE(hj->m_needsRelayout, false);
228+ QTRY_COMPARE(hj->m_needsRelayout, false);
229+ QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
230+ QTRY_COMPARE(hj->m_visibleItems.count(), 14);
231+ verifyItem(hj->m_visibleItems[ 0], 0, 0, 0, true);
232+ verifyItem(hj->m_visibleItems[ 1], 1, 110, 0, true);
233+ verifyItem(hj->m_visibleItems[ 2], 2, 170, 0, true);
234+ verifyItem(hj->m_visibleItems[ 3], 3, 305, 0, true);
235+ verifyItem(hj->m_visibleItems[ 4], 4, 325, 0, true);
236+ verifyItem(hj->m_visibleItems[ 5], 5, 375, 0, true);
237+ verifyItem(hj->m_visibleItems[ 6], 6, 0, 161, true);
238+ verifyItem(hj->m_visibleItems[ 7], 7, 210, 161, true);
239+ verifyItem(hj->m_visibleItems[ 8], 8, 0, 322, true);
240+ verifyItem(hj->m_visibleItems[ 9], 9, 170, 322, true);
241+ verifyItem(hj->m_visibleItems[10], 10, 200, 322, true);
242+ verifyItem(hj->m_visibleItems[11], 11, 230, 322, true);
243+ verifyItem(hj->m_visibleItems[12], 12, 305, 322, true);
244+ verifyItem(hj->m_visibleItems[13], 13, 0, 483, false);
245+ QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 4);
246+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 5], 375.);
247+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 7], 210.);
248+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[12], 305.);
249+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[13], 0.);
250+ QCOMPARE(hj->implicitHeight(), 633. + 6. * 633. / 14.);
251+
252+ hj->setRowSpacing(10);
253+ QTRY_COMPARE(hj->m_needsRelayout, false);
254+
255+ // This is exactly the same block as the first again
256+ checkInitialPositions();
257+ }
258+
259+ void testDelegateCreationRanges()
260+ {
261+ hj->setDelegateCreationBegin(300);
262+ hj->setDelegateCreationEnd(view->height());
263+
264+ QTRY_COMPARE(hj->m_firstVisibleIndex, 6);
265+ QTRY_COMPARE(hj->m_visibleItems.count(), 7);
266+ verifyItem(hj->m_visibleItems[0], 6, 0, 160, true);
267+ verifyItem(hj->m_visibleItems[1], 7, 210, 160, true);
268+ verifyItem(hj->m_visibleItems[2], 8, 0, 320, true);
269+ verifyItem(hj->m_visibleItems[3], 9, 170, 320, true);
270+ verifyItem(hj->m_visibleItems[4], 10, 200, 320, true);
271+ verifyItem(hj->m_visibleItems[5], 11, 230, 320, true);
272+ verifyItem(hj->m_visibleItems[6], 12, 305, 320, true);
273+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 5], 375.);
274+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 7], 210.);
275+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[12], 305.);
276+
277+ hj->resetDelegateCreationBegin();
278+ hj->resetDelegateCreationEnd();
279+
280+ // This is exactly the same block as the first again
281+ checkInitialPositions();
282+ }
283+
284+
285+ void testRowHeightChange()
286+ {
287+ hj->setRowHeight(200);
288+ QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
289+ QTRY_COMPARE(hj->m_visibleItems.count(), 13);
290+ verifyItem(hj->m_visibleItems[ 0], 0, 0, 0, true);
291+ verifyItem(hj->m_visibleItems[ 1], 1, 110, 0, true);
292+ verifyItem(hj->m_visibleItems[ 2], 2, 170, 0, true);
293+ verifyItem(hj->m_visibleItems[ 3], 3, 305, 0, true);
294+ verifyItem(hj->m_visibleItems[ 4], 4, 325, 0, true);
295+ verifyItem(hj->m_visibleItems[ 5], 5, 375, 0, true);
296+ verifyItem(hj->m_visibleItems[ 6], 6, 0, 210, true);
297+ verifyItem(hj->m_visibleItems[ 7], 7, 210, 210, true);
298+ verifyItem(hj->m_visibleItems[ 8], 8, 0, 420, false);
299+ verifyItem(hj->m_visibleItems[ 9], 9, 170, 420, false);
300+ verifyItem(hj->m_visibleItems[10], 10, 200, 420, false);
301+ verifyItem(hj->m_visibleItems[11], 11, 230, 420, false);
302+ verifyItem(hj->m_visibleItems[12], 12, 305, 420, false);
303+ QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 3);
304+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 5], 375.);
305+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 7], 210.);
306+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[12], 305.);
307+ QCOMPARE(hj->implicitHeight(), 620. + 7. * 620. / 13.);
308+
309+ hj->setRowHeight(150);
310+
311+ // This is exactly the same block as the first again
312+ checkInitialPositions();
313+ }
314+
315+ void testChangeModel()
316+ {
317+ WidthModel *model2 = new WidthModel();
318+ QStringList list2;
319+ list2 << "100" << "50" << "125" << "25" << "50" << "50";
320+ model2->setStringList(list2);
321+ hj->setModel(model2);
322+ delete model;
323+ model = model2;
324+
325+ QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
326+ QTRY_COMPARE(hj->m_visibleItems.count(), 6);
327+ verifyItem(hj->m_visibleItems[ 0], 0, 0, 0, true);
328+ verifyItem(hj->m_visibleItems[ 1], 1, 110, 0, true);
329+ verifyItem(hj->m_visibleItems[ 2], 2, 170, 0, true);
330+ verifyItem(hj->m_visibleItems[ 3], 3, 305, 0, true);
331+ verifyItem(hj->m_visibleItems[ 4], 4, 340, 0, true);
332+ verifyItem(hj->m_visibleItems[ 5], 5, 400, 0, true);
333+ QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 0);
334+ QCOMPARE(hj->implicitHeight(), 150.);
335+ }
336+
337+ void testModelReset()
338+ {
339+ QStringList heightList;
340+ heightList << "100" << "50" << "125" << "25" << "50" << "50";
341+ model->setStringList(heightList);
342+
343+ QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
344+ QTRY_COMPARE(hj->m_visibleItems.count(), 6);
345+ verifyItem(hj->m_visibleItems[ 0], 0, 0, 0, true);
346+ verifyItem(hj->m_visibleItems[ 1], 1, 110, 0, true);
347+ verifyItem(hj->m_visibleItems[ 2], 2, 170, 0, true);
348+ verifyItem(hj->m_visibleItems[ 3], 3, 305, 0, true);
349+ verifyItem(hj->m_visibleItems[ 4], 4, 340, 0, true);
350+ verifyItem(hj->m_visibleItems[ 5], 5, 400, 0, true);
351+ QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 0);
352+ QCOMPARE(hj->implicitHeight(), 150.);
353+ }
354+
355+ void testModelRemoveLastNonVisible()
356+ {
357+ model->removeLast();
358+
359+ // This is the same than checkInitialPositions but
360+ // with a different implicitHeight since there's an item less
361+ // in the model
362+ QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
363+ QTRY_COMPARE(hj->m_visibleItems.count(), 14);
364+ verifyItem(hj->m_visibleItems[ 0], 0, 0, 0, true);
365+ verifyItem(hj->m_visibleItems[ 1], 1, 110, 0, true);
366+ verifyItem(hj->m_visibleItems[ 2], 2, 170, 0, true);
367+ verifyItem(hj->m_visibleItems[ 3], 3, 305, 0, true);
368+ verifyItem(hj->m_visibleItems[ 4], 4, 325, 0, true);
369+ verifyItem(hj->m_visibleItems[ 5], 5, 375, 0, true);
370+ verifyItem(hj->m_visibleItems[ 6], 6, 0, 160, true);
371+ verifyItem(hj->m_visibleItems[ 7], 7, 210, 160, true);
372+ verifyItem(hj->m_visibleItems[ 8], 8, 0, 320, true);
373+ verifyItem(hj->m_visibleItems[ 9], 9, 170, 320, true);
374+ verifyItem(hj->m_visibleItems[10], 10, 200, 320, true);
375+ verifyItem(hj->m_visibleItems[11], 11, 230, 320, true);
376+ verifyItem(hj->m_visibleItems[12], 12, 305, 320, true);
377+ verifyItem(hj->m_visibleItems[13], 13, 0, 480, false);
378+ QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 4);
379+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 5], 375.);
380+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 7], 210.);
381+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[12], 305.);
382+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[13], 0.);
383+ QTRY_COMPARE(hj->implicitHeight(), 855.);
384+ }
385+
386+ void testModelAppendRemoveLast()
387+ {
388+ WidthModel *model2 = new WidthModel();
389+ QStringList heightList;
390+ heightList << "100" << "50" << "125" << "25" << "50" << "50";
391+ model2->setStringList(heightList);
392+ hj->setModel(model2);
393+ delete model;
394+ model = model2;
395+
396+ QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
397+ QTRY_COMPARE(hj->m_visibleItems.count(), 6);
398+ verifyItem(hj->m_visibleItems[0], 0, 0, 0, true);
399+ verifyItem(hj->m_visibleItems[1], 1, 110, 0, true);
400+ verifyItem(hj->m_visibleItems[2], 2, 170, 0, true);
401+ verifyItem(hj->m_visibleItems[3], 3, 305, 0, true);
402+ verifyItem(hj->m_visibleItems[4], 4, 340, 0, true);
403+ verifyItem(hj->m_visibleItems[5], 5, 400, 0, true);
404+ QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 0);
405+ QCOMPARE(hj->implicitHeight(), 150.);
406+
407+ model2->addString("75");
408+
409+ QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
410+ QTRY_COMPARE(hj->m_visibleItems.count(), 7);
411+ verifyItem(hj->m_visibleItems[0], 0, 0, 0, true);
412+ verifyItem(hj->m_visibleItems[1], 1, 110, 0, true);
413+ verifyItem(hj->m_visibleItems[2], 2, 170, 0, true);
414+ verifyItem(hj->m_visibleItems[3], 3, 305, 0, true);
415+ verifyItem(hj->m_visibleItems[4], 4, 340, 0, true);
416+ verifyItem(hj->m_visibleItems[5], 5, 400, 0, true);
417+ verifyItem(hj->m_visibleItems[6], 6, 0, 160, true);
418+ QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 1);
419+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[5], 400.);
420+ QCOMPARE(hj->implicitHeight(), 310.);
421+
422+ model2->addString("50");
423+ model2->addString("50");
424+
425+ QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
426+ QTRY_COMPARE(hj->m_visibleItems.count(), 9);
427+ verifyItem(hj->m_visibleItems[0], 0, 0, 0, true);
428+ verifyItem(hj->m_visibleItems[1], 1, 110, 0, true);
429+ verifyItem(hj->m_visibleItems[2], 2, 170, 0, true);
430+ verifyItem(hj->m_visibleItems[3], 3, 305, 0, true);
431+ verifyItem(hj->m_visibleItems[4], 4, 340, 0, true);
432+ verifyItem(hj->m_visibleItems[5], 5, 400, 0, true);
433+ verifyItem(hj->m_visibleItems[6], 6, 0, 160, true);
434+ verifyItem(hj->m_visibleItems[7], 7, 85, 160, true);
435+ verifyItem(hj->m_visibleItems[8], 8, 145, 160, true);
436+ QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 1);
437+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[5], 400.);
438+ QCOMPARE(hj->implicitHeight(), 310.);
439+
440+ model2->removeLast();
441+
442+ QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
443+ QTRY_COMPARE(hj->m_visibleItems.count(), 8);
444+ verifyItem(hj->m_visibleItems[0], 0, 0, 0, true);
445+ verifyItem(hj->m_visibleItems[1], 1, 110, 0, true);
446+ verifyItem(hj->m_visibleItems[2], 2, 170, 0, true);
447+ verifyItem(hj->m_visibleItems[3], 3, 305, 0, true);
448+ verifyItem(hj->m_visibleItems[4], 4, 340, 0, true);
449+ verifyItem(hj->m_visibleItems[5], 5, 400, 0, true);
450+ verifyItem(hj->m_visibleItems[6], 6, 0, 160, true);
451+ verifyItem(hj->m_visibleItems[7], 7, 85, 160, true);
452+ QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 1);
453+ QTRY_COMPARE(hj->m_lastInRowIndexPosition[5], 400.);
454+ QCOMPARE(hj->implicitHeight(), 310.);
455+ }
456+
457+private:
458+ QQuickView *view;
459+ HorizontalJournal *hj;
460+ WidthModel *model;
461+};
462+
463+QTEST_MAIN(HorizontalJournalTest)
464+
465+#include "horizontaljournaltest.moc"
tests/plugins/DashViews/horizontaljournaltest.qmlnew file+43
@@ -0,0 +1,43 @@
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.1
18+import DashViews 0.1
19+
20+Item {
21+
22+ HorizontalJournal {
23+ objectName: "hj"
24+ anchors.fill: parent
25+ rowHeight: 150
26+ columnSpacing: 10
27+ rowSpacing: 10
28+
29+ delegate: Rectangle {
30+ property real randomValue: Math.random()
31+ height: 150
32+ color: randomValue < 0.3 ? "green" : randomValue < 0.6 ? "blue" : "red";
33+ width: modelWidth
34+ border.width: 3
35+
36+ Text {
37+ text: index + "\nx: " + parent.x + "\nwidth: " + parent.width
38+ x: 10
39+ y: 10
40+ }
41+ }
42+ }
43+}
tests/plugins/DashViews/horizontaljournaltry.cppnew file+90
@@ -0,0 +1,90 @@
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+#include <QQuickView>
18+#include <QDebug>
19+#include <QGuiApplication>
20+#include <QQuickView>
21+#include <QtQml/qqml.h>
22+#include <QStringListModel>
23+#include <QQmlContext>
24+#include <QQmlEngine>
25+#include <QGuiApplication>
26+
27+#include "horizontaljournal.h"
28+
29+class QWidthModela : public QStringListModel {
30+ Q_OBJECT
31+public:
32+ QHash<int, QByteArray> roleNames() const
33+ {
34+ QHash<int, QByteArray> roles;
35+ roles.insert(Qt::DisplayRole, "modelWidth");
36+ return roles;
37+ }
38+
39+public slots:
40+ void add(int height)
41+ {
42+ if (height <= 0) {
43+ height = 50 + 50. * qrand() / RAND_MAX ;
44+ }
45+ QStringList sl = stringList();
46+ sl << QString::number(height);
47+ setStringList(sl);
48+ }
49+
50+ void remove()
51+ {
52+ QStringList sl = stringList();
53+ if (!sl.isEmpty()) {
54+ sl.removeLast();
55+ setStringList(sl);
56+ }
57+ }
58+};
59+
60+int main(int argc, char *argv[])
61+{
62+ QGuiApplication a(argc, argv);
63+
64+ QQuickView *view = new QQuickView();
65+ view->setResizeMode(QQuickView::SizeRootObjectToView);
66+ view->engine()->addImportPath(BUILT_PLUGINS_DIR);
67+
68+ QWidthModela model;
69+ QStringList heightList;
70+ heightList << "100" << "50" << "125";
71+ model.setStringList(heightList);
72+
73+ QStringListModel listModel;
74+ listModel.setStringList(QStringList() << QString());
75+
76+ view->rootContext()->setContextProperty("listModel", &listModel);
77+ view->rootContext()->setContextProperty("vjModel", &model);
78+
79+ view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/horizontaljournaltry.qml"));
80+
81+ view->show();
82+ view->resize(530, 400);
83+
84+ QObject::connect(view->rootObject(), SIGNAL(add(int)), &model, SLOT(add(int)));
85+ QObject::connect(view->rootObject(), SIGNAL(remove()), &model, SLOT(remove()));
86+
87+ return a.exec();
88+}
89+
90+#include "horizontaljournaltry.moc"
tests/plugins/DashViews/horizontaljournaltry.qmlnew file+99
@@ -0,0 +1,99 @@
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.1
18+import DashViews 0.1
19+
20+Item {
21+ id: root
22+ signal add(int width)
23+ signal remove()
24+
25+ ListViewWithPageHeader {
26+ id: lvwph
27+ model: listModel
28+ height: parent.height
29+ width: parent.width - controls.width
30+
31+ delegate: HorizontalJournal {
32+ model: vjModel
33+ rowHeight: 100
34+ columnSpacing: 10
35+ rowSpacing: 10
36+ width: parent.width
37+ height: implicitHeight > 100 ? implicitHeight : 100
38+ delegateCreationBegin: lvwph.contentY
39+ delegateCreationEnd: lvwph.contentY + lvwph.height
40+
41+ delegate: Rectangle {
42+ height: 100
43+ color: "red";
44+ width: modelWidth
45+ border.width: 3
46+
47+ Text {
48+ text: index + "\nx: " + parent.x + "\nwidth: " + parent.width
49+ x: 10
50+ y: 10
51+ }
52+ }
53+ }
54+ }
55+
56+ Rectangle {
57+ id: controls
58+ height: parent.height
59+ width: 100
60+ anchors.right: parent.right
61+ color: "gray"
62+ opacity: 0.4
63+
64+ Rectangle {
65+ id: addButton
66+ height: 50
67+ width: parent.width
68+ color: "blue"
69+ Text {
70+ text: "Add"
71+ anchors.centerIn: parent
72+ }
73+ MouseArea {
74+ anchors.fill: parent
75+ onClicked: root.add(addField.text)
76+ }
77+ }
78+ TextInput {
79+ id: addField
80+ anchors.top: addButton.bottom
81+ height: 30
82+ width: parent.width
83+ }
84+ Rectangle {
85+ anchors.top: addField.bottom
86+ height: 50
87+ width: parent.width
88+ color: "red"
89+ Text {
90+ text: "Remove"
91+ anchors.centerIn: parent
92+ }
93+ MouseArea {
94+ anchors.fill: parent
95+ onClicked: root.remove()
96+ }
97+ }
98+ }
99+}
tests/plugins/ListViewWithPageHeader/listviewwithpageheadertest.cpp → tests/plugins/DashViews/listviewwithpageheadertest.cpprenamed+1−1
@@ -118,7 +118,7 @@ private Q_SLOTS:
118 {
118 {
119 view = new QQuickView();
119 view = new QQuickView();
120 view->engine()->addImportPath(BUILT_PLUGINS_DIR);
120 view->engine()->addImportPath(BUILT_PLUGINS_DIR);
121− view->setSource(QUrl::fromLocalFile(LISTVIEWWITHPAGEHEADER_FOLDER "/test.qml"));
121+ view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/listviewwithpageheadertest.qml"));
122 lvwph = dynamic_cast<ListViewWithPageHeader*>(view->rootObject()->findChild<QQuickFlickable*>());
122 lvwph = dynamic_cast<ListViewWithPageHeader*>(view->rootObject()->findChild<QQuickFlickable*>());
123#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
123#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
124 model = view->rootObject()->findChild<QQuickListModel*>();
124 model = view->rootObject()->findChild<QQuickListModel*>();
tests/plugins/ListViewWithPageHeader/test.qml → tests/plugins/DashViews/listviewwithpageheadertest.qmlrenamed+1−1
@@ -15,7 +15,7 @@
15 */
15 */
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18−import ListViewWithPageHeader 0.1
18+import DashViews 0.1
19
19
20Rectangle {
20Rectangle {
21 width: 300
21 width: 300
tests/plugins/ListViewWithPageHeader/listviewwithpageheadertestsection.cpp → tests/plugins/DashViews/listviewwithpageheadertestsection.cpprenamed+1−1
@@ -133,7 +133,7 @@ private Q_SLOTS:
133 {
133 {
134 view = new QQuickView();
134 view = new QQuickView();
135 view->engine()->addImportPath(BUILT_PLUGINS_DIR);
135 view->engine()->addImportPath(BUILT_PLUGINS_DIR);
136− view->setSource(QUrl::fromLocalFile(LISTVIEWWITHPAGEHEADER_FOLDER "/test_section.qml"));
136+ view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/listviewwithpageheadertestsection.qml"));
137 lvwph = dynamic_cast<ListViewWithPageHeader*>(view->rootObject()->findChild<QQuickFlickable*>());
137 lvwph = dynamic_cast<ListViewWithPageHeader*>(view->rootObject()->findChild<QQuickFlickable*>());
138#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
138#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
139 model = view->rootObject()->findChild<QQuickListModel*>();
139 model = view->rootObject()->findChild<QQuickListModel*>();
tests/plugins/ListViewWithPageHeader/test_section.qml → tests/plugins/DashViews/listviewwithpageheadertestsection.qmlrenamed+1−1
@@ -15,7 +15,7 @@
15 */
15 */
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18−import ListViewWithPageHeader 0.1
18+import DashViews 0.1
19
19
20Rectangle {
20Rectangle {
21 width: 300
21 width: 300
tests/plugins/ListViewWithPageHeader/listviewwithpageheadertestsectionexternalmodel.cpp → tests/plugins/DashViews/listviewwithpageheadertestsectionexternalmodel.cpprenamed+1−1
@@ -173,7 +173,7 @@ private Q_SLOTS:
173 {
173 {
174 view = new QQuickView();
174 view = new QQuickView();
175 view->engine()->addImportPath(BUILT_PLUGINS_DIR);
175 view->engine()->addImportPath(BUILT_PLUGINS_DIR);
176− view->setSource(QUrl::fromLocalFile(LISTVIEWWITHPAGEHEADER_FOLDER "/test_sectionexternalmodel.qml"));
176+ view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/listviewwithpageheadertestsectionexternalmodel.qml"));
177 lvwph = dynamic_cast<ListViewWithPageHeader*>(view->rootObject()->findChild<QQuickFlickable*>());
177 lvwph = dynamic_cast<ListViewWithPageHeader*>(view->rootObject()->findChild<QQuickFlickable*>());
178 QVERIFY(lvwph);
178 QVERIFY(lvwph);
179 view->show();
179 view->show();
tests/plugins/ListViewWithPageHeader/test_sectionexternalmodel.qml → tests/plugins/DashViews/listviewwithpageheadertestsectionexternalmodel.qmlrenamed+1−1
@@ -15,7 +15,7 @@
15 */
15 */
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18−import ListViewWithPageHeader 0.1
18+import DashViews 0.1
19
19
20Rectangle {
20Rectangle {
21 width: 300
21 width: 300
tests/plugins/ListViewWithPageHeader/tst_listviewwithpageheaderqml.qml → tests/plugins/DashViews/tst_listviewwithpageheaderqml.qmlrenamed+1−1
@@ -16,7 +16,7 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import QtTest 1.0
18import QtTest 1.0
19−import ListViewWithPageHeader 0.1
19+import DashViews 0.1
20
20
21Rectangle {
21Rectangle {
22 width: 300
22 width: 300
tests/plugins/DashViews/verticaljournaltest.cppnew file+470
@@ -0,0 +1,470 @@
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+#include <QQuickView>
18+#include <QtTestGui>
19+#include <QDebug>
20+#include <QGuiApplication>
21+#include <QQuickView>
22+#include <QtQml/qqml.h>
23+#include <QStringListModel>
24+#include <QQmlContext>
25+#include <QQmlEngine>
26+#pragma GCC diagnostic push
27+#pragma GCC diagnostic ignored "-pedantic"
28+#include <private/qquickitem_p.h>
29+#pragma GCC diagnostic pop
30+
31+#include "verticaljournal.h"
32+
33+class HeightModel : public QAbstractListModel {
34+public:
35+ QHash<int, QByteArray> roleNames() const
36+ {
37+ QHash<int, QByteArray> roles;
38+ roles.insert(Qt::DisplayRole, "modelHeight");
39+ return roles;
40+ }
41+
42+ int rowCount(const QModelIndex & /*parent*/) const
43+ {
44+ return m_list.count();
45+ }
46+
47+ QVariant data(const QModelIndex &index, int /*role*/) const
48+ {
49+ return m_list[index.row()];
50+ }
51+
52+ QStringList stringList() const
53+ {
54+ return m_list;
55+ }
56+
57+ void setStringList(const QStringList &list)
58+ {
59+ beginResetModel();
60+ m_list = list;
61+ endResetModel();
62+ }
63+
64+ void addString(const QString& string)
65+ {
66+ beginInsertRows(QModelIndex(), m_list.count(), m_list.count());
67+ m_list << string;
68+ endInsertRows();
69+ }
70+
71+ void removeLast()
72+ {
73+ beginRemoveRows(QModelIndex(), m_list.count() - 1, m_list.count() - 1);
74+ m_list.takeLast();
75+ endRemoveRows();
76+ }
77+
78+private:
79+ QStringList m_list;
80+};
81+
82+class VerticalJournalTest : public QObject
83+{
84+ Q_OBJECT
85+
86+private:
87+ void verifyItem(const VerticalJournal::ViewItem &item, int modelIndex, qreal x, qreal y, bool visible)
88+ {
89+ QTRY_COMPARE(item.m_modelIndex, modelIndex);
90+ QTRY_COMPARE(item.x(), x);
91+ QTRY_COMPARE(item.y(), y);
92+ QTRY_COMPARE(item.height(), model->stringList()[modelIndex].toDouble());
93+ QTRY_COMPARE(QQuickItemPrivate::get(item.m_item)->culled, !visible);
94+ }
95+
96+ void checkInitialPositions()
97+ {
98+ QTRY_COMPARE(vj->m_columnVisibleItems.count(), 3);
99+ QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 5);
100+ QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 7);
101+ QTRY_COMPARE(vj->m_columnVisibleItems[2].count(), 6);
102+ verifyItem(vj->m_columnVisibleItems[0][0], 0, 0, 0, true);
103+ verifyItem(vj->m_columnVisibleItems[1][0], 1, 160, 0, true);
104+ verifyItem(vj->m_columnVisibleItems[2][0], 2, 320, 0, true);
105+ verifyItem(vj->m_columnVisibleItems[1][1], 3, 160, 60, true);
106+ verifyItem(vj->m_columnVisibleItems[1][2], 4, 160, 80, true);
107+ verifyItem(vj->m_columnVisibleItems[0][1], 5, 0, 110, true);
108+ verifyItem(vj->m_columnVisibleItems[1][3], 6, 160, 130, true);
109+ verifyItem(vj->m_columnVisibleItems[2][1], 7, 320, 135, true);
110+ verifyItem(vj->m_columnVisibleItems[0][2], 8, 0, 190, true);
111+ verifyItem(vj->m_columnVisibleItems[2][2], 9, 320, 255, true);
112+ verifyItem(vj->m_columnVisibleItems[2][3], 10, 320, 285, true);
113+ verifyItem(vj->m_columnVisibleItems[2][4], 11, 320, 315, true);
114+ verifyItem(vj->m_columnVisibleItems[1][4], 12, 160, 340, true);
115+ verifyItem(vj->m_columnVisibleItems[0][3], 13, 0, 360, true);
116+ verifyItem(vj->m_columnVisibleItems[2][5], 14, 320, 390, true);
117+ verifyItem(vj->m_columnVisibleItems[1][5], 15, 160, 430, false);
118+ verifyItem(vj->m_columnVisibleItems[0][4], 16, 0, 570, false);
119+ verifyItem(vj->m_columnVisibleItems[1][6], 17, 160, 570, false);
120+ QCOMPARE(vj->implicitHeight(), 970. + 2. * 970. / 18.);
121+ }
122+
123+private Q_SLOTS:
124+ void init()
125+ {
126+ view = new QQuickView();
127+ view->setResizeMode(QQuickView::SizeRootObjectToView);
128+ view->engine()->addImportPath(BUILT_PLUGINS_DIR);
129+
130+ model = new HeightModel();
131+ QStringList heightList;
132+ heightList << "100" << "50" << "125" << "10" << "40" << "70" << "200" << "110" << "160" << "20" << "20" << "65" << "80" << "200" << "300" << "130" << "400" << "300" << "500" << "10";
133+ model->setStringList(heightList);
134+
135+ view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/verticaljournaltest.qml"));
136+
137+ view->show();
138+ view->resize(470, 400);
139+ QTest::qWaitForWindowExposed(view);
140+
141+ vj = dynamic_cast<VerticalJournal*>(view->rootObject()->findChild<QObject*>("vj"));
142+ vj->setModel(model);
143+
144+ checkInitialPositions();
145+ }
146+
147+ void cleanup()
148+ {
149+ delete view;
150+ delete model;
151+ }
152+
153+ void testWidthResize()
154+ {
155+ view->resize(629, 400);
156+ QTRY_COMPARE(vj->width(), 629.);
157+
158+ // This is exactly the same block as above as nothing changed, just white space on the right
159+ checkInitialPositions();
160+
161+ view->resize(630, 400);
162+
163+ QTRY_COMPARE(vj->m_columnVisibleItems.count(), 4);
164+ QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 4);
165+ QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 7);
166+ QTRY_COMPARE(vj->m_columnVisibleItems[2].count(), 4);
167+ QTRY_COMPARE(vj->m_columnVisibleItems[3].count(), 5);
168+ verifyItem(vj->m_columnVisibleItems[0][0], 0, 0, 0, true);
169+ verifyItem(vj->m_columnVisibleItems[1][0], 1, 160, 0, true);
170+ verifyItem(vj->m_columnVisibleItems[2][0], 2, 320, 0, true);
171+ verifyItem(vj->m_columnVisibleItems[3][0], 3, 480, 0, true);
172+ verifyItem(vj->m_columnVisibleItems[3][1], 4, 480, 20, true);
173+ verifyItem(vj->m_columnVisibleItems[1][1], 5, 160, 60, true);
174+ verifyItem(vj->m_columnVisibleItems[3][2], 6, 480, 70, true);
175+ verifyItem(vj->m_columnVisibleItems[0][1], 7, 0, 110, true);
176+ verifyItem(vj->m_columnVisibleItems[2][1], 8, 320, 135, true);
177+ verifyItem(vj->m_columnVisibleItems[1][2], 9, 160, 140, true);
178+ verifyItem(vj->m_columnVisibleItems[1][3], 10, 160, 170, true);
179+ verifyItem(vj->m_columnVisibleItems[1][4], 11, 160, 200, true);
180+ verifyItem(vj->m_columnVisibleItems[0][2], 12, 0, 230, true);
181+ verifyItem(vj->m_columnVisibleItems[1][5], 13, 160, 275, true);
182+ verifyItem(vj->m_columnVisibleItems[3][3], 14, 480, 280, true);
183+ verifyItem(vj->m_columnVisibleItems[2][2], 15, 320, 305, true);
184+ verifyItem(vj->m_columnVisibleItems[0][3], 16, 0, 320, true);
185+ verifyItem(vj->m_columnVisibleItems[2][3], 17, 320, 445, false);
186+ verifyItem(vj->m_columnVisibleItems[1][6], 18, 160, 485, false);
187+ verifyItem(vj->m_columnVisibleItems[3][4], 19, 480, 590, false);
188+ QTRY_COMPARE(vj->implicitHeight(), 985.);
189+
190+ view->resize(470, 400);
191+
192+ // This is exactly the same block as the first again
193+ checkInitialPositions();
194+ }
195+
196+ void testColumnSpacing()
197+ {
198+ vj->setColumnSpacing(11);
199+
200+ QTRY_COMPARE(vj->m_needsRelayout, false);
201+ QTRY_COMPARE(vj->m_columnVisibleItems.count(), 2);
202+ QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 7);
203+ QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 7);
204+ verifyItem(vj->m_columnVisibleItems[0][0], 0, 0, 0, true);
205+ verifyItem(vj->m_columnVisibleItems[1][0], 1, 161, 0, true);
206+ verifyItem(vj->m_columnVisibleItems[1][1], 2, 161, 60, true);
207+ verifyItem(vj->m_columnVisibleItems[0][1], 3, 0, 110, true);
208+ verifyItem(vj->m_columnVisibleItems[0][2], 4, 0, 130, true);
209+ verifyItem(vj->m_columnVisibleItems[0][3], 5, 0, 180, true);
210+ verifyItem(vj->m_columnVisibleItems[1][2], 6, 161, 195, true);
211+ verifyItem(vj->m_columnVisibleItems[0][4], 7, 0, 260, true);
212+ verifyItem(vj->m_columnVisibleItems[0][5], 8, 0, 380, true);
213+ verifyItem(vj->m_columnVisibleItems[1][3], 9, 161, 405, false);
214+ verifyItem(vj->m_columnVisibleItems[1][4], 10, 161, 435, false);
215+ verifyItem(vj->m_columnVisibleItems[1][5], 11, 161, 465, false);
216+ verifyItem(vj->m_columnVisibleItems[1][6], 12, 161, 540, false);
217+ verifyItem(vj->m_columnVisibleItems[0][6], 13, 0, 550, false);
218+ QCOMPARE(vj->implicitHeight(), 750. + 6. * 750. / 14.);
219+
220+ vj->setColumnSpacing(10);
221+ QTRY_COMPARE(vj->m_needsRelayout, false);
222+
223+ // This is exactly the same block as the first again
224+ checkInitialPositions();
225+ }
226+
227+ void testRowSpacing()
228+ {
229+ vj->setRowSpacing(11);
230+
231+ QTRY_COMPARE(vj->m_needsRelayout, false);
232+ QTRY_COMPARE(vj->m_columnVisibleItems.count(), 3);
233+ QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 5);
234+ QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 7);
235+ QTRY_COMPARE(vj->m_columnVisibleItems[2].count(), 6);
236+ verifyItem(vj->m_columnVisibleItems[0][0], 0, 0, 0, true);
237+ verifyItem(vj->m_columnVisibleItems[1][0], 1, 160, 0, true);
238+ verifyItem(vj->m_columnVisibleItems[2][0], 2, 320, 0, true);
239+ verifyItem(vj->m_columnVisibleItems[1][1], 3, 160, 61, true);
240+ verifyItem(vj->m_columnVisibleItems[1][2], 4, 160, 82, true);
241+ verifyItem(vj->m_columnVisibleItems[0][1], 5, 0, 111, true);
242+ verifyItem(vj->m_columnVisibleItems[1][3], 6, 160, 133, true);
243+ verifyItem(vj->m_columnVisibleItems[2][1], 7, 320, 136, true);
244+ verifyItem(vj->m_columnVisibleItems[0][2], 8, 0, 192, true);
245+ verifyItem(vj->m_columnVisibleItems[2][2], 9, 320, 257, true);
246+ verifyItem(vj->m_columnVisibleItems[2][3], 10, 320, 288, true);
247+ verifyItem(vj->m_columnVisibleItems[2][4], 11, 320, 319, true);
248+ verifyItem(vj->m_columnVisibleItems[1][4], 12, 160, 344, true);
249+ verifyItem(vj->m_columnVisibleItems[0][3], 13, 0, 363, true);
250+ verifyItem(vj->m_columnVisibleItems[2][5], 14, 320, 395, true);
251+ verifyItem(vj->m_columnVisibleItems[1][5], 15, 160, 435, false);
252+ verifyItem(vj->m_columnVisibleItems[0][4], 16, 0, 574, false);
253+ verifyItem(vj->m_columnVisibleItems[1][6], 17, 160, 576, false);
254+ QCOMPARE(vj->implicitHeight(), 974. + 2. * 974. / 18.);
255+
256+ vj->setRowSpacing(10);
257+ QTRY_COMPARE(vj->m_needsRelayout, false);
258+
259+ // This is exactly the same block as the first again
260+ checkInitialPositions();
261+ }
262+
263+ void testDelegateCreationRanges()
264+ {
265+ vj->setDelegateCreationBegin(200);
266+ vj->setDelegateCreationEnd(view->height());
267+
268+ QTRY_COMPARE(vj->m_columnVisibleItems.count(), 3);
269+ QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 4);
270+ QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 4);
271+ QTRY_COMPARE(vj->m_columnVisibleItems[2].count(), 6);
272+ verifyItem(vj->m_columnVisibleItems[0][0], 0, 0, 0, false);
273+ verifyItem(vj->m_columnVisibleItems[2][0], 2, 320, 0, false);
274+ verifyItem(vj->m_columnVisibleItems[1][0], 4, 160, 80, false);
275+ verifyItem(vj->m_columnVisibleItems[0][1], 5, 0, 110, false);
276+ verifyItem(vj->m_columnVisibleItems[1][1], 6, 160, 130, true);
277+ verifyItem(vj->m_columnVisibleItems[2][1], 7, 320, 135, true);
278+ verifyItem(vj->m_columnVisibleItems[0][2], 8, 0, 190, true);
279+ verifyItem(vj->m_columnVisibleItems[2][2], 9, 320, 255, true);
280+ verifyItem(vj->m_columnVisibleItems[2][3], 10, 320, 285, true);
281+ verifyItem(vj->m_columnVisibleItems[2][4], 11, 320, 315, true);
282+ verifyItem(vj->m_columnVisibleItems[1][2], 12, 160, 340, true);
283+ verifyItem(vj->m_columnVisibleItems[0][3], 13, 0, 360, true);
284+ verifyItem(vj->m_columnVisibleItems[2][5], 14, 320, 390, true);
285+ verifyItem(vj->m_columnVisibleItems[1][3], 15, 160, 430, false);
286+ QCOMPARE(vj->implicitHeight(), 690. + 4. * 690. / 16.);
287+
288+ vj->resetDelegateCreationBegin();
289+ vj->resetDelegateCreationEnd();
290+
291+ // This is exactly the same block as the first again
292+ checkInitialPositions();
293+ }
294+
295+
296+ void testColumnWidthChange()
297+ {
298+ vj->setColumnWidth(200);
299+ QTRY_COMPARE(vj->m_columnVisibleItems.count(), 2);
300+ QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 7);
301+ QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 7);
302+ verifyItem(vj->m_columnVisibleItems[0][0], 0, 0, 0, true);
303+ verifyItem(vj->m_columnVisibleItems[1][0], 1, 210, 0, true);
304+ verifyItem(vj->m_columnVisibleItems[1][1], 2, 210, 60, true);
305+ verifyItem(vj->m_columnVisibleItems[0][1], 3, 0, 110, true);
306+ verifyItem(vj->m_columnVisibleItems[0][2], 4, 0, 130, true);
307+ verifyItem(vj->m_columnVisibleItems[0][3], 5, 0, 180, true);
308+ verifyItem(vj->m_columnVisibleItems[1][2], 6, 210, 195, true);
309+ verifyItem(vj->m_columnVisibleItems[0][4], 7, 0, 260, true);
310+ verifyItem(vj->m_columnVisibleItems[0][5], 8, 0, 380, true);
311+ verifyItem(vj->m_columnVisibleItems[1][3], 9, 210, 405, false);
312+ verifyItem(vj->m_columnVisibleItems[1][4], 10, 210, 435, false);
313+ verifyItem(vj->m_columnVisibleItems[1][5], 11, 210, 465, false);
314+ verifyItem(vj->m_columnVisibleItems[1][6], 12, 210, 540, false);
315+ verifyItem(vj->m_columnVisibleItems[0][6], 13, 0, 550, false);
316+ QCOMPARE(vj->implicitHeight(), 750. + 6. * 750. / 14.);
317+
318+ vj->setColumnWidth(150);
319+
320+ // This is exactly the same block as the first again
321+ checkInitialPositions();
322+ }
323+
324+ void testChangeModel()
325+ {
326+ HeightModel *model2 = new HeightModel();
327+ QStringList list2;
328+ list2 << "100" << "50" << "25" << "25" << "50" << "50";
329+ model2->setStringList(list2);
330+ vj->setModel(model2);
331+ delete model;
332+ model = model2;
333+
334+ QTRY_COMPARE(vj->m_columnVisibleItems.count(), 3);
335+ QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 1);
336+ QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 2);
337+ QTRY_COMPARE(vj->m_columnVisibleItems[2].count(), 3);
338+ verifyItem(vj->m_columnVisibleItems[0][0], 0, 0, 0, true);
339+ verifyItem(vj->m_columnVisibleItems[1][0], 1, 160, 0, true);
340+ verifyItem(vj->m_columnVisibleItems[2][0], 2, 320, 0, true);
341+ verifyItem(vj->m_columnVisibleItems[2][1], 3, 320, 35, true);
342+ verifyItem(vj->m_columnVisibleItems[1][1], 4, 160, 60, true);
343+ verifyItem(vj->m_columnVisibleItems[2][2], 5, 320, 70, true);
344+ }
345+
346+ void testModelReset()
347+ {
348+ QStringList heightList;
349+ heightList << "100" << "50" << "50" << "30";
350+ model->setStringList(heightList);
351+
352+ QTRY_COMPARE(vj->m_columnVisibleItems.count(), 3);
353+ QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 1);
354+ QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 2);
355+ QTRY_COMPARE(vj->m_columnVisibleItems[2].count(), 1);
356+ verifyItem(vj->m_columnVisibleItems[0][0], 0, 0, 0, true);
357+ verifyItem(vj->m_columnVisibleItems[1][0], 1, 160, 0, true);
358+ verifyItem(vj->m_columnVisibleItems[2][0], 2, 320, 0, true);
359+ verifyItem(vj->m_columnVisibleItems[1][1], 3, 160, 60, true);
360+ }
361+
362+ void testModelRemoveLastNonVisible()
363+ {
364+ model->removeLast();
365+
366+ // This is the same as checkInitialPositions but
367+ // with a different implicitHeight since there's an item less
368+ // in the model
369+ QTRY_COMPARE(vj->m_columnVisibleItems.count(), 3);
370+ QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 5);
371+ QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 7);
372+ QTRY_COMPARE(vj->m_columnVisibleItems[2].count(), 6);
373+ verifyItem(vj->m_columnVisibleItems[0][0], 0, 0, 0, true);
374+ verifyItem(vj->m_columnVisibleItems[1][0], 1, 160, 0, true);
375+ verifyItem(vj->m_columnVisibleItems[2][0], 2, 320, 0, true);
376+ verifyItem(vj->m_columnVisibleItems[1][1], 3, 160, 60, true);
377+ verifyItem(vj->m_columnVisibleItems[1][2], 4, 160, 80, true);
378+ verifyItem(vj->m_columnVisibleItems[0][1], 5, 0, 110, true);
379+ verifyItem(vj->m_columnVisibleItems[1][3], 6, 160, 130, true);
380+ verifyItem(vj->m_columnVisibleItems[2][1], 7, 320, 135, true);
381+ verifyItem(vj->m_columnVisibleItems[0][2], 8, 0, 190, true);
382+ verifyItem(vj->m_columnVisibleItems[2][2], 9, 320, 255, true);
383+ verifyItem(vj->m_columnVisibleItems[2][3], 10, 320, 285, true);
384+ verifyItem(vj->m_columnVisibleItems[2][4], 11, 320, 315, true);
385+ verifyItem(vj->m_columnVisibleItems[1][4], 12, 160, 340, true);
386+ verifyItem(vj->m_columnVisibleItems[0][3], 13, 0, 360, true);
387+ verifyItem(vj->m_columnVisibleItems[2][5], 14, 320, 390, true);
388+ verifyItem(vj->m_columnVisibleItems[1][5], 15, 160, 430, false);
389+ verifyItem(vj->m_columnVisibleItems[0][4], 16, 0, 570, false);
390+ verifyItem(vj->m_columnVisibleItems[1][6], 17, 160, 570, false);
391+ QTRY_COMPARE(vj->implicitHeight(), 970. + 1. * 970. / 18.);
392+ }
393+
394+ void testModelAppendRemoveLast()
395+ {
396+ HeightModel *model2 = new HeightModel();
397+ QStringList list2;
398+ list2 << "100" << "50" << "25" << "25" << "50" << "50";
399+ model2->setStringList(list2);
400+ vj->setModel(model2);
401+ delete model;
402+ model = model2;
403+
404+ QTRY_COMPARE(vj->m_columnVisibleItems.count(), 3);
405+ QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 1);
406+ QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 2);
407+ QTRY_COMPARE(vj->m_columnVisibleItems[2].count(), 3);
408+ verifyItem(vj->m_columnVisibleItems[0][0], 0, 0, 0, true);
409+ verifyItem(vj->m_columnVisibleItems[1][0], 1, 160, 0, true);
410+ verifyItem(vj->m_columnVisibleItems[2][0], 2, 320, 0, true);
411+ verifyItem(vj->m_columnVisibleItems[2][1], 3, 320, 35, true);
412+ verifyItem(vj->m_columnVisibleItems[1][1], 4, 160, 60, true);
413+ verifyItem(vj->m_columnVisibleItems[2][2], 5, 320, 70, true);
414+
415+ model2->addString("75");
416+
417+ QTRY_COMPARE(vj->m_columnVisibleItems.count(), 3);
418+ QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 2);
419+ QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 2);
420+ QTRY_COMPARE(vj->m_columnVisibleItems[2].count(), 3);
421+ verifyItem(vj->m_columnVisibleItems[0][0], 0, 0, 0, true);
422+ verifyItem(vj->m_columnVisibleItems[1][0], 1, 160, 0, true);
423+ verifyItem(vj->m_columnVisibleItems[2][0], 2, 320, 0, true);
424+ verifyItem(vj->m_columnVisibleItems[2][1], 3, 320, 35, true);
425+ verifyItem(vj->m_columnVisibleItems[1][1], 4, 160, 60, true);
426+ verifyItem(vj->m_columnVisibleItems[2][2], 5, 320, 70, true);
427+ verifyItem(vj->m_columnVisibleItems[0][1], 6, 0, 110, true);
428+
429+ model2->addString("50");
430+ model2->addString("50");
431+
432+ QTRY_COMPARE(vj->m_columnVisibleItems.count(), 3);
433+ QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 2);
434+ QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 3);
435+ QTRY_COMPARE(vj->m_columnVisibleItems[2].count(), 4);
436+ verifyItem(vj->m_columnVisibleItems[0][0], 0, 0, 0, true);
437+ verifyItem(vj->m_columnVisibleItems[1][0], 1, 160, 0, true);
438+ verifyItem(vj->m_columnVisibleItems[2][0], 2, 320, 0, true);
439+ verifyItem(vj->m_columnVisibleItems[2][1], 3, 320, 35, true);
440+ verifyItem(vj->m_columnVisibleItems[1][1], 4, 160, 60, true);
441+ verifyItem(vj->m_columnVisibleItems[2][2], 5, 320, 70, true);
442+ verifyItem(vj->m_columnVisibleItems[0][1], 6, 0, 110, true);
443+ verifyItem(vj->m_columnVisibleItems[1][2], 7, 160, 120, true);
444+ verifyItem(vj->m_columnVisibleItems[2][3], 8, 320, 130, true);
445+
446+ model2->removeLast();
447+
448+ QTRY_COMPARE(vj->m_columnVisibleItems.count(), 3);
449+ QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 2);
450+ QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 3);
451+ QTRY_COMPARE(vj->m_columnVisibleItems[2].count(), 3);
452+ verifyItem(vj->m_columnVisibleItems[0][0], 0, 0, 0, true);
453+ verifyItem(vj->m_columnVisibleItems[1][0], 1, 160, 0, true);
454+ verifyItem(vj->m_columnVisibleItems[2][0], 2, 320, 0, true);
455+ verifyItem(vj->m_columnVisibleItems[2][1], 3, 320, 35, true);
456+ verifyItem(vj->m_columnVisibleItems[1][1], 4, 160, 60, true);
457+ verifyItem(vj->m_columnVisibleItems[2][2], 5, 320, 70, true);
458+ verifyItem(vj->m_columnVisibleItems[0][1], 6, 0, 110, true);
459+ verifyItem(vj->m_columnVisibleItems[1][2], 7, 160, 120, true);
460+ }
461+
462+private:
463+ QQuickView *view;
464+ VerticalJournal *vj;
465+ HeightModel *model;
466+};
467+
468+QTEST_MAIN(VerticalJournalTest)
469+
470+#include "verticaljournaltest.moc"
tests/plugins/DashViews/verticaljournaltest.qmlnew file+44
@@ -0,0 +1,44 @@
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.1
18+import DashViews 0.1
19+
20+Item {
21+
22+ VerticalJournal {
23+ id: vj
24+ objectName: "vj"
25+ anchors.fill: parent
26+ columnWidth: 150
27+ columnSpacing: 10
28+ rowSpacing: 10
29+
30+ delegate: Rectangle {
31+ property real randomValue: Math.random()
32+ width: 150
33+ color: randomValue < 0.3 ? "green" : randomValue < 0.6 ? "blue" : "red";
34+ height: modelHeight
35+ border.width: 3
36+
37+ Text {
38+ text: index + "\ny: " + parent.y + "\nheight: " + parent.height
39+ x: 10
40+ y: 10
41+ }
42+ }
43+ }
44+}
tests/plugins/DashViews/verticaljournaltry.cppnew file+90
@@ -0,0 +1,90 @@
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+#include <QQuickView>
18+#include <QDebug>
19+#include <QGuiApplication>
20+#include <QQuickView>
21+#include <QtQml/qqml.h>
22+#include <QStringListModel>
23+#include <QQmlContext>
24+#include <QQmlEngine>
25+#include <QGuiApplication>
26+
27+#include "verticaljournal.h"
28+
29+class QHeightModel : public QStringListModel {
30+ Q_OBJECT
31+public:
32+ QHash<int, QByteArray> roleNames() const
33+ {
34+ QHash<int, QByteArray> roles;
35+ roles.insert(Qt::DisplayRole, "modelHeight");
36+ return roles;
37+ }
38+
39+public slots:
40+ void add(int height)
41+ {
42+ if (height <= 0) {
43+ height = 50 + 50. * qrand() / RAND_MAX ;
44+ }
45+ QStringList sl = stringList();
46+ sl << QString::number(height);
47+ setStringList(sl);
48+ }
49+
50+ void remove()
51+ {
52+ QStringList sl = stringList();
53+ if (!sl.isEmpty()) {
54+ sl.removeLast();
55+ setStringList(sl);
56+ }
57+ }
58+};
59+
60+int main(int argc, char *argv[])
61+{
62+ QGuiApplication a(argc, argv);
63+
64+ QQuickView *view = new QQuickView();
65+ view->setResizeMode(QQuickView::SizeRootObjectToView);
66+ view->engine()->addImportPath(BUILT_PLUGINS_DIR);
67+
68+ QHeightModel model;
69+ QStringList heightList;
70+ heightList << "100" << "50" << "125";
71+ model.setStringList(heightList);
72+
73+ QStringListModel listModel;
74+ listModel.setStringList(QStringList() << QString());
75+
76+ view->rootContext()->setContextProperty("listModel", &listModel);
77+ view->rootContext()->setContextProperty("vjModel", &model);
78+
79+ view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/verticaljournaltry.qml"));
80+
81+ view->show();
82+ view->resize(530, 400);
83+
84+ QObject::connect(view->rootObject(), SIGNAL(add(int)), &model, SLOT(add(int)));
85+ QObject::connect(view->rootObject(), SIGNAL(remove()), &model, SLOT(remove()));
86+
87+ return a.exec();
88+}
89+
90+#include "verticaljournaltry.moc"
tests/plugins/DashViews/verticaljournaltry.qmlnew file+100
@@ -0,0 +1,100 @@
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.1
18+import DashViews 0.1
19+
20+Item {
21+ id: root
22+ signal add(int height)
23+ signal remove()
24+
25+ ListViewWithPageHeader {
26+ id: lvwph
27+ model: listModel
28+ height: parent.height
29+ width: parent.width - controls.width
30+
31+ delegate: VerticalJournal {
32+ id: vj
33+ model: vjModel
34+ columnWidth: 100
35+ columnSpacing: 10
36+ rowSpacing: 10
37+ width: parent.width
38+ height: implicitHeight > 100 ? implicitHeight : 100
39+ delegateCreationBegin: lvwph.contentY
40+ delegateCreationEnd: lvwph.contentY + lvwph.height
41+
42+ delegate: Rectangle {
43+ width: 100
44+ color: "red";
45+ height: modelHeight
46+ border.width: 3
47+
48+ Text {
49+ text: index + "\ny: " + parent.y + "\nheight: " + parent.height
50+ x: 10
51+ y: 10
52+ }
53+ }
54+ }
55+ }
56+
57+ Rectangle {
58+ id: controls
59+ height: parent.height
60+ width: 100
61+ anchors.right: parent.right
62+ color: "gray"
63+ opacity: 0.4
64+
65+ Rectangle {
66+ id: addButton
67+ height: 50
68+ width: parent.width
69+ color: "blue"
70+ Text {
71+ text: "Add"
72+ anchors.centerIn: parent
73+ }
74+ MouseArea {
75+ anchors.fill: parent
76+ onClicked: root.add(addField.text)
77+ }
78+ }
79+ TextInput {
80+ id: addField
81+ anchors.top: addButton.bottom
82+ height: 30
83+ width: parent.width
84+ }
85+ Rectangle {
86+ anchors.top: addField.bottom
87+ height: 50
88+ width: parent.width
89+ color: "red"
90+ Text {
91+ text: "Remove"
92+ anchors.centerIn: parent
93+ }
94+ MouseArea {
95+ anchors.fill: parent
96+ onClicked: root.remove()
97+ }
98+ }
99+ }
100+}
tests/plugins/LightDM/CMakeLists.txtnew file+24
@@ -0,0 +1,24 @@
1+add_executable(test-lightdm-dbus
2+ dbus.cpp
3+ ${CMAKE_SOURCE_DIR}/plugins/LightDM/Greeter.cpp
4+ )
5+qt5_use_modules(test-lightdm-dbus Core DBus Quick Test)
6+
7+include_directories(
8+ ${CMAKE_CURRENT_BINARY_DIR}
9+ ${CMAKE_SOURCE_DIR}/plugins/LightDM
10+ ${CMAKE_SOURCE_DIR}/tests/mocks/LightDM
11+ ${LIBLIGHTDM_INCLUDE_DIRS}
12+ )
13+
14+target_link_libraries(test-lightdm-dbus
15+ -L${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full
16+ -llightdm-qt5-2
17+ )
18+
19+add_definitions(-DCURRENT_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}")
20+
21+add_custom_target(testLightDMDBus dbus-launch env QML2_IMPORT_PATH=${CMAKE_BINARY_DIR}/tests/mocks LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full ${CMAKE_CURRENT_BINARY_DIR}/test-lightdm-dbus)
22+add_dependencies(testLightDMDBus test-lightdm-dbus)
23+
24+add_dependencies(qmluitests testLightDMDBus)
tests/plugins/LightDM/dbus.cppnew file+166
@@ -0,0 +1,166 @@
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+#include "Greeter.h"
18+
19+#include <QDBusInterface>
20+#include <QDBusReply>
21+#include <QSignalSpy>
22+#include <QQuickItem>
23+#include <QQuickView>
24+#include <QtTestGui>
25+
26+class GreeterDBusTest : public QObject
27+{
28+ Q_OBJECT
29+
30+Q_SIGNALS:
31+ void PropertiesChangedRelay(const QString &interface, const QVariantMap &changed, const QStringList &invalidated);
32+
33+private Q_SLOTS:
34+
35+ void initTestCase()
36+ {
37+ // Qt doesn't like us connecting to PropertiesChanged using normal
38+ // SIGNAL method, because QtDBus doesn't know about PropertiesChanged.
39+ // So we connect the hard way for the benefit of any tests that want
40+ // to watch.
41+ QDBusConnection::sessionBus().connect(
42+ "com.canonical.UnityGreeter",
43+ "/list",
44+ "org.freedesktop.DBus.Properties",
45+ "PropertiesChanged",
46+ this,
47+ SIGNAL(PropertiesChangedRelay(const QString&, const QVariantMap&, const QStringList&)));
48+ }
49+
50+ void init()
51+ {
52+ view = new QQuickView();
53+ view->setSource(QUrl::fromLocalFile(CURRENT_SOURCE_DIR "/greeter.qml"));
54+ greeter = dynamic_cast<Greeter*>(view->rootObject()->property("greeter").value<QObject*>());
55+ QVERIFY(greeter);
56+ QVERIFY(greeter->authenticationUser() == "");
57+ view->show();
58+ QTest::qWaitForWindowExposed(view);
59+
60+ dbusList = new QDBusInterface("com.canonical.UnityGreeter",
61+ "/list",
62+ "com.canonical.UnityGreeter.List",
63+ QDBusConnection::sessionBus(), view);
64+ QVERIFY(dbusList->isValid());
65+ }
66+
67+ void cleanup()
68+ {
69+ delete view;
70+ }
71+
72+ void testGetActiveEntry()
73+ {
74+ greeter->authenticate("has-password");
75+
76+ QDBusReply<QString> reply = dbusList->call("GetActiveEntry");
77+ QVERIFY(reply.isValid());
78+ QVERIFY(reply.value() == "has-password");
79+ }
80+
81+ void testSetActiveEntry()
82+ {
83+ QSignalSpy spy(greeter, SIGNAL(requestAuthenticationUser(QString)));
84+ QDBusReply<void> reply = dbusList->call("SetActiveEntry", "has-password");
85+ QVERIFY(reply.isValid());
86+ spy.wait();
87+
88+ QCOMPARE(spy.count(), 1);
89+ QList<QVariant> arguments = spy.takeFirst();
90+ QVERIFY(arguments.at(0).toString() == "has-password");
91+ }
92+
93+ void testEntrySelectedSignal()
94+ {
95+ QSignalSpy spy(dbusList, SIGNAL(EntrySelected(QString)));
96+ greeter->authenticate("has-password");
97+ spy.wait();
98+
99+ QCOMPARE(spy.count(), 1);
100+ QList<QVariant> arguments = spy.takeFirst();
101+ QVERIFY(arguments.at(0).toString() == "has-password");
102+ }
103+
104+ void testActiveEntryGet()
105+ {
106+ greeter->authenticate("has-password");
107+ QVERIFY(dbusList->property("ActiveEntry").toString() == "has-password");
108+ }
109+
110+ void testActiveEntrySet()
111+ {
112+ QSignalSpy spy(greeter, SIGNAL(requestAuthenticationUser(QString)));
113+ QVERIFY(dbusList->setProperty("ActiveEntry", "has-password"));
114+ spy.wait();
115+
116+ QCOMPARE(spy.count(), 1);
117+ QList<QVariant> arguments = spy.takeFirst();
118+ QVERIFY(arguments.at(0).toString() == "has-password");
119+ }
120+
121+ void testActiveEntryChanged()
122+ {
123+ QSignalSpy spy(this, SIGNAL(PropertiesChangedRelay(QString, QVariantMap, QStringList)));
124+ greeter->authenticate("has-password");
125+ spy.wait();
126+
127+ QCOMPARE(spy.count(), 1);
128+ QList<QVariant> arguments = spy.takeFirst();
129+ QVERIFY(arguments.at(0).toString() == "com.canonical.UnityGreeter.List");
130+ QVERIFY(arguments.at(1).toMap().contains("ActiveEntry"));
131+ QVERIFY(arguments.at(1).toMap()["ActiveEntry"] == "has-password");
132+ }
133+
134+ void testEntryIsLockedGet()
135+ {
136+ QVERIFY(dbusList->property("EntryIsLocked").toBool());
137+
138+ greeter->authenticate("no-password");
139+ QVERIFY(!dbusList->property("EntryIsLocked").toBool());
140+
141+ greeter->authenticate("has-password");
142+ QVERIFY(dbusList->property("EntryIsLocked").toBool());
143+ }
144+
145+ void testEntryIsLockedChanged()
146+ {
147+ QSignalSpy spy(this, SIGNAL(PropertiesChangedRelay(QString, QVariantMap, QStringList)));
148+ greeter->authenticate("no-password");
149+ spy.wait();
150+
151+ QCOMPARE(spy.count(), 2); // once for locked, once for user; first will be locked mode
152+ QList<QVariant> arguments = spy.takeFirst();
153+ QVERIFY(arguments.at(0).toString() == "com.canonical.UnityGreeter.List");
154+ QVERIFY(arguments.at(1).toMap().contains("EntryIsLocked"));
155+ QVERIFY(arguments.at(1).toMap()["EntryIsLocked"] == false);
156+ }
157+
158+private:
159+ QQuickView *view;
160+ Greeter *greeter;
161+ QDBusInterface *dbusList;
162+};
163+
164+QTEST_MAIN(GreeterDBusTest)
165+
166+#include "dbus.moc"
Panel/Indicators/DefaultIndicatorPage.qml → tests/plugins/LightDM/greeter.qmlrenamed+6−9
@@ -2,24 +2,21 @@
2 * Copyright 2013 Canonical Ltd.
2 * Copyright 2013 Canonical Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
5+ * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; version 3.
6 * the Free Software Foundation; version 3.
7 *
7 *
8 * This program is distributed in the hope that it will be useful,
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
11+ * GNU General Public License for more details.
12 *
12 *
13− * You should have received a copy of the GNU Lesser General Public License
13+ * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Nick Dedekind <nick.dedekind@canonical.com>
18 */
15 */
19
16
20import QtQuick 2.0
17import QtQuick 2.0
21−import Unity.Indicators 0.1 as Indicators
18+import LightDM 0.1 as LightDM
22
19
23−Indicators.IndicatorPage {
20+Item {
24− anchors.fill: parent
21+ property var greeter: LightDM.Greeter
25}
22}
tests/plugins/Ubuntu/Gestures/CMakeLists.txt+2
@@ -3,6 +3,7 @@ include(QmlTest)
3include_directories(
3include_directories(
4 ${CMAKE_SOURCE_DIR}/plugins/Ubuntu/Gestures
4 ${CMAKE_SOURCE_DIR}/plugins/Ubuntu/Gestures
5 ${CMAKE_CURRENT_BINARY_DIR}
5 ${CMAKE_CURRENT_BINARY_DIR}
6+ ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
6 )
7 )
7
8
8file(GLOB qmlFiles *.qml)
9file(GLOB qmlFiles *.qml)
@@ -45,5 +46,6 @@ macro(add_gesture_test CLASSNAME)
45endmacro(add_gesture_test)
46endmacro(add_gesture_test)
46
47
47add_gesture_ui_test(DirectionalDragArea)
48add_gesture_ui_test(DirectionalDragArea)
49+add_gesture_ui_test(PressedOutsideNotifier)
48add_gesture_test(Damper)
50add_gesture_test(Damper)
49add_gesture_test(AxisVelocityCalculator)
51add_gesture_test(AxisVelocityCalculator)
tests/plugins/Ubuntu/Gestures/tst_PressedOutsideNotifier.cppnew file+150
@@ -0,0 +1,150 @@
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+#include "GestureTest.h"
18+
19+#include <PressedOutsideNotifier.h>
20+
21+#include <QQuickItem>
22+#include <QQuickView>
23+#include <QtTest>
24+
25+class tst_PressedOutsideNotifier: public GestureTest
26+{
27+ Q_OBJECT
28+public:
29+ tst_PressedOutsideNotifier();
30+private Q_SLOTS:
31+ void init(); // called right before each and every test function is executed
32+
33+ void touchOutsideAreaTriggersSignal();
34+ void touchInsideAreaHasNoEffect();
35+ void mousePressOutsideAreaTriggersSignal();
36+ void mousePresssInsideAreaHasNoEffect();
37+ void nothingHappensWhileDisabled();
38+
39+private:
40+ QQuickItem *m_blueRect;
41+ PressedOutsideNotifier *m_notifier;
42+};
43+
44+tst_PressedOutsideNotifier::tst_PressedOutsideNotifier()
45+ : GestureTest(QStringLiteral("tst_PressedOutsideNotifier.qml"))
46+{
47+}
48+
49+void tst_PressedOutsideNotifier::init()
50+{
51+ GestureTest::init();
52+
53+ m_blueRect = m_view->rootObject()->findChild<QQuickItem*>("blueRect");
54+ Q_ASSERT(m_blueRect != nullptr);
55+
56+ m_notifier =
57+ m_view->rootObject()->findChild<PressedOutsideNotifier*>("pressedOutsideNotifier");
58+ Q_ASSERT(m_notifier != nullptr);
59+}
60+
61+void tst_PressedOutsideNotifier::touchOutsideAreaTriggersSignal()
62+{
63+ // half-way towards the top-left corner of the blueRect.
64+ // Therefore, still outside it.
65+ QPoint touch0 = QPoint(m_blueRect->x() * 0.5, m_blueRect->y() * 0.5);
66+
67+ QSignalSpy pressedOutsideSpy(m_notifier, SIGNAL(pressedOutside()));
68+
69+ QTest::touchEvent(m_view, m_device)
70+ .press(0, touch0);
71+
72+ qApp->processEvents();
73+
74+ QCOMPARE(pressedOutsideSpy.count(), 1);
75+
76+ QTest::touchEvent(m_view, m_device)
77+ .release(0, touch0);
78+}
79+
80+void tst_PressedOutsideNotifier::touchInsideAreaHasNoEffect()
81+{
82+ QPoint touch0 = QPoint(m_blueRect->x() + m_blueRect->width()*0.5,
83+ m_blueRect->y() + m_blueRect->height()*0.5);
84+
85+ QSignalSpy pressedOutsideSpy(m_notifier, SIGNAL(pressedOutside()));
86+
87+ QTest::touchEvent(m_view, m_device)
88+ .press(0, touch0);
89+
90+ qApp->processEvents();
91+
92+ QCOMPARE(pressedOutsideSpy.count(), 0);
93+
94+ QTest::touchEvent(m_view, m_device)
95+ .release(0, touch0);
96+}
97+
98+void tst_PressedOutsideNotifier::mousePressOutsideAreaTriggersSignal()
99+{
100+ QPoint mousePos= QPoint(m_blueRect->x() * 0.5, m_blueRect->y() * 0.5);
101+
102+ QSignalSpy pressedOutsideSpy(m_notifier, SIGNAL(pressedOutside()));
103+
104+ QTest::mousePress(m_view, Qt::LeftButton, 0 /*modifiers*/, mousePos);
105+
106+ qApp->processEvents();
107+
108+ QCOMPARE(pressedOutsideSpy.count(), 1);
109+
110+ QTest::mouseRelease(m_view, Qt::LeftButton, 0 /*modifiers*/, mousePos);
111+}
112+
113+void tst_PressedOutsideNotifier::mousePresssInsideAreaHasNoEffect()
114+{
115+ QPoint mousePos = QPoint(m_blueRect->x() + m_blueRect->width()*0.5,
116+ m_blueRect->y() + m_blueRect->height()*0.5);
117+
118+ QSignalSpy pressedOutsideSpy(m_notifier, SIGNAL(pressedOutside()));
119+
120+ QTest::mousePress(m_view, Qt::LeftButton, 0 /*modifiers*/, mousePos);
121+
122+ qApp->processEvents();
123+
124+ QCOMPARE(pressedOutsideSpy.count(), 0);
125+
126+ QTest::mouseRelease(m_view, Qt::LeftButton, 0 /*modifiers*/, mousePos);
127+}
128+
129+void tst_PressedOutsideNotifier::nothingHappensWhileDisabled()
130+{
131+ QPoint touch0 = QPoint(m_blueRect->x() * 0.5, m_blueRect->y() * 0.5);
132+
133+ QSignalSpy pressedOutsideSpy(m_notifier, SIGNAL(pressedOutside()));
134+
135+ m_notifier->setEnabled(false);
136+
137+ QTest::touchEvent(m_view, m_device)
138+ .press(0, touch0);
139+
140+ qApp->processEvents();
141+
142+ QCOMPARE(pressedOutsideSpy.count(), 0);
143+
144+ QTest::touchEvent(m_view, m_device)
145+ .release(0, touch0);
146+}
147+
148+QTEST_MAIN(tst_PressedOutsideNotifier)
149+
150+#include "tst_PressedOutsideNotifier.moc"
tests/plugins/Ubuntu/Gestures/tst_PressedOutsideNotifier.qmlnew file+62
@@ -0,0 +1,62 @@
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 Ubuntu.Gestures 0.1
20+
21+/*
22+ NB: If you change positions or sizes here make sure
23+ tst_PressedOutsideNotifier.cpp is updated accordingly
24+ */
25+
26+Rectangle {
27+ width: units.gu(60)
28+ height: units.gu(60)
29+ color: "white"
30+
31+ Rectangle {
32+ id: blueRect
33+ objectName: "blueRect"
34+ color: "blue"
35+ x: units.gu(20)
36+ y: units.gu(20)
37+ width: units.gu(20)
38+ height: units.gu(20)
39+
40+ Timer {
41+ id: resetColorTimer
42+ interval: 300
43+ repeat: false
44+ onTriggered: {
45+ blueRect.color = "blue";
46+ }
47+ }
48+
49+ function blinkRed() {
50+ blueRect.color = "red";
51+ resetColorTimer.start();
52+ }
53+
54+ PressedOutsideNotifier {
55+ objectName: "pressedOutsideNotifier"
56+ anchors.fill: parent
57+ onPressedOutside: {
58+ blueRect.blinkRed();
59+ }
60+ }
61+ }
62+}
tests/plugins/Unity/Indicators/CMakeLists.txt−1
@@ -40,4 +40,3 @@ indicator_test(indicatorsmodeltest ADDITIONAL_LIBS IndicatorsQml)
40indicator_test(menucontentactivatortest ADDITIONAL_CPPS ${INDICATORS_DIR}/menucontentactivator.cpp)
40indicator_test(menucontentactivatortest ADDITIONAL_CPPS ${INDICATORS_DIR}/menucontentactivator.cpp)
41indicator_test(unitymenumodelstacktest ADDITIONAL_CPPS ${TEST_DIR}/mocks/QMenuModel/unitymenumodel.cpp ${INDICATORS_DIR}/unitymenumodelstack.cpp)
41indicator_test(unitymenumodelstacktest ADDITIONAL_CPPS ${TEST_DIR}/mocks/QMenuModel/unitymenumodel.cpp ${INDICATORS_DIR}/unitymenumodelstack.cpp)
42indicator_test(rootactionstatetest ADDITIONAL_LIBS IndicatorsQml)
42indicator_test(rootactionstatetest ADDITIONAL_LIBS IndicatorsQml)
43−indicator_test(timeformattertest ADDITIONAL_LIBS IndicatorsQml)
tests/plugins/Unity/Indicators/indicatorsmanagertest.cpp+2−1
@@ -18,7 +18,8 @@
18 */
18 */
19
19
20#include "indicatorsmanager.h"
20#include "indicatorsmanager.h"
21+
21−#include "paths.h"
22+#include <paths.h>
22
23
23#include <QtTest>
24#include <QtTest>
24#include <QDebug>
25#include <QDebug>
tests/plugins/Unity/Indicators/indicatorsmodeltest.cpp+2−1
@@ -19,7 +19,8 @@
19
19
20#include "indicatorsmodel.h"
20#include "indicatorsmodel.h"
21#include "indicators.h"
21#include "indicators.h"
22+
22−#include "paths.h"
23+#include <paths.h>
23
24
24#include <QtTest>
25#include <QtTest>
25#include <QDebug>
26#include <QDebug>
tests/plugins/Unity/Indicators/menucontentactivatortest.cpp−1
@@ -18,7 +18,6 @@
18 */
18 */
19
19
20#include "menucontentactivator.h"
20#include "menucontentactivator.h"
21−#include "paths.h"
22
21
23#include <QtTest>
22#include <QtTest>
24#include <QDebug>
23#include <QDebug>
tests/plugins/Unity/Indicators/unitymenumodelstacktest.cpp−1
@@ -18,7 +18,6 @@
18 */
18 */
19
19
20#include "indicatorsmanager.h"
20#include "indicatorsmanager.h"
21−#include "paths.h"
22#include "unitymenumodelstack.h"
21#include "unitymenumodelstack.h"
23
22
24#include <QtTest>
23#include <QtTest>
tests/plugins/Utils/CMakeLists.txt+1
@@ -24,4 +24,5 @@ endmacro(run_tests)
24run_tests(
24run_tests(
25 qlimitproxymodeltest
25 qlimitproxymodeltest
26 qsortfilterproxymodeltest
26 qsortfilterproxymodeltest
27+ timeformattertest
27 )
28 )
tests/plugins/Unity/Indicators/timeformattertest.cpp → tests/plugins/Utils/timeformattertest.cpprenamed+13
@@ -48,6 +48,19 @@ private Q_SLOTS:
48
48
49 QCOMPARE(formatter.timeString(), time.toString(format));
49 QCOMPARE(formatter.timeString(), time.toString(format));
50 }
50 }
51+
52+ void testFormatStrF()
53+ {
54+ const QString format = "%d-%m-%Y %I:%M%p";
55+
56+ QDateTime time = QDateTime::currentDateTime();
57+
58+ GDateTimeFormatter formatter;
59+ formatter.setTime(time.toMSecsSinceEpoch() / 1000); // strftime in seconds since epoc
60+ formatter.setFormat(format);
61+
62+ QCOMPARE(formatter.timeString(), time.toString("dd-MM-yyyy hh:mmAP"));
63+ }
51};
64};
52
65
53QTEST_GUILESS_MAIN(TimeFormatterTest)
66QTEST_GUILESS_MAIN(TimeFormatterTest)
tests/qmltests/CMakeLists.txt+11−3
@@ -37,18 +37,22 @@ add_qml_test(Components Stage IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS}
37 ${CMAKE_BINARY_DIR}/tests/mocks
37 ${CMAKE_BINARY_DIR}/tests/mocks
38 ${CMAKE_BINARY_DIR}/plugins)
38 ${CMAKE_BINARY_DIR}/plugins)
39add_qml_test(Components Tile)
39add_qml_test(Components Tile)
40−add_qml_test(Components PageHeader)
40+add_qml_test(Components PageHeaderLabel)
41add_qml_test(Dash Dash IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
41add_qml_test(Dash Dash IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
42−add_qml_test(Dash DashBar IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${CMAKE_CURRENT_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
43add_qml_test(Dash DashContent IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
42add_qml_test(Dash DashContent IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
44add_qml_test(Dash DashPreview)
43add_qml_test(Dash DashPreview)
45add_qml_test(Dash GenericPreview)
44add_qml_test(Dash GenericPreview)
45+add_qml_test(Dash Card)
46+add_qml_test(Dash CardHeader)
46add_qml_test(Dash GenericScopeView IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
47add_qml_test(Dash GenericScopeView IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
47add_qml_test(Dash FilterGrids IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins ${CMAKE_CURRENT_SOURCE_DIR}/plugins
48add_qml_test(Dash FilterGrids IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins ${CMAKE_CURRENT_SOURCE_DIR}/plugins
48 ${CMAKE_BINARY_DIR}/tests/mocks)
49 ${CMAKE_BINARY_DIR}/tests/mocks)
49−add_qml_test(Dash/Apps RunningApplicationsGrid IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
50+add_qml_test(Dash/Apps RunningApplicationsGrid IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS}
51+ ${CMAKE_BINARY_DIR}/tests/mocks
52+ ${CMAKE_BINARY_DIR}/plugins)
50add_qml_test(Dash/Apps AppPreview IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
53add_qml_test(Dash/Apps AppPreview IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
51add_qml_test(Dash/Movie MoviePreview IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
54add_qml_test(Dash/Movie MoviePreview IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
55+add_qml_test(Dash/Music MusicPreview IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
52add_qml_test(Greeter Lockscreen IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS}
56add_qml_test(Greeter Lockscreen IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS}
53 PROPERTIES ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
57 PROPERTIES ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
54add_qml_test(Greeter Tablet IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS}
58add_qml_test(Greeter Tablet IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS}
@@ -70,6 +74,10 @@ add_qml_test(Panel Panel IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFA
70add_qml_test(Panel SearchIndicator)
74add_qml_test(Panel SearchIndicator)
71add_qml_test(Panel/Indicators DefaultIndicatorWidget IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS}
75add_qml_test(Panel/Indicators DefaultIndicatorWidget IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS}
72 ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
76 ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
77+add_qml_test(Panel/Indicators DefaultIndicatorPage IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS}
78+ ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
79+add_qml_test(Panel/Indicators MenuItemFactory IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
80+add_qml_test(Panel/Indicators MessageMenuItemFactory IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
73add_qml_test(SideStage SideStage IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS}
81add_qml_test(SideStage SideStage IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS}
74 ${CMAKE_BINARY_DIR}/tests/mocks
82 ${CMAKE_BINARY_DIR}/tests/mocks
75 ${CMAKE_BINARY_DIR}/plugins)
83 ${CMAKE_BINARY_DIR}/plugins)
tests/qmltests/Components/CMakeLists.txt+1
@@ -3,6 +3,7 @@
3include_directories(
3include_directories(
4 ${CMAKE_SOURCE_DIR}/plugins/Ubuntu/Gestures
4 ${CMAKE_SOURCE_DIR}/plugins/Ubuntu/Gestures
5 ${CMAKE_CURRENT_BINARY_DIR}
5 ${CMAKE_CURRENT_BINARY_DIR}
6+ ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
6 )
7 )
7
8
8set(testCommand
9set(testCommand
tests/qmltests/Components/RevealingRectangle.qml+1−1
@@ -16,7 +16,7 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19−import "../../../Components"
19+import "../../../qml/Components"
20
20
21Item {
21Item {
22 id: revealingRectangle
22 id: revealingRectangle
tests/qmltests/Components/tst_AnimationControllerWithSignals.qml+1−1
@@ -16,7 +16,7 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import QtTest 1.0
18import QtTest 1.0
19−import "../../../Components"
19+import "../../../qml/Components"
20
20
21TestCase {
21TestCase {
22 id: testCase
22 id: testCase
tests/qmltests/Components/tst_Carousel.qml+1−1
@@ -16,7 +16,7 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import QtTest 1.0
18import QtTest 1.0
19−import "../../../Components/carousel.js" as Carousel
19+import "../../../qml/Components/carousel.js" as Carousel
20
20
21TestCase {
21TestCase {
22 id: root
22 id: root
tests/qmltests/Components/tst_DragHandle.qml+1−1
@@ -15,7 +15,7 @@
15 */
15 */
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18−import "../../../Components"
18+import "../../../qml/Components"
19import "tst_DragHandle"
19import "tst_DragHandle"
20import Ubuntu.Components 0.1
20import Ubuntu.Components 0.1
21import Ubuntu.Gestures 0.1
21import Ubuntu.Gestures 0.1
tests/qmltests/Components/tst_DragHandle/HorizontalShowable.qml+1−1
@@ -15,7 +15,7 @@
15 */
15 */
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18−import "../../../../Components"
18+import "../../../../qml/Components"
19import Ubuntu.Components 0.1
19import Ubuntu.Components 0.1
20import Ubuntu.Gestures 0.1
20import Ubuntu.Gestures 0.1
21
21
tests/qmltests/Components/tst_DragHandle/VerticalShowable.qml+1−1
@@ -15,7 +15,7 @@
15 */
15 */
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18−import "../../../../Components"
18+import "../../../../qml/Components"
19import Ubuntu.Components 0.1
19import Ubuntu.Components 0.1
20import Ubuntu.Gestures 0.1
20import Ubuntu.Gestures 0.1
21
21
tests/qmltests/Components/tst_DraggingArea.qml+1−1
@@ -16,7 +16,7 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import QtTest 1.0
18import QtTest 1.0
19−import "../../../Components"
19+import "../../../qml/Components"
20
20
21/*
21/*
22 There will be a green rectangle in the center of the
22 There will be a green rectangle in the center of the
tests/qmltests/Components/tst_EdgeDemoOverlay.qml+1−1
@@ -17,7 +17,7 @@
17import QtQuick 2.0
17import QtQuick 2.0
18import QtTest 1.0
18import QtTest 1.0
19import Unity.Test 0.1 as UT
19import Unity.Test 0.1 as UT
20−import "../../../Components"
20+import "../../../qml/Components"
21
21
22Item {
22Item {
23 id: root
23 id: root
tests/qmltests/Components/tst_FilterGrid.qml+1−1
@@ -16,7 +16,7 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import QtTest 1.0
18import QtTest 1.0
19−import "../../../Components"
19+import "../../../qml/Components"
20import Ubuntu.Components.ListItems 0.1 as ListItem
20import Ubuntu.Components.ListItems 0.1 as ListItem
21import Ubuntu.Components 0.1
21import Ubuntu.Components 0.1
22import Unity.Test 0.1 as UT
22import Unity.Test 0.1 as UT
tests/qmltests/Components/tst_LazyImage.qml+1−1
@@ -16,7 +16,7 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import QtTest 1.0
18import QtTest 1.0
19−import "../../../Components"
19+import "../../../qml/Components"
20import Ubuntu.Components 0.1
20import Ubuntu.Components 0.1
21import Unity.Test 0.1 as UT
21import Unity.Test 0.1 as UT
22import "tst_LazyImage"
22import "tst_LazyImage"
tests/qmltests/Components/tst_LazyImage/ImageControls.qml+1−1
@@ -16,7 +16,7 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19−import "../../../../Components"
19+import "../../../../qml/Components"
20
20
21Row {
21Row {
22 property LazyImage image
22 property LazyImage image
tests/qmltests/Components/tst_OpenEffect.qml+1−1
@@ -16,7 +16,7 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import QtTest 1.0
18import QtTest 1.0
19−import "../../../Components"
19+import "../../../qml/Components"
20
20
21TestCase {
21TestCase {
22 name: "OpenEffectTest"
22 name: "OpenEffectTest"
tests/qmltests/Components/tst_PageHeader.qml → tests/qmltests/Components/tst_PageHeaderLabel.qmlrenamed+3−3
@@ -17,7 +17,7 @@
17import QtQuick 2.0
17import QtQuick 2.0
18import QtTest 1.0
18import QtTest 1.0
19import ".."
19import ".."
20−import "../../../Components"
20+import "../../../qml/Components"
21import Ubuntu.Components 0.1
21import Ubuntu.Components 0.1
22import Unity 0.1
22import Unity 0.1
23import Unity.Test 0.1 as UT
23import Unity.Test 0.1 as UT
@@ -31,7 +31,7 @@ Item {
31 }
31 }
32
32
33 UT.UnityTestCase {
33 UT.UnityTestCase {
34− name: "PageHeaderTest"
34+ name: "PageHeaderLabelTest"
35 when: windowShown
35 when: windowShown
36
36
37 property alias searchEnabled : pageHeader.searchEntryEnabled
37 property alias searchEnabled : pageHeader.searchEntryEnabled
@@ -204,7 +204,7 @@ Item {
204 anchors.fill: parent
204 anchors.fill: parent
205 spacing: units.gu(1)
205 spacing: units.gu(1)
206
206
207− PageHeader {
207+ PageHeaderLabel {
208 id: pageHeader
208 id: pageHeader
209 anchors {
209 anchors {
210 left: parent.left
210 left: parent.left
tests/qmltests/Components/tst_RatingStars.qml+1−1
@@ -16,7 +16,7 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import QtTest 1.0
18import QtTest 1.0
19−import "../../../Components"
19+import "../../../qml/Components"
20
20
21TestCase {
21TestCase {
22 name: "RatingStars"
22 name: "RatingStars"
tests/qmltests/Components/tst_ResponsiveFlowView.qml+1−1
@@ -17,7 +17,7 @@
17import QtQuick 2.0
17import QtQuick 2.0
18import QtTest 1.0
18import QtTest 1.0
19import ".."
19import ".."
20−import "../../../Components"
20+import "../../../qml/Components"
21import Ubuntu.Components.ListItems 0.1 as ListItem
21import Ubuntu.Components.ListItems 0.1 as ListItem
22import Ubuntu.Components 0.1
22import Ubuntu.Components 0.1
23import Unity.Test 0.1 as UT
23import Unity.Test 0.1 as UT
tests/qmltests/Components/tst_ResponsiveGridView.qml+1−1
@@ -17,7 +17,7 @@
17import QtQuick 2.0
17import QtQuick 2.0
18import QtTest 1.0
18import QtTest 1.0
19import ".."
19import ".."
20−import "../../../Components"
20+import "../../../qml/Components"
21import Ubuntu.Components.ListItems 0.1 as ListItem
21import Ubuntu.Components.ListItems 0.1 as ListItem
22import Ubuntu.Components 0.1
22import Ubuntu.Components 0.1
23import Unity.Test 0.1 as UT
23import Unity.Test 0.1 as UT
tests/qmltests/Components/tst_Showable.qml+1−1
@@ -19,7 +19,7 @@ import QtTest 1.0
19import Ubuntu.Components 0.1
19import Ubuntu.Components 0.1
20import Unity.Test 0.1 as UT
20import Unity.Test 0.1 as UT
21import ".."
21import ".."
22−import "../../../Components"
22+import "../../../qml/Components"
23
23
24/*
24/*
25 There will be 3 stacked rectangles, red, green & blue. Initially they
25 There will be 3 stacked rectangles, red, green & blue. Initially they
tests/qmltests/Components/tst_Stage.qml+1−1
@@ -17,7 +17,7 @@
17import QtQuick 2.0
17import QtQuick 2.0
18import QtTest 1.0
18import QtTest 1.0
19import ".."
19import ".."
20−import "../../../Components"
20+import "../../../qml/Components"
21import Unity.Application 0.1
21import Unity.Application 0.1
22import Ubuntu.Components 0.1
22import Ubuntu.Components 0.1
23import Unity.Test 0.1 as UT
23import Unity.Test 0.1 as UT
tests/qmltests/Components/tst_Tile.qml+1−1
@@ -17,7 +17,7 @@
17import QtQuick 2.0
17import QtQuick 2.0
18import QtTest 1.0
18import QtTest 1.0
19import ".."
19import ".."
20−import "../../../Components"
20+import "../../../qml/Components"
21import Ubuntu.Components 0.1
21import Ubuntu.Components 0.1
22import Unity.Test 0.1 as UT
22import Unity.Test 0.1 as UT
23
23
tests/qmltests/Dash/Apps/tst_AppPreview.qml+1−1
@@ -17,7 +17,7 @@
17import QtQuick 2.0
17import QtQuick 2.0
18import QtTest 1.0
18import QtTest 1.0
19import Ubuntu.Components 0.1
19import Ubuntu.Components 0.1
20−import "../../../../Dash/Apps"
20+import "../../../../qml/Dash/Apps"
21import Unity.Test 0.1 as UT
21import Unity.Test 0.1 as UT
22
22
23Item {
23Item {
tests/qmltests/Dash/Apps/tst_RunningApplicationsGrid.qml+21−1
@@ -16,7 +16,7 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import QtTest 1.0
18import QtTest 1.0
19−import "../../../../Dash/Apps"
19+import "../../../../qml/Dash/Apps"
20import Unity.Test 0.1 as UT
20import Unity.Test 0.1 as UT
21
21
22Item {
22Item {
@@ -239,5 +239,25 @@ Item {
239 return findChild(runningApplicationsGrid, "runningAppTile Calendar")
239 return findChild(runningApplicationsGrid, "runningAppTile Calendar")
240 != undefined
240 != undefined
241 }
241 }
242+
243+ // While in termination mode, if you click outside any of the tiles, the
244+ // termination mode is disabled (i.e. we switch back to activation mode).
245+ function test_clickOutsideTilesDisablesTerminationMode() {
246+ runningApplicationsGrid.terminationModeEnabled = true
247+
248+ var calendarTile = findChild(runningApplicationsGrid, "runningAppTile Calendar")
249+ verify(calendarTile != undefined)
250+
251+ verify(runningApplicationsGrid.terminationModeEnabled);
252+
253+ // Click on the bottom right corner of the grid, where there's no
254+ // RunningApplicationTile lying around
255+ mouseClick(runningApplicationsGrid,
256+ runningApplicationsGrid.width - 1, runningApplicationsGrid.height - 1);
257+
258+ wait(0) // spin event loop to ensure that any pending signal emission went through
259+
260+ verify(!runningApplicationsGrid.terminationModeEnabled);
261+ }
242 }
262 }
243}
263}
tests/qmltests/Dash/CardHelpers.jsnew file+75
@@ -0,0 +1,75 @@
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+.pragma library
18+
19+var components = ["title", "art", "subtitle", "mascot", "emblem", "old-price", "price", "alt-price", "rating", "alt-rating", "summary"]
20+
21+function tryParse(json, errorLabel) {
22+ var o = undefined;
23+ if (errorLabel !== undefined) {
24+ errorLabel.text = "";
25+ }
26+ try {
27+ o = JSON.parse(json)
28+ } catch(err) {
29+ if (errorLabel !== undefined) {
30+ errorLabel.text = err + "";
31+ } else {
32+ console.debug(err);
33+ }
34+ }
35+ return o;
36+}
37+
38+function mapData(json, layout, errorLabel) {
39+ var o = tryParse(json, errorLabel);
40+ var d = undefined;
41+
42+ if (o !== undefined) {
43+ d = Object();
44+ for (var k in components) {
45+ try {
46+ if (typeof layout[components[k]] == "object") {
47+ d[components[k]] = o[layout[components[k]]['field']];
48+ } else {
49+ d[components[k]] = o[layout[components[k]]];
50+ }
51+ } catch(err) {
52+ d[components[k]] = undefined;
53+ }
54+ }
55+ }
56+ return d;
57+}
58+
59+function update(object, overrides) {
60+ for (var k in overrides) {
61+ if (typeof object[k] == "string" && typeof overrides[k] == "object") {
62+ if (!overrides[k].hasOwnProperty('field')) overrides[k]['field'] = object[k];
63+ }
64+ if (object[k] === null) {
65+ object[k] = overrides[k];
66+ } else if (typeof object[k] == "object" && typeof overrides[k] == "string") {
67+ object[k]['field'] = overrides[k];
68+ } else if (typeof object[k] == "object") {
69+ update(object[k], overrides[k]);
70+ } else {
71+ object[k] = overrides[k];
72+ }
73+ }
74+ return object;
75+}
tests/qmltests/Dash/Movie/tst_MoviePreview.qml+1−1
@@ -16,7 +16,7 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import QtTest 1.0
18import QtTest 1.0
19−import "../../../../Dash/Movie"
19+import "../../../../qml/Dash/Movie"
20import Unity.Test 0.1 as UT
20import Unity.Test 0.1 as UT
21
21
22Item {
22Item {
tests/qmltests/Dash/Music/tst_MusicPreview.qmlnew file+174
@@ -0,0 +1,174 @@
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 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 QtTest 1.0
19+import "../../../../qml/Dash/Music"
20+import Unity.Test 0.1 as UT
21+import QtMultimedia 5.0
22+
23+Rectangle {
24+ id: root
25+ width: units.gu(60)
26+ height: units.gu(80)
27+ color: "lightgrey"
28+
29+ MusicPreview {
30+ id: musicPreview
31+ anchors.fill: parent
32+ isCurrent: true
33+
34+ previewData: QtObject {
35+ property string rendererName: "preview-music"
36+ property string title: "Music Preview"
37+ property string subtitle: "Subtitle"
38+ property string description: "This is the description"
39+ property string image: "../../tests/qmltests/Components/tst_LazyImage/square.png"
40+ property var actions: [
41+ { id: 123, displayName: "Play"},
42+ { id: 456, displayName: "Show in folder"}
43+ ]
44+ property var tracks: tracksModel2
45+ }
46+ }
47+
48+ ListModel {
49+ id: tracksModel0
50+ }
51+ ListModel {
52+ id: tracksModel1
53+ ListElement { uri: "../../tests/qmltests/Dash/Music/data/testsound1.ogg"; trackNo: 1; title: "Some track name"; length: "0:30"}
54+ }
55+ ListModel {
56+ id: tracksModel2
57+ ListElement { uri: "../../tests/qmltests/Dash/Music/data/testsound1.ogg"; trackNo: 1; title: "Some track name"; length: "0:30"}
58+ ListElement { uri: "../../tests/qmltests/Dash/Music/data/testsound1.ogg"; trackNo: 2; title: "Some track name"; length: "0:30"}
59+ ListElement { uri: "../../tests/qmltests/Dash/Music/data/testsound2.ogg"; trackNo: 3; title: "Some other track name"; length: "1:23"}
60+ ListElement { uri: "../../tests/qmltests/Dash/Music/data/testsound3.ogg"; trackNo: 4; title: "And another one"; length: "123:45"}
61+ }
62+
63+ UT.UnityTestCase {
64+ name: "MusicPreviewTest"
65+ when: windowShown
66+
67+ function init() {
68+ waitForRendering(musicPreview);
69+ }
70+
71+ function test_tracks_data() {
72+ return [
73+ {tag: "0 tracks", tracksModel: tracksModel0, dividerVisible: false},
74+ {tag: "1 track", tracksModel: tracksModel1, dividerVisible: true},
75+ {tag: "4 track", tracksModel: tracksModel2, dividerVisible: true}
76+ ];
77+ }
78+
79+ function test_tracks(data) {
80+ musicPreview.previewData.tracks = data.tracksModel;
81+ waitForRendering(musicPreview);
82+
83+ var trackRepeater = findChild(musicPreview, "trackRepeater");
84+ compare(trackRepeater.count, data.tracksModel.count)
85+
86+ var topDivider = findChild(musicPreview, "topDivider");
87+ compare(topDivider.visible, data.dividerVisible);
88+
89+ for (var i = 0; i < data.tracksModel.count; ++i) {
90+ var trackItem = findChild(musicPreview, "trackItem" + i);
91+ var titleLabel = findChild(trackItem, "trackTitleLabel");
92+ compare(titleLabel.text, data.tracksModel.get(i).title)
93+ var timeLabel = findChild(trackItem, "timeLabel");
94+ compare(timeLabel.text, data.tracksModel.get(i).length)
95+ }
96+ }
97+
98+ function checkPlayerUri(index) {
99+ var modelFilename = musicPreview.previewData.tracks.get(index).uri.replace(/^.*[\\\/]/, '');
100+ var playerFilename = findInvisibleChild(musicPreview, "audioPlayer").source.toString().replace(/^.*[\\\/]/, '');
101+
102+ compare(modelFilename, playerFilename, "Player source is not set correctly.");
103+ }
104+
105+ function test_playback() {
106+ musicPreview.previewData.tracks = tracksModel2;
107+ waitForRendering(musicPreview);
108+
109+ var track0Item = findChild(musicPreview, "trackItem0");
110+ var track1Item = findChild(musicPreview, "trackItem1");
111+ var track2Item = findChild(musicPreview, "trackItem2");
112+
113+ var track0ProgressBar = findChild(track0Item, "progressBarFill");
114+ var track1ProgressBar = findChild(track1Item, "progressBarFill");
115+ var track2ProgressBar = findChild(track2Item, "progressBarFill");
116+
117+ var track0PlayButton = findChild(track0Item, "playButton");
118+ var track1PlayButton = findChild(track1Item, "playButton");
119+ var track2PlayButton = findChild(track2Item, "playButton");
120+
121+ var audioPlayer = findInvisibleChild(musicPreview, "audioPlayer");
122+
123+ // All progress bars must be hidden in the beginning
124+ compare(track0ProgressBar.visible, false);
125+ compare(track1ProgressBar.visible, false);
126+ compare(track2ProgressBar.visible, false);
127+
128+ // Playing track 0 should make progress bar 0 visible
129+ mouseClick(track0PlayButton, track0PlayButton.width / 2, track0PlayButton.height / 2);
130+
131+ tryCompare(audioPlayer, "playbackState", Audio.PlayingState);
132+ checkPlayerUri(0);
133+
134+ tryCompare(track0ProgressBar, "visible", true);
135+ tryCompare(track1ProgressBar, "visible", false);
136+ tryCompare(track2ProgressBar, "visible", false);
137+
138+ // Clicking the button again should pause it. The progress bar should stay visible
139+ mouseClick(track0PlayButton, track0PlayButton.width / 2, track0PlayButton.height / 2);
140+ tryCompare(audioPlayer, "playbackState", Audio.PausedState);
141+ checkPlayerUri(0);
142+ tryCompare(track0ProgressBar, "visible", true);
143+
144+ // Continue playback
145+ mouseClick(track0PlayButton, track0PlayButton.width / 2, track0PlayButton.height / 2);
146+ tryCompare(audioPlayer, "playbackState", Audio.PlayingState);
147+ checkPlayerUri(0);
148+
149+ // Playing track 1 should make progress bar 1 visible and hide progress bar 0 again
150+ mouseClick(track1PlayButton, track1PlayButton.width / 2, track1PlayButton.height / 2);
151+
152+ tryCompare(audioPlayer, "playbackState", Audio.PlayingState);
153+ checkPlayerUri(1);
154+
155+ tryCompare(track0ProgressBar, "visible", false);
156+ tryCompare(track1ProgressBar, "visible", true);
157+ tryCompare(track2ProgressBar, "visible", false);
158+
159+ // Playing track 2 should make progress bar 1 visible and hide progress bar 0 again
160+ mouseClick(track2PlayButton, track2PlayButton.width / 2, track2PlayButton.height / 2);
161+
162+ tryCompare(audioPlayer, "playbackState", Audio.PlayingState);
163+ checkPlayerUri(2);
164+
165+ tryCompare(track0ProgressBar, "visible", false);
166+ tryCompare(track1ProgressBar, "visible", false);
167+ tryCompare(track2ProgressBar, "visible", true);
168+
169+ // Switching away from this preview should make all players shut up!
170+ musicPreview.isCurrent = false
171+ tryCompare(audioPlayer, "playbackState", Audio.StoppedState);
172+ }
173+ }
174+}
tests/qmltests/Dash/artwork/avatar@12.pngnew file

Binary file not shown.

tests/qmltests/Dash/artwork/music-player-design.pngnew file

Binary file not shown.

tests/qmltests/Dash/qml/FakeScopeView.qml+2−1
@@ -17,12 +17,13 @@
17import QtQuick 2.0
17import QtQuick 2.0
18import Unity 0.1
18import Unity 0.1
19
19
20−import "../../../../Dash"
20+import "../../../../qml/Dash"
21
21
22GenericScopeView {
22GenericScopeView {
23 id: fakeScopeView
23 id: fakeScopeView
24
24
25 property alias backColor : back.color
25 property alias backColor : back.color
26+ property var categoryView: null
26
27
27 onEndReached: {
28 onEndReached: {
28 if (scope != undefined && shell != undefined && shell.scopeStatus != undefined) {
29 if (scope != undefined && shell != undefined && shell.scopeStatus != undefined) {
tests/qmltests/Dash/tst_Card.qmlnew file+337
@@ -0,0 +1,337 @@
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 QtTest 1.0
19+import Ubuntu.Components 0.1
20+import Unity.Test 0.1 as UT
21+import "../../../qml/Dash"
22+import "CardHelpers.js" as Helpers
23+
24+Rectangle {
25+ id: root
26+ width: units.gu(80)
27+ height: units.gu(72)
28+ color: "#88FFFFFF"
29+
30+ property string defaultLayout: '
31+ {
32+ "schema-version": 1,
33+ "template": {
34+ "category-layout": "grid",
35+ "card-layout": "vertical",
36+ "card-size": "medium",
37+ "overlay-mode": null,
38+ "collapsed-rows": 2
39+ },
40+ "components": {
41+ "title": null,
42+ "art": {
43+ "aspect-ratio": 1.0,
44+ "fill-mode": "crop"
45+ },
46+ "subtitle": null,
47+ "mascot": null,
48+ "emblem": null,
49+ "old-price": null,
50+ "price": null,
51+ "alt-price": null,
52+ "rating": {
53+ "type": "stars",
54+ "range": [0, 5],
55+ "full": "image://theme/rating-star-full",
56+ "half": "image://theme/rating-star-half",
57+ "empty": "image://theme/rating-star-empty"
58+ },
59+ "alt-rating": null,
60+ "summary": null
61+ },
62+ "resources": {}
63+ }'
64+
65+ property string cardData: '
66+ {
67+ "art": "../../tests/qmltests/Dash/artwork/music-player-design.png",
68+ "mascot": "../../tests/qmltests/Dash/artwork/avatar.png",
69+ "title": "foo",
70+ "subtitle": "bar",
71+ "summary": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
72+ }'
73+
74+ property string fullMapping: '
75+ {
76+ "title": "title",
77+ "art": "art",
78+ "subtitle": "subtitle",
79+ "mascot": "mascot",
80+ "summary": "summary"
81+ }'
82+
83+ property var cardsModel: [
84+ {
85+ "name": "Art, header, summary - vertical",
86+ "layout": { "components": JSON.parse(fullMapping) }
87+ },
88+ {
89+ "name": "Art, header, summary - vertical, small",
90+ "layout": { "template": { "card-size": "small" }, "components": JSON.parse(fullMapping) }
91+ },
92+ {
93+ "name": "Art, header, summary - vertical, large",
94+ "layout": { "template": { "card-size": "large" }, "components": JSON.parse(fullMapping) }
95+ },
96+ {
97+ "name": "Art, header, summary - vertical, wide",
98+ "layout": { "components": Helpers.update(JSON.parse(root.fullMapping), { "art": { "aspect-ratio": 2 } }) }
99+ },
100+ {
101+ "name": "Art, title - vertical, fitted",
102+ "layout": { "components": Helpers.update(JSON.parse(root.fullMapping), { "art": { "fill-mode": "fit" } }) }
103+ },
104+ {
105+ "name": "Art, header, summary - horizontal",
106+ "layout": { "template": { "card-layout": "horizontal" },
107+ "components": JSON.parse(fullMapping) }
108+ },
109+ ]
110+
111+ Card {
112+ id: card
113+ anchors { top: parent.top; left: parent.left; margins: units.gu(1) }
114+
115+ template: Helpers.update(JSON.parse(root.defaultLayout), Helpers.tryParse(layoutArea.text, layoutError))['template'];
116+ components: Helpers.update(JSON.parse(root.defaultLayout), Helpers.tryParse(layoutArea.text, layoutError))['components'];
117+ cardData: Helpers.mapData(dataArea.text, components, dataError)
118+ }
119+
120+ Rectangle {
121+ anchors { top: parent.top; bottom: parent.bottom; right: parent.right}
122+ width: units.gu(40)
123+ color: "lightgrey"
124+
125+ Column {
126+ anchors { fill: parent; margins: units.gu(1) }
127+ spacing: units.gu(1)
128+
129+ OptionSelector {
130+ id: selector
131+ model: cardsModel
132+ delegate: OptionSelectorDelegate { text: modelData.name }
133+ onSelectedIndexChanged: updateAreas()
134+ Component.onCompleted: updateAreas()
135+
136+ function updateAreas() {
137+ var element = cardsModel[selectedIndex];
138+ if (element) {
139+ layoutArea.text = JSON.stringify(element.layout, undefined, 2) || "{}";
140+ // FIXME: don't overwrite data
141+ var data = JSON.parse(root.cardData);
142+ Helpers.update(data, element.data);
143+ dataArea.text = JSON.stringify(data, undefined, 2) || "{}";
144+ } else {
145+ layoutArea.text = "";
146+ dataArea.text = "";
147+ }
148+
149+ }
150+ }
151+
152+ TextArea {
153+ id: layoutArea
154+ anchors { left: parent.left; right: parent.right }
155+ height: units.gu(25)
156+ }
157+
158+ Label {
159+ id: layoutError
160+ anchors { left: parent.left; right: parent.right }
161+ height: units.gu(4)
162+ color: "orange"
163+ }
164+
165+ TextArea {
166+ id: dataArea
167+ anchors { left: parent.left; right: parent.right }
168+ height: units.gu(25)
169+ }
170+
171+ Label {
172+ id: dataError
173+ anchors { left: parent.left; right: parent.right }
174+ height: units.gu(4)
175+ color: "orange"
176+ }
177+ }
178+ }
179+
180+ UT.UnityTestCase {
181+ id: testCase
182+ name: "Card"
183+
184+ when: windowShown
185+
186+ property Item header: findChild(card, "cardHeader")
187+ property Item art: findChild(card, "artShape")
188+ property Item artImage: findChild(card, "artImage")
189+ property Item summary: findChild(card, "summaryLabel")
190+
191+ function initTestCase() {
192+ verify(testCase.header !== undefined, "Couldn't find header object.");
193+ }
194+
195+ function cleanup() {
196+ selector.selectedIndex = -1;
197+ }
198+
199+
200+ function test_header_binding_data() {
201+ return [
202+ { tag: "Mascot", property: "mascot", value: Qt.resolvedUrl("artwork/avatar.png"), index: 0 },
203+ { tag: "Title", property: "title", value: "foo", index: 0 },
204+ { tag: "Subtitle", property: "subtitle", value: "bar", index: 0 },
205+ ];
206+ }
207+
208+ function test_header_binding(data) {
209+ selector.selectedIndex = data.index;
210+ tryCompare(testCase.header, data.property, data.value);
211+ }
212+
213+ function test_card_binding_data() {
214+ return [
215+ { tag: "Art", object: artImage, property: "source", value: Qt.resolvedUrl("artwork/music-player-design.png"), index: 0 },
216+ { tag: "Summary", object: summary, property: "text", field: "summary", index: 0 },
217+ { tag: "Fit", object: art, fill: Image.PreserveAspectFit, index: 4 },
218+ ];
219+ }
220+
221+ function test_card_binding(data) {
222+ selector.selectedIndex = data.index;
223+
224+ if (data.hasOwnProperty('value')) {
225+ tryCompare(data.object, data.property, data.value);
226+ }
227+
228+ if (data.hasOwnProperty('field')) {
229+ tryCompare(data.object, data.property, card.cardData[data.field]);
230+ }
231+ }
232+
233+ function test_card_size_data() {
234+ return [
235+ { tag: "Medium", width: units.gu(18.5), index: 0 },
236+ { tag: "Small", width: units.gu(12), size: "small", index: 0 },
237+ { tag: "Large", width: units.gu(38), size: "large", index: 0 },
238+ { tag: "Wide", width: units.gu(18.5), aspect: 0.5, index: 0 },
239+ { tag: "Horizontal", width: units.gu(38), index: 5 },
240+ ]
241+ }
242+
243+ function test_card_size(data) {
244+ selector.selectedIndex = data.index;
245+
246+ if (data.hasOwnProperty("size")) {
247+ card.template['card-size'] = data.size;
248+ card.templateChanged();
249+ }
250+
251+ if (data.hasOwnProperty("aspect")) {
252+ card.components['art']['aspect-ratio'] = data.aspect;
253+ card.componentsChanged();
254+ }
255+
256+ if (data.hasOwnProperty("width")) {
257+ tryCompare(card, "width", data.width);
258+ }
259+
260+ if (data.hasOwnProperty("height")) {
261+ tryCompare(card, "height", data.height);
262+ }
263+ }
264+
265+ function test_art_size_data() {
266+ return [
267+ { tag: "Medium", width: units.gu(18.5), fill: Image.PreserveAspectCrop, index: 0 },
268+ { tag: "Small", width: units.gu(12), index: 1 },
269+ { tag: "Large", width: units.gu(38), index: 2 },
270+ { tag: "Wide", height: units.gu(19), size: "large", index: 3 },
271+ { tag: "Fit", height: units.gu(38), size: "large", width: units.gu(19), index: 4 },
272+ { tag: "VerticalWidth", width: function() { return header.width }, index: 0 },
273+ { tag: "HorizontalHeight", height: function() { return header.height }, index: 5 },
274+ { tag: "HorizontalWidth", width: function() { return header.x }, index: 5 },
275+ ]
276+ }
277+
278+ function test_art_size(data) {
279+ selector.selectedIndex = data.index;
280+
281+ if (data.hasOwnProperty("size")) {
282+ card.template['card-size'] = data.size;
283+ card.templateChanged();
284+ }
285+
286+ if (data.hasOwnProperty("aspect")) {
287+ card.components['art']['aspect-ratio'] = data.aspect;
288+ card.componentsChanged();
289+ }
290+
291+ if (data.hasOwnProperty("width")) {
292+ if (typeof data.width === "function") {
293+ tryCompareFunction(function() { return art.width === data.width() }, true);
294+ } else tryCompare(art, "width", data.width);
295+ }
296+
297+ if (data.hasOwnProperty("height")) {
298+ if (typeof data.height === "function") {
299+ tryCompareFunction(function() { return art.height === data.height() }, true);
300+ } else tryCompare(art, "height", data.height);
301+ }
302+
303+ if (data.hasOwnProperty("fill")) {
304+ tryCompare(artImage, "fillMode", data.fill);
305+ }
306+ }
307+
308+ function test_art_layout_data() {
309+ return [
310+ { tag: "Vertical", left: function() { return 0 }, index: 0},
311+ { tag: "Horizontal", left: function() { return art.width }, index: 5 }
312+ ];
313+ }
314+
315+ function test_art_layout(data) {
316+ selector.selectedIndex = data.index;
317+
318+ tryCompare(testCase.header, "x", data.left());
319+ }
320+
321+ function test_header_layout_data() {
322+ return [
323+ { tag: "Vertical", top: function() { return art.y + art.height },
324+ left: function() { return art.x }, index: 0 },
325+ { tag: "Horizontal", top: function() { return art.y },
326+ left: function() { return art.x + art.width }, index: 5 }
327+ ]
328+ }
329+
330+ function test_header_layout(data) {
331+ selector.selectedIndex = data.index;
332+
333+ tryCompareFunction(function() { return testCase.header.y === data.top() }, true);
334+ tryCompareFunction(function() { return testCase.header.x === data.left() }, true);
335+ }
336+ }
337+}
tests/qmltests/Dash/tst_CardHeader.qmlnew file+138
@@ -0,0 +1,138 @@
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 QtTest 1.0
19+import Ubuntu.Components 0.1
20+import Unity.Test 0.1 as UT
21+import "../../../qml/Dash"
22+
23+
24+Rectangle {
25+ width: units.gu(40)
26+ height: units.gu(72)
27+ color: "lightgrey"
28+
29+ CardHeader {
30+ id: cardHeader
31+ anchors { left: parent.left; right: parent.right }
32+ }
33+
34+ Rectangle {
35+ anchors.fill: cardHeader
36+ color: "lightblue"
37+ opacity: 0.5
38+ }
39+
40+ UT.UnityTestCase {
41+ id: testCase
42+ name: "CardHeader"
43+
44+ when: windowShown
45+
46+ property Item mascot: findChild(cardHeader, "mascotShape")
47+ property Item titleLabel: findChild(cardHeader, "titleLabel")
48+ property Item subtitleLabel: findChild(cardHeader, "subtitleLabel")
49+ property Item prices: findChild(cardHeader, "prices")
50+ property Item oldPriceLabel: findChild(cardHeader, "oldPriceLabel")
51+ property Item outerRow: findChild(cardHeader, "outerRow")
52+ property Item column: findChild(cardHeader, "column")
53+
54+ function initTestCase() {
55+ verify(testCase.mascot !== undefined, "Couldn't find mascot object.");
56+ verify(testCase.titleLabel !== undefined, "Couldn't find titleLabel object.");
57+ verify(testCase.subtitleLabel !== undefined, "Couldn't find subtitleLabel object.");
58+ verify(testCase.prices !== undefined, "Couldn't find prices object.");
59+ verify(testCase.oldPriceLabel !== undefined, "Couldn't find oldPriceLabel object.");
60+ }
61+
62+ function cleanup() {
63+ cardHeader.mascot = "";
64+ cardHeader.title = "";
65+ cardHeader.subtitle = "";
66+ cardHeader.price = "";
67+ cardHeader.oldPrice = "";
68+ cardHeader.altPrice = "";
69+ }
70+
71+ function test_mascot_data() {
72+ return [
73+ { tag: "Empty", source: "", visible: false },
74+ { tag: "Invalid", source: "bad_path", visible: false },
75+ { tag: "Valid", source: Qt.resolvedUrl("artwork/avatar.png"), visible: true },
76+ ]
77+ }
78+
79+ function test_mascot(data) {
80+ cardHeader.mascot = data.source;
81+ tryCompare(testCase.mascot, "visible", data.visible);
82+ }
83+
84+ function test_labels_data() {
85+ return [
86+ { tag: "Empty", visible: false },
87+ { tag: "Title only", title: "Foo", visible: true },
88+ { tag: "Subtitle only", subtitle: "Bar", visible: false },
89+ { tag: "Both", title: "Foo", subtitle: "Bar", visible: true }
90+ ]
91+ }
92+
93+ function test_labels(data) {
94+ cardHeader.title = data.title !== undefined ? data.title : "";
95+ cardHeader.subtitle = data.subtitle !== undefined ? data.subtitle : "";
96+ tryCompare(cardHeader, "visible", data.visible);
97+ }
98+
99+ function test_prices_data() {
100+ return [
101+ { tag: "Main", main: "$1.25", visible: true },
102+ { tag: "Alt", alt: "€1.00", visible: false },
103+ { tag: "Old", old: "€2.00", visible: false },
104+ { tag: "Main and Alt", main: "$1.25", alt: "€1.00", visible: true },
105+ { tag: "Main and Old", main: "$1.25", old: "$2.00", visible: true, oldAlign: Text.AlignRight },
106+ { tag: "Alt and Old", alt: "€1.00", old: "$2.00", visible: false },
107+ { tag: "All", main: "$1.25", alt: "€1.00", old: "$2.00", visible: true, oldAlign: Text.AlignHCenter }
108+ ]
109+ }
110+
111+ function test_prices(data) {
112+ cardHeader.price = data.main !== undefined ? data.main : "";
113+ cardHeader.oldPrice = data.old !== undefined ? data.old : "";
114+ cardHeader.altPrice = data.alt !== undefined ? data.alt : "";
115+ tryCompare(cardHeader, "visible", data.visible);
116+ if (data.hasOwnProperty("oldAlign")) {
117+ compare(testCase.oldPriceLabel.horizontalAlignment, data.oldAlign, "Old price label is aligned wrong.")
118+ }
119+ }
120+
121+ function test_dimensions_data() {
122+ return [
123+ { tag: "Column width", object: column, width: cardHeader.width - testCase.outerRow.spacing * 2 },
124+ { tag: "Column width", object: column, width: cardHeader.width - mascot.width - testCase.outerRow.spacing * 3, mascot: "artwork/avatar.png" }
125+ ]
126+ }
127+
128+ function test_dimensions(data) {
129+ if (data.hasOwnProperty("mascot")) {
130+ cardHeader.mascot = data.mascot;
131+ }
132+
133+ if (data.hasOwnProperty("width")) {
134+ tryCompare(data.object, "width", data.width);
135+ }
136+ }
137+ }
138+}
tests/qmltests/Dash/tst_Dash.qml+12−14
@@ -16,7 +16,7 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import QtTest 1.0
18import QtTest 1.0
19−import "../../../Dash"
19+import "../../../qml/Dash"
20import Ubuntu.Components 0.1
20import Ubuntu.Components 0.1
21import Unity.Test 0.1 as UT
21import Unity.Test 0.1 as UT
22
22
@@ -25,8 +25,6 @@ Item {
25 width: units.gu(40)
25 width: units.gu(40)
26 height: units.gu(80)
26 height: units.gu(80)
27
27
28− property ListModel searchHistory : ListModel {}
29−
30 Dash {
28 Dash {
31 id: dash
29 id: dash
32 anchors.fill: parent
30 anchors.fill: parent
@@ -36,12 +34,12 @@ Item {
36 ScopeDelegateMapper {
34 ScopeDelegateMapper {
37 id: scopeDelegateMapper
35 id: scopeDelegateMapper
38 scopeDelegateMapping: {
36 scopeDelegateMapping: {
39− "MockScope1": "../tests/qmltests/Dash/qml/fake_scopeView1.qml",
37+ "MockScope1": Qt.resolvedUrl("qml/fake_scopeView1.qml"),
40− "MockScope2": "../tests/qmltests/Dash/qml/fake_scopeView2.qml",
38+ "MockScope2": Qt.resolvedUrl("qml/fake_scopeView2.qml"),
41− "home.scope": "../tests/qmltests/Dash/qml/fake_scopeView3.qml",
39+ "home.scope": Qt.resolvedUrl("qml/fake_scopeView3.qml"),
42− "applications.scope": "../tests/qmltests/Dash/qml/fake_scopeView4.qml"
40+ "applications.scope": Qt.resolvedUrl("qml/fake_scopeView4.qml")
43 }
41 }
44− genericScope: "../tests/qmltests/Dash/qml/fake_generic_scopeView.qml"
42+ genericScope: Qt.resolvedUrl("qml/fake_generic_scopeView.qml")
45 }
43 }
46
44
47 UT.UnityTestCase {
45 UT.UnityTestCase {
@@ -83,14 +81,14 @@ Item {
83 // wait for scopes to load
81 // wait for scopes to load
84 tryCompare(scopes, "loaded", true);
82 tryCompare(scopes, "loaded", true);
85
83
86− var dashbar = findChild(dash, "dashbar");
84+ var tabbar = findChild(dash, "tabbar");
87− verify(dashbar != undefined)
85+ verify(tabbar != undefined)
88 var dashContent = findChild(dash, "dashContent");
86 var dashContent = findChild(dash, "dashContent");
89 var current_index = dashContent.currentIndex;
87 var current_index = dashContent.currentIndex;
90
88
91 dash.setCurrentScope(data.tag, true /* animate */, false /* reset */);
89 dash.setCurrentScope(data.tag, true /* animate */, false /* reset */);
92 compare(dashContent.currentIndex, data.shouldBeVisible ? data.visualIndex : current_index);
90 compare(dashContent.currentIndex, data.shouldBeVisible ? data.visualIndex : current_index);
93− compare(dashbar.currentIndex, data.shouldBeVisible ? data.visualIndex : current_index);
91+ compare(tabbar.selectedIndex, data.shouldBeVisible ? data.visualIndex : current_index);
94 }
92 }
95
93
96 function test_show_scope_on_load_data() {
94 function test_show_scope_on_load_data() {
@@ -127,12 +125,12 @@ Item {
127 // wait for scopes to load
125 // wait for scopes to load
128 tryCompare(scopes, "loaded", true);
126 tryCompare(scopes, "loaded", true);
129
127
130− var dashbar = findChild(dash, "dashbar");
128+ var tabbar = findChild(dash, "tabbar");
131− verify(dashbar != undefined)
129+ verify(tabbar != undefined)
132 var dashContent = findChild(dash, "dashContent");
130 var dashContent = findChild(dash, "dashContent");
133 var current_index = dashContent.currentIndex;
131 var current_index = dashContent.currentIndex;
134
132
135− dashbar.itemSelected(data.visualIndex);
133+ tabbar.selectedIndex = data.visualIndex;
136 compare(dashContent.currentIndex, data.shouldBeVisible ? data.visualIndex : current_index);
134 compare(dashContent.currentIndex, data.shouldBeVisible ? data.visualIndex : current_index);
137 }
135 }
138 }
136 }
tests/qmltests/Dash/tst_DashBar.qmldeleted−111
@@ -1,111 +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 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 QtTest 1.0
19−import Unity 0.1
20−import ".."
21−import "../../../Dash"
22−import Ubuntu.Components 0.1
23−import Unity.Test 0.1 as UT
24−
25−Item {
26− width: units.gu(40)
27− height: units.gu(71)
28−
29− DashBar {
30− id: dashBar
31−
32− anchors {
33− left: parent.left
34− right: parent.right
35− bottom: parent.bottom
36− }
37− model: scopes
38− onItemSelected: currentIndex = index
39− }
40−
41− Scopes {
42− id: scopes
43− }
44−
45− SignalSpy {
46− id: signalSpy
47− signalName: "itemSelected"
48− target: dashBar
49− }
50−
51− UT.UnityTestCase {
52− name: "DashBar"
53− when: scopes.loaded
54−
55− property alias model: dashBar.model
56− property alias currentIndex: dashBar.currentIndex
57−
58− readonly property alias lineHeight: dashBar.lineHeight
59− readonly property alias itemSize: dashBar.itemSize
60− readonly property alias iconSize: dashBar.iconSize
61− readonly property var panel: findChild(dashBar, "panel");
62−
63− function initTestCase() {
64− currentIndex = 2
65− }
66−
67− function waitForAnimationToEnd() {
68− compare(panel.animating, true) // check the animation started
69− tryCompare(panel, "animating", false) // wait till the animation ends
70− }
71−
72− function closePanel() {
73− dashBar.finishNavigation()
74− waitForAnimationToEnd()
75− tryCompare(panel, "opened", false)
76− }
77−
78− function openPanel() {
79− dashBar.startNavigation()
80− waitForAnimationToEnd()
81− tryCompare(panel, "opened", true)
82− }
83−
84− function test_navigationAndHide() {
85− openPanel()
86− closePanel()
87− }
88−
89− function test_itemSelected() {
90− openPanel()
91−
92− var row = findChild(dashBar, "row");
93− tryCompareFunction(function(){return row.width > 0;}, true);
94− for (var i = 0; i < model.rowCount(); i++) {
95− // coordinate x in the middle of item with index 'i'
96− var x = row.x + (row.width / model.rowCount()) * i + itemSize / 2
97−
98− // FIXME workaround for a bug in SignalSpy
99− signalSpy.clear()
100−
101− // (item, x, y, button, modifiers, delay)
102− mouseClick(panel, x, row.height / 2, Qt.LeftButton, Qt.NoModifier, 0)
103− compare(signalSpy.count > 0, true, "signal itemSelected not triggered")
104− compare(signalSpy.signalArguments[0][0], i, "signal itemSelected emitted unexpected index");
105− tryCompare(dashBar, "currentIndex", i);
106− }
107−
108− closePanel()
109− }
110− }
111−}
tests/qmltests/Dash/tst_DashContent.qml+100−10

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/qmltests/Dash/tst_GenericScopeView.qml+151−27

This diff is too big to show here.

tests/qmltests/Greeter/tst_Clock.qml+1−1

This diff is too big to show here.

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

This diff is too big to show here.

tests/qmltests/Greeter/tst_Lockscreen.qml+1−1

This diff is too big to show here.

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

This diff is too big to show here.

tests/qmltests/Greeter/tst_Tablet.qml+12−1

This diff is too big to show here.

tests/qmltests/Hud/tst_Hud.qml+1−1

This diff is too big to show here.

tests/qmltests/Hud/tst_Result.qml+1−1

This diff is too big to show here.

tests/qmltests/Launcher/tst_Launcher.qml+7−7

This diff is too big to show here.

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

This diff is too big to show here.

tests/qmltests/Panel/Indicators/tst_DefaultIndicatorPage.qmlnew file+179

This diff is too big to show here.

tests/qmltests/Panel/Indicators/tst_DefaultIndicatorWidget.qml+1−1

This diff is too big to show here.

tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qmlnew file+369

This diff is too big to show here.

tests/qmltests/Panel/Indicators/tst_MessageMenuItemFactory.qmlnew file+177

This diff is too big to show here.

tests/qmltests/Panel/tst_IndicatorItem.qml+1−12

This diff is too big to show here.

tests/qmltests/Panel/tst_IndicatorRow.qml+19−5

This diff is too big to show here.

tests/qmltests/Panel/tst_Indicators.qml+2−2

This diff is too big to show here.

tests/qmltests/Panel/tst_MenuContent.qml+1−1

This diff is too big to show here.

tests/qmltests/Panel/tst_Panel.qml+15−1

This diff is too big to show here.

tests/qmltests/Panel/tst_SearchIndicator.qml+1−1

This diff is too big to show here.

tests/qmltests/SideStage/tst_SideStage.qml+1−1

This diff is too big to show here.

tests/qmltests/tst_Shell.qml+3−3

This diff is too big to show here.

tests/uqmlscene/CMakeLists.txt+6−1

This diff is too big to show here.

tests/uqmlscene/main.cpp+1−1

This diff is too big to show here.

tests/utils/modules/Unity/Test/CMakeLists.txt+4

This diff is too big to show here.

tools/CMakeLists.txtnew file+11

This diff is too big to show here.

tools/registry-tracker.cppnew file+116

This diff is too big to show here.

tools/registry-tracker.hnew file+44

This diff is too big to show here.

tools/scopetool.cppnew file+84

This diff is too big to show here.

unity8.qmlprojectdeleted−25

This diff is too big to show here.