on xenial help sign in
Merge from trunk
commite7bca7e6ee00843037685da5ebba419594af77af authorMichael Terry <michael.terry@canonical.com> dateTue 15 Oct 2013, 13:48 (13 years ago) parent00a39ecb6b64c9
322 files changed+9780−10038
Bottombar/Bottombar.qml+82−17 CMakeLists.txt−1 Components/ApplicationManagerWrapper.qml+13−30 Components/BasicShell.qml−4 Components/DragHandle.qml−1 Components/EdgeDemoOverlay.qml+9−2 Components/FilterGrid.qml+2−1 Components/LazyImage.qml+185 Components/ListItems/Header.qml+1−1 Components/PageHeader.qml+44−1 Greeter/PinPadButton.qml → Components/PinPadButton.qml Components/ResponsiveGridView.qml+2 Components/Showable.qml+11 Components/Stage.qml+9−1 Components/Tile.qml+6−63 Components/TileStyle.qml+81 Components/VolumeControl.qml+1−1 Components/graphics/close@20.png Dash/Apps/AppPreview.qml+70−123 Dash/Apps/AppsAvailableForDownloadModel.qml−81 Dash/Apps/DashPluginFilterGrid.qml+49 Dash/Apps/FrequentlyUsedAppsModel.qml+4−4 Dash/Apps/RunningApplicationTile.qml+9−5 Dash/Apps/RunningApplicationsGrid.qml+20−1 Dash/Dash.qml+3 Dash/DashApps.qml+2 Dash/DashContent.qml+7−6 Dash/DashMusic.qml−96 Dash/DashPreview.qml+91−93 Dash/DashVideos.qml−201 Dash/Generic/FlatTileStyle.qml+79 Dash/Generic/GenericFilterGrid.qml−3 Dash/Generic/GenericPreview.qml+158−70 Dash/Generic/WeatherFilterGrid.qml+49 Dash/GenericScopeView.qml+63−4 Dash/Movie/MoviePreview.qml+71 Dash/Music/MusicFilterGrid.qml+21−22 Dash/Music/MusicTileStyle.qml+102 Dash/PreviewDelegateMapper.qml+1 Dash/Previews/Header.qml+109 Dash/Apps/AppReviews.qml → Dash/Previews/Reviews.qml Dash/ScopeDelegateMapper.qml+2−4 Dash/ScopeListView.qml+6 Dash/ScopeView.qml+12−3 Dash/Video/VideosFilterGrid.qml → Dash/Video/VideoFilterGrid.qml+17−13 Dash/Video/VideoPreview.qml−210 Dash/Video/VideoTileStyle.qml+87 Dash/Video/graphics/movie_icon_holder@27.png Greeter/Clock.qml+31−12 Greeter/Gradient.js+7−3 Greeter/GreeterContent.qml+11−7 Greeter/Infographics.qml+11−4 Greeter/PinLockscreen.qml+5 GreeterShell.qml+17 Notifications/Notification.qml+49−5 Notifications/NotificationMenuItemFactory.qml+96 Panel/IndicatorRow.qml+51−12 Panel/Indicators.qml+6−1 Panel/Indicators/DatetimeIndicatorPage.qml−97 Panel/Indicators/DatetimeIndicatorWidget.qml−67 Panel/Indicators/DefaultIndicatorPage.qml+1−1 Panel/Indicators/DefaultIndicatorPage2.qml−25 Panel/Indicators/DefaultIndicatorWidget.qml+47−21 Panel/Indicators/DefaultIndicatorWidget2.qml−103 Panel/Indicators/MessagingIndicatorPage.qml−35 Panel/Indicators/NetworkIndicatorPage.qml−83 Panel/Indicators/NetworkIndicatorPage2.qml−82 Panel/Indicators/NetworkIndicatorWidget.qml−112 Panel/Indicators/client/IndicatorsList.qml+16−14 Panel/Indicators/client/IndicatorsTree.qml+4 Panel/IndicatorsDataModel.qml−79 Panel/MenuContent.qml+9−2 Panel/Panel.qml+3−2 Panel/SearchIndicator.qml+9−8 Shell.qml+56−37 data/unity8-setcap.conf+32 data/unity8.conf+9 debian/changelog+391 debian/control+9−9 debian/unity8.install+2−1 main.cpp+5−4 plugins/AccountsService/AccountsService.cpp+23−1 plugins/AccountsService/AccountsService.h+7 plugins/ListViewWithPageHeader/listviewwithpageheader.cpp+8−1 plugins/SessionManager/SessionManager.h+4−2 plugins/Unity/CMakeLists.txt+2−2 plugins/Unity/Indicators/CMakeLists.txt+1 plugins/Unity/IndicatorsLegacy/Messaging/CMakeLists.txt → plugins/Unity/Indicators/Messaging/CMakeLists.txt plugins/Unity/IndicatorsLegacy/Messaging/qml/ActionButton.qml → plugins/Unity/Indicators/Messaging/qml/ActionButton.qml plugins/Unity/IndicatorsLegacy/Messaging/qml/ActionTextField.qml → plugins/Unity/Indicators/Messaging/qml/ActionTextField.qml+10−7 plugins/Unity/Indicators/Messaging/qml/CMakeLists.txt+5 plugins/Unity/IndicatorsLegacy/Messaging/qml/GroupedMessage.qml → plugins/Unity/Indicators/Messaging/qml/GroupedMessage.qml+13−18 plugins/Unity/IndicatorsLegacy/Messaging/qml/HeroMessage.qml → plugins/Unity/Indicators/Messaging/qml/HeroMessage.qml+25−22 plugins/Unity/IndicatorsLegacy/Messaging/qml/HeroMessageHeader.qml → plugins/Unity/Indicators/Messaging/qml/HeroMessageHeader.qml plugins/Unity/Indicators/Messaging/qml/MessageMenuItemFactory.qml+180 plugins/Unity/IndicatorsLegacy/Messaging/qml/QuickReply.qml → plugins/Unity/Indicators/Messaging/qml/QuickReply.qml+11−6 plugins/Unity/IndicatorsLegacy/Messaging/qml/SimpleTextMessage.qml → plugins/Unity/Indicators/Messaging/qml/SimpleTextMessage.qml+7−4 plugins/Unity/IndicatorsLegacy/Messaging/qml/SnapDecision.qml → plugins/Unity/Indicators/Messaging/qml/SnapDecision.qml+33−14 plugins/Unity/IndicatorsLegacy/Messaging/qml/TextMessage.qml → plugins/Unity/Indicators/Messaging/qml/TextMessage.qml+12−4 plugins/Unity/IndicatorsLegacy/Messaging/qml/qmldir → plugins/Unity/Indicators/Messaging/qml/qmldir+2−2 plugins/Unity/IndicatorsLegacy/Messaging/qml/utils.js → plugins/Unity/Indicators/Messaging/qml/utils.js plugins/Unity/Indicators/Network/CMakeLists.txt−44 plugins/Unity/Indicators/Network/networkagent.cpp−146 plugins/Unity/Indicators/Network/networkagent.h−65 plugins/Unity/Indicators/Network/plugin.h−32 plugins/Unity/Indicators/Network/qml/PasswordPage.qml−88 plugins/Unity/Indicators/Network/qml/PasswordTextField.qml−68 plugins/Unity/Indicators/Network/qml/qmldir−5 plugins/Unity/Indicators/Network/secret-agent.c−382 plugins/Unity/Indicators/Network/secret-agent.h−102 plugins/Unity/Indicators/indicators.h−2 plugins/Unity/Indicators/indicatorsmanager.cpp+20−24 plugins/Unity/Indicators/indicatorsmanager.h−1 plugins/Unity/Indicators/indicatorsmodel.cpp+2−55 plugins/Unity/Indicators/indicatorsmodel.h−8 plugins/Unity/Indicators/plugin.cpp+2 plugins/Unity/Indicators/qml/BaseMenuItem.qml+1−1 plugins/Unity/Indicators/qml/IndicatorBase.qml+8−5 plugins/Unity/Indicators/qml/IndicatorPage.qml+40−11 plugins/Unity/Indicators/qml/IndicatorWidget.qml−6 plugins/Unity/Indicators/qml/MenuItemFactory.qml+63−12 plugins/Unity/Indicators/qml/SliderMenuItem.qml+1−1 plugins/Unity/IndicatorsLegacy/resources/artwork/messaging/default_app.svg → plugins/Unity/Indicators/resources/artwork/messaging/default_app.svg plugins/Unity/IndicatorsLegacy/resources/artwork/messaging/default_contact.png → plugins/Unity/Indicators/resources/artwork/messaging/default_contact.png plugins/Unity/IndicatorsLegacy/resources/artwork/messaging/message_sms01_54px.png → plugins/Unity/Indicators/resources/artwork/messaging/message_sms01_54px.png plugins/Unity/Indicators/resources/indicators.qrc+3 plugins/Unity/Indicators/rootactionstate.cpp+22−2 plugins/Unity/Indicators/rootactionstate.h+4 plugins/Unity/Indicators/visibleindicatorsmodel.cpp−2 plugins/Unity/IndicatorsLegacy/CMakeLists.txt−49 plugins/Unity/IndicatorsLegacy/Messaging/qml/CMakeLists.txt−5 plugins/Unity/IndicatorsLegacy/Messaging/qml/MessageMenuItem.qml−96 plugins/Unity/IndicatorsLegacy/Network/CMakeLists.txt−45 plugins/Unity/IndicatorsLegacy/Network/networkagent.cpp−146 plugins/Unity/IndicatorsLegacy/Network/networkagent.h−65 plugins/Unity/IndicatorsLegacy/Network/plugin.cpp−31 plugins/Unity/IndicatorsLegacy/Network/plugin.h−32 plugins/Unity/IndicatorsLegacy/Network/qml/AccessPoint.qml−68 plugins/Unity/IndicatorsLegacy/Network/qml/CMakeLists.txt−5 plugins/Unity/IndicatorsLegacy/Network/qml/PasswordPage.qml−88 plugins/Unity/IndicatorsLegacy/Network/qml/PasswordTextField.qml−68 plugins/Unity/IndicatorsLegacy/Network/qml/WifiSection.qml−34 plugins/Unity/IndicatorsLegacy/Network/qml/qmldir−9 plugins/Unity/IndicatorsLegacy/Network/secret-agent.c−382 plugins/Unity/IndicatorsLegacy/Network/secret-agent.h−102 plugins/Unity/IndicatorsLegacy/flatmenuproxymodel.cpp−288 plugins/Unity/IndicatorsLegacy/flatmenuproxymodel.h−93 plugins/Unity/IndicatorsLegacy/modelprinter.cpp−114 plugins/Unity/IndicatorsLegacy/modelprinter.h−50 plugins/Unity/IndicatorsLegacy/plugin.cpp−42 plugins/Unity/IndicatorsLegacy/plugin.h−32 plugins/Unity/IndicatorsLegacy/qml/BasicMenuItem.qml−48 plugins/Unity/IndicatorsLegacy/qml/ButtonMenuItem.qml−47 plugins/Unity/IndicatorsLegacy/qml/CMakeLists.txt−5 plugins/Unity/IndicatorsLegacy/qml/DivMenuItem.qml−26 plugins/Unity/IndicatorsLegacy/qml/HLine.qml−29 plugins/Unity/IndicatorsLegacy/qml/IndicatorBase.qml−59 plugins/Unity/IndicatorsLegacy/qml/IndicatorPage.qml−191 plugins/Unity/IndicatorsLegacy/qml/IndicatorWidget.qml−68 plugins/Unity/IndicatorsLegacy/qml/MenuAction.qml−86 plugins/Unity/IndicatorsLegacy/qml/MenuActionBinding.qml−106 plugins/Unity/IndicatorsLegacy/qml/MenuItem.qml−40 plugins/Unity/IndicatorsLegacy/qml/MenuItemFactory.qml−110 plugins/Unity/IndicatorsLegacy/qml/ProgressMenuItem.qml−65 plugins/Unity/IndicatorsLegacy/qml/RemoveBackground.qml−55 plugins/Unity/IndicatorsLegacy/qml/SectionMenuItem.qml−57 plugins/Unity/IndicatorsLegacy/qml/SliderMenuItem.qml−64 plugins/Unity/IndicatorsLegacy/qml/SwitchMenuItem.qml−43 plugins/Unity/IndicatorsLegacy/qml/qmldir−21 plugins/Unity/IndicatorsLegacy/resources/indicators.qrc−7 plugins/Unity/Launcher/backend/launcherbackend.cpp+4−37 plugins/Unity/Launcher/backend/launcherbackend.h+1−16 plugins/Unity/Launcher/launchermodel.cpp+4−8 plugins/Unity/Launcher/quicklistmodel.cpp+1−1 plugins/Unity/bottombarvisibilitycommunicatorshell.cpp+15−1 plugins/Unity/bottombarvisibilitycommunicatorshell.h+6 plugins/Unity/categories.cpp+77−16 plugins/Unity/categories.h+11−1 plugins/Unity/categoryresults.cpp+22 plugins/Unity/categoryresults.h+2−1 plugins/Unity/iconutils.cpp+33 plugins/Unity/iconutils.h+2 plugins/Unity/plugin.cpp+2 plugins/Unity/preview.cpp+24−13 plugins/Unity/preview.h+7−2 plugins/Unity/result.cpp+82 plugins/Unity/result.h+69 plugins/Unity/scope.cpp+76−6 plugins/Unity/scope.h+17−2 plugins/Unity/variantutils.cpp+9 plugins/Unity/variantutils.h+1 plugins/Utils/CMakeLists.txt+13−1 plugins/Utils/albumartprovider.cpp+231 plugins/Utils/albumartprovider.h+56 plugins/Utils/mediaartcache.cpp+178 plugins/Utils/mediaartcache.h+54 plugins/Utils/plugin.cpp+22−1 plugins/Utils/plugin.h+1 plugins/Utils/unitymenumodelpaths.cpp+182 plugins/Utils/unitymenumodelpaths.h+82 po/ar.po+52−66 po/ast.po+248 po/az.po+40−66 po/bg.po+46−66 po/ca.po+71−76 po/cs.po+239 po/de.po+73−84 po/el.po+40−66 po/en_AU.po+79−90 po/en_GB.po+55−66 po/eo.po+34−66 po/es.po+60−69 po/fi.po+69−78 po/fo.po+52−78 po/fr.po+40−66 po/gd.po+253 po/gl.po+95−107 po/he.po+97−108 po/hr.po+40−66 po/hu.po+40−66 po/hy.po+40−66 po/id.po+34−66 po/is.po+55−66 po/it.po+100−104 po/ja.po+34−66 po/km.po+248 po/kn.po+40−66 po/ko.po+60−89 po/ky.po+40−66 po/lo.po+229 po/lv.po+59−85 po/my.po+78−95 po/nb.po+40−66 po/nl.po+40−66 po/pl.po+59−86 po/pt_BR.po+97−106 po/ro.po+40−66 po/ru.po+81−88 po/shn.po+223 po/si.po+34−66 po/sl.po+58−68 po/sr.po+40−66 po/sv.po+34−66 po/te.po+37−66 po/tr.po+81−91 po/ug.po+61−79 po/uk.po+78−85 po/unity8.pot+32−64 po/xh.po+223 po/zh_CN.po+57−68 po/zh_TW.po+40−66 run_on_device+1−1 src/Panel/Indicators/CMakeLists.txt−1 src/Panel/Indicators/servicefiles/CMakeLists.txt−14 src/Panel/Indicators/servicefiles/com.canonical.indicator.messages−10 tests/autopilot/unity8/application_lifecycle/tests/test_application_lifecycle.py−3 tests/autopilot/unity8/indicators_client/__init__.py−8 tests/autopilot/unity8/indicators_client/emulators/__init__.py−31 tests/autopilot/unity8/indicators_client/emulators/common.py−14 tests/autopilot/unity8/indicators_client/emulators/main_window.py−27 tests/autopilot/unity8/indicators_client/tests/__init__.py−91 tests/autopilot/unity8/indicators_client/tests/test_battery.py−114 tests/autopilot/unity8/shell/__init__.py+14 tests/autopilot/unity8/shell/emulators/dash.py+15−6 tests/autopilot/unity8/shell/emulators/hud.py+8−9 tests/autopilot/unity8/shell/emulators/main_window.py+3 tests/autopilot/unity8/shell/tests/__init__.py+140−14 tests/autopilot/unity8/shell/tests/test_hud.py+43−8 tests/mocks/AccountsService/AccountsService.cpp+13−1 tests/mocks/AccountsService/AccountsService.h+8 plugins/Unity/Indicators/Network/plugin.cpp → tests/mocks/QMenuModel/UnityMenuModel.qml+9−14 tests/mocks/QMenuModel/qmldir+1 tests/mocks/SessionManager/SessionManager.cpp+12−2 tests/mocks/SessionManager/SessionManager.h+9−1 tests/mocks/Unity/Application/ApplicationInfo.h+1 tests/mocks/Unity/Application/ApplicationManager.h+1 tests/mocks/Unity/Indicators/CMakeLists.txt+1−1 Panel/Indicators/MessagingIndicatorWidget.qml → tests/mocks/Unity/Indicators/CachedUnityMenuModel.qml+8−3 tests/mocks/Unity/Indicators/IndicatorsModel.qml+5−15 Panel/Indicators/SoundIndicatorWidget.qml → tests/mocks/Unity/Indicators/RootActionState.qml+11−4 tests/mocks/Unity/Indicators/qmldir+2 tests/mocks/Unity/fake_applications_scope.cpp+7 tests/mocks/Unity/fake_categories.cpp+6 tests/mocks/Unity/fake_categories.h+1 tests/mocks/Unity/fake_preview.cpp+2−5 tests/mocks/Unity/fake_preview.h−2 tests/mocks/Unity/fake_scope.cpp+26 tests/mocks/Unity/fake_scope.h+10−1 tests/mocks/libusermetrics/UserMetrics.cpp+6−2 tests/plugins/ListViewWithPageHeader/listviewwithpageheadertest.cpp+124 tests/plugins/Unity/CMakeLists.txt+1−1 tests/plugins/Unity/Indicators/CMakeLists.txt+5 tests/plugins/Unity/Indicators/indicatorsmodeltest.cpp−15 tests/plugins/Unity/Indicators/rootactionstatetest.cpp+58 tests/plugins/Unity/Launcher/launcherbackendtest.cpp+2−23 tests/plugins/Unity/previewbindingstest.cpp+27 tests/plugins/Unity/resultstest.cpp+100−9 tests/plugins/Unity/resultstest.h+2 tests/qmltests/CMakeLists.txt+6−4 tests/qmltests/Components/tst_LazyImage.qml+185 tests/qmltests/Components/tst_LazyImage/ImageControls.qml+67 tests/qmltests/Components/tst_LazyImage/portrait.png tests/qmltests/Components/tst_LazyImage/square.png tests/qmltests/Components/tst_LazyImage/wide.png tests/qmltests/Components/tst_PageHeader.qml+28 tests/qmltests/Components/tst_Showable.qml+27 tests/qmltests/Dash/Apps/tst_AppPreview.qml+60−24 tests/qmltests/Dash/Apps/tst_RunningApplicationsGrid.qml+24−4 tests/qmltests/Dash/Movie/tst_MoviePreview.qml+85 tests/qmltests/Dash/Video/tst_VideoPreview.qml−63 tests/qmltests/Dash/qml/FakeScopeView.qml+3−9 tests/qmltests/Dash/tst_DashContent.qml+29−5 tests/qmltests/Dash/tst_DashPreview.qml+66−19 tests/qmltests/Dash/tst_FilterGrids.qml+1−1 tests/qmltests/Dash/tst_GenericPreview.qml+116 tests/qmltests/Greeter/tst_Clock.qml+8−22 tests/qmltests/Greeter/tst_Infographics.qml+4−4 tests/qmltests/Greeter/tst_Phone.qml+16 tests/qmltests/Notifications/tst_Notifications.qml+7−2 tests/qmltests/Panel/tst_IndicatorRow.qml+3−3 tests/qmltests/tst_GreeterShell.qml+1−1 tests/qmltests/tst_Shell.qml+119−1
Bottombar/Bottombar.qml+82−17
@@ -34,15 +34,32 @@ Item {
3434
3535 state: "hidden"
3636
37+ function hide() {
38+ dismissTimer.stop()
39+ bottombar.state = "hidden"
40+ }
41+
42+ onApplicationIsOnForegroundChanged: {
43+ if (!applicationIsOnForeground) {
44+ hide()
45+ }
46+ }
47+
3748 onStateChanged: {
3849 if (state == "hidden") {
3950 dismissTimer.stop()
51+ bottomBarVisibilityCommunicatorShell.forceHidden = false
4052 } else {
4153 dismissTimer.restart()
4254 }
4355 }
4456
4557 onPreventHidingChanged: {
58+ if (!preventHiding) {
59+ if (state == "hint" || state == "reveal")
60+ hide()
61+ }
62+
4663 if (dismissTimer.running) {
4764 dismissTimer.restart();
4865 }
@@ -50,7 +67,7 @@ Item {
5067
5168 Timer {
5269 id: dismissTimer
53− interval: 5000
70+ interval: 1000
5471 onTriggered: {
5572 if (!bottombar.preventHiding) {
5673 bottombar.state = "hidden"
@@ -103,24 +120,29 @@ Item {
103120
104121 EdgeDragArea {
105122 id: dragArea
123+ objectName: "hudDragArea"
106124 width: parent.width
107− height: distanceThreshold
125+ height: shell.edgeSize
108126 anchors.bottom: parent.bottom
109127
110− distanceThreshold: units.gu(1)
128+ distanceThreshold: units.gu(8)
111129 enabled: !theHud.shown && bottombar.enabled && applicationIsOnForeground
112130 direction: Direction.Upwards
131+ maxSilenceTime: 2000
113132
114133 property int previousStatus: -1
115134 property real touchStartX: -1
116135
136+ readonly property real distanceFromThreshold: (-distance) - distanceThreshold // distance is negative
137+ readonly property real revealDistance: units.gu(2)
138+ readonly property real commitDistance: units.gu(6)
139+ readonly property real commitProgress: MathLocal.clamp(distanceFromThreshold / commitDistance, 0, 1)
140+
117141 onStatusChanged: {
118142 if (status === DirectionalDragArea.WaitingForTouch) {
119143 if (previousStatus == DirectionalDragArea.Recognized) {
120144 if (hudButton.mouseOver) {
121145 hudButton.clicked()
122− } else {
123− bottombar.state = "hidden"
124146 }
125147 }
126148 } else if (status === DirectionalDragArea.Undecided) {
@@ -128,35 +150,78 @@ Item {
128150 touchStartX = touchX
129151 }
130152 } else if (status === DirectionalDragArea.Recognized) {
131− bottombar.state = "shown"
153+ bottombar.state = "hint"
132154 }
133155 previousStatus = status
134156 }
157+
158+ onDistanceChanged: {
159+ if (status === DirectionalDragArea.Recognized) {
160+ if (distanceFromThreshold > commitDistance)
161+ bottombar.state = "shown"
162+ else if (distanceFromThreshold > revealDistance)
163+ bottombar.state = "reveal"
164+ }
165+ }
166+ }
167+
168+ Item {
169+ id: dismissArea
170+ anchors {
171+ top: parent.top
172+ left: parent.left
173+ right: parent.right
174+ }
175+ height: parent.height - bottomBarVisibilityCommunicatorShell.position
176+
177+ MouseArea {
178+ anchors.fill: parent
179+ enabled: bottombar.state == "shown"
180+ onPressed: {
181+ bottomBarVisibilityCommunicatorShell.forceHidden = true
182+ bottombar.state = "hidden"
183+ }
184+ }
185+
186+ InputFilterArea {
187+ anchors.fill: parent
188+ blockInput: (hudButton.opacity == 1)
189+ }
135190 }
136191
137192 MouseArea {
138− anchors.fill: parent
139− enabled: bottombar.state == "shown"
193+ anchors {
194+ top: dismissArea.bottom
195+ left: parent.left
196+ right: parent.right
197+ bottom: parent.bottom
198+ }
199+ enabled: bottombar.state == "shown" && bottomBarVisibilityCommunicatorShell.position > 0
140200 onPressed: {
141201 bottombar.state = "hidden"
142202 }
143203 }
144204
145− InputFilterArea {
146− anchors.fill: parent
147− blockInput: (hudButton.opacity == 1)
148− }
149−
150205 states: [
151206 State {
152207 name: "hidden"
153− PropertyChanges { target: hudButton; opacity: 0}
154− PropertyChanges { target: hudButton; bottomMargin: units.gu(-1)}
208+ PropertyChanges { target: hudButton; opacity: 0 }
209+ PropertyChanges { target: hudButton; bottomMargin: units.gu(-2) }
210+ },
211+ State {
212+ name: "hint"
213+ extend: "hidden"
214+ PropertyChanges { target: hudButton; opacity: 0.5 }
215+ },
216+ State {
217+ name: "reveal"
218+ extend: "hint"
219+ PropertyChanges { target: hudButton; bottomMargin: units.gu(-2) + units.gu(2) * dragArea.commitProgress }
155220 },
156221 State {
157222 name: "shown"
158− PropertyChanges { target: hudButton; opacity: 1}
159− PropertyChanges { target: hudButton; bottomMargin: units.gu(0)}
223+ PropertyChanges { target: hudButton; opacity: 1 }
224+ PropertyChanges { target: hudButton; bottomMargin: units.gu(0) }
160225 }
161226 ]
162227}
CMakeLists.txt−1
@@ -96,7 +96,6 @@ enable_testing()
9696# Autopilot tests
9797include(autopilot)
9898declare_autopilot_test(shell unity8.shell ${CMAKE_SOURCE_DIR}/tests/autopilot/)
99−declare_autopilot_test(indicators_client unity8.indicators_client ${CMAKE_SOURCE_DIR}/tests/autopilot/)
10099
101100set(SHELL_APP unity8)
102101set(GREETER_APP unity8-greeter)
Components/ApplicationManagerWrapper.qml+13−30
@@ -18,19 +18,20 @@ import QtQuick 2.0
1818import Unity.Application 0.1
1919
2020Item {
21− id: applicationManager
21+ id: root
2222
2323 property alias mainStageApplications: mainStageModel
2424 property alias sideStageApplications: sideStageModel
2525 property variant mainStageFocusedApplication: null
2626 property variant sideStageFocusedApplication: null
2727 property bool sideStageEnabled: true
28− signal focusRequested(string desktopFile)
2928 property bool keyboardVisible: ApplicationManager.keyboardVisible
3029 property int keyboardHeight: ApplicationManager.keyboardHeight
3130
3231 property bool fake: ApplicationManager.fake ? ApplicationManager.fake : false
3332
33+ signal focusRequested(string appId)
34+
3435 ApplicationsModelStageFiltered {
3536 id: mainStageModel
3637 stage: ApplicationInfo.MainStage
@@ -62,6 +63,16 @@ Item {
6263 }
6364 }
6465 }
66+
67+ onFocusRequested: {
68+ // if no side stage enabled, override application's stage parameter
69+ var app = ApplicationManager.findApplication(appId);
70+ if (app && app.stage === ApplicationInfo.SideStage && !sideStageEnabled) {
71+ app.stage = ApplicationInfo.MainStage;
72+ }
73+
74+ root.focusRequested(appId);
75+ }
6576 }
6677
6778 function activateApplication(desktopFile, argument) {
@@ -155,32 +166,4 @@ Item {
155166 }
156167 return desktopFile.substring(left+1, right);
157168 }
158−
159− Connections {
160− target: ApplicationManager
161− onFocusRequested: {
162− // FIXME: hardcoded mapping from ApplicationManager.FavoriteApplications
163− // enum to desktop files
164− var desktopFile
165− if (favoriteApplication == ApplicationManager.CameraApplication) {
166− desktopFile = "/usr/share/applications/camera-app.desktop"
167− } else if (favoriteApplication == ApplicationManager.GalleryApplication) {
168− desktopFile = "/usr/share/applications/gallery-app.desktop"
169− } else if (favoriteApplication == ApplicationManager.ShareApplication) {
170− desktopFile = "/usr/share/applications/share-app.desktop"
171− } else if (favoriteApplication == ApplicationManager.BrowserApplication) {
172− desktopFile = "/usr/share/applications/webbrowser-app.desktop"
173− } else if (favoriteApplication == ApplicationManager.PhoneApplication) {
174− desktopFile = "/usr/share/applications/phone-app.desktop"
175− } else if (favoriteApplication == ApplicationManager.DialerApplication) {
176− desktopFile = "/usr/share/applications/dialer-app.desktop"
177− } else if (favoriteApplication == ApplicationManager.MessagingApplication) {
178− desktopFile = "/usr/share/applications/messaging-app.desktop"
179− } else if (favoriteApplication == ApplicationManager.AddressbookApplication) {
180− desktopFile = "/usr/share/applications/address-book-app.desktop"
181− }
182−
183− applicationManager.focusRequested(desktopFile);
184− }
185− }
186169}
Components/BasicShell.qml−4
@@ -63,10 +63,6 @@ FocusScope {
6363 }
6464 }
6565
66− OSKController {
67− anchors.fill: parent // as needs to know the geometry of the shell
68− }
69−
7066 VolumeControl {
7167 id: volumeControl
7268 }
Components/DragHandle.qml−1
@@ -208,5 +208,4 @@ EdgeDragArea {
208208
209209 d.previousStatus = status;
210210 }
211−
212211}
Components/EdgeDemoOverlay.qml+9−2
@@ -121,7 +121,6 @@ Showable {
121121
122122 Column {
123123 id: labelGroup
124− layer.enabled: true // otherwise the underlining on "Skip intro" jumps
125124 spacing: units.gu(3)
126125
127126 anchors {
@@ -150,7 +149,15 @@ Showable {
150149 text: i18n.tr("Skip intro")
151150 color: UbuntuColors.orange
152151 fontSize: "small"
153− font.underline: true
152+
153+ Icon {
154+ anchors.left: parent.right
155+ anchors.verticalCenter: parent.verticalCenter
156+ height: units.dp(12)
157+ width: units.dp(12)
158+ name: "chevron"
159+ color: UbuntuColors.orange
160+ }
154161
155162 MouseArea {
156163 // Make clickable area bigger than just the link because
Components/FilterGrid.qml+2−1
@@ -57,6 +57,8 @@ Item {
5757 property alias delegate: iconTileGrid.delegate
5858 property alias cellWidth: iconTileGrid.cellWidth
5959 property alias cellHeight: iconTileGrid.cellHeight
60+ property alias delegateCreationBegin: iconTileGrid.delegateCreationBegin
61+ property alias delegateCreationEnd: iconTileGrid.delegateCreationEnd
6062 readonly property alias flicking: iconTileGrid.flicking
6163 readonly property alias moving: iconTileGrid.moving
6264 readonly property alias pressDelay: iconTileGrid.pressDelay
@@ -102,6 +104,5 @@ Item {
102104 model: root.model
103105 limit: (filter && !filterAnimation.running) ? collapsedRowCount * iconTileGrid.columns : -1
104106 }
105−
106107 }
107108}
Components/LazyImage.qmlnew file+185
@@ -0,0 +1,185 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * Authors:
5+ * Michał Sawicz <michal.sawicz@canonical.com>
6+ *
7+ * This program is free software; you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation; version 3.
10+ *
11+ * This program is distributed in the hope that it will be useful,
12+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+ * GNU General Public License for more details.
15+ *
16+ * You should have received a copy of the GNU General Public License
17+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
18+ */
19+
20+import QtQuick 2.0
21+import Ubuntu.Components 0.1
22+
23+Item {
24+ id: root
25+
26+ property url source
27+ // TODO convert into enums when available in QML
28+ property string scaleTo
29+
30+ property real initialWidth: scaleTo == "width" || scaleTo == "fit" ? width : units.gu(10)
31+ property real initialHeight: scaleTo == "height" || scaleTo == "fit" ? height : units.gu(10)
32+
33+ property alias sourceSize: image.sourceSize
34+ property alias fillMode: image.fillMode
35+ property alias asynchronous: image.asynchronous
36+ property alias cache: image.cache
37+ property alias horizontalAlignment: image.horizontalAlignment
38+ property alias verticalAlignment: image.verticalAlignment
39+
40+ state: "default"
41+
42+ onSourceChanged: {
43+ if (state === "ready") {
44+ state = "default";
45+ image.nextSource = source;
46+ } else {
47+ image.source = source;
48+ }
49+ }
50+
51+ UbuntuShape {
52+ id: placeholder
53+ objectName: "placeholder"
54+ color: "#22FFFFFF"
55+ anchors.fill: shape
56+ visible: opacity != 0
57+
58+ ActivityIndicator {
59+ id: activity
60+ anchors.centerIn: parent
61+ opacity: 0
62+ visible: opacity != 0
63+
64+ running: visible
65+ }
66+
67+ Image {
68+ id: errorImage
69+ objectName: "errorImage"
70+ anchors.centerIn: parent
71+ opacity: 0
72+ visible: opacity != 0
73+
74+ source: "graphics/close.png"
75+ sourceSize { width: units.gu(3); height: units.gu(3) }
76+ }
77+ }
78+
79+ UbuntuShape {
80+ id: shape
81+ objectName: "shape"
82+ height: root.initialHeight
83+ width: root.initialWidth
84+ anchors.centerIn: root.scaleTo == "fit" ? parent : undefined
85+
86+ opacity: 0
87+ visible: opacity != 0
88+
89+ image: Image {
90+ id: image
91+ objectName: "image"
92+
93+ property url nextSource
94+ property string format: image.implicitWidth > image.implicitHeight ? "landscape" : "portrait"
95+
96+ fillMode: Image.PreserveAspectFit
97+ asynchronous: true
98+ cache: false
99+ horizontalAlignment: Image.AlignHCenter
100+ verticalAlignment: Image.AlignVCenter
101+ sourceSize.width: root.scaleTo == "width" ? root.width
102+ : root.scaleTo == "fit" && root.width < root.height ? root.width
103+ : undefined
104+ sourceSize.height: root.scaleTo == "height" ? root.height
105+ : root.scale == "fit" && root.height < root.width ? root.height
106+ : undefined
107+ }
108+ }
109+
110+ states: [
111+ State {
112+ name: "default"
113+ when: image.source == ""
114+ PropertyChanges { target: root; implicitWidth: root.initialWidth; implicitHeight: root.initialHeight }
115+ PropertyChanges { target: errorImage; opacity: 0 }
116+ },
117+ State {
118+ name: "loading"
119+ extend: "default"
120+ when: image.status === Image.Loading
121+ PropertyChanges { target: activity; opacity: 1 }
122+ },
123+ State {
124+ name: "ready"
125+ when: image.status === Image.Ready && image.source != ""
126+ PropertyChanges { target: root; implicitWidth: shape.width; implicitHeight: shape.height }
127+ PropertyChanges { target: placeholder; opacity: 0 }
128+ PropertyChanges { target: shape; opacity: 1
129+ width: root.scaleTo == "width" || (root.scaleTo == "fit" && image.format == "landscape") ? root.width
130+ : root.scaleTo == "" ? image.implicitWidth : image.implicitWidth * height / image.implicitHeight
131+ height: root.scaleTo == "height" || (root.scaleTo == "fit" && image.format == "portrait") ? root.height
132+ : root.scaleTo == "" ? image.implicitHeight : image.implicitHeight * width / image.implicitWidth
133+ }
134+ },
135+ State {
136+ name: "error"
137+ extend: "default"
138+ when: image.status === Image.Error
139+ PropertyChanges { target: errorImage; opacity: 1.0 }
140+ }
141+ ]
142+
143+ transitions: [
144+ Transition {
145+ to: "ready"
146+ objectName: "readyTransition"
147+ SequentialAnimation {
148+ PropertyAction { target: shape; property: "visible" }
149+ ParallelAnimation {
150+ NumberAnimation { target: shape; property: "opacity"; easing.type: Easing.Linear }
151+ UbuntuNumberAnimation { target: root; properties: "implicitWidth,implicitHeight" }
152+ UbuntuNumberAnimation { target: shape; properties: "width,height" }
153+ NumberAnimation {
154+ targets: [placeholder, activity, errorImage]; property: "opacity";
155+ easing.type: Easing.Linear; duration: UbuntuAnimation.SnapDuration
156+ }
157+ }
158+ }
159+ },
160+
161+ Transition {
162+ to: "*"
163+ objectName: "genericTransition"
164+ SequentialAnimation {
165+ ParallelAnimation {
166+ NumberAnimation { target: shape; property: "opacity"; easing.type: Easing.Linear }
167+ NumberAnimation {
168+ targets: [placeholder, activity, errorImage]; property: "opacity";
169+ easing.type: Easing.Linear; duration: UbuntuAnimation.SnapDuration
170+ }
171+ UbuntuNumberAnimation { target: root; properties: "implicitWidth,implicitHeight" }
172+ UbuntuNumberAnimation { target: shape; properties: "width,height" }
173+ }
174+ PropertyAction { target: shape; property: "visible" }
175+ }
176+
177+ onRunningChanged: {
178+ if (!running && state === "default" && image.nextSource !== "") {
179+ image.source = image.nextSource;
180+ image.nextSource = "";
181+ }
182+ }
183+ }
184+ ]
185+}
Components/ListItems/Header.qml+1−1
@@ -28,7 +28,7 @@ Item {
2828
2929 signal clicked(variant mouse)
3030
31− height: units.gu(4.5)
31+ height: units.gu(5)
3232
3333 Item {
3434 anchors {
Components/PageHeader.qml+44−1
@@ -19,6 +19,7 @@ import Ubuntu.Components 0.1
1919import Ubuntu.Components.Popups 0.1
2020import Ubuntu.Components.ListItems 0.1 as ListItem
2121import SessionManager 0.1
22+import Unity 0.1
2223
2324Item {
2425 /*!
@@ -31,6 +32,7 @@ Item {
3132 property bool searchEntryEnabled: false
3233 property alias searchQuery: searchField.text
3334 property ListModel searchHistory: SearchHistoryModel {}
35+ property Scope scope
3436
3537 height: units.gu(8.5)
3638 implicitHeight: units.gu(8.5)
@@ -149,7 +151,7 @@ Item {
149151 hasClearButton: false
150152
151153 primaryItem: AbstractButton {
152− enabled: searchField.text != ""
154+ enabled: searchField.text != "" && !searchIndicator.running
153155 onClicked: {
154156 if (searchField.text != "") {
155157 searchHistory.addQuery(searchField.text)
@@ -159,8 +161,22 @@ Item {
159161 height: parent.height
160162 width: height
161163
164+ ActivityIndicator {
165+ id: searchIndicator
166+ objectName: "searchIndicator"
167+
168+ anchors {
169+ verticalCenter: parent.verticalCenter
170+ left: parent.left
171+ leftMargin: units.gu(0.5)
172+ }
173+
174+ running: opacity > 0
175+ }
176+
162177 Image {
163178 id: primaryImage
179+ objectName: "primaryImage"
164180 anchors {
165181 verticalCenter: parent.verticalCenter
166182 left: parent.left
@@ -168,6 +184,7 @@ Item {
168184 }
169185 width: units.gu(3)
170186 height: units.gu(3)
187+ visible: opacity > 0
171188 }
172189
173190 Item {
@@ -186,6 +203,32 @@ Item {
186203 onActiveFocusChanged: {
187204 if (!activeFocus) searchContainer.closePopover()
188205 }
206+
207+ states: [
208+ State {
209+ name: "searching"
210+ when: scope && scope.searchInProgress
211+ PropertyChanges { target: searchIndicator; running: true; opacity: 1 }
212+ PropertyChanges { target: primaryImage; opacity: 0 }
213+ },
214+ State {
215+ name: "idle"
216+ when: !scope || !scope.searchInProgress
217+ PropertyChanges { target: searchIndicator; opacity: 0 }
218+ PropertyChanges { target: primaryImage; opacity: 1 }
219+ }
220+ ]
221+
222+ transitions: [
223+ Transition {
224+ to: "searching"
225+ reversible: true
226+ SequentialAnimation {
227+ NumberAnimation { target: primaryImage; property: "opacity"; duration: UbuntuAnimation.FastDuration; easing.type: Easing.Linear }
228+ NumberAnimation { target: searchIndicator; property: "opacity"; duration: UbuntuAnimation.FastDuration; easing.type: Easing.Linear }
229+ }
230+ }
231+ ]
189232 }
190233
191234 states: [
Greeter/PinPadButton.qml → Components/PinPadButton.qmlrenamed

The content is the same.

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

Binary file not shown.

Dash/Apps/AppPreview.qml+70−123
@@ -16,153 +16,101 @@
1616
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
19−import Ubuntu.Components.ListItems 0.1 as ListItem
20−import Ubuntu.DownloadDaemonListener 0.1
19+import Ubuntu.Components.ListItems 0.1 as ListItems
2120import ".."
21+import "../Generic"
22+import "../Previews"
2223import "../../Components"
2324
24−DashPreview {
25+GenericPreview {
2526 id: root
2627
2728 signal sendUserReview(string review)
2829
29− title: root.previewData.title
30+ previewImages: previewImagesComponent
31+ description: descriptionComponent
32+ header: headerComponent
3033
31− header: ListView {
32− spacing: units.gu(1)
33− orientation: ListView.Horizontal
34− height: units.gu(22)
35− anchors {
36− left: parent.left
37− right: parent.right
38− margins: units.gu(1)
39− }
40− model: previewData.infoMap["more-screenshots"] != null ? previewData.infoMap["more-screenshots"].value : [previewData.image]
34+ // TODO: Ratings are not yet complete... enable this once they work
35+ //ratings: ratingsComponent
4136
42− delegate: UbuntuShape {
43− id: shape
44− anchors {
45− top: parent.top
46− bottom: parent.bottom
37+ Component {
38+ id: previewImagesComponent
39+ ListView {
40+ id: previewImageListView
41+ spacing: units.gu(1)
42+ orientation: ListView.Horizontal
43+ height: units.gu(22)
44+ model: previewData.infoMap["more-screenshots"] != null ? previewData.infoMap["more-screenshots"].value : [previewData.image]
45+ cacheBuffer: width * 3
46+
47+ LazyImage {
48+ objectName: "placeholderScreenshot"
49+ anchors {
50+ top: parent.top
51+ bottom: parent.bottom
52+ }
53+ scaleTo: "height"
54+ source: "broken_image"
55+ initialWidth: units.gu(13)
56+ visible: previewImageListView.count == 0
4757 }
48− width: units.gu(12)
49− radius: "medium"
50− borderSource: ""
51− image: Image {
52− asynchronous: true
53− sourceSize { width: shape.width; height: shape.height }
58+
59+ delegate: LazyImage {
60+ id: shape
61+ anchors {
62+ top: parent.top
63+ bottom: parent.bottom
64+ }
5465 source: modelData ? modelData : ""
55− fillMode: Image.PreserveAspectCrop
66+ scaleTo: "height"
67+ initialWidth: units.gu(13)
5668 }
5769 }
5870 }
5971
6072 Component {
61− id: buttonsComponent
62−
63− GridView {
64− id: buttonsGrid
65− objectName: "gridButtons"
66−
67− property int numOfRows: (count + 1) / 2
68− property int spacing: units.gu(1)
69− height: Math.max(units.gu(5), units.gu(5)*numOfRows + spacing*(numOfRows - 1))
70−
71− interactive: false
72− cellWidth: Math.max(units.gu(9), width / 2)
73− cellHeight: buttonHeight + spacing
74− property int buttonWidth: count > 1 ? Math.max(0, width / 2 - spacing) : width
75− property int buttonHeight: units.gu(5)
76−
77− delegate: Button {
78− width: Math.max(units.gu(4), buttonsGrid.buttonWidth)
79− height: buttonsGrid.buttonHeight
80− color: Theme.palette.selected.foreground
81− text: modelData.displayName
82− iconSource: modelData.iconHint
83− iconPosition: "right"
84− onClicked: root.previewData.execute(modelData.id, { })
85− }
73+ id: headerComponent
74+ Header {
75+ objectName: "previewHeader"
76+ title: previewData.title
77+ icon: previewData.appIcon
78+ subtitle: root.previewData.infoMap["publisher"] ? root.previewData.infoMap["publisher"].value : ""
79+ rating: Math.round(root.previewData.rating * 10)
80+ reviews: root.previewData.numRatings
81+ rated: root.previewData.infoMap["rated"] ? root.previewData.infoMap["rated"].value : 0
8682 }
8783 }
8884
8985 Component {
90− id: progressComponent
91−
92− ProgressBar {
93− id: progressBar
94− objectName: "progressBar"
95− value: 0
96− maximumValue: 100
97− height: units.gu(5)
98−
99− property var model
100−
101− DownloadTracker {
102− service: "com.canonical.applications.Downloader"
103− dbusPath: root.previewData.infoMap["progressbar_source"] ? root.previewData.infoMap["progressbar_source"].value : ""
104−
105− onProgress: {
106− var percentage = parseInt(received * 100 / total);
107− progressBar.value = percentage;
108− }
109−
110− onFinished: {
111− root.previewData.execute(progressBar.model[0].id, { })
112− }
86+ id: descriptionComponent
87+ Column {
88+ spacing: units.gu(1)
11389
114− onError: {
115− root.previewData.execute(progressBar.model[1].id, { "error": error });
116− }
90+ Label {
91+ anchors { left: parent.left; right: parent.right }
92+ text: root.previewData.description
93+ fontSize: "medium"
94+ color: Theme.palette.selected.backgroundText
95+ opacity: .6
96+ wrapMode: Text.WordWrap
97+ style: Text.Raised
98+ styleColor: "black"
11799 }
118−
119− }
120− }
121−
122− buttons: Loader {
123− anchors {
124− left: parent.left
125− right: parent.right
126− }
127−
128− sourceComponent: root.previewData.infoMap["show_progressbar"] ? progressComponent : buttonsComponent
129−
130− onLoaded: {
131− item.model = root.previewData.actions;
132100 }
133101 }
134102
135− body: Column {
136− spacing: units.gu(1)
137−
138− AppInfo {
139− objectName: "appInfo"
140− anchors { left: parent.left; right: parent.right }
141−
142− appName: root.previewData.title
143− icon: root.previewData.appIcon
144− rating: Math.round(root.previewData.rating * 10)
145− reviews: root.previewData.numRatings
146− rated: root.previewData.infoMap["rated"] ? root.previewData.infoMap["rated"].value : 0
147− }
148−
149− Label {
150− anchors { left: parent.left; right: parent.right }
151− text: root.previewData.description
152− fontSize: "medium"
153− color: Theme.palette.selected.backgroundText
154− opacity: .6
155− wrapMode: Text.WordWrap
156− style: Text.Raised
157− styleColor: "black"
158− }
159−
103+ Component {
104+ id: ratingsComponent
160105 Column {
106+ id: columnReviewRating
107+ objectName: "columnReviewRating"
161108 visible: root.previewData.rating >= 0
162− anchors { left: parent.left; right: parent.right }
163− spacing: parent.spacing
164109
165− ListItem.ThinDivider { }
110+ spacing: units.gu(1)
111+ height: childrenRect.height
112+
113+ ListItems.ThinDivider { }
166114
167115 Item {
168116 anchors { left: parent.left; right: parent.right }
@@ -188,13 +136,12 @@ DashPreview {
188136 }
189137 }
190138
191− ListItem.ThinDivider { }
139+ ListItems.ThinDivider { }
192140
193− AppReviews {
141+ Reviews {
194142 id: appReviews
195143 objectName: "appReviews"
196− // TODO: This should make this visible when the feature for reviews/comments is complete.
197− visible: false
144+
198145 anchors { left: parent.left; right: parent.right }
199146
200147 model: root.previewData.infoMap["comments"] ? root.previewData.infoMap["comments"].value : undefined
Dash/Apps/AppsAvailableForDownloadModel.qmldeleted−81
@@ -1,81 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import "../../Applications"
19−
20−ListModel {
21− ListElement {
22− uri: "application://evernote.desktop"
23− icon: "../../graphics/applicationIcons/evernote.png"
24− category: 0
25− mimetype: "application/x-desktop"
26− title: "Evernote"
27− comment: ""
28− dndUri: "file:///usr/share/applications/evernote.desktop"
29− metadata: ""
30− }
31− ListElement {
32− uri: "application://map.desktop"
33− icon: "../../graphics/applicationIcons/map.png"
34− category: 0
35− mimetype: "application/x-desktop"
36− title: "Map"
37− comment: ""
38− dndUri: "file:///usr/share/applications/map.desktop"
39− metadata: ""
40− }
41− ListElement {
42− uri: "application://pinterest.desktop"
43− icon: "../../graphics/applicationIcons/pinterest.png"
44− category: 0
45− mimetype: "application/x-desktop"
46− title: "Pinterest"
47− comment: ""
48− dndUri: "file:///usr/share/applications/pinterest.desktop"
49− metadata: ""
50− }
51− ListElement {
52− uri: "application://soundcloud.desktop"
53− icon: "../../graphics/applicationIcons/soundcloud.png"
54− category: 0
55− mimetype: "application/x-desktop"
56− title: "Soundcloud"
57− comment: ""
58− dndUri: "file:///usr/share/applications/soundcloud.desktop"
59− metadata: ""
60− }
61− ListElement {
62− uri: "application://wikipedia.desktop"
63− icon: "../../graphics/applicationIcons/wikipedia.png"
64− category: 0
65− mimetype: "application/x-desktop"
66− title: "Wikipedia"
67− comment: ""
68− dndUri: "file:///usr/share/applications/wikipedia.desktop"
69− metadata: ""
70− }
71− ListElement {
72− uri: "application://youtube.desktop"
73− icon: "../../graphics/applicationIcons/youtube.png"
74− category: 0
75− mimetype: "application/x-desktop"
76− title: "Youtube"
77− comment: ""
78− dndUri: "file:///usr/share/applications/youtube.desktop"
79− metadata: ""
80− }
81−}
Dash/Apps/DashPluginFilterGrid.qmlnew file+49
@@ -0,0 +1,49 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+import "../../Components"
20+import "../Generic"
21+
22+GenericFilterGrid {
23+ id: filtergrid
24+
25+ delegate: Tile {
26+ id: tile
27+ objectName: "delegate" + index
28+ width: filtergrid.cellWidth
29+ height: filtergrid.cellHeight
30+ text: model.title
31+ imageWidth: filtergrid.iconWidth
32+ imageHeight: filtergrid.iconHeight
33+ source: model.icon
34+
35+ style: FlatTileStyle {
36+ disabled: model.rendererHints['scope_disabled'] === 1;
37+ }
38+
39+ onClicked: {
40+ var data = { model: model }
41+ filtergrid.clicked(index, data, tile.y)
42+ }
43+
44+ onPressAndHold: {
45+ var data = { model: model }
46+ filtergrid.pressAndHold(index, data, tile.y)
47+ }
48+ }
49+}
Dash/Apps/FrequentlyUsedAppsModel.qml+4−4
@@ -68,13 +68,13 @@ ListModel {
6868 metadata: ""
6969 }
7070 ListElement {
71− uri: "application:///usr/share/applications/facebook-webapp.desktop"
71+ uri: "appid://com.ubuntu.developer.webapps.webapp-facebook/webapp-facebook/current-user-version"
7272 icon: "../../graphics/applicationIcons/facebook.png"
7373 category: 0
7474 mimetype: "application/x-desktop"
7575 title: "Facebook"
7676 comment: ""
77− dndUri: "file:///usr/share/applications/facebook-webapp.desktop"
77+ dndUri: "appid://com.ubuntu.developer.webapps.webapp-facebook/webapp-facebook/current-user-version"
7878 metadata: ""
7979 }
8080 ListElement {
@@ -88,13 +88,13 @@ ListModel {
8888 metadata: ""
8989 }
9090 ListElement {
91− uri: "application:///usr/share/applications/gmail-webapp.desktop"
91+ uri: "appid://com.ubuntu.developer.webapps.webapp-gmail/webapp-gmail/current-user-version"
9292 icon: "../../graphics/applicationIcons/gmail.png"
9393 category: 0
9494 mimetype: "application/x-desktop"
9595 title: "GMail"
9696 comment: ""
97− dndUri: "file:///usr/share/applications/gmail-webapp.desktop"
97+ dndUri: "appid://com.ubuntu.developer.webapps.webapp-gmail/webapp-gmail/current-user-version"
9898 metadata: ""
9999 }
100100 ListElement {
Dash/Apps/RunningApplicationTile.qml+9−5
@@ -39,9 +39,7 @@ AbstractButton {
3939 property bool terminationModeEnabled: false
4040
4141 onClicked: {
42− if (terminationModeEnabled)
43− requestedApplicationTermination(application)
44− else
42+ if (!terminationModeEnabled)
4543 requestedApplicationActivation(application)
4644 }
4745
@@ -123,9 +121,10 @@ AbstractButton {
123121 }
124122
125123 CloseIcon {
124+ objectName: "closeIcon " + model.name
126125 anchors {
127− right: shapedApplicationImage.right
128− rightMargin: -units.gu(1)
126+ left: shapedApplicationImage.left
127+ leftMargin: -units.gu(1)
129128 top: parent.top
130129 topMargin: -units.gu(1)
131130 }
@@ -133,5 +132,10 @@ AbstractButton {
133132 width: units.gu(6)
134133 id: closeIcon
135134 enabled: root.terminationModeEnabled
135+
136+ MouseArea {
137+ anchors { fill: parent; margins: -units.gu(1) }
138+ onClicked: requestedApplicationTermination(application)
139+ }
136140 }
137141}
Dash/Apps/RunningApplicationsGrid.qml+20−1
@@ -22,6 +22,8 @@ ResponsiveFlowView {
2222 clip: true
2323
2424 signal updateScreenshots
25+ property alias enableHeightBehavior: heightBehaviour.enabled
26+ property bool enableHeightBehaviorOnNextCreation: firstModel.count + secondModel.count == 0
2527
2628 Connections {
2729 target: shell
@@ -29,7 +31,24 @@ ResponsiveFlowView {
2931 onStageScreenshotsReadyChanged: if (shell.dashShown && shell.stageScreenshotsReady) updateScreenshots();
3032 }
3133
32− Behavior on height { NumberAnimation { duration: 200; easing.type: Easing.InOutQuad } }
34+ Behavior on height {
35+ id: heightBehaviour
36+ enabled: false
37+ NumberAnimation { duration: 200; easing.type: Easing.InOutQuad }
38+ }
39+
40+ Connections {
41+ target: root.firstModel
42+ onCountChanged: {
43+ heightBehaviour.enabled = true;
44+ }
45+ }
46+ Connections {
47+ target: root.secondModel
48+ onCountChanged: {
49+ heightBehaviour.enabled = true;
50+ }
51+ }
3352
3453 property bool canEnableTerminationMode: true
3554
Dash/Dash.qml+3
@@ -22,6 +22,9 @@ import "../Components"
2222
2323Showable {
2424 id: dash
25+ objectName: "dash"
26+
27+ visible: shown
2528
2629 property alias contentProgress: dashContent.contentProgress
2730 property string showScopeOnLoaded: "home.scope"
Dash/DashApps.qml+2
@@ -24,6 +24,7 @@ import "Apps"
2424
2525GenericScopeView {
2626 id: scopeView
27+ objectName: "DashApps"
2728
2829 // FIXME: a way to aggregate these models would be ideal
2930 property var mainStageApplicationsModel: shell.applicationManager.mainStageApplications
@@ -51,5 +52,6 @@ GenericScopeView {
5152
5253 onScopeChanged: {
5354 scopeView.scope.categories.overrideResults("recent", runningApplicationsModel);
55+ enableHeightBehaviorOnNextCreation = (mainStageApplicationsModel.count + sideStageApplicationModel.count == 0)
5456 }
5557}
Dash/DashContent.qml+7−6
@@ -83,7 +83,7 @@ Item {
8383 id: dashContentList
8484 objectName: "dashContentList"
8585
86− interactive: dashContent.scopes.loaded
86+ interactive: dashContent.scopes.loaded && !currentItem.previewShown && !currentItem.moving
8787
8888 anchors.fill: parent
8989 model: dashContent.model
@@ -114,6 +114,10 @@ Item {
114114 height: ListView.view.height
115115 asynchronous: true
116116 source: scopeMapper.map(scope.id)
117+ objectName: scope.id + " loader"
118+
119+ readonly property bool previewShown: item.previewShown
120+ readonly property bool moving: item.moving
117121
118122 // these are needed for autopilot tests
119123 readonly property string scopeId: scope.id
@@ -122,7 +126,7 @@ Item {
122126
123127 onLoaded: {
124128 item.scope = Qt.binding(function() { return scope })
125− item.isCurrent = Qt.binding(function() { return ListView.isCurrentItem })
129+ item.isCurrent = Qt.binding(function() { return visible && ListView.isCurrentItem })
126130 item.searchHistory = Qt.binding(function() { return shell.searchHistory })
127131 dashContentList.movementStarted.connect(item.movementStarted)
128132 dashContent.positionedAtBeginning.connect(item.positionedAtBeginning)
@@ -134,10 +138,7 @@ Item {
134138 onEndReached: contentEndReached()
135139 onPreviewShownChanged: {
136140 if (item.previewShown) {
137− previewShown()
138− dashContentList.interactive = false
139− } else {
140− dashContentList.interactive = true
141+ dashContent.previewShown()
141142 }
142143 }
143144 }
Dash/DashMusic.qmldeleted−96
@@ -1,96 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import "../Components"
20−import "../Components/ListItems" as ListItems
21−import "Music"
22−
23−ScopeView {
24− id: scopeView
25−
26− property var categoryNames: [
27− i18n.tr("Featured"),
28− i18n.tr("Recent"),
29− i18n.tr("New Releases"),
30− i18n.tr("Top Charting")
31− ]
32−
33− onIsCurrentChanged: {
34− pageHeader.resetSearch();
35− }
36−
37− onMovementStarted: categoryView.showHeader()
38−
39− Binding {
40− target: scopeView.scope
41− property: "searchQuery"
42− value: pageHeader.searchQuery
43− }
44−
45− Connections {
46− target: panel
47− onSearchClicked: if (isCurrent) {
48− pageHeader.triggerSearch()
49− categoryView.showHeader()
50− }
51− }
52−
53− function getRenderer(categoryId) {
54− switch (categoryId) {
55− case "featured": return "Music/MusicCarousel.qml"
56− default: return "Music/MusicFilterGrid.qml"
57− }
58− }
59−
60− ScopeListView {
61− id: categoryView
62− anchors.fill: parent
63− model: scopeView.categories
64−
65− onAtYEndChanged: if (atYEnd) endReached()
66− onMovingChanged: if (moving && atYEnd) endReached()
67−
68− delegate: ListItems.Base {
69− id: base
70− highlightWhenPressed: false
71−
72− property string categoryId: model.categoryId
73−
74− Loader {
75− anchors { top: parent.top; left: parent.left; right: parent.right }
76− source: scopeView.getRenderer(base.categoryId)
77− onLoaded: {
78− item.model = results
79− }
80− }
81− }
82−
83− sectionProperty: "name"
84− sectionDelegate: ListItems.Header {
85− width: categoryView.width
86− text: i18n.tr(section)
87− }
88− pageHeader: PageHeader {
89− id: pageHeader
90− width: categoryView.width
91− text: i18n.tr("Music")
92− searchEntryEnabled: true
93− searchHistory: scopeView.searchHistory
94− }
95− }
96−}
Dash/DashPreview.qml+91−93
@@ -23,19 +23,18 @@ Rectangle {
2323 property int keyboardSize: Qt.inputMethod.visible ? Qt.inputMethod.keyboardRectangle.height : 0
2424 property var previewData
2525
26− property string title: ""
2726 property real previewWidthRatio: 0.5
2827
28+ property Component previewImages
2929 property Component header
30− property Component buttons
31− property Component body
30+ property Component actions
31+ property Component description
32+ property Component ratings
3233
33− readonly property bool narrowMode: width <= height
34+ readonly property bool narrowMode: width <= height * 1.5
35+ readonly property int columnWidth: narrowMode ? contentRow.width : (contentRow.width / 3) - contentRow.spacing
3436 readonly property int contentSpacing: units.gu(3)
3537
36− signal close()
37− signal previewImageClicked()
38−
3938 color: Qt.rgba(0, 0, 0, .3)
4039 clip: true
4140
@@ -61,87 +60,32 @@ Rectangle {
6160 anchors.fill: parent
6261 }
6362
64− Item {
65− id: headerRow
66− height: units.gu(4)
67− anchors {
68− top: parent.top
69− left: parent.left
70− right: parent.right
71− margins: root.contentSpacing
72− }
73−
74− MouseArea {
75− anchors {
76− fill: parent
77− leftMargin: -root.contentSpacing
78− rightMargin: -root.contentSpacing
79− topMargin: -root.contentSpacing
80− }
81−
82− onClicked: root.close();
83− }
84−
85− Item {
86− id: labelItem
87− anchors {
88− fill: parent
89− rightMargin: closePreviewImage.width + spacing
90− }
91−
92− property int spacing: units.gu(2)
93−
94− Label {
95− id: title
96− objectName: "titleLabel"
97− anchors {
98− left: parent.left
99− right: parent.right
100− }
101−
102− elide: Text.ElideRight
103− fontSize: "x-large"
104− font.weight: Font.Light
105− color: Theme.palette.selected.backgroundText
106− opacity: 0.9
107− text: root.title
108− style: Text.Raised
109− styleColor: "black"
110− }
111− Image {
112− id: closePreviewImage
113− source: "graphics/tablet/icon_close_preview.png"
114− width: units.gu(4)
115− height: units.gu(1.5)
116− anchors {
117− bottom: title.bottom
118− bottomMargin: units.dp(7)
119− left: parent.left
120− leftMargin: title.paintedWidth + labelItem.spacing
121− }
122− }
123− }
124− }
12563
12664 Row {
12765 id: contentRow
12866 anchors {
12967 left: parent.left
68+ top: parent.top
13069 right: parent.right
131− top: headerRow.bottom
13270 bottom: parent.bottom
133− margins: root.contentSpacing
71+ topMargin: root.contentSpacing
72+ leftMargin: root.contentSpacing
73+ rightMargin: root.contentSpacing
13474 }
75+ height: childrenRect.height
13576
13677 spacing: units.gu(2)
13778
79+
13880 Flickable {
13981 id: leftFlickable
14082 objectName: "leftFlickable"
141− anchors.top: parent.top
142− anchors.bottom: parent.bottom
143− width: root.narrowMode ? contentRow.width : contentRow.width * root.previewWidthRatio
144− contentHeight: leftColumn.height
83+ anchors {
84+ top: parent.top
85+ bottom: parent.bottom
86+ }
87+ width: root.columnWidth
88+ contentHeight: leftColumn.height + root.contentSpacing
14589 anchors.bottomMargin: root.keyboardSize
14690 clip: true
14791
@@ -150,33 +94,44 @@ Rectangle {
15094 Column {
15195 id: leftColumn
15296 objectName: "leftColumn"
97+ height: childrenRect.height
98+ spacing: root.contentSpacing
15399 anchors {
154100 left: parent.left
155101 right: parent.right
156102 }
157− height: childrenRect.height
158− spacing: units.gu(1)
103+ }
104+ }
159105
160− Loader {
161− id: headerLoader
162− anchors.left: parent.left
163− anchors.right: parent.right
164− sourceComponent: root.header
165− }
166− Loader {
167− id: buttonLoader
168− anchors.left: parent.left
169− anchors.right: parent.right
170− sourceComponent: root.buttons
106+ Flickable {
107+ id: centerFlickable
108+ anchors {
109+ top: parent.top
110+ bottom: parent.bottom
111+ }
112+ width: root.columnWidth
113+ contentHeight: centerColumn.height
114+ clip: true
115+
116+ Column {
117+ id: centerColumn
118+ objectName: "centerColumn"
119+ height: childrenRect.height
120+ anchors {
121+ left: parent.left
122+ right: parent.right
171123 }
124+ spacing: root.contentSpacing
172125 }
173126 }
174127
175128 Flickable {
176129 id: rightFlickable
177− anchors.top: parent.top
178− anchors.bottom: parent.bottom
179− width: narrowMode ? 0 : (contentRow.width - leftColumn.width - contentRow.spacing)
130+ anchors {
131+ top: parent.top
132+ bottom: parent.bottom
133+ }
134+ width: root.columnWidth
180135 contentHeight: rightColumn.height
181136 clip: true
182137
@@ -193,9 +148,52 @@ Rectangle {
193148 }
194149
195150 Loader {
151+ id: previewImageLoader
152+ parent: leftColumn
153+ sourceComponent: root.previewImages
154+ anchors {
155+ left: parent.left
156+ right: parent.right
157+ }
158+ }
159+
160+ Loader {
161+ id: ratingsLoader
196162 parent: root.narrowMode ? leftColumn : rightColumn
197− anchors.left: parent.left
198− anchors.right: parent.right
199− sourceComponent: root.body
163+ anchors {
164+ left: parent.left
165+ right: parent.right
166+ }
167+ sourceComponent: root.ratings
168+ }
169+
170+ Loader {
171+ id: descriptionLoader
172+ parent: root.narrowMode ? leftColumn : centerColumn
173+ anchors {
174+ left: parent.left
175+ right: parent.right
176+ }
177+ sourceComponent: root.description
178+ }
179+
180+ Loader {
181+ id: actionsLoader
182+ parent: root.narrowMode ? leftColumn : centerColumn
183+ anchors {
184+ left: parent.left
185+ right: parent.right
186+ }
187+ sourceComponent: root.actions
188+ }
189+
190+ Loader {
191+ id: headerLoader
192+ parent: root.narrowMode ? leftColumn : centerColumn
193+ anchors {
194+ left: parent.left
195+ right: parent.right
196+ }
197+ sourceComponent: root.header
200198 }
201199}
Dash/DashVideos.qmldeleted−201
@@ -1,201 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import "../Components"
20−import "../Components/ListItems" as ListItems
21−import "Video"
22−
23−ScopeView {
24− id: scopeView
25− property alias previewShown: previewLoader.onScreen
26−
27− property var categoryNames: [
28− i18n.tr("Featured"),
29− i18n.tr("Recent"),
30− i18n.tr("New Releases"),
31− i18n.tr("Popular Online")
32− ]
33−
34− onIsCurrentChanged: {
35− pageHeader.resetSearch();
36− }
37−
38− onMovementStarted: categoryView.showHeader()
39−
40− Binding {
41− target: scopeView.scope
42− property: "searchQuery"
43− value: pageHeader.searchQuery
44− }
45−
46− Connections {
47− target: panel
48− onSearchClicked: if (isCurrent) {
49− pageHeader.triggerSearch()
50− categoryView.showHeader()
51− }
52− }
53−
54− function getRenderer(categoryId) {
55− switch (categoryId) {
56− case "featured": return "Video/VideosCarousel.qml"
57− default: return "Video/VideosFilterGrid.qml"
58− }
59− }
60−
61− OpenEffect {
62− id: effect
63− anchors {
64− fill: parent
65− bottomMargin: -bottomOverflow
66− }
67− sourceItem: categoryView
68−
69− enabled: gap > 0.0
70−
71− topGapPx: (1 - gap) * positionPx
72− topOpacity: Math.max(0, (1 - gap * 1.2))
73− bottomGapPx: positionPx + gap * (targetBottomGapPx - positionPx)
74− bottomOverflow: units.gu(6)
75− bottomOpacity: 1 - (gap * 0.8)
76−
77− property int targetBottomGapPx: height - units.gu(8) - bottomOverflow
78− property real gap: previewLoader.open ? 1.0 : 0.0
79−
80− Behavior on gap {
81− NumberAnimation {
82− duration: 200
83− easing.type: Easing.InOutQuad
84− onRunningChanged: {
85− if (!previewLoader.open && !running) {
86− previewLoader.onScreen = false;
87− }
88− }
89− }
90− }
91− }
92−
93− ScopeListView {
94− id: categoryView
95− anchors.fill: parent
96− model: scopeView.categories
97− forceNoClip: previewLoader.onScreen
98−
99− onAtYEndChanged: if (atYEnd) endReached()
100− onMovingChanged: if (moving && atYEnd) endReached()
101−
102− delegate: ListItems.Base {
103− id: base
104− highlightWhenPressed: false
105− property string categoryId: model.categoryId
106−
107− Loader {
108− id: loader
109− anchors { top: parent.top; left: parent.left; right: parent.right }
110− source: scopeView.getRenderer(base.categoryId)
111− onLoaded: {
112− item.model = results
113− }
114−
115− Connections {
116− target: loader.item
117− onClicked: {
118− var dataItem;
119− // VideosCarousel and VideosFilterGrid have different
120− // clicked signals, accomodate for that
121− if (categoryId == "featured") {
122− var fileUri = delegateItem.model.uri.replace(/^[^:]+:/, "")
123− dataItem = {fileUri: fileUri, nfoUri: delegateItem.model.comment}
124− } else {
125− dataItem = data;
126− }
127− if (dataItem.nfoUri != "") {
128− previewLoader.videoData = dataItem;
129− previewLoader.open = true;
130− effect.positionPx = mapToItem(categoryView, 0, itemY).y;
131− }
132− }
133− }
134− }
135− }
136−
137− sectionProperty: "name"
138− sectionDelegate: ListItems.Header {
139− width: categoryView.width
140− text: i18n.tr(section)
141− }
142−
143− pageHeader: PageHeader {
144− id: pageHeader
145− width: categoryView.width
146− text: i18n.tr("Videos")
147− searchEntryEnabled: true
148− searchHistory: scopeView.searchHistory
149− }
150− }
151−
152− Loader {
153− id: previewLoader
154− height: effect.bottomGapPx - effect.topGapPx
155− anchors {
156− top: parent.top
157− topMargin: effect.topGapPx
158− left: parent.left
159− right: parent.right
160− }
161− sourceComponent: onScreen ? previewComponent : undefined
162−
163− property bool open: false
164− property bool onScreen: false
165− property var videoData
166−
167−
168− onOpenChanged: {
169− if (open) {
170− onScreen = true;
171− }
172− }
173−
174− onLoaded: {
175− item.item = videoData;
176− }
177− }
178−
179− Component {
180− id: previewComponent
181−
182− VideoPreview {
183− id: preview
184− anchors.fill: parent
185− onClose: open = false;
186− }
187− }
188−
189− // TODO: Move as InverseMouseArea to DashPreview
190− MouseArea {
191− enabled: previewLoader.onScreen
192− anchors {
193− fill: parent
194− topMargin: effect.bottomGapPx
195− }
196− onClicked: {
197− previewLoader.open = false;
198− }
199− }
200−
201−}
Dash/Generic/FlatTileStyle.qmlnew file+79
@@ -0,0 +1,79 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+
20+Item {
21+ id: tile
22+
23+ property bool disabled: false
24+
25+ anchors.fill: parent
26+
27+ Image {
28+ id: icon
29+ objectName: "image"
30+ width: styledItem.imageWidth
31+ height: styledItem.imageHeight
32+
33+ anchors.horizontalCenter: parent.horizontalCenter
34+
35+ sourceSize { width: width; height: height }
36+ asynchronous: true
37+ cache: false
38+ source: styledItem.source
39+ fillMode: styledItem.fillMode
40+ opacity: tile.disabled ? 0.3 : 1.0
41+ horizontalAlignment: Image.AlignHCenter
42+ verticalAlignment: Image.AlignVCenter
43+ }
44+
45+ UbuntuShape {
46+ id: borderPressed
47+ objectName: "borderPressed"
48+
49+ anchors.fill: icon
50+ radius: "medium"
51+ borderSource: "radius_pressed.sci"
52+ opacity: styledItem.pressed ? 1.0 : 0.0
53+ Behavior on opacity { NumberAnimation { duration: 200; easing.type: Easing.OutQuint } }
54+ }
55+
56+ Label {
57+ id: label
58+ objectName: "label"
59+ anchors {
60+ baseline: icon.bottom
61+ baselineOffset: units.gu(2)
62+ left: parent.left
63+ right: parent.right
64+ leftMargin: units.gu(1)
65+ rightMargin: units.gu(1)
66+ }
67+
68+ color: Theme.palette.selected.backgroundText
69+ opacity: 0.9
70+ style: Text.Raised
71+ styleColor: "black"
72+ fontSize: "small"
73+ elide: Text.ElideMiddle
74+ horizontalAlignment: styledItem.horizontalAlignment
75+ text: styledItem.text
76+ wrapMode: Text.Wrap
77+ maximumLineCount: styledItem.maximumLineCount
78+ }
79+}
Dash/Generic/GenericFilterGrid.qml−3
@@ -39,11 +39,8 @@ FilterGrid {
3939 text: model.title
4040 imageWidth: filtergrid.iconWidth
4141 imageHeight: filtergrid.iconHeight
42−
4342 source: model.icon
4443
45− fillMode: Image.PreserveAspectCrop
46−
4744 onClicked: {
4845 var data = { model: model }
4946 filtergrid.clicked(index, data, tile.y)
Dash/Generic/GenericPreview.qml+158−70
@@ -16,90 +16,178 @@
1616
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
19+import Ubuntu.Components.ListItems 0.1 as ListItems
20+import Ubuntu.DownloadDaemonListener 0.1
1921import "../../Components"
20−import "../../Components/ListItems" as ListItems
2122import ".."
23+import "../Previews"
2224
2325DashPreview {
2426 id: genericPreview
2527
26− title: previewData.title
27− previewWidthRatio: 0.6
28−
29− property url url: previewData.image
30−
31− header: UbuntuShape {
32− id: urlLoader
33− anchors.left: parent.left
34− anchors.right: parent.right
35− height: width * previewImage.sourceSize.height / previewImage.sourceSize.width
36− radius: "medium"
37− image: Image {
38− id: previewImage
39− asynchronous: true
40− source: genericPreview.url
41− fillMode: Image.PreserveAspectCrop
28+ previewImages: previewImagesComponent
29+ header: headerComponent
30+ actions: (previewData.infoMap !== undefined && previewData.infoMap["show_progressbar"]) ? progressComponent : actionsComponent
31+ description: descriptionComponent
32+
33+ Component {
34+ id: previewImagesComponent
35+
36+ LazyImage {
37+ objectName: "genericPreviewImage"
38+ anchors {
39+ left: parent.left
40+ right: parent.right
41+ }
42+ scaleTo: "width"
43+ source: genericPreview.previewData.image
44+ initialHeight: width
45+ }
46+ }
47+
48+ Component {
49+ id: headerComponent
50+ Header {
51+ title: previewData.title
52+ subtitle: previewData.subtitle
4253 }
4354 }
4455
45− buttons: GridView {
46− id: buttons
47− model: genericPreview.previewData.actions
48−
49− property int numOfRows: (count + 1) / 2
50− property int spacing: units.gu(1)
51− height: Math.max(units.gu(4), units.gu(4)*numOfRows + spacing*(numOfRows - 1))
52−
53− cellWidth: Math.max(units.gu(9), width / 2)
54− cellHeight: buttonHeight + spacing
55− property int buttonWidth: Math.max(0, width / 2 - spacing)
56− property int buttonHeight: units.gu(4)
57−
58− delegate: Button {
59− width: Math.max(units.gu(4), buttons.buttonWidth)
60− height: buttons.buttonHeight
61− color: "#dd4814"
62− text: modelData.displayName
63− iconSource: modelData.iconHint
64− iconPosition: "right"
65− visible: true
66− onClicked: {
67− genericPreview.previewData.execute(modelData.id, { })
56+ Component {
57+ id: actionsComponent
58+
59+ Column {
60+ id: buttonList
61+ spacing: units.gu(1)
62+ Repeater {
63+ objectName: "buttonList"
64+ model: previewData.actions
65+
66+ delegate: Button {
67+ objectName: "button" + index
68+ width: parent.width
69+ height: buttonList.buttonHeight
70+ color: Theme.palette.selected.foreground
71+ text: modelData.displayName
72+ iconSource: modelData.iconHint
73+ iconPosition: "right"
74+ onClicked: previewData.execute(modelData.id, { })
75+ }
6876 }
6977 }
70− focus: false
7178 }
72− body: Column {
73− spacing: units.gu(2)
74−
75− Label {
76− anchors { left: parent.left; right: parent.right }
77− visible: text != ""
78− fontSize: "medium"
79− opacity: 0.6
80− color: "white"
81− text: previewData.subtitle.replace(/[\r\n]+/g, "<br />")
82− style: Text.Raised
83− styleColor: "black"
84− wrapMode: Text.WordWrap
85− textFormat: Text.RichText
86− // FIXME: workaround for https://bugreports.qt-project.org/browse/QTBUG-33020
87− onWidthChanged: { wrapMode = Text.NoWrap; wrapMode = Text.WordWrap }
79+
80+ Component {
81+ id: progressComponent
82+
83+ ProgressBar {
84+ id: progressBar
85+ objectName: "progressBar"
86+ value: 0
87+ maximumValue: 100
88+ height: units.gu(5)
89+
90+ property var model: previewData.actions
91+
92+ DownloadTracker {
93+ service: "com.canonical.applications.Downloader"
94+ dbusPath: previewData.infoMap["progressbar_source"] ? previewData.infoMap["progressbar_source"].value : ""
95+
96+ onProgress: {
97+ var percentage = parseInt(received * 100 / total);
98+ progressBar.value = percentage;
99+ }
100+
101+ onFinished: {
102+ previewData.execute(progressBar.model[0].id, { })
103+ }
104+
105+ onError: {
106+ previewData.execute(progressBar.model[1].id, { "error": error });
107+ }
108+ }
109+
88110 }
111+ }
89112
90− Label {
91− anchors { left: parent.left; right: parent.right }
92− visible: text != ""
93− fontSize: "small"
94− opacity: 0.6
95− color: "white"
96− text: previewData.description.replace(/[\r\n]+/g, "<br />")
97− style: Text.Raised
98− styleColor: "black"
99− wrapMode: Text.WordWrap
100− textFormat: Text.RichText
101− // FIXME: workaround for https://bugreports.qt-project.org/browse/QTBUG-33020
102− onWidthChanged: { wrapMode = Text.NoWrap; wrapMode = Text.WordWrap }
113+ Component {
114+ id: descriptionComponent
115+ Column {
116+ spacing: units.gu(2)
117+
118+ Label {
119+ id: descriptionLabel
120+ anchors { left: parent.left; right: parent.right }
121+ visible: text != ""
122+ fontSize: "small"
123+ opacity: 0.6
124+ color: "white"
125+ text: previewData.description.replace(/[\r\n]/g, "<br />")
126+ style: Text.Raised
127+ styleColor: "black"
128+ wrapMode: Text.WordWrap
129+ textFormat: Text.RichText
130+ // FIXME: workaround for https://bugreports.qt-project.org/browse/QTBUG-33020
131+ onWidthChanged: { wrapMode = Text.NoWrap; wrapMode = Text.WordWrap }
132+ }
133+
134+ Column {
135+ objectName: "infoHintColumn"
136+ anchors {
137+ left: parent.left
138+ right: parent.right
139+ }
140+ Repeater {
141+ objectName: "infoHintRepeater"
142+ model: previewData.infoHints
143+
144+ delegate: Item {
145+ objectName: "infoHintItem" + index
146+ width: parent.width
147+ height: units.gu(5)
148+ Row {
149+ width: parent.width
150+ spacing: units.gu(1)
151+ property int columnWidth: (width - spacing) / 2
152+ anchors.verticalCenter: parent.verticalCenter
153+
154+ Label {
155+ objectName: "displayNameLabel"
156+ visible: valueLabel.visible
157+ fontSize: "small"
158+ opacity: 0.9
159+ color: "white"
160+ horizontalAlignment: Text.AlignLeft
161+ width: parent.columnWidth
162+ text: modelData.displayName
163+ style: Text.Raised
164+ styleColor: "black"
165+ }
166+ Label {
167+ id: valueLabel
168+ objectName: "valueLabel"
169+ visible: modelData.value != ""
170+ fontSize: "small"
171+ opacity: 0.6
172+ color: "white"
173+ horizontalAlignment: Text.AlignRight
174+ width: parent.columnWidth
175+ text: modelData.value ? modelData.value : ""
176+ style: Text.Raised
177+ styleColor: "black"
178+ wrapMode: Text.WordWrap
179+ }
180+ }
181+ ListItems.ThinDivider {
182+ anchors {
183+ left: parent.left
184+ bottom: parent.bottom
185+ right: parent.right
186+ }
187+ }
188+ }
189+ }
190+ }
103191 }
104192 }
105193}
Dash/Generic/WeatherFilterGrid.qmlnew file+49
@@ -0,0 +1,49 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+import "../../Components"
20+
21+GenericFilterGrid {
22+ id: filtergrid
23+
24+ delegateHeight: units.gu(11.5)
25+
26+ delegate: Tile {
27+ id: tile
28+ objectName: "delegate" + index
29+ width: filtergrid.cellWidth
30+ height: filtergrid.cellHeight
31+ text: model.title
32+ imageWidth: filtergrid.iconWidth
33+ imageHeight: filtergrid.iconHeight
34+ source: model.icon
35+ maximumLineCount: 2
36+
37+ style: FlatTileStyle {}
38+
39+ onClicked: {
40+ var data = { model: model }
41+ filtergrid.clicked(index, data, tile.y)
42+ }
43+
44+ onPressAndHold: {
45+ var data = { model: model }
46+ filtergrid.pressAndHold(index, data, tile.y)
47+ }
48+ }
49+}
Dash/GenericScopeView.qml+63−4
@@ -22,6 +22,9 @@ import "../Components/ListItems" as ListItems
2222ScopeView {
2323 id: scopeView
2424 readonly property alias previewShown: previewLoader.onScreen
25+ property bool enableHeightBehaviorOnNextCreation: false
26+
27+ moving: categoryView.moving
2528
2629 onIsCurrentChanged: {
2730 pageHeader.resetSearch();
@@ -30,6 +33,8 @@ ScopeView {
3033
3134 onMovementStarted: categoryView.showHeader()
3235
36+ onPositionedAtBeginning: categoryView.positionAtBeginning()
37+
3338 Binding {
3439 target: scopeView.scope
3540 property: "searchQuery"
@@ -58,6 +63,7 @@ ScopeView {
5863
5964 ScopeListView {
6065 id: categoryView
66+ objectName: "categoryListView"
6167 anchors.fill: parent
6268 model: scopeView.categories
6369 forceNoClip: previewLoader.onScreen
@@ -68,6 +74,7 @@ ScopeView {
6874 property string expandedCategoryId: ""
6975
7076 delegate: ListItems.Base {
77+ id: baseItem
7178 highlightWhenPressed: false
7279
7380 readonly property bool expandable: rendererLoader.item ? rendererLoader.item.expandable : false
@@ -82,13 +89,18 @@ ScopeView {
8289 right: parent.right
8390 }
8491
85− source: getRenderer(model.renderer, model.contentType)
92+ source: getRenderer(model.renderer, model.contentType, model.rendererHint)
8693
8794 onLoaded: {
95+ if (item.enableHeightBehavior !== undefined && item.enableHeightBehaviorOnNextCreation !== undefined) {
96+ item.enableHeightBehavior = scopeView.enableHeightBehaviorOnNextCreation;
97+ scopeView.enableHeightBehaviorOnNextCreation = false;
98+ }
8899 if (source.toString().indexOf("Apps/RunningApplicationsGrid.qml") != -1) {
89100 // TODO: the running apps grid doesn't support standard scope results model yet
90101 item.firstModel = Qt.binding(function() { return results.firstModel })
91102 item.secondModel = Qt.binding(function() { return results.secondModel })
103+ item.canEnableTerminationMode = Qt.binding(function() { return scopeView.isCurrent })
92104 } else {
93105 item.model = Qt.binding(function() { return results })
94106 }
@@ -99,6 +111,13 @@ ScopeView {
99111 item.filter = shouldFilter;
100112 }
101113 }
114+ updateDelegateCreationRange();
115+ }
116+
117+ Component.onDestruction: {
118+ if (item.enableHeightBehavior !== undefined && item.enableHeightBehaviorOnNextCreation !== undefined) {
119+ scopeView.enableHeightBehaviorOnNextCreation = item.enableHeightBehaviorOnNextCreation;
120+ }
102121 }
103122
104123 Connections {
@@ -149,6 +168,33 @@ ScopeView {
149168 }
150169 }
151170 }
171+ onContentYChanged: rendererLoader.updateDelegateCreationRange();
172+ onHeightChanged: rendererLoader.updateDelegateCreationRange();
173+ }
174+
175+ function updateDelegateCreationRange() {
176+ // Do not update the range if we are overshooting up or down, since we'll come back
177+ // to the stable position and delete/create items without any reason
178+ if (categoryView.contentY < categoryView.originY) {
179+ return;
180+ } else if (categoryView.contentY + categoryView.height > categoryView.contentHeight) {
181+ return;
182+ }
183+
184+ if (item.hasOwnProperty("delegateCreationBegin")) {
185+ if (baseItem.y + baseItem.height <= 0) {
186+ // Not visible (item at top of the list)
187+ item.delegateCreationBegin = baseItem.height
188+ item.delegateCreationEnd = baseItem.height
189+ } else if (baseItem.y >= categoryView.height) {
190+ // Not visible (item at bottom of the list)
191+ item.delegateCreationBegin = 0
192+ item.delegateCreationEnd = 0
193+ } else {
194+ item.delegateCreationBegin = Math.max(-baseItem.y, 0)
195+ item.delegateCreationEnd = Math.min(categoryView.height + item.delegateCreationBegin, baseItem.height)
196+ }
197+ }
152198 }
153199 }
154200 }
@@ -176,6 +222,7 @@ ScopeView {
176222 width: categoryView.width
177223 text: scopeView.scope.name
178224 searchEntryEnabled: true
225+ scope: scopeView.scope
179226 }
180227 }
181228
@@ -185,19 +232,31 @@ ScopeView {
185232 }
186233 }
187234
188− function getRenderer(rendererId, contentType) {
235+ function getRenderer(rendererId, contentType, rendererHint) {
189236 if (rendererId == "default") {
190237 rendererId = getDefaultRendererId(contentType);
191238 }
192239 switch (rendererId) {
193240 case "grid": {
194241 switch (contentType) {
195− case "video": return "Generic/GenericFilterGridPotrait.qml";
242+ case "video": return "Video/VideoFilterGrid.qml";
196243 case "music": return "Music/MusicFilterGrid.qml";
244+ case "apps": {
245+ if (rendererHint == "toggled")
246+ return "Apps/DashPluginFilterGrid.qml";
247+ else
248+ return "Generic/GenericFilterGrid.qml";
249+ }
250+ case "weather": return "Generic/WeatherFilterGrid.qml";
197251 default: return "Generic/GenericFilterGrid.qml";
198252 }
199253 }
200− case "carousel": return "Generic/GenericCarousel.qml";
254+ case "carousel": {
255+ switch (contentType) {
256+ case "music": return "Music/MusicCarousel.qml";
257+ default: return "Generic/GenericCarousel.qml";
258+ }
259+ }
201260 case "special": {
202261 switch (contentType) {
203262 case "apps": return "Apps/RunningApplicationsGrid.qml";
Dash/Movie/MoviePreview.qmlnew file+71
@@ -0,0 +1,71 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+import ".."
20+import "../Generic"
21+import "../../Components"
22+import "../Previews"
23+
24+GenericPreview {
25+ id: root
26+
27+ property bool ready: previewData ? true : false
28+ property url url: ready ? previewData.image : ""
29+
30+ previewImages: previewImageComponent
31+ header: headerComponent
32+
33+ Component {
34+ id: previewImageComponent
35+ LazyImage {
36+ anchors.left: parent.left
37+ anchors.right: parent.right
38+ scaleTo: "width"
39+ visible: height > 0
40+ source: root.url
41+ initialHeight: width * 10 / 16
42+
43+ Image {
44+ objectName: "playButton"
45+ anchors.centerIn: parent
46+ readonly property bool bigButton: parent.width > units.gu(40)
47+ width: bigButton ? units.gu(8) : units.gu(4.5)
48+ height: width
49+ source: "../graphics/play_button%1%2.png".arg(previewImageMouseArea.pressed ? "_active" : "").arg(bigButton ? "_big" : "")
50+ }
51+
52+ MouseArea {
53+ id: previewImageMouseArea
54+ anchors.fill: parent
55+ onClicked: {
56+ Qt.openUrlExternally(previewData.result.uri);
57+ }
58+ }
59+ }
60+ }
61+
62+ Component {
63+ id: headerComponent
64+ Header {
65+ title: previewData.title
66+ rating: Math.round(previewData.rating * 10)
67+ reviews: previewData.numRatings
68+ rated: previewData.infoMap["rated"] ? previewData.infoMap["rated"].value : 0
69+ }
70+ }
71+}
Dash/Music/MusicFilterGrid.qml+21−22
@@ -16,42 +16,41 @@
1616
1717import QtQuick 2.0
1818import "../../Components"
19+import "../Generic"
1920
20−FilterGrid {
21− id: filterGrid
21+GenericFilterGrid {
22+ id: filtergrid
2223
23− minimumHorizontalSpacing: units.gu(2)
24− maximumNumberOfColumns: 5
25− delegateWidth: units.gu(17)
26− delegateHeight: iconHeight + units.gu(3.5)
27− verticalSpacing: units.gu(2)
24+ delegateWidth: units.gu(11)
25+ delegateHeight: units.gu(16)
2826
29− readonly property int iconWidth: (width / columns) * 0.8
30− readonly property int iconHeight: iconWidth
27+ iconWidth: units.gu(11)
28+ iconHeight: units.gu(11)
3129
32− signal clicked(int index, var delegateItem, real itemY)
33− signal pressAndHold(int index, var delegateItem, real itemY)
34−
35− delegate: AlbumTile {
30+ delegate: Tile {
3631 id: tile
3732 objectName: "delegate" + index
38− width: filterGrid.cellWidth
39− height: filterGrid.cellHeight
40− iconWidth: filterGrid.iconWidth
41− iconHeight: filterGrid.iconHeight
42−
43− artist: model.title
44− album: model.comment
33+ width: filtergrid.cellWidth
34+ height: filtergrid.cellHeight
35+ text: model.comment
36+ imageWidth: filtergrid.iconWidth
37+ imageHeight: filtergrid.iconHeight
4538 source: model.icon
39+ maximumLineCount: 2
40+ horizontalAlignment: Text.AlignLeft
41+
42+ style: MusicTileStyle {
43+ artist: model.title
44+ }
4645
4746 onClicked: {
4847 var data = { model: model }
49− filterGrid.clicked(index, data, tile.y)
48+ filtergrid.clicked(index, data, tile.y)
5049 }
5150
5251 onPressAndHold: {
5352 var data = { model: model }
54− filterGrid.pressAndHold(index, data, tile.y)
53+ filtergrid.pressAndHold(index, data, tile.y)
5554 }
5655 }
5756}
Dash/Music/MusicTileStyle.qmlnew file+102
@@ -0,0 +1,102 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+
20+Item {
21+ id: tile
22+
23+ property alias artist: artistLabel.text
24+
25+ anchors.fill: parent
26+
27+ UbuntuShape {
28+ id: icon
29+ anchors {
30+ top: parent.top
31+ horizontalCenter: parent.horizontalCenter
32+ }
33+ radius: "medium"
34+ width: styledItem.imageWidth
35+ height: styledItem.imageHeight
36+ image: Image {
37+ id: image
38+ objectName: "image"
39+ sourceSize { width: icon.width; height: icon.height }
40+ asynchronous: true
41+ cache: false
42+ source: styledItem.source
43+ fillMode: styledItem.fillMode
44+ horizontalAlignment: Image.AlignHCenter
45+ verticalAlignment: Image.AlignVCenter
46+ }
47+ }
48+
49+ UbuntuShape {
50+ id: borderPressed
51+ objectName: "borderPressed"
52+
53+ anchors.fill: icon
54+ radius: "medium"
55+ borderSource: "radius_pressed.sci"
56+ opacity: styledItem.pressed ? 1.0 : 0.0
57+ Behavior on opacity { NumberAnimation { duration: 200; easing.type: Easing.OutQuint } }
58+ }
59+
60+ Label {
61+ id: label
62+ objectName: "label"
63+ anchors {
64+ baseline: icon.bottom
65+ baselineOffset: units.gu(2)
66+ left: icon.left
67+ right: parent.right
68+ rightMargin: units.gu(1)
69+ leftMargin: units.dp(2)
70+ }
71+
72+ color: Theme.palette.selected.backgroundText
73+ opacity: 0.9
74+ style: Text.Raised
75+ styleColor: "black"
76+ fontSize: "small"
77+ font.weight: Font.Bold
78+ elide: Text.ElideRight
79+ horizontalAlignment: styledItem.horizontalAlignment
80+ text: styledItem.text
81+ wrapMode: Text.Wrap
82+ maximumLineCount: styledItem.maximumLineCount
83+ }
84+
85+ Label {
86+ id: artistLabel
87+ anchors {
88+ top: label.bottom
89+ left: label.left
90+ right: label.right
91+ rightMargin: units.gu(1)
92+ }
93+
94+ color: Theme.palette.selected.backgroundText
95+ opacity: 0.9
96+ style: Text.Raised
97+ styleColor: "black"
98+ fontSize: "x-small"
99+ elide: Text.ElideMiddle
100+ horizontalAlignment: styledItem.horizontalAlignment
101+ }
102+}
Dash/PreviewDelegateMapper.qml+1
@@ -22,6 +22,7 @@ QtObject {
2222 readonly property string appPreview: "Apps/AppPreview.qml"
2323 property var previewDelegateMapping: {"preview-generic": genericPreview,
2424 "preview-application": appPreview,
25+ "preview-movie": "Movie/MoviePreview.qml",
2526 }
2627 }
2728
Dash/Previews/Header.qmlnew file+109
@@ -0,0 +1,109 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+import "../../Components"
20+
21+Row {
22+ id: root
23+ property alias icon: image.source
24+ property alias title: titleLabel.text
25+ property alias subtitle: subtitleLabel.text
26+ property alias rating: ratingStars.rating
27+ property int rated: 0
28+ property int reviews: 0
29+
30+ spacing: units.gu(2)
31+ height: imageShape.visible ? imageShape.height : contentColumn.height
32+
33+ UbuntuShape {
34+ id: imageShape
35+ width: height
36+ height: Math.max(units.gu(6), contentColumn.height)
37+ visible: image.source.toString().length > 0
38+ image: Image {
39+ id: image
40+ sourceSize { width: imageShape.width; height: imageShape.height }
41+ asynchronous: true
42+ fillMode: Image.PreserveAspectFit
43+ }
44+ }
45+
46+ Column {
47+ id: contentColumn
48+ spacing: units.gu(1)
49+ width: parent.width - x
50+
51+ Label {
52+ id: titleLabel
53+ objectName: "titleLabel"
54+ fontSize: "large"
55+ color: "white"
56+ style: Text.Raised
57+ styleColor: "black"
58+ opacity: .9
59+ width: parent.width
60+ elide: Text.ElideRight
61+ }
62+
63+ Label {
64+ id: subtitleLabel
65+ objectName: "subtitleLabel"
66+ fontSize: "medium"
67+ color: "white"
68+ style: Text.Raised
69+ styleColor: "black"
70+ opacity: .6
71+ visible: text.length > 0
72+ }
73+
74+ Row {
75+ visible: root.rating >= 0
76+ spacing: units.gu(1)
77+
78+ RatingStars {
79+ id: ratingStars
80+ maximumRating: 10
81+ rating: -1
82+ }
83+
84+ Label {
85+ id: ratedLabel
86+ objectName: "ratedLabel"
87+ fontSize: "medium"
88+ color: "white"
89+ style: Text.Raised
90+ styleColor: "black"
91+ opacity: .6
92+ //TRANSLATORS: Number of persons who rated this app/video/whatever
93+ text: i18n.tr("(%1)").arg(root.rated)
94+ }
95+
96+ Label {
97+ id: reviewsLabel
98+ objectName: "reviewsLabel"
99+ fontSize: "medium"
100+ color: "white"
101+ style: Text.Raised
102+ styleColor: "black"
103+ opacity: .6
104+ //TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
105+ text: i18n.tr("%1 review", "%1 reviews", root.reviews).arg(root.reviews)
106+ }
107+ }
108+ }
109+}
Dash/Apps/AppReviews.qml → Dash/Previews/Reviews.qmlrenamed

The content is the same.

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

Binary file not shown.

Greeter/Clock.qml+31−12
@@ -16,6 +16,7 @@
1616
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
19+import Unity.Indicators 0.1 as Indicators
1920
2021Item {
2122 id: clock
@@ -23,17 +24,35 @@ Item {
2324 implicitWidth: childrenRect.width
2425 implicitHeight: childrenRect.height
2526
26− property date __date
27− property alias __timerInterval: timer.interval
28− readonly property bool __timerRunning: timer.running
27+ // Allows to set the current Date. Will be overwritten if active
28+ property date currentDate
2929
30− Timer {
31− id: timer
32− interval: 1000 * 60
33− running: clock.enabled && clock.visible && clock.opacity != 0
34− repeat: true
35− triggeredOnStart: true
36− onTriggered: __date = new Date
30+ // If active, time will be updated through the indicators service
31+ property bool active: clock.enabled && clock.visible
32+
33+ Component.onCompleted: {
34+ if (active) {
35+ currentDate = new Date()
36+ }
37+ }
38+
39+ Indicators.CachedUnityMenuModel {
40+ id: timeModel
41+ objectName: "timeModel"
42+
43+ busName: "com.canonical.indicator.datetime"
44+ actionsObjectPath: "/com/canonical/indicator/datetime"
45+ menuObjectPath: clock.active ? "/com/canonical/indicator/datetime/phone" : ""
46+
47+ Indicators.RootActionState {
48+ menu: timeModel.model
49+ onUpdated: {
50+ if (timeLabel.text != rightLabel) {
51+ timeLabel.text = rightLabel;
52+ clock.currentDate = new Date();
53+ }
54+ }
55+ }
3756 }
3857
3958 Column {
@@ -47,7 +66,7 @@ Item {
4766 font.pixelSize: units.gu(7.5)
4867 color: "white"
4968 opacity: 0.5
50− text: Qt.formatTime(__date)
69+ text: Qt.formatTime(clock.currentDate)
5170 font.weight: Font.Light
5271 }
5372
@@ -59,7 +78,7 @@ Item {
5978 fontSize: "medium"
6079 color: "white"
6180 opacity: 0.5
62− text: Qt.formatDate(__date, Qt.DefaultLocaleLongDate)
81+ text: Qt.formatDate(clock.currentDate, Qt.DefaultLocaleLongDate)
6382 font.weight: Font.Light
6483 }
6584 }
Greeter/Gradient.js+7−3
@@ -15,8 +15,12 @@
1515 */
1616
1717function threeColorByIndex(index, total, colors) {
18− var red, green, blue
19− var p = index / total
18+ var red, green, blue;
19+ var p = 0.0;
20+
21+ if(total > 0) {
22+ p = index / total;
23+ }
2024
2125 if (p < 0.5) {
2226 red = (colors.main.r * p * 2.0) + colors.start.r * (0.5 - p) * 2.0;
@@ -28,5 +32,5 @@ function threeColorByIndex(index, total, colors) {
2832 blue = colors.end.b * (p - 0.5) * 2.0 + colors.main.b * (1.0 - p) * 2.0;
2933 }
3034
31− return Qt.rgba(red, green, blue, 1)
35+ return Qt.rgba(red, green, blue, 1);
3236}
Greeter/GreeterContent.qml+11−7
@@ -102,19 +102,23 @@ MouseArea {
102102
103103 Infographics {
104104 id: infographics
105+ objectName: "infographics"
105106 height: narrowMode ? parent.height : 0.75 * parent.height
106107 model: greeterContentLoader.infographicModel
107108
108− Component.onCompleted: infographics.updateUsername(greeterContentLoader.currentIndex)
109+ property string selectedUser
110+ property string infographicUser: AccountsService.statsWelcomeScreen ? selectedUser : ""
111+ onInfographicUserChanged: greeterContentLoader.infographicModel.username = infographicUser
109112
110− Connections {
111− target: root
112− onSelected: infographics.updateUsername(uid)
113+ Component.onCompleted: {
114+ selectedUser = greeterContentLoader.model.data(greeterContentLoader.currentIndex, LightDM.UserRoles.NameRole)
115+ greeterContentLoader.infographicModel.username = infographicUser
116+ greeterContentLoader.infographicModel.readyForDataChange()
113117 }
114118
115− function updateUsername(uid) {
116− greeterContentLoader.infographicModel.username = greeterContentLoader.model.data(uid, LightDM.UserRoles.NameRole)
117− greeterContentLoader.infographicModel.readyForDataChangeSlot();
119+ Connections {
120+ target: root
121+ onSelected: infographics.selectedUser = greeterContentLoader.model.data(uid, LightDM.UserRoles.NameRole)
118122 }
119123
120124 anchors {
Greeter/Infographics.qml+11−4
@@ -29,21 +29,30 @@ Item {
2929 Connections {
3030 target: model
3131
32+ onDataAboutToAppear: startHideAnimation() // hide "no data" label
3233 onDataAppeared: startShowAnimation()
3334
3435 onDataAboutToChange: startHideAnimation()
35−
3636 onDataChanged: startShowAnimation()
3737
3838 onDataAboutToDisappear: startHideAnimation()
39+ onDataDisappeared: startShowAnimation() // show "no data" label
3940 }
4041
4142 function startShowAnimation() {
43+ dotHideAnimTimer.stop()
44+ circleShrinkAnimTimer.stop()
45+ notification.hideAnim.stop()
46+
4247 dotShowAnimTimer.startFromBeginning()
4348 notification.showAnim.start()
4449 }
4550
4651 function startHideAnimation() {
52+ dotShowAnimTimer.stop()
53+ circleGrowAnimTimer.stop()
54+ notification.showAnim.stop()
55+
4756 dotHideAnimTimer.startFromBeginning()
4857 notification.hideAnim.start()
4958 }
@@ -396,7 +405,7 @@ Item {
396405 }
397406 }
398407
399− Text {
408+ Label {
400409 id: notification
401410 objectName: "label"
402411
@@ -410,13 +419,11 @@ Item {
410419 anchors.centerIn: parent
411420
412421 text: infographic.model.label
413− font.pixelSize: notification.height / 12
414422
415423 wrapMode: Text.WordWrap
416424 horizontalAlignment: Text.AlignHCenter
417425 verticalAlignment: Text.AlignVCenter
418426 color: "white"
419− font.weight: Font.Light
420427
421428 PropertyAnimation {
422429 id: increaseOpacity
Greeter/PinLockscreen.qml+5
@@ -32,6 +32,8 @@ Column {
3232 signal entered(string passphrase)
3333 signal cancel()
3434
35+ property bool entryEnabled: true
36+
3537 function clear(playAnimation) {
3638 pinentryField.text = "";
3739 if (playAnimation) {
@@ -140,6 +142,7 @@ Column {
140142 width: root.padWidth / 3
141143 height: root.padHeight / 4
142144 text: index + 1
145+ enabled: entryEnabled
143146
144147 onClicked: {
145148 pinentryField.text = pinentryField.text + text;
@@ -161,6 +164,7 @@ Column {
161164 height: root.padHeight / 4
162165 text: "0"
163166 onClicked: pinentryField.text = pinentryField.text + text
167+ enabled: entryEnabled
164168 }
165169
166170 PinPadButton {
@@ -169,6 +173,7 @@ Column {
169173 height: root.padHeight / 4
170174 iconName: "erase"
171175 onClicked: pinentryField.text = pinentryField.text.substring(0, pinentryField.text.length-1)
176+ enabled: entryEnabled
172177 }
173178 }
174179 }
GreeterShell.qml+17
@@ -188,6 +188,11 @@ BasicShell {
188188 }
189189 }
190190
191+ OSKController {
192+ anchors.topMargin: panel.panelHeight
193+ anchors.fill: parent // as needs to know the geometry of the shell
194+ }
195+
191196 Connections {
192197 id: powerConnection
193198 target: Powerd
@@ -202,6 +207,18 @@ BasicShell {
202207 }
203208 }
204209
210+ Connections {
211+ target: applicationManager
212+ ignoreUnknownSignals: true
213+ // If any app is focused when greeter is open, it's due to a user action
214+ // like a snap decision (say, an incoming call).
215+ // TODO: these should be protected to only unlock for certain applications / certain usecases
216+ // potentially only in connection with a notification.
217+ // TODO: what about the app the shell will restore focus to by itself?
218+ onMainStageFocusedApplicationChanged: greeter.hide()
219+ onSideStageFocusedApplicationChanged: greeter.hide()
220+ }
221+
205222 GreeterEdgeDemo {
206223 id: edgeDemo
207224 greeter: greeter
Notifications/Notification.qml+49−5
@@ -17,6 +17,8 @@
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
1919import Unity.Notifications 1.0
20+import QMenuModel 0.1
21+import Utils 0.1
2022
2123UbuntuShape {
2224 id: notification
@@ -33,11 +35,30 @@ UbuntuShape {
3335
3436 objectName: "background"
3537 implicitHeight: contentColumn.height + contentColumn.spacing * 2
36− color: Qt.rgba(0, 0, 0, 0.85)
38+ color: Qt.rgba(0.132, 0.117, 0.109, 0.97)
3739 opacity: 0
40+ radius: "medium"
3841
3942 clip: true
4043
44+ UnityMenuModelPaths {
45+ id: paths
46+
47+ source: hints["x-canonical-private-menu-model"]
48+
49+ busNameHint: "busName"
50+ actionsHint: "actions"
51+ menuObjectPathHint: "menuPath"
52+ }
53+
54+ UnityMenuModel {
55+ id: unityMenuModel
56+
57+ busName: paths.busName
58+ actions: paths.actions
59+ menuObjectPath: paths.menuObjectPath
60+ }
61+
4162 Behavior on implicitHeight {
4263 id: heightBehavior
4364
@@ -108,6 +129,8 @@ UbuntuShape {
108129 id: labelColumn
109130 width: parent.width - x
110131
132+ anchors.verticalCenter: (icon.visible && !bodyLabel.visible) ? icon.verticalCenter : undefined
133+
111134 Label {
112135 id: summaryLabel
113136
@@ -141,6 +164,27 @@ UbuntuShape {
141164 }
142165 }
143166
167+ Column {
168+ objectName: "dialogListView"
169+ spacing: units.gu(2)
170+
171+ visible: count > 0
172+
173+ anchors.left: parent.left; anchors.right: parent.right
174+
175+ Repeater {
176+ model: unityMenuModel
177+
178+ NotificationMenuItemFactory {
179+ anchors.left: parent.left; anchors.right: parent.right
180+
181+ menuModel: unityMenuModel
182+ menuData: model
183+ menuIndex: index
184+ }
185+ }
186+ }
187+
144188 Item {
145189 id: buttonRow
146190
@@ -149,8 +193,8 @@ UbuntuShape {
149193 left: parent.left
150194 right: parent.right
151195 }
152− visible: notification.type == Notification.SnapDecision
153− height: units.gu(4)
196+ visible: notification.type == Notification.SnapDecision && actionRepeater.count > 0
197+ height: units.gu(5)
154198
155199 property real buttonWidth: (width - contentColumn.spacing) / 2
156200 property bool expanded
@@ -195,7 +239,7 @@ UbuntuShape {
195239 top: parent.top
196240 bottom: parent.bottom
197241 }
198− gradient: notification.hints == Notification.ButtonTint ? UbuntuColors.orangeGradient : UbuntuColors.greyGradient
242+ gradient: notification.hints["x-canonical-private-button-tint"] == "true" ? UbuntuColors.orangeGradient : UbuntuColors.greyGradient
199243 visible: width > 0
200244 onClicked: notification.notification.invokeAction(actionRepeater.itemAt(0).actionId)
201245 }
@@ -241,7 +285,7 @@ UbuntuShape {
241285 }
242286
243287 text: loader.actionLabel
244− height: units.gu(4)
288+ height: units.gu(5)
245289 gradient: UbuntuColors.greyGradient
246290 onClicked: notification.notification.invokeAction(loader.actionId)
247291 }
Notifications/NotificationMenuItemFactory.qmlnew file+96
@@ -0,0 +1,96 @@
1+/*
2+ * Copyright 2013 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Authors:
17+ * Nick Dedekind <nick.dedekind@canonical.com>
18+ */
19+
20+import QtQuick 2.0
21+import Ubuntu.Components 0.1
22+import "../Components"
23+import "../Greeter"
24+
25+Loader {
26+ id: menuFactory
27+
28+ property QtObject menuModel: null
29+ property QtObject menuData: null
30+ property int menuIndex
31+ property var notification
32+
33+ property var _map: {
34+ "com.canonical.snapdecision.textfield": textfield,
35+ "com.canonical.snapdecision.pinlock" : pinLock,
36+ }
37+
38+ sourceComponent: {
39+ if (menuData.type !== undefined) {
40+ var component = _map[menuData.type];
41+ if (component !== undefined) {
42+ return component;
43+ }
44+ }
45+ }
46+
47+ Component {
48+ id: textfield
49+
50+ Column {
51+ spacing: units.gu(2)
52+
53+ anchors.left: parent.left; anchors.right: parent.right
54+
55+ Component.onCompleted: {
56+ menuModel.loadExtendedAttributes(menuIndex, {"x-echo-mode-password": "bool"});
57+ textfield.echoMode = menuData.ext.xEchoModePassword ? TextInput.Password : TextInput.Normal
58+ }
59+
60+ Label {
61+ text: menuData.label
62+ }
63+
64+ TextField {
65+ id: textfield
66+
67+ anchors.left: parent.left; anchors.right: parent.right
68+ height: units.gu(5)
69+ onTextChanged: {
70+ menuModel.changeState(menuIndex, text);
71+ }
72+ }
73+ }
74+ }
75+
76+ Component {
77+ id: pinLock
78+ PinLockscreen {
79+ anchors.left: parent.left; anchors.right: parent.right
80+
81+ Component.onCompleted: {
82+ menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-pin-length': 'int'});
83+ pinLength = menuData.ext.xCanonicalPinLength;
84+ }
85+
86+ onEntered: {
87+ menuModel.changeState(menuIndex, passphrase);
88+ entryEnabled = false;
89+ }
90+
91+ onCancel: {
92+ menuModel.activate(menuIndex, false);
93+ }
94+ }
95+ }
96+}
Panel/IndicatorRow.qml+51−12
@@ -27,6 +27,8 @@ Item {
2727 property alias row: row
2828 property QtObject indicatorsModel: null
2929 property var visibleIndicators: defined
30+ property int overFlowWidth: width
31+ property bool showAll: false
3032
3133 width: units.gu(40)
3234 height: units.gu(3)
@@ -42,6 +44,15 @@ Item {
4244 }
4345 }
4446
47+ Timer {
48+ id: allVisible
49+ interval: 1000
50+
51+ onTriggered: {
52+ showAll = false;
53+ }
54+ }
55+
4556 Row {
4657 id: row
4758
@@ -54,16 +65,31 @@ Item {
5465 objectName: "rowRepeater"
5566 model: indicatorsModel ? indicatorsModel : undefined
5667
68+ property int lastCount: 0
69+ onCountChanged: {
70+ if (lastCount < count) {
71+ showAll = true;
72+ allVisible.start();
73+ }
74+ lastCount = count;
75+ }
76+
5777 Item {
5878 id: itemWrapper
5979 height: indicatorRow.height
6080 width: indicatorItem.width
6181 visible: indicatorItem.indicatorVisible
82+ opacity: 1.0
83+ y: 0
84+ state: "standard"
6285
6386 property int ownIndex: index
6487 property alias highlighted: indicatorItem.highlighted
6588 property alias dimmed: indicatorItem.dimmed
6689
90+ property bool hidden: !showAll && !indicatorItem.highlighted && (indicatorRow.state == "locked" || indicatorRow.state == "commit")
91+ property bool overflow: row.width - itemWrapper.x > overFlowWidth
92+
6793 IndicatorItem {
6894 id: indicatorItem
6995 height: parent.height
@@ -87,22 +113,35 @@ Item {
87113 }
88114 indicatorRow.visibleIndicators[model.identifier] = indicatorVisible;
89115 indicatorRow.visibleIndicatorsChanged();
116+
117+ if (indicatorVisible) {
118+ showAll = true;
119+ allVisible.start();
120+ }
90121 }
91122 }
92123
93− opacity: {
94− if (!indicatorItem.highlighted && (indicatorRow.state == "locked" || indicatorRow.state == "commit")) {
95− return 0.0;
96− } else {
97− return 1.0;
124+ states: [
125+ State {
126+ name: "standard"
127+ when: !hidden && !overflow
128+ },
129+ State {
130+ name: "overflow"
131+ when: hidden || overflow
132+ PropertyChanges { target: itemWrapper; opacity: 0.0 }
98133 }
99− }
100− Behavior on opacity {
101− StandardAnimation {
102− // flow away from current index
103− duration: (rowRepeater.count - Math.abs(indicatorRow.currentItemIndex - index)) * (500/rowRepeater.count)
104− }
105− }
134+ ]
135+
136+ transitions: [
137+ Transition {
138+ StandardAnimation {
139+ target: itemWrapper
140+ property: "opacity"
141+ duration: 300
142+ }
143+ }
144+ ]
106145 }
107146 }
108147 }
Panel/Indicators.qml+6−1
@@ -17,6 +17,7 @@
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
1919import Ubuntu.Gestures 0.1
20+import Unity.Indicators 0.1 as Indicators
2021
2122import "../Components"
2223import "../Components/ListItems"
@@ -28,6 +29,8 @@ Showable {
2829 property real openedHeight: units.gu(71)
2930 property int panelHeight: units.gu(3)
3031 property bool pinnedMode: true //should be set true if indicators menu can cover whole screen
32+ property alias overFlowWidth: indicatorRow.overFlowWidth
33+ property alias showAll: indicatorRow.showAll
3134
3235 property int hintValue
3336 readonly property int lockThreshold: openedHeight / 2
@@ -249,8 +252,10 @@ Showable {
249252 anchors.fill: indicatorRow
250253 }
251254
252− IndicatorsDataModel {
255+ Indicators.IndicatorsModel {
253256 id: indicatorsModel
257+
258+ Component.onCompleted: load()
254259 }
255260
256261 IndicatorRow {
Panel/Indicators/DatetimeIndicatorPage.qmldeleted−97
@@ -1,97 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− * Ubo Riboni <ugo.riboni@canonical.com>
19− */
20−
21−import QtQuick 2.0
22−import Ubuntu.Components 0.1
23−
24−Flickable {
25− id: page
26−
27− contentHeight: image.height
28−
29− Image {
30− id: image
31− anchors {
32− left: parent.left
33− right: parent.right
34− }
35− source: "../graphics/time_and_date@18.png"
36− fillMode: Image.PreserveAspectFit
37− }
38−
39− Item {
40− anchors {
41− top: parent.top
42− topMargin: units.gu(5)
43− left: parent.left
44− right: parent.right
45− }
46−
47− height: units.gu(30)
48−
49− Label {
50− id: timeLabel
51− anchors {
52− horizontalCenter: parent.horizontalCenter
53− verticalCenter: parent.verticalCenter
54− }
55−
56− text: ""
57− color: Theme.palette.selected.backgroundText
58− font.weight: Font.Light
59− font.pixelSize: units.gu(6)
60− }
61−
62− Label {
63− id: dateLabel
64−
65− anchors {
66− left: parent.left
67− leftMargin: units.gu(2)
68− bottom: parent.bottom
69− bottomMargin: units.gu(1.5)
70− }
71− text: ""
72− color: Theme.palette.selected.backgroundText
73− fontSize: "small"
74− }
75− }
76−
77− Timer {
78− interval: 1000 * 10 // 10 seconds
79− running: true
80− repeat: true
81− triggeredOnStart: true
82− onTriggered: updateTime();
83− }
84−
85− function updateTime() {
86− var dt = new Date();
87− var time = Qt.formatTime(dt);
88− var space = time.indexOf(" ");
89− timeLabel.text = time.substr(0, space > 0 ? space : 5);
90− dateLabel.text = Qt.formatDateTime(dt, "dddd,\ndd MMMM");
91− }
92−
93− // Make it compatible with the PluginItem interface
94− function start() {}
95− function stop() {}
96− function reset() {}
97−}
Panel/Indicators/DatetimeIndicatorWidget.qmldeleted−67
@@ -1,67 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Nick Dedekind <nick.dedekind@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−import Unity.IndicatorsLegacy 0.1 as Indicators
23−
24−Indicators.IndicatorWidget {
25− id: indicatorWidget
26−
27− width: timeLabel.width + units.gu(1)
28− rootMenuType: "com.canonical.indicator.root.time"
29−
30− property alias label: timeLabel.text
31−
32− Label {
33− id: timeLabel
34− objectName: "timeLabel"
35− color: Theme.palette.selected.backgroundText
36− opacity: 0.8
37− font.family: "Ubuntu"
38− fontSize: "medium"
39− anchors.centerIn: parent
40− text: Qt.formatTime(timer.dateNow)
41− }
42−
43− Timer {
44− id: timer
45− interval: 1000 * 10
46− running: indicatorWidget.visible
47− repeat: true
48− triggeredOnStart: true
49− property date dateNow
50−
51− onTriggered: dateNow = new Date
52− }
53−
54− onActionStateChanged: {
55− if (action == undefined || !action.valid) {
56− enabled = false;
57− return;
58− }
59−
60− if (action.state == undefined) {
61− enabled = false;
62− return;
63− }
64−
65− enabled = action.state[3];
66− }
67−}
Panel/Indicators/DefaultIndicatorPage.qml+1−1
@@ -18,7 +18,7 @@
1818 */
1919
2020import QtQuick 2.0
21−import Unity.IndicatorsLegacy 0.1 as Indicators
21+import Unity.Indicators 0.1 as Indicators
2222
2323Indicators.IndicatorPage {
2424 anchors.fill: parent
Panel/Indicators/DefaultIndicatorPage2.qmldeleted−25
@@ -1,25 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Nick Dedekind <nick.dedekind@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Unity.Indicators 0.1 as Indicators
22−
23−Indicators.IndicatorPage {
24− anchors.fill: parent
25−}
Panel/Indicators/DefaultIndicatorWidget.qml+47−21
@@ -19,16 +19,16 @@
1919
2020import QtQuick 2.0
2121import Ubuntu.Components 0.1
22−import Unity.IndicatorsLegacy 0.1 as Indicators
22+import Unity.Indicators 0.1 as Indicators
2323
2424Indicators.IndicatorWidget {
2525 id: indicatorWidget
2626
27− enabled:true
2827 width: itemRow.width + units.gu(0.5)
2928
30− property alias label: itemLabel.text
31− property alias iconSource: itemImage.source
29+ property alias leftLabel: itemLeftLabel.text
30+ property alias rightLabel: itemRightLabel.text
31+ property var icons: undefined
3232
3333 Row {
3434 id: itemRow
@@ -40,19 +40,43 @@ Indicators.IndicatorWidget {
4040 }
4141 spacing: units.gu(0.5)
4242
43− // FIXME : Should us Ubuntu.Icon . results in low res images
44− Image {
45− id: itemImage
46− objectName: "itemImage"
47− visible: source != ""
48− height: indicatorWidget.iconSize
49− width: indicatorWidget.iconSize
43+ Label {
44+ id: itemLeftLabel
45+ objectName: "leftLabel"
46+ color: Theme.palette.selected.backgroundText
47+ opacity: 0.8
48+ font.family: "Ubuntu"
49+ fontSize: "medium"
5050 anchors.verticalCenter: parent.verticalCenter
51+ visible: text != ""
52+ }
53+
54+ Row {
55+ width: childrenRect.width
56+ anchors {
57+ top: parent.top
58+ bottom: parent.bottom
59+ }
60+ spacing: units.gu(0.5)
61+
62+ Repeater {
63+ model: indicatorWidget.icons
64+
65+ Image {
66+ id: itemImage
67+ objectName: "itemImage"
68+ visible: source != ""
69+ source: modelData
70+ height: indicatorWidget.iconSize
71+ width: indicatorWidget.iconSize
72+ anchors.verticalCenter: parent.verticalCenter
73+ }
74+ }
5175 }
5276
5377 Label {
54− id: itemLabel
55− objectName: "itemLabel"
78+ id: itemRightLabel
79+ objectName: "rightLabel"
5680 color: Theme.palette.selected.backgroundText
5781 opacity: 0.8
5882 font.family: "Ubuntu"
@@ -62,16 +86,18 @@ Indicators.IndicatorWidget {
6286 }
6387 }
6488
65− onActionStateChanged: {
66− if (action == undefined || !action.valid) {
67− return;
68− }
69−
70− if (action.state == undefined) {
89+ onRootActionStateChanged: {
90+ if (rootActionState == undefined) {
91+ leftLabel = "";
92+ rightLabel = "";
93+ icons = undefined;
94+ enabled = false;
7195 return;
7296 }
7397
74− label = action.state[Indicators.ActionState.Label];
75− iconSource = "image://theme/" + action.state[Indicators.ActionState.IconSource];
98+ leftLabel = rootActionState.leftLabel ? rootActionState.leftLabel : "";
99+ rightLabel = rootActionState.rightLabel ? rootActionState.rightLabel : "";
100+ icons = rootActionState.icons;
101+ enabled = rootActionState.visible;
76102 }
77103}
Panel/Indicators/DefaultIndicatorWidget2.qmldeleted−103
@@ -1,103 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Nick Dedekind <nick.dedekind@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−import Unity.Indicators 0.1 as Indicators
23−
24−Indicators.IndicatorWidget {
25− id: indicatorWidget
26−
27− width: itemRow.width + units.gu(0.5)
28−
29− property alias leftLabel: itemLeftLabel.text
30− property alias rightLabel: itemRightLabel.text
31− property var icons: undefined
32−
33− Row {
34− id: itemRow
35− objectName: "itemRow"
36− anchors {
37− top: parent.top
38− bottom: parent.bottom
39− horizontalCenter: parent.horizontalCenter
40− }
41− spacing: units.gu(0.5)
42−
43− Label {
44− id: itemLeftLabel
45− objectName: "leftLabel"
46− color: Theme.palette.selected.backgroundText
47− opacity: 0.8
48− font.family: "Ubuntu"
49− fontSize: "medium"
50− anchors.verticalCenter: parent.verticalCenter
51− visible: text != ""
52− }
53−
54− Row {
55− width: childrenRect.width
56− anchors {
57− top: parent.top
58− bottom: parent.bottom
59− }
60− spacing: units.gu(0.5)
61−
62− Repeater {
63− model: indicatorWidget.icons
64−
65− Image {
66− id: itemImage
67− objectName: "itemImage"
68− visible: source != ""
69− source: modelData
70− height: indicatorWidget.iconSize
71− width: indicatorWidget.iconSize
72− anchors.verticalCenter: parent.verticalCenter
73− }
74− }
75− }
76−
77− Label {
78− id: itemRightLabel
79− objectName: "rightLabel"
80− color: Theme.palette.selected.backgroundText
81− opacity: 0.8
82− font.family: "Ubuntu"
83− fontSize: "medium"
84− anchors.verticalCenter: parent.verticalCenter
85− visible: text != ""
86− }
87− }
88−
89− onActionStateChanged: {
90− if (actionState == undefined) {
91− leftLabel = "";
92− rightLabel = "";
93− icons = undefined;
94− enabled = false;
95− return;
96− }
97−
98− leftLabel = actionState.leftLabel ? actionState.leftLabel : "";
99− rightLabel = actionState.rightLabel ? actionState.rightLabel : "";
100− icons = actionState.icons;
101− enabled = actionState.visible;
102− }
103−}
Panel/Indicators/MessagingIndicatorPage.qmldeleted−35
@@ -1,35 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Nick Dedekind <nick.dedekind@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−import Unity.IndicatorsLegacy 0.1 as Indicators
23−
24−Indicators.IndicatorPage {
25− anchors.fill: parent
26−
27− highlightFollowsCurrentItem: false
28− emptyText: "You have no more outstanding messages."
29−
30− function stop() {
31− // never stops the service
32− // this will keep all objects in memory, consume more memory
33− // but will optimize the menu contruction on the screen
34− }
35−}
Panel/Indicators/NetworkIndicatorPage.qmldeleted−83
@@ -1,83 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Unity.IndicatorsLegacy 0.1 as Indicators
22−import Unity.IndicatorsLegacy.Network 0.1 as ICNetwork
23−import Ubuntu.Components 0.1
24−
25−PageStack {
26− id: networkPage
27− // Stops the search for a parent tree node.
28− // We don't want it going up to the indicator tabs.
29− // FIXME: need a better way of doing this.
30− // https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1211704
31− __propagated: null
32−
33− property alias title: _mainPage.title
34− property alias emptyText: pluginItem.emptyText
35− property alias busType: pluginItem.busType
36− property alias busName: pluginItem.busName
37− property alias actionsObjectPath : pluginItem.actionsObjectPath
38− property alias menuObjectPaths : pluginItem.menuObjectPaths
39−
40− anchors.fill: parent
41−
42− Page {
43− id: _mainPage
44−
45− Indicators.IndicatorPage {
46− id: pluginItem
47− anchors.fill: parent
48− }
49− }
50−
51− Component {
52− id: passwordPageComponent
53−
54− ICNetwork.PasswordPage {
55− agent: networkAgent
56− }
57− }
58−
59− ICNetwork.NetworkAgent {
60− id: networkAgent
61−
62− onSecretRequested: {
63− networkPage.push(passwordPageComponent, {"token": token});
64− }
65− }
66−
67− function start()
68− {
69− push(_mainPage);
70− pluginItem.start();
71− }
72−
73− function stop()
74− {
75− clear();
76− pluginItem.stop();
77− }
78−
79− function reset()
80− {
81− pluginItem.reset();
82− }
83−}
Panel/Indicators/NetworkIndicatorPage2.qmldeleted−82
@@ -1,82 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Unity.Indicators 0.1 as Indicators
22−import Unity.Indicators.Network 0.1 as ICNetwork
23−import Ubuntu.Components 0.1
24−
25−PageStack {
26− id: networkPage
27− // Stops the search for a parent tree node.
28− // We don't want it going up to the indicator tabs.
29− // FIXME: need a better way of doing this.
30− // https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1211704
31− __propagated: null
32−
33− property alias title: _mainPage.title
34− property alias emptyText: pluginItem.emptyText
35− property alias busName: pluginItem.busName
36− property alias actionsObjectPath : pluginItem.actionsObjectPath
37− property alias menuObjectPaths : pluginItem.menuObjectPaths
38−
39− anchors.fill: parent
40−
41− Page {
42− id: _mainPage
43−
44− Indicators.IndicatorPage {
45− id: pluginItem
46− anchors.fill: parent
47− }
48− }
49−
50− Component {
51− id: passwordPageComponent
52−
53− ICNetwork.PasswordPage {
54− agent: networkAgent
55− }
56− }
57−
58− ICNetwork.NetworkAgent {
59− id: networkAgent
60−
61− onSecretRequested: {
62− networkPage.push(passwordPageComponent, {"token": token});
63− }
64− }
65−
66− function start()
67− {
68− push(_mainPage);
69− pluginItem.start();
70− }
71−
72− function stop()
73− {
74− clear();
75− pluginItem.stop();
76− }
77−
78− function reset()
79− {
80− pluginItem.reset();
81− }
82−}
Panel/Indicators/NetworkIndicatorWidget.qmldeleted−112
@@ -1,112 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Nick Dedekind <nick.dedekind@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−import Unity.IndicatorsLegacy 0.1 as Indicators
23−
24−Indicators.IndicatorWidget {
25− id: indicatorWidget
26−
27− width: networkIcon.width + units.gu(0.5)
28−
29− property int signalStrength: 0
30− property int connectionState: Indicators.NetworkConnection.Initial
31− rootMenuType: "com.canonical.indicator.root.network"
32−
33− // FIXME : Should us Ubuntu.Icon . results in low res images
34− Image {
35− id: networkIcon
36− objectName: "itemImage"
37− source: get_icon_for_signal(connectionState, signalStrength)
38− visible: source != ""
39− height: indicatorWidget.iconSize
40− width: indicatorWidget.iconSize
41− anchors.centerIn: parent
42− }
43−
44− onActionStateChanged: {
45− if (action == undefined || !action.valid) {
46− enabled = false;
47− return;
48− }
49−
50− if (action.state == undefined) {
51− enabled = false;
52− connectionState = 0;
53− return;
54− }
55−
56− enabled = true;
57− connectionState = action.state[Indicators.NetworkActionState.Connection];
58− if (connectionState == Indicators.NetworkConnection.Activated) {
59− signalStrength = action.state[Indicators.NetworkActionState.SignalStrength];
60− }
61− }
62−
63− NumberAnimation {
64− id: activation_animation
65− target: indicatorWidget
66− property: "signalStrength"
67− from: 0
68− to: 100
69− duration: 2500 // 5 states in 2.5 seconds
70− loops: Animation.Infinite
71− }
72−
73− states: [
74− State {
75− name: "unknown"
76− when: connectionState < Indicators.NetworkConnection.Activating || connectionState > Indicators.NetworkConnection.Deactivating
77− PropertyChanges { target: activation_animation; running: false }
78− },
79− State {
80− name: "activating"
81− when: connectionState == Indicators.NetworkConnection.Activating
82− PropertyChanges { target: activation_animation; running: true }
83− },
84− State {
85− name: "activated"
86− when: connectionState == Indicators.NetworkConnection.Activated
87− PropertyChanges { target: activation_animation; running: false }
88− },
89− State {
90− name: "deactivating"
91− when: connectionState == Indicators.NetworkConnection.Deactivating
92− PropertyChanges { target: activation_animation; running: true }
93− }
94− ]
95−
96−
97− function get_icon_for_signal(con_state, value) {
98− if (con_state >= Indicators.NetworkConnection.Activating && con_state <= Indicators.NetworkConnection.Deactivating) {
99− if (value == 0) {
100− return "image://theme/nm-signal-00";
101− } else if (value <= 25) {
102− return "image://theme/nm-signal-25";
103− } else if (value <= 50) {
104− return "image://theme/nm-signal-50";
105− } else if (value <= 75) {
106− return "image://theme/nm-signal-75";
107− }
108− return "image://theme/nm-signal-100";
109− }
110− return "image://theme/wifi-none";
111− }
112−}
Panel/Indicators/client/IndicatorsList.qml+16−14
@@ -20,7 +20,7 @@
2020import QtQuick 2.0
2121import Ubuntu.Components 0.1
2222import Ubuntu.Components.ListItems 0.1 as ListItem
23−import Unity.IndicatorsLegacy 0.1 as Indicators
23+import Unity.Indicators 0.1 as Indicators
2424import "../.."
2525
2626Page {
@@ -28,8 +28,10 @@ Page {
2828 anchors.fill: parent
2929 title: "Plugin list"
3030
31− IndicatorsDataModel {
31+ Indicators.IndicatorsModel {
3232 id: indicatorsModel
33+
34+ Component.onCompleted: load()
3335 }
3436
3537 ListView {
@@ -38,24 +40,24 @@ Page {
3840 anchors.fill: parent
3941 model: indicatorsModel
4042
41− delegate: Indicators.MenuItem {
43+ delegate: Indicators.FramedMenuItem {
4244 anchors.left: parent.left
4345 anchors.right: parent.right
44− progression: isValid
4546 objectName: identifier
4647
47− Label {
48− anchors.left: parent.left
49− anchors.leftMargin: units.gu(0.5)
50− anchors.verticalCenter: parent.verticalCenter
51− text: title
52− }
48+ text: identifier
5349
5450 onClicked: {
55− if (progression) {
56− var new_page = Qt.createComponent("IndicatorsPage.qml");
57− page.pageStack.push(new_page.createObject(pages), {"indicatorProperties" : model.indicatorProperties, "pageSource" : model.pageSource});
58− }
51+ var new_page = Qt.createComponent("IndicatorsPage.qml");
52+ page.pageStack.push(new_page.createObject(pages), {"indicatorProperties" : model.indicatorProperties, "pageSource" : model.pageSource});
53+ }
54+
55+ Rectangle {
56+ id: background
57+
58+ anchors.fill: parent
59+ color: "#221e1c"
60+ z: -1
5961 }
6062 }
6163 }
Panel/Indicators/client/IndicatorsTree.qml+4
@@ -44,6 +44,10 @@ Page {
4444 menuObjectPath: page.deviceMenuObjectPath
4545 }
4646
47+ Indicators.RootActionState {
48+ menu: unityModel
49+ }
50+
4751 Indicators.ModelPrinter {
4852 id: printer
4953 model: unityModel
Panel/IndicatorsDataModel.qmldeleted−79
@@ -1,79 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Unity.Indicators 0.1 as Indicators
22−import Utils 0.1
23−
24−Indicators.IndicatorsModel {
25− id: ic_model
26−
27− Component.onCompleted: load()
28−
29− indicatorData : {
30− 'indicator-location' : {
31− 'title': 'Location',
32− 'description' : '',
33− 'widgetSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/DefaultIndicatorWidget2.qml',
34− 'pageSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/DefaultIndicatorPage2.qml'
35− },
36− 'indicator-bluetooth' : {
37− 'title': 'Bluetooth',
38− 'description' : '',
39− 'widgetSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/DefaultIndicatorWidget2.qml',
40− 'pageSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/DefaultIndicatorPage2.qml'
41− },
42− 'indicator-messages' : {
43− 'title': 'Messaging',
44− 'description' : '',
45− 'widgetSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/MessagingIndicatorWidget.qml',
46− 'pageSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/MessagingIndicatorPage.qml'
47− },
48− 'indicator-sound' : {
49− 'title': 'Sound',
50− 'description' : '',
51− 'widgetSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/DefaultIndicatorWidget2.qml',
52− 'pageSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/DefaultIndicatorPage2.qml'
53− },
54− 'indicator-network' : {
55− 'title': 'Networks',
56− 'description' : '',
57− 'widgetSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/DefaultIndicatorWidget2.qml',
58− 'pageSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/NetworkIndicatorPage2.qml'
59− },
60− 'indicator-power' : {
61− 'title': 'Battery',
62− 'description' : '',
63− 'widgetSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/DefaultIndicatorWidget2.qml',
64− 'pageSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/DefaultIndicatorPage2.qml'
65− },
66− 'indicator-session' : {
67− 'title': 'Session',
68− 'description' : '',
69− 'widgetSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/DefaultIndicatorWidget2.qml',
70− 'pageSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/DefaultIndicatorPage2.qml'
71− },
72− 'indicator-datetime' : {
73− 'title': 'Date and Time',
74− 'description' : '',
75− 'widgetSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/DefaultIndicatorWidget2.qml',
76− 'pageSource' : ApplicationPaths.shellAppDirectory()+'/Panel/Indicators/DefaultIndicatorPage2.qml'
77− }
78− }
79−}
Panel/MenuContent.qml+9−2
@@ -100,16 +100,17 @@ MainView {
100100 Tab {
101101 id: tab
102102 objectName: model.identifier
103− title: model.title
104103
105104 page: Page {
106105 Loader {
106+ id: loader
107107 clip: true
108108 anchors.fill: parent
109109 source: pageSource
110110 asynchronous: true
111111
112− property bool contentActive: content.__contentActive && menuActivator.content[index].active
112+ readonly property bool indexActive: index >= 0 && index < menuActivator.count && menuActivator.content[index].active
113+ readonly property bool contentActive: content.__contentActive && indexActive
113114
114115 onContentActiveChanged: {
115116 if (contentActive && item) {
@@ -136,6 +137,12 @@ MainView {
136137 item.start()
137138 }
138139 }
140+
141+ Binding {
142+ target: tab
143+ property: "title"
144+ value: loader.item && loader.item.hasOwnProperty("title") && loader.item.title !== "" ? loader.item.title : model.identifier
145+ }
139146 }
140147 }
141148 }
Panel/Panel.qml+3−2
@@ -73,6 +73,7 @@ Item {
7373
7474 Indicators {
7575 id: indicatorsMenu
76+ objectName: "indicators"
7677
7778 anchors.right: parent.right
7879 y: panelBackground.y
@@ -82,6 +83,7 @@ Item {
8283 panelHeight: __panelMinusSeparatorLineHeight
8384 openedHeight: parent.height + (pinnedMode ? 0 : root.panelHeight)
8485 pinnedMode: !fullscreenMode
86+ overFlowWidth: search.state=="hidden" ? parent.width : parent.width - search.width
8587
8688 property real unitProgress: (height - panelHeight) / (openedHeight - panelHeight)
8789 }
@@ -120,14 +122,13 @@ Item {
120122 return "hidden";
121123 }
122124 }
123− if (root.searchVisible) {
125+ if (root.searchVisible && !indicatorsMenu.showAll) {
124126 return "visible";
125127 }
126128
127129 return "hidden";
128130 }
129131
130− width: units.gu(13)
131132 height: __panelMinusSeparatorLineHeight
132133 anchors {
133134 top: panelBackground.top
Panel/SearchIndicator.qml+9−8
@@ -21,7 +21,7 @@ import "../Components"
2121Item {
2222 id: search
2323
24− width: units.gu(9)
24+ width: container.width + units.gu(2)
2525 height: units.gu(3)
2626
2727 property string headerText: i18n.tr("Search")
@@ -34,21 +34,24 @@ Item {
3434 onClicked: search.clicked()
3535 }
3636
37− Item {
37+ Row {
3838 id: container
3939 objectName: "container"
4040
41− width: parent.width
4241 height: parent.height
42+ width: childrenRect.width
43+ anchors {
44+ left: parent.left
45+ leftMargin: units.gu(1)
46+ }
47+ spacing: units.gu(1)
4348
44− Behavior on opacity { StandardAnimation {} }
49+ Behavior on opacity { StandardAnimation { duration: 300 } }
4550
4651 Image {
4752 id: icon
4853 source: "graphics/search.png"
4954 anchors.verticalCenter: parent.verticalCenter
50− anchors.left: parent.left
51− anchors.leftMargin: units.gu(1)
5255 }
5356
5457 Label {
@@ -56,8 +59,6 @@ Item {
5659 color: Qt.rgba(0.8, 0.8, 0.8, 1.0)
5760 fontSize: "small"
5861 font.capitalization: Font.AllUppercase
59− anchors.left: icon.right
60− anchors.leftMargin: units.gu(1)
6162 anchors.verticalCenter: parent.verticalCenter
6263 }
6364 }
Shell.qml+56−37
@@ -88,14 +88,6 @@ BasicShell {
8888 }
8989 }
9090
91− Connections {
92− target: applicationManager
93− ignoreUnknownSignals: true
94− onFocusRequested: {
95− shell.activateApplication(desktopFile);
96− }
97− }
98−
9991 function activateApplication(desktopFile, argument) {
10092 if (applicationManager) {
10193 // For newly started applications, as it takes them time to draw their first frame
@@ -348,7 +340,7 @@ BasicShell {
348340
349341 width: shell.edgeSize
350342 direction: Direction.Leftwards
351− enabled: edgeDemo.dashEnabled
343+ enabled: greeter.showProgress == 0 && edgeDemo.dashEnabled
352344 property bool haveApps: mainStage.applications.count > 0 || sideStage.applications.count > 0
353345
354346 maxTotalDragDistance: haveApps ? parent.width : parent.width * 0.7
@@ -358,38 +350,54 @@ BasicShell {
358350 }
359351 }
360352
353+ InputFilterArea {
354+ anchors.fill: parent
355+ blockInput: !applicationFocused || launcher.shown
356+ || panel.indicators.shown || hud.shown
357+ }
358+
361359 Connections {
362− id: powerConnection
363− target: Powerd
360+ id: sessionConnection
361+ target: SessionManager
364362
365363 property var previousMainApp: null
366364 property var previousSideApp: null
367365
368− function setFocused(focused) {
369− if (!focused) {
370− powerConnection.previousMainApp = applicationManager.mainStageFocusedApplication;
371− powerConnection.previousSideApp = applicationManager.sideStageFocusedApplication;
372− applicationManager.unfocusCurrentApplication();
366+ function removeApplicationFocus() {
367+ sessionConnection.previousMainApp = applicationManager.mainStageFocusedApplication;
368+ sessionConnection.previousSideApp = applicationManager.sideStageFocusedApplication;
369+ applicationManager.unfocusCurrentApplication();
370+ }
371+
372+ function restoreApplicationFocus() {
373+ if (sessionConnection.previousMainApp) {
374+ applicationManager.focusApplication(sessionConnection.previousMainApp);
375+ sessionConnection.previousMainApp = null;
376+ }
377+ if (sessionConnection.previousSideApp) {
378+ applicationManager.focusApplication(sessionConnection.previousSideApp);
379+ sessionConnection.previousSideApp = null;
380+ }
381+ }
382+
383+ onActiveChanged: {
384+ if (SessionManager.active) {
385+ restoreApplicationFocus();
373386 } else {
374− if (powerConnection.previousMainApp) {
375− applicationManager.focusApplication(powerConnection.previousMainApp);
376− powerConnection.previousMainApp = null;
377− }
378− if (powerConnection.previousSideApp) {
379− applicationManager.focusApplication(powerConnection.previousSideApp);
380− powerConnection.previousSideApp = null;
381− }
387+ removeApplicationFocus();
382388 }
383389 }
390+ }
391+
392+ Connections {
393+ id: powerConnection
394+ target: Powerd
384395
385396 onDisplayPowerStateChange: {
386397 // We ignore any display-off signals when the proximity sensor
387398 // is active. This usually indicates something like a phone call.
388399 if (status == Powerd.Off && (flags & Powerd.UseProximity) == 0) {
389− powerConnection.setFocused(false);
390400 SessionManager.lock();
391− } else if (status == Powerd.On) {
392− powerConnection.setFocused(true);
393401 }
394402
395403 // No reason to chew demo CPU when user isn't watching
@@ -401,13 +409,9 @@ BasicShell {
401409 }
402410 }
403411
404− function showHome() {
405− // Animate if moving between application and dash
406− if (!stages.shown) {
407− dash.setCurrentScope("home.scope", true, false)
408− } else {
409− dash.setCurrentScope("home.scope", false, false)
410− }
412+ function showHome(fromLauncher) {
413+ var animate = fromLauncher && !stages.shown
414+ dash.setCurrentScope("home.scope", animate, false)
411415 stages.hide()
412416 }
413417
@@ -426,6 +430,7 @@ BasicShell {
426430 contentEnabled: edgeDemo.panelContentEnabled
427431 }
428432 fullscreenMode: shell.fullscreenMode
433+ searchVisible: dash.shown
429434
430435 InputFilterArea {
431436 anchors {
@@ -473,6 +478,7 @@ BasicShell {
473478 }
474479
475480 Bottombar {
481+ id: bottombar
476482 theHud: hud
477483 anchors.fill: parent
478484 enabled: hud.available
@@ -497,10 +503,10 @@ BasicShell {
497503 width: parent.width
498504 dragAreaWidth: shell.edgeSize
499505 available: edgeDemo.launcherEnabled
500− onDashItemSelected: showHome()
506+ onDashItemSelected: showHome(true)
501507 onDash: {
502508 if (stages.shown) {
503− dash.setCurrentScope("applications.scope", true, false)
509+ dash.setCurrentScope("applications.scope", true /* animate */, true /* reset */)
504510 stages.hide();
505511 launcher.hide();
506512 }
@@ -512,6 +518,7 @@ BasicShell {
512518 if (shown) {
513519 panel.indicators.hide()
514520 hud.hide()
521+ bottombar.hide()
515522 }
516523 }
517524 }
@@ -541,10 +548,17 @@ BasicShell {
541548 PropertyChanges { target: notifications; width: units.gu(38) }
542549 }
543550 ]
551+
552+ InputFilterArea {
553+ anchors { left: parent.left; right: parent.right }
554+ height: parent.contentHeight
555+ blockInput: height > 0
556+ }
544557 }
545558 }
546559
547560 focus: true
561+ onFocusChanged: if (!focus) forceActiveFocus();
548562
549563 InputFilterArea {
550564 anchors {
@@ -562,6 +576,11 @@ BasicShell {
562576 value: "unity8"
563577 }
564578
579+ OSKController {
580+ anchors.topMargin: panel.panelHeight
581+ anchors.fill: parent // as needs to know the geometry of the shell
582+ }
583+
565584 //FIXME: This should be handled in the input stack, keyboard shouldnt propagate
566585 MouseArea {
567586 anchors.bottom: parent.bottom
@@ -596,6 +615,6 @@ BasicShell {
596615
597616 Connections {
598617 target: SessionBroadcast
599− onShowHome: showHome()
618+ onShowHome: showHome(false)
600619 }
601620}
data/unity8-setcap.confnew file+32
@@ -0,0 +1,32 @@
1+# unity8-setcap - ugly hacks to arrange for /usr/bin/unity8 to have CAP_SYS_RESOURCE
2+
3+# XXX replace me with some root-helper to gain CAP_SYS_RESOURCE XXX
4+
5+author "Loïc Minier <loic.minier@ubuntu.com>"
6+description "Ugly hacks to arrange for /usr/bin/unity8 to have CAP_SYS_RESOURCE"
7+
8+# start when first boot-hooks event is emitted and before lightdm (lightdm
9+# starts ubuntu-touch-session which starts unity8); note that /run is
10+# guaranteeds to be be there because lightdm starts on filesystem
11+start on boot-hooks and starting lightdm
12+
13+# NOT a task as otherwise this would block restarting lightdm
14+
15+env RUNDIR=/run/unity8-setcap
16+
17+# work needs to be done in pre-start as this really is a job with nothing to
18+# start
19+pre-start script
20+ if [ ! -e "$RUNDIR" ]; then
21+ mkdir "$RUNDIR"
22+ # /run is noexec, hence mounting another tmpfs exec
23+ # NB: unity8 is 35K; 512K should be enough for everyone
24+ mount -o rw,nosuid,nodev,exec,relatime,mode=755,size=512k -t tmpfs tmpfs "$RUNDIR"
25+ cp -a /usr/bin/unity8 "$RUNDIR"
26+ setcap CAP_SYS_RESOURCE=+ep "$RUNDIR/unity8"
27+ # bind-mount this back as unity8 checks dirname(argv[0]'s) == /usr to
28+ # decide whether it's installed or not
29+ mount --bind "$RUNDIR/unity8" /usr/bin/unity8
30+ fi
31+end script
32+
data/unity8.confnew file+9
@@ -0,0 +1,9 @@
1+description "Unity Shell v8"
2+author "Ricardo Mendoza <ricmm@ubuntu.com>"
3+
4+start on ((xsession SESSION=ubuntu-touch) or (xsession SESSION=ubuntu-touch-surfaceflinger)) and started dbus
5+stop on desktop-end
6+
7+respawn
8+
9+exec ${BINARY:-unity8} $ARGS
debian/changelog+391
@@ -1,3 +1,394 @@
1+unity8 (7.83) UNRELEASED; urgency=low
2+
3+ * Replace ubuntu-touch-session's unity8.conf upstart job.
4+
5+ -- Michał Sawicz <michal.sawicz@canonical.com> Tue, 15 Oct 2013 01:12:45 +0200
6+
7+unity8 (7.82+13.10.20131011.2-0ubuntu1) saucy; urgency=low
8+
9+ [ Michał Sawicz ]
10+ * Work around Mir not delivering input to shell after restart, if the
11+ device isn't reinitialized.
12+
13+ [ Albert Astals ]
14+ * Remove unused DashMusic/DashVideos.
15+ * Don't let the user change between scopes if the current one is
16+ moving up/down.
17+ * Fix two uninitialized variable uses reported by valgrind ==17988==
18+ Conditional jump or move depends on uninitialised value(s) ==17988==
19+ at 0x13839F3A: AccountsService::updateDemoEdges()
20+ (AccountsService.cpp:74) ==17988== by 0x13839DA5:
21+ AccountsService::setUser(QString const&) (AccountsService.cpp:45)
22+ ==17988== by 0x1383F67B:
23+ AccountsService::qt_metacall(QMetaObject::Call, int, void**)
24+ (moc_AccountsService.cpp:192) ==17988== by 0x496143D:
25+ StoreProperty(QV8Engine*, QObject*, QQmlPropertyData*,
26+ v8::Handle<v8::Value>) (in /usr/lib/arm-linux-
27+ gnueabihf/libQt5Qml.so.5.0.2) ==17988== ==17988== Conditional jump
28+ or move depends on uninitialised value(s) ==17988== at 0x1383A0F6:
29+ AccountsService::updateStatsWelcomeScreen() (AccountsService.cpp:92)
30+ ==17988== by 0x13839DB1: AccountsService::setUser(QString const&)
31+ (AccountsService.cpp:47) ==17988== by 0x1383F67B:
32+ AccountsService::qt_metacall(QMetaObject::Call, int, void**)
33+ (moc_AccountsService.cpp:192) ==17988== by 0x496143D:
34+ StoreProperty(QV8Engine*, QObject*, QQmlPropertyData*,
35+ v8::Handle<v8::Value>) (in /usr/lib/arm-linux-
36+ gnueabihf/libQt5Qml.so.5.0.2)
37+ * Fix unitialized variable in Scope ==18457== Conditional jump or move
38+ depends on uninitialised value(s) ==18457== at 0x15AD1FD6:
39+ Scope::setActive(bool) (scope.cpp:165) ==18457== by 0x15B0023D:
40+ Scope::qt_metacall(QMetaObject::Call, int, void**)
41+ (moc_scope.cpp:478) ==18457== by 0x48B709F:
42+ QQmlPropertyPrivate::write(QObject*, QQmlPropertyData const&,
43+ QVariant const&, QQmlContextData*,
44+ QFlags<QQmlPropertyPrivate::WriteFlag>) (in /usr/lib/arm-linux-
45+ gnueabihf/libQt5Qml.so.5.0.2)
46+ * Fix crash on the phone For some reason i'm getting v8 crashes
47+ without this when shuting down unity-mir
48+
49+ [ Gerry Boland ]
50+ * Use focusRequested signal from AppManager. WM: AppManager has new
51+ signal to ask shell to request focus for app - use it to properly
52+ animate and focus the app. If app wants to be side stage, but no
53+ side stage available, override the application stage.
54+
55+ [ Nick Dedekind ]
56+ * Only use the root action state as a unitymenumodel ActionStateParser
57+ when needed.
58+
59+ [ Andrea Cimitan ]
60+ * Move the close app icon on top left.
61+ * The header of category list is already on screen after unlock
62+
63+ [ Michael Zanetti ]
64+ * Make the greeter's clock update in sync with the indicators.
65+
66+ [ Omer Akram ]
67+ * Increase dash header height to 5gu.
68+
69+ [ Nicolas d'Offay ]
70+ * Standardised expansion speed in scopes.
71+
72+ [ Ubuntu daily release ]
73+ * Automatic snapshot from revision 449
74+
75+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 11 Oct 2013 17:26:34 +0000
76+
77+unity8 (7.82+13.10.20131011.1-0ubuntu1) saucy; urgency=low
78+
79+ [ Michał Sawicz ]
80+ * Fix frequent application IDs and drop old AppsAvailableForDownload
81+ model.
82+ * Unrevert r388 now that we have fixed the infinite loop it was
83+ causing in Qt.
84+
85+ [ Steve Langasek ]
86+ * Don't keep a long-lived connection open to upstart when we only use
87+ it for two events, one at load time and one at unload time.
88+
89+ [ Lars Uebernickel ]
90+ * VolumeControl: use 'volume' instead of 'scroll' action The volume
91+ action doesn't show a notification.
92+
93+ [ Michael Terry ]
94+ * Disable DragHandle on right side of screen while the greeter is
95+ animating
96+
97+ [ Marcus Tomlinson ]
98+ * Added missing "enabled" property to "progressMenu" component in the
99+ menu item factory.
100+
101+ [ Michael Zanetti ]
102+ * Add scaleTo: "fit" mode support to LazyImage
103+
104+ [ Andrea Cimitan ]
105+ * Add music and video renderers
106+ * Use shell.edgeSize for BottomBar's EdgeDragArea, detecting gestures
107+ only when they are within the edgeSize.
108+
109+ [ Nick Dedekind ]
110+ * Removed greeter "toHome" animation (LP#1092976) (LP: #1092976)
111+ * Only show Snap Decision notification actions when available.
112+
113+ [ Albert Astals ]
114+ * Dash: Set delegate creation range for inner itemviewss If it's above
115+ the list viewport we set it to the end of the list to precache the
116+ last items It it's below the list viewport we set it to the
117+ beginning to precache the first items Otherwise we set it to the
118+ part of the viewport in the view Approved by: Michał Sawicz.
119+
120+ [ Ubuntu daily release ]
121+ * Automatic snapshot from revision 435
122+
123+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 11 Oct 2013 09:05:30 +0000
124+
125+unity8 (7.82+13.10.20131010-0ubuntu1) saucy; urgency=low
126+
127+ [ David Callé ]
128+ * Small logic change in preview descriptions line breaks. Multiple new
129+ lines are now replaced by multiple br tags.
130+
131+ [ Nick Dedekind ]
132+ * Use indicator identifier for indicators-client list item label.
133+ * Make sure overflow indicators are hidden and not the search label.
134+
135+ [ Mirco Müller ]
136+ * Tweaks to notifications to improve spec-compliance. - updated
137+ notifications-qmltest to reflect the use of a variant-map for the
138+ hints - made text-fields as heigh as buttons - made the summary
139+ align horizontally to the icon - updated button-height and bubble-
140+ background.
141+
142+ [ Pawel Stolowski ]
143+ * Handle category_order_changes signal from scopes (used in Home only)
144+ and reorder categories accordingly.
145+ * Implementation of albumart image provider for audio content.
146+
147+ [ Michael Terry ]
148+ * Hide the greeter when an app is focused, fixing snap decisions
149+ launching an app in the greeter (like receiving a call).
150+
151+ [ Michael Zanetti ]
152+ * Launcher - remove support for pinning items in the backend After the
153+ latest design changes, recent apps is everything that is contained
154+ in the ApplicationManager. So no need for storing anything else than
155+ pinned apps in the config.
156+
157+ [ Michał Sawicz ]
158+ * Remove the mir socket before starting unity8 during autopilot tests.
159+
160+ [ Ubuntu daily release ]
161+ * Automatic snapshot from revision 420
162+
163+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 10 Oct 2013 04:15:13 +0000
164+
165+unity8 (7.82+13.10.20131008.1-0ubuntu1) saucy; urgency=low
166+
167+ [ Michal Hruby ]
168+ * Add Scope::isActive property and corresponding tests. (LP: #1230352)
169+
170+ [ Daniel d'Andrada ]
171+ * Move OSKController to the front as it will now also block input
172+ meant to the OSK That's in the unity-mir implementation. The
173+ SurfaceFlinger one is still an empty noop. Currently, when the OSK
174+ is up, both shell and OSK get user input, thus we need the
175+ OSKController to shield our shell components from them. (LP:
176+ #1236773)
177+
178+ [ Michał Sawicz ]
179+ * Add Scope::isActive property and corresponding tests. (LP: #1230352)
180+ * Force focus back on shell in case it loses it for some reason.
181+
182+ [ Ubuntu daily release ]
183+ * Automatic snapshot from revision 409
184+
185+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 08 Oct 2013 19:14:20 +0000
186+
187+unity8 (7.82+13.10.20131008-0ubuntu1) saucy; urgency=low
188+
189+ [ Michał Sawicz ]
190+ * update previews to match design. (LP: #1224555)
191+ * Add an InputFilterArea in Notifications. (LP: #1233411, #1235215)
192+
193+ [ Ying-Chun Liu ]
194+ * update previews to match design. (LP: #1224555)
195+
196+ [ Albert Astals ]
197+ * Unrevert 376 by reverting r395 and a small fix to fix the cpu
198+ hogging issue . (LP: #1124567)
199+
200+ [ Michael Terry ]
201+ * Add Showable.showNow() method and use it in Shell to immediately
202+ show greeter when we blank the screen rather than animating it. (LP:
203+ #1233564)
204+
205+ [ Michael Zanetti ]
206+ * update previews to match design. (LP: #1224555)
207+
208+ [ Diego Sarmentero ]
209+ * update previews to match design. (LP: #1224555)
210+
211+ [ Ubuntu daily release ]
212+ * Automatic snapshot from revision 404
213+
214+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 08 Oct 2013 02:57:55 +0000
215+
216+unity8 (7.82+13.10.20131007-0ubuntu1) saucy; urgency=low
217+
218+ [ Michał Sawicz ]
219+ * Respect pre-set import and library paths and prevent segfault in
220+ startShell.
221+
222+ [ Ubuntu daily release ]
223+ * Automatic snapshot from revision 399
224+
225+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 07 Oct 2013 07:10:46 +0000
226+
227+unity8 (7.82+13.10.20131005-0ubuntu1) saucy; urgency=low
228+
229+ [ Michał Sawicz ]
230+ * Revert r376 that caused constant CPU usage due to the
231+ ActivityIndicator.
232+
233+ [ Nick Dedekind ]
234+ * Removed indicators-client autopilot tests. (LP: #1234736)
235+
236+ [ Albert Astals ]
237+ * Revert r388. (LP: #1235268)
238+
239+ [ Christopher Lee ]
240+ * Removes passing -fullscreen to unity8 when on the device (as per bug
241+ #1235065). (LP: #1235065)
242+
243+ [ Ubuntu daily release ]
244+ * Automatic snapshot from revision 396
245+
246+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Sat, 05 Oct 2013 11:45:14 +0000
247+
248+unity8 (7.82+13.10.20131004.2-0ubuntu1) saucy; urgency=low
249+
250+ * Revert 7.82+13.10.20131004.1-0ubuntu1 back to
251+ 7.81.3+13.10.20130927.3-0ubuntu1 due to CPU hogging issue with
252+ 7.82+13.10.20131004.1-0ubuntu1.
253+
254+ -- Loïc Minier <loic.minier@ubuntu.com> Fri, 04 Oct 2013 21:22:29 +0200
255+
256+unity8 (7.82+13.10.20131004.1-0ubuntu1) saucy; urgency=low
257+
258+ [ Michał Sawicz ]
259+ * Bump to indicate support for extended snap decisions.
260+ * Make Tile themeable, add renderers for Dash Plugins and weather.
261+ (LP: #1231948)
262+ * Drop network agents now that they're in indicator-network instead.
263+
264+ [ Michal Hruby ]
265+ * Differentiate generic and music carousels.
266+ * Use the thumbnailer image provider for scope results that don't
267+ specify icon as well as for previews.
268+ * Added an indicator which is displayed in the search bar whenever a
269+ search is in progress. Added accompanying test in tst_PageHeader.
270+ * Expose rendererHint to shell.
271+
272+ [ Albert Astals ]
273+ * Update pot file. (LP: #1232374)
274+ * Only enable the animation when the item is on screen (i.e. !culled)
275+ . (LP: #1200374)
276+ * Do not crash on positionAtBeginning if the list is empty .
277+ * Enable/disable running apps height animation in a less error prone
278+ way.
279+
280+ [ Michael Terry ]
281+ * Use a chevron after 'Skip intro' and drop the underlining.
282+ * Load testability driver when QT_LOAD_TESTABILITY is set. (LP:
283+ #1226234)
284+ * Listen to the system setting StatsWelcomeScreen, which tells us
285+ whether to show user-specific infographic data in the greeter. (LP:
286+ #1207857)
287+
288+ [ Gerry Boland ]
289+ * WM: ensure focusedApplicationWhenUsingScreenshots reset when unused,
290+ and only used when set. Fixes window focus conflict between shell
291+ and ApplicationManager.
292+
293+ [ Nick Dedekind ]
294+ * Removed deprecated Unity.IndicatorsLegacy plugin.
295+ * Added actionState parser to the indicators-client text printer so
296+ that we get the icon.
297+ * Moved indicator page titles to the root action state of menu model.
298+ (LP: #1223635)
299+
300+ [ Mirco Müller ]
301+ * Added rendering- and interaction-support for the first three
302+ extended snap-decision dialog-cases password-entry, user-
303+ authentication and simunlock.
304+
305+ [ Daniel d'Andrada ]
306+ * Revert the reversion of r304 since it doesn't seem to crash anymore
307+ Original commit was Reset apps scope when returning from app to dash
308+ (LP #1193419) If an app is on foreground and you perform a long
309+ left-edge swipe to minimize it, and therefore return to the dash,
310+ the dash should be in the Applications scope and showing the
311+ running/recents applications. (LP: #1193419)
312+
313+ [ Andrea Cimitan ]
314+ * Add behaviours to the hud reveal. (LP: #1224480, #1224633)
315+ * Make Tile themeable, add renderers for Dash Plugins and weather.
316+ (LP: #1231948)
317+
318+ [ Michael Zanetti ]
319+ * fix inserting into quicklistmodel.
320+ * Drop useStorage argument and use exising LAUNCHER_TESTING define for
321+ this decision.
322+
323+ [ Omer Akram ]
324+ * Make the volume/brightness slider changes realtime. (LP: #1227595)
325+
326+ [ Nicolas d'Offay ]
327+ * Fixed black colour on the first of the month due to division. (LP:
328+ #1233657)
329+ * Added an indicator which is displayed in the search bar whenever a
330+ search is in progress. Added accompanying test in tst_PageHeader.
331+
332+ [ Ubuntu daily release ]
333+ * Automatic snapshot from revision 390
334+
335+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 04 Oct 2013 06:55:16 +0000
336+
337+unity8 (7.81.3+13.10.20130927.3-0ubuntu1) saucy; urgency=low
338+
339+ [ Michal Hruby ]
340+ * Correctly handle image URI scheme in results.
341+
342+ [ Michał Sawicz ]
343+ * Make SHOW_DASH and HIDE_DASH close the current preview. (LP:
344+ #1231404)
345+ * Add a LazyImage component that shows an activity spinner for long-
346+ loading images and handles aspect ratio properly.
347+ * Fix Qt 5.1 FTBFS and suppress some build warnings.
348+
349+ [ Albert Astals ]
350+ * Make sure we always have least have one column in the gridview. (LP:
351+ #1225391)
352+ * LVWPH: Make sure we always overshoot vertically. (LP: #1229851)
353+ * Remember the expanded categoryId and not the expanded index The
354+ index can change on search, and we still want to maintain it
355+ expanded in that case. (LP: #1230216)
356+ * Fix showHeader in an edge case of notShownByItsOwn Not all the tests
357+ i've added fail without the code fix, but i've added them just to be
358+ more covered . (LP: #1230187)
359+
360+ [ Diego Sarmentero ]
361+ * Handling error signal from the DownloadTracker plugin (BUG:
362+ #1229744). (LP: #1229744)
363+ * Remove "Reviews and Comments" section from Application Preview until
364+ the feature is ready (BUG: #1226632) - Detect when the keyboard is
365+ being shown to allow the user to scroll the Preview even more if
366+ necessary to interact with the components at the bottom of that
367+ preview, and don't leave those components obscured behind the
368+ keyboard (BUG: #1226638). (LP: #1226632, #1224717, #1226638)
369+
370+ [ Nick Dedekind ]
371+ * Brought messaging indicator inline with UnityMenuModel &
372+ UnityMenuAction. (LP: #1217676, #1217678)
373+
374+ [ Pawel Stolowski ]
375+ * Support canned search queries returned by Home Scope.
376+ * Cancel previous actions and previews on new activation / preview.
377+ Expose previewed data row in Preview object.
378+
379+ [ Michael Terry ]
380+ * Only enable the Bottombar when the HUD is available. (LP: #1220306)
381+ * Increase the "Skip intro" clickable area, making dismissing the edge
382+ demo intro feel more natural. (LP: #1220632)
383+
384+ [ Michael Zanetti ]
385+ * drop our CrossFadeImage in favor of the SDK one. (LP: #1227783)
386+
387+ [ Ubuntu daily release ]
388+ * Automatic snapshot from revision 358
389+
390+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 27 Sep 2013 14:13:22 +0000
391+
1392unity8 (7.81.3+13.10.20130924.2-0ubuntu1) saucy; urgency=low
2393
3394 [ Michal Hruby ]
debian/control+9−9
@@ -14,21 +14,20 @@ Build-Depends: cmake,
1414 libjson-perl,
1515 libnih-dbus-dev,
1616 libnih-dev,
17− libnm-glib-dev,
18− libnm-util-dev,
1917 liblightdm-qt5-3-dev,
2018 libpulse-dev,
2119 libqmenumodel-dev (>= 0.2.7),
2220 libqt5v8-5-private-dev,
2321 libsigc++-2.0-dev,
2422 libunity-api-dev (>= 7.80.3),
25− libunity-core-6.0-dev (<< 7.80),
23+ libunity-core-6.0-dev (>= 7.1.1),
2624 libunity-dev (>= 7.0.12),
2725 libunity-mir-dev,
2826 libunity-scopes-json-def-phone,
2927 libupstart-dev,
3028 libusermetricsoutput1-dev,
3129 libxcb1-dev,
30+ libglib2.0-dev,
3231 pkg-config,
3332 python:any (>= 2.7),
3433 python-setuptools,
@@ -44,6 +43,7 @@ Build-Depends: cmake,
4443 qtdeclarative5-test-plugin,
4544 qtdeclarative5-ubuntu-ui-toolkit-plugin,
4645 qtdeclarative5-xmllistmodel-plugin,
46+ libqt5xmlpatterns5-dev,
4747 ttf-ubuntu-font-family,
4848Standards-Version: 3.9.4
4949Homepage: http://launchpad.net/unity
@@ -76,16 +76,17 @@ Depends: gsettings-desktop-schemas,
7676 qtdeclarative5-xmllistmodel-plugin,
7777 unity-greeter-session-broadcast,
7878 unity-launcher-impl-3,
79− unity-notifications-impl-1,
79+ unity-notifications-impl-2,
8080 unity8-fake-env | qtubuntu-shell,
8181 unity8-private (= ${binary:Version}),
8282 unity8-private | unity-launcher-impl,
83+# for setcap:
84+ libcap2-bin,
8385 ${misc:Depends},
8486 ${shlibs:Depends},
85−Recommends: indicator-battery,
86− indicator-messages,
87− indicator-time,
88− ${unity-default-masterscopes},
87+Recommends: ${unity-default-masterscopes},
88+Breaks: indicator-network (<< 0.5.1)
89+Replaces: ubuntu-touch-session (<< 0.82~)
8990Description: Unity 8 shell
9091 The Unity 8 shell is the primary user interface for Ubuntu devices.
9192
@@ -102,7 +103,6 @@ Description: Ubuntu QML greeter
102103Package: unity8-autopilot
103104Architecture: all
104105Depends: gir1.2-glib-2.0,
105− indicators-client (>= ${source:Version}),
106106 libautopilot-qt,
107107 libqt5test5,
108108 libqt5widgets5,
debian/unity8.install+2−1
@@ -12,4 +12,5 @@ usr/share/unity8/Panel
1212usr/share/unity8/Shell.qml
1313usr/share/unity8/SideStage
1414usr/share/unity8/graphics
15−usr/share/unity8/unity/indicators/*
15+data/unity8.conf usr/share/upstart/sessions/
16+data/unity8-setcap.conf etc/init/boot-hooks/
main.cpp+5−4
@@ -114,7 +114,7 @@ int startShell(int argc, const char** argv, void* server)
114114
115115 // The testability driver is only loaded by QApplication but not by QGuiApplication.
116116 // However, QApplication depends on QWidget which would add some unneeded overhead => Let's load the testability driver on our own.
117− if (args.contains(QLatin1String("-testability"))) {
117+ if (args.contains(QLatin1String("-testability")) || getenv("QT_LOAD_TESTABILITY")) {
118118 QLibrary testLib(QLatin1String("qttestability"));
119119 if (testLib.load()) {
120120 typedef void (*TasInitialize)(void);
@@ -161,10 +161,10 @@ int startShell(int argc, const char** argv, void* server)
161161 prependImportPaths(view->engine(), ::overrideImportPaths());
162162 appendImportPaths(view->engine(), ::fallbackImportPaths());
163163
164− QStringList importPath = view->engine()->importPathList().filter("qt5/imports");
165164 if (isUbuntuMirServer) {
166− importPath.first().append("/Unity-Mir");
167− view->engine()->addImportPath(importPath.first());
165+ QStringList importPaths = view->engine()->importPathList();
166+ importPaths.replaceInStrings(QRegExp("qt5/imports$"), "qt5/imports/Unity-Mir");
167+ view->engine()->setImportPathList(importPaths);
168168 }
169169
170170 view->setSource(source);
@@ -182,6 +182,7 @@ int startShell(int argc, const char** argv, void* server)
182182
183183 int result = application->exec();
184184
185+ delete view;
185186 delete mouseTouchAdaptor;
186187 delete application;
187188
plugins/AccountsService/AccountsService.cpp+23−1
@@ -23,7 +23,10 @@
2323
2424AccountsService::AccountsService(QObject* parent)
2525 : QObject(parent),
26− m_service(new AccountsServiceDBusAdaptor(this))
26+ m_service(new AccountsServiceDBusAdaptor(this)),
27+ m_user(qgetenv("USER")),
28+ m_demoEdges(false),
29+ m_statsWelcomeScreen(false)
2730{
2831 connect(m_service, SIGNAL(propertiesChanged(const QString &, const QString &, const QStringList &)),
2932 this, SLOT(propertiesChanged(const QString &, const QString &, const QStringList &)));
@@ -46,6 +49,7 @@ void AccountsService::setUser(const QString &user)
4649
4750 updateDemoEdges();
4851 updateBackgroundFile();
52+ updateStatsWelcomeScreen();
4953}
5054
5155bool AccountsService::demoEdges() const
@@ -75,6 +79,11 @@ QString AccountsService::backgroundFile() const
7579 return m_backgroundFile;
7680}
7781
82+bool AccountsService::statsWelcomeScreen() const
83+{
84+ return m_statsWelcomeScreen;
85+}
86+
7887void AccountsService::updateDemoEdges()
7988{
8089 auto demoEdges = m_service->getUserProperty(m_user, "com.canonical.unity.AccountsService", "demo-edges").toBool();
@@ -102,6 +111,15 @@ void AccountsService::updateBackgroundFile()
102111 }
103112}
104113
114+void AccountsService::updateStatsWelcomeScreen()
115+{
116+ bool statsWelcomeScreen = m_service->getUserProperty(m_user, "com.ubuntu.touch.AccountsService.SecurityPrivacy", "StatsWelcomeScreen").toBool();
117+ if (m_statsWelcomeScreen != statsWelcomeScreen) {
118+ m_statsWelcomeScreen = statsWelcomeScreen;
119+ Q_EMIT statsWelcomeScreenChanged();
120+ }
121+}
122+
105123void AccountsService::propertiesChanged(const QString &user, const QString &interface, const QStringList &changed)
106124{
107125 if (interface == "com.canonical.unity.AccountsService") {
@@ -113,6 +131,10 @@ void AccountsService::propertiesChanged(const QString &user, const QString &inte
113131 updateDemoEdges();
114132 }
115133 }
134+ } else if (interface == "com.ubuntu.touch.AccountsService.SecurityPrivacy") {
135+ if (changed.contains("StatsWelcomeScreen")) {
136+ updateStatsWelcomeScreen();
137+ }
116138 }
117139}
118140
plugins/AccountsService/AccountsService.h+7
@@ -42,6 +42,9 @@ class AccountsService: public QObject
4242 Q_PROPERTY (QString backgroundFile
4343 READ backgroundFile
4444 NOTIFY backgroundFileChanged)
45+ Q_PROPERTY (bool statsWelcomeScreen
46+ READ statsWelcomeScreen
47+ NOTIFY statsWelcomeScreenChanged)
4548
4649public:
4750 explicit AccountsService(QObject *parent = 0);
@@ -53,12 +56,14 @@ public:
5356 bool demoEdgesForCurrentUser() const;
5457 void setDemoEdgesForCurrentUser(bool demoEdgesForCurrentUser);
5558 QString backgroundFile() const;
59+ bool statsWelcomeScreen() const;
5660
5761Q_SIGNALS:
5862 void userChanged();
5963 void demoEdgesChanged();
6064 void demoEdgesForCurrentUserChanged();
6165 void backgroundFileChanged();
66+ void statsWelcomeScreenChanged();
6267
6368private Q_SLOTS:
6469 void propertiesChanged(const QString &user, const QString &interface, const QStringList &changed);
@@ -68,12 +73,14 @@ private:
6873 void updateDemoEdges();
6974 void updateDemoEdgesForCurrentUser();
7075 void updateBackgroundFile();
76+ void updateStatsWelcomeScreen();
7177
7278 AccountsServiceDBusAdaptor *m_service;
7379 QString m_user;
7480 bool m_demoEdges;
7581 bool m_demoEdgesForCurrentUser;
7682 QString m_backgroundFile;
83+ bool m_statsWelcomeScreen;
7784};
7885
7986#endif
plugins/ListViewWithPageHeader/listviewwithpageheader.cpp+8−1
@@ -327,6 +327,9 @@ void ListViewWithPageHeader::setForceNoClip(bool noClip)
327327
328328void ListViewWithPageHeader::positionAtBeginning()
329329{
330+ if (m_delegateModel->count() <= 0)
331+ return;
332+
330333 qreal headerHeight = (m_headerItem ? m_headerItem->height() : 0);
331334 if (m_firstVisibleIndex != 0) {
332335 // TODO This could be optimized by trying to reuse the interesection
@@ -485,7 +488,7 @@ void ListViewWithPageHeader::viewportMoved(Qt::Orientations orient)
485488 // or the header is partially shown and we are not doing a maximizeVisibleArea either
486489 const bool scrolledUp = m_previousContentY > contentY();
487490 const bool notRebounding = contentY() + height() < contentHeight();
488− const bool notShownByItsOwn = contentY() + diff > m_headerItem->y() + m_headerItem->height();
491+ const bool notShownByItsOwn = contentY() + diff >= m_headerItem->y() + m_headerItem->height();
489492 const bool maximizeVisibleAreaRunning = m_contentYAnimation->isRunning() && contentYAnimationType == ContentYAnimationMaximizeVisibleArea;
490493
491494 if (!scrolledUp && contentY() == -m_minYExtent) {
@@ -1009,7 +1012,11 @@ void ListViewWithPageHeader::onModelUpdated(const QQmlChangeSet &changeSet, bool
10091012 }
10101013 }
10111014
1015+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
10121016 Q_FOREACH(const QQuickChangeSet::Change &change, changeSet.changes()) {
1017+#else
1018+ Q_FOREACH(const QQmlChangeSet::Change &change, changeSet.changes()) {
1019+#endif
10131020// qDebug() << "ListViewWithPageHeader::onModelUpdated Change" << change.index << change.count;
10141021 for (int i = change.index; i < change.count; ++i) {
10151022 ListItem *item = itemAtIndex(i);
plugins/SessionManager/SessionManager.h+4−2
@@ -30,8 +30,10 @@
3030class SessionManager: public QObject
3131{
3232 Q_OBJECT
33−
34− Q_PROPERTY(bool active READ active NOTIFY activeChanged FINAL)
33+ Q_PROPERTY(bool active
34+ READ active
35+ NOTIFY activeChanged
36+ FINAL)
3537
3638public:
3739 explicit SessionManager(QObject *parent = 0);
plugins/Unity/CMakeLists.txt+2−2
@@ -2,12 +2,11 @@
22include(Plugins)
33
44add_subdirectory(Indicators)
5−add_subdirectory(IndicatorsLegacy)
65
76# Dependencies
87include(FindPkgConfig)
98pkg_check_modules(QTDEE REQUIRED libdee-qt5>=3.2)
10−pkg_check_modules(UNITYCORE REQUIRED unity-core-6.0)
9+pkg_check_modules(UNITYCORE REQUIRED unity-core-6.0>=7.1.1)
1110
1211include_directories(
1312 ${CMAKE_CURRENT_SOURCE_DIR}
@@ -43,6 +42,7 @@ set(QMLPLUGIN_SRC
4342 preview.cpp
4443 previewaction.cpp
4544 previewinfohint.cpp
45+ result.cpp
4646 showallfilteroption.cpp
4747 signalslist.cpp
4848 socialpreview.cpp
plugins/Unity/Indicators/CMakeLists.txt+1
@@ -12,6 +12,7 @@ find_package(Qt5Core REQUIRED)
1212find_package(Qt5Quick REQUIRED)
1313
1414add_subdirectory(qml)
15+add_subdirectory(Messaging)
1516add_subdirectory(Network)
1617
1718include_directories(
plugins/Unity/IndicatorsLegacy/Messaging/CMakeLists.txt → plugins/Unity/Indicators/Messaging/CMakeLists.txtrenamed

The content is the same.

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

The content is the same.

plugins/Unity/IndicatorsLegacy/Messaging/qml/ActionTextField.qml → plugins/Unity/Indicators/Messaging/qml/ActionTextField.qmlrenamed+10−7
@@ -22,11 +22,12 @@ import QtQuick 2.0
2222import Ubuntu.Components 0.1
2323
2424Item {
25− property alias actionGroup: sendButton.actionGroup
26− property alias action: sendButton.action
27−
25+ id: textField
2826 property alias text: replyField.text
2927 property alias buttonText: sendButton.text
28+ property bool activateEnabled: false
29+
30+ signal activate(var value)
3031
3132 TextField {
3233 id: replyField
@@ -50,17 +51,19 @@ Item {
5051 }
5152 }
5253
53− ActionButton {
54+ Button {
5455 id: sendButton
55−
56− actionParameter: replyField.text
5756 anchors {
5857 top: parent.top
5958 bottom: parent.bottom
6059 right: parent.right
6160 }
6261 width: units.gu(9)
63− enabled: replyField.text !== ""
62+ enabled: replyField.text !== "" && textField.activateEnabled
6463 color: enabled ? "#c94212" : "#bababa"
64+
65+ onClicked: {
66+ textField.activate(replyField.text);
67+ }
6568 }
6669}
plugins/Unity/Indicators/Messaging/qml/CMakeLists.txtnew file+5
@@ -0,0 +1,5 @@
1+# export_qmlfiles macro
2+include(Plugins)
3+
4+# export the qmldir, *.qml files.
5+export_qmlfiles(Unity.Indicators.Messaging Unity/Indicators/Messaging)
plugins/Unity/IndicatorsLegacy/Messaging/qml/GroupedMessage.qml → plugins/Unity/Indicators/Messaging/qml/GroupedMessage.qmlrenamed+13−18
@@ -20,20 +20,19 @@
2020
2121import QtQuick 2.0
2222import Ubuntu.Components 0.1
23−import Unity.IndicatorsLegacy 0.1 as Indicators
23+import Unity.Indicators 0.1 as Indicators
2424
25−Indicators.BasicMenuItem {
25+Indicators.BaseMenuItem {
2626 id: groupedMessage
27+
28+ property alias title: __title.text
2729 property alias count: label.text
30+ property string appIcon: "qrc:/indicators/artwork/messaging/default_app.svg"
2831
29− color: "#221e1b"
30− implicitHeight: units.gu(10)
32+ signal activateApp()
33+ signal dismiss()
3134
32− Indicators.MenuAction {
33− id: menuAction
34− actionGroup: groupedMessage.actionGroup
35− action: menu ? menu.action : ""
36− }
35+ implicitHeight: units.gu(10)
3736
3837 Row {
3938 anchors.fill: parent
@@ -44,17 +43,17 @@ Indicators.BasicMenuItem {
4443 height: units.gu(6)
4544 width: units.gu(6)
4645 image: Image {
47− source: menu && (menu.extra.canonical_icon.length > 0) ? "image://theme/" + encodeURI(menu.extra.canonical_icon) : "qrc:/indicators/artwork/messaging/default_app.svg"
46+ source: groupedMessage.appIcon
4847 fillMode: Image.PreserveAspectFit
4948 }
5049 }
5150
5251 Label {
52+ id: __title
5353 anchors.verticalCenter: parent.verticalCenter
5454 color: "#e8e1d0"
5555 font.weight: Font.DemiBold
5656 fontSize: "medium"
57− text: menu && menu.label ? menu.label : ""
5857 }
5958
6059 Label {
@@ -65,7 +64,7 @@ Indicators.BasicMenuItem {
6564 color: "#e8e1d0"
6665 font.weight: Font.DemiBold
6766 fontSize: "medium"
68− text: menuAction.valid ? menuAction.state[0] : "0"
67+ text: "0"
6968 }
7069 }
7170
@@ -82,15 +81,11 @@ Indicators.BasicMenuItem {
8281 MouseArea {
8382 anchors.fill: parent
8483 onClicked: {
85− if (menuAction.valid) {
86− menuAction.activate(true);
87− }
84+ groupedMessage.activateApp();
8885 }
8986 }
9087
9188 onItemRemoved: {
92− if (menuAction.valid) {
93− menuAction.activate(false);
94− }
89+ groupedMessage.dismiss();
9590 }
9691}
plugins/Unity/IndicatorsLegacy/Messaging/qml/HeroMessage.qml → plugins/Unity/Indicators/Messaging/qml/HeroMessage.qmlrenamed+25−22
@@ -20,25 +20,30 @@
2020
2121import QtQuick 2.0
2222import Ubuntu.Components 0.1
23−import Unity.IndicatorsLegacy 0.1 as Indicators
23+import Unity.Indicators 0.1 as Indicators
2424
25−Indicators.BasicMenuItem {
25+Indicators.BaseMenuItem {
2626 id: heroMessage
2727
28− property variant actionsDescription: null
2928 property alias heroMessageHeader: __heroMessageHeader
3029 property real collapsedHeight: heroMessageHeader.y + heroMessageHeader.bodyBottom + units.gu(2)
3130 property real expandedHeight: collapsedHeight
3231
33− color: "#221e1c"
32+ property alias avatar: __heroMessageHeader.avatar
33+ property alias appIcon: __heroMessageHeader.icon
34+
35+ signal activateApp
36+ signal dismiss
3437
3538 removable: state !== "expanded"
3639 implicitHeight: collapsedHeight
3740
38− Indicators.MenuAction {
39− id: menuAction
40− actionGroup: heroMessage.actionGroup
41− action: menu ? menu.action : ""
41+ Rectangle {
42+ id: background
43+ property real alpha: 0.0
44+ anchors.fill: parent
45+ color: Qt.rgba(1.0, 1.0, 1.0, alpha)
46+ z: -1
4247 }
4348
4449 HeroMessageHeader {
@@ -48,25 +53,22 @@ Indicators.BasicMenuItem {
4853 anchors.left: parent.left
4954 anchors.right: parent.right
5055
51− avatar: menu && (menu.extra.canonical_icon.length > 0) ? "image://theme/" + encodeURI(menu.extra.canonical_icon) : "qrc:/indicators/artwork/messaging/default_contact.png"
52− icon: menu && (menu.extra.canonical_app_icon.length > 0) ? "image://theme/" + encodeURI(menu.extra.canonical_app_icon) : ""
56+ avatar: "qrc:/indicators/artwork/messaging/default_contact.png"
5357 appIcon: icon
5458
5559 state: heroMessage.state
5660
5761 onAppIconClicked: {
58− if (menuAction.valid) {
59− deactivateMenu();
60− action.activate(true);
61− }
62+ deselectMenu();
63+ heroMessage.activateApp();
6264 }
6365 }
6466
6567 onClicked: {
66− if (menuActivated) {
67− deactivateMenu();
68+ if (menuSelected) {
69+ deselectMenu();
6870 } else {
69− activateMenu();
71+ selectMenu();
7072 }
7173 }
7274
@@ -84,13 +86,16 @@ Indicators.BasicMenuItem {
8486
8587 states: State {
8688 name: "expanded"
87− when: menuActivated
89+ when: menuSelected
8890
8991 PropertyChanges {
9092 target: heroMessage
91− color: "#333130"
9293 implicitHeight: heroMessage.expandedHeight
9394 }
95+ PropertyChanges {
96+ target: background
97+ alpha: 0.05
98+ }
9499 PropertyChanges {
95100 target: __topHLine
96101 opacity: 0.0
@@ -113,8 +118,6 @@ Indicators.BasicMenuItem {
113118 }
114119
115120 onItemRemoved: {
116− if (menuAction.valid) {
117− menuAction.activate(false);
118− }
121+ heroMessage.dismiss();
119122 }
120123}
plugins/Unity/IndicatorsLegacy/Messaging/qml/HeroMessageHeader.qml → plugins/Unity/Indicators/Messaging/qml/HeroMessageHeader.qmlrenamed

The content is the same.

plugins/Unity/Indicators/Messaging/qml/MessageMenuItemFactory.qmlnew file+180
@@ -0,0 +1,180 @@
1+/*
2+ * Copyright 2013 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Authors:
17+ * Renato Araujo Oliveira Filho <renato@canonical.com>
18+ * Olivier Tilloy <olivier.tilloy@canonical.com>
19+ */
20+
21+import QtQuick 2.0
22+import Ubuntu.Components 0.1
23+import Unity.Indicators 0.1 as Indicators
24+import QMenuModel 0.1 as QMenuModel
25+import "utils.js" as Utils
26+
27+Indicators.BaseMenuItem {
28+ id: menuItem
29+ property var actionsDescription: menu ? menu.ext.xCanonicalMessageActions : undefined
30+
31+ implicitHeight: contents.status == Loader.Ready ? contents.item.implicitHeight : 0
32+
33+ property var model: null
34+
35+ Loader {
36+ id: contents
37+ anchors.fill: parent
38+
39+ sourceComponent: loadMessage(actionsDescription);
40+
41+ // Binding all properties for the item, to make sure that any change in the
42+ // property will be propagated to the contents.item at any time
43+ Binding {
44+ target: contents.item
45+ property: "menuSelected"
46+ value: menuSelected
47+ when: (contents.status == Loader.Ready)
48+ }
49+
50+ Binding {
51+ target: contents.item
52+ property: "menu"
53+ value: menu
54+ when: (contents.status == Loader.Ready)
55+ }
56+
57+ Connections {
58+ target: contents.item ? contents.item : null
59+ onSelectMenu: selectMenu()
60+ onDeselectMenu: deselectMenu()
61+ }
62+
63+ Component {
64+ id: simpleTextMessage
65+ SimpleTextMessage {
66+ // text
67+ title: menu && menu.label ? menu.label : ""
68+ time: menu ? Utils.formatDate(menu.ext.xCanonicalTime) : ""
69+ message: menu && menu.ext.xCanonicalText ? menu.ext.xCanonicalText : ""
70+ // icons
71+ avatar: menu && menu.ext.icon !== undefined ? menu.ext.icon : "qrc:/indicators/artwork/messaging/default_contact.png"
72+ appIcon: menu && menu.ext.xCanonicalAppIcon !== undefined ? menu.ext.xCanonicalAppIcon : "qrc:/indicators/artwork/messaging/default_app.svg"
73+
74+ onActivateApp: {
75+ menuItem.model.activate(modelIndex, true);
76+ }
77+ onDismiss: {
78+ menuItem.model.activate(modelIndex, false);
79+ }
80+ }
81+ }
82+ Component {
83+ id: textMessage
84+ TextMessage {
85+ property var replyAction: QMenuModel.UnityMenuAction {
86+ model: menuItem.model
87+ index: modelIndex
88+ name: menu && actionsDescription[0].name ? actionsDescription[0].name : ""
89+ }
90+
91+ // text
92+ title: menu && menu.label ? menu.label : ""
93+ time: menu ? Utils.formatDate(menu.ext.xCanonicalTime) : ""
94+ message: menu && menu.ext.xCanonicalText ? menu.ext.xCanonicalText : ""
95+ replyButtonText: actionsDescription && actionsDescription[0].label ? actionsDescription[0].label : "Send"
96+ // icons
97+ avatar: menu && menu.ext.icon !== undefined ? menu.ext.icon : "qrc:/indicators/artwork/messaging/default_contact.png"
98+ appIcon: menu && menu.ext.xCanonicalAppIcon !== undefined ? menu.ext.xCanonicalAppIcon : "qrc:/indicators/artwork/messaging/default_app.svg"
99+ // actions
100+ replyEnabled: replyAction.valid && replyAction.enabled
101+
102+ onActivateApp: {
103+ menuItem.model.activate(modelIndex, true);
104+ }
105+ onDismiss: {
106+ menuItem.model.activate(modelIndex, false);
107+ }
108+ onReply: {
109+ replyAction.activate(value);
110+ }
111+ }
112+ }
113+ Component {
114+ id: snapDecision
115+ SnapDecision {
116+ property var activateAction: QMenuModel.UnityMenuAction {
117+ model: menuItem.model
118+ index: modelIndex
119+ name: menu && actionsDescription[0].name ? actionsDescription[0].name : ""
120+ }
121+ property var replyAction: QMenuModel.UnityMenuAction {
122+ model: menuItem.model
123+ index: modelIndex
124+ name: menu && actionsDescription[1].name ? actionsDescription[1].name : ""
125+ }
126+
127+ // text
128+ title: menu && menu.label ? menu.label : ""
129+ time: menu ? Utils.formatDate(menu.ext.xCanonicalTime) : ""
130+ message: menu && menu.ext.xCanonicalText ? menu.ext.xCanonicalText : ""
131+ actionButtonText: actionsDescription && actionsDescription[0].label ? actionsDescription[0].label : "Call back"
132+ replyButtonText: actionsDescription && actionsDescription[1].label ? actionsDescription[1].label : "Send"
133+ replyMessages: actionsDescription && actionsDescription[1]["parameter-hint"] ? actionsDescription[1]["parameter-hint"] : ""
134+ // icons
135+ avatar: menu && menu.ext.icon !== undefined ? menu.ext.icon : "qrc:/indicators/artwork/messaging/default_contact.png"
136+ appIcon: menu && menu.ext.xCanonicalAppIcon !== undefined ? menu.ext.xCanonicalAppIcon : "qrc:/indicators/artwork/messaging/default_app.svg"
137+ // actions
138+ activateEnabled: activateAction.valid && activateAction.enabled
139+ replyEnabled: replyAction.valid && replyAction.enabled
140+
141+ onActivateApp: {
142+ menuItem.model.activate(modelIndex, true);
143+ }
144+ onDismiss: {
145+ menuItem.model.activate(modelIndex, false);
146+ }
147+ onActivate: {
148+ activateAction.activate();
149+ }
150+ onReply: {
151+ replyAction.activate(value);
152+ }
153+ }
154+ }
155+ }
156+
157+ function loadMessage(actions)
158+ {
159+ var parameterType = ""
160+ for (var actIndex in actions) {
161+ var desc = actions[actIndex];
162+ if (desc["parameter-type"] !== undefined) {
163+ parameterType += desc["parameter-type"];
164+ } else {
165+ parameterType += "_";
166+ }
167+ }
168+
169+ if (parameterType === "") {
170+ return simpleTextMessage;
171+ } else if (parameterType === "s") {
172+ return textMessage;
173+ } else if (parameterType === "_s") {
174+ return snapDecision;
175+ } else {
176+ console.debug("Unknown paramater type: " + parameterType);
177+ }
178+ return undefined;
179+ }
180+}
plugins/Unity/IndicatorsLegacy/Messaging/qml/QuickReply.qml → plugins/Unity/Indicators/Messaging/qml/QuickReply.qmlrenamed+11−6
@@ -20,15 +20,16 @@
2020
2121import QtQuick 2.0
2222import Ubuntu.Components 0.1
23−import Unity.IndicatorsLegacy 0.1 as Indicators
23+import Unity.Indicators 0.1 as Indicators
2424
2525Item {
26− property alias actionGroup: actionTextField.actionGroup
27− property alias action: actionTextField.action
28−
26+ id: quickReply
2927 property alias buttonText: actionTextField.buttonText
3028 property real expandedHeight: childrenRect.height
3129 property alias messages : messagelistRepeater.model
30+ property alias replyEnabled: actionTextField.activateEnabled
31+
32+ signal reply(var value)
3233
3334 Item {
3435 id: header
@@ -83,10 +84,9 @@ Item {
8384
8485 height: childrenRect.height
8586
86− Rectangle {
87+ Item {
8788 width: messagelist.width
8889 height: units.gu(5)
89− color: "#333230"
9090
9191 Label {
9292 id: __label
@@ -150,6 +150,11 @@ Item {
150150
151151 anchors.fill: parent
152152 anchors.margins: units.gu(1)
153+ activateEnabled: replyEnabled
154+
155+ onActivate: {
156+ quickReply.reply(value)
157+ }
153158 }
154159
155160 Indicators.HLine {
plugins/Unity/IndicatorsLegacy/Messaging/qml/SimpleTextMessage.qml → plugins/Unity/Indicators/Messaging/qml/SimpleTextMessage.qmlrenamed+7−4
@@ -20,17 +20,20 @@
2020
2121import QtQuick 2.0
2222import Ubuntu.Components 0.1
23−import "utils.js" as Utils
2423
2524HeroMessage {
2625 id: __heroMessage
2726
27+ property string title: ""
28+ property string time: ""
29+ property string message: ""
30+
2831 property alias footer: footerLoader.sourceComponent
2932
3033 expandedHeight: fullMessage.y + fullMessage.height + units.gu(2)
31− heroMessageHeader.titleText.text: menu ? menu.label : ""
32− heroMessageHeader.subtitleText.text: menu ? Utils.formatDate(menu.extra.canonical_time) : ""
33− heroMessageHeader.bodyText.text: menu ? menu.extra.canonical_text : ""
34+ heroMessageHeader.titleText.text: title
35+ heroMessageHeader.subtitleText.text: time
36+ heroMessageHeader.bodyText.text: message
3437
3538 Item {
3639 id: fullMessage
plugins/Unity/IndicatorsLegacy/Messaging/qml/SnapDecision.qml → plugins/Unity/Indicators/Messaging/qml/SnapDecision.qmlrenamed+33−14
@@ -20,19 +20,33 @@
2020
2121import QtQuick 2.0
2222import Ubuntu.Components 0.1
23−import Unity.IndicatorsLegacy 0.1 as Indicators
23+import Unity.Indicators 0.1 as Indicators
2424import "utils.js" as Utils
2525
2626HeroMessage {
2727 id: snapDecision
2828
29+ property string title: ""
30+ property string time: ""
31+ property string message: ""
32+
33+ property bool activateEnabled: true
34+ property alias actionButtonText: actionButton.text
35+
36+ property bool replyEnabled: true
37+ property alias replyMessages: quickreply.messages
38+ property alias replyButtonText: quickreply.buttonText
39+
2940 expandedHeight: buttons.y + buttons.height + quickreply.height + units.gu(2)
30− heroMessageHeader.titleText.text: menu ? menu.label : ""
31− heroMessageHeader.subtitleText.text: menu ? menu.extra.canonical_text : ""
41+ heroMessageHeader.titleText.text: title
42+ heroMessageHeader.subtitleText.text: message
3243 heroMessageHeader.subtitleText.color: "#e8e1d0"
33− heroMessageHeader.bodyText.text: menu ? Utils.formatDate(menu.extra.canonical_time) : ""
44+ heroMessageHeader.bodyText.text: time
3445 heroMessageHeader.bodyText.color: "#8f8f88"
3546
47+ signal activate
48+ signal reply(string value)
49+
3650 Item {
3751 id: buttons
3852
@@ -62,16 +76,19 @@ HeroMessage {
6276 }
6377 }
6478
65− ActionButton {
66− actionGroup: snapDecision.actionGroup
67− action: actionsDescription[0].name
68−
69− text: actionsDescription ? actionsDescription[0].label : "Call back"
70− color: "#c94212"
79+ Button {
80+ id: actionButton
81+ text: "Call back"
82+ color: enabled ? "#c94212" : "#bababa"
7183 anchors.right: parent.right
7284 anchors.top: parent.top
7385 anchors.bottom: parent.bottom
7486 width: (parent.width - units.gu(1)) / 2
87+ enabled: snapDecision.activateEnabled
88+
89+ onClicked: {
90+ snapDecision.activate();
91+ }
7592 }
7693
7794 states: State {
@@ -95,11 +112,12 @@ HeroMessage {
95112 QuickReply {
96113 id: quickreply
97114
98− actionGroup: snapDecision.actionGroup
99− action: actionsDescription[1].name
115+ onReply: {
116+ snapDecision.reply(value);
117+ }
100118
101− messages: actionsDescription ? actionsDescription[1]["parameter-hint"] : ""
102− buttonText: actionsDescription ? actionsDescription[1].label : "send"
119+ messages: ""
120+ buttonText: "Send"
103121 anchors {
104122 top: buttons.bottom
105123 topMargin: units.gu(2)
@@ -109,6 +127,7 @@ HeroMessage {
109127 height: 0
110128 opacity: 0.0
111129 enabled: false
130+ replyEnabled: snapDecision.replyEnabled
112131
113132 states: State {
114133 name: "expanded"
plugins/Unity/IndicatorsLegacy/Messaging/qml/TextMessage.qml → plugins/Unity/Indicators/Messaging/qml/TextMessage.qmlrenamed+12−4
@@ -20,16 +20,24 @@
2020
2121import QtQuick 2.0
2222import Ubuntu.Components 0.1
23−import Unity.IndicatorsLegacy 0.1 as Indicators
23+import Unity.Indicators 0.1 as Indicators
2424
2525SimpleTextMessage {
2626 id: simpleMessage
2727
28+ property bool replyEnabled: false
29+ property string replyButtonText: "Send"
30+
31+ signal reply(string value)
32+
2833 footer: ActionTextField {
2934 anchors.fill: parent
30− actionGroup: simpleMessage.actionGroup
31− action: actionsDescription[0].name
3235
33− buttonText: actionsDescription ? actionsDescription[0].label : "Send"
36+ activateEnabled: simpleMessage.replyEnabled
37+ buttonText: simpleMessage.replyButtonText
38+
39+ onActivate: {
40+ simpleMessage.reply(value);
41+ }
3442 }
3543}
plugins/Unity/IndicatorsLegacy/Messaging/qml/qmldir → plugins/Unity/Indicators/Messaging/qml/qmldirrenamed+2−2
@@ -1,11 +1,11 @@
1−module Unity.IndicatorsLegacy.Messaging
1+module Unity.Indicators.Messaging
22
33ActionButton 0.1 ActionButton.qml
44ActionTextField 0.1 ActionTextField.qml
55GroupedMessage 0.1 GroupedMessage.qml
66HeroMessage 0.1 HeroMessage.qml
77HeroMessageHeader 0.1 HeroMessageHeader.qml
8−MessageMenuItem 0.1 MessageMenuItem.qml
8+MessageMenuItemFactory 0.1 MessageMenuItemFactory.qml
99QuickReply 0.1 QuickReply.qml
1010SimpleTextMessage 0.1 SimpleTextMessage.qml
1111SnapDecision 0.1 SnapDecision.qml
plugins/Unity/IndicatorsLegacy/Messaging/qml/utils.js → plugins/Unity/Indicators/Messaging/qml/utils.jsrenamed

The content is the same.

plugins/Unity/Indicators/Network/CMakeLists.txt−44
@@ -1,45 +1 @@
1−# export_qmlplugin macro
2−include(Plugins)
3−
4−project(IndicatorsNetworkQml)
5−
6−pkg_check_modules(GLIB glib-2.0>=2.32)
7−pkg_check_modules(LIBNM_GLIB libnm-glib>=0.9.6)
8−pkg_check_modules(LIBNM_UTIL libnm-util>=0.9.6)
9−
10−if(LIBNM_GLIB_FOUND AND LIBNM_UTIL_FOUND AND GLIB_FOUND)
11− set(INDICATORS_NETWORK_SRC
12− networkagent.cpp
13− plugin.cpp
14− secret-agent.c
15− )
16−
17− add_library(IndicatorsNetworkQml MODULE
18− ${INDICATORS_NETWORK_SRC}
19− )
20−
21− qt5_use_modules(IndicatorsNetworkQml Core Qml Widgets)
22−
23− set_target_properties(IndicatorsNetworkQml PROPERTIES COMPILE_FLAGS -fPIC)
24−
25− include_directories(
26− ${CMAKE_CURRENT_SOURCE_DIR}
27− ${GLIB_INCLUDE_DIRS}
28− ${LIBNM_GLIB_INCLUDE_DIRS}
29− ${LIBNM_UTIL_INCLUDE_DIRS}
30− )
31−
32− target_link_libraries(IndicatorsNetworkQml
33− ${GLIB_LIBRARIES}
34− ${LIBNM_GLIB_LIBRARIES}
35− ${LIBNM_UTIL_LIBRARIES}
36− )
37−
38− # export the qmltypes and plugin files
39− export_qmlplugin(Unity.Indicators.Network 0.1 Unity/Indicators/Network TARGETS IndicatorsNetworkQml)
40−
41−else()
42− message(WARNING "Missing glib or libnm dependency for the network plugin, not building")
43−endif()
44−
451add_subdirectory(qml)
plugins/Unity/Indicators/Network/networkagent.cppdeleted−146
@@ -1,146 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Alberto Ruiz <alberto.ruiz@canonical.com>
18− * Renato Araujo Oliveira Filho <renato@canonical.com>
19− */
20−
21−#include "networkagent.h"
22−
23−#include <QVariant>
24−#include <QApplication>
25−#include <QDebug>
26−
27−class NetworkAgentToken
28−{
29−public:
30− NMConnection *connection;
31− NMSettingWirelessSecurity *wisec;
32− guint id;
33− QByteArray keyMgmt;
34−
35− NetworkAgentToken(NMConnection *connection,
36− NMSettingWirelessSecurity *wisec,
37− guint id,
38− QByteArray keyMgmt)
39− : connection(connection),
40− wisec(wisec),
41− id(id),
42− keyMgmt(keyMgmt)
43− {
44− if (connection) {
45− g_object_ref(connection);
46− } else {
47− qWarning() << "invalid connection object";
48− }
49− }
50−
51− ~NetworkAgentToken()
52− {
53− if (connection) {
54− g_object_unref(connection);
55− }
56− }
57−};
58−
59−NetworkAgent::NetworkAgent(QObject *parent)
60− : QObject(parent)
61−{
62− m_agent = unity_settings_secret_agent_new();
63− g_signal_connect(G_OBJECT(m_agent),
64− UNITY_SETTINGS_SECRET_AGENT_SECRET_REQUESTED,
65− G_CALLBACK(onSecretRequested),
66− this);
67−
68− g_signal_connect(G_OBJECT(m_agent),
69− UNITY_SETTINGS_SECRET_AGENT_REQUEST_CANCELLED,
70− G_CALLBACK(onSecretRequestCancelled),
71− this);
72−}
73−
74−NetworkAgent::~NetworkAgent()
75−{
76− nm_secret_agent_unregister(NM_SECRET_AGENT(m_agent));
77− g_object_unref(m_agent);
78−}
79−
80−void NetworkAgent::authenticate(const QVariant &token, const QString &key)
81−{
82− NetworkAgentToken *pToken = (NetworkAgentToken *) token.value<void *>();
83− if (pToken == NULL) {
84− return;
85− }
86−
87− if ((pToken->keyMgmt == "wpa-none") || (pToken->keyMgmt == "wpa-psk")) {
88− g_object_set(G_OBJECT(pToken->wisec),
89− NM_SETTING_WIRELESS_SECURITY_PSK, qPrintable(key),
90− NULL);
91− } else if (pToken->keyMgmt == "none") {
92− g_object_set(G_OBJECT(pToken->wisec),
93− NM_SETTING_WIRELESS_SECURITY_WEP_KEY0, qPrintable(key),
94− NULL);
95− }
96−
97− GHashTable *settings = nm_connection_to_hash(pToken->connection,
98− NM_SETTING_HASH_FLAG_ALL);
99−
100− unity_settings_secret_agent_provide_secret(m_agent,
101− pToken->id, settings);
102− g_hash_table_unref(settings);
103− delete pToken;
104−}
105−
106−void NetworkAgent::cancel(const QVariant &token)
107−{
108− NetworkAgentToken *pToken = (NetworkAgentToken *) token.value<void *>();
109− if (pToken != NULL) {
110− unity_settings_secret_agent_cancel_request(m_agent, pToken->id);
111− delete pToken;
112− }
113−}
114−
115−void NetworkAgent::onSecretRequested(UnitySettingsSecretAgent* /*agent*/,
116− guint id,
117− NMConnection* connection,
118− const char* /*setting_name*/,
119− const char** /*hints*/,
120− NMSecretAgentGetSecretsFlags /*flags*/,
121− NetworkAgent* self)
122−{
123− NetworkAgentToken *token = new NetworkAgentToken(connection,
124− NULL,
125− id,
126− NULL);
127−
128− token->wisec = nm_connection_get_setting_wireless_security(connection);
129− if (token->wisec) {
130− token->keyMgmt = nm_setting_wireless_security_get_key_mgmt(token->wisec);
131− }
132−
133− QVariant varToken = qVariantFromValue((void *) token);
134− Q_EMIT self->secretRequested(varToken);
135−}
136−
137−void NetworkAgent::onSecretRequestCancelled(UnitySettingsSecretAgent* /*agent*/,
138− guint /*id*/,
139− NMConnection* /*connection*/,
140− const char* /*setting_name*/,
141− const char** /*hints*/,
142− NMSecretAgentGetSecretsFlags /*flags*/,
143− NetworkAgent* /*self*/)
144−{
145− //Do nothing for now
146−}
plugins/Unity/Indicators/Network/networkagent.hdeleted−65
@@ -1,65 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Alberto Ruiz <alberto.ruiz@canonical.com>
18− * Renato Araujo Oliveira Filho <renato@canonical.com>
19− */
20−
21−#ifndef NETWORKAGENT_H
22−#define NETWORKAGENT_H
23−
24−#include "secret-agent.h"
25−
26−#include <QObject>
27−
28−class NetworkAgentToken;
29−
30−class NetworkAgent : public QObject
31−{
32− Q_OBJECT
33−public:
34− NetworkAgent(QObject *parent=0);
35− ~NetworkAgent();
36−
37− Q_INVOKABLE void authenticate(const QVariant &token, const QString &key);
38− Q_INVOKABLE void cancel(const QVariant &token);
39−
40−Q_SIGNALS:
41− void secretRequested(const QVariant &token);
42− void secretRequestCancelled();
43−
44−private:
45− UnitySettingsSecretAgent *m_agent;
46−
47− static void onSecretRequested(UnitySettingsSecretAgent *agent,
48− guint id,
49− NMConnection *connection,
50− const char *setting_name,
51− const char **hints,
52− NMSecretAgentGetSecretsFlags flags,
53− NetworkAgent *self);
54−
55− static void onSecretRequestCancelled(UnitySettingsSecretAgent *agent,
56− guint id,
57− NMConnection *connection,
58− const char *setting_name,
59− const char **hints,
60− NMSecretAgentGetSecretsFlags flags,
61− NetworkAgent *self);
62−
63−};
64−
65−#endif
plugins/Unity/Indicators/Network/plugin.hdeleted−32
@@ -1,32 +0,0 @@
1−/*
2− * Copyright (C) 2012 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Author: Nick Dedekind <nick.dedekind@canonical.com>
17− */
18−
19−#ifndef INDICATORS_NETWORK_PLUGIN_H
20−#define INDICATORS_NETWORK_PLUGIN_H
21−
22−#include <QtQml/QQmlExtensionPlugin>
23−
24−class IndicatorsNetworkPlugin : public QQmlExtensionPlugin
25−{
26− Q_OBJECT
27− Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28−public:
29− void registerTypes(const char *uri);
30−};
31−
32−#endif // INDICATORS_NETWORK_PLUGIN_H
plugins/Unity/Indicators/Network/qml/PasswordPage.qmldeleted−88
@@ -1,88 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−import Ubuntu.Components.ListItems 0.1 as ListItem
23−import Unity.Indicators 0.1 as Indicators
24−
25−Page {
26− id: pagePassword
27−
28− property variant agent
29− property variant token
30−
31− anchors.fill: parent
32− title: "Network Authentication"
33−
34− Column {
35− anchors {
36− left: parent.left
37− right: parent.right
38− }
39−
40− Indicators.SectionMenuItem {
41− text: "Authentication"
42− }
43−
44− Indicators.FramedMenuItem {
45− implicitHeight: password.height + units.gu(1)
46−
47− PasswordTextField {
48− id: password
49− anchors {
50− left: parent.left
51− right: parent.right
52− margins: units.gu(3)
53− verticalCenter: parent.verticalCenter
54− }
55− }
56− }
57−
58− Indicators.FramedMenuItem {
59− Row {
60− anchors {
61− right: parent.right
62− verticalCenter: parent.verticalCenter
63− margins: units.gu(3)
64− }
65−
66− spacing: units.gu(1)
67−
68− Button {
69− text: "Cancel"
70− width: units.gu(10)
71− onClicked: {
72− agent.cancel(token);
73− pageStack.pop();
74− }
75− }
76−
77− Button {
78− text: "OK"
79− width: units.gu(10)
80− onClicked: {
81− agent.authenticate(token, password.text);
82− pageStack.pop();
83− }
84− }
85− }
86− }
87− }
88−}
plugins/Unity/Indicators/Network/qml/PasswordTextField.qmldeleted−68
@@ -1,68 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−
23−Item {
24− id: textMenu
25−
26− property alias text: textField.text
27−
28− height: contentColumn.height
29−
30− Column {
31− id: contentColumn
32− spacing: units.gu(0.5)
33− anchors {
34− left: parent.left
35− right: parent.right
36− }
37−
38− TextField {
39− id: textField
40−
41− anchors {
42− left: parent.left
43− right: parent.right
44− }
45−
46− placeholderText: "Password"
47− echoMode: showPassword.checked ? TextInput.Normal : TextInput.Password
48− }
49−
50− Row {
51− anchors {
52− left: parent.left
53− right: parent.right
54− }
55−
56− spacing: units.gu(1)
57−
58− CheckBox {
59− id: showPassword
60− }
61−
62− Label {
63− text: "Show password"
64− anchors.verticalCenter: showPassword.verticalCenter
65− }
66− }
67− }
68−}
plugins/Unity/Indicators/Network/qml/qmldir−5
@@ -1,8 +1,3 @@
11module Unity.Indicators.Network
2−plugin IndicatorsNetworkQml
3−typeinfo plugin.qmltypes
42
5−NetworkPage 0.1 NetworkPage.qml
63AccessPoint 0.1 AccessPoint.qml
7−PasswordPage 0.1 PasswordPage.qml
8−PasswordTextField 0.1 PasswordTextField.qml
plugins/Unity/Indicators/Network/secret-agent.cdeleted−382
@@ -1,382 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Alberto Ruiz <alberto.ruiz@canonical.com>
18− * Renato Araujo Oliveira Filho <renato@canonical.com>
19− */
20−
21−
22−#include <glib.h>
23−#include <glib-object.h>
24−#include <nm-secret-agent.h>
25−#include "secret-agent.h"
26−
27−#define UNITY_SETTINGS_TYPE_SECRET_AGENT (unity_settings_secret_agent_get_type ())
28−#define UNITY_SETTINGS_SECRET_AGENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgent))
29−#define UNITY_SETTINGS_SECRET_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgentClass))
30−#define UNITY_SETTINGS_IS_SECRET_AGENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), UNITY_SETTINGS_TYPE_SECRET_AGENT))
31−#define UNITY_SETTINGS_IS_SECRET_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), UNITY_SETTINGS_TYPE_SECRET_AGENT))
32−#define UNITY_SETTINGS_SECRET_AGENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgentClass))
33−#define UNITY_SETTINGS_SECRET_AGENT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgentPrivate))
34−
35−#define AGENT_ID "com.canonical.settings.network.nm-agent"
36−
37−static gpointer unity_settings_secret_agent_parent_class = NULL;
38−
39−typedef struct _UnitySettingsSecretAgentPrivate UnitySettingsSecretAgentPrivate;
40−
41−struct _UnitySettingsSecretAgentPrivate {
42− GQueue *requests;
43−};
44−
45−typedef struct _SecretRequest {
46− gint id;
47− NMSecretAgent *agent;
48− NMConnection *connection;
49− const char *connection_path;
50− const char *setting_name;
51− const char **hints;
52− NMSecretAgentGetSecretsFlags flags;
53− NMSecretAgentGetSecretsFunc callback;
54− gpointer callback_data;
55−} SecretRequest;
56−
57−GType unity_settings_secret_agent_get_type (void) G_GNUC_CONST;
58−enum {
59− UNITY_SETTINGS_SECRET_AGENT_DUMMY_PROPERTY
60−};
61−
62−enum {
63− SECRET_REQUESTED,
64− REQUEST_CANCELLED,
65− LAST_SIGNAL
66−};
67−
68−static guint signals[LAST_SIGNAL] = { 0 };
69−
70−UnitySettingsSecretAgent* unity_settings_secret_agent_new (void);
71−UnitySettingsSecretAgent* unity_settings_secret_agent_construct (GType object_type);
72−
73−int
74−secret_request_find (SecretRequest *req,
75− guint *id)
76−{
77− if (req->id > *id)
78− return -1;
79−
80− if (req->id < *id)
81− return 1;
82−
83− return 0;
84−}
85−
86−void
87−unity_settings_secret_agent_provide_secret (UnitySettingsSecretAgent *agent,
88− guint request,
89− GHashTable *secrets)
90−{
91− GList *iter;
92− SecretRequest *req;
93− UnitySettingsSecretAgentPrivate *priv = agent->priv;
94−
95− iter = g_queue_find_custom (priv->requests,
96− &request,
97− (GCompareFunc)secret_request_find);
98−
99− if (iter == NULL || iter->data == NULL)
100− {
101− g_warning ("Secret request with id <%d> was not found", (int)request);
102− return;
103− }
104−
105− req = iter->data;
106−
107− req->callback (NM_SECRET_AGENT (agent),
108− req->connection,
109− secrets,
110− NULL,
111− req->callback_data);
112−
113− g_queue_remove_all (priv->requests, req);
114− g_free (req);
115− return;
116−}
117−
118−void
119−free_request (SecretRequest *req)
120−{
121− g_object_unref (req->connection);
122− g_free (req);
123−}
124−
125−void
126−unity_settings_secret_agent_cancel_request (UnitySettingsSecretAgent *agent,
127− guint request)
128−{
129− GList *iter;
130− SecretRequest *req;
131− UnitySettingsSecretAgentPrivate *priv = agent->priv;
132− GError *error;
133−
134− iter = g_queue_find_custom (priv->requests,
135− &request,
136− (GCompareFunc)secret_request_find);
137−
138− if (iter == NULL || iter->data == NULL)
139− {
140− g_warning ("Secret request with id <%d> was not found", (int)request);
141− return;
142− }
143−
144− req = iter->data;
145− error = g_error_new (NM_SECRET_AGENT_ERROR,
146− NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
147− "This secret request was canceled by the user.");
148−
149− req->callback (NM_SECRET_AGENT (agent),
150− req->connection,
151− NULL,
152− error,
153− req->callback_data);
154−
155− g_queue_remove_all (priv->requests, req);
156− free_request (req);
157− return;
158−}
159−
160−static void
161−delete_secrets (NMSecretAgent *agent,
162− NMConnection *connection,
163− const char *connection_path,
164− NMSecretAgentDeleteSecretsFunc callback,
165− gpointer callback_data)
166−{
167− g_debug ("delete secrets");
168−}
169−
170−/* If it returns G_MAXUINT it's considered an error */
171−static guint
172−find_available_id (UnitySettingsSecretAgentPrivate *priv)
173−{
174− guint i = 0;
175− guint candidate = 0;
176−
177− if (g_queue_get_length (priv->requests) == G_MAXUINT)
178− return G_MAXUINT;
179−
180− while (i < g_queue_get_length (priv->requests))
181− {
182− SecretRequest *req = (SecretRequest*)g_queue_peek_nth (priv->requests, i);
183−
184− if (req->id == candidate)
185− {
186− candidate++;
187− i = 0;
188− }
189− else
190− {
191− i++;
192− }
193− }
194−
195− return i;
196−}
197−
198−static void
199−get_secrets (NMSecretAgent *agent,
200− NMConnection *connection,
201− const char *connection_path,
202− const char *setting_name,
203− const char **hints,
204− NMSecretAgentGetSecretsFlags flags,
205− NMSecretAgentGetSecretsFunc callback,
206− gpointer callback_data)
207−{
208− guint id;
209− UnitySettingsSecretAgentPrivate *priv = UNITY_SETTINGS_SECRET_AGENT_GET_PRIVATE (agent);
210− SecretRequest *req = NULL;
211−
212− if (flags == NM_SECRET_AGENT_GET_SECRETS_FLAG_NONE)
213− {
214− GError *error = g_error_new (NM_SECRET_AGENT_ERROR,
215− NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
216− "No password found for this connection.");
217− callback (agent, connection, NULL, error, callback_data);
218− g_error_free (error);
219− return;
220− }
221−
222− id = find_available_id (priv);
223− if (id == G_MAXUINT)
224− {
225− GError *error = g_error_new (NM_SECRET_AGENT_ERROR,
226− NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
227− "Reached maximum number of requests.");
228− callback (agent, connection, NULL, error, callback_data);
229− g_error_free (error);
230− return;
231− }
232−
233− /* Adding a request */
234− req = (SecretRequest*) g_malloc0 (sizeof (SecretRequest));
235− *req = ((SecretRequest)
236− { id,
237− agent,
238− connection,
239− connection_path,
240− setting_name,
241− hints,
242− flags,
243− callback,
244− callback_data });
245−
246− g_object_ref (connection);
247−
248− g_queue_push_tail (priv->requests, req);
249−
250− g_signal_emit_by_name (agent,
251− UNITY_SETTINGS_SECRET_AGENT_SECRET_REQUESTED,
252− id,
253− connection,
254− setting_name,
255− hints,
256− flags);
257−}
258−
259−static void
260−save_secrets (NMSecretAgent *agent,
261− NMConnection *connection,
262− const char *connection_path,
263− NMSecretAgentSaveSecretsFunc callback,
264− gpointer callback_data)
265−{
266− g_debug ("save secrets");
267−}
268−
269−static void
270−cancel_get_secrets (NMSecretAgent *agent,
271− const char *connection_path,
272− const char *setting_name)
273−{
274− g_debug ("cancel get secrets");
275−}
276−
277−UnitySettingsSecretAgent*
278−unity_settings_secret_agent_construct (GType object_type)
279−{
280− UnitySettingsSecretAgent * self = NULL;
281− self = (UnitySettingsSecretAgent*) g_object_new (object_type,
282− NM_SECRET_AGENT_IDENTIFIER, AGENT_ID,
283− NULL);
284− return self;
285−}
286−
287−
288−UnitySettingsSecretAgent*
289−unity_settings_secret_agent_new (void)
290−{
291− return unity_settings_secret_agent_construct (UNITY_SETTINGS_TYPE_SECRET_AGENT);
292−}
293−
294−static void
295−destroy_pending_request (gpointer data)
296−{
297− SecretRequest* req = (SecretRequest*)data;
298− /* Reporting the cancellation of all pending requests */
299− g_signal_emit_by_name (req->agent,
300− UNITY_SETTINGS_SECRET_AGENT_REQUEST_CANCELLED,
301− req->id);
302−
303− free_request (req);
304−}
305−
306−static void
307−unity_settings_secret_agent_finalize (GObject *agent)
308−{
309− UnitySettingsSecretAgentPrivate *priv = UNITY_SETTINGS_SECRET_AGENT_GET_PRIVATE (agent);
310−
311− g_queue_free_full (priv->requests, destroy_pending_request);
312−}
313−
314−static void
315−unity_settings_secret_agent_class_init (UnitySettingsSecretAgentClass *klass)
316−{
317− unity_settings_secret_agent_parent_class = g_type_class_peek_parent (klass);
318− NMSecretAgentClass *parent_class = NM_SECRET_AGENT_CLASS (klass);
319− parent_class->get_secrets = get_secrets;
320− parent_class->save_secrets = save_secrets;
321− parent_class->delete_secrets = delete_secrets;
322− parent_class->cancel_get_secrets = cancel_get_secrets;
323−
324− g_type_class_add_private (klass, sizeof(UnitySettingsSecretAgentPrivate));
325− G_OBJECT_CLASS (klass)->finalize = unity_settings_secret_agent_finalize;
326−
327−
328− signals[SECRET_REQUESTED] = g_signal_new (UNITY_SETTINGS_SECRET_AGENT_SECRET_REQUESTED,
329− G_OBJECT_CLASS_TYPE (G_OBJECT_CLASS (klass)),
330− G_SIGNAL_RUN_FIRST,
331− G_STRUCT_OFFSET (UnitySettingsSecretAgentClass, secret_requested),
332− NULL, NULL, NULL,
333− G_TYPE_NONE, 5,
334− G_TYPE_UINT, G_TYPE_POINTER, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_UINT);
335−
336− signals[REQUEST_CANCELLED] = g_signal_new (UNITY_SETTINGS_SECRET_AGENT_REQUEST_CANCELLED,
337− G_OBJECT_CLASS_TYPE (G_OBJECT_CLASS (klass)),
338− G_SIGNAL_RUN_FIRST,
339− G_STRUCT_OFFSET (UnitySettingsSecretAgentClass, request_cancelled),
340− NULL, NULL, NULL,
341− G_TYPE_NONE, 1,
342− G_TYPE_UINT);
343−}
344−
345−
346−static void
347−unity_settings_secret_agent_instance_init (UnitySettingsSecretAgent *self)
348−{
349− self->priv = UNITY_SETTINGS_SECRET_AGENT_GET_PRIVATE (self);
350− self->priv->requests = g_queue_new ();
351−}
352−
353−GType
354−unity_settings_secret_agent_get_type (void)
355−{
356− static volatile gsize unity_settings_secret_agent_type_id__volatile = 0;
357− if (g_once_init_enter (&unity_settings_secret_agent_type_id__volatile))
358− {
359− static const GTypeInfo g_define_type_info =
360− {
361− sizeof (UnitySettingsSecretAgentClass),
362− (GBaseInitFunc) NULL,
363− (GBaseFinalizeFunc) NULL,
364− (GClassInitFunc) unity_settings_secret_agent_class_init,
365− (GClassFinalizeFunc) NULL,
366− NULL,
367− sizeof (UnitySettingsSecretAgent),
368− 0,
369− (GInstanceInitFunc) unity_settings_secret_agent_instance_init,
370− NULL
371− };
372− GType unity_settings_secret_agent_type_id;
373− unity_settings_secret_agent_type_id = g_type_register_static (NM_TYPE_SECRET_AGENT,
374− "UnitySettingsSecretAgent",
375− &g_define_type_info,
376− 0);
377− g_once_init_leave (&unity_settings_secret_agent_type_id__volatile,
378− unity_settings_secret_agent_type_id);
379− }
380−
381− return unity_settings_secret_agent_type_id__volatile;
382−}
plugins/Unity/Indicators/Network/secret-agent.hdeleted−102
@@ -1,102 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Alberto Ruiz <alberto.ruiz@canonical.com>
18− * Renato Araujo Oliveira Filho <renato@canonical.com>
19− */
20−
21−#ifndef __SECRET_AGENT_H__
22−#define __SECRET_AGENT_H__
23−
24−#include <glib.h>
25−#include <glib-object.h>
26−#include <nm-secret-agent.h>
27−
28−/*
29− * This class is a basic implementation of the NetworkManager SecretAgent base class.
30− *
31− * The purpose of this class is to handle credential requests from the network,
32− * for example, from a WiFi hotspot or a VPN network.
33− *
34− * It queues requests objects (SecretRequest) on a GQueue in the private struct
35− * of the class. And notifies the consumer of the class through the "secret-request"
36− * and the "request-cancelled" signals with the following callback prototypes:
37− *
38− * void (*secret_requested) (UnitySettingsSecretAgent *self,
39− * guint id,
40− * NMConnection *connection,
41− * const char *setting_name,
42− * const char **hints,
43− * NMSecretAgentGetSecretsFlags flags,
44− * gpointer user_data);
45− *
46− * void (*request_cancelled) (UnitySettingsSecretAgent *self,
47− * guint id,
48− * gpointer user_data);
49− *
50− */
51−
52−
53−G_BEGIN_DECLS
54−
55−
56−#define UNITY_SETTINGS_TYPE_SECRET_AGENT (unity_settings_secret_agent_get_type ())
57−#define UNITY_SETTINGS_SECRET_AGENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgent))
58−#define UNITY_SETTINGS_SECRET_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgentClass))
59−#define UNITY_SETTINGS_IS_SECRET_AGENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), UNITY_SETTINGS_TYPE_SECRET_AGENT))
60−#define UNITY_SETTINGS_IS_SECRET_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), UNITY_SETTINGS_TYPE_SECRET_AGENT))
61−#define UNITY_SETTINGS_SECRET_AGENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgentClass))
62−
63−#define UNITY_SETTINGS_SECRET_AGENT_SECRET_REQUESTED "secret-requested"
64−#define UNITY_SETTINGS_SECRET_AGENT_REQUEST_CANCELLED "request-cancelled"
65−
66−typedef struct _UnitySettingsSecretAgent UnitySettingsSecretAgent;
67−typedef struct _UnitySettingsSecretAgentClass UnitySettingsSecretAgentClass;
68−typedef struct _UnitySettingsSecretAgentPrivate UnitySettingsSecretAgentPrivate;
69−
70−struct _UnitySettingsSecretAgent {
71− NMSecretAgent parent_instance;
72− UnitySettingsSecretAgentPrivate * priv;
73−};
74−
75−struct _UnitySettingsSecretAgentClass {
76− NMSecretAgentClass parent_class;
77−
78− void (*secret_requested) (UnitySettingsSecretAgent *self,
79− guint id,
80− NMConnection *connection,
81− const char *setting_name,
82− const char **hints,
83− NMSecretAgentGetSecretsFlags flags);
84−
85− void (*request_cancelled) (UnitySettingsSecretAgent *self,
86− guint id);
87−};
88−
89−
90−GType unity_settings_secret_agent_get_type (void) G_GNUC_CONST;
91−UnitySettingsSecretAgent* unity_settings_secret_agent_new (void);
92−UnitySettingsSecretAgent* unity_settings_secret_agent_construct (GType object_type);
93−
94−void unity_settings_secret_agent_provide_secret (UnitySettingsSecretAgent *agent,
95− guint request,
96− GHashTable *secrets);
97−void unity_settings_secret_agent_cancel_request (UnitySettingsSecretAgent *agent,
98− guint request);
99−
100−G_END_DECLS
101−
102−#endif
plugins/Unity/Indicators/indicators.h−2
@@ -74,8 +74,6 @@ public:
7474 enum Roles {
7575 Identifier = 0,
7676 Position,
77− Title,
78− Description,
7977 WidgetSource,
8078 PageSource,
8179 IndicatorProperties,
plugins/Unity/Indicators/indicatorsmanager.cpp+20−24
@@ -47,34 +47,13 @@ public:
4747IndicatorsManager::IndicatorsManager(QObject* parent)
4848 : QObject(parent)
4949 , m_loaded(false)
50− , m_upstart(NULL)
5150{
52− auto upstartsession = qgetenv("UPSTART_SESSION");
53− if (!upstartsession.isNull()) {
54− DBusConnection * conn = NULL;
55− conn = dbus_connection_open(upstartsession.constData(), NULL);
56− if (conn != NULL) {
57− m_upstart = nih_dbus_proxy_new(NULL, conn,
58− NULL,
59− DBUS_PATH_UPSTART,
60− NULL, NULL);
61− dbus_connection_unref(conn);
62− }
63− }
64−
65− if (m_upstart != NULL) {
66− m_upstart->auto_start = FALSE;
67− }
6851}
6952
7053IndicatorsManager::~IndicatorsManager()
7154{
7255 unload();
7356
74− if (m_upstart != NULL) {
75− nih_unref(m_upstart, NULL);
76− m_upstart = NULL;
77− }
7857}
7958
8059void IndicatorsManager::load()
@@ -235,17 +214,34 @@ void IndicatorsManager::setLoaded(bool loaded)
235214 m_loaded = loaded;
236215 Q_EMIT loadedChanged(m_loaded);
237216
238− if (m_upstart != NULL) {
217+ auto upstartsession = qgetenv("UPSTART_SESSION");
218+ NihDBusProxy * upstart = NULL;
219+
220+ if (!upstartsession.isNull()) {
221+ DBusConnection * conn = NULL;
222+ conn = dbus_connection_open(upstartsession.constData(), NULL);
223+ if (conn != NULL) {
224+ upstart = nih_dbus_proxy_new(NULL, conn,
225+ NULL,
226+ DBUS_PATH_UPSTART,
227+ NULL, NULL);
228+ dbus_connection_unref(conn);
229+ }
230+ }
231+
232+ if (upstart != NULL) {
239233 int event_sent = 0;
240234 if (m_loaded) {
241− event_sent = upstart_emit_event_sync(NULL, m_upstart, "indicator-services-start", NULL, 0);
235+ event_sent = upstart_emit_event_sync(NULL, upstart, "indicator-services-start", NULL, 0);
242236 } else {
243− event_sent = upstart_emit_event_sync(NULL, m_upstart, "indicator-services-end", NULL, 0);
237+ event_sent = upstart_emit_event_sync(NULL, upstart, "indicator-services-end", NULL, 0);
244238 }
245239
246240 if (event_sent != 0) {
247241 qWarning() << "Unable to send indicator event to Upstart";
248242 }
243+ nih_unref(upstart, NULL);
244+ upstart = NULL;
249245 }
250246 }
251247}
plugins/Unity/Indicators/indicatorsmanager.h−1
@@ -71,7 +71,6 @@ private:
7171 QHash<QString, IndicatorData*> m_indicatorsData;
7272 QSharedPointer<QFileSystemWatcher> m_fsWatcher;
7373 bool m_loaded;
74− NihDBusProxy * m_upstart;
7574};
7675
7776#endif // INDICATORS_MANAGER_H
plugins/Unity/Indicators/indicatorsmodel.cpp+2−55
@@ -201,8 +201,6 @@ QHash<int, QByteArray> IndicatorsModel::roleNames() const
201201 {
202202 roles[IndicatorsModelRole::Identifier] = "identifier";
203203 roles[IndicatorsModelRole::Position] = "position";
204− roles[IndicatorsModelRole::Title] = "title";
205− roles[IndicatorsModelRole::Description] = "description";
206204 roles[IndicatorsModelRole::WidgetSource] = "widgetSource";
207205 roles[IndicatorsModelRole::PageSource] = "pageSource";
208206 roles[IndicatorsModelRole::IndicatorProperties] = "indicatorProperties";
@@ -216,25 +214,6 @@ int IndicatorsModel::columnCount(const QModelIndex &) const
216214 return 1;
217215}
218216
219−/*! \internal */
220−QVariant IndicatorsModel::defaultData(Indicator::Ptr indicator, int role)
221−{
222− switch (role)
223− {
224− case IndicatorsModelRole::Position:
225− return 0;
226− case IndicatorsModelRole::Title:
227− return indicator ? indicator->identifier() : "Unknown";
228− case IndicatorsModelRole::Description:
229− return "";
230− case IndicatorsModelRole::WidgetSource:
231− return shellAppDirectory()+"/Panel/Indicators/DefaultIndicatorWidget2.qml";
232− case IndicatorsModelRole::PageSource:
233− return shellAppDirectory()+"/Panel/Indicators/DefaultIndicatorPage2.qml";
234− }
235− return QVariant();
236−}
237−
238217Q_INVOKABLE QVariant IndicatorsModel::data(int row, int role) const
239218{
240219 return data(index(row, 0), role);
@@ -268,27 +247,16 @@ QVariant IndicatorsModel::data(const QModelIndex &index, int role) const
268247 return QVariant(indicator->indicatorProperties());
269248 }
270249 break;
271− case IndicatorsModelRole::Title:
272− case IndicatorsModelRole::Description:
273250 case IndicatorsModelRole::WidgetSource:
251+ return shellAppDirectory()+"/Panel/Indicators/DefaultIndicatorWidget.qml";
274252 case IndicatorsModelRole::PageSource:
275− return indicatorData(indicator, role);
253+ return shellAppDirectory()+"/Panel/Indicators/DefaultIndicatorPage.qml";
276254 default:
277255 break;
278256 }
279257 return QVariant();
280258}
281259
282−QVariant IndicatorsModel::indicatorData(const Indicator::Ptr& indicator, int role) const
283−{
284− if (indicator && m_parsed_indicator_data.contains(indicator->identifier()))
285− {
286− QVariantMap data = m_parsed_indicator_data[indicator->identifier()];
287− return data.value(roleNames()[role], QVariant());
288− }
289− return defaultData(indicator, role);
290−}
291−
292260/*! \internal */
293261QModelIndex IndicatorsModel::parent(const QModelIndex&) const
294262{
@@ -300,24 +268,3 @@ int IndicatorsModel::rowCount(const QModelIndex&) const
300268{
301269 return m_indicators.count();
302270}
303−
304−void IndicatorsModel::setIndicatorData(const QVariant& data)
305−{
306− m_indicator_data = data;
307−
308− m_parsed_indicator_data.clear();
309− QMap<QString, QVariant> map = data.toMap();
310− QMapIterator<QString, QVariant> iter(map);
311− while(iter.hasNext())
312− {
313− iter.next();
314− m_parsed_indicator_data[iter.key()] = iter.value().toMap();
315− }
316−
317− Q_EMIT indicatorDataChanged(m_indicator_data);
318−}
319−
320−QVariant IndicatorsModel::indicatorData() const
321−{
322− return m_indicator_data;
323−}
plugins/Unity/Indicators/indicatorsmodel.h−8
@@ -34,7 +34,6 @@ class UNITYINDICATORS_EXPORT IndicatorsModel : public QAbstractListModel
3434 Q_OBJECT
3535 Q_ENUMS(Roles)
3636 Q_PROPERTY(int count READ count NOTIFY countChanged)
37− Q_PROPERTY(QVariant indicatorData READ indicatorData WRITE setIndicatorData NOTIFY indicatorDataChanged)
3837
3938public:
4039
@@ -53,9 +52,6 @@ public:
5352 QModelIndex parent (const QModelIndex &index) const;
5453 int rowCount(const QModelIndex &parent = QModelIndex()) const;
5554
56− void setIndicatorData(const QVariant& data);
57− QVariant indicatorData() const;
58−
5955
6056Q_SIGNALS:
6157 void countChanged();
@@ -71,13 +67,9 @@ private:
7167 IndicatorsManager *m_manager;
7268
7369 QList<Indicator::Ptr> m_indicators;
74− QVariant m_indicator_data;
75− QMap<QString, QVariantMap> m_parsed_indicator_data;
7670
7771 void notifyDataChanged(QObject *sender, int role);
7872 int count() const;
79− QVariant indicatorData(const Indicator::Ptr& indicator, int role) const;
80− static QVariant defaultData(Indicator::Ptr indicator, int role);
8173};
8274
8375#endif // INDICATORSMODEL_H
plugins/Unity/Indicators/plugin.cpp+2
@@ -42,6 +42,8 @@ static QObject* menuModelCacheSingleton(QQmlEngine* engine, QJSEngine* scriptEng
4242
4343void Indicators2Plugin::registerTypes(const char *uri)
4444{
45+ Q_INIT_RESOURCE(indicators);
46+
4547 qmlRegisterType<IndicatorsManager>(uri, 0, 1, "IndicatorsManager");
4648 qmlRegisterType<IndicatorsModel>(uri, 0, 1, "IndicatorsModel");
4749 qmlRegisterType<MenuContentActivator>(uri, 0, 1, "MenuContentActivator");
plugins/Unity/Indicators/qml/BaseMenuItem.qml+1−1
@@ -24,7 +24,7 @@ import Ubuntu.Components.ListItems 0.1 as ListItem
2424ListItem.Standard {
2525 id: baseMenu
2626
27− property bool menuActivated: false
27+ property bool menuSelected: false
2828
2929 signal selectMenu()
3030 signal deselectMenu()
plugins/Unity/Indicators/qml/IndicatorBase.qml+8−5
@@ -27,13 +27,11 @@ Item {
2727 enabled: menuObjectPaths.hasOwnProperty(device)
2828
2929 //const
30− property string title
3130 property string busName
3231 property string actionsObjectPath
3332 property var menuObjectPaths: undefined
3433 readonly property string device: "phone"
3534 property string rootMenuType: "com.canonical.indicator.root"
36− property bool active: false
3735
3836 property string deviceMenuObjectPath: menuObjectPaths.hasOwnProperty(device) ? menuObjectPaths[device] : ""
3937
@@ -41,8 +39,13 @@ Item {
4139
4240 CachedUnityMenuModel {
4341 id: cachedModel
44− busName: active ? indicatorItem.busName : ""
45− actionsObjectPath: active ? indicatorItem.actionsObjectPath : ""
46− menuObjectPath: active ? indicatorItem.deviceMenuObjectPath : ""
42+ busName: indicatorItem.busName
43+ actionsObjectPath: indicatorItem.actionsObjectPath
44+ menuObjectPath: indicatorItem.deviceMenuObjectPath
45+ }
46+
47+ property var rootActionState: Indicators.RootActionState {
48+ menu: menuModel
49+ onUpdated: indicatorItem.rootActionStateChanged()
4750 }
4851}
plugins/Unity/Indicators/qml/IndicatorPage.qml+40−11
@@ -26,12 +26,14 @@ IndicatorBase {
2626 id: main
2727
2828 //const
29+ property bool contentActive: false
30+ property string title: rootActionState.title
2931 property alias emptyText: emptyLabel.text
3032 property alias highlightFollowsCurrentItem : mainMenu.highlightFollowsCurrentItem
3133
3234 Indicators.UnityMenuModelStack {
3335 id: menuStack
34− head: main.menuModel
36+ head: contentActive ? main.menuModel : null
3537 }
3638
3739 ListView {
@@ -60,7 +62,34 @@ IndicatorBase {
6062 // Only allow flicking if the content doesn't fit on the page
6163 interactive: contentHeight > height
6264
63− currentIndex: -1
65+ property int selectedIndex: -1
66+ property bool blockCurrentIndexChange: false
67+ // for count = 0
68+ onCountChanged: {
69+ if (count == 0 && selectedIndex != -1) {
70+ selectedIndex = -1;
71+ }
72+ }
73+ // for highlight following
74+ onSelectedIndexChanged: {
75+ if (currentIndex != selectedIndex) {
76+ var blocked = blockCurrentIndexChange;
77+ blockCurrentIndexChange = true;
78+
79+ currentIndex = selectedIndex;
80+
81+ blockCurrentIndexChange = blocked;
82+ }
83+ }
84+ // for item addition/removal
85+ onCurrentIndexChanged: {
86+ if (!blockCurrentIndexChange) {
87+ if (selectedIndex != -1 && selectedIndex != currentIndex) {
88+ selectedIndex = currentIndex;
89+ }
90+ }
91+ }
92+
6493 delegate: Item {
6594 id: menuDelegate
6695
@@ -89,10 +118,10 @@ IndicatorBase {
89118 menuStack.push(mainMenu.model.submenu(index));
90119 }
91120
92− if (item.hasOwnProperty("menuActivated")) {
93− item.menuActivated = Qt.binding(function() { return ListView.isCurrentItem; });
94− item.selectMenu.connect(function() { ListView.view.currentIndex = index });
95− item.deselectMenu.connect(function() { ListView.view.currentIndex = -1 });
121+ if (item.hasOwnProperty("menuSelected")) {
122+ item.menuSelected = Qt.binding(function() { return mainMenu.selectedIndex == index; });
123+ item.selectMenu.connect(function() { mainMenu.selectedIndex = index; });
124+ item.deselectMenu.connect(function() { mainMenu.selectedIndex = -1; });
96125 }
97126 if (item.hasOwnProperty("menu")) {
98127 item.menu = Qt.binding(function() { return model; });
@@ -135,21 +164,21 @@ IndicatorBase {
135164 function start()
136165 {
137166 reset()
138− if (!active) {
139− active = true;
167+ if (!contentActive) {
168+ contentActive = true;
140169 }
141170 }
142171
143172 function stop()
144173 {
145− if (active) {
146− active = false;
174+ if (contentActive) {
175+ contentActive = false;
147176 }
148177 }
149178
150179 function reset()
151180 {
152− mainMenu.currentIndex = -1;
181+ mainMenu.selectedIndex = -1;
153182 mainMenu.positionViewAtBeginning();
154183 }
155184}
plugins/Unity/Indicators/qml/IndicatorWidget.qml−6
@@ -23,12 +23,6 @@ import Unity.Indicators 0.1 as Indicators
2323IndicatorBase {
2424 id: indicatorWidget
2525
26− active: true
2726 enabled: false
2827 property int iconSize: height - units.gu(0.5)
29−
30− property var actionState: Indicators.RootActionState {
31− menu: menuModel
32− onUpdated: indicatorWidget.actionStateChanged()
33− }
3428}
plugins/Unity/Indicators/qml/MenuItemFactory.qml+63−12
@@ -20,6 +20,7 @@
2020import QtQuick 2.0
2121import Unity.Indicators 0.1 as Indicators
2222import Unity.Indicators.Network 0.1 as ICNetwork
23+import Unity.Indicators.Messaging 0.1 as ICMessaging
2324import QMenuModel 0.1 as QMenuModel
2425
2526Item {
@@ -38,6 +39,9 @@ Item {
3839 "com.canonical.indicator.slider" : sliderMenu,
3940 "com.canonical.indicator.switch" : switchMenu,
4041
42+ "com.canonical.indicator.messages.messageitem" : messageItem,
43+ "com.canonical.indicator.messages.sourceitem" : groupedMessage,
44+
4145 "com.canonical.unity.slider" : sliderMenu,
4246 "com.canonical.unity.switch" : switchMenu,
4347
@@ -45,15 +49,17 @@ Item {
4549 "unity.widgets.systemsettings.tablet.accesspoint" : accessPoint,
4650 }
4751
52+ Component { id: divMenu; Indicators.DivMenuItem {} }
53+
4854 Component {
4955 id: sliderMenu;
5056 Indicators.SliderMenuItem {
5157 property QtObject menu: null
5258
5359 text: menu && menu.label ? menu.label : ""
54− icon: menu ? menu.icon : ""
55− minIcon: menu.ext.minIcon
56− maxIcon: menu.ext.maxIcon
60+ icon: menu && menu.icon ? menu.icon : ""
61+ minIcon: menu && menu.ext.minIcon ? menu.ext.minIcon : ""
62+ maxIcon: menu && menu.ext.maxIcon ? menu.ext.maxIcon : ""
5763
5864 minimumValue: menu.ext.minValue ? menu.ext.minValue : 0.0
5965 maximumValue: {
@@ -79,8 +85,6 @@ Item {
7985 }
8086 }
8187
82− Component { id: divMenu; Indicators.DivMenuItem {} }
83−
8488 Component {
8589 id: buttonMenu;
8690 Indicators.ButtonMenuItem {
@@ -89,7 +93,9 @@ Item {
8993 text: menu && menu.label ? menu.label : ""
9094 enabled: menu ? menu.sensitive : false
9195
92− onActivate: model.activate(modelIndex);
96+ onActivate: {
97+ model.activate(modelIndex);
98+ }
9399 }
94100 }
95101 Component {
@@ -109,6 +115,7 @@ Item {
109115 text: menu && menu.label ? menu.label : ""
110116 icon: menu ? menu.icon : ""
111117 value : menu ? menu.actionState : 0.0
118+ enabled: menu ? menu.sensitive : false
112119 }
113120 }
114121
@@ -118,12 +125,14 @@ Item {
118125 property QtObject menu: null
119126
120127 text: menu && menu.label ? menu.label : ""
121− icon: menu ? menu.icon : ""
128+ icon: menu && menu.icon ? menu.icon : ""
122129 checkable: menu ? (menu.isCheck || menu.isRadio) : false
123130 checked: checkable ? menu.isToggled : false
124131 enabled: menu ? menu.sensitive : false
125132
126− onActivate: model.activate(modelIndex);
133+ onActivate: {
134+ model.activate(modelIndex);
135+ }
127136 }
128137 }
129138
@@ -133,11 +142,13 @@ Item {
133142 property QtObject menu: null
134143
135144 text: menu && menu.label ? menu.label : ""
136− icon: menu ? menu.icon : ""
145+ icon: menu && menu.icon ? menu.icon : ""
137146 checked: menu ? menu.isToggled : false
138147 enabled: menu ? menu.sensitive : false
139148
140− onActivate: model.activate(modelIndex);
149+ onActivate: {
150+ model.activate(modelIndex);
151+ }
141152 }
142153 }
143154
@@ -161,11 +172,11 @@ Item {
161172 property QtObject menu: null
162173 property var strengthAction: QMenuModel.UnityMenuAction {
163174 model: menuFactory.model ? menuFactory.model : null
175+ index: modelIndex
164176 name: menu ? menu.ext.xCanonicalWifiApStrengthAction : ""
165177 }
166178
167179 text: menu && menu.label ? menu.label : ""
168− icon: menu ? menu.icon : ""
169180 secure: menu ? menu.ext.xCanonicalWifiApIsSecure : false
170181 adHoc: menu ? menu.ext.xCanonicalWifiApIsAdhoc : false
171182 checked: menu ? menu.isToggled : false
@@ -177,7 +188,47 @@ Item {
177188 'x-canonical-wifi-ap-is-secure': 'bool',
178189 'x-canonical-wifi-ap-strength-action': 'string'});
179190 }
180− onActivate: model.activate(modelIndex);
191+ onActivate: {
192+ model.activate(modelIndex);
193+ }
194+ }
195+ }
196+
197+ Component {
198+ id: messageItem
199+ ICMessaging.MessageMenuItemFactory {
200+
201+ property QtObject menu: null
202+ model: menuFactory.model ? menuFactory.model : null
203+
204+ Component.onCompleted: {
205+ model.loadExtendedAttributes(modelIndex, {'x-canonical-time': 'int64',
206+ 'x-canonical-text': 'string',
207+ 'x-canonical-message-actions': 'variant',
208+ 'icon': 'icon',
209+ 'x-canonical-app-icon': 'icon'});
210+ }
211+ }
212+ }
213+
214+ Component {
215+ id: groupedMessage
216+ ICMessaging.GroupedMessage {
217+ property QtObject menu: null
218+
219+ title: menu && menu.label ? menu.label : ""
220+ count: menu && menu.actionState[0] ? menu.actionState[0] : "0"
221+ appIcon: menu && menu.ext.icon !== undefined ? menu.ext.icon : "qrc:/indicators/artwork/messaging/default_app.svg"
222+
223+ Component.onCompleted: {
224+ model.loadExtendedAttributes(modelIndex, {'icon': 'icon'});
225+ }
226+ onActivateApp: {
227+ model.activate(modelIndex, true);
228+ }
229+ onDismiss: {
230+ model.activate(modelIndex, false);
231+ }
181232 }
182233 }
183234
plugins/Unity/Indicators/qml/SliderMenuItem.qml+1−1
@@ -71,7 +71,7 @@ FramedMenuItem {
7171 leftMargin: leftImage.visible ? units.gu(0.5) : 0
7272 rightMargin: rightImage.visible ? units.gu(0.5) : 0
7373 }
74− live: false
74+ live: true
7575
7676 Component.onCompleted: {
7777 value = menuItem.value
plugins/Unity/IndicatorsLegacy/resources/artwork/messaging/default_app.svg → plugins/Unity/Indicators/resources/artwork/messaging/default_app.svgrenamed

The content is the same.

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

Binary file not shown.

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

Binary file not shown.

plugins/Unity/Indicators/resources/indicators.qrc+3
@@ -1,5 +1,8 @@
11<RCC>
22 <qresource prefix="/indicators">
33 <file>artwork/network/secure.svg</file>
4+ <file>artwork/messaging/default_contact.png</file>
5+ <file>artwork/messaging/default_app.svg</file>
6+ <file>artwork/messaging/message_sms01_54px.png</file>
47 </qresource>
58</RCC>
plugins/Unity/Indicators/rootactionstate.cpp+22−2
@@ -57,7 +57,7 @@ void RootActionState::setMenu(UnityMenuModel* menu)
5757 connect(m_menu, SIGNAL(rowsRemoved(const QModelIndex&, int, int)), SLOT(onModelRowsRemoved(const QModelIndex&, int, int)));
5858 connect(m_menu, SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&, const QVector<int>&)), SLOT(onModelDataChanged(const QModelIndex&, const QModelIndex&, const QVector<int>&)));
5959
60− m_menu->setActionStateParser(this);
60+ connect(m_menu, SIGNAL(destroyed()), SLOT(reset()));
6161 }
6262 updateActionState();
6363 Q_EMIT menuChanged();
@@ -92,22 +92,42 @@ void RootActionState::onModelDataChanged(const QModelIndex& topLeft, const QMode
9292 }
9393}
9494
95+void RootActionState::reset()
96+{
97+ m_cachedState.clear();
98+ m_menu = NULL;
99+
100+ Q_EMIT menuChanged();
101+ Q_EMIT updated();
102+}
103+
95104void RootActionState::updateActionState()
96105{
97106 if (m_menu && m_menu->rowCount() > 0) {
107+ ActionStateParser* oldParser = m_menu->actionStateParser();
108+ m_menu->setActionStateParser(this);
109+
98110 m_cachedState = m_menu->get(0, "actionState").toMap();
111+
112+ m_menu->setActionStateParser(oldParser);
99113 } else {
100114 m_cachedState.clear();
101115 }
102116 Q_EMIT updated();
103117}
104118
105−
106119bool RootActionState::isValid() const
107120{
108121 return m_menu && m_menu->rowCount() > 0;
109122}
110123
124+QString RootActionState::title() const
125+{
126+ if (!isValid()) return QString();
127+
128+ return m_cachedState.value("title", QVariant::fromValue(QString())).toString();
129+}
130+
111131QString RootActionState::leftLabel() const
112132{
113133 if (!isValid()) return QString();
plugins/Unity/Indicators/rootactionstate.h+4
@@ -32,6 +32,7 @@ class UNITYINDICATORS_EXPORT RootActionState : public ActionStateParser
3232 Q_PROPERTY(UnityMenuModel* menu READ menu WRITE setMenu NOTIFY menuChanged)
3333
3434 Q_PROPERTY(bool valid READ isValid NOTIFY validChanged)
35+ Q_PROPERTY(QString title READ title NOTIFY titleChanged)
3536 Q_PROPERTY(QString leftLabel READ leftLabel NOTIFY leftLabelChanged)
3637 Q_PROPERTY(QString rightLabel READ rightLabel NOTIFY rightLabelChanged)
3738 Q_PROPERTY(QStringList icons READ icons NOTIFY iconsChanged)
@@ -48,6 +49,7 @@ public:
4849 void setIndex(int index);
4950
5051 bool isValid() const;
52+ QString title() const;
5153 QString leftLabel() const;
5254 QString rightLabel() const;
5355 QStringList icons() const;
@@ -64,6 +66,7 @@ Q_SIGNALS:
6466 void indexChanged();
6567
6668 void validChanged();
69+ void titleChanged();
6770 void leftLabelChanged();
6871 void rightLabelChanged();
6972 void iconsChanged();
@@ -74,6 +77,7 @@ private Q_SLOTS:
7477 void onModelRowsAdded(const QModelIndex& parent, int start, int end);
7578 void onModelRowsRemoved(const QModelIndex& parent, int start, int end);
7679 void onModelDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight, const QVector<int>&);
80+ void reset();
7781
7882private:
7983 void updateActionState();
plugins/Unity/Indicators/visibleindicatorsmodel.cpp−2
@@ -33,8 +33,6 @@ QHash<int, QByteArray> VisibleIndicatorsModel::roleNames() const
3333 {
3434 roles[IndicatorsModelRole::Identifier] = "identifier";
3535 roles[IndicatorsModelRole::Position] = "position";
36− roles[IndicatorsModelRole::Title] = "title";
37− roles[IndicatorsModelRole::Description] = "description";
3836 roles[IndicatorsModelRole::WidgetSource] = "widgetSource";
3937 roles[IndicatorsModelRole::PageSource] = "pageSource";
4038 roles[IndicatorsModelRole::IndicatorProperties] = "indicatorProperties";
plugins/Unity/IndicatorsLegacy/CMakeLists.txtdeleted−49
@@ -1,49 +0,0 @@
1−# export_qmlplugin macro
2−include(Plugins)
3−
4−project(IndicatorsLegacyQml)
5−
6−pkg_check_modules(QMENUMODEL REQUIRED qmenumodel)
7−find_package(Qt5Core REQUIRED)
8−find_package(Qt5Quick REQUIRED)
9−
10−add_subdirectory(qml)
11−add_subdirectory(Messaging)
12−add_subdirectory(Network)
13−
14−include_directories(
15− ${CMAKE_CURRENT_SOURCE_DIR}
16− ${CMAKE_CURRENT_BINARY_DIR}
17− ${QMENUMODEL_INCLUDE_DIRS}
18− ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators
19−)
20−
21−set(IndicatorsLegacyQML_SOURCES
22− ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/indicators.h
23− flatmenuproxymodel.cpp
24− modelprinter.cpp
25− plugin.cpp
26−)
27−add_definitions(-DUNITYINDICATORS_LIBRARY)
28−
29−set(IndicatorsLegacyQML_RESOURCES
30− resources/indicators.qrc
31−)
32−
33−qt5_add_resources(IndicatorsLegacyQML_RESOURCES_RCC
34− ${IndicatorsLegacyQML_RESOURCES}
35−)
36−
37−add_library(IndicatorsLegacyQml SHARED
38− ${IndicatorsLegacyQML_RESOURCES_RCC}
39− ${IndicatorsLegacyQML_SOURCES}
40−)
41−
42−target_link_libraries(IndicatorsLegacyQml
43− ${QMENUMODEL_LDFLAGS}
44−)
45−
46−qt5_use_modules(IndicatorsLegacyQml Core Qml Quick)
47−
48−# export the qmltypes and plugin files
49−export_qmlplugin(Unity.IndicatorsLegacy 0.1 Unity/IndicatorsLegacy TARGETS IndicatorsLegacyQml)
plugins/Unity/IndicatorsLegacy/Messaging/qml/CMakeLists.txtdeleted−5
@@ -1,5 +0,0 @@
1−# export_qmlfiles macro
2−include(Plugins)
3−
4−# export the qmldir, *.qml files.
5−export_qmlfiles(Unity.IndicatorsLegacy.Messaging Unity/IndicatorsLegacy/Messaging)
plugins/Unity/IndicatorsLegacy/Messaging/qml/MessageMenuItem.qmldeleted−96
@@ -1,96 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− * Olivier Tilloy <olivier.tilloy@canonical.com>
19− */
20−
21−import QtQuick 2.0
22−import Ubuntu.Components 0.1
23−import Unity.IndicatorsLegacy 0.1 as Indicators
24−
25−Indicators.BasicMenuItem {
26− property variant actionsDescription: menu ? menu.extra.canonical_message_actions : undefined
27−
28− onActionGroupChanged: loadItem()
29− onActionsDescriptionChanged: loadItem()
30− implicitHeight: contents.status == Loader.Ready ? contents.item.implicitHeight : 0
31−
32− Loader {
33− id: contents
34−
35− anchors.fill: parent
36− // Binding all properties for the item, to make sure that any change in the
37− // property will be propagated to the contents.item at any time
38− Binding {
39− target: contents.item
40− property: "menuActivated"
41− value: menuActivated
42− when: (contents.status == Loader.Ready)
43− }
44−
45− Binding {
46− target: contents.item
47− property: "actionGroup"
48− value: actionGroup
49− when: (contents.status == Loader.Ready)
50− }
51−
52− Binding {
53− target: contents.item
54− property: "menu"
55− value: menu
56− when: (contents.status == Loader.Ready)
57− }
58−
59− Binding {
60− target: contents.item
61− property: "actionsDescription"
62− value: actionsDescription
63− when: (contents.status == Loader.Ready)
64− }
65−
66− Connections {
67− target: contents.item ? contents.item : null
68− onActivateMenu: activateMenu()
69− onDeactivateMenu: deactivateMenu()
70− }
71− }
72−
73−
74− function loadItem()
75− {
76− var parameterType = ""
77− for (var actIndex in actionsDescription) {
78− var desc = actionsDescription[actIndex];
79− if (desc["parameter-type"] !== undefined) {
80− parameterType += desc["parameter-type"];
81− } else {
82− parameterType += "_";
83− }
84− }
85−
86− if (parameterType === "") {
87− contents.source = "SimpleTextMessage.qml";
88− } else if (parameterType === "s") {
89− contents.source = "TextMessage.qml";
90− } else if (parameterType === "_s") {
91− contents.source = "SnapDecision.qml";
92− } else {
93− console.debug("Unknown paramater type: " + parameterType);
94− }
95− }
96−}
plugins/Unity/IndicatorsLegacy/Network/CMakeLists.txtdeleted−45
@@ -1,45 +0,0 @@
1−# export_qmlplugin macro
2−include(Plugins)
3−
4−project(IndicatorsLegacyNetworkQml)
5−
6−pkg_check_modules(GLIB glib-2.0>=2.32)
7−pkg_check_modules(LIBNM_GLIB libnm-glib>=0.9.6)
8−pkg_check_modules(LIBNM_UTIL libnm-util>=0.9.6)
9−
10−if(LIBNM_GLIB_FOUND AND LIBNM_UTIL_FOUND AND GLIB_FOUND)
11− set(INDICATORS_LEGACY_NETWORK_SRC
12− networkagent.cpp
13− plugin.cpp
14− secret-agent.c
15− )
16−
17− add_library(IndicatorsLegacyNetworkQml MODULE
18− ${INDICATORS_LEGACY_NETWORK_SRC}
19− )
20−
21− qt5_use_modules(IndicatorsLegacyNetworkQml Core Qml Widgets)
22−
23− set_target_properties(IndicatorsLegacyNetworkQml PROPERTIES COMPILE_FLAGS -fPIC)
24−
25− include_directories(
26− ${CMAKE_CURRENT_SOURCE_DIR}
27− ${GLIB_INCLUDE_DIRS}
28− ${LIBNM_GLIB_INCLUDE_DIRS}
29− ${LIBNM_UTIL_INCLUDE_DIRS}
30− )
31−
32− target_link_libraries(IndicatorsLegacyNetworkQml
33− ${GLIB_LIBRARIES}
34− ${LIBNM_GLIB_LIBRARIES}
35− ${LIBNM_UTIL_LIBRARIES}
36− )
37−
38− # export the qmltypes and plugin files
39− export_qmlplugin(Unity.IndicatorsLegacy.Network 0.1 Unity/IndicatorsLegacy/Network TARGETS IndicatorsLegacyNetworkQml)
40−
41−else()
42− message(WARNING "Missing glib or libnm dependency for the network plugin, not building")
43−endif()
44−
45−add_subdirectory(qml)
plugins/Unity/IndicatorsLegacy/Network/networkagent.cppdeleted−146
@@ -1,146 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Alberto Ruiz <alberto.ruiz@canonical.com>
18− * Renato Araujo Oliveira Filho <renato@canonical.com>
19− */
20−
21−#include "networkagent.h"
22−
23−#include <QVariant>
24−#include <QApplication>
25−#include <QDebug>
26−
27−class NetworkAgentToken
28−{
29−public:
30− NMConnection *connection;
31− NMSettingWirelessSecurity *wisec;
32− guint id;
33− QByteArray keyMgmt;
34−
35− NetworkAgentToken(NMConnection *connection,
36− NMSettingWirelessSecurity *wisec,
37− guint id,
38− QByteArray keyMgmt)
39− : connection(connection),
40− wisec(wisec),
41− id(id),
42− keyMgmt(keyMgmt)
43− {
44− if (connection) {
45− g_object_ref(connection);
46− } else {
47− qWarning() << "invalid connection object";
48− }
49− }
50−
51− ~NetworkAgentToken()
52− {
53− if (connection) {
54− g_object_unref(connection);
55− }
56− }
57−};
58−
59−NetworkAgent::NetworkAgent(QObject *parent)
60− : QObject(parent)
61−{
62− m_agent = unity_settings_secret_agent_new();
63− g_signal_connect(G_OBJECT(m_agent),
64− UNITY_SETTINGS_SECRET_AGENT_SECRET_REQUESTED,
65− G_CALLBACK(onSecretRequested),
66− this);
67−
68− g_signal_connect(G_OBJECT(m_agent),
69− UNITY_SETTINGS_SECRET_AGENT_REQUEST_CANCELLED,
70− G_CALLBACK(onSecretRequestCancelled),
71− this);
72−}
73−
74−NetworkAgent::~NetworkAgent()
75−{
76− nm_secret_agent_unregister(NM_SECRET_AGENT(m_agent));
77− g_object_unref(m_agent);
78−}
79−
80−void NetworkAgent::authenticate(const QVariant &token, const QString &key)
81−{
82− NetworkAgentToken *pToken = (NetworkAgentToken *) token.value<void *>();
83− if (pToken == NULL) {
84− return;
85− }
86−
87− if ((pToken->keyMgmt == "wpa-none") || (pToken->keyMgmt == "wpa-psk")) {
88− g_object_set(G_OBJECT(pToken->wisec),
89− NM_SETTING_WIRELESS_SECURITY_PSK, qPrintable(key),
90− NULL);
91− } else if (pToken->keyMgmt == "none") {
92− g_object_set(G_OBJECT(pToken->wisec),
93− NM_SETTING_WIRELESS_SECURITY_WEP_KEY0, qPrintable(key),
94− NULL);
95− }
96−
97− GHashTable *settings = nm_connection_to_hash(pToken->connection,
98− NM_SETTING_HASH_FLAG_ALL);
99−
100− unity_settings_secret_agent_provide_secret(m_agent,
101− pToken->id, settings);
102− g_hash_table_unref(settings);
103− delete pToken;
104−}
105−
106−void NetworkAgent::cancel(const QVariant &token)
107−{
108− NetworkAgentToken *pToken = (NetworkAgentToken *) token.value<void *>();
109− if (pToken != NULL) {
110− unity_settings_secret_agent_cancel_request(m_agent, pToken->id);
111− delete pToken;
112− }
113−}
114−
115−void NetworkAgent::onSecretRequested(UnitySettingsSecretAgent* /*agent*/,
116− guint id,
117− NMConnection* connection,
118− const char* /*setting_name*/,
119− const char** /*hints*/,
120− NMSecretAgentGetSecretsFlags /*flags*/,
121− NetworkAgent* self)
122−{
123− NetworkAgentToken *token = new NetworkAgentToken(connection,
124− NULL,
125− id,
126− NULL);
127−
128− token->wisec = nm_connection_get_setting_wireless_security(connection);
129− if (token->wisec) {
130− token->keyMgmt = nm_setting_wireless_security_get_key_mgmt(token->wisec);
131− }
132−
133− QVariant varToken = qVariantFromValue((void *) token);
134− Q_EMIT self->secretRequested(varToken);
135−}
136−
137−void NetworkAgent::onSecretRequestCancelled(UnitySettingsSecretAgent* /*agent*/,
138− guint /*id*/,
139− NMConnection* /*connection*/,
140− const char* /*setting_name*/,
141− const char** /*hints*/,
142− NMSecretAgentGetSecretsFlags /*flags*/,
143− NetworkAgent* /*self*/)
144−{
145− //Do nothing for now
146−}
plugins/Unity/IndicatorsLegacy/Network/networkagent.hdeleted−65
@@ -1,65 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Alberto Ruiz <alberto.ruiz@canonical.com>
18− * Renato Araujo Oliveira Filho <renato@canonical.com>
19− */
20−
21−#ifndef NETWORKAGENT_H
22−#define NETWORKAGENT_H
23−
24−#include "secret-agent.h"
25−
26−#include <QObject>
27−
28−class NetworkAgentToken;
29−
30−class NetworkAgent : public QObject
31−{
32− Q_OBJECT
33−public:
34− NetworkAgent(QObject *parent=0);
35− ~NetworkAgent();
36−
37− Q_INVOKABLE void authenticate(const QVariant &token, const QString &key);
38− Q_INVOKABLE void cancel(const QVariant &token);
39−
40−Q_SIGNALS:
41− void secretRequested(const QVariant &token);
42− void secretRequestCancelled();
43−
44−private:
45− UnitySettingsSecretAgent *m_agent;
46−
47− static void onSecretRequested(UnitySettingsSecretAgent *agent,
48− guint id,
49− NMConnection *connection,
50− const char *setting_name,
51− const char **hints,
52− NMSecretAgentGetSecretsFlags flags,
53− NetworkAgent *self);
54−
55− static void onSecretRequestCancelled(UnitySettingsSecretAgent *agent,
56− guint id,
57− NMConnection *connection,
58− const char *setting_name,
59− const char **hints,
60− NMSecretAgentGetSecretsFlags flags,
61− NetworkAgent *self);
62−
63−};
64−
65−#endif
plugins/Unity/IndicatorsLegacy/Network/plugin.cppdeleted−31
@@ -1,31 +0,0 @@
1−/*
2− * Copyright (C) 2012 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Author: Nick Dedekind <nick.dedekind@canonical.com>
17− */
18−
19−// Qt
20−#include <QtQml/qqml.h>
21−
22−// self
23−#include "plugin.h"
24−
25−// local
26−#include "networkagent.h"
27−
28−void IndicatorsNetworkPlugin::registerTypes(const char *uri)
29−{
30− qmlRegisterType<NetworkAgent>(uri, 0, 1, "NetworkAgent");
31−}
plugins/Unity/IndicatorsLegacy/Network/plugin.hdeleted−32
@@ -1,32 +0,0 @@
1−/*
2− * Copyright (C) 2012 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Author: Nick Dedekind <nick.dedekind@canonical.com>
17− */
18−
19−#ifndef INDICATORS_NETWORK_PLUGIN_H
20−#define INDICATORS_NETWORK_PLUGIN_H
21−
22−#include <QtQml/QQmlExtensionPlugin>
23−
24−class IndicatorsNetworkPlugin : public QQmlExtensionPlugin
25−{
26− Q_OBJECT
27− Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28−public:
29− void registerTypes(const char *uri);
30−};
31−
32−#endif // INDICATORS_NETWORK_PLUGIN_H
plugins/Unity/IndicatorsLegacy/Network/qml/AccessPoint.qmldeleted−68
@@ -1,68 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−import Ubuntu.Components.ListItems 0.1 as ListItem
23−import Unity.IndicatorsLegacy 0.1 as Indicators
24−
25−Indicators.MenuItem {
26− id: accessPoint
27− property variant actionWifiApStrength : menu && actionGroup ? actionGroup.action(menu.extra.canonical_wifi_ap_strength_action) : null
28− property variant wifiApStrength : actionWifiApStrength && actionWifiApStrength.valid ? actionWifiApStrength.state : "0"
29−
30− function getNetworkIcon(data) {
31− var imageName = "nm-signal-100"
32− var signalStrength = parseInt(wifiApStrength)
33−
34− if (data.extra.canonical_wifi_ap_is_adhoc) {
35− imageName = "nm-adhoc";
36− } else if (signalStrength == 0) {
37− imageName = "nm-signal-00";
38− } else if (signalStrength <= 25) {
39− imageName = "nm-signal-25";
40− } else if (signalStrength <= 50) {
41− imageName = "nm-signal-50";
42− } else if (signalStrength <= 75) {
43− imageName = "nm-signal-75";
44− }
45−
46− if (data.extra.canonical_wifi_ap_is_secure) {
47− imageName += "-secure";
48− }
49−
50− return "image://theme/" + imageName;
51− }
52−
53− icon: menu && wifiApStrength ? getNetworkIcon(menu) : "image://theme/wifi-none"
54− iconFrame: false
55− control: CheckBox {
56− id: checkBoxActive
57− height: units.gu(4)
58− width: units.gu(4)
59− anchors.centerIn: parent
60− }
61−
62− Indicators.MenuActionBinding {
63− actionGroup: accessPoint.actionGroup
64− action: menu ? menu.action : ""
65− target: checkBoxActive
66− property: "checked"
67− }
68−}
plugins/Unity/IndicatorsLegacy/Network/qml/CMakeLists.txtdeleted−5
@@ -1,5 +0,0 @@
1−# export_qmlplugin macro
2−include(Plugins)
3−
4−# export the qmldir, *.qml files.
5−export_qmlfiles(Unity.IndicatorsLegacy.Network Unity/IndicatorsLegacy/Network)
plugins/Unity/IndicatorsLegacy/Network/qml/PasswordPage.qmldeleted−88
@@ -1,88 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−import Ubuntu.Components.ListItems 0.1 as ListItem
23−import Unity.IndicatorsLegacy 0.1 as Indicators
24−
25−Page {
26− id: pagePassword
27−
28− property variant agent
29− property variant token
30−
31− anchors.fill: parent
32− title: "Network Authentication"
33−
34− Column {
35− anchors {
36− left: parent.left
37− right: parent.right
38− }
39−
40− Indicators.SectionMenuItem {
41− label: "Authentication"
42− }
43−
44− Indicators.MenuItem {
45− implicitHeight: password.height + units.gu(1)
46−
47− PasswordTextField {
48− id: password
49− anchors {
50− left: parent.left
51− right: parent.right
52− margins: units.gu(3)
53− verticalCenter: parent.verticalCenter
54− }
55− }
56− }
57−
58− Indicators.MenuItem {
59− Row {
60− anchors {
61− right: parent.right
62− verticalCenter: parent.verticalCenter
63− margins: units.gu(3)
64− }
65−
66− spacing: units.gu(1)
67−
68− Button {
69− text: "Cancel"
70− width: units.gu(10)
71− onClicked: {
72− agent.cancel(token);
73− pageStack.pop();
74− }
75− }
76−
77− Button {
78− text: "OK"
79− width: units.gu(10)
80− onClicked: {
81− agent.authenticate(token, password.text);
82− pageStack.pop();
83− }
84− }
85− }
86− }
87− }
88−}
plugins/Unity/IndicatorsLegacy/Network/qml/PasswordTextField.qmldeleted−68
@@ -1,68 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−
23−Item {
24− id: textMenu
25−
26− property alias text: textField.text
27−
28− height: contentColumn.height
29−
30− Column {
31− id: contentColumn
32− spacing: units.gu(0.5)
33− anchors {
34− left: parent.left
35− right: parent.right
36− }
37−
38− TextField {
39− id: textField
40−
41− anchors {
42− left: parent.left
43− right: parent.right
44− }
45−
46− placeholderText: "Password"
47− echoMode: showPassword.checked ? TextInput.Normal : TextInput.Password
48− }
49−
50− Row {
51− anchors {
52− left: parent.left
53− right: parent.right
54− }
55−
56− spacing: units.gu(1)
57−
58− CheckBox {
59− id: showPassword
60− }
61−
62− Label {
63− text: "Show password"
64− anchors.verticalCenter: showPassword.verticalCenter
65− }
66− }
67− }
68−}
plugins/Unity/IndicatorsLegacy/Network/qml/WifiSection.qmldeleted−34
@@ -1,34 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−import Unity.IndicatorsLegacy 0.1 as Indicators
23−
24−Indicators.SectionMenuItem {
25− id: wifiSectionMenu
26−
27− Indicators.MenuAction {
28− id: busyAction
29− actionGroup: wifiSectionMenu.actionGroup
30− action: menu ? menu.extra.canonical_busy_action : ""
31− }
32−
33− busy: busyAction.valid ? busyAction.state : false
34−}
plugins/Unity/IndicatorsLegacy/Network/qml/qmldirdeleted−9
@@ -1,9 +0,0 @@
1−module Unity.IndicatorsLegacy.Network
2−plugin IndicatorsLegacyNetworkQml
3−typeinfo plugin.qmltypes
4−
5−NetworkPage 0.1 NetworkPage.qml
6−AccessPoint 0.1 AccessPoint.qml
7−PasswordPage 0.1 PasswordPage.qml
8−PasswordTextField 0.1 PasswordTextField.qml
9−WifiSection 0.1 WifiSection.qml
plugins/Unity/IndicatorsLegacy/Network/secret-agent.cdeleted−382
@@ -1,382 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Alberto Ruiz <alberto.ruiz@canonical.com>
18− * Renato Araujo Oliveira Filho <renato@canonical.com>
19− */
20−
21−
22−#include <glib.h>
23−#include <glib-object.h>
24−#include <nm-secret-agent.h>
25−#include "secret-agent.h"
26−
27−#define UNITY_SETTINGS_TYPE_SECRET_AGENT (unity_settings_secret_agent_get_type ())
28−#define UNITY_SETTINGS_SECRET_AGENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgent))
29−#define UNITY_SETTINGS_SECRET_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgentClass))
30−#define UNITY_SETTINGS_IS_SECRET_AGENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), UNITY_SETTINGS_TYPE_SECRET_AGENT))
31−#define UNITY_SETTINGS_IS_SECRET_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), UNITY_SETTINGS_TYPE_SECRET_AGENT))
32−#define UNITY_SETTINGS_SECRET_AGENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgentClass))
33−#define UNITY_SETTINGS_SECRET_AGENT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgentPrivate))
34−
35−#define AGENT_ID "com.canonical.settings.network.nm-agent"
36−
37−static gpointer unity_settings_secret_agent_parent_class = NULL;
38−
39−typedef struct _UnitySettingsSecretAgentPrivate UnitySettingsSecretAgentPrivate;
40−
41−struct _UnitySettingsSecretAgentPrivate {
42− GQueue *requests;
43−};
44−
45−typedef struct _SecretRequest {
46− gint id;
47− NMSecretAgent *agent;
48− NMConnection *connection;
49− const char *connection_path;
50− const char *setting_name;
51− const char **hints;
52− NMSecretAgentGetSecretsFlags flags;
53− NMSecretAgentGetSecretsFunc callback;
54− gpointer callback_data;
55−} SecretRequest;
56−
57−GType unity_settings_secret_agent_get_type (void) G_GNUC_CONST;
58−enum {
59− UNITY_SETTINGS_SECRET_AGENT_DUMMY_PROPERTY
60−};
61−
62−enum {
63− SECRET_REQUESTED,
64− REQUEST_CANCELLED,
65− LAST_SIGNAL
66−};
67−
68−static guint signals[LAST_SIGNAL] = { 0 };
69−
70−UnitySettingsSecretAgent* unity_settings_secret_agent_new (void);
71−UnitySettingsSecretAgent* unity_settings_secret_agent_construct (GType object_type);
72−
73−int
74−secret_request_find (SecretRequest *req,
75− guint *id)
76−{
77− if (req->id > *id)
78− return -1;
79−
80− if (req->id < *id)
81− return 1;
82−
83− return 0;
84−}
85−
86−void
87−unity_settings_secret_agent_provide_secret (UnitySettingsSecretAgent *agent,
88− guint request,
89− GHashTable *secrets)
90−{
91− GList *iter;
92− SecretRequest *req;
93− UnitySettingsSecretAgentPrivate *priv = agent->priv;
94−
95− iter = g_queue_find_custom (priv->requests,
96− &request,
97− (GCompareFunc)secret_request_find);
98−
99− if (iter == NULL || iter->data == NULL)
100− {
101− g_warning ("Secret request with id <%d> was not found", (int)request);
102− return;
103− }
104−
105− req = iter->data;
106−
107− req->callback (NM_SECRET_AGENT (agent),
108− req->connection,
109− secrets,
110− NULL,
111− req->callback_data);
112−
113− g_queue_remove_all (priv->requests, req);
114− g_free (req);
115− return;
116−}
117−
118−void
119−free_request (SecretRequest *req)
120−{
121− g_object_unref (req->connection);
122− g_free (req);
123−}
124−
125−void
126−unity_settings_secret_agent_cancel_request (UnitySettingsSecretAgent *agent,
127− guint request)
128−{
129− GList *iter;
130− SecretRequest *req;
131− UnitySettingsSecretAgentPrivate *priv = agent->priv;
132− GError *error;
133−
134− iter = g_queue_find_custom (priv->requests,
135− &request,
136− (GCompareFunc)secret_request_find);
137−
138− if (iter == NULL || iter->data == NULL)
139− {
140− g_warning ("Secret request with id <%d> was not found", (int)request);
141− return;
142− }
143−
144− req = iter->data;
145− error = g_error_new (NM_SECRET_AGENT_ERROR,
146− NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
147− "This secret request was canceled by the user.");
148−
149− req->callback (NM_SECRET_AGENT (agent),
150− req->connection,
151− NULL,
152− error,
153− req->callback_data);
154−
155− g_queue_remove_all (priv->requests, req);
156− free_request (req);
157− return;
158−}
159−
160−static void
161−delete_secrets (NMSecretAgent *agent,
162− NMConnection *connection,
163− const char *connection_path,
164− NMSecretAgentDeleteSecretsFunc callback,
165− gpointer callback_data)
166−{
167− g_debug ("delete secrets");
168−}
169−
170−/* If it returns G_MAXUINT it's considered an error */
171−static guint
172−find_available_id (UnitySettingsSecretAgentPrivate *priv)
173−{
174− guint i = 0;
175− guint candidate = 0;
176−
177− if (g_queue_get_length (priv->requests) == G_MAXUINT)
178− return G_MAXUINT;
179−
180− while (i < g_queue_get_length (priv->requests))
181− {
182− SecretRequest *req = (SecretRequest*)g_queue_peek_nth (priv->requests, i);
183−
184− if (req->id == candidate)
185− {
186− candidate++;
187− i = 0;
188− }
189− else
190− {
191− i++;
192− }
193− }
194−
195− return i;
196−}
197−
198−static void
199−get_secrets (NMSecretAgent *agent,
200− NMConnection *connection,
201− const char *connection_path,
202− const char *setting_name,
203− const char **hints,
204− NMSecretAgentGetSecretsFlags flags,
205− NMSecretAgentGetSecretsFunc callback,
206− gpointer callback_data)
207−{
208− guint id;
209− UnitySettingsSecretAgentPrivate *priv = UNITY_SETTINGS_SECRET_AGENT_GET_PRIVATE (agent);
210− SecretRequest *req = NULL;
211−
212− if (flags == NM_SECRET_AGENT_GET_SECRETS_FLAG_NONE)
213− {
214− GError *error = g_error_new (NM_SECRET_AGENT_ERROR,
215− NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
216− "No password found for this connection.");
217− callback (agent, connection, NULL, error, callback_data);
218− g_error_free (error);
219− return;
220− }
221−
222− id = find_available_id (priv);
223− if (id == G_MAXUINT)
224− {
225− GError *error = g_error_new (NM_SECRET_AGENT_ERROR,
226− NM_SECRET_AGENT_ERROR_INTERNAL_ERROR,
227− "Reached maximum number of requests.");
228− callback (agent, connection, NULL, error, callback_data);
229− g_error_free (error);
230− return;
231− }
232−
233− /* Adding a request */
234− req = (SecretRequest*) g_malloc0 (sizeof (SecretRequest));
235− *req = ((SecretRequest)
236− { id,
237− agent,
238− connection,
239− connection_path,
240− setting_name,
241− hints,
242− flags,
243− callback,
244− callback_data });
245−
246− g_object_ref (connection);
247−
248− g_queue_push_tail (priv->requests, req);
249−
250− g_signal_emit_by_name (agent,
251− UNITY_SETTINGS_SECRET_AGENT_SECRET_REQUESTED,
252− id,
253− connection,
254− setting_name,
255− hints,
256− flags);
257−}
258−
259−static void
260−save_secrets (NMSecretAgent *agent,
261− NMConnection *connection,
262− const char *connection_path,
263− NMSecretAgentSaveSecretsFunc callback,
264− gpointer callback_data)
265−{
266− g_debug ("save secrets");
267−}
268−
269−static void
270−cancel_get_secrets (NMSecretAgent *agent,
271− const char *connection_path,
272− const char *setting_name)
273−{
274− g_debug ("cancel get secrets");
275−}
276−
277−UnitySettingsSecretAgent*
278−unity_settings_secret_agent_construct (GType object_type)
279−{
280− UnitySettingsSecretAgent * self = NULL;
281− self = (UnitySettingsSecretAgent*) g_object_new (object_type,
282− NM_SECRET_AGENT_IDENTIFIER, AGENT_ID,
283− NULL);
284− return self;
285−}
286−
287−
288−UnitySettingsSecretAgent*
289−unity_settings_secret_agent_new (void)
290−{
291− return unity_settings_secret_agent_construct (UNITY_SETTINGS_TYPE_SECRET_AGENT);
292−}
293−
294−static void
295−destroy_pending_request (gpointer data)
296−{
297− SecretRequest* req = (SecretRequest*)data;
298− /* Reporting the cancellation of all pending requests */
299− g_signal_emit_by_name (req->agent,
300− UNITY_SETTINGS_SECRET_AGENT_REQUEST_CANCELLED,
301− req->id);
302−
303− free_request (req);
304−}
305−
306−static void
307−unity_settings_secret_agent_finalize (GObject *agent)
308−{
309− UnitySettingsSecretAgentPrivate *priv = UNITY_SETTINGS_SECRET_AGENT_GET_PRIVATE (agent);
310−
311− g_queue_free_full (priv->requests, destroy_pending_request);
312−}
313−
314−static void
315−unity_settings_secret_agent_class_init (UnitySettingsSecretAgentClass *klass)
316−{
317− unity_settings_secret_agent_parent_class = g_type_class_peek_parent (klass);
318− NMSecretAgentClass *parent_class = NM_SECRET_AGENT_CLASS (klass);
319− parent_class->get_secrets = get_secrets;
320− parent_class->save_secrets = save_secrets;
321− parent_class->delete_secrets = delete_secrets;
322− parent_class->cancel_get_secrets = cancel_get_secrets;
323−
324− g_type_class_add_private (klass, sizeof(UnitySettingsSecretAgentPrivate));
325− G_OBJECT_CLASS (klass)->finalize = unity_settings_secret_agent_finalize;
326−
327−
328− signals[SECRET_REQUESTED] = g_signal_new (UNITY_SETTINGS_SECRET_AGENT_SECRET_REQUESTED,
329− G_OBJECT_CLASS_TYPE (G_OBJECT_CLASS (klass)),
330− G_SIGNAL_RUN_FIRST,
331− G_STRUCT_OFFSET (UnitySettingsSecretAgentClass, secret_requested),
332− NULL, NULL, NULL,
333− G_TYPE_NONE, 5,
334− G_TYPE_UINT, G_TYPE_POINTER, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_UINT);
335−
336− signals[REQUEST_CANCELLED] = g_signal_new (UNITY_SETTINGS_SECRET_AGENT_REQUEST_CANCELLED,
337− G_OBJECT_CLASS_TYPE (G_OBJECT_CLASS (klass)),
338− G_SIGNAL_RUN_FIRST,
339− G_STRUCT_OFFSET (UnitySettingsSecretAgentClass, request_cancelled),
340− NULL, NULL, NULL,
341− G_TYPE_NONE, 1,
342− G_TYPE_UINT);
343−}
344−
345−
346−static void
347−unity_settings_secret_agent_instance_init (UnitySettingsSecretAgent *self)
348−{
349− self->priv = UNITY_SETTINGS_SECRET_AGENT_GET_PRIVATE (self);
350− self->priv->requests = g_queue_new ();
351−}
352−
353−GType
354−unity_settings_secret_agent_get_type (void)
355−{
356− static volatile gsize unity_settings_secret_agent_type_id__volatile = 0;
357− if (g_once_init_enter (&unity_settings_secret_agent_type_id__volatile))
358− {
359− static const GTypeInfo g_define_type_info =
360− {
361− sizeof (UnitySettingsSecretAgentClass),
362− (GBaseInitFunc) NULL,
363− (GBaseFinalizeFunc) NULL,
364− (GClassInitFunc) unity_settings_secret_agent_class_init,
365− (GClassFinalizeFunc) NULL,
366− NULL,
367− sizeof (UnitySettingsSecretAgent),
368− 0,
369− (GInstanceInitFunc) unity_settings_secret_agent_instance_init,
370− NULL
371− };
372− GType unity_settings_secret_agent_type_id;
373− unity_settings_secret_agent_type_id = g_type_register_static (NM_TYPE_SECRET_AGENT,
374− "UnitySettingsSecretAgent",
375− &g_define_type_info,
376− 0);
377− g_once_init_leave (&unity_settings_secret_agent_type_id__volatile,
378− unity_settings_secret_agent_type_id);
379− }
380−
381− return unity_settings_secret_agent_type_id__volatile;
382−}
plugins/Unity/IndicatorsLegacy/Network/secret-agent.hdeleted−102
@@ -1,102 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Alberto Ruiz <alberto.ruiz@canonical.com>
18− * Renato Araujo Oliveira Filho <renato@canonical.com>
19− */
20−
21−#ifndef __SECRET_AGENT_H__
22−#define __SECRET_AGENT_H__
23−
24−#include <glib.h>
25−#include <glib-object.h>
26−#include <nm-secret-agent.h>
27−
28−/*
29− * This class is a basic implementation of the NetworkManager SecretAgent base class.
30− *
31− * The purpose of this class is to handle credential requests from the network,
32− * for example, from a WiFi hotspot or a VPN network.
33− *
34− * It queues requests objects (SecretRequest) on a GQueue in the private struct
35− * of the class. And notifies the consumer of the class through the "secret-request"
36− * and the "request-cancelled" signals with the following callback prototypes:
37− *
38− * void (*secret_requested) (UnitySettingsSecretAgent *self,
39− * guint id,
40− * NMConnection *connection,
41− * const char *setting_name,
42− * const char **hints,
43− * NMSecretAgentGetSecretsFlags flags,
44− * gpointer user_data);
45− *
46− * void (*request_cancelled) (UnitySettingsSecretAgent *self,
47− * guint id,
48− * gpointer user_data);
49− *
50− */
51−
52−
53−G_BEGIN_DECLS
54−
55−
56−#define UNITY_SETTINGS_TYPE_SECRET_AGENT (unity_settings_secret_agent_get_type ())
57−#define UNITY_SETTINGS_SECRET_AGENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgent))
58−#define UNITY_SETTINGS_SECRET_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgentClass))
59−#define UNITY_SETTINGS_IS_SECRET_AGENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), UNITY_SETTINGS_TYPE_SECRET_AGENT))
60−#define UNITY_SETTINGS_IS_SECRET_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), UNITY_SETTINGS_TYPE_SECRET_AGENT))
61−#define UNITY_SETTINGS_SECRET_AGENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), UNITY_SETTINGS_TYPE_SECRET_AGENT, UnitySettingsSecretAgentClass))
62−
63−#define UNITY_SETTINGS_SECRET_AGENT_SECRET_REQUESTED "secret-requested"
64−#define UNITY_SETTINGS_SECRET_AGENT_REQUEST_CANCELLED "request-cancelled"
65−
66−typedef struct _UnitySettingsSecretAgent UnitySettingsSecretAgent;
67−typedef struct _UnitySettingsSecretAgentClass UnitySettingsSecretAgentClass;
68−typedef struct _UnitySettingsSecretAgentPrivate UnitySettingsSecretAgentPrivate;
69−
70−struct _UnitySettingsSecretAgent {
71− NMSecretAgent parent_instance;
72− UnitySettingsSecretAgentPrivate * priv;
73−};
74−
75−struct _UnitySettingsSecretAgentClass {
76− NMSecretAgentClass parent_class;
77−
78− void (*secret_requested) (UnitySettingsSecretAgent *self,
79− guint id,
80− NMConnection *connection,
81− const char *setting_name,
82− const char **hints,
83− NMSecretAgentGetSecretsFlags flags);
84−
85− void (*request_cancelled) (UnitySettingsSecretAgent *self,
86− guint id);
87−};
88−
89−
90−GType unity_settings_secret_agent_get_type (void) G_GNUC_CONST;
91−UnitySettingsSecretAgent* unity_settings_secret_agent_new (void);
92−UnitySettingsSecretAgent* unity_settings_secret_agent_construct (GType object_type);
93−
94−void unity_settings_secret_agent_provide_secret (UnitySettingsSecretAgent *agent,
95− guint request,
96− GHashTable *secrets);
97−void unity_settings_secret_agent_cancel_request (UnitySettingsSecretAgent *agent,
98− guint request);
99−
100−G_END_DECLS
101−
102−#endif
plugins/Unity/IndicatorsLegacy/flatmenuproxymodel.cppdeleted−288
@@ -1,288 +0,0 @@
1−/*
2− * Copyright 2012 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−extern "C" {
21−#include <gio/gio.h>
22−}
23−
24−#include "flatmenuproxymodel.h"
25−#include <QString>
26−#include <QStringList>
27−
28−FlatMenuProxyModel::FlatMenuProxyModel(QAbstractItemModel *source)
29− : QAbstractProxyModel(source),
30− m_rowCount(0)
31−{
32− m_model = new QDBusMenuModel;
33− setSourceModel(m_model);
34−}
35−
36−/*! \internal */
37−FlatMenuProxyModel::~FlatMenuProxyModel()
38−{
39− delete m_model;
40−}
41−
42−void FlatMenuProxyModel::setSourceModel(QAbstractItemModel *source)
43−{
44− if (sourceModel()) {
45− QAbstractItemModel *oldSource = sourceModel();
46− if (oldSource == source) {
47− return;
48− }
49−
50− oldSource->disconnect(this);
51− }
52−
53− QAbstractProxyModel::setSourceModel(source);
54−
55− if (source) {
56−
57− // FIXME - not working correctly with dynamic inserts/removes
58− // FIXME 2 - We're using Queud connections as a workaround to QTBUG-32859
59− // The signals from qmenumodel are coming straight off the glib event loop,
60− // which is not supported and has the effect of listview delegates not to be deleted.
61−
62− connect(source,
63− SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)),
64− SLOT(onModelAboutToBeReset()), Qt::QueuedConnection);
65− connect(source,
66− SIGNAL(rowsInserted(QModelIndex,int,int)),
67− SLOT(onModelReset()), Qt::QueuedConnection);
68−
69− connect(source,
70− SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
71− SLOT(onModelAboutToBeReset()), Qt::QueuedConnection);
72− connect(source,
73− SIGNAL(rowsRemoved(QModelIndex,int,int)),
74− SLOT(onModelReset()), Qt::QueuedConnection);
75−
76− connect(source,
77− SIGNAL(modelAboutToBeReset()),
78− SLOT(onModelAboutToBeReset()), Qt::QueuedConnection);
79− connect(source,
80− SIGNAL(modelReset()),
81− SLOT(onModelReset()), Qt::QueuedConnection);
82−
83− //Connection args
84− connect(source,
85− SIGNAL(busTypeChanged(DBusEnums::BusType)),
86− SIGNAL(busTypeChanged()));
87−
88− connect(source,
89− SIGNAL(busNameChanged(const QString&)),
90− SIGNAL(busNameChanged()));
91−
92− connect(source,
93− SIGNAL(objectPathChanged(const QString&)),
94− SIGNAL(objectPathChanged()));
95−
96− connect(source,
97− SIGNAL(statusChanged(DBusEnums::ConnectionStatus)),
98− SIGNAL(statusChanged()), Qt::QueuedConnection);
99−
100− // initiliaze rowCount
101− QModelIndex lastItem = source->index(source->rowCount() - 1, 0);
102− m_rowCount = recursiveRowCount(lastItem);
103− } else {
104− m_rowCount = 0;
105− }
106−
107− Q_EMIT countChanged();
108−}
109−
110−void FlatMenuProxyModel::setBusName(const QString &busName)
111−{
112− m_model->setBusName(busName);
113−}
114−
115−QString FlatMenuProxyModel::busName() const
116−{
117− return m_model->busName();
118−}
119−
120−void FlatMenuProxyModel::setObjectPath(const QString &busPath)
121−{
122− m_model->setObjectPath(busPath);
123−}
124−
125−QString FlatMenuProxyModel::objectPath() const
126−{
127− return m_model->objectPath();
128−}
129−
130−int FlatMenuProxyModel::status() const
131−{
132− return m_model->status();
133−}
134−
135−DBusEnums::BusType FlatMenuProxyModel::busType() const
136−{
137− return m_model->busType();
138−}
139−
140−void FlatMenuProxyModel::setIntBusType(int type)
141−{
142− m_model->setBusType((DBusEnums::BusType) type);
143−}
144−
145−void FlatMenuProxyModel::start()
146−{
147− m_model->start();
148−}
149−
150−void FlatMenuProxyModel::stop()
151−{
152− m_model->stop();
153−}
154−
155−QModelIndex FlatMenuProxyModel::mapFromSource(const QModelIndex &index) const
156−{
157− if (!index.isValid()) {
158− return QModelIndex();
159− }
160−
161− QModelIndex result = createIndex(rowOffsetOf(index, index.row()), 0);
162− return result;
163−}
164−
165−QModelIndex FlatMenuProxyModel::mapToSource(const QModelIndex &index) const
166−{
167− if (sourceModel() && m_indexCache.contains(index.row())) {
168− QString key = m_indexCache.value(index.row());
169− QStringList sections = key.split('.', QString::SkipEmptyParts);
170− QModelIndex sourceIndex = QModelIndex();
171− for(int i=0; i < sections.size(); i++) {
172− sourceIndex = sourceModel()->index(sections.at(i).toInt(), 9, sourceIndex);
173− }
174− return sourceIndex;
175− } else {
176− return QModelIndex();
177− }
178−}
179−
180−QModelIndex FlatMenuProxyModel::index(int row, int sectionRow, const QModelIndex &parent, const QString &key) const
181−{
182− for (int i = 0, count = 0; i < sourceModel()->rowCount(parent); i++) {
183− QModelIndex sourceIndex = sourceModel()->index(i, 0, parent);
184− int indexCount = recursiveRowCount(sourceIndex);
185−
186− if (count == sectionRow) {
187− QString sectionKey = key + "." + QString::number(i);
188− m_indexCache.insert(row, sectionKey);
189− return createIndex(row, 0);
190− } else if ((count + indexCount) >= sectionRow) {
191− count++;
192− return index(row, sectionRow - count, sourceIndex, key + "." + QString::number(i));
193− }
194−
195− count += indexCount + 1;
196− }
197− return QModelIndex();
198−}
199−
200−QModelIndex FlatMenuProxyModel::index(int row, int, const QModelIndex &) const
201−{
202− return index(row, row, QModelIndex(), "");
203−}
204−
205−QModelIndex FlatMenuProxyModel::parent(const QModelIndex &) const
206−{
207− return QModelIndex();
208−}
209−
210−int FlatMenuProxyModel::columnCount(const QModelIndex &) const
211−{
212− return 1;
213−}
214−
215−int FlatMenuProxyModel::rowCount(const QModelIndex &) const
216−{
217− return m_rowCount;
218−}
219−
220−int FlatMenuProxyModel::count() const
221−{
222− return rowCount(QModelIndex());
223−}
224−
225−void FlatMenuProxyModel::onModelAboutToBeReset()
226−{
227− beginResetModel();
228−}
229−
230−void FlatMenuProxyModel::onModelReset()
231−{
232− // initiliaze rowCount
233− m_rowCount = 0;
234− for (int i = 0, iMax = sourceModel()->rowCount(); i < iMax; i++) {
235− QModelIndex index = sourceModel()->index(i, 0);
236− m_rowCount += recursiveRowCount(index) + 1;
237− }
238− m_indexCache.clear();
239− endResetModel();
240− Q_EMIT countChanged();
241−}
242−
243−int FlatMenuProxyModel::recursiveRowCount(const QModelIndex &index) const
244−{
245− int size = sourceModel()->rowCount(index);
246− for (int i=0, iMax=size; i < iMax; i++) {
247− QModelIndex currentIndex = sourceModel()->index(i, 0, index);
248− size += recursiveRowCount(currentIndex);
249− }
250−
251− return size;
252−}
253−
254−int FlatMenuProxyModel::rowOffsetOf(const QModelIndex &index, int row, bool inclusive) const
255−{
256− int offset = 0;
257−
258− QModelIndex parent = index.parent();
259−
260− // Check row 0 offset
261− while(parent.isValid()) {
262− offset += 1;
263− for (int i = 0; i < parent.row(); i++) {
264− QModelIndex currentIndex = sourceModel()->index(i, 0, parent);
265− offset += recursiveRowCount(currentIndex) + 1;
266− }
267− parent = parent.parent();
268− }
269−
270− // Check index.row() offset
271− for(int i = 0; i < row; i++) {
272− QModelIndex currentIndex = sourceModel()->index(i, 0, index.parent());
273− offset += recursiveRowCount(currentIndex) + 1;
274− }
275−
276− if (inclusive) {
277− // itself
278− QModelIndex currentIndex = sourceModel()->index(row, 0, index.parent());
279− offset += recursiveRowCount(currentIndex);
280− }
281−
282− return offset;
283−}
284−
285−QVariant FlatMenuProxyModel::data(int row, int role) const
286−{
287− return QAbstractProxyModel::data(index(row, 0), role);
288−}
plugins/Unity/IndicatorsLegacy/flatmenuproxymodel.hdeleted−93
@@ -1,93 +0,0 @@
1−/*
2− * Copyright 2012 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−#ifndef FLATMENUPROXYMODEL_H
21−#define FLATMENUPROXYMODEL_H
22−
23−#include "unityindicatorsglobal.h"
24−
25−#include <QAbstractProxyModel>
26−#include <qdbusmenumodel.h>
27−
28−class SectionInfo;
29−
30−class UNITYINDICATORS_EXPORT FlatMenuProxyModel : public QAbstractProxyModel
31−{
32− Q_OBJECT
33− Q_PROPERTY(int count READ count NOTIFY countChanged)
34− Q_PROPERTY(int busType READ busType WRITE setIntBusType NOTIFY busTypeChanged)
35− Q_PROPERTY(QString busName READ busName WRITE setBusName NOTIFY busNameChanged)
36− Q_PROPERTY(QString objectPath READ objectPath WRITE setObjectPath NOTIFY objectPathChanged)
37− Q_PROPERTY(int status READ status NOTIFY statusChanged)
38−
39− Q_ENUMS(Roles)
40−public:
41− FlatMenuProxyModel(QAbstractItemModel *source=0);
42− ~FlatMenuProxyModel();
43−
44− void setSourceModel(QAbstractItemModel * sourceModel);
45−
46− Q_INVOKABLE QVariant data(int row, int role = Qt::DisplayRole) const;
47−
48− QModelIndex mapFromSource(const QModelIndex &index) const;
49− QModelIndex mapToSource(const QModelIndex &index) const;
50−
51− QModelIndex index(int row, int column = 0, const QModelIndex &parent = QModelIndex()) const;
52− QModelIndex parent(const QModelIndex &index) const;
53− int rowCount(const QModelIndex &parent = QModelIndex()) const;
54− int count() const;
55− int columnCount(const QModelIndex &parent) const;
56−
57− void setBusName(const QString &busName);
58− QString busName() const;
59−
60− void setObjectPath(const QString &busName);
61− QString objectPath() const;
62−
63− DBusEnums::BusType busType() const;
64− void setIntBusType(int type);
65−
66− int status() const;
67−
68−public Q_SLOTS:
69− void onModelAboutToBeReset();
70− void onModelReset();
71−
72− void start();
73− void stop();
74−
75−Q_SIGNALS:
76− void countChanged();
77−
78− void busTypeChanged();
79− void busNameChanged();
80− void objectPathChanged();
81− void statusChanged();
82−
83−private:
84− QDBusMenuModel *m_model;
85− mutable QMap<int, QString> m_indexCache;
86− int m_rowCount;
87−
88− int rowOffsetOf(const QModelIndex &index, int row, bool inclusive = false) const;
89− int recursiveRowCount(const QModelIndex &index) const;
90− QModelIndex index(int row, int rowCount, const QModelIndex &parent, const QString &key) const;
91−};
92−
93−#endif
plugins/Unity/IndicatorsLegacy/modelprinter.cppdeleted−114
@@ -1,114 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Nick Dedekind <nick.dedekind@canonical.com>
18− */
19−
20−// self
21−#include "modelprinter.h"
22−
23−// Qt
24−#include <QTextStream>
25−
26−ModelPrinter::ModelPrinter(QObject *parent)
27− : QObject(parent)
28− , m_model(NULL)
29−{
30−}
31−
32−void ModelPrinter::setSourceModel(QAbstractItemModel * sourceModel)
33−{
34− if (m_model != NULL) {
35− disconnect(m_model);
36− }
37− if (m_model != sourceModel) {
38− m_model = sourceModel;
39− Q_EMIT modelChanged();
40− Q_EMIT textChanged();
41− }
42− if (m_model != NULL) {
43− connect(m_model, SIGNAL(modelReset()), this, SIGNAL(textChanged()));
44− connect(m_model, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SIGNAL(textChanged()));
45− connect(m_model, SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SIGNAL(textChanged()));
46− }
47−}
48−
49−QAbstractItemModel* ModelPrinter::sourceModel() const
50−{
51− return m_model;
52−}
53−
54−QString ModelPrinter::text(const QModelIndex& index) const
55−{
56− return recurseString(index, 0);
57−}
58−
59−QString tabify(int level) { QString str;
60− for (int i = 0; i < level; i++) {
61− str += " ";
62− }
63− return str;
64−}
65−
66−QString ModelPrinter::recurseString(const QModelIndex& index, int level) const
67−{
68− if (!m_model)
69− return "";
70−
71− QString str;
72− QTextStream stream(&str);
73−
74− QHash<int, QByteArray> roleNames = m_model->roleNames();
75− QList<int> roles = roleNames.keys();
76− qSort(roles);
77− Q_FOREACH(int role, roles) {
78− QVariant vData = m_model->data(index, role);
79− if (vData.canConvert(QMetaType::QVariantMap)) {
80− QMapIterator<QString, QVariant> iter(vData.toMap());
81− while (iter.hasNext()) {
82− iter.next();
83− stream << tabify(level)
84− << roleNames[role]
85− << "."
86− << iter.key()
87− << ": "
88− << iter.value().toString()
89− << endl;
90− }
91− }
92− else {
93− stream << tabify(level)
94− << roleNames[role]
95− << ": "
96− << vData.toString()
97− << endl;
98− }
99− }
100−
101− int rowCount = m_model->rowCount(index);
102− stream << tabify(level)
103− << "child count"
104− << ": "
105− << rowCount
106− << endl
107− << endl;
108−
109− for (int i = 0; i < rowCount; i++) {
110− QModelIndex child = m_model->index(i, 0, index);
111− str += recurseString(child, level+1);
112− }
113− return str;
114−}
plugins/Unity/IndicatorsLegacy/modelprinter.hdeleted−50
@@ -1,50 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Nick Dedekind <nick.dedekind@canonical.com>
18− */
19−
20−#ifndef MODELPRINTER_H
21−#define MODELPRINTER_H
22−
23−#include <QSortFilterProxyModel>
24−
25−// This class acts as a namespace only, with the addition that its enums
26−// are registered to be exposed on the QML side.
27−class ModelPrinter : public QObject
28−{
29− Q_OBJECT
30−
31− Q_PROPERTY(QAbstractItemModel* model READ sourceModel WRITE setSourceModel NOTIFY modelChanged)
32− Q_PROPERTY(QString text READ text NOTIFY textChanged)
33−public:
34− ModelPrinter(QObject* parent=0);
35−
36− void setSourceModel(QAbstractItemModel* sourceModel);
37− QAbstractItemModel* sourceModel() const;
38−
39− Q_INVOKABLE QString text(const QModelIndex& index = QModelIndex()) const;
40−
41−Q_SIGNALS:
42− void modelChanged();
43− void textChanged();
44−
45−private:
46− QString recurseString(const QModelIndex& index, int level) const;
47− QAbstractItemModel* m_model;
48−};
49−
50−#endif // MODELPRINTER_H
plugins/Unity/IndicatorsLegacy/plugin.cppdeleted−42
@@ -1,42 +0,0 @@
1−/*
2− * Copyright (C) 2012 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Author: Nick Dedekind <nick.dedekind@canonical.com>
17− */
18−
19−// Qt
20−#include <QtQml/qqml.h>
21−
22−// self
23−#include "plugin.h"
24−
25−// local
26−#include "flatmenuproxymodel.h"
27−#include "indicators.h"
28−#include "modelprinter.h"
29−
30−void IndicatorsPlugin::registerTypes(const char *uri)
31−{
32− Q_INIT_RESOURCE(indicators);
33−
34− qmlRegisterType<FlatMenuProxyModel>(uri, 0, 1, "FlatMenuProxyModel");
35− qmlRegisterType<ModelPrinter>(uri, 0, 1, "ModelPrinter");
36−
37− qmlRegisterUncreatableType<ActionState>(uri, 0, 1, "ActionState", "Can't create ActionState class");
38− qmlRegisterUncreatableType<NetworkActionState>(uri, 0, 1, "NetworkActionState", "Can't create NetworkActionState class");
39− qmlRegisterUncreatableType<NetworkConnection>(uri, 0, 1, "NetworkConnection", "Can't create NetworkConnection class");
40− qmlRegisterUncreatableType<IndicatorsModelRole>(uri, 0, 1, "IndicatorsModelRole", "Can't create IndicatorsModelRole class");
41− qmlRegisterUncreatableType<FlatMenuProxyModelRole>(uri, 0, 1, "FlatMenuProxyModelRole", "Can't create FlatMenuProxyModelRole class");
42−}
plugins/Unity/IndicatorsLegacy/plugin.hdeleted−32
@@ -1,32 +0,0 @@
1−/*
2− * Copyright (C) 2012 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Author: Nick Dedekind <nick.dedekind@canonical.com>
17− */
18−
19−#ifndef INDICATORS_PLUGIN_H
20−#define INDICATORS_PLUGIN_H
21−
22−#include <QtQml/QQmlExtensionPlugin>
23−
24−class IndicatorsPlugin : public QQmlExtensionPlugin
25−{
26− Q_OBJECT
27− Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28−public:
29− void registerTypes(const char *uri);
30−};
31−
32−#endif // INDICATORS_PLUGIN_H
plugins/Unity/IndicatorsLegacy/qml/BasicMenuItem.qmldeleted−48
@@ -1,48 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components.ListItems 0.1 as ListItem
22−
23−ListItem.Standard {
24− id: stdListItem
25−
26− property bool menuActivated: false
27− property QtObject menu
28− property QtObject actionGroup
29− property alias color: background.color
30−
31− signal activateMenu()
32− signal deactivateMenu()
33−
34− showDivider: false
35− __foregroundColor: "#e8e1d0"
36−
37− backgroundIndicator: RemoveBackground {
38− state: stdListItem.swipingState
39− }
40−
41− Rectangle {
42− id: background
43−
44− anchors.fill: parent
45− color: "#221e1c"
46− z: -1
47− }
48−}
plugins/Unity/IndicatorsLegacy/qml/ButtonMenuItem.qmldeleted−47
@@ -1,47 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−
23−BasicMenuItem {
24− id: buttonMenu
25− color: "#221e1b"
26− implicitHeight: units.gu(7)
27−
28− Button {
29− id: button
30− enabled: menuAction.valid
31− text: menu ? menu.label : ""
32− anchors.centerIn: parent
33− height: units.gu(4)
34− width: units.gu(16)
35− color: "#1b1817"
36−
37− onClicked: {
38− menuAction.activate()
39− }
40− }
41−
42− MenuAction {
43− id: menuAction
44− actionGroup: buttonMenu.actionGroup
45− action: menu ? menu.action : ""
46− }
47−}
plugins/Unity/IndicatorsLegacy/qml/CMakeLists.txtdeleted−5
@@ -1,5 +0,0 @@
1−# export_qmlplugin macro
2−include(Plugins)
3−
4−# export the qmldir, *.qml files.
5−export_qmlfiles(Unity.IndicatorsLegacy Unity/IndicatorsLegacy)
plugins/Unity/IndicatorsLegacy/qml/DivMenuItem.qmldeleted−26
@@ -1,26 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Olivier Tilloy <olivier.tilloy@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−
23−Rectangle {
24− color: "#181514"
25− implicitHeight: units.gu(1)
26−}
plugins/Unity/IndicatorsLegacy/qml/HLine.qmldeleted−29
@@ -1,29 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−
23−Rectangle {
24− height: units.dp(1)
25− anchors {
26− left: parent.left
27− right: parent.right
28− }
29−}
plugins/Unity/IndicatorsLegacy/qml/IndicatorBase.qmldeleted−59
@@ -1,59 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− * Nick Dedekind <nick.dedekind@canonical.com>
19− */
20−
21−import QtQuick 2.0
22−import QMenuModel 0.1
23−import Unity.IndicatorsLegacy 0.1 as Indicators
24−
25−Item {
26− id: indicatorItem
27−
28− //const
29− property string title
30− property int busType
31− property string busName
32− property string actionsObjectPath
33− property var menuObjectPaths: undefined
34− readonly property string device: "phone"
35−
36− property string deviceMenuObjectPath: menuObjectPaths.hasOwnProperty(device) ? menuObjectPaths[device] : ""
37−
38− signal actionGroupUpdated()
39− signal modelUpdated()
40−
41− property var actionGroup: QDBusActionGroup {
42− busType: indicatorItem.busType
43− busName: indicatorItem.busName
44− objectPath: indicatorItem.actionsObjectPath
45−
46− onActionAppear: indicatorItem.actionGroupUpdated();
47− }
48−
49− property var proxyModel: Indicators.FlatMenuProxyModel {
50− busType: indicatorItem.busType
51− busName: indicatorItem.busName
52− objectPath: indicatorItem.deviceMenuObjectPath
53−
54− onStatusChanged: indicatorItem.modelUpdated();
55− onRowsInserted: indicatorItem.modelUpdated();
56− onRowsRemoved: indicatorItem.modelUpdated();
57− onDataChanged: indicatorItem.modelUpdated();
58− }
59−}
plugins/Unity/IndicatorsLegacy/qml/IndicatorPage.qmldeleted−191
@@ -1,191 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− * Nick Dedekind <nick.dedekind@canonical.com>
19− */
20−
21−import QtQuick 2.0
22−import Ubuntu.Components 0.1 as Components
23−
24−IndicatorBase {
25− id: main
26−
27− //const
28− property alias emptyText: emptyLabel.text
29− property alias highlightFollowsCurrentItem : mainMenu.highlightFollowsCurrentItem
30− property bool __active: false
31−
32− ListView {
33− id: mainMenu
34−
35− property int visibleItems: 0
36−
37− model: proxyModel
38− anchors {
39− fill: parent
40− bottomMargin: Qt.inputMethod.visible ? (Qt.inputMethod.keyboardRectangle.height - main.anchors.bottomMargin) : 0
41−
42− Behavior on bottomMargin {
43− NumberAnimation {
44− duration: 175
45− easing.type: Easing.OutQuad
46− }
47− }
48− // TODO - does ever frame.
49− onBottomMarginChanged: {
50− mainMenu.positionViewAtIndex(mainMenu.currentIndex, ListView.End)
51− }
52− }
53−
54− // Ensure all delegates are cached in order to improve smoothness of scrolling
55− cacheBuffer: 10000
56−
57− // Only allow flicking if the content doesn't fit on the page
58− interactive: contentHeight > height
59−
60− currentIndex: -1
61− delegate: Item {
62− id: item
63− property bool ready: false
64− property alias empty: factory.empty
65−
66− anchors {
67− left: parent.left
68− right: parent.right
69− }
70− height: div.height + factory.implicitHeight
71− visible: height > 0
72−
73− Component.onCompleted: {
74− if (!item.empty) {
75− mainMenu.visibleItems += 1;
76− }
77− ready = true;
78− }
79− Component.onDestruction: {
80− if (!item.empty) {
81− mainMenu.visibleItems -= 1;
82− }
83− ready = false;
84− }
85−
86− onEmptyChanged: {
87− if (!ready) {
88− return;
89− }
90− if (empty) {
91− mainMenu.visibleItems -= 1;
92− } else {
93− mainMenu.visibleItems += 1;
94− }
95− }
96−
97− ListView.onRemove: {
98− if (!highlightFollowsCurrentItem) {
99− mainMenu.currentIndex = -1;
100− }
101− }
102−
103− Column {
104− id: contents
105−
106− anchors.fill: parent
107−
108− DivMenuItem {
109− id: div
110−
111− anchors.left: parent.left
112− anchors.right: parent.right
113− // only visible if is a root or a section header element and the factory is visible
114− height: {
115− // skipe first item
116− if (item.y == 0) {
117− return 0;
118− }
119− if (hasSection || ((depth == 0) && (!factory.empty))) {
120− return implicitHeight;
121− } else {
122− return 0;
123− }
124− }
125− }
126−
127− MenuItemFactory {
128− id: factory
129−
130− actionGroup: main.actionGroup
131− isCurrentItem: item.ListView.isCurrentItem
132− anchors {
133− left: parent.left
134− right: parent.right
135− }
136− menu: model
137−
138− Connections {
139− target : factory
140− onActivated: item.ListView.view.currentIndex = index
141− onDeactivated: item.ListView.view.currentIndex = -1
142− }
143− }
144− }
145− }
146− }
147−
148− Components.Label {
149− id: emptyLabel
150− visible: (mainMenu.visibleItems === 0)
151− anchors {
152− top: parent.top
153− left: parent.left
154− right: parent.right
155− topMargin: units.gu(2)
156− }
157− wrapMode: Text.WordWrap
158− horizontalAlignment: Text.AlignHCenter
159−
160− //style
161− color: "#e8e1d0"
162− fontSize: "medium"
163−
164− text: "Empty!"
165− }
166−
167− function start()
168− {
169− reset()
170− if (!__active) {
171− proxyModel.start();
172− actionGroup.start();
173− __active = true;
174− }
175− }
176−
177− function stop()
178− {
179− if (__active) {
180− __active = false;
181− proxyModel.stop();
182− actionGroup.stop();
183− }
184− }
185−
186− function reset()
187− {
188− mainMenu.currentIndex = -1;
189− mainMenu.positionViewAtBeginning();
190− }
191−}
plugins/Unity/IndicatorsLegacy/qml/IndicatorWidget.qmldeleted−68
@@ -1,68 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Nick Dedekind <nick.dedekind@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Unity.IndicatorsLegacy 0.1 as Indicators
22−
23−IndicatorBase {
24− id: indicatorWidget
25−
26− enabled: false
27− property var action: undefined
28− property bool started: (busType != 0) && (busName != "") && (deviceMenuObjectPath != "")
29− property int iconSize: height - units.gu(0.5)
30− property string rootMenuType: "com.canonical.indicator.root"
31−
32− signal actionStateChanged()
33−
34− onStartedChanged: {
35− if (started) {
36− proxyModel.start();
37− actionGroup.start();
38− } else {
39− proxyModel.stop();
40− actionGroup.stop();
41− }
42− }
43− onActionGroupUpdated: update_state()
44− onModelUpdated: update_state()
45−
46−
47− function update_state() {
48− var extra = proxyModel.data(0, Indicators.FlatMenuProxyModelRole.Extra);
49− if (extra == undefined) {
50− return;
51− }
52−
53− if (!extra.hasOwnProperty("canonical_type")) {
54− return;
55− }
56−
57− if (extra.canonical_type === rootMenuType) {
58− action = actionGroup.action(proxyModel.data(0, Indicators.FlatMenuProxyModelRole.Action));
59− actionStateChanged();
60− }
61− }
62−
63− Connections {
64− target: action == undefined ? null : action
65− onStateChanged: actionStateChanged()
66− onValidChanged: actionStateChanged()
67− }
68−}
plugins/Unity/IndicatorsLegacy/qml/MenuAction.qmldeleted−86
@@ -1,86 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−
22−/*!
23− \qmltype MenuAction
24− \inqmlmodule Indicators 0.1
25− \brief Helper class to connect to a qmenumodel action
26−
27− Example:
28− \qml
29− Button {
30− id: slide
31− onClick: { action.activate() }
32− }
33− MenuAction {
34− id: action
35− actionGroup: menuItem.actionGroup
36− action: "/ubuntu/sound/enabled"
37− }
38− \endqml
39−*/
40−
41−Item {
42− id: menuAction
43−
44− /*!
45− \preliminary
46− The dbus action name
47− */
48− property string action: ""
49−
50− /*!
51− \preliminary
52− The dbus action group object
53− */
54− property QtObject actionGroup: null
55−
56− /*!
57− \preliminary
58− This is a read-only property with the current validity of the action
59− */
60− readonly property bool valid: actionObject ? actionObject.valid : false
61−
62− readonly property var state: actionObject ? actionObject.state : undefined
63−
64− // internal
65− property QtObject actionObject: null
66−
67− function activate(param) {
68− if (valid) {
69− actionObject.activate(param);
70− }
71− }
72−
73− onActionGroupChanged: updateAction()
74− onActionChanged: updateAction()
75−
76− Connections {
77− target: menuAction.actionGroup != undefined ? menuAction.actionGroup : null
78− onActionAppear: menuAction.updateAction();
79− onActionVanish: menuAction.updateAction();
80− onStatusChanged: menuAction.updateAction();
81− }
82−
83− function updateAction() {
84− actionObject = action !== "" && actionGroup ? actionGroup.action(action) : null
85− }
86−}
plugins/Unity/IndicatorsLegacy/qml/MenuActionBinding.qmldeleted−106
@@ -1,106 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−
22−/*!
23− \qmltype MenuActionBinding
24− \inqmlmodule Indicators 0.1
25− \brief Helper class to connect a qmenumodel action state with a qml components property
26−
27− Example:
28− \qml
29− Slider {
30− id: slide
31− }
32− MenuActionBinding {
33− actionGroup: menuItem.actionGroup
34− action: "/ubuntu/sound/volume"
35− target: slider
36− property: "value"
37− }
38− \endqml
39−*/
40−
41−MenuAction {
42− id: menuAction
43−
44− /*!
45− \preliminary
46− The component which will have the property changed by action
47− */
48− property QtObject target: null
49−
50− /*!
51− \preliminary
52− The property name of \l target component which will be linked with action state
53− */
54− property string property
55−
56− /*!
57− \preliminary
58− Use this to enable or disable the action state propagation to component property.
59− */
60− property bool active: true
61−
62− Component.onCompleted: connectViewChanges()
63− onTargetChanged: connectViewChanges()
64− onPropertyChanged: connectViewChanges()
65−
66− Item {
67− id: d
68− property var currentTarget: undefined
69− property string currentSignal
70− }
71−
72− Binding {
73− id: propertyBinding
74− target: menuAction.target
75− property: menuAction.property
76− value: menuAction.state
77− when: menuAction.actionObject && menuAction.active
78− }
79−
80− // TODO - re-evaluate in c++
81− function connectViewChanges() {
82− if (d.currentTarget != undefined && d.currentSignal !== "") {
83− if (d.currentTarget[d.currentSignal] !== undefined) {
84− d.currentTarget[d.currentSignal].disconnect(onViewValueChanged);
85− }
86− }
87−
88− d.currentTarget = null;
89− d.currentSignal = "";
90− if (target) {
91− var signal = "on%1Changed".arg(property.charAt(0).toUpperCase() + property.slice(1));
92− if (target[signal] !== undefined) {
93− target[signal].connect(onViewValueChanged);
94− d.currentTarget = target;
95− d.currentSignal = signal;
96− }
97− }
98− }
99−
100− function onViewValueChanged() {
101− if (valid) {
102− var propertyValue = target[property];
103− actionObject.updateState(propertyValue);
104− }
105− }
106−}
plugins/Unity/IndicatorsLegacy/qml/MenuItem.qmldeleted−40
@@ -1,40 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−import Ubuntu.Components.ListItems 0.1 as ListItem
23−
24−BasicMenuItem {
25− objectName: menu ? menu.action : ""
26− progression: menu && (menu.linkSubMenu !== undefined)
27− text: menu && menu.label ? menu.label : ""
28− color: "#221e1c"
29− implicitHeight: units.gu(7)
30−
31− HLine {
32− anchors.top: parent.top
33− color: "#403b37"
34− }
35−
36− HLine {
37− anchors.bottom: parent.bottom
38− color: "#060606"
39− }
40−}
plugins/Unity/IndicatorsLegacy/qml/MenuItemFactory.qmldeleted−110
@@ -1,110 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Nick Dedekind <nick.dedekind@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Unity.IndicatorsLegacy 0.1 as Indicators
22−import Unity.IndicatorsLegacy.Messaging 0.1 as ICMessaging
23−import Unity.IndicatorsLegacy.Network 0.1 as ICNetwork
24−
25−Item {
26− id: menuFactory
27−
28− property QtObject menu
29− property QtObject listView
30− property QtObject actionGroup
31− property bool isCurrentItem
32− readonly property bool empty: (loader.item !== undefined && loader.status == Loader.Ready) ? loader.item.state === "EMPTY" : true
33−
34− implicitHeight: loader.height
35−
36− signal activated()
37− signal deactivated()
38−
39− property var _map: {
40− "unity.widgets.systemsettings.tablet.volumecontrol" : sliderMenu,
41− "unity.widgets.systemsettings.tablet.switch" : switchMenu,
42−
43− "com.canonical.indicator.button" : buttonMenu,
44− "com.canonical.indicator.div" : divMenu,
45− "com.canonical.indicator.section" : sectionMenu,
46− "com.canonical.indicator.progress" : progressMenu,
47− "com.canonical.indicator.slider" : sliderMenu,
48− "com.canonical.indicator.switch" : switchMenu,
49−
50− "com.canonical.indicator.messages.messageitem" : messageItem,
51− "com.canonical.indicator.messages.snapdecision" : snapDecision,
52− "com.canonical.indicator.messages.sourceitem" : groupedMessage,
53−
54− "unity.widget.systemsettings.tablet.sectiontitle" : wifiSection,
55− "unity.widgets.systemsettings.tablet.wifisection" : wifiSection,
56− "unity.widgets.systemsettings.tablet.accesspoint" : accessPoint,
57− }
58−
59− Component { id: sliderMenu; Indicators.SliderMenuItem {} }
60− Component { id: switchMenu; Indicators.SwitchMenuItem {} }
61− Component { id: buttonMenu; Indicators.ButtonMenuItem {} }
62− Component { id: divMenu; Indicators.DivMenuItem {} }
63− Component { id: sectionMenu; Indicators.SectionMenuItem {} }
64− Component { id: progressMenu; Indicators.ProgressMenuItem {} }
65− Component { id: messageItem; ICMessaging.MessageMenuItem {} }
66− Component { id: snapDecision; ICMessaging.SnapDecision {} }
67− Component { id: groupedMessage; ICMessaging.GroupedMessage {} }
68− Component { id: wifiSection; ICNetwork.WifiSection {} }
69− Component { id: accessPoint; ICNetwork.AccessPoint {} }
70− Component { id: indicatorMenu; Indicators.MenuItem {} }
71−
72− Loader {
73− id: loader
74− asynchronous: true
75−
76− anchors {
77− left: parent.left
78− right: parent.right
79− }
80−
81− sourceComponent: {
82− if (!menuFactory.menu || !menuFactory.menu.extra) {
83− return undefined;
84− }
85−
86− var widgetType = menuFactory.menu.extra.canonical_type;
87− if (widgetType) {
88− return _map[widgetType];
89− } else {
90− if (widgetType === "com.canonical.indicator.root") {
91− return undefined;
92− // Try discovery the item based on the basic properties
93− } else if (menu.hasSection) {
94− return sectionMenu;
95− } else {
96− return indicatorMenu;
97− }
98− }
99− }
100−
101− onLoaded: {
102− item.menuActivated = Qt.binding(function() { return isCurrentItem; });
103− item.actionGroup = Qt.binding(function() { return menuFactory.actionGroup; });
104− item.menu = Qt.binding(function() { return menuFactory.menu; });
105−
106− item.activateMenu.connect(function() { menuFactory.activated(); });
107− item.deactivateMenu.connect(function() { menuFactory.deactivated(); });
108− }
109− }
110−}
plugins/Unity/IndicatorsLegacy/qml/ProgressMenuItem.qmldeleted−65
@@ -1,65 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Michael Zanetti <michael.zanetti@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−
23−MenuItem {
24− id: progressMenu
25− property alias value : progressBar.value
26−
27− // TODO: Replace this with the official ProgressBar component as soon as
28− // it is available. For now, this rebuilds the Mockup as close as possible.
29− UbuntuShape {
30− id: progressBar
31− anchors {
32− right: parent.right
33− rightMargin: units.gu(2)
34− left: parent.left
35− leftMargin: units.gu(2)
36− }
37− height: units.gu(4)
38− anchors.verticalCenter: parent.verticalCenter
39− color: "transparent"
40−
41− property int minimumValue: 0
42− property int maximumValue: 100
43− property int value: 50
44−
45− UbuntuShape {
46− anchors.fill: parent
47− anchors.rightMargin: parent.width - (parent.width * parent.value / parent.maximumValue)
48− color: "#c94212"
49− }
50−
51− Label {
52− anchors.centerIn: parent
53− text: parent.value + " %"
54− fontSize: "medium"
55− color: "#e8e1d0"
56− }
57− }
58−
59− MenuActionBinding {
60− actionGroup: progressMenu.actionGroup
61− action: menu ? menu.action : ""
62− target: progressBar
63− property: "value"
64− }
65−}
plugins/Unity/IndicatorsLegacy/qml/RemoveBackground.qmldeleted−55
@@ -1,55 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−
20−Rectangle {
21− anchors.fill: parent
22− color: "#333130"
23− Label {
24− id: backgroundText
25−
26− anchors.fill: parent
27− verticalAlignment: Text.AlignVCenter
28− text: "Clear"
29− fontSize: "medium"
30− color: "#e8e1d0"
31− font.bold: true
32− }
33−
34− states: [
35− State {
36− name: "SwipingRight"
37− PropertyChanges {
38− target: backgroundText
39− anchors.rightMargin: units.gu(3)
40− anchors.leftMargin: 0
41− horizontalAlignment: Text.AlignRight
42−
43− }
44− },
45− State {
46− name: "SwipingLeft"
47− PropertyChanges {
48− target: backgroundText
49− anchors.rightMargin: 0
50− anchors.leftMargin: units.gu(3)
51− horizontalAlignment: Text.AlignLeft
52− }
53− }
54− ]
55−}
plugins/Unity/IndicatorsLegacy/qml/SectionMenuItem.qmldeleted−57
@@ -1,57 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−import Ubuntu.Components.ListItems 0.1 as ListItem
23−
24−BasicMenuItem {
25− property string label: menu && menu.label ? menu.label : ""
26− property bool busy: false
27− property int count: menu && menu.linkSection ? menu.linkSection.count : 0
28−
29− color: "#221e1b"
30− implicitHeight: label !== "" ? __header.height : 0
31− state: count === 0 ? "EMPTY" : ""
32−
33− ListItem.Header {
34− id: __header
35−
36− text: label
37− height: units.gu(4)
38− anchors {
39− left: parent.left
40− right: parent.right
41− top: parent.top
42− }
43− visible: text != ""
44−
45− ActivityIndicator {
46− id: indicator
47− running: busy
48− anchors {
49− margins: units.gu(0.5)
50− right: parent.right
51− }
52− height: parent.height - (anchors.margins * 2)
53− width: height
54− anchors.verticalCenter: parent.verticalCenter
55− }
56− }
57−}
plugins/Unity/IndicatorsLegacy/qml/SliderMenuItem.qmldeleted−64
@@ -1,64 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−
23−MenuItem {
24− id: _sliderMenu
25−
26− property alias minimumValue: slider.minimumValue
27− property alias maximumValue: slider.maximumValue
28− property alias value: slider.value
29−
30− control: Slider {
31− id: slider
32− enabled: menuAction.valid
33− width: _sliderMenu.text ? units.gu(20) : _sliderMenu.width - units.gu(4)
34− anchors.verticalCenter: parent.verticalCenter
35− live: false
36− // FIXME: The interval should be [0.0 - 1.0]. Unfortunately, when
37− // reaching the boundaries (0.0 or 1.0), the value is converted
38− // to an integer when automatically wrapped in a variant when
39− // passed to QStateAction::updateState(…). The server chokes on
40− // those values, complaining that they’re not of the right type…
41− minimumValue: menu.extra.canonical_min ? menu.extra.canonical_min * 1.000001 : 0.0000001
42− maximumValue: {
43− var maximum = menu.extra.canonical_max ? menu.extra.canonical_max * 1.000001 : 0.9999999
44− if (maximum <= minimumValue) {
45− return minimumValue + 1;
46− }
47− return maximum;
48− }
49−
50− // FIXME - to be deprecated in Ubuntu.Components.
51− // Use this to disable the label, since there is not way to do it on the component.
52− function formatValue(v) {
53− return "";
54− }
55− }
56−
57− MenuActionBinding {
58− id: menuAction
59− actionGroup: _sliderMenu.actionGroup
60− action: menu ? menu.action : ""
61− target: slider
62− property: "value"
63− }
64−}
plugins/Unity/IndicatorsLegacy/qml/SwitchMenuItem.qmldeleted−43
@@ -1,43 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−
23−MenuItem {
24− id: switchMenu
25−
26− property alias checked: switcher.checked
27−
28− control: Switch {
29− id: switcher
30− enabled: menuAction.valid
31−
32− anchors.verticalCenter: parent.verticalCenter
33− anchors.right: parent.right
34− }
35−
36− MenuActionBinding {
37− id: menuAction
38− actionGroup: switchMenu.actionGroup
39− action: menu ? menu.action : ""
40− target: switcher
41− property: "checked"
42− }
43−}
plugins/Unity/IndicatorsLegacy/qml/qmldirdeleted−21
@@ -1,21 +0,0 @@
1−module Unity.IndicatorsLegacy
2−plugin IndicatorsLegacyQml
3−typeinfo plugin.qmltypes
4−
5−BasicMenuItem 0.1 BasicMenuItem.qml
6−ButtonMenuItem 0.1 ButtonMenuItem.qml
7−DivMenuItem 0.1 DivMenuItem.qml
8−HLine 0.1 HLine.qml
9−IndicatorBase 0.1 IndicatorBase.qml
10−IndicatorPage 0.1 IndicatorPage.qml
11−IndicatorWidget 0.1 IndicatorWidget.qml
12−MenuItem 0.1 MenuItem.qml
13−MenuAction 0.1 MenuAction.qml
14−MenuActionBinding 0.1 MenuActionBinding.qml
15−MenuItemFactory 0.1 MenuItemFactory.qml
16−ProgressMenuItem 0.1 ProgressMenuItem.qml
17−SectionMenuItem 0.1 SectionMenuItem.qml
18−SliderMenuItem 0.1 SliderMenuItem.qml
19−SwitchMenuItem 0.1 SwitchMenuItem.qml
20−
21−internal RemoveBackground RemoveBackground.qml
plugins/Unity/IndicatorsLegacy/resources/indicators.qrcdeleted−7
@@ -1,7 +0,0 @@
1−<RCC>
2− <qresource prefix="/indicators">
3− <file>artwork/messaging/default_contact.png</file>
4− <file>artwork/messaging/default_app.svg</file>
5− <file>artwork/messaging/message_sms01_54px.png</file>
6− </qresource>
7−</RCC>
plugins/Unity/Launcher/backend/launcherbackend.cpp+4−37
@@ -30,21 +30,18 @@
3030class LauncherBackendItem
3131{
3232public:
33− LauncherBackendItem(): pinned(false) {}
34−
3533 QString desktopFile;
3634 QString displayName;
3735 QString icon;
38− bool pinned;
3936};
4037
41−LauncherBackend::LauncherBackend(bool useStorage, QObject *parent):
38+LauncherBackend::LauncherBackend(QObject *parent):
4239 QObject(parent),
4340 m_accounts(nullptr)
4441{
45− if (useStorage) {
46− m_accounts = new AccountsServiceDBusAdaptor(this);
47− }
42+#ifndef LAUNCHER_TESTING
43+ m_accounts = new AccountsServiceDBusAdaptor(this);
44+#endif
4845 m_user = qgetenv("USER");
4946 syncFromAccounts();
5047}
@@ -135,32 +132,6 @@ QString LauncherBackend::icon(const QString &appId) const
135132 return iconName;
136133}
137134
138−bool LauncherBackend::isPinned(const QString &appId) const
139−{
140− LauncherBackendItem *item = m_itemCache.value(appId);
141− if (item) {
142− return item->pinned;
143− }
144− return false;
145−}
146−
147−void LauncherBackend::setPinned(const QString &appId, bool pinned)
148−{
149− if (!m_storedApps.contains(appId)) {
150− return;
151− }
152−
153− LauncherBackendItem *item = m_itemCache.value(appId);
154− if (!item) {
155− item = new LauncherBackendItem();
156− m_itemCache.insert(appId, item);
157− }
158− if (item->pinned != pinned) {
159− item->pinned = pinned;
160− syncToAccounts();
161− }
162−}
163−
164135QList<QuickListEntry> LauncherBackend::quickList(const QString &appId) const
165136{
166137 // TODO: Get static (from .desktop file) and dynamic (from the app itself)
@@ -233,7 +204,6 @@ void LauncherBackend::syncFromAccounts()
233204 if (!m_itemCache.contains(appId)) {
234205 m_itemCache.insert(appId, parseDesktopFile(df));
235206 }
236− m_itemCache.value(appId)->pinned = true;
237207 }
238208 }
239209 }
@@ -305,7 +275,6 @@ LauncherBackendItem* LauncherBackend::parseDesktopFile(const QString &desktopFil
305275 } else {
306276 item->icon = "image://theme/" + iconString;
307277 }
308− item->pinned = false;
309278 return item;
310279}
311280
@@ -326,7 +295,6 @@ void LauncherBackend::loadFromVariant(const QVariantMap &details)
326295 item->desktopFile = details.value("desktopFile").toString();
327296 item->displayName = details.value("name").toString();
328297 item->icon = details.value("icon").toString();
329− item->pinned = details.value("is-pinned").toBool();
330298
331299 m_itemCache.insert(appId, item);
332300 m_storedApps.append(appId);
@@ -340,7 +308,6 @@ QVariantMap LauncherBackend::itemToVariant(const QString &appId) const
340308 details.insert("name", item->displayName);
341309 details.insert("icon", item->icon);
342310 details.insert("desktopFile", item->desktopFile);
343− details.insert("is-pinned", item->pinned);
344311 return details;
345312}
346313
plugins/Unity/Launcher/backend/launcherbackend.h+1−16
@@ -39,7 +39,7 @@ class LauncherBackend : public QObject
3939
4040
4141public:
42− LauncherBackend(bool useStorage = true, QObject *parent = 0);
42+ LauncherBackend(QObject *parent = 0);
4343 virtual ~LauncherBackend();
4444
4545 /**
@@ -88,21 +88,6 @@ public:
8888 */
8989 QString icon(const QString &appId) const;
9090
91− /**
92− * @brief Is the app manually pinned?
93− * @returns true if pinned, otherwise false.
94− */
95− bool isPinned(const QString &appId) const;
96−
97− /**
98− * @brief Change the pinned state of an application.
99− * @param appId The application where the pinned flag should be set.
100− * @param pinned true if pinned, otherwise false.
101− */
102− void setPinned(const QString &appId, bool pinned);
103−
104− //TODO: Fill in getters for all the other things needed from the .desktop file.
105−
10691 /**
10792 * @brief Get the QuickList for an application.
10893 * @param appId The ID of the application.
plugins/Unity/Launcher/launchermodel.cpp+4−8
@@ -27,7 +27,7 @@ using namespace unity::shell::application;
2727
2828LauncherModel::LauncherModel(QObject *parent):
2929 LauncherModelInterface(parent),
30− m_backend(new LauncherBackend(true, this)),
30+ m_backend(new LauncherBackend(this)),
3131 m_appManager(0)
3232{
3333 connect(m_backend, SIGNAL(countChanged(QString,int)), SLOT(countChanged(QString,int)));
@@ -38,11 +38,7 @@ LauncherModel::LauncherModel(QObject *parent):
3838 m_backend->displayName(entry),
3939 m_backend->icon(entry),
4040 this);
41− if (m_backend->isPinned(entry)) {
42− item->setPinned(true);
43− } else {
44− item->setRecent(true);
45− }
41+ item->setPinned(true);
4642 m_list.append(item);
4743 }
4844}
@@ -129,11 +125,12 @@ void LauncherModel::pin(const QString &appId, int index)
129125 if (currentIndex >= 0) {
130126 if (index == -1 || index == currentIndex) {
131127 m_list.at(currentIndex)->setPinned(true);
132− m_backend->setPinned(appId, true);
133128 QModelIndex modelIndex = this->index(currentIndex);
134129 Q_EMIT dataChanged(modelIndex, modelIndex);
135130 } else {
136131 move(currentIndex, index);
132+ // move() will store the list to the backend itself, so just exit at this point.
133+ return;
137134 }
138135 } else {
139136 if (index == -1) {
@@ -144,7 +141,6 @@ void LauncherModel::pin(const QString &appId, int index)
144141 m_backend->displayName(appId),
145142 m_backend->icon(appId));
146143 item->setPinned(true);
147− m_backend->setPinned(appId, true);
148144 m_list.insert(index, item);
149145 endInsertRows();
150146 }
plugins/Unity/Launcher/quicklistmodel.cpp+1−1
@@ -32,7 +32,7 @@ QuickListModel::~QuickListModel()
3232
3333void QuickListModel::appendAction(const QuickListEntry &entry)
3434{
35− beginInsertRows(QModelIndex(), m_list.count() - 1, m_list.count() -1);
35+ beginInsertRows(QModelIndex(), m_list.count(), m_list.count());
3636 m_list.append(entry);
3737 endInsertRows();
3838}
plugins/Unity/bottombarvisibilitycommunicatorshell.cpp+15−1
@@ -17,7 +17,8 @@
1717#include "bottombarvisibilitycommunicatorshell.h"
1818
1919BottomBarVisibilityCommunicatorShell::BottomBarVisibilityCommunicatorShell()
20− : m_forceHidden(false)
20+ : m_forceHidden(false),
21+ m_position(0)
2122{
2223}
2324
@@ -26,6 +27,11 @@ bool BottomBarVisibilityCommunicatorShell::forceHidden() const
2627 return m_forceHidden;
2728}
2829
30+double BottomBarVisibilityCommunicatorShell::position() const
31+{
32+ return m_position;
33+}
34+
2935void BottomBarVisibilityCommunicatorShell::setForceHidden(bool forceHidden)
3036{
3137 if (forceHidden != m_forceHidden) {
@@ -33,3 +39,11 @@ void BottomBarVisibilityCommunicatorShell::setForceHidden(bool forceHidden)
3339 Q_EMIT forceHiddenChanged(forceHidden);
3440 }
3541}
42+
43+void BottomBarVisibilityCommunicatorShell::setPosition(double position)
44+{
45+ if (position != m_position) {
46+ m_position = position;
47+ Q_EMIT positionChanged(position);
48+ }
49+}
plugins/Unity/bottombarvisibilitycommunicatorshell.h+6
@@ -30,6 +30,7 @@ class BottomBarVisibilityCommunicatorShell : public QObject
3030{
3131 Q_OBJECT
3232 Q_PROPERTY(bool forceHidden READ forceHidden WRITE setForceHidden NOTIFY forceHiddenChanged)
33+ Q_PROPERTY(double position READ position WRITE setPosition NOTIFY positionChanged)
3334
3435 Q_CLASSINFO("D-Bus Interface", "com.canonical.Shell.BottomBarVisibilityCommunicator")
3536public:
@@ -41,13 +42,18 @@ public:
4142 bool forceHidden() const;
4243 void setForceHidden(bool forceHidden);
4344
45+ double position() const;
46+ void setPosition(double position);
47+
4448Q_SIGNALS:
4549 void forceHiddenChanged(bool forceHidden);
50+ void positionChanged(double position);
4651
4752private:
4853 BottomBarVisibilityCommunicatorShell();
4954
5055 bool m_forceHidden;
56+ double m_position;
5157};
5258
5359#endif
plugins/Unity/categories.cpp+77−16
@@ -40,6 +40,7 @@ Categories::Categories(QObject* parent)
4040 m_roles[Categories::RoleIcon] = "icon";
4141 m_roles[Categories::RoleRenderer] = "renderer";
4242 m_roles[Categories::RoleContentType] = "contentType";
43+ m_roles[Categories::RoleRendererHint] = "rendererHint";
4344 m_roles[Categories::RoleProgressSource] = "progressSource";
4445 m_roles[Categories::RoleHints] = "hints";
4546 m_roles[Categories::RoleResults] = "results";
@@ -89,9 +90,37 @@ void Categories::onCategoriesModelChanged(unity::glib::Object<DeeModel> model)
8990 delete model;
9091 }
9192 m_results.clear();
93+ m_categoryOrder.clear();
94+
9295 setModel(model);
9396}
9497
98+void Categories::onCategoryOrderChanged(const std::vector<unsigned int>& cat_order)
99+{
100+ for (unsigned int pos = 0; pos<cat_order.size(); pos++)
101+ {
102+ unsigned int cat = cat_order[pos];
103+ const int old_pos = m_categoryOrder.indexOf(cat);
104+
105+ if (old_pos < 0) {
106+ qWarning() << "No such category index:" << cat;
107+ continue;
108+ }
109+
110+ if (static_cast<int>(pos) != old_pos) {
111+ int target_pos = pos;
112+ if (target_pos > old_pos)
113+ target_pos++;
114+ const bool status = beginMoveRows(QModelIndex(), old_pos, old_pos, QModelIndex(), target_pos);
115+ if (status)
116+ m_categoryOrder.move(old_pos, pos);
117+ else
118+ qWarning() << "beginMoveRows failed:" << old_pos << target_pos;
119+ endMoveRows();
120+ }
121+ }
122+}
123+
95124void
96125Categories::setUnityScope(const unity::dash::Scope::Ptr& scope)
97126{
@@ -100,9 +129,11 @@ Categories::setUnityScope(const unity::dash::Scope::Ptr& scope)
100129 // no need to call this, we'll get notified
101130 //setModel(m_unityScope->categories()->model());
102131
103− m_categoriesChangedConnection.disconnect();
104− m_categoriesChangedConnection =
105− m_unityScope->categories()->model.changed.connect(sigc::mem_fun(this, &Categories::onCategoriesModelChanged));
132+ m_signals.disconnectAll();
133+ m_signals << m_unityScope->categories()->model.changed.connect(sigc::mem_fun(this, &Categories::onCategoriesModelChanged));
134+
135+ // FIXME: Don't handle category order changes for now as it causes UI issues (https://bugs.launchpad.net/unity8/+bug/1239584).
136+ //m_signals << m_unityScope->category_order.changed.connect(sigc::mem_fun(this, &Categories::onCategoryOrderChanged));
106137}
107138
108139void
@@ -110,7 +141,9 @@ Categories::onCountChanged()
110141{
111142 CategoryResults* results = qobject_cast<CategoryResults*>(sender());
112143 if (results) {
113− m_updatedCategories << results->categoryIndex();
144+ if (!m_updatedCategories.contains(results->categoryIndex())) {
145+ m_updatedCategories << results->categoryIndex();
146+ }
114147 m_timer.start();
115148 }
116149}
@@ -141,7 +174,8 @@ Categories::onEmitCountChanged()
141174 roles.append(Categories::RoleCount);
142175 Q_FOREACH(int categoryIndex, m_updatedCategories) {
143176 if (!m_results.contains(categoryIndex)) continue;
144− QModelIndex changedIndex = index(categoryIndex);
177+ const int realIndex = m_categoryOrder.indexOf(categoryIndex);
178+ const QModelIndex changedIndex = index(realIndex);
145179 Q_EMIT dataChanged(changedIndex, changedIndex, roles);
146180 }
147181 m_updatedCategories.clear();
@@ -195,43 +229,70 @@ Categories::data(const QModelIndex& index, int role) const
195229 return QVariant();
196230 }
197231
232+ if (m_categoryOrder.size() != rowCount())
233+ {
234+ // populate category order vector with 0..n
235+ m_categoryOrder.clear();
236+ const unsigned int lim = rowCount();
237+ for (unsigned int i = 0; i<lim; i++) {
238+ m_categoryOrder.append(i);
239+ }
240+ }
241+
242+ int realRow = index.row();
243+ if (index.row() < m_categoryOrder.size()) {
244+ realRow = m_categoryOrder[index.row()];
245+ } else {
246+ qWarning() << "Invalid index" << index.row();
247+ return QVariant();
248+ }
249+
250+ const QModelIndex realIndex = createIndex(realRow, index.column());
251+
198252 switch (role) {
199253 case RoleCategoryId:
200− return DeeListModel::data(index, CategoryColumn::ID);
254+ return DeeListModel::data(realIndex, CategoryColumn::ID);
201255 case RoleName:
202− return DeeListModel::data(index, CategoryColumn::DISPLAY_NAME);
256+ return DeeListModel::data(realIndex, CategoryColumn::DISPLAY_NAME);
203257 case RoleIcon:
204− return DeeListModel::data(index, CategoryColumn::ICON_HINT);
258+ return DeeListModel::data(realIndex, CategoryColumn::ICON_HINT);
205259 case RoleRenderer:
206− return DeeListModel::data(index, CategoryColumn::RENDERER_NAME);
260+ return DeeListModel::data(realIndex, CategoryColumn::RENDERER_NAME);
207261 case RoleContentType:
208262 {
209− auto hints = DeeListModel::data(index, CategoryColumn::HINTS).toHash();
263+ auto hints = DeeListModel::data(realIndex, CategoryColumn::HINTS).toHash();
210264 return hints.contains("content-type") ? hints["content-type"] : QVariant(QString("default"));
211265 }
266+ case RoleRendererHint:
267+ {
268+ auto hints = DeeListModel::data(realIndex, CategoryColumn::HINTS).toHash();
269+ return hints.contains("renderer-hint") ? hints["renderer-hint"] : QVariant(QString());
270+ }
212271 case RoleProgressSource:
213272 {
214− auto hints = DeeListModel::data(index, CategoryColumn::HINTS).toHash();
273+ auto hints = DeeListModel::data(realIndex, CategoryColumn::HINTS).toHash();
215274 return hints.contains("progress-source") ? hints["progress-source"] : QVariant();
216275 }
217276 case RoleHints:
218− return DeeListModel::data(index, CategoryColumn::HINTS);
277+ return DeeListModel::data(realIndex, CategoryColumn::HINTS);
219278 case RoleResults:
220279 if (m_overriddenCategories.size() > 0)
221280 {
222− auto id = DeeListModel::data(index, CategoryColumn::ID).toString();
281+ auto id = DeeListModel::data(realIndex, CategoryColumn::ID).toString();
223282 if (m_overriddenCategories.find(id) != m_overriddenCategories.end())
224283 return QVariant::fromValue(m_overriddenCategories[id]);
225284 }
226− return QVariant::fromValue(getResults(index.row()));
285+ return QVariant::fromValue(getResults(realRow));
227286 case RoleCount:
228287 if (m_overriddenCategories.size() > 0)
229288 {
230− auto id = DeeListModel::data(index, CategoryColumn::ID).toString();
289+ auto id = DeeListModel::data(realIndex, CategoryColumn::ID).toString();
231290 if (m_overriddenCategories.find(id) != m_overriddenCategories.end())
291+ {
232292 return QVariant::fromValue(m_overriddenCategories[id]->rowCount());
293+ }
233294 }
234− return QVariant::fromValue(getResults(index.row())->rowCount());
295+ return QVariant::fromValue(getResults(realRow)->rowCount());
235296 default:
236297 return QVariant();
237298 }
plugins/Unity/categories.h+11−1
@@ -32,6 +32,9 @@
3232#include <QSet>
3333#include <QTimer>
3434
35+// local
36+#include "signalslist.h"
37+
3538class Categories : public DeeListModel
3639{
3740 Q_OBJECT
@@ -47,6 +50,7 @@ public:
4750 RoleIcon,
4851 RoleRenderer,
4952 RoleContentType,
53+ RoleRendererHint,
5054 RoleProgressSource,
5155 RoleHints,
5256 RoleResults,
@@ -70,6 +74,7 @@ private Q_SLOTS:
7074
7175private:
7276 void onCategoriesModelChanged(unity::glib::Object<DeeModel> model);
77+ void onCategoryOrderChanged(const std::vector<unsigned int>& cat_order);
7378
7479 DeeListModel* getResults(int index) const;
7580
@@ -79,7 +84,12 @@ private:
7984 QHash<int, QByteArray> m_roles;
8085 QMap<QString, QAbstractItemModel*> m_overriddenCategories;
8186 mutable QMap<int, DeeListModel*> m_results;
82− sigc::connection m_categoriesChangedConnection;
87+ SignalsList m_signals;
88+
89+ /* Category order array contains indices of actual categories in the underlying DeeListModel.
90+ It's used internally to reflect category order reported by scope.
91+ */
92+ mutable QList<unsigned int> m_categoryOrder;
8393};
8494
8595#endif // CATEGORIES_H
plugins/Unity/categoryresults.cpp+22
@@ -46,6 +46,7 @@ CategoryResults::CategoryResults(QObject* parent)
4646 m_roles[CategoryResults::RoleComment] = "comment";
4747 m_roles[CategoryResults::RoleDndUri] = "dndUri";
4848 m_roles[CategoryResults::RoleMetadata] = "metadata";
49+ m_roles[CategoryResults::RoleRendererHints] = "rendererHints";
4950}
5051
5152int CategoryResults::categoryIndex() const
@@ -79,6 +80,14 @@ CategoryResults::data(const QModelIndex& index, int role) const
7980 return DeeListModel::data(index, ResultsColumn::URI);
8081 case RoleIconHint: {
8182 QString giconString(DeeListModel::data(index, ResultsColumn::ICON_HINT).toString());
83+ if (giconString.isEmpty()) {
84+ QString mimetype(DeeListModel::data(index, ResultsColumn::MIMETYPE).toString());
85+ QString uri(DeeListModel::data(index, ResultsColumn::URI).toString());
86+ QString thumbnailerUri(uriToThumbnailerProviderString(uri, mimetype, DeeListModel::data(index, ResultsColumn::METADATA).toHash()));
87+ if (!thumbnailerUri.isNull()) {
88+ return QVariant::fromValue(thumbnailerUri);
89+ }
90+ }
8291 return QVariant::fromValue(gIconToDeclarativeImageProviderString(giconString));
8392 }
8493 case RoleCategory:
@@ -93,6 +102,19 @@ CategoryResults::data(const QModelIndex& index, int role) const
93102 return DeeListModel::data(index, ResultsColumn::DND_URI);
94103 case RoleMetadata:
95104 return DeeListModel::data(index, ResultsColumn::METADATA);
105+ case RoleRendererHints:
106+ {
107+ QVariantHash hash(DeeListModel::data(index, ResultsColumn::METADATA).toHash());
108+ if (hash.contains("content")) {
109+ QVariantMap hints;
110+ QVariantHash innerHash(hash["content"].toHash());
111+ if (innerHash.contains("scope_disabled")) {
112+ hints["scope_disabled"] = innerHash["scope_disabled"];
113+ }
114+ return hints.empty() ? QVariant() : QVariant::fromValue(hints);
115+ }
116+ return QVariant();
117+ }
96118 default:
97119 return QVariant();
98120 }
plugins/Unity/categoryresults.h+2−1
@@ -43,7 +43,8 @@ public:
4343 RoleTitle,
4444 RoleComment,
4545 RoleDndUri,
46− RoleMetadata
46+ RoleMetadata,
47+ RoleRendererHints
4748 };
4849
4950 QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
plugins/Unity/iconutils.cpp+33
@@ -24,6 +24,8 @@
2424#include "iconutils.h"
2525
2626#define BASE_THEME_ICON_URI "image://theme/"
27+#define BASE_THUMBNAILER_URI "image://thumbnailer/"
28+#define BASE_ALBUMART_URI "image://albumart/"
2729
2830QString gIconToDeclarativeImageProviderString(QString const &giconString)
2931{
@@ -89,3 +91,34 @@ QString gIconToDeclarativeImageProviderString(QString const &giconString)
8991
9092 return result;
9193}
94+
95+QString uriToThumbnailerProviderString(QString const &uri, QString const &mimetype, QVariantHash const &metadata)
96+{
97+ if (uri.startsWith(QLatin1String("file:///"))) {
98+ bool isAudio = mimetype.startsWith(QLatin1String("audio/"));
99+ QString thumbnailerUri;
100+ if (isAudio) {
101+ thumbnailerUri = BASE_ALBUMART_URI;
102+ if (metadata.contains("content")) {
103+ QVariantHash contentHash = metadata["content"].toHash();
104+ if (contentHash.contains("content")) { // nested content in Home?
105+ contentHash = contentHash["content"].toHash();
106+ }
107+ if (contentHash.contains("album") &&
108+ contentHash.contains("artist")) {
109+ const QString album = contentHash["album"].toString();
110+ const QString artist = contentHash["artist"].toString();
111+ thumbnailerUri.append(QUrl::toPercentEncoding(artist));
112+ thumbnailerUri.append("/");
113+ thumbnailerUri.append(QUrl::toPercentEncoding(album));
114+ }
115+ }
116+ } else {
117+ thumbnailerUri = BASE_THUMBNAILER_URI;
118+ thumbnailerUri.append(uri.midRef(7));
119+ }
120+ return thumbnailerUri;
121+ }
122+
123+ return QString::null;
124+}
plugins/Unity/iconutils.h+2
@@ -21,7 +21,9 @@
2121#define ICONUTILS_H
2222
2323#include <QString>
24+#include <QVariant>
2425
2526QString gIconToDeclarativeImageProviderString(QString const &giconString);
27+QString uriToThumbnailerProviderString(QString const &uri, QString const &mimetype, QVariantHash const &metadata);
2628
2729#endif
plugins/Unity/plugin.cpp+2
@@ -35,6 +35,7 @@
3535#include "categoryresults.h"
3636#include "bottombarvisibilitycommunicatorshell.h"
3737#include "genericoptionsmodel.h"
38+#include "result.h"
3839
3940// libqtdee
4041#include "deelistmodel.h"
@@ -50,6 +51,7 @@ void UnityPlugin::registerTypes(const char *uri)
5051 qmlRegisterUncreatableType<PreviewInfoHint>(uri, 0, 1, "PreviewInfoHint", "Can't create PreviewInfoHint object in QML.");
5152 qmlRegisterUncreatableType<SocialPreviewComment>(uri, 0, 1, "SocialPreviewComment", "Can't create SocialPreviewComment object in QML.");
5253 qmlRegisterUncreatableType<GenericOptionsModel>(uri, 0, 1, "GenericOptionsModel", "Can't create options model in QML.");
54+ qmlRegisterUncreatableType<Result>(uri, 0, 1, "Result", "Can't create result object in QML.");
5355 qmlRegisterType<Scope>(uri, 0, 1, "Scope");
5456 qmlRegisterType<Scopes>(uri, 0, 1, "Scopes");
5557 qmlRegisterType<Categories>(uri, 0, 1, "Categories");
plugins/Unity/preview.cpp+24−13
@@ -39,9 +39,12 @@
3939#include <UnityCore/MusicPreview.h>
4040#include <UnityCore/SocialPreview.h>
4141
42+#include <UnityCore/GLibWrapper.h>
43+
4244Preview::Preview(QObject *parent):
4345 QObject(parent),
44− m_unityPreview(nullptr)
46+ m_unityPreview(nullptr),
47+ m_result(new Result(this))
4548{
4649}
4750
@@ -103,24 +106,25 @@ QVariantMap Preview::infoHintsHash() const
103106QString Preview::image() const
104107{
105108 if (m_unityPreview) {
106− auto giconString = g_icon_to_string(m_unityPreview->image());
107− QString result(gIconToDeclarativeImageProviderString(QString::fromUtf8(giconString)));
108− g_free(giconString);
109− return result;
109+ if (m_unityPreview->image() != nullptr) {
110+ auto giconString = g_icon_to_string(m_unityPreview->image());
111+ QString result(gIconToDeclarativeImageProviderString(QString::fromUtf8(giconString)));
112+ g_free(giconString);
113+ return result;
114+ } else {
115+ QString sourceMedia(QString::fromStdString(m_unityPreview->image_source_uri()));
116+ QString thumbnailUri(uriToThumbnailerProviderString(sourceMedia, m_result->mimeType(), m_result->metadata().toHash()));
117+ if (!thumbnailUri.isNull()) return thumbnailUri;
118+ }
110119 } else {
111120 qWarning() << "Preview not set";
112121 }
113122 return QString::null;
114123}
115124
116−QString Preview::imageSourceUri() const
125+QVariant Preview::result() const
117126{
118− if (m_unityPreview) {
119− return QString::fromStdString(m_unityPreview->image_source_uri());
120− } else {
121− qWarning() << "Preview not set";
122− }
123− return QString::null;
127+ return QVariant::fromValue(m_result);
124128}
125129
126130Preview* Preview::newFromUnityPreview(unity::dash::Preview::Ptr unityPreview)
@@ -151,6 +155,7 @@ Preview* Preview::newFromUnityPreview(unity::dash::Preview::Ptr unityPreview)
151155void Preview::setUnityPreviewBase(unity::dash::Preview::Ptr unityPreview)
152156{
153157 m_unityPreview = unityPreview;
158+ m_result->setPreview(unityPreview);
154159
155160 qDeleteAll(m_infoHints);
156161 m_infoHints.clear();
@@ -181,8 +186,14 @@ void Preview::execute(const QString& actionId, const QHash<QString, QVariant>& h
181186{
182187 if (m_unityPreview) {
183188 auto unityHints = convertToHintsMap(hints);
184− m_unityPreview->PerformAction(actionId.toStdString(), unityHints);
189+ m_actionCancellable.Renew();
190+ m_unityPreview->PerformAction(actionId.toStdString(), unityHints, nullptr, m_actionCancellable);
185191 } else {
186192 qWarning() << "Preview not set";
187193 }
188194}
195+
196+void Preview::cancelAction()
197+{
198+ m_actionCancellable.Cancel();
199+}
plugins/Unity/preview.h+7−2
@@ -31,7 +31,9 @@
3131#include <UnityCore/Preview.h>
3232
3333// local
34+#include "result.h"
3435#include "previewaction.h"
36+#include <UnityCore/GLibWrapper.h>
3537
3638class Q_DECL_EXPORT Preview : public QObject
3739{
@@ -45,7 +47,7 @@ class Q_DECL_EXPORT Preview : public QObject
4547 Q_PROPERTY(QVariant infoHints READ infoHints NOTIFY previewChanged)
4648 Q_PROPERTY(QVariantMap infoMap READ infoHintsHash NOTIFY previewChanged)
4749 Q_PROPERTY(QString image READ image NOTIFY previewChanged)
48− Q_PROPERTY(QString imageSourceUri READ imageSourceUri NOTIFY previewChanged)
50+ Q_PROPERTY(QVariant result READ result NOTIFY previewChanged)
4951
5052public:
5153 explicit Preview(QObject *parent = 0);
@@ -59,9 +61,10 @@ public:
5961 QVariant infoHints();
6062 QVariantMap infoHintsHash() const;
6163 QString image() const;
62− QString imageSourceUri() const;
64+ QVariant result() const;
6365
6466 Q_INVOKABLE void execute(const QString& actionId, const QHash<QString, QVariant>& hints);
67+ Q_INVOKABLE void cancelAction();
6568
6669Q_SIGNALS:
6770 void previewChanged();
@@ -70,6 +73,7 @@ protected:
7073 virtual void setUnityPreview(unity::dash::Preview::Ptr unityPreview);
7174
7275 unity::dash::Preview::Ptr m_unityPreview;
76+ Result* m_result;
7377
7478private:
7579 void setUnityPreviewBase(unity::dash::Preview::Ptr unityPreview);
@@ -77,6 +81,7 @@ private:
7781 QList<QObject *> m_actions;
7882 QList<QObject *> m_infoHints;
7983 QVariantMap m_infoHintsHash;
84+ unity::glib::Cancellable m_actionCancellable;
8085};
8186
8287Q_DECLARE_METATYPE(Preview *)
plugins/Unity/result.cppnew file+82
@@ -0,0 +1,82 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * Authors:
5+ * Pawel Stolowski <pawel.stolowski@canonical.com>
6+ *
7+ * This program is free software; you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation; version 3.
10+ *
11+ * This program is distributed in the hope that it will be useful,
12+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+ * GNU General Public License for more details.
15+ *
16+ * You should have received a copy of the GNU General Public License
17+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
18+ */
19+
20+#include "result.h"
21+#include "variantutils.h"
22+
23+Result::Result(QObject *parent) :
24+ QObject(parent)
25+{
26+}
27+
28+Result::Result(unity::dash::Preview::Ptr preview, QObject *parent) :
29+ QObject(parent),
30+ m_preview(preview)
31+{
32+}
33+
34+void Result::setPreview(unity::dash::Preview::Ptr preview)
35+{
36+ m_preview = preview;
37+}
38+
39+QString Result::uri() const
40+{
41+ return m_preview != nullptr ? QString::fromStdString(m_preview->preview_result.uri) : QString::null;
42+}
43+
44+QString Result::iconHint() const
45+{
46+ return m_preview != nullptr ? QString::fromStdString(m_preview->preview_result.icon_hint) : QString::null;
47+}
48+
49+unsigned Result::categoryIndex() const
50+{
51+ return m_preview != nullptr ? m_preview->preview_result.category_index : 0;
52+}
53+
54+unsigned Result::resultType() const
55+{
56+ return m_preview != nullptr ? m_preview->preview_result.result_type : 0;
57+}
58+
59+QString Result::mimeType() const
60+{
61+ return m_preview != nullptr ? QString::fromStdString(m_preview->preview_result.mimetype) : QString::null;
62+}
63+
64+QString Result::title() const
65+{
66+ return m_preview != nullptr ? QString::fromStdString(m_preview->preview_result.name) : QString::null;
67+}
68+
69+QString Result::comment() const
70+{
71+ return m_preview != nullptr ? QString::fromStdString(m_preview->preview_result.comment) : QString::null;
72+}
73+
74+QString Result::dndUri() const
75+{
76+ return m_preview != nullptr ? QString::fromStdString(m_preview->preview_result.dnd_uri) : QString::null;
77+}
78+
79+QVariant Result::metadata() const
80+{
81+ return m_preview != nullptr ? convertToQVariantHash(m_preview->preview_result.hints) : QVariant();
82+}
plugins/Unity/result.hnew file+69
@@ -0,0 +1,69 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * Authors:
5+ * Pawel Stolowski <pawel.stolowski@canonical.com>
6+ *
7+ * This program is free software; you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation; version 3.
10+ *
11+ * This program is distributed in the hope that it will be useful,
12+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+ * GNU General Public License for more details.
15+ *
16+ * You should have received a copy of the GNU General Public License
17+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
18+ */
19+
20+#ifndef RESULT_H
21+#define RESULT_H
22+
23+// Qt
24+#include <QObject>
25+#include <QVariant>
26+
27+// libunity-core
28+#include <UnityCore/Preview.h>
29+
30+class Q_DECL_EXPORT Result : public QObject
31+{
32+ Q_OBJECT
33+
34+ Q_PROPERTY(QString uri READ uri CONSTANT)
35+ Q_PROPERTY(QString iconHint READ iconHint CONSTANT)
36+ Q_PROPERTY(unsigned categoryIndex READ categoryIndex CONSTANT)
37+ Q_PROPERTY(unsigned resultType READ resultType CONSTANT)
38+ Q_PROPERTY(QString mimeType READ mimeType CONSTANT)
39+ Q_PROPERTY(QString title READ title CONSTANT)
40+ Q_PROPERTY(QString comment READ comment CONSTANT)
41+ Q_PROPERTY(QString dndUri READ dndUri CONSTANT)
42+ Q_PROPERTY(QVariant metadata READ metadata CONSTANT)
43+
44+public:
45+ Result(QObject *parent = nullptr);
46+ Result(unity::dash::Preview::Ptr preview, QObject *parent = nullptr);
47+
48+ void setPreview(unity::dash::Preview::Ptr preview);
49+
50+ QString uri() const;
51+ QString iconHint() const;
52+ unsigned categoryIndex() const;
53+ unsigned resultType() const;
54+ QString mimeType() const;
55+ QString title() const;
56+ QString comment() const;
57+ QString dndUri() const;
58+ QVariant metadata() const;
59+
60+private:
61+ /* Keep reference to the original preview to access result attributes via it, rather than keeping copies of them;
62+ this will save us a bit on copying, especially as UI is mostly interested in just uri.
63+ */
64+ unity::dash::Preview::Ptr m_preview;
65+};
66+
67+Q_DECLARE_METATYPE(Result *)
68+
69+#endif
plugins/Unity/scope.cpp+76−6
@@ -33,14 +33,19 @@
3333#include <QQmlEngine>
3434
3535#include <UnityCore/Variant.h>
36+#include <UnityCore/GLibWrapper.h>
3637
3738#include <libintl.h>
3839#include <glib.h>
3940
4041Scope::Scope(QObject *parent) : QObject(parent)
4142 , m_formFactor("phone")
43+ , m_isActive(false)
44+ , m_searchInProgress(false)
4245{
4346 m_categories.reset(new Categories(this));
47+
48+ connect(this, &Scope::isActiveChanged, this, &Scope::scopeIsActiveChanged);
4449}
4550
4651QString Scope::id() const
@@ -68,6 +73,11 @@ QString Scope::searchHint() const
6873 return QString::fromStdString(m_unityScope->search_hint());
6974}
7075
76+bool Scope::searchInProgress() const
77+{
78+ return m_searchInProgress;
79+}
80+
7181bool Scope::visible() const
7282{
7383 return m_unityScope->visible();
@@ -103,6 +113,11 @@ QString Scope::formFactor() const
103113 return m_formFactor;
104114}
105115
116+bool Scope::isActive() const
117+{
118+ return m_isActive;
119+}
120+
106121Filters* Scope::filters() const
107122{
108123 return m_filters.get();
@@ -115,10 +130,17 @@ void Scope::setSearchQuery(const QString& search_query)
115130 string ("") and m_searchQuery is the null string,
116131 search_query != m_searchQuery is still true.
117132 */
133+ using namespace std::placeholders;
134+
118135 if (m_searchQuery.isNull() || search_query != m_searchQuery) {
119136 m_searchQuery = search_query;
120− m_unityScope->Search(search_query.toStdString(), sigc::mem_fun(this, &Scope::searchFinished));
137+ m_cancellable.Renew();
138+ m_unityScope->Search(search_query.toStdString(), std::bind(&Scope::onSearchFinished, this, _1, _2, _3), m_cancellable);
121139 Q_EMIT searchQueryChanged();
140+ if (!m_searchInProgress) {
141+ m_searchInProgress = true;
142+ Q_EMIT searchInProgressChanged();
143+ }
122144 }
123145}
124146
@@ -140,6 +162,13 @@ void Scope::setFormFactor(const QString& form_factor) {
140162 }
141163}
142164
165+void Scope::setActive(const bool active) {
166+ if (active != m_isActive) {
167+ m_isActive = active;
168+ Q_EMIT isActiveChanged(m_isActive);
169+ }
170+}
171+
143172unity::dash::LocalResult Scope::createLocalResult(const QVariant &uri, const QVariant &icon_hint,
144173 const QVariant &category, const QVariant &result_type,
145174 const QVariant &mimetype, const QVariant &title,
@@ -175,14 +204,21 @@ void Scope::preview(const QVariant &uri, const QVariant &icon_hint, const QVaria
175204 const QVariant &comment, const QVariant &dnd_uri, const QVariant &metadata)
176205{
177206 auto res = createLocalResult(uri, icon_hint, category, result_type, mimetype, title, comment, dnd_uri, metadata);
207+ m_previewCancellable.Renew();
208+
178209 // canned queries don't have previews, must be activated
179210 if (uri.toString().startsWith("x-unity-no-preview-scopes-query://")) {
180211 m_unityScope->Activate(res);
181212 } else {
182− m_unityScope->Preview(res);
213+ m_unityScope->Preview(res, nullptr, m_previewCancellable);
183214 }
184215}
185216
217+void Scope::cancelActivation()
218+{
219+ m_previewCancellable.Cancel();
220+}
221+
186222void Scope::onActivated(unity::dash::LocalResult const& result, unity::dash::ScopeHandledType type, unity::glib::HintsMap const& hints)
187223{
188224 // note: we will not get called on SHOW_PREVIEW, instead UnityCore will signal preview_ready.
@@ -287,8 +323,7 @@ void Scope::setUnityScope(const unity::dash::Scope::Ptr& scope)
287323 m_unityScope->visible.changed.connect(sigc::mem_fun(this, &Scope::visibleChanged));
288324 m_unityScope->shortcut.changed.connect(sigc::mem_fun(this, &Scope::shortcutChanged));
289325 m_unityScope->connected.changed.connect(sigc::mem_fun(this, &Scope::connectedChanged));
290− /* Signals forwarding */
291− connect(this, SIGNAL(searchFinished(const std::string &, unity::glib::HintsMap const &, unity::glib::Error const &)), SLOT(onSearchFinished(const std::string &, unity::glib::HintsMap const &)));
326+ m_unityScope->results_dirty.changed.connect(sigc::mem_fun(this, &Scope::resultsDirtyToggled));
292327
293328 /* FIXME: signal should be forwarded instead of calling the handler directly */
294329 m_unityScope->activated.connect(sigc::mem_fun(this, &Scope::onActivated));
@@ -309,18 +344,53 @@ unity::dash::Scope::Ptr Scope::unityScope() const
309344
310345void Scope::synchronizeStates()
311346{
347+ using namespace std::placeholders;
348+
312349 if (connected()) {
313350 /* Forward local states to m_unityScope */
314351 if (!m_searchQuery.isNull()) {
315− m_unityScope->Search(m_searchQuery.toStdString());
352+ m_cancellable.Renew();
353+ m_unityScope->Search(m_searchQuery.toStdString(), std::bind(&Scope::onSearchFinished, this, _1, _2, _3), m_cancellable);
354+ if (!m_searchInProgress) {
355+ m_searchInProgress = true;
356+ Q_EMIT searchInProgressChanged();
357+ }
316358 }
317359 }
318360}
319361
320−void Scope::onSearchFinished(const std::string& /* query */, unity::glib::HintsMap const &hints)
362+void Scope::scopeIsActiveChanged()
363+{
364+ if (!isActive() || !m_unityScope || !m_unityScope->results_dirty()) return;
365+
366+ // force new search
367+ synchronizeStates();
368+}
369+
370+void Scope::resultsDirtyToggled(bool results_dirty)
371+{
372+ if (!results_dirty || !isActive()) return;
373+
374+ // force new search
375+ synchronizeStates();
376+}
377+
378+void Scope::onSearchFinished(std::string const& /* query */, unity::glib::HintsMap const& hints, unity::glib::Error const& err)
321379{
322380 QString hint;
323381
382+ GError* error = const_cast<unity::glib::Error&>(err);
383+
384+ if (!err || !g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
385+ if (m_searchInProgress) {
386+ m_searchInProgress = false;
387+ Q_EMIT searchInProgressChanged();
388+ }
389+ } else {
390+ // no need to check the results hint, we're still searching
391+ return;
392+ }
393+
324394 if (!m_unityScope->results()->count()) {
325395 unity::glib::HintsMap::const_iterator it = hints.find("no-results-hint");
326396 if (it != hints.end()) {
plugins/Unity/scope.h+17−2
@@ -28,6 +28,7 @@
2828// libunity-core
2929#include <UnityCore/Scope.h>
3030#include <UnityCore/Results.h>
31+#include <UnityCore/GLibWrapper.h>
3132
3233#include "categories.h"
3334#include "filters.h"
@@ -43,6 +44,7 @@ class Scope : public QObject
4344 Q_PROPERTY(QString iconHint READ iconHint NOTIFY iconHintChanged)
4445 Q_PROPERTY(QString description READ description NOTIFY descriptionChanged)
4546 Q_PROPERTY(QString searchHint READ searchHint NOTIFY searchHintChanged)
47+ Q_PROPERTY(bool searchInProgress READ searchInProgress NOTIFY searchInProgressChanged)
4648 Q_PROPERTY(bool visible READ visible NOTIFY visibleChanged)
4749 Q_PROPERTY(QString shortcut READ shortcut NOTIFY shortcutChanged)
4850 Q_PROPERTY(bool connected READ connected NOTIFY connectedChanged)
@@ -52,6 +54,7 @@ class Scope : public QObject
5254 Q_PROPERTY(QString searchQuery READ searchQuery WRITE setSearchQuery NOTIFY searchQueryChanged)
5355 Q_PROPERTY(QString noResultsHint READ noResultsHint WRITE setNoResultsHint NOTIFY noResultsHintChanged)
5456 Q_PROPERTY(QString formFactor READ formFactor WRITE setFormFactor NOTIFY formFactorChanged)
57+ Q_PROPERTY(bool isActive READ isActive WRITE setActive NOTIFY isActiveChanged)
5558
5659public:
5760 explicit Scope(QObject *parent = 0);
@@ -65,16 +68,19 @@ public:
6568 bool visible() const;
6669 QString shortcut() const;
6770 bool connected() const;
71+ bool searchInProgress() const;
6872 Categories* categories() const;
6973 Filters* filters() const;
7074 QString searchQuery() const;
7175 QString noResultsHint() const;
7276 QString formFactor() const;
77+ bool isActive() const;
7378
7479 /* setters */
7580 void setSearchQuery(const QString& search_query);
7681 void setNoResultsHint(const QString& hint);
7782 void setFormFactor(const QString& form_factor);
83+ void setActive(const bool);
7884
7985 Q_INVOKABLE void activate(const QVariant &uri, const QVariant &icon_hint, const QVariant &category,
8086 const QVariant &result_type, const QVariant &mimetype, const QVariant &title,
@@ -82,6 +88,8 @@ public:
8288 Q_INVOKABLE void preview(const QVariant &uri, const QVariant &icon_hint, const QVariant &category,
8389 const QVariant &result_type, const QVariant &mimetype, const QVariant &title,
8490 const QVariant &comment, const QVariant &dnd_uri, const QVariant &metadata);
91+ Q_INVOKABLE void cancelActivation();
92+
8593 void setUnityScope(const unity::dash::Scope::Ptr& scope);
8694 unity::dash::Scope::Ptr unityScope() const;
8795
@@ -93,14 +101,15 @@ Q_SIGNALS:
93101 void iconHintChanged(const std::string&);
94102 void descriptionChanged(const std::string&);
95103 void searchHintChanged(const std::string&);
104+ void searchInProgressChanged();
96105 void visibleChanged(bool);
97106 void shortcutChanged(const std::string&);
98107 void connectedChanged(bool);
99108 void categoriesChanged();
100− void searchFinished(const std::string&, unity::glib::HintsMap const&, unity::glib::Error const&);
101109 void searchQueryChanged();
102110 void noResultsHintChanged();
103111 void formFactorChanged();
112+ void isActiveChanged(bool);
104113 void filtersChanged();
105114
106115 // signals triggered by activate(..) or preview(..) requests.
@@ -113,7 +122,8 @@ Q_SIGNALS:
113122
114123private Q_SLOTS:
115124 void synchronizeStates();
116− void onSearchFinished(const std::string &, unity::glib::HintsMap const &);
125+ void scopeIsActiveChanged();
126+ void onSearchFinished(std::string const &, unity::glib::HintsMap const &, unity::glib::Error const&);
117127
118128private:
119129 unity::dash::LocalResult createLocalResult(const QVariant &uri, const QVariant &icon_hint,
@@ -124,6 +134,7 @@ private:
124134 void onActivated(unity::dash::LocalResult const& result, unity::dash::ScopeHandledType type, unity::glib::HintsMap const& hints);
125135 void onPreviewReady(unity::dash::LocalResult const& result, unity::dash::Preview::Ptr const& preview);
126136 void fallbackActivate(const QString& uri);
137+ void resultsDirtyToggled(bool);
127138
128139 unity::dash::Scope::Ptr m_unityScope;
129140 std::unique_ptr<Categories> m_categories;
@@ -131,6 +142,10 @@ private:
131142 QString m_searchQuery;
132143 QString m_noResultsHint;
133144 QString m_formFactor;
145+ bool m_isActive;
146+ bool m_searchInProgress;
147+ unity::glib::Cancellable m_cancellable;
148+ unity::glib::Cancellable m_previewCancellable;
134149};
135150
136151Q_DECLARE_METATYPE(Scope*)
plugins/Unity/variantutils.cpp+9
@@ -40,3 +40,12 @@ unity::glib::HintsMap convertToHintsMap(const QVariant &var)
4040 }
4141 return unity::glib::HintsMap();
4242}
43+
44+QVariantHash convertToQVariantHash(const unity::glib::HintsMap& var)
45+{
46+ QVariantHash hash;
47+ for (auto hint: var) {
48+ hash.insert(QString::fromStdString(hint.first), DeeListModel::VariantForData(hint.second));
49+ }
50+ return hash;
51+}
plugins/Unity/variantutils.h+1
@@ -28,5 +28,6 @@
2828
2929unity::glib::HintsMap convertToHintsMap(const QHash<QString, QVariant> &val);
3030unity::glib::HintsMap convertToHintsMap(const QVariant &var);
31+QVariantHash convertToQVariantHash(const unity::glib::HintsMap& var);
3132
3233#endif
plugins/Utils/CMakeLists.txt+13−1
@@ -1,27 +1,39 @@
1+# Dependencies
2+include(FindPkgConfig)
3+
4+pkg_search_module(GIO REQUIRED gio-2.0)
5+
16include_directories(
27 ${CMAKE_CURRENT_SOURCE_DIR}
38 ${CMAKE_CURRENT_BINARY_DIR}
49 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
10+ ${GIO_INCLUDE_DIRS}
511)
612
713set(QMLPLUGIN_SRC
14+ albumartprovider.cpp
815 applicationpaths.h
16+ mediaartcache.cpp
917 qlimitproxymodelqml.cpp
1018 qsortfilterproxymodelqml.cpp
1119 ubuntuwindow.cpp
20+ unitymenumodelpaths.cpp
1221 plugin.cpp
1322 )
1423
1524add_library(Utils-qml SHARED
1625 ${QMLPLUGIN_SRC}
1726 )
27+
28+target_link_libraries(Utils-qml ${GIO_LDFLAGS})
29+
1830# Because this is an internal support library, we want
1931# to expose all symbols in it. Consider changing this
2032# either to a static library or just using the
2133# files directly in targets.
2234set_target_properties(Utils-qml PROPERTIES COMPILE_FLAGS -fvisibility=default)
2335
24−qt5_use_modules(Utils-qml Qml Quick)
36+qt5_use_modules(Utils-qml Qml Quick DBus Network XmlPatterns)
2537
2638# export the qmldir qmltypes and plugin files
2739export_qmlfiles(Utils Utils)
plugins/Utils/albumartprovider.cppnew file+231
@@ -0,0 +1,231 @@
1+/*
2+ * Copyright 2013 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Authors: Jussi Pakkanen <jussi.pakkanen@canonical.com>
17+ * Pawel Stolowski <pawel.stolowski@canonical.com>
18+*/
19+
20+#include "albumartprovider.h"
21+#include <QString>
22+#include <QNetworkAccessManager>
23+#include <QEventLoop>
24+#include <QNetworkRequest>
25+#include <QNetworkReply>
26+#include <QXmlQuery>
27+#include <QTemporaryFile>
28+#include <QBuffer>
29+#include <QDebug>
30+#include <QFile>
31+#include <QStringList>
32+#include <QByteArray>
33+#include <QImage>
34+#include <QUrl>
35+
36+using namespace std;
37+
38+const std::string AlbumArtProvider::DEFAULT_ALBUM_ART = "/usr/share/unity/icons/album_missing.png";
39+const std::string AlbumArtProvider::UNITY_LENS_SCHEMA = "com.canonical.Unity.Lenses";
40+
41+AlbumArtProvider::AlbumArtProvider()
42+ : QQuickImageProvider(QQmlImageProviderBase::Image, QQmlImageProviderBase::ForceAsynchronousImageLoading),
43+ m_settings(nullptr)
44+{
45+ auto schemas = g_settings_list_schemas();
46+ if (schemas) {
47+ for (int i = 0; schemas[i]; i++) {
48+ if (g_strcmp0(schemas[i], UNITY_LENS_SCHEMA.c_str()) == 0) {
49+ m_settings = g_settings_new(UNITY_LENS_SCHEMA.c_str());
50+ break;
51+ }
52+ }
53+ }
54+ if (m_settings == nullptr) {
55+ qWarning() << "Missing" << QString::fromStdString(UNITY_LENS_SCHEMA) << "schema";
56+ }
57+}
58+
59+AlbumArtProvider::~AlbumArtProvider()
60+{
61+ if (m_settings)
62+ g_object_unref(m_settings);
63+}
64+
65+std::string AlbumArtProvider::get_lastfm_url(const albuminfo &ai) {
66+ QString artist = QString::fromStdString(ai.artist);
67+ QString album = QString::fromStdString(ai.album);
68+
69+ /// @todo: this is the old API which will probably get axed at some point in the future
70+ /// The new 2.0 API requires an API key, but supports JSON output, etc, so switching
71+ /// to it should be done ASAP.
72+ QString request = QString("http://ws.audioscrobbler.com/1.0/album/%1/%2/info.xml").arg(artist)
73+ .arg(album)
74+ .toHtmlEscaped();
75+ QScopedPointer<QNetworkAccessManager> am(new QNetworkAccessManager);
76+ QNetworkReply *reply = am->get(QNetworkRequest(QUrl(request)));
77+ QEventLoop loop;
78+ QObject::connect(am.data(), &QNetworkAccessManager::finished, &loop, &QEventLoop::quit);
79+ loop.exec();
80+
81+ if (reply->error() != QNetworkReply::NoError) {
82+ qWarning() << "Error getting the XML:" << reply->errorString();
83+ return "";
84+ }
85+
86+ QXmlQuery query;
87+ QBuffer tmp;
88+ tmp.setData(reply->readAll());
89+ tmp.open(QIODevice::ReadOnly);
90+ query.bindVariable("reply", &tmp);
91+ query.setQuery("doc($reply)/album/coverart/large[1]/text()");
92+ QString image;
93+ query.evaluateTo(&image);
94+ image = image.trimmed();
95+
96+ // return empty if last.fm tries to offer their default
97+ // fallback artwork
98+ if (image.contains("catalogue/noimage")) {
99+ return "";
100+ }
101+
102+ return image.toStdString();
103+}
104+
105+bool AlbumArtProvider::download_and_store(const std::string &image_url, const std::string &output_file) {
106+ QString url = QString::fromStdString(image_url);
107+ QString fileName = QString::fromStdString(output_file);
108+
109+ QScopedPointer<QNetworkAccessManager> am(new QNetworkAccessManager);
110+ QNetworkReply *reply = am->get(QNetworkRequest(QUrl(url)));
111+ QEventLoop loop;
112+ QObject::connect(am.data(), &QNetworkAccessManager::finished, &loop, &QEventLoop::quit);
113+ loop.exec();
114+
115+ if (reply->error() != QNetworkReply::NoError) {
116+ qWarning() << "Error getting the image:" << reply->errorString();
117+ return false;
118+ }
119+
120+ QFile file(fileName);
121+ if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
122+ qWarning() << "Could not open file for writing:" << file.errorString();
123+ return false;
124+ }
125+ if (file.write(reply->readAll()) == -1){
126+ qWarning() << "Could not write the image:" << file.error();
127+ return false;
128+ }
129+
130+ return true;
131+}
132+
133+void AlbumArtProvider::fix_format(const std::string &fname) {
134+ // MediaArtSpec requires jpg. Convert to it if necessary.
135+ FILE *f = fopen(fname.c_str(), "r");
136+ if(!f)
137+ return;
138+ unsigned char buf[2];
139+ fread(buf, 1, 2, f);
140+ fclose(f);
141+ if(buf[0] == 0xff && buf[1] == 0xd8) {
142+ return;
143+ }
144+ QImage im(fname.c_str());
145+ im.save(fname.c_str(), "JPEG");
146+}
147+
148+std::string AlbumArtProvider::get_image(const std::string &artist, const std::string &album) {
149+ albuminfo info;
150+
151+ info.artist = artist;
152+ info.album = album;
153+
154+ if(info.album.empty() || info.artist.empty()) {
155+ return DEFAULT_ALBUM_ART;
156+ }
157+ if(cache.has_art(info.artist, info.album)) {
158+ // Image may have expired from cache between these two lines.
159+ // It might expire before we return. C'est la vie.
160+ return cache.get_art_file(info.artist, info.album);
161+ }
162+
163+ if (m_settings != nullptr && g_strcmp0(g_settings_get_string(m_settings, "remote-content-search"), "all") !=0) {
164+ qDebug() << "Remote content disabled";
165+ return DEFAULT_ALBUM_ART;
166+ }
167+
168+ std::string image_url = get_lastfm_url(info);
169+ if(image_url.empty()) {
170+ return DEFAULT_ALBUM_ART;
171+ }
172+ QTemporaryFile tempFile;
173+ tempFile.open();
174+ tempFile.setAutoRemove(true);
175+ QString fname = tempFile.fileName();
176+ std::string tmpname = fname.toUtf8().data();
177+
178+ if(!download_and_store(image_url, tmpname)) {
179+ return DEFAULT_ALBUM_ART;
180+ }
181+ fix_format(tmpname.c_str());
182+ QFile f(fname);
183+ if(!f.open(QIODevice::ReadWrite)) {
184+ return DEFAULT_ALBUM_ART;
185+ }
186+ QByteArray arr = f.readAll();
187+ f.close();
188+
189+ cache.add_art(info.artist, info.album, arr.data(), arr.size());
190+ try {
191+ std::string res = cache.get_art_file(info.artist, info.album);
192+ if(res.empty())
193+ return DEFAULT_ALBUM_ART;
194+ return res;
195+ } catch(...) {
196+ }
197+ return DEFAULT_ALBUM_ART;
198+}
199+
200+QImage AlbumArtProvider::requestImage(const QString &id, QSize *realSize, const QSize &requestedSize) {
201+ Q_UNUSED(requestedSize)
202+
203+ const QStringList parts = id.split("/");
204+ if (parts.size() != 2) {
205+ qWarning() << "Invalid albumart uri:" << id;
206+ return QImage(QString::fromStdString(DEFAULT_ALBUM_ART));
207+ }
208+ const std::string artist = QUrl::fromPercentEncoding(parts[0].toUtf8()).toStdString();
209+ const std::string album = QUrl::fromPercentEncoding(parts[1].toUtf8()).toStdString();
210+
211+ std::string tgt_path;
212+ try {
213+ tgt_path = get_image(artist, album);
214+ if(!tgt_path.empty()) {
215+ QString tgt(tgt_path.c_str());
216+ QImage image;
217+ image.load(tgt);
218+ // FIXME: Rescale to requested size preserving aspect.
219+ *realSize = image.size();
220+ return image;
221+ }
222+ } catch(std::exception &e) {
223+ qDebug() << "Album art loader failed: " << e.what();
224+ } catch(...) {
225+ qDebug() << "Unknown error when generating image.";
226+ }
227+
228+ QImage fallback(QString::fromStdString(DEFAULT_ALBUM_ART));
229+ *realSize = fallback.size();
230+ return fallback;
231+}
plugins/Utils/albumartprovider.hnew file+56
@@ -0,0 +1,56 @@
1+/*
2+ * Copyright 2013 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Authors: Jussi Pakkanen <jussi.pakkanen@canonical.com>
17+*/
18+
19+#ifndef ALBUMART_PROVIDER_H_
20+#define ALBUMART_PROVIDER_H_
21+
22+#include <string>
23+#include <stdexcept>
24+#include <QQuickImageProvider>
25+#include <gio/gio.h>
26+
27+#include "mediaartcache.h"
28+
29+struct albuminfo {
30+ std::string artist;
31+ std::string album;
32+};
33+
34+class AlbumArtProvider : public QQuickImageProvider
35+{
36+public:
37+ AlbumArtProvider();
38+ ~AlbumArtProvider();
39+ QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize);
40+
41+ std::string get_image(const std::string &artist, const std::string &album);
42+
43+ const static std::string DEFAULT_ALBUM_ART;
44+ const static std::string UNITY_LENS_SCHEMA;
45+private:
46+ MediaArtCache cache;
47+ GSettings *m_settings;
48+
49+ void fix_format(const std::string &fname);
50+
51+ std::string get_lastfm_url(const albuminfo &ai);
52+
53+ bool download_and_store(const std::string &image_url, const std::string &output_file);
54+};
55+
56+#endif
plugins/Utils/mediaartcache.cppnew file+178
@@ -0,0 +1,178 @@
1+/*
2+ * This file is part of the Ubuntu TV Media Scanner
3+ * Copyright (C) 2012-2013 Canonical Ltd.
4+ *
5+ * This program is free software: you can redistribute it and/or modify
6+ * it under the terms of the GNU Lesser General Public License version 3 as
7+ * published by the Free Software Foundation.
8+ *
9+ * This program is distributed in the hope that it will be useful,
10+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+ * GNU Lesser General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU Lesser General Public License
15+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
16+ *
17+ * Authored by: Jussi Pakkanen <jussi.pakkanen@canonical.com>
18+ */
19+
20+#include"mediaartcache.h"
21+
22+#include<dirent.h>
23+#include<sys/stat.h>
24+#include<fcntl.h>
25+#include<unistd.h>
26+#include<errno.h>
27+#include<stdio.h>
28+#include<string.h>
29+#include<stdlib.h>
30+#include<assert.h>
31+#include<utime.h>
32+
33+#include<glib.h>
34+
35+#include<vector>
36+#include<algorithm>
37+#include<stdexcept>
38+
39+using namespace std;
40+
41+static string md5(const string &str) {
42+ const unsigned char *buf = (const unsigned char *)str.c_str();
43+ char *normalized = g_utf8_normalize((const gchar*)buf, str.size(), G_NORMALIZE_ALL);
44+ string final;
45+ gchar *result;
46+
47+ if(normalized) {
48+ buf = (const unsigned char*)normalized;
49+ }
50+ gssize bytes = str.length();
51+
52+ result = g_compute_checksum_for_data(G_CHECKSUM_MD5, buf, bytes);
53+ final = result;
54+ g_free((gpointer)normalized);
55+ g_free(result);
56+ return final;
57+}
58+
59+MediaArtCache::MediaArtCache() {
60+ string xdg_base = g_get_user_cache_dir();
61+
62+ if (xdg_base == "") {
63+ string s("Could not determine cache dir.");
64+ throw runtime_error(s);
65+ }
66+ int ec = mkdir(xdg_base.c_str(), S_IRUSR | S_IWUSR | S_IXUSR);
67+ if (ec < 0 && errno != EEXIST) {
68+ string s("Could not create base dir.");
69+ throw runtime_error(s);
70+ }
71+ root_dir = xdg_base + "/media-art";
72+ ec = mkdir(root_dir.c_str(), S_IRUSR | S_IWUSR | S_IXUSR);
73+ if (ec < 0 && errno != EEXIST) {
74+ string s("Could not create cache dir.");
75+ throw runtime_error(s);
76+ }
77+}
78+
79+bool MediaArtCache::has_art(const std::string &artist, const std::string &album) const {
80+ string fname = get_art_file(artist, album);
81+ return access(fname.c_str(), R_OK) == 0;
82+}
83+
84+void MediaArtCache::add_art(const std::string &artist, const std::string &album,
85+ char *data, unsigned int datalen) {
86+ string abs_fname = get_full_filename(artist, album);
87+ GError *err = nullptr;
88+ if(!g_file_set_contents(abs_fname.c_str(), data, datalen, &err)) {
89+ string e("Could not write file ");
90+ e += abs_fname;
91+ e += ": ";
92+ e += err->message;
93+ g_error_free(err);
94+ throw runtime_error(e);
95+ }
96+}
97+
98+string MediaArtCache::get_art_file(const std::string &artist, const std::string &album) const {
99+ string abs_fname = get_full_filename(artist, album);
100+
101+ if (access(abs_fname.c_str(), R_OK) == 0) {
102+ utime(abs_fname.c_str(), nullptr); // update access times to current time
103+ return abs_fname;
104+ }
105+ return "";
106+}
107+
108+std::string MediaArtCache::get_full_filename(const std::string &artist, const std::string & album) const {
109+ return root_dir + "/" + compute_base_name(artist, album);
110+}
111+
112+
113+std::string MediaArtCache::compute_base_name(const std::string &artist, const std::string &album) const {
114+ string type = "album";
115+ string h1 = md5(artist);
116+ string h2 = md5(album);
117+ return type + "-" + h1 + "-" + h2 + ".jpg";
118+}
119+
120+
121+void MediaArtCache::clear() const {
122+ DIR *d = opendir(root_dir.c_str());
123+ if(!d) {
124+ string s = "Something went wrong.";
125+ throw runtime_error(s);
126+ }
127+ struct dirent *entry, *de;
128+ entry = (dirent*)malloc(sizeof(dirent) + NAME_MAX);
129+ while(readdir_r(d, entry, &de) == 0 && de) {
130+ string basename = entry->d_name;
131+ if (basename == "." || basename == "..")
132+ continue;
133+ string fname = root_dir + "/" + basename;
134+ if(remove(fname.c_str()) < 0) {
135+ // This is not really an error worth
136+ // halting everything for.
137+ fprintf(stderr, "Could not delete file %s: %s.\n", fname.c_str(),
138+ strerror(errno));
139+ }
140+ }
141+ free(entry);
142+ closedir(d);
143+}
144+
145+void MediaArtCache::prune() {
146+ vector<pair<double, string>> mtimes;
147+ DIR *d = opendir(root_dir.c_str());
148+ if(!d) {
149+ string s = "Something went wrong.";
150+ throw runtime_error(s);
151+ }
152+ struct dirent *entry, *de;
153+ entry = (dirent*)malloc(sizeof(dirent) + NAME_MAX);
154+ while(readdir_r(d, entry, &de) == 0 && de) {
155+ string basename = entry->d_name;
156+ if (basename == "." || basename == "..")
157+ continue;
158+ string fname = root_dir + "/" + basename;
159+ struct stat sbuf;
160+ if(stat(fname.c_str(), &sbuf) != 0) {
161+ continue;
162+ }
163+ // Use mtime because atime is not guaranteed to work if, for example
164+ // the filesystem is mounted with noatime or relatime.
165+ mtimes.push_back(make_pair(sbuf.st_mtim.tv_sec + sbuf.st_mtim.tv_nsec/1000000000.0, fname));
166+ }
167+ free(entry);
168+ closedir(d);
169+ if (mtimes.size() <= MAX_SIZE)
170+ return;
171+ sort(mtimes.begin(), mtimes.end());
172+ for(size_t i=0; i < mtimes.size()-MAX_SIZE; i++) {
173+ if(remove(mtimes[i].second.c_str()) < 0) {
174+ fprintf(stderr, "Could not remove file %s: %s.\n",
175+ mtimes[i].second.c_str(), strerror(errno));
176+ }
177+ }
178+}
plugins/Utils/mediaartcache.hnew file+54
@@ -0,0 +1,54 @@
1+/*
2+ * This file is part of the Ubuntu TV Media Scanner
3+ * Copyright (C) 2012-2013 Canonical Ltd.
4+ *
5+ * This program is free software: you can redistribute it and/or modify
6+ * it under the terms of the GNU Lesser General Public License version 3 as
7+ * published by the Free Software Foundation.
8+ *
9+ * This program is distributed in the hope that it will be useful,
10+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+ * GNU Lesser General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU Lesser General Public License
15+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
16+ *
17+ * Authored by: Jussi Pakkanen <jussi.pakkanen@canonical.com>
18+ */
19+
20+#ifndef MEDIAARTCACHE_H
21+#define MEDIAARTCACHE_H
22+
23+#include<string>
24+
25+/*
26+ * A class to store thumbnails for files according to
27+ * https://wiki.gnome.org/MediaArtStorageSpec
28+ *
29+ * As this class deals mostly with the filesystem, all
30+ * errors are reported with runtime_error exceptions.
31+ */
32+
33+
34+class MediaArtCache {
35+private:
36+ std::string root_dir;
37+
38+ std::string compute_base_name(const std::string &artist, const std::string &album) const;
39+ std::string get_full_filename(const std::string &artist, const std::string & album) const;
40+
41+public:
42+ static const unsigned int MAX_SIZE = 200;
43+
44+ MediaArtCache();
45+ bool has_art(const std::string &artist, const std::string &album) const;
46+ void add_art(const std::string &artist, const std::string &album,
47+ char *data, unsigned int datalen);
48+ std::string get_art_file(const std::string &artist, const std::string &album) const;
49+ void clear() const;
50+ void prune();
51+ std::string get_cache_dir() const { return root_dir; }
52+};
53+
54+#endif
plugins/Utils/plugin.cpp+22−1
@@ -19,15 +19,17 @@
1919// Qt
2020#include <QtQml/qqml.h>
2121#include <QtQuick/QQuickWindow>
22−
22+#include <QDebug>
2323// self
2424#include "plugin.h"
2525
2626// local
27+#include "albumartprovider.h"
2728#include "applicationpaths.h"
2829#include "qlimitproxymodelqml.h"
2930#include "qsortfilterproxymodelqml.h"
3031#include "ubuntuwindow.h"
32+#include "unitymenumodelpaths.h"
3133
3234static QObject* applicationsPathsSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
3335 Q_UNUSED(engine);
@@ -41,6 +43,25 @@ void UtilsPlugin::registerTypes(const char *uri)
4143 qmlRegisterType<QAbstractItemModel>();
4244 qmlRegisterType<QLimitProxyModelQML>(uri, 0, 1, "LimitProxyModel");
4345 qmlRegisterType<QSortFilterProxyModelQML>(uri, 0, 1, "SortFilterProxyModel");
46+ qmlRegisterType<UnityMenuModelPaths>(uri, 0, 1, "UnityMenuModelPaths");
4447 qmlRegisterExtendedType<QQuickWindow, UbuntuWindow>(uri, 0, 1, "Window");
4548 qmlRegisterSingletonType<ApplicationPaths>(uri, 0, 1, "ApplicationPaths", applicationsPathsSingleton);
4649}
50+
51+void UtilsPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
52+{
53+ QQmlExtensionPlugin::initializeEngine(engine, uri);
54+
55+ try
56+ {
57+ engine->addImageProvider(QLatin1String("albumart"), new AlbumArtProvider);
58+ }
59+ catch (const std::runtime_error &e)
60+ {
61+ qWarning() << "Failed to register image provider for albumart:" << e.what();
62+ }
63+ catch (...)
64+ {
65+ qWarning() << "Failed to register image provider for albumart (unknown error)";
66+ }
67+}
plugins/Utils/plugin.h+1
@@ -29,6 +29,7 @@ class UtilsPlugin : public QQmlExtensionPlugin
2929
3030public:
3131 void registerTypes(const char *uri);
32+ void initializeEngine(QQmlEngine *engine, const char *uri);
3233};
3334
3435#endif
plugins/Utils/unitymenumodelpaths.cppnew file+182
@@ -0,0 +1,182 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Author: Nick Dedekind <nick.dedekind@canonical.com>
17+ */
18+
19+
20+#include "unitymenumodelpaths.h"
21+#include <QDBusArgument>
22+
23+static QVariant parseVariantData(const QVariant& var);
24+
25+const QDBusArgument &operator>>(const QDBusArgument &arg, QVariantMap &map)
26+{
27+ arg.beginMap();
28+ map.clear();
29+ while (!arg.atEnd()) {
30+ QString key;
31+ QVariant value;
32+ arg.beginMapEntry();
33+
34+ arg >> key >> value;
35+ map.insertMulti(key, parseVariantData(value)); // re-parse for qdbusargument
36+
37+ arg.endMapEntry();
38+ }
39+ arg.endMap();
40+ return arg;
41+}
42+
43+static QVariant parseVariantData(const QVariant& var) {
44+ if ((int)var.type() == QMetaType::User && var.userType() == qMetaTypeId<QDBusArgument>()) {
45+ QDBusArgument arg(var.value<QDBusArgument>());
46+ if (arg.currentType() == QDBusArgument::MapType) {
47+ QVariantMap map;
48+ arg >> map;
49+ return map;
50+ }
51+ return arg.asVariant();
52+ }
53+
54+ return var;
55+}
56+
57+UnityMenuModelPaths::UnityMenuModelPaths(QObject *parent)
58+ : QObject(parent)
59+{
60+}
61+
62+QVariant UnityMenuModelPaths::source() const
63+{
64+ return m_sourceData;
65+}
66+
67+void UnityMenuModelPaths::setSource(const QVariant& data)
68+{
69+ if (m_sourceData != data) {
70+ m_sourceData = data;
71+ Q_EMIT sourceChanged();
72+
73+ updateData();
74+ }
75+}
76+
77+void UnityMenuModelPaths::updateData()
78+{
79+ QVariantMap dataMap = parseVariantData(m_sourceData).toMap();
80+
81+ if (!m_busNameHint.isEmpty() && dataMap.contains(m_busNameHint)) {
82+ setBusName(dataMap[m_busNameHint].toByteArray());
83+ } else {
84+ setBusName("");
85+ }
86+
87+ if (!m_menuObjectPathHint.isEmpty() && dataMap.contains(m_menuObjectPathHint)) {
88+ setMenuObjectPath(dataMap[m_menuObjectPathHint].toByteArray());
89+ } else {
90+ setMenuObjectPath("");
91+ }
92+
93+ if (!m_actionsHint.isEmpty() && dataMap.contains(m_actionsHint)) {
94+ setActions(dataMap[m_actionsHint].toMap());
95+ } else {
96+ setActions(QVariantMap());
97+ }
98+}
99+
100+QByteArray UnityMenuModelPaths::busName() const
101+{
102+ return m_busName;
103+}
104+
105+void UnityMenuModelPaths::setBusName(const QByteArray &name)
106+{
107+ if (m_busName != name) {
108+ m_busName = name;
109+ Q_EMIT busNameChanged();
110+ }
111+}
112+
113+QVariantMap UnityMenuModelPaths::actions() const
114+{
115+ return m_actions;
116+}
117+
118+void UnityMenuModelPaths::setActions(const QVariantMap &actions)
119+{
120+ if (m_actions != actions) {
121+ m_actions = actions;
122+ Q_EMIT actionsChanged();
123+ }
124+}
125+
126+QByteArray UnityMenuModelPaths::menuObjectPath() const
127+{
128+ return m_menuObjectPath;
129+}
130+
131+void UnityMenuModelPaths::setMenuObjectPath(const QByteArray &path)
132+{
133+ if (m_menuObjectPath != path) {
134+ m_menuObjectPath = path;
135+ Q_EMIT menuObjectPathChanged();
136+ }
137+}
138+
139+QByteArray UnityMenuModelPaths::busNameHint() const
140+{
141+ return m_busNameHint;
142+}
143+
144+void UnityMenuModelPaths::setBusNameHint(const QByteArray &nameHint)
145+{
146+ if (m_busNameHint != nameHint) {
147+ m_busNameHint = nameHint;
148+ Q_EMIT busNameHintChanged();
149+
150+ updateData();
151+ }
152+}
153+
154+QByteArray UnityMenuModelPaths::actionsHint() const
155+{
156+ return m_actionsHint;
157+}
158+
159+void UnityMenuModelPaths::setActionsHint(const QByteArray &actionsHint)
160+{
161+ if (m_actionsHint != actionsHint) {
162+ m_actionsHint = actionsHint;
163+ Q_EMIT actionsHintChanged();
164+
165+ updateData();
166+ }
167+}
168+
169+QByteArray UnityMenuModelPaths::menuObjectPathHint() const
170+{
171+ return m_menuObjectPathHint;
172+}
173+
174+void UnityMenuModelPaths::setMenuObjectPathHint(const QByteArray &pathHint)
175+{
176+ if (m_menuObjectPathHint != pathHint) {
177+ m_menuObjectPathHint = pathHint;
178+ Q_EMIT menuObjectPathHintChanged();
179+
180+ updateData();
181+ }
182+}
plugins/Utils/unitymenumodelpaths.hnew file+82
@@ -0,0 +1,82 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Author: Nick Dedekind <nick.dedekind@canonical.com>
17+ */
18+
19+#ifndef UNITY_MENU_MODEL_PATHS_H
20+#define UNITY_MENU_MODEL_PATHS_H
21+
22+#include <QVariant>
23+
24+class UnityMenuModelPaths : public QObject
25+{
26+ Q_OBJECT
27+
28+ Q_PROPERTY(QVariant source READ source WRITE setSource NOTIFY sourceChanged)
29+ Q_PROPERTY(QByteArray busName READ busName NOTIFY busNameChanged)
30+ Q_PROPERTY(QVariantMap actions READ actions NOTIFY actionsChanged)
31+ Q_PROPERTY(QByteArray menuObjectPath READ menuObjectPath NOTIFY menuObjectPathChanged)
32+
33+ Q_PROPERTY(QByteArray busNameHint READ busNameHint WRITE setBusNameHint NOTIFY busNameHintChanged)
34+ Q_PROPERTY(QByteArray actionsHint READ actionsHint WRITE setActionsHint NOTIFY actionsHintChanged)
35+ Q_PROPERTY(QByteArray menuObjectPathHint READ menuObjectPathHint WRITE setMenuObjectPathHint NOTIFY menuObjectPathHintChanged)
36+
37+public:
38+ explicit UnityMenuModelPaths(QObject *parent = 0);
39+
40+ QVariant source() const;
41+ void setSource(const QVariant& data);
42+
43+ QByteArray busName() const;
44+ QVariantMap actions() const;
45+ QByteArray menuObjectPath() const;
46+
47+ QByteArray busNameHint() const;
48+ QByteArray actionsHint() const;
49+ QByteArray menuObjectPathHint() const;
50+
51+Q_SIGNALS:
52+ void sourceChanged();
53+ void busNameChanged();
54+ void actionsChanged();
55+ void menuObjectPathChanged();
56+
57+ void busNameHintChanged();
58+ void actionsHintChanged();
59+ void menuObjectPathHintChanged();
60+
61+private:
62+ void setBusName(const QByteArray &name);
63+ void setActions(const QVariantMap& actions);
64+ void setMenuObjectPath(const QByteArray &path);
65+
66+ void setBusNameHint(const QByteArray& nameHint);
67+ void setActionsHint(const QByteArray &actionsHint);
68+ void setMenuObjectPathHint(const QByteArray &pathHint);
69+
70+ void updateData();
71+
72+ QVariant m_sourceData;
73+ QByteArray m_busName;
74+ QVariantMap m_actions;
75+ QByteArray m_menuObjectPath;
76+
77+ QByteArray m_busNameHint;
78+ QByteArray m_actionsHint;
79+ QByteArray m_menuObjectPathHint;
80+};
81+
82+#endif // UNITY_MENU_MODEL_PATHS_H
po/ar.po+52−66
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
1111"PO-Revision-Date: 2013-06-26 23:26+0000\n"
1212"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
1313"Language-Team: Arabic <ar@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
1818"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
19−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
20−"X-Generator: Launchpad (build 16750)\n"
19+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
20+"X-Generator: Launchpad (build 16799)\n"
2121
2222#: Applications/applications.js:23
2323msgid "Phone"
@@ -87,129 +87,93 @@ msgstr "ويكيبيديا"
8787msgid "YouTube"
8888msgstr "يوتيوب"
8989
90−#: Components/EdgeDemoOverlay.qml:145
90+#: Components/EdgeDemoOverlay.qml:149
9191msgid "Skip intro"
9292msgstr ""
9393
94−#: Components/EdgeDemo.qml:98
94+#: Components/EdgeDemo.qml:112
9595msgid "Right edge"
9696msgstr ""
9797
98−#: Components/EdgeDemo.qml:99
98+#: Components/EdgeDemo.qml:113
9999msgid "Try swiping from the right edge to unlock the phone"
100100msgstr ""
101101
102−#: Components/EdgeDemo.qml:135
102+#: Components/EdgeDemo.qml:144
103103msgid "Top edge"
104104msgstr ""
105105
106−#: Components/EdgeDemo.qml:136
106+#: Components/EdgeDemo.qml:145
107107msgid "Try swiping from the top edge to access the indicators"
108108msgstr ""
109109
110−#: Components/EdgeDemo.qml:161
110+#: Components/EdgeDemo.qml:170
111111msgid "Close"
112112msgstr ""
113113
114−#: Components/EdgeDemo.qml:162
114+#: Components/EdgeDemo.qml:171
115115msgid "Swipe up again to close the settings screen"
116116msgstr ""
117117
118−#: Components/EdgeDemo.qml:189
118+#: Components/EdgeDemo.qml:198
119119msgid "Left edge"
120120msgstr ""
121121
122−#: Components/EdgeDemo.qml:190
122+#: Components/EdgeDemo.qml:199
123123msgid "Swipe from the left to reveal the launcher for quick access to apps"
124124msgstr ""
125125
126−#: Components/EdgeDemo.qml:217
126+#: Components/EdgeDemo.qml:226
127127msgid "Well done"
128128msgstr ""
129129
130−#: Components/EdgeDemo.qml:218
131−msgid "You have now mastered the edge gestures and can start using the phone"
130+#: Components/EdgeDemo.qml:227
131+msgid ""
132+"You have now mastered the edge gestures and can start using the "
133+"phone<br><br>Tap anywhere to start"
132134msgstr ""
133135
134−#: Components/PageHeader.qml:298
136+#: Components/PageHeader.qml:341
135137msgid "Recent searches"
136138msgstr "عمليات البحث الأخيرة"
137139
138140#. TRANSLATORS: Number of persons who rated this app
139−#: Dash/Apps/AppInfo.qml:73
141+#. TRANSLATORS: Number of persons who rated this app/video/whatever
142+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
140143#, qt-format
141144msgid "(%1)"
142145msgstr ""
143146
144147#. TRANSLATORS: Number of persons who wrote reviews for this app
145−#: Dash/Apps/AppInfo.qml:85
148+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
149+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
146150#, qt-format
147151msgid "%1 review"
148152msgid_plural "%1 reviews"
149153msgstr[0] ""
150154msgstr[1] ""
151155
152−#: Dash/Apps/AppPreview.qml:175
156+#: Dash/Apps/AppPreview.qml:126
153157msgid "Rate this"
154158msgstr ""
155159
156−#: Dash/Apps/AppReviews.qml:72
160+#: Dash/Previews/Reviews.qml:74
157161msgid "Add a review"
158162msgstr ""
159163
160−#: Dash/Apps/AppReviews.qml:84
164+#: Dash/Previews/Reviews.qml:86
161165msgid "Review"
162166msgstr ""
163167
164−#: Dash/Apps/AppReviews.qml:118
168+#: Dash/Previews/Reviews.qml:121
165169msgid "Send"
166170msgstr ""
167171
168−#: Dash/Apps/AppReviews.qml:136
172+#: Dash/Previews/Reviews.qml:139
169173msgid "Comments:"
170174msgstr ""
171175
172−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
173−msgid "Featured"
174−msgstr "المميز"
175−
176−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
177−msgid "Recent"
178−msgstr "الحديث"
179−
180−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
181−msgid "New Releases"
182−msgstr "الإصدارات الجديدة"
183−
184−#: Dash/DashMusic.qml:30
185−msgid "Top Charting"
186−msgstr ""
187−
188−#: Dash/DashMusic.qml:91
189−msgid "Music"
190−msgstr "موسيقى"
191−
192−#: Dash/DashVideos.qml:31
193−msgid "Popular Online"
194−msgstr "الشائع على الإنترنت"
195−
196−#: Dash/DashVideos.qml:146
197−msgid "Videos"
198−msgstr "فيديوهات"
199−
200−#: Dash/Video/VideoPreview.qml:130
201−msgid "Directed by:"
202−msgstr "أخرجه:"
203−
204−#: Dash/Video/VideoPreview.qml:153
205−msgid "Starring:"
206−msgstr "النجوم:"
207−
208−#: Dash/Video/VideoPreview.qml:176
209−msgid "Author:"
210−msgstr "المؤلف:"
211−
212−#: Greeter/Lockscreen.qml:134
176+#: Greeter/Lockscreen.qml:142
213177msgid "Emergency Call"
214178msgstr ""
215179
@@ -246,11 +210,33 @@ msgstr "تتكلم الآن..."
246210msgid "Search"
247211msgstr "ابحث"
248212
249−#: plugins/Unity/scope.cpp:317
213+#: plugins/Unity/scope.cpp:398
250214msgid "Sorry, there is nothing that matches your search."
251215msgstr "عذراً، لا يوجد ما يطابق بحثك."
252216
253−#: Shell.qml:429
217+#: plugins/Unity/showallfilteroption.cpp:41
218+msgid "All"
219+msgstr ""
220+
221+#: Shell.qml:438
254222#, qt-format
255223msgid "Please enter %1"
256224msgstr ""
225+
226+#~ msgid "Featured"
227+#~ msgstr "المميز"
228+
229+#~ msgid "Recent"
230+#~ msgstr "الحديث"
231+
232+#~ msgid "New Releases"
233+#~ msgstr "الإصدارات الجديدة"
234+
235+#~ msgid "Music"
236+#~ msgstr "موسيقى"
237+
238+#~ msgid "Popular Online"
239+#~ msgstr "الشائع على الإنترنت"
240+
241+#~ msgid "Videos"
242+#~ msgstr "فيديوهات"
po/ast.ponew file+248
@@ -0,0 +1,248 @@
1+# Asturian translation for unity8
2+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11+"PO-Revision-Date: 2013-10-03 14:02+0000\n"
12+"Last-Translator: ivarela <ivarela@ubuntu.com>\n"
13+"Language-Team: Asturian <ast@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=2; plural=n != 1;\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
20+
21+#: Applications/applications.js:23
22+msgid "Phone"
23+msgstr "Teléfonu"
24+
25+#: Applications/applications.js:29
26+msgid "Camera"
27+msgstr "Cámara"
28+
29+#: Applications/applications.js:35
30+msgid "Gallery"
31+msgstr "Galería"
32+
33+#: Applications/applications.js:40
34+msgid "Facebook"
35+msgstr "Facebook"
36+
37+#: Applications/applications.js:46
38+msgid "Browser"
39+msgstr "Navegador"
40+
41+#: Applications/applications.js:51
42+msgid "Twitter"
43+msgstr "Twitter"
44+
45+#: Applications/applications.js:57
46+msgid "GMail"
47+msgstr "GMail"
48+
49+#: Applications/applications.js:62
50+msgid "Weather"
51+msgstr "Meteoroloxía"
52+
53+#: Applications/applications.js:68
54+msgid "Notepad"
55+msgstr "Bloc de notes"
56+
57+#: Applications/applications.js:74
58+msgid "Calendar"
59+msgstr "Calendariu"
60+
61+#: Applications/applications.js:80
62+msgid "Media Player"
63+msgstr "Reproductor multimedia"
64+
65+#: Applications/applications.js:86
66+msgid "Evernote"
67+msgstr "Evernote"
68+
69+#: Applications/applications.js:91
70+msgid "Map"
71+msgstr "Map"
72+
73+#: Applications/applications.js:96
74+msgid "Pinterest"
75+msgstr "Pinterest"
76+
77+#: Applications/applications.js:101
78+msgid "SoundCloud"
79+msgstr "SoundCloud"
80+
81+#: Applications/applications.js:106
82+msgid "Wikipedia"
83+msgstr "Wikipedia"
84+
85+#: Applications/applications.js:111
86+msgid "YouTube"
87+msgstr "YouTube"
88+
89+#: Components/EdgeDemoOverlay.qml:149
90+msgid "Skip intro"
91+msgstr "Omitir la intro"
92+
93+#: Components/EdgeDemo.qml:112
94+msgid "Right edge"
95+msgstr "Berbesu drechu"
96+
97+#: Components/EdgeDemo.qml:113
98+msgid "Try swiping from the right edge to unlock the phone"
99+msgstr "Esliza'l deu dende'l berbesu drechu pa desbloquiar el teléfonu"
100+
101+#: Components/EdgeDemo.qml:144
102+msgid "Top edge"
103+msgstr "Berbesu superior"
104+
105+#: Components/EdgeDemo.qml:145
106+msgid "Try swiping from the top edge to access the indicators"
107+msgstr "Esliza'l deu dende'l berbesu superior p'acceder a los menús"
108+
109+#: Components/EdgeDemo.qml:170
110+msgid "Close"
111+msgstr "Zarrar"
112+
113+#: Components/EdgeDemo.qml:171
114+msgid "Swipe up again to close the settings screen"
115+msgstr "Esliza hacia arriba pa zarrar la pantalla d'axustes"
116+
117+#: Components/EdgeDemo.qml:198
118+msgid "Left edge"
119+msgstr "Berbesu esquierdu"
120+
121+#: Components/EdgeDemo.qml:199
122+msgid "Swipe from the left to reveal the launcher for quick access to apps"
123+msgstr ""
124+"Esliza'l deu dende la esquierda p'amosar el llanzador y acceder rápidamente "
125+"a les aplicaciones"
126+
127+#: Components/EdgeDemo.qml:226
128+msgid "Well done"
129+msgstr "Bien fecho"
130+
131+#: Components/EdgeDemo.qml:227
132+msgid ""
133+"You have now mastered the edge gestures and can start using the "
134+"phone<br><br>Tap anywhere to start"
135+msgstr ""
136+"Agora domines los xestos de berbesos y pues usar el teléfonu<br><br>Toca la "
137+"pantalla pa entamar"
138+
139+#: Components/PageHeader.qml:341
140+msgid "Recent searches"
141+msgstr "Busques recientes"
142+
143+#. TRANSLATORS: Number of persons who rated this app
144+#. TRANSLATORS: Number of persons who rated this app/video/whatever
145+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
146+#, qt-format
147+msgid "(%1)"
148+msgstr "(%1)"
149+
150+#. TRANSLATORS: Number of persons who wrote reviews for this app
151+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
152+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
153+#, qt-format
154+msgid "%1 review"
155+msgid_plural "%1 reviews"
156+msgstr[0] "%1 reseña"
157+msgstr[1] "%1 reseñes"
158+
159+#: Dash/Apps/AppPreview.qml:126
160+msgid "Rate this"
161+msgstr "Valorar esto"
162+
163+#: Dash/Previews/Reviews.qml:74
164+msgid "Add a review"
165+msgstr "Amestar una reseña"
166+
167+#: Dash/Previews/Reviews.qml:86
168+msgid "Review"
169+msgstr "Revisar"
170+
171+#: Dash/Previews/Reviews.qml:121
172+msgid "Send"
173+msgstr "Unviar"
174+
175+#: Dash/Previews/Reviews.qml:139
176+msgid "Comments:"
177+msgstr "Comentarios:"
178+
179+#: Greeter/Lockscreen.qml:142
180+msgid "Emergency Call"
181+msgstr "Llamada d'emerxencia"
182+
183+#: Greeter/PassphraseLockscreen.qml:59
184+#, qt-format
185+msgid "Hello %1"
186+msgstr "Hola %1"
187+
188+#: Greeter/PassphraseLockscreen.qml:59
189+msgid "Hello"
190+msgstr "Hola"
191+
192+#: Hud/HudParametrizedActionsPage.qml:132
193+msgid "Confirm"
194+msgstr "Confirmar"
195+
196+#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
197+msgid "Type or say a command"
198+msgstr "Escribi o di una orde"
199+
200+#: Hud/Hud.qml:84
201+msgid "Loading. Please Wait..."
202+msgstr "Cargando, espera…"
203+
204+#: Hud/Hud.qml:89
205+msgid "Speak Now..."
206+msgstr "Fala agora…"
207+
208+#: Hud/Hud.qml:94
209+msgid "Speaking..."
210+msgstr "Falando…"
211+
212+#: Panel/SearchIndicator.qml:27
213+msgid "Search"
214+msgstr "Guetar"
215+
216+#: plugins/Unity/scope.cpp:398
217+msgid "Sorry, there is nothing that matches your search."
218+msgstr "Sentímoslo, nun hai res que concase cola gueta"
219+
220+#: plugins/Unity/showallfilteroption.cpp:41
221+msgid "All"
222+msgstr "Too"
223+
224+#: Shell.qml:438
225+#, qt-format
226+msgid "Please enter %1"
227+msgstr "Introduz %1"
228+
229+#~ msgid "New Releases"
230+#~ msgstr "Llanzamientos nuevos"
231+
232+#~ msgid "Featured"
233+#~ msgstr "Destacaos"
234+
235+#~ msgid "Top Charting"
236+#~ msgstr "Meyor posicionaes"
237+
238+#~ msgid "Recent"
239+#~ msgstr "Recientes"
240+
241+#~ msgid "Videos"
242+#~ msgstr "Vídeos"
243+
244+#~ msgid "Music"
245+#~ msgstr "Música"
246+
247+#~ msgid "Popular Online"
248+#~ msgstr "Populares en llinia"
po/az.po+40−66
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
1111"PO-Revision-Date: 2013-06-26 23:48+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Azerbaijani <az@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
2020
2121#: Applications/applications.js:23
2222msgid "Phone"
@@ -86,129 +86,93 @@ msgstr ""
8686msgid "YouTube"
8787msgstr ""
8888
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
9090msgid "Skip intro"
9191msgstr ""
9292
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
9494msgid "Right edge"
9595msgstr ""
9696
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
9898msgid "Try swiping from the right edge to unlock the phone"
9999msgstr ""
100100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102102msgid "Top edge"
103103msgstr ""
104104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106106msgid "Try swiping from the top edge to access the indicators"
107107msgstr ""
108108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110110msgid "Close"
111111msgstr ""
112112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114114msgid "Swipe up again to close the settings screen"
115115msgstr ""
116116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118118msgid "Left edge"
119119msgstr ""
120120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123123msgstr ""
124124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126126msgid "Well done"
127127msgstr ""
128128
129−#: Components/EdgeDemo.qml:218
130−msgid "You have now mastered the edge gestures and can start using the phone"
129+#: Components/EdgeDemo.qml:227
130+msgid ""
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131133msgstr ""
132134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134136msgid "Recent searches"
135137msgstr "Son axtarışlar"
136138
137139#. TRANSLATORS: Number of persons who rated this app
138−#: Dash/Apps/AppInfo.qml:73
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139142#, qt-format
140143msgid "(%1)"
141144msgstr ""
142145
143146#. TRANSLATORS: Number of persons who wrote reviews for this app
144−#: Dash/Apps/AppInfo.qml:85
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145149#, qt-format
146150msgid "%1 review"
147151msgid_plural "%1 reviews"
148152msgstr[0] ""
149153msgstr[1] ""
150154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152156msgid "Rate this"
153157msgstr ""
154158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156160msgid "Add a review"
157161msgstr ""
158162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160164msgid "Review"
161165msgstr ""
162166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164168msgid "Send"
165169msgstr ""
166170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168172msgid "Comments:"
169173msgstr ""
170174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Musiqi"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Videolar"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212176msgid "Emergency Call"
213177msgstr ""
214178
@@ -245,11 +209,21 @@ msgstr "Söylənilir..."
245209msgid "Search"
246210msgstr "Axtar"
247211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249213msgid "Sorry, there is nothing that matches your search."
250214msgstr "Bağışlayın, amma axtarışınıza heç bir nəticə uyğun gəlmir."
251215
252−#: Shell.qml:429
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
220+#: Shell.qml:438
253221#, qt-format
254222msgid "Please enter %1"
255223msgstr ""
224+
225+#~ msgid "Music"
226+#~ msgstr "Musiqi"
227+
228+#~ msgid "Videos"
229+#~ msgstr "Videolar"
po/bg.po+46−66
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
1111"PO-Revision-Date: 2013-06-27 00:06+0000\n"
1212"Last-Translator: Miroslav E. Hadzhiev (Хаджиев) "
1313"<miroslav.hadzhiev@gmail.com>\n"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Type: text/plain; charset=UTF-8\n"
1717"Content-Transfer-Encoding: 8bit\n"
1818"Plural-Forms: nplurals=2; plural=n != 1;\n"
19−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
20−"X-Generator: Launchpad (build 16750)\n"
19+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
20+"X-Generator: Launchpad (build 16799)\n"
2121
2222#: Applications/applications.js:23
2323msgid "Phone"
@@ -87,129 +87,93 @@ msgstr "Уикипедия"
8787msgid "YouTube"
8888msgstr "YouTube"
8989
90−#: Components/EdgeDemoOverlay.qml:145
90+#: Components/EdgeDemoOverlay.qml:149
9191msgid "Skip intro"
9292msgstr ""
9393
94−#: Components/EdgeDemo.qml:98
94+#: Components/EdgeDemo.qml:112
9595msgid "Right edge"
9696msgstr ""
9797
98−#: Components/EdgeDemo.qml:99
98+#: Components/EdgeDemo.qml:113
9999msgid "Try swiping from the right edge to unlock the phone"
100100msgstr ""
101101
102−#: Components/EdgeDemo.qml:135
102+#: Components/EdgeDemo.qml:144
103103msgid "Top edge"
104104msgstr ""
105105
106−#: Components/EdgeDemo.qml:136
106+#: Components/EdgeDemo.qml:145
107107msgid "Try swiping from the top edge to access the indicators"
108108msgstr ""
109109
110−#: Components/EdgeDemo.qml:161
110+#: Components/EdgeDemo.qml:170
111111msgid "Close"
112112msgstr ""
113113
114−#: Components/EdgeDemo.qml:162
114+#: Components/EdgeDemo.qml:171
115115msgid "Swipe up again to close the settings screen"
116116msgstr ""
117117
118−#: Components/EdgeDemo.qml:189
118+#: Components/EdgeDemo.qml:198
119119msgid "Left edge"
120120msgstr ""
121121
122−#: Components/EdgeDemo.qml:190
122+#: Components/EdgeDemo.qml:199
123123msgid "Swipe from the left to reveal the launcher for quick access to apps"
124124msgstr ""
125125
126−#: Components/EdgeDemo.qml:217
126+#: Components/EdgeDemo.qml:226
127127msgid "Well done"
128128msgstr ""
129129
130−#: Components/EdgeDemo.qml:218
131−msgid "You have now mastered the edge gestures and can start using the phone"
130+#: Components/EdgeDemo.qml:227
131+msgid ""
132+"You have now mastered the edge gestures and can start using the "
133+"phone<br><br>Tap anywhere to start"
132134msgstr ""
133135
134−#: Components/PageHeader.qml:298
136+#: Components/PageHeader.qml:341
135137msgid "Recent searches"
136138msgstr "Скорошни търсения"
137139
138140#. TRANSLATORS: Number of persons who rated this app
139−#: Dash/Apps/AppInfo.qml:73
141+#. TRANSLATORS: Number of persons who rated this app/video/whatever
142+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
140143#, qt-format
141144msgid "(%1)"
142145msgstr ""
143146
144147#. TRANSLATORS: Number of persons who wrote reviews for this app
145−#: Dash/Apps/AppInfo.qml:85
148+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
149+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
146150#, qt-format
147151msgid "%1 review"
148152msgid_plural "%1 reviews"
149153msgstr[0] ""
150154msgstr[1] ""
151155
152−#: Dash/Apps/AppPreview.qml:175
156+#: Dash/Apps/AppPreview.qml:126
153157msgid "Rate this"
154158msgstr ""
155159
156−#: Dash/Apps/AppReviews.qml:72
160+#: Dash/Previews/Reviews.qml:74
157161msgid "Add a review"
158162msgstr ""
159163
160−#: Dash/Apps/AppReviews.qml:84
164+#: Dash/Previews/Reviews.qml:86
161165msgid "Review"
162166msgstr ""
163167
164−#: Dash/Apps/AppReviews.qml:118
168+#: Dash/Previews/Reviews.qml:121
165169msgid "Send"
166170msgstr ""
167171
168−#: Dash/Apps/AppReviews.qml:136
172+#: Dash/Previews/Reviews.qml:139
169173msgid "Comments:"
170174msgstr ""
171175
172−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
173−msgid "Featured"
174−msgstr "Най-отличени"
175−
176−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
177−msgid "Recent"
178−msgstr "Най-нови"
179−
180−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
181−msgid "New Releases"
182−msgstr ""
183−
184−#: Dash/DashMusic.qml:30
185−msgid "Top Charting"
186−msgstr ""
187−
188−#: Dash/DashMusic.qml:91
189−msgid "Music"
190−msgstr "Музика"
191−
192−#: Dash/DashVideos.qml:31
193−msgid "Popular Online"
194−msgstr ""
195−
196−#: Dash/DashVideos.qml:146
197−msgid "Videos"
198−msgstr "Видеоклипове"
199−
200−#: Dash/Video/VideoPreview.qml:130
201−msgid "Directed by:"
202−msgstr ""
203−
204−#: Dash/Video/VideoPreview.qml:153
205−msgid "Starring:"
206−msgstr ""
207−
208−#: Dash/Video/VideoPreview.qml:176
209−msgid "Author:"
210−msgstr "Автор:"
211−
212−#: Greeter/Lockscreen.qml:134
176+#: Greeter/Lockscreen.qml:142
213177msgid "Emergency Call"
214178msgstr ""
215179
@@ -246,11 +210,27 @@ msgstr ""
246210msgid "Search"
247211msgstr "Търсене"
248212
249−#: plugins/Unity/scope.cpp:317
213+#: plugins/Unity/scope.cpp:398
250214msgid "Sorry, there is nothing that matches your search."
251215msgstr "Съжаляваме, няма нищо, което да отговаря на вашето търсене."
252216
253−#: Shell.qml:429
217+#: plugins/Unity/showallfilteroption.cpp:41
218+msgid "All"
219+msgstr ""
220+
221+#: Shell.qml:438
254222#, qt-format
255223msgid "Please enter %1"
256224msgstr ""
225+
226+#~ msgid "Featured"
227+#~ msgstr "Най-отличени"
228+
229+#~ msgid "Recent"
230+#~ msgstr "Най-нови"
231+
232+#~ msgid "Music"
233+#~ msgstr "Музика"
234+
235+#~ msgid "Videos"
236+#~ msgstr "Видеоклипове"
po/ca.po+71−76
@@ -7,16 +7,16 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
11−"PO-Revision-Date: 2013-09-11 10:30+0000\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11+"PO-Revision-Date: 2013-09-28 07:38+0000\n"
1212"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
1313"Language-Team: Catalan <ca@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-09-12 08:06+0000\n"
19−"X-Generator: Launchpad (build 16761)\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
2020
2121#: Applications/applications.js:23
2222msgid "Phone"
@@ -86,136 +86,106 @@ msgstr "Viquipèdia"
8686msgid "YouTube"
8787msgstr "YouTube"
8888
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
9090msgid "Skip intro"
91−msgstr ""
91+msgstr "Omet la introducció"
9292
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
9494msgid "Right edge"
9595msgstr "Vora dreta"
9696
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
9898msgid "Try swiping from the right edge to unlock the phone"
9999msgstr ""
100+"Proveu de lliscar el dit des de la vora dreta per desblocar el telèfon"
100101
101−#: Components/EdgeDemo.qml:135
102+#: Components/EdgeDemo.qml:144
102103msgid "Top edge"
103104msgstr "Vora superior"
104105
105−#: Components/EdgeDemo.qml:136
106+#: Components/EdgeDemo.qml:145
106107msgid "Try swiping from the top edge to access the indicators"
107108msgstr ""
109+"Proveu de lliscar el dit des de la vora superior per accedir als indicadors"
108110
109−#: Components/EdgeDemo.qml:161
111+#: Components/EdgeDemo.qml:170
110112msgid "Close"
111−msgstr ""
113+msgstr "Tanca"
112114
113−#: Components/EdgeDemo.qml:162
115+#: Components/EdgeDemo.qml:171
114116msgid "Swipe up again to close the settings screen"
115117msgstr ""
118+"Llisqueu el dit cap amunt una altra vegada per tancar la pantalla de "
119+"configuració"
116120
117−#: Components/EdgeDemo.qml:189
121+#: Components/EdgeDemo.qml:198
118122msgid "Left edge"
119123msgstr "Vora esquerra"
120124
121−#: Components/EdgeDemo.qml:190
125+#: Components/EdgeDemo.qml:199
122126msgid "Swipe from the left to reveal the launcher for quick access to apps"
123127msgstr ""
128+"Llisqueu el dit des de la vora esquerra per mostrar el llançador i accedir "
129+"ràpidament a les aplicacions"
124130
125−#: Components/EdgeDemo.qml:217
131+#: Components/EdgeDemo.qml:226
126132msgid "Well done"
127133msgstr "Enhorabona!"
128134
129−#: Components/EdgeDemo.qml:218
130−msgid "You have now mastered the edge gestures and can start using the phone"
135+#: Components/EdgeDemo.qml:227
136+msgid ""
137+"You have now mastered the edge gestures and can start using the "
138+"phone<br><br>Tap anywhere to start"
131139msgstr ""
132140
133−#: Components/PageHeader.qml:298
141+#: Components/PageHeader.qml:341
134142msgid "Recent searches"
135143msgstr "Cerques recents"
136144
137145#. TRANSLATORS: Number of persons who rated this app
138−#: Dash/Apps/AppInfo.qml:73
146+#. TRANSLATORS: Number of persons who rated this app/video/whatever
147+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139148#, qt-format
140149msgid "(%1)"
141150msgstr "(%1)"
142151
143152#. TRANSLATORS: Number of persons who wrote reviews for this app
144−#: Dash/Apps/AppInfo.qml:85
153+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
154+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145155#, qt-format
146156msgid "%1 review"
147157msgid_plural "%1 reviews"
148−msgstr[0] ""
149−msgstr[1] ""
158+msgstr[0] "%1 ressenya"
159+msgstr[1] "%1 ressenyes"
150160
151−#: Dash/Apps/AppPreview.qml:175
161+#: Dash/Apps/AppPreview.qml:126
152162msgid "Rate this"
153163msgstr ""
154164
155−#: Dash/Apps/AppReviews.qml:72
165+#: Dash/Previews/Reviews.qml:74
156166msgid "Add a review"
157−msgstr ""
167+msgstr "Afegiu una ressenya"
158168
159−#: Dash/Apps/AppReviews.qml:84
169+#: Dash/Previews/Reviews.qml:86
160170msgid "Review"
161171msgstr "Ressenya"
162172
163−#: Dash/Apps/AppReviews.qml:118
173+#: Dash/Previews/Reviews.qml:121
164174msgid "Send"
165−msgstr ""
175+msgstr "Envia"
166176
167−#: Dash/Apps/AppReviews.qml:136
177+#: Dash/Previews/Reviews.qml:139
168178msgid "Comments:"
169179msgstr "Comentaris:"
170180
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr "Destacats"
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr "Recents"
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Música"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Vídeos"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr "Autor:"
210−
211−#: Greeter/Lockscreen.qml:134
181+#: Greeter/Lockscreen.qml:142
212182msgid "Emergency Call"
213−msgstr ""
183+msgstr "Trucada d'emergència"
214184
215185#: Greeter/PassphraseLockscreen.qml:59
216186#, qt-format
217187msgid "Hello %1"
218−msgstr ""
188+msgstr "Hola %1"
219189
220190#: Greeter/PassphraseLockscreen.qml:59
221191msgid "Hello"
@@ -245,11 +215,36 @@ msgstr "S'està parlant..."
245215msgid "Search"
246216msgstr "Cerca"
247217
248−#: plugins/Unity/scope.cpp:317
218+#: plugins/Unity/scope.cpp:398
249219msgid "Sorry, there is nothing that matches your search."
250220msgstr "No hi ha res que coincideixi amb la cerca"
251221
252−#: Shell.qml:429
222+#: plugins/Unity/showallfilteroption.cpp:41
223+msgid "All"
224+msgstr ""
225+
226+#: Shell.qml:438
253227#, qt-format
254228msgid "Please enter %1"
255−msgstr ""
229+msgstr "Introduïu %1"
230+
231+#~ msgid "Music"
232+#~ msgstr "Música"
233+
234+#~ msgid "Videos"
235+#~ msgstr "Vídeos"
236+
237+#~ msgid "Recent"
238+#~ msgstr "Recents"
239+
240+#~ msgid "Featured"
241+#~ msgstr "Destacats"
242+
243+#~ msgid "New Releases"
244+#~ msgstr "Novetats"
245+
246+#~ msgid "Top Charting"
247+#~ msgstr "El millor de les llistes"
248+
249+#~ msgid "Popular Online"
250+#~ msgstr "Popular a la xarxa"
po/cs.ponew file+239
@@ -0,0 +1,239 @@
1+# Czech translation for unity8
2+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11+"PO-Revision-Date: 2013-10-08 08:09+0000\n"
12+"Last-Translator: Tadeáš Pařík <tadeas.parik@gmail.com>\n"
13+"Language-Team: Czech <cs@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
20+
21+#: Applications/applications.js:23
22+msgid "Phone"
23+msgstr "Telefon"
24+
25+#: Applications/applications.js:29
26+msgid "Camera"
27+msgstr "Fotoaparát"
28+
29+#: Applications/applications.js:35
30+msgid "Gallery"
31+msgstr "Galerie"
32+
33+#: Applications/applications.js:40
34+msgid "Facebook"
35+msgstr "Facebook"
36+
37+#: Applications/applications.js:46
38+msgid "Browser"
39+msgstr "Prohlížeč"
40+
41+#: Applications/applications.js:51
42+msgid "Twitter"
43+msgstr "Twitter"
44+
45+#: Applications/applications.js:57
46+msgid "GMail"
47+msgstr "GMail"
48+
49+#: Applications/applications.js:62
50+msgid "Weather"
51+msgstr "Počasí"
52+
53+#: Applications/applications.js:68
54+msgid "Notepad"
55+msgstr "Poznámkový blok"
56+
57+#: Applications/applications.js:74
58+msgid "Calendar"
59+msgstr "Kalendář"
60+
61+#: Applications/applications.js:80
62+msgid "Media Player"
63+msgstr "Přehrávač multimédií"
64+
65+#: Applications/applications.js:86
66+msgid "Evernote"
67+msgstr "Evernote"
68+
69+#: Applications/applications.js:91
70+msgid "Map"
71+msgstr "Mapa"
72+
73+#: Applications/applications.js:96
74+msgid "Pinterest"
75+msgstr "Pinterest"
76+
77+#: Applications/applications.js:101
78+msgid "SoundCloud"
79+msgstr "Hudební Cloud"
80+
81+#: Applications/applications.js:106
82+msgid "Wikipedia"
83+msgstr "Wikipedie"
84+
85+#: Applications/applications.js:111
86+msgid "YouTube"
87+msgstr "YouTube"
88+
89+#: Components/EdgeDemoOverlay.qml:149
90+msgid "Skip intro"
91+msgstr "Přeskočit intro"
92+
93+#: Components/EdgeDemo.qml:112
94+msgid "Right edge"
95+msgstr "Pravý okraj"
96+
97+#: Components/EdgeDemo.qml:113
98+msgid "Try swiping from the right edge to unlock the phone"
99+msgstr "Pokuste se odemknout telefon potažením prstu z pravého okraje."
100+
101+#: Components/EdgeDemo.qml:144
102+msgid "Top edge"
103+msgstr "Horní okraj"
104+
105+#: Components/EdgeDemo.qml:145
106+msgid "Try swiping from the top edge to access the indicators"
107+msgstr "Pokuste se zpřístupnit indikátory potažením prstu z horního okraje"
108+
109+#: Components/EdgeDemo.qml:170
110+msgid "Close"
111+msgstr "Uzavřít"
112+
113+#: Components/EdgeDemo.qml:171
114+msgid "Swipe up again to close the settings screen"
115+msgstr ""
116+
117+#: Components/EdgeDemo.qml:198
118+msgid "Left edge"
119+msgstr "Levý okraj"
120+
121+#: Components/EdgeDemo.qml:199
122+msgid "Swipe from the left to reveal the launcher for quick access to apps"
123+msgstr "Pro rychlý přístup k aplikacím potáhněte prst z levého okraje."
124+
125+#: Components/EdgeDemo.qml:226
126+msgid "Well done"
127+msgstr "Výborně"
128+
129+#: Components/EdgeDemo.qml:227
130+msgid ""
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
133+msgstr ""
134+
135+#: Components/PageHeader.qml:341
136+msgid "Recent searches"
137+msgstr "Poslední vyhledávání"
138+
139+#. TRANSLATORS: Number of persons who rated this app
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
142+#, qt-format
143+msgid "(%1)"
144+msgstr "(%1)"
145+
146+#. TRANSLATORS: Number of persons who wrote reviews for this app
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
149+#, qt-format
150+msgid "%1 review"
151+msgid_plural "%1 reviews"
152+msgstr[0] "%1 recenze"
153+msgstr[1] "%1 recenze"
154+msgstr[2] "%1 recenzí"
155+
156+#: Dash/Apps/AppPreview.qml:126
157+msgid "Rate this"
158+msgstr "Ohodnoťte to"
159+
160+#: Dash/Previews/Reviews.qml:74
161+msgid "Add a review"
162+msgstr "Přidat recenzi"
163+
164+#: Dash/Previews/Reviews.qml:86
165+msgid "Review"
166+msgstr "Recenze"
167+
168+#: Dash/Previews/Reviews.qml:121
169+msgid "Send"
170+msgstr "Odeslat"
171+
172+#: Dash/Previews/Reviews.qml:139
173+msgid "Comments:"
174+msgstr "Komentáře:"
175+
176+#: Greeter/Lockscreen.qml:142
177+msgid "Emergency Call"
178+msgstr "Tísňové volání"
179+
180+#: Greeter/PassphraseLockscreen.qml:59
181+#, qt-format
182+msgid "Hello %1"
183+msgstr "Ahoj %1"
184+
185+#: Greeter/PassphraseLockscreen.qml:59
186+msgid "Hello"
187+msgstr "Ahoj"
188+
189+#: Hud/HudParametrizedActionsPage.qml:132
190+msgid "Confirm"
191+msgstr "Potvrdit"
192+
193+#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
194+msgid "Type or say a command"
195+msgstr "Napište nebo řekněte příkaz"
196+
197+#: Hud/Hud.qml:84
198+msgid "Loading. Please Wait..."
199+msgstr "Načítám. Čekejte prosím..."
200+
201+#: Hud/Hud.qml:89
202+msgid "Speak Now..."
203+msgstr "Mluvte..."
204+
205+#: Hud/Hud.qml:94
206+msgid "Speaking..."
207+msgstr "Mluvte..."
208+
209+#: Panel/SearchIndicator.qml:27
210+msgid "Search"
211+msgstr "Hledat"
212+
213+#: plugins/Unity/scope.cpp:398
214+msgid "Sorry, there is nothing that matches your search."
215+msgstr "Je nám líto, ale nic neodpovídá zadání"
216+
217+#: plugins/Unity/showallfilteroption.cpp:41
218+msgid "All"
219+msgstr "Vše"
220+
221+#: Shell.qml:438
222+#, qt-format
223+msgid "Please enter %1"
224+msgstr "Zadejte prosím %1"
225+
226+#~ msgid "Featured"
227+#~ msgstr "Oblíbené"
228+
229+#~ msgid "Recent"
230+#~ msgstr "Nedávné"
231+
232+#~ msgid "Videos"
233+#~ msgstr "Videa"
234+
235+#~ msgid "Music"
236+#~ msgstr "Hudba"
237+
238+#~ msgid "Popular Online"
239+#~ msgstr "Oblíbené on-line"
po/de.po+73−84
@@ -7,16 +7,16 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
11−"PO-Revision-Date: 2013-06-27 00:37+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11+"PO-Revision-Date: 2013-10-06 10:57+0000\n"
12+"Last-Translator: SaGrLand <sg@samuel-greef.de>\n"
1313"Language-Team: German <de@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
2020
2121#: Applications/applications.js:23
2222msgid "Phone"
@@ -86,131 +86,95 @@ msgstr "Wikipedia"
8686msgid "YouTube"
8787msgstr "YouTube"
8888
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
9090msgid "Skip intro"
91−msgstr ""
91+msgstr "Überspringe Einführung"
9292
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
9494msgid "Right edge"
95−msgstr ""
95+msgstr "Rechter Rand"
9696
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
9898msgid "Try swiping from the right edge to unlock the phone"
9999msgstr ""
100100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102102msgid "Top edge"
103−msgstr ""
103+msgstr "Oberer Rand"
104104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106106msgid "Try swiping from the top edge to access the indicators"
107107msgstr ""
108108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110110msgid "Close"
111−msgstr ""
111+msgstr "Schließen"
112112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114114msgid "Swipe up again to close the settings screen"
115115msgstr ""
116116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118118msgid "Left edge"
119−msgstr ""
119+msgstr "Linker Rand"
120120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123123msgstr ""
124124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126126msgid "Well done"
127−msgstr ""
127+msgstr "Gut gemacht"
128128
129−#: Components/EdgeDemo.qml:218
130−msgid "You have now mastered the edge gestures and can start using the phone"
129+#: Components/EdgeDemo.qml:227
130+msgid ""
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131133msgstr ""
132134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134136msgid "Recent searches"
135137msgstr "Letzte Suchbegriffe"
136138
137139#. TRANSLATORS: Number of persons who rated this app
138−#: Dash/Apps/AppInfo.qml:73
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139142#, qt-format
140143msgid "(%1)"
141−msgstr ""
144+msgstr "(%1)"
142145
143146#. TRANSLATORS: Number of persons who wrote reviews for this app
144−#: Dash/Apps/AppInfo.qml:85
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145149#, qt-format
146150msgid "%1 review"
147151msgid_plural "%1 reviews"
148−msgstr[0] ""
149−msgstr[1] ""
152+msgstr[0] "%1 Bewertung"
153+msgstr[1] "%1 Bewertungen"
150154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152156msgid "Rate this"
153−msgstr ""
157+msgstr "Bewerten"
154158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156160msgid "Add a review"
157−msgstr ""
161+msgstr "Bewertung hinzufügen"
158162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160164msgid "Review"
161−msgstr ""
165+msgstr "Bewertung"
162166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164168msgid "Send"
165−msgstr ""
169+msgstr "Senden"
166170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168172msgid "Comments:"
169−msgstr ""
170−
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr "Empfehlungen"
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr "Zuletzt verwendet"
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr "Neue Veröffentlichungen"
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr "Top Tabellenplatz"
173+msgstr "Kommentare:"
186174
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Musik"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr "Online Beliebt"
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Videos"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr "Regie:"
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr "Darsteller:"
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr "Autor:"
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212176msgid "Emergency Call"
213−msgstr ""
177+msgstr "Notruf"
214178
215179#: Greeter/PassphraseLockscreen.qml:59
216180#, qt-format
@@ -245,11 +209,36 @@ msgstr "Sie sprechen …"
245209msgid "Search"
246210msgstr "Suchen"
247211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249213msgid "Sorry, there is nothing that matches your search."
250214msgstr "Entschuldigung, es wurden keine Treffer erzielt."
251215
252−#: Shell.qml:429
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr "Alle"
219+
220+#: Shell.qml:438
253221#, qt-format
254222msgid "Please enter %1"
255−msgstr ""
223+msgstr "Bitte geben Sie %1 ein"
224+
225+#~ msgid "Featured"
226+#~ msgstr "Empfehlungen"
227+
228+#~ msgid "Recent"
229+#~ msgstr "Zuletzt verwendet"
230+
231+#~ msgid "New Releases"
232+#~ msgstr "Neue Veröffentlichungen"
233+
234+#~ msgid "Top Charting"
235+#~ msgstr "Top Tabellenplatz"
236+
237+#~ msgid "Music"
238+#~ msgstr "Musik"
239+
240+#~ msgid "Popular Online"
241+#~ msgstr "Online Beliebt"
242+
243+#~ msgid "Videos"
244+#~ msgstr "Videos"
po/el.po+40−66
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
1111"PO-Revision-Date: 2013-06-27 00:53+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Greek <el@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
2020
2121#: Applications/applications.js:23
2222msgid "Phone"
@@ -86,129 +86,93 @@ msgstr ""
8686msgid "YouTube"
8787msgstr ""
8888
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
9090msgid "Skip intro"
9191msgstr ""
9292
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
9494msgid "Right edge"
9595msgstr ""
9696
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
9898msgid "Try swiping from the right edge to unlock the phone"
9999msgstr ""
100100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102102msgid "Top edge"
103103msgstr ""
104104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106106msgid "Try swiping from the top edge to access the indicators"
107107msgstr ""
108108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110110msgid "Close"
111111msgstr ""
112112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114114msgid "Swipe up again to close the settings screen"
115115msgstr ""
116116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118118msgid "Left edge"
119119msgstr ""
120120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123123msgstr ""
124124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126126msgid "Well done"
127127msgstr ""
128128
129−#: Components/EdgeDemo.qml:218
130−msgid "You have now mastered the edge gestures and can start using the phone"
129+#: Components/EdgeDemo.qml:227
130+msgid ""
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131133msgstr ""
132134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134136msgid "Recent searches"
135137msgstr "Πρόσφατες αναζητήσεις"
136138
137139#. TRANSLATORS: Number of persons who rated this app
138−#: Dash/Apps/AppInfo.qml:73
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139142#, qt-format
140143msgid "(%1)"
141144msgstr ""
142145
143146#. TRANSLATORS: Number of persons who wrote reviews for this app
144−#: Dash/Apps/AppInfo.qml:85
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145149#, qt-format
146150msgid "%1 review"
147151msgid_plural "%1 reviews"
148152msgstr[0] ""
149153msgstr[1] ""
150154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152156msgid "Rate this"
153157msgstr ""
154158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156160msgid "Add a review"
157161msgstr ""
158162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160164msgid "Review"
161165msgstr ""
162166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164168msgid "Send"
165169msgstr ""
166170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168172msgid "Comments:"
169173msgstr ""
170174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Μουσική"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Βίντεο"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212176msgid "Emergency Call"
213177msgstr ""
214178
@@ -245,11 +209,21 @@ msgstr "Ομιλία..."
245209msgid "Search"
246210msgstr "Αναζήτηση"
247211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249213msgid "Sorry, there is nothing that matches your search."
250214msgstr "Λυπούμαστε, δεν υπάρχει τίποτα που να ταιριάζει στην αναζήτησή σας."
251215
252−#: Shell.qml:429
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
220+#: Shell.qml:438
253221#, qt-format
254222msgid "Please enter %1"
255223msgstr ""
224+
225+#~ msgid "Music"
226+#~ msgstr "Μουσική"
227+
228+#~ msgid "Videos"
229+#~ msgstr "Βίντεο"
po/en_AU.po+79−90
@@ -7,16 +7,16 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
11−"PO-Revision-Date: 2013-06-27 01:13+0000\n"
12−"Last-Translator: Jackson Doak <Doak.jackson@gmail.com>\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11+"PO-Revision-Date: 2013-09-28 07:46+0000\n"
12+"Last-Translator: Jared Norris <jarednorris@ubuntu.com>\n"
1313"Language-Team: English (Australia) <en_AU@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
2020
2121#: Applications/applications.js:23
2222msgid "Phone"
@@ -86,140 +86,104 @@ msgstr "Wikipedia"
8686msgid "YouTube"
8787msgstr "YouTube"
8888
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
9090msgid "Skip intro"
91−msgstr ""
91+msgstr "Skip intro"
9292
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
9494msgid "Right edge"
95−msgstr ""
95+msgstr "Right edge"
9696
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
9898msgid "Try swiping from the right edge to unlock the phone"
99−msgstr ""
99+msgstr "Try swiping from the right edge to unlock the phone"
100100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102102msgid "Top edge"
103−msgstr ""
103+msgstr "Top edge"
104104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106106msgid "Try swiping from the top edge to access the indicators"
107−msgstr ""
107+msgstr "Try swiping from the top edge to access the indicators"
108108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110110msgid "Close"
111−msgstr ""
111+msgstr "Close"
112112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114114msgid "Swipe up again to close the settings screen"
115−msgstr ""
115+msgstr "Swipe up again to close the settings screen"
116116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118118msgid "Left edge"
119−msgstr ""
119+msgstr "Left edge"
120120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123−msgstr ""
123+msgstr "Swipe from the left to reveal the launcher for quick access to apps"
124124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126126msgid "Well done"
127−msgstr ""
127+msgstr "Well done"
128128
129−#: Components/EdgeDemo.qml:218
130−msgid "You have now mastered the edge gestures and can start using the phone"
129+#: Components/EdgeDemo.qml:227
130+msgid ""
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131133msgstr ""
132134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134136msgid "Recent searches"
135137msgstr "Recent searches"
136138
137139#. TRANSLATORS: Number of persons who rated this app
138−#: Dash/Apps/AppInfo.qml:73
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139142#, qt-format
140143msgid "(%1)"
141−msgstr ""
144+msgstr "(%1)"
142145
143146#. TRANSLATORS: Number of persons who wrote reviews for this app
144−#: Dash/Apps/AppInfo.qml:85
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145149#, qt-format
146150msgid "%1 review"
147151msgid_plural "%1 reviews"
148−msgstr[0] ""
149−msgstr[1] ""
152+msgstr[0] "%1 review"
153+msgstr[1] "%1 reviews"
150154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152156msgid "Rate this"
153−msgstr ""
157+msgstr "Rate this"
154158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156160msgid "Add a review"
157−msgstr ""
161+msgstr "Add a review"
158162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160164msgid "Review"
161−msgstr ""
165+msgstr "Review"
162166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164168msgid "Send"
165−msgstr ""
169+msgstr "Send"
166170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168172msgid "Comments:"
169−msgstr ""
170−
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr "Featured"
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr "Recent"
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr "New Releases"
173+msgstr "Comments:"
182174
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr "Top Charting"
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Music"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr "Popular Online"
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Videos"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr "Directed by:"
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr "Starring:"
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr "Author:"
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212176msgid "Emergency Call"
213−msgstr ""
177+msgstr "Emergency Call"
214178
215179#: Greeter/PassphraseLockscreen.qml:59
216180#, qt-format
217181msgid "Hello %1"
218−msgstr ""
182+msgstr "Hello %1"
219183
220184#: Greeter/PassphraseLockscreen.qml:59
221185msgid "Hello"
222−msgstr ""
186+msgstr "Hello"
223187
224188#: Hud/HudParametrizedActionsPage.qml:132
225189msgid "Confirm"
@@ -245,11 +209,36 @@ msgstr "Speaking..."
245209msgid "Search"
246210msgstr "Search"
247211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249213msgid "Sorry, there is nothing that matches your search."
250214msgstr "Sorry, there is nothing that matches your search."
251215
252−#: Shell.qml:429
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
220+#: Shell.qml:438
253221#, qt-format
254222msgid "Please enter %1"
255−msgstr ""
223+msgstr "Please enter %1"
224+
225+#~ msgid "Featured"
226+#~ msgstr "Featured"
227+
228+#~ msgid "Recent"
229+#~ msgstr "Recent"
230+
231+#~ msgid "New Releases"
232+#~ msgstr "New Releases"
233+
234+#~ msgid "Top Charting"
235+#~ msgstr "Top Charting"
236+
237+#~ msgid "Music"
238+#~ msgstr "Music"
239+
240+#~ msgid "Popular Online"
241+#~ msgstr "Popular Online"
242+
243+#~ msgid "Videos"
244+#~ msgstr "Videos"
po/en_GB.po+55−66
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
1111"PO-Revision-Date: 2013-06-27 08:53+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
2020
2121#: Applications/applications.js:23
2222msgid "Phone"
@@ -86,129 +86,93 @@ msgstr "Wikipedia"
8686msgid "YouTube"
8787msgstr "YouTube"
8888
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
9090msgid "Skip intro"
9191msgstr ""
9292
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
9494msgid "Right edge"
9595msgstr ""
9696
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
9898msgid "Try swiping from the right edge to unlock the phone"
9999msgstr ""
100100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102102msgid "Top edge"
103103msgstr ""
104104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106106msgid "Try swiping from the top edge to access the indicators"
107107msgstr ""
108108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110110msgid "Close"
111111msgstr ""
112112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114114msgid "Swipe up again to close the settings screen"
115115msgstr ""
116116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118118msgid "Left edge"
119119msgstr ""
120120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123123msgstr ""
124124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126126msgid "Well done"
127127msgstr ""
128128
129−#: Components/EdgeDemo.qml:218
130−msgid "You have now mastered the edge gestures and can start using the phone"
129+#: Components/EdgeDemo.qml:227
130+msgid ""
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131133msgstr ""
132134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134136msgid "Recent searches"
135137msgstr "Recent searches"
136138
137139#. TRANSLATORS: Number of persons who rated this app
138−#: Dash/Apps/AppInfo.qml:73
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139142#, qt-format
140143msgid "(%1)"
141144msgstr ""
142145
143146#. TRANSLATORS: Number of persons who wrote reviews for this app
144−#: Dash/Apps/AppInfo.qml:85
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145149#, qt-format
146150msgid "%1 review"
147151msgid_plural "%1 reviews"
148152msgstr[0] ""
149153msgstr[1] ""
150154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152156msgid "Rate this"
153157msgstr ""
154158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156160msgid "Add a review"
157161msgstr ""
158162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160164msgid "Review"
161165msgstr ""
162166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164168msgid "Send"
165169msgstr ""
166170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168172msgid "Comments:"
169173msgstr ""
170174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr "Featured"
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr "Recent"
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr "New Releases"
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr "Top Charting"
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Music"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr "Popular Online"
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Videos"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr "Directed by:"
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr "Starring:"
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr "Author:"
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212176msgid "Emergency Call"
213177msgstr ""
214178
@@ -245,11 +209,36 @@ msgstr "Speaking..."
245209msgid "Search"
246210msgstr "Search"
247211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249213msgid "Sorry, there is nothing that matches your search."
250214msgstr "Sorry, there is nothing that matches your search."
251215
252−#: Shell.qml:429
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
220+#: Shell.qml:438
253221#, qt-format
254222msgid "Please enter %1"
255223msgstr "Please enter %1"
224+
225+#~ msgid "Featured"
226+#~ msgstr "Featured"
227+
228+#~ msgid "Recent"
229+#~ msgstr "Recent"
230+
231+#~ msgid "New Releases"
232+#~ msgstr "New Releases"
233+
234+#~ msgid "Top Charting"
235+#~ msgstr "Top Charting"
236+
237+#~ msgid "Music"
238+#~ msgstr "Music"
239+
240+#~ msgid "Popular Online"
241+#~ msgstr "Popular Online"
242+
243+#~ msgid "Videos"
244+#~ msgstr "Videos"
po/eo.po+34−66
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
1111"PO-Revision-Date: 2013-06-26 22:35+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Esperanto <eo@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
2020
2121#: Applications/applications.js:23
2222msgid "Phone"
@@ -86,129 +86,93 @@ msgstr ""
8686msgid "YouTube"
8787msgstr ""
8888
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
9090msgid "Skip intro"
9191msgstr ""
9292
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
9494msgid "Right edge"
9595msgstr ""
9696
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
9898msgid "Try swiping from the right edge to unlock the phone"
9999msgstr ""
100100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102102msgid "Top edge"
103103msgstr ""
104104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106106msgid "Try swiping from the top edge to access the indicators"
107107msgstr ""
108108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110110msgid "Close"
111111msgstr ""
112112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114114msgid "Swipe up again to close the settings screen"
115115msgstr ""
116116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118118msgid "Left edge"
119119msgstr ""
120120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123123msgstr ""
124124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126126msgid "Well done"
127127msgstr ""
128128
129−#: Components/EdgeDemo.qml:218
130−msgid "You have now mastered the edge gestures and can start using the phone"
129+#: Components/EdgeDemo.qml:227
130+msgid ""
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131133msgstr ""
132134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134136msgid "Recent searches"
135137msgstr ""
136138
137139#. TRANSLATORS: Number of persons who rated this app
138−#: Dash/Apps/AppInfo.qml:73
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139142#, qt-format
140143msgid "(%1)"
141144msgstr ""
142145
143146#. TRANSLATORS: Number of persons who wrote reviews for this app
144−#: Dash/Apps/AppInfo.qml:85
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145149#, qt-format
146150msgid "%1 review"
147151msgid_plural "%1 reviews"
148152msgstr[0] ""
149153msgstr[1] ""
150154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152156msgid "Rate this"
153157msgstr ""
154158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156160msgid "Add a review"
157161msgstr ""
158162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160164msgid "Review"
161165msgstr ""
162166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164168msgid "Send"
165169msgstr ""
166170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168172msgid "Comments:"
169173msgstr ""
170174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr ""
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr ""
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212176msgid "Emergency Call"
213177msgstr ""
214178
@@ -245,11 +209,15 @@ msgstr ""
245209msgid "Search"
246210msgstr ""
247211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249213msgid "Sorry, there is nothing that matches your search."
250214msgstr ""
251215
252−#: Shell.qml:429
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
220+#: Shell.qml:438
253221#, qt-format
254222msgid "Please enter %1"
255223msgstr ""
po/es.po+60−69
@@ -7,16 +7,16 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
11−"PO-Revision-Date: 2013-09-04 22:12+0000\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11+"PO-Revision-Date: 2013-10-02 04:59+0000\n"
1212"Last-Translator: Adolfo Jayme Barrientos <fitoschido@gmail.com>\n"
1313"Language-Team: Spanish <es@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-09-05 05:35+0000\n"
19−"X-Generator: Launchpad (build 16758)\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
2020
2121#: Applications/applications.js:23
2222msgid "Phone"
@@ -48,7 +48,7 @@ msgstr "GMail"
4848
4949#: Applications/applications.js:62
5050msgid "Weather"
51−msgstr "Metereología"
51+msgstr "Meteorología"
5252
5353#: Applications/applications.js:68
5454msgid "Notepad"
@@ -86,131 +86,97 @@ msgstr "Wikipedia"
8686msgid "YouTube"
8787msgstr "YouTube"
8888
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
9090msgid "Skip intro"
9191msgstr "Omitir la introducción"
9292
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
9494msgid "Right edge"
9595msgstr "Borde derecho"
9696
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
9898msgid "Try swiping from the right edge to unlock the phone"
9999msgstr "Deslice el dedo desde el borde derecho para desbloquear el teléfono"
100100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102102msgid "Top edge"
103103msgstr "Borde superior"
104104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106106msgid "Try swiping from the top edge to access the indicators"
107107msgstr "Deslice el dedo desde el borde superior para acceder a los menús"
108108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110110msgid "Close"
111111msgstr "Cerrar"
112112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114114msgid "Swipe up again to close the settings screen"
115115msgstr "Deslice hacia arriba para cerrar la pantalla de configuración"
116116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118118msgid "Left edge"
119119msgstr "Borde izquierdo"
120120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123123msgstr ""
124124"Deslice el dedo desde la izquierda para mostrar el lanzador y acceder "
125125"rápidamente a las aplicaciones"
126126
127−#: Components/EdgeDemo.qml:217
127+#: Components/EdgeDemo.qml:226
128128msgid "Well done"
129129msgstr "Bien hecho"
130130
131−#: Components/EdgeDemo.qml:218
132−msgid "You have now mastered the edge gestures and can start using the phone"
133−msgstr "Ahora domina el uso de gestos de los bordes. Puede usar el teléfono"
131+#: Components/EdgeDemo.qml:227
132+msgid ""
133+"You have now mastered the edge gestures and can start using the "
134+"phone<br><br>Tap anywhere to start"
135+msgstr ""
136+"Ahora domina los gestos de bordes y puede usar el teléfono<br><br>Toque la "
137+"pantalla para comenzar"
134138
135−#: Components/PageHeader.qml:298
139+#: Components/PageHeader.qml:341
136140msgid "Recent searches"
137141msgstr "Búsquedas recientes"
138142
139143#. TRANSLATORS: Number of persons who rated this app
140−#: Dash/Apps/AppInfo.qml:73
144+#. TRANSLATORS: Number of persons who rated this app/video/whatever
145+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
141146#, qt-format
142147msgid "(%1)"
143148msgstr "(%1)"
144149
145150#. TRANSLATORS: Number of persons who wrote reviews for this app
146−#: Dash/Apps/AppInfo.qml:85
151+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
152+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
147153#, qt-format
148154msgid "%1 review"
149155msgid_plural "%1 reviews"
150156msgstr[0] "%1 reseña"
151157msgstr[1] "%1 reseñas"
152158
153−#: Dash/Apps/AppPreview.qml:175
159+#: Dash/Apps/AppPreview.qml:126
154160msgid "Rate this"
155161msgstr "Valorar esto"
156162
157−#: Dash/Apps/AppReviews.qml:72
163+#: Dash/Previews/Reviews.qml:74
158164msgid "Add a review"
159165msgstr "Añadir una reseña"
160166
161−#: Dash/Apps/AppReviews.qml:84
167+#: Dash/Previews/Reviews.qml:86
162168msgid "Review"
163169msgstr "Reseñar"
164170
165−#: Dash/Apps/AppReviews.qml:118
171+#: Dash/Previews/Reviews.qml:121
166172msgid "Send"
167173msgstr "Enviar"
168174
169−#: Dash/Apps/AppReviews.qml:136
175+#: Dash/Previews/Reviews.qml:139
170176msgid "Comments:"
171177msgstr "Comentarios:"
172178
173−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
174−msgid "Featured"
175−msgstr "Destacados"
176−
177−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
178−msgid "Recent"
179−msgstr "Recientes"
180−
181−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
182−msgid "New Releases"
183−msgstr "Lanzamientos nuevos"
184−
185−#: Dash/DashMusic.qml:30
186−msgid "Top Charting"
187−msgstr "Mejor posicionadas"
188−
189−#: Dash/DashMusic.qml:91
190−msgid "Music"
191−msgstr "Música"
192−
193−#: Dash/DashVideos.qml:31
194−msgid "Popular Online"
195−msgstr "Populares en línea"
196−
197−#: Dash/DashVideos.qml:146
198−msgid "Videos"
199−msgstr "Vídeos"
200−
201−#: Dash/Video/VideoPreview.qml:130
202−msgid "Directed by:"
203−msgstr "Dirigida por:"
204−
205−#: Dash/Video/VideoPreview.qml:153
206−msgid "Starring:"
207−msgstr "Protagonistas:"
208−
209−#: Dash/Video/VideoPreview.qml:176
210−msgid "Author:"
211−msgstr "Autor:"
212−
213−#: Greeter/Lockscreen.qml:134
179+#: Greeter/Lockscreen.qml:142
214180msgid "Emergency Call"
215181msgstr "Llamada de emergencia"
216182
@@ -247,11 +213,36 @@ msgstr "Hablando…"
247213msgid "Search"
248214msgstr "Buscar"
249215
250−#: plugins/Unity/scope.cpp:317
216+#: plugins/Unity/scope.cpp:398
251217msgid "Sorry, there is nothing that matches your search."
252218msgstr "No hay nada que coincida con su búsqueda."
253219
254−#: Shell.qml:429
220+#: plugins/Unity/showallfilteroption.cpp:41
221+msgid "All"
222+msgstr "Todo"
223+
224+#: Shell.qml:438
255225#, qt-format
256226msgid "Please enter %1"
257227msgstr "Introduzca %1"
228+
229+#~ msgid "Featured"
230+#~ msgstr "Destacados"
231+
232+#~ msgid "Recent"
233+#~ msgstr "Recientes"
234+
235+#~ msgid "New Releases"
236+#~ msgstr "Lanzamientos nuevos"
237+
238+#~ msgid "Top Charting"
239+#~ msgstr "Mejor posicionadas"
240+
241+#~ msgid "Music"
242+#~ msgstr "Música"
243+
244+#~ msgid "Popular Online"
245+#~ msgstr "Populares en línea"
246+
247+#~ msgid "Videos"
248+#~ msgstr "Vídeos"
po/fi.po+69−78
@@ -7,16 +7,16 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
11−"PO-Revision-Date: 2013-08-23 16:15+0000\n"
12−"Last-Translator: Timo Jyrinki <timo.jyrinki@canonical.com>\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11+"PO-Revision-Date: 2013-10-03 09:21+0000\n"
12+"Last-Translator: Jiri Grönroos <Unknown>\n"
1313"Language-Team: Finnish <fi@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
2020
2121#: Applications/applications.js:23
2222msgid "Phone"
@@ -86,129 +86,95 @@ msgstr "Wikipedia"
8686msgid "YouTube"
8787msgstr "YouTube"
8888
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
9090msgid "Skip intro"
91−msgstr ""
91+msgstr "Ohita esittely"
9292
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
9494msgid "Right edge"
95−msgstr ""
95+msgstr "Oikea reuna"
9696
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
9898msgid "Try swiping from the right edge to unlock the phone"
99−msgstr ""
99+msgstr "Vedä oikealta avataksesi puhelimen lukituksen"
100100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102102msgid "Top edge"
103−msgstr ""
103+msgstr "Yläreuna"
104104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106106msgid "Try swiping from the top edge to access the indicators"
107−msgstr ""
107+msgstr "Vedä yläreunasta käyttääksesi ilmaisimia"
108108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110110msgid "Close"
111−msgstr ""
111+msgstr "Sulje"
112112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114114msgid "Swipe up again to close the settings screen"
115−msgstr ""
115+msgstr "Vedä uudestaan sulkeaksesi asetusnäkymän"
116116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118118msgid "Left edge"
119−msgstr ""
119+msgstr "Vasen reuna"
120120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123−msgstr ""
123+msgstr "Vedä vasemmalta saattaaksesi sovellusten käynnistimen esiin"
124124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126126msgid "Well done"
127−msgstr ""
127+msgstr "Hyvin tehty"
128128
129−#: Components/EdgeDemo.qml:218
130−msgid "You have now mastered the edge gestures and can start using the phone"
129+#: Components/EdgeDemo.qml:227
130+msgid ""
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131133msgstr ""
134+"Hallitset nyt reunaeleet, joten voit aloittaa puhelimen "
135+"käytön<br><br>Napauta missä tahansa aloittaaksesi"
132136
133−#: Components/PageHeader.qml:298
137+#: Components/PageHeader.qml:341
134138msgid "Recent searches"
135139msgstr "Viimeisimmät haut"
136140
137141#. TRANSLATORS: Number of persons who rated this app
138−#: Dash/Apps/AppInfo.qml:73
142+#. TRANSLATORS: Number of persons who rated this app/video/whatever
143+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139144#, qt-format
140145msgid "(%1)"
141146msgstr "(%1)"
142147
143148#. TRANSLATORS: Number of persons who wrote reviews for this app
144−#: Dash/Apps/AppInfo.qml:85
149+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
150+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145151#, qt-format
146152msgid "%1 review"
147153msgid_plural "%1 reviews"
148154msgstr[0] "%1 arvostelu"
149155msgstr[1] "%1 arvostelua"
150156
151−#: Dash/Apps/AppPreview.qml:175
157+#: Dash/Apps/AppPreview.qml:126
152158msgid "Rate this"
153159msgstr "Arvioi tämä"
154160
155−#: Dash/Apps/AppReviews.qml:72
161+#: Dash/Previews/Reviews.qml:74
156162msgid "Add a review"
157163msgstr "Lisää arvostelu"
158164
159−#: Dash/Apps/AppReviews.qml:84
165+#: Dash/Previews/Reviews.qml:86
160166msgid "Review"
161167msgstr "Arvostelu"
162168
163−#: Dash/Apps/AppReviews.qml:118
169+#: Dash/Previews/Reviews.qml:121
164170msgid "Send"
165171msgstr "Lähetä"
166172
167−#: Dash/Apps/AppReviews.qml:136
173+#: Dash/Previews/Reviews.qml:139
168174msgid "Comments:"
169175msgstr "Kommentit:"
170176
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr "Suositellut"
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr "Viimeisimmät"
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr "Uudet julkaisut"
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr "Nousukiidossa"
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Musiikki"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr "Suosittua verkossa"
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Videot"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr "Ohjannut:"
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr "Pääosissa:"
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr "Tekijä:"
210−
211−#: Greeter/Lockscreen.qml:134
177+#: Greeter/Lockscreen.qml:142
212178msgid "Emergency Call"
213179msgstr "Hätäpuhelu"
214180
@@ -245,11 +211,36 @@ msgstr "Puhutaan..."
245211msgid "Search"
246212msgstr "Hae"
247213
248−#: plugins/Unity/scope.cpp:317
214+#: plugins/Unity/scope.cpp:398
249215msgid "Sorry, there is nothing that matches your search."
250216msgstr "Hakuun täsmääviä tuloksia ei löydy."
251217
252−#: Shell.qml:429
218+#: plugins/Unity/showallfilteroption.cpp:41
219+msgid "All"
220+msgstr "Kaikki"
221+
222+#: Shell.qml:438
253223#, qt-format
254224msgid "Please enter %1"
255225msgstr "Kirjoita %1"
226+
227+#~ msgid "Featured"
228+#~ msgstr "Suositellut"
229+
230+#~ msgid "Recent"
231+#~ msgstr "Viimeisimmät"
232+
233+#~ msgid "New Releases"
234+#~ msgstr "Uudet julkaisut"
235+
236+#~ msgid "Top Charting"
237+#~ msgstr "Nousukiidossa"
238+
239+#~ msgid "Music"
240+#~ msgstr "Musiikki"
241+
242+#~ msgid "Popular Online"
243+#~ msgstr "Suosittua verkossa"
244+
245+#~ msgid "Videos"
246+#~ msgstr "Videot"
po/fo.po+52−78
@@ -7,56 +7,56 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
11−"PO-Revision-Date: 2013-06-27 02:57+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11+"PO-Revision-Date: 2013-10-01 15:13+0000\n"
12+"Last-Translator: Jógvan Olsen <jeggy@jebster.net>\n"
1313"Language-Team: Faroese <fo@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
2020
2121#: Applications/applications.js:23
2222msgid "Phone"
23−msgstr ""
23+msgstr "Fartelefon"
2424
2525#: Applications/applications.js:29
2626msgid "Camera"
27−msgstr ""
27+msgstr "Myndatól"
2828
2929#: Applications/applications.js:35
3030msgid "Gallery"
31−msgstr ""
31+msgstr "Myndasavn"
3232
3333#: Applications/applications.js:40
3434msgid "Facebook"
35−msgstr ""
35+msgstr "Facebook"
3636
3737#: Applications/applications.js:46
3838msgid "Browser"
39−msgstr ""
39+msgstr "Kagi"
4040
4141#: Applications/applications.js:51
4242msgid "Twitter"
43−msgstr ""
43+msgstr "Twitter"
4444
4545#: Applications/applications.js:57
4646msgid "GMail"
47−msgstr ""
47+msgstr "GMail"
4848
4949#: Applications/applications.js:62
5050msgid "Weather"
51−msgstr ""
51+msgstr "Veðrið"
5252
5353#: Applications/applications.js:68
5454msgid "Notepad"
55−msgstr ""
55+msgstr "Skriviblokkur"
5656
5757#: Applications/applications.js:74
5858msgid "Calendar"
59−msgstr ""
59+msgstr "Kalendari"
6060
6161#: Applications/applications.js:80
6262msgid "Media Player"
@@ -86,129 +86,93 @@ msgstr ""
8686msgid "YouTube"
8787msgstr ""
8888
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
9090msgid "Skip intro"
9191msgstr ""
9292
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
9494msgid "Right edge"
9595msgstr ""
9696
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
9898msgid "Try swiping from the right edge to unlock the phone"
9999msgstr ""
100100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102102msgid "Top edge"
103103msgstr ""
104104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106106msgid "Try swiping from the top edge to access the indicators"
107107msgstr ""
108108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110110msgid "Close"
111111msgstr ""
112112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114114msgid "Swipe up again to close the settings screen"
115115msgstr ""
116116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118118msgid "Left edge"
119119msgstr ""
120120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123123msgstr ""
124124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126126msgid "Well done"
127127msgstr ""
128128
129−#: Components/EdgeDemo.qml:218
130−msgid "You have now mastered the edge gestures and can start using the phone"
129+#: Components/EdgeDemo.qml:227
130+msgid ""
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131133msgstr ""
132134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134136msgid "Recent searches"
135137msgstr ""
136138
137139#. TRANSLATORS: Number of persons who rated this app
138−#: Dash/Apps/AppInfo.qml:73
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139142#, qt-format
140143msgid "(%1)"
141144msgstr ""
142145
143146#. TRANSLATORS: Number of persons who wrote reviews for this app
144−#: Dash/Apps/AppInfo.qml:85
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145149#, qt-format
146150msgid "%1 review"
147151msgid_plural "%1 reviews"
148152msgstr[0] ""
149153msgstr[1] ""
150154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152156msgid "Rate this"
153157msgstr ""
154158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156160msgid "Add a review"
157161msgstr ""
158162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160164msgid "Review"
161165msgstr ""
162166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164168msgid "Send"
165169msgstr ""
166170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168172msgid "Comments:"
169173msgstr ""
170174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Tónleikur"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Sjónbond"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212176msgid "Emergency Call"
213177msgstr ""
214178
@@ -245,11 +209,21 @@ msgstr "Snakkar..."
245209msgid "Search"
246210msgstr "Leita"
247211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249213msgid "Sorry, there is nothing that matches your search."
250214msgstr "Tíanverri er tað einki sum hóskar til tína leiting."
251215
252−#: Shell.qml:429
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
220+#: Shell.qml:438
253221#, qt-format
254222msgid "Please enter %1"
255223msgstr ""
224+
225+#~ msgid "Music"
226+#~ msgstr "Tónleikur"
227+
228+#~ msgid "Videos"
229+#~ msgstr "Sjónbond"
po/fr.po+40−66
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
1111"PO-Revision-Date: 2013-06-27 03:21+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: French <fr@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
2020
2121#: Applications/applications.js:23
2222msgid "Phone"
@@ -86,129 +86,93 @@ msgstr ""
8686msgid "YouTube"
8787msgstr ""
8888
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
9090msgid "Skip intro"
9191msgstr ""
9292
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
9494msgid "Right edge"
9595msgstr ""
9696
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
9898msgid "Try swiping from the right edge to unlock the phone"
9999msgstr ""
100100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102102msgid "Top edge"
103103msgstr ""
104104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106106msgid "Try swiping from the top edge to access the indicators"
107107msgstr ""
108108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110110msgid "Close"
111111msgstr ""
112112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114114msgid "Swipe up again to close the settings screen"
115115msgstr ""
116116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118118msgid "Left edge"
119119msgstr ""
120120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123123msgstr ""
124124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126126msgid "Well done"
127127msgstr ""
128128
129−#: Components/EdgeDemo.qml:218
130−msgid "You have now mastered the edge gestures and can start using the phone"
129+#: Components/EdgeDemo.qml:227
130+msgid ""
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131133msgstr ""
132134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134136msgid "Recent searches"
135137msgstr ""
136138
137139#. TRANSLATORS: Number of persons who rated this app
138−#: Dash/Apps/AppInfo.qml:73
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139142#, qt-format
140143msgid "(%1)"
141144msgstr ""
142145
143146#. TRANSLATORS: Number of persons who wrote reviews for this app
144−#: Dash/Apps/AppInfo.qml:85
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145149#, qt-format
146150msgid "%1 review"
147151msgid_plural "%1 reviews"
148152msgstr[0] ""
149153msgstr[1] ""
150154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152156msgid "Rate this"
153157msgstr ""
154158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156160msgid "Add a review"
157161msgstr ""
158162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160164msgid "Review"
161165msgstr ""
162166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164168msgid "Send"
165169msgstr ""
166170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168172msgid "Comments:"
169173msgstr ""
170174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Musique"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Vidéos"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212176msgid "Emergency Call"
213177msgstr ""
214178
@@ -245,11 +209,21 @@ msgstr ""
245209msgid "Search"
246210msgstr ""
247211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249213msgid "Sorry, there is nothing that matches your search."
250214msgstr ""
251215
252−#: Shell.qml:429
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
220+#: Shell.qml:438
253221#, qt-format
254222msgid "Please enter %1"
255223msgstr ""
224+
225+#~ msgid "Music"
226+#~ msgstr "Musique"
227+
228+#~ msgid "Videos"
229+#~ msgstr "Vidéos"
po/gd.ponew file+253
@@ -0,0 +1,253 @@
1+# Gaelic; Scottish translation for unity8
2+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11+"PO-Revision-Date: 2013-09-30 10:34+0000\n"
12+"Last-Translator: Akerbeltz <fios@akerbeltz.org>\n"
13+"Language-Team: Gaelic; Scottish <gd@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
18+"(n > 2 && n < 20) ? 2 : 3;\n"
19+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
20+"X-Generator: Launchpad (build 16799)\n"
21+
22+#: Applications/applications.js:23
23+msgid "Phone"
24+msgstr "Fòn"
25+
26+#: Applications/applications.js:29
27+msgid "Camera"
28+msgstr "Camara"
29+
30+#: Applications/applications.js:35
31+msgid "Gallery"
32+msgstr "Gailearaidh"
33+
34+#: Applications/applications.js:40
35+msgid "Facebook"
36+msgstr "Facebook"
37+
38+#: Applications/applications.js:46
39+msgid "Browser"
40+msgstr "Brabhsair"
41+
42+#: Applications/applications.js:51
43+msgid "Twitter"
44+msgstr "Twitter"
45+
46+#: Applications/applications.js:57
47+msgid "GMail"
48+msgstr "GMail"
49+
50+#: Applications/applications.js:62
51+msgid "Weather"
52+msgstr "An aimsir"
53+
54+#: Applications/applications.js:68
55+msgid "Notepad"
56+msgstr "Pada nan nòtaichean"
57+
58+#: Applications/applications.js:74
59+msgid "Calendar"
60+msgstr "Am mìosachan"
61+
62+#: Applications/applications.js:80
63+msgid "Media Player"
64+msgstr "Cluicheadair mheadhanan"
65+
66+#: Applications/applications.js:86
67+msgid "Evernote"
68+msgstr "Evernote"
69+
70+#: Applications/applications.js:91
71+msgid "Map"
72+msgstr "Mapa"
73+
74+#: Applications/applications.js:96
75+msgid "Pinterest"
76+msgstr "Pinterest"
77+
78+#: Applications/applications.js:101
79+msgid "SoundCloud"
80+msgstr "SoundCloud"
81+
82+#: Applications/applications.js:106
83+msgid "Wikipedia"
84+msgstr "An Uicipeid"
85+
86+#: Applications/applications.js:111
87+msgid "YouTube"
88+msgstr "YouTube"
89+
90+#: Components/EdgeDemoOverlay.qml:149
91+msgid "Skip intro"
92+msgstr "Gearr leum thairis air an ro-ràdh"
93+
94+#: Components/EdgeDemo.qml:112
95+msgid "Right edge"
96+msgstr "An oir dheas"
97+
98+#: Components/EdgeDemo.qml:113
99+msgid "Try swiping from the right edge to unlock the phone"
100+msgstr ""
101+"Feuch is dèan grad-shlaighdeadh a-steach on oir dheas gus a' ghlas a thoirt "
102+"far an fhòn"
103+
104+#: Components/EdgeDemo.qml:144
105+msgid "Top edge"
106+msgstr "An oir aig a' bharr"
107+
108+#: Components/EdgeDemo.qml:145
109+msgid "Try swiping from the top edge to access the indicators"
110+msgstr ""
111+"Feuch is dèan grad-shlaighdeadh a-steach on oir aig a' bharr gus greim "
112+"fhaighinn air na taisbeanairean"
113+
114+#: Components/EdgeDemo.qml:170
115+msgid "Close"
116+msgstr "Dùin"
117+
118+#: Components/EdgeDemo.qml:171
119+msgid "Swipe up again to close the settings screen"
120+msgstr "Dèan grad-shlaighdeadh a-nìos gus sgrìn nan roghainnean a dhùnadh"
121+
122+#: Components/EdgeDemo.qml:198
123+msgid "Left edge"
124+msgstr "An oir chlì"
125+
126+#: Components/EdgeDemo.qml:199
127+msgid "Swipe from the left to reveal the launcher for quick access to apps"
128+msgstr ""
129+"Dèan grad-shlaighdeadh on oir chlì air an lòinseir a bheir dhut cothrom "
130+"luath air na h-aplacaidean"
131+
132+#: Components/EdgeDemo.qml:226
133+msgid "Well done"
134+msgstr "Gasta!"
135+
136+#: Components/EdgeDemo.qml:227
137+msgid ""
138+"You have now mastered the edge gestures and can start using the "
139+"phone<br><br>Tap anywhere to start"
140+msgstr ""
141+
142+#: Components/PageHeader.qml:341
143+msgid "Recent searches"
144+msgstr "Na lorg thu o chionn goirid"
145+
146+#. TRANSLATORS: Number of persons who rated this app
147+#. TRANSLATORS: Number of persons who rated this app/video/whatever
148+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
149+#, qt-format
150+msgid "(%1)"
151+msgstr "(%1)"
152+
153+#. TRANSLATORS: Number of persons who wrote reviews for this app
154+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
155+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
156+#, qt-format
157+msgid "%1 review"
158+msgid_plural "%1 reviews"
159+msgstr[0] "%1 lèirmheas"
160+msgstr[1] "%1 lèirmheas"
161+msgstr[2] "%1 lèirmheasan"
162+msgstr[3] "%1 lèirmheas"
163+
164+#: Dash/Apps/AppPreview.qml:126
165+msgid "Rate this"
166+msgstr "Rangaich seo"
167+
168+#: Dash/Previews/Reviews.qml:74
169+msgid "Add a review"
170+msgstr "Cuir lèirmheas ris"
171+
172+#: Dash/Previews/Reviews.qml:86
173+msgid "Review"
174+msgstr "Lèirmheas"
175+
176+#: Dash/Previews/Reviews.qml:121
177+msgid "Send"
178+msgstr "Cuir"
179+
180+#: Dash/Previews/Reviews.qml:139
181+msgid "Comments:"
182+msgstr "Beachdan"
183+
184+#: Greeter/Lockscreen.qml:142
185+msgid "Emergency Call"
186+msgstr "Gairm èiginn"
187+
188+#: Greeter/PassphraseLockscreen.qml:59
189+#, qt-format
190+msgid "Hello %1"
191+msgstr "Shin thu, %1"
192+
193+#: Greeter/PassphraseLockscreen.qml:59
194+msgid "Hello"
195+msgstr "Shin thu"
196+
197+#: Hud/HudParametrizedActionsPage.qml:132
198+msgid "Confirm"
199+msgstr "Dearbhaich"
200+
201+#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
202+msgid "Type or say a command"
203+msgstr "Sgrìobh no can àithne"
204+
205+#: Hud/Hud.qml:84
206+msgid "Loading. Please Wait..."
207+msgstr "'Ga luchdadh, fuirich ort..."
208+
209+#: Hud/Hud.qml:89
210+msgid "Speak Now..."
211+msgstr "Can rud a-nis..."
212+
213+#: Hud/Hud.qml:94
214+msgid "Speaking..."
215+msgstr "A' bruidhinn..."
216+
217+#: Panel/SearchIndicator.qml:27
218+msgid "Search"
219+msgstr "Lorg"
220+
221+#: plugins/Unity/scope.cpp:398
222+msgid "Sorry, there is nothing that matches your search."
223+msgstr "Tha sinn duilich ach chan eil dad a' freagairt ris na lorg thu."
224+
225+#: plugins/Unity/showallfilteroption.cpp:41
226+msgid "All"
227+msgstr ""
228+
229+#: Shell.qml:438
230+#, qt-format
231+msgid "Please enter %1"
232+msgstr "Cuir a-steach %1"
233+
234+#~ msgid "Top Charting"
235+#~ msgstr "Gràinnean-mullaich nan cairt"
236+
237+#~ msgid "Featured"
238+#~ msgstr "Brosnaichte"
239+
240+#~ msgid "Recent"
241+#~ msgstr "O chionn goirid"
242+
243+#~ msgid "New Releases"
244+#~ msgstr "Air ùr-sgaoileadh"
245+
246+#~ msgid "Videos"
247+#~ msgstr "Videothan"
248+
249+#~ msgid "Music"
250+#~ msgstr "Ceòl"
251+
252+#~ msgid "Popular Online"
253+#~ msgstr "Fèill mhòr air air loidhne"
po/gl.po+95−107
@@ -7,219 +7,185 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
11−"PO-Revision-Date: 2013-06-27 03:38+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11+"PO-Revision-Date: 2013-10-03 18:49+0000\n"
12+"Last-Translator: Marcos Lans <Unknown>\n"
1313"Language-Team: Galician <gl@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
2020
2121#: Applications/applications.js:23
2222msgid "Phone"
23−msgstr ""
23+msgstr "Teléfono"
2424
2525#: Applications/applications.js:29
2626msgid "Camera"
27−msgstr ""
27+msgstr "Cámara"
2828
2929#: Applications/applications.js:35
3030msgid "Gallery"
31−msgstr ""
31+msgstr "Galería"
3232
3333#: Applications/applications.js:40
3434msgid "Facebook"
35−msgstr ""
35+msgstr "Facebook"
3636
3737#: Applications/applications.js:46
3838msgid "Browser"
39−msgstr ""
39+msgstr "Navegador"
4040
4141#: Applications/applications.js:51
4242msgid "Twitter"
43−msgstr ""
43+msgstr "Twitter"
4444
4545#: Applications/applications.js:57
4646msgid "GMail"
47−msgstr ""
47+msgstr "GMail"
4848
4949#: Applications/applications.js:62
5050msgid "Weather"
51−msgstr ""
51+msgstr "O tempo"
5252
5353#: Applications/applications.js:68
5454msgid "Notepad"
55−msgstr ""
55+msgstr "Bloc de notas"
5656
5757#: Applications/applications.js:74
5858msgid "Calendar"
59−msgstr ""
59+msgstr "Calendario"
6060
6161#: Applications/applications.js:80
6262msgid "Media Player"
63−msgstr ""
63+msgstr "Reprodutor multimedia"
6464
6565#: Applications/applications.js:86
6666msgid "Evernote"
67−msgstr ""
67+msgstr "Evernote"
6868
6969#: Applications/applications.js:91
7070msgid "Map"
71−msgstr ""
71+msgstr "Mapa"
7272
7373#: Applications/applications.js:96
7474msgid "Pinterest"
75−msgstr ""
75+msgstr "Pinterest"
7676
7777#: Applications/applications.js:101
7878msgid "SoundCloud"
79−msgstr ""
79+msgstr "SoundCloud"
8080
8181#: Applications/applications.js:106
8282msgid "Wikipedia"
83−msgstr ""
83+msgstr "Wikipedia"
8484
8585#: Applications/applications.js:111
8686msgid "YouTube"
87−msgstr ""
87+msgstr "YouTube"
8888
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
9090msgid "Skip intro"
91−msgstr ""
91+msgstr "Saltar introdución"
9292
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
9494msgid "Right edge"
95−msgstr ""
95+msgstr "Bordo dereito"
9696
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
9898msgid "Try swiping from the right edge to unlock the phone"
99−msgstr ""
99+msgstr "Probe o arrastre desde o bordo dereito para desbloquear o teléfono"
100100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102102msgid "Top edge"
103−msgstr ""
103+msgstr "Bordo superior"
104104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106106msgid "Try swiping from the top edge to access the indicators"
107−msgstr ""
107+msgstr "Esvare desde o bordo superior para acceder aos indicadores."
108108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110110msgid "Close"
111−msgstr ""
111+msgstr "Pechar"
112112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114114msgid "Swipe up again to close the settings screen"
115−msgstr ""
115+msgstr "Esvare cara a arriba para pechar os axustes"
116116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118118msgid "Left edge"
119−msgstr ""
119+msgstr "Bordo esquerdo"
120120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123−msgstr ""
123+msgstr "Esvare desde a esquerda para mostrar o iniciador de acceso rápido"
124124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126126msgid "Well done"
127−msgstr ""
127+msgstr "Ben feito"
128128
129−#: Components/EdgeDemo.qml:218
130−msgid "You have now mastered the edge gestures and can start using the phone"
129+#: Components/EdgeDemo.qml:227
130+msgid ""
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131133msgstr ""
134+"Xa domina os xestos desde os bordos e pode comezar a usar o "
135+"móbil<br><br>Toque en calquera sitio para comezar"
132136
133−#: Components/PageHeader.qml:298
137+#: Components/PageHeader.qml:341
134138msgid "Recent searches"
135139msgstr "Buscas recentes"
136140
137141#. TRANSLATORS: Number of persons who rated this app
138−#: Dash/Apps/AppInfo.qml:73
142+#. TRANSLATORS: Number of persons who rated this app/video/whatever
143+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139144#, qt-format
140145msgid "(%1)"
141−msgstr ""
146+msgstr "(%1)"
142147
143148#. TRANSLATORS: Number of persons who wrote reviews for this app
144−#: Dash/Apps/AppInfo.qml:85
149+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
150+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145151#, qt-format
146152msgid "%1 review"
147153msgid_plural "%1 reviews"
148−msgstr[0] ""
149−msgstr[1] ""
154+msgstr[0] "%1 opinión"
155+msgstr[1] "%1 opinións"
150156
151−#: Dash/Apps/AppPreview.qml:175
157+#: Dash/Apps/AppPreview.qml:126
152158msgid "Rate this"
153−msgstr ""
159+msgstr "Valore isto"
154160
155−#: Dash/Apps/AppReviews.qml:72
161+#: Dash/Previews/Reviews.qml:74
156162msgid "Add a review"
157−msgstr ""
163+msgstr "Engadir unha opinión"
158164
159−#: Dash/Apps/AppReviews.qml:84
165+#: Dash/Previews/Reviews.qml:86
160166msgid "Review"
161−msgstr ""
167+msgstr "Opinión"
162168
163−#: Dash/Apps/AppReviews.qml:118
169+#: Dash/Previews/Reviews.qml:121
164170msgid "Send"
165−msgstr ""
171+msgstr "Enviar"
166172
167−#: Dash/Apps/AppReviews.qml:136
173+#: Dash/Previews/Reviews.qml:139
168174msgid "Comments:"
169−msgstr ""
170−
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Música"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Vídeos"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
175+msgstr "Comentarios:"
202176
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
177+#: Greeter/Lockscreen.qml:142
212178msgid "Emergency Call"
213−msgstr ""
179+msgstr "Chamada de emerxencia"
214180
215181#: Greeter/PassphraseLockscreen.qml:59
216182#, qt-format
217183msgid "Hello %1"
218−msgstr ""
184+msgstr "Ola %1"
219185
220186#: Greeter/PassphraseLockscreen.qml:59
221187msgid "Hello"
222−msgstr ""
188+msgstr "Ola"
223189
224190#: Hud/HudParametrizedActionsPage.qml:132
225191msgid "Confirm"
@@ -245,11 +211,33 @@ msgstr "Falando…"
245211msgid "Search"
246212msgstr "Buscar"
247213
248−#: plugins/Unity/scope.cpp:317
214+#: plugins/Unity/scope.cpp:398
249215msgid "Sorry, there is nothing that matches your search."
250216msgstr "Sentímolo, non hai nada que coincida con esta busca."
251217
252−#: Shell.qml:429
218+#: plugins/Unity/showallfilteroption.cpp:41
219+msgid "All"
220+msgstr "Todo"
221+
222+#: Shell.qml:438
253223#, qt-format
254224msgid "Please enter %1"
255−msgstr ""
225+msgstr "Introduza %1"
226+
227+#~ msgid "Music"
228+#~ msgstr "Música"
229+
230+#~ msgid "Videos"
231+#~ msgstr "Vídeos"
232+
233+#~ msgid "Featured"
234+#~ msgstr "Destacado"
235+
236+#~ msgid "Recent"
237+#~ msgstr "Recentes"
238+
239+#~ msgid "New Releases"
240+#~ msgstr "Novas versións"
241+
242+#~ msgid "Popular Online"
243+#~ msgstr "Populares en liña"
po/he.po+97−108
@@ -7,219 +7,183 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
11−"PO-Revision-Date: 2013-06-27 03:54+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11+"PO-Revision-Date: 2013-10-01 09:19+0000\n"
12+"Last-Translator: Yaron <sh.yaron@gmail.com>\n"
1313"Language-Team: Hebrew <he@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
2020
2121#: Applications/applications.js:23
2222msgid "Phone"
23−msgstr ""
23+msgstr "טלפון"
2424
2525#: Applications/applications.js:29
2626msgid "Camera"
27−msgstr ""
27+msgstr "מצלמה"
2828
2929#: Applications/applications.js:35
3030msgid "Gallery"
31−msgstr ""
31+msgstr "גלריה"
3232
3333#: Applications/applications.js:40
3434msgid "Facebook"
35−msgstr ""
35+msgstr "Facebook"
3636
3737#: Applications/applications.js:46
3838msgid "Browser"
39−msgstr ""
39+msgstr "דפדפן"
4040
4141#: Applications/applications.js:51
4242msgid "Twitter"
43−msgstr ""
43+msgstr "Twitter"
4444
4545#: Applications/applications.js:57
4646msgid "GMail"
47−msgstr ""
47+msgstr "GMail"
4848
4949#: Applications/applications.js:62
5050msgid "Weather"
51−msgstr ""
51+msgstr "מזג אוויר"
5252
5353#: Applications/applications.js:68
5454msgid "Notepad"
55−msgstr ""
55+msgstr "פנקס רשימות"
5656
5757#: Applications/applications.js:74
5858msgid "Calendar"
59−msgstr ""
59+msgstr "לוח שנה"
6060
6161#: Applications/applications.js:80
6262msgid "Media Player"
63−msgstr ""
63+msgstr "נגן מדיה"
6464
6565#: Applications/applications.js:86
6666msgid "Evernote"
67−msgstr ""
67+msgstr "Evernote"
6868
6969#: Applications/applications.js:91
7070msgid "Map"
71−msgstr ""
71+msgstr "מפה"
7272
7373#: Applications/applications.js:96
7474msgid "Pinterest"
75−msgstr ""
75+msgstr "Pinterest"
7676
7777#: Applications/applications.js:101
7878msgid "SoundCloud"
79−msgstr ""
79+msgstr "SoundCloud"
8080
8181#: Applications/applications.js:106
8282msgid "Wikipedia"
83−msgstr ""
83+msgstr "ויקיפדיה"
8484
8585#: Applications/applications.js:111
8686msgid "YouTube"
87−msgstr ""
87+msgstr "YouTube"
8888
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
9090msgid "Skip intro"
91−msgstr ""
91+msgstr "לדלג על הפתיחה"
9292
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
9494msgid "Right edge"
95−msgstr ""
95+msgstr "שול ימני"
9696
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
9898msgid "Try swiping from the right edge to unlock the phone"
99−msgstr ""
99+msgstr "נא לנסות למשוך מהשול הימני כדי לשחרר את נעילת הטלפון"
100100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102102msgid "Top edge"
103−msgstr ""
103+msgstr "השול העליון"
104104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106106msgid "Try swiping from the top edge to access the indicators"
107−msgstr ""
107+msgstr "נא לנסות למשוך מהשול העליון כדי לגשת למחוונים"
108108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110110msgid "Close"
111−msgstr ""
111+msgstr "סגירה"
112112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114114msgid "Swipe up again to close the settings screen"
115−msgstr ""
115+msgstr "ניתן למשוך שוב כדי לסגור את מסך ההגדרות"
116116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118118msgid "Left edge"
119−msgstr ""
119+msgstr "שול שמאלי"
120120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123−msgstr ""
123+msgstr "יש למשוך משמאל כדי לחשוף את המשגר לצורך גישה מהירה ליישומים"
124124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126126msgid "Well done"
127−msgstr ""
127+msgstr "כל הכבוד"
128128
129−#: Components/EdgeDemo.qml:218
130−msgid "You have now mastered the edge gestures and can start using the phone"
129+#: Components/EdgeDemo.qml:227
130+msgid ""
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131133msgstr ""
132134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134136msgid "Recent searches"
135137msgstr "חיפושים אחרונים"
136138
137139#. TRANSLATORS: Number of persons who rated this app
138−#: Dash/Apps/AppInfo.qml:73
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139142#, qt-format
140143msgid "(%1)"
141−msgstr ""
144+msgstr "(%1)"
142145
143146#. TRANSLATORS: Number of persons who wrote reviews for this app
144−#: Dash/Apps/AppInfo.qml:85
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145149#, qt-format
146150msgid "%1 review"
147151msgid_plural "%1 reviews"
148−msgstr[0] ""
149−msgstr[1] ""
152+msgstr[0] "סקירה %1"
153+msgstr[1] "%1 סקירות"
150154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152156msgid "Rate this"
153−msgstr ""
157+msgstr "דירוג היישום"
154158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156160msgid "Add a review"
157−msgstr ""
161+msgstr "הוספת סקירה"
158162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160164msgid "Review"
161−msgstr ""
165+msgstr "סקירה"
162166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164168msgid "Send"
165−msgstr ""
169+msgstr "שליחה"
166170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168172msgid "Comments:"
169−msgstr ""
170−
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "מוזיקה"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "סרטונים"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
173+msgstr "הערות:"
210174
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212176msgid "Emergency Call"
213−msgstr ""
177+msgstr "שיחת חירום"
214178
215179#: Greeter/PassphraseLockscreen.qml:59
216180#, qt-format
217181msgid "Hello %1"
218−msgstr ""
182+msgstr "שלום %1"
219183
220184#: Greeter/PassphraseLockscreen.qml:59
221185msgid "Hello"
222−msgstr ""
186+msgstr "שלום"
223187
224188#: Hud/HudParametrizedActionsPage.qml:132
225189msgid "Confirm"
@@ -239,17 +203,42 @@ msgstr "יש לדבר כעת..."
239203
240204#: Hud/Hud.qml:94
241205msgid "Speaking..."
242−msgstr "מושמע דיבור..."
206+msgstr "הדיבור מושמע…"
243207
244208#: Panel/SearchIndicator.qml:27
245209msgid "Search"
246210msgstr "חיפוש"
247211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249213msgid "Sorry, there is nothing that matches your search."
250214msgstr "שום דבר אינו תואם לחיפוש שלך, עמך הסליחה."
251215
252−#: Shell.qml:429
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
220+#: Shell.qml:438
253221#, qt-format
254222msgid "Please enter %1"
255−msgstr ""
223+msgstr "נא להזין %1"
224+
225+#~ msgid "Music"
226+#~ msgstr "מוזיקה"
227+
228+#~ msgid "Videos"
229+#~ msgstr "סרטונים"
230+
231+#~ msgid "Top Charting"
232+#~ msgstr "בראש הטבלה"
233+
234+#~ msgid "Featured"
235+#~ msgstr "מומלצים"
236+
237+#~ msgid "Recent"
238+#~ msgstr "אחרונים"
239+
240+#~ msgid "New Releases"
241+#~ msgstr "מהדורות חדשות"
242+
243+#~ msgid "Popular Online"
244+#~ msgstr "פופולריים ברחבי הרשת"
po/hr.po+40−66
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
1111"PO-Revision-Date: 2013-06-27 04:14+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Croatian <hr@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
20−"X-Generator: Launchpad (build 16750)\n"
19+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
20+"X-Generator: Launchpad (build 16799)\n"
2121
2222#: Applications/applications.js:23
2323msgid "Phone"
@@ -87,129 +87,93 @@ msgstr ""
8787msgid "YouTube"
8888msgstr ""
8989
90−#: Components/EdgeDemoOverlay.qml:145
90+#: Components/EdgeDemoOverlay.qml:149
9191msgid "Skip intro"
9292msgstr ""
9393
94−#: Components/EdgeDemo.qml:98
94+#: Components/EdgeDemo.qml:112
9595msgid "Right edge"
9696msgstr ""
9797
98−#: Components/EdgeDemo.qml:99
98+#: Components/EdgeDemo.qml:113
9999msgid "Try swiping from the right edge to unlock the phone"
100100msgstr ""
101101
102−#: Components/EdgeDemo.qml:135
102+#: Components/EdgeDemo.qml:144
103103msgid "Top edge"
104104msgstr ""
105105
106−#: Components/EdgeDemo.qml:136
106+#: Components/EdgeDemo.qml:145
107107msgid "Try swiping from the top edge to access the indicators"
108108msgstr ""
109109
110−#: Components/EdgeDemo.qml:161
110+#: Components/EdgeDemo.qml:170
111111msgid "Close"
112112msgstr ""
113113
114−#: Components/EdgeDemo.qml:162
114+#: Components/EdgeDemo.qml:171
115115msgid "Swipe up again to close the settings screen"
116116msgstr ""
117117
118−#: Components/EdgeDemo.qml:189
118+#: Components/EdgeDemo.qml:198
119119msgid "Left edge"
120120msgstr ""
121121
122−#: Components/EdgeDemo.qml:190
122+#: Components/EdgeDemo.qml:199
123123msgid "Swipe from the left to reveal the launcher for quick access to apps"
124124msgstr ""
125125
126−#: Components/EdgeDemo.qml:217
126+#: Components/EdgeDemo.qml:226
127127msgid "Well done"
128128msgstr ""
129129
130−#: Components/EdgeDemo.qml:218
131−msgid "You have now mastered the edge gestures and can start using the phone"
130+#: Components/EdgeDemo.qml:227
131+msgid ""
132+"You have now mastered the edge gestures and can start using the "
133+"phone<br><br>Tap anywhere to start"
132134msgstr ""
133135
134−#: Components/PageHeader.qml:298
136+#: Components/PageHeader.qml:341
135137msgid "Recent searches"
136138msgstr "Nedavne pretrage"
137139
138140#. TRANSLATORS: Number of persons who rated this app
139−#: Dash/Apps/AppInfo.qml:73
141+#. TRANSLATORS: Number of persons who rated this app/video/whatever
142+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
140143#, qt-format
141144msgid "(%1)"
142145msgstr ""
143146
144147#. TRANSLATORS: Number of persons who wrote reviews for this app
145−#: Dash/Apps/AppInfo.qml:85
148+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
149+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
146150#, qt-format
147151msgid "%1 review"
148152msgid_plural "%1 reviews"
149153msgstr[0] ""
150154msgstr[1] ""
151155
152−#: Dash/Apps/AppPreview.qml:175
156+#: Dash/Apps/AppPreview.qml:126
153157msgid "Rate this"
154158msgstr ""
155159
156−#: Dash/Apps/AppReviews.qml:72
160+#: Dash/Previews/Reviews.qml:74
157161msgid "Add a review"
158162msgstr ""
159163
160−#: Dash/Apps/AppReviews.qml:84
164+#: Dash/Previews/Reviews.qml:86
161165msgid "Review"
162166msgstr ""
163167
164−#: Dash/Apps/AppReviews.qml:118
168+#: Dash/Previews/Reviews.qml:121
165169msgid "Send"
166170msgstr ""
167171
168−#: Dash/Apps/AppReviews.qml:136
172+#: Dash/Previews/Reviews.qml:139
169173msgid "Comments:"
170174msgstr ""
171175
172−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
173−msgid "Featured"
174−msgstr ""
175−
176−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
177−msgid "Recent"
178−msgstr ""
179−
180−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
181−msgid "New Releases"
182−msgstr ""
183−
184−#: Dash/DashMusic.qml:30
185−msgid "Top Charting"
186−msgstr ""
187−
188−#: Dash/DashMusic.qml:91
189−msgid "Music"
190−msgstr "Glazba"
191−
192−#: Dash/DashVideos.qml:31
193−msgid "Popular Online"
194−msgstr ""
195−
196−#: Dash/DashVideos.qml:146
197−msgid "Videos"
198−msgstr "Video"
199−
200−#: Dash/Video/VideoPreview.qml:130
201−msgid "Directed by:"
202−msgstr ""
203−
204−#: Dash/Video/VideoPreview.qml:153
205−msgid "Starring:"
206−msgstr ""
207−
208−#: Dash/Video/VideoPreview.qml:176
209−msgid "Author:"
210−msgstr ""
211−
212−#: Greeter/Lockscreen.qml:134
176+#: Greeter/Lockscreen.qml:142
213177msgid "Emergency Call"
214178msgstr ""
215179
@@ -246,11 +210,21 @@ msgstr "Govor..."
246210msgid "Search"
247211msgstr "Pretraživanje"
248212
249−#: plugins/Unity/scope.cpp:317
213+#: plugins/Unity/scope.cpp:398
250214msgid "Sorry, there is nothing that matches your search."
251215msgstr "Nažalost, ne postoji ništa što odgovara vašoj pretrazi."
252216
253−#: Shell.qml:429
217+#: plugins/Unity/showallfilteroption.cpp:41
218+msgid "All"
219+msgstr ""
220+
221+#: Shell.qml:438
254222#, qt-format
255223msgid "Please enter %1"
256224msgstr ""
225+
226+#~ msgid "Music"
227+#~ msgstr "Glazba"
228+
229+#~ msgid "Videos"
230+#~ msgstr "Video"
po/hu.po+40−66
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
1111"PO-Revision-Date: 2013-06-27 04:28+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Hungarian <hu@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
2020
2121#: Applications/applications.js:23
2222msgid "Phone"
@@ -86,129 +86,93 @@ msgstr ""
8686msgid "YouTube"
8787msgstr ""
8888
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
9090msgid "Skip intro"
9191msgstr ""
9292
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
9494msgid "Right edge"
9595msgstr ""
9696
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
9898msgid "Try swiping from the right edge to unlock the phone"
9999msgstr ""
100100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102102msgid "Top edge"
103103msgstr ""
104104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106106msgid "Try swiping from the top edge to access the indicators"
107107msgstr ""
108108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110110msgid "Close"
111111msgstr ""
112112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114114msgid "Swipe up again to close the settings screen"
115115msgstr ""
116116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118118msgid "Left edge"
119119msgstr ""
120120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123123msgstr ""
124124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126126msgid "Well done"
127127msgstr ""
128128
129−#: Components/EdgeDemo.qml:218
130−msgid "You have now mastered the edge gestures and can start using the phone"
129+#: Components/EdgeDemo.qml:227
130+msgid ""
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131133msgstr ""
132134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134136msgid "Recent searches"
135137msgstr "Legutóbbi keresések"
136138
137139#. TRANSLATORS: Number of persons who rated this app
138−#: Dash/Apps/AppInfo.qml:73
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139142#, qt-format
140143msgid "(%1)"
141144msgstr ""
142145
143146#. TRANSLATORS: Number of persons who wrote reviews for this app
144−#: Dash/Apps/AppInfo.qml:85
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145149#, qt-format
146150msgid "%1 review"
147151msgid_plural "%1 reviews"
148152msgstr[0] ""
149153msgstr[1] ""
150154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152156msgid "Rate this"
153157msgstr ""
154158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156160msgid "Add a review"
157161msgstr ""
158162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160164msgid "Review"
161165msgstr ""
162166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164168msgid "Send"
165169msgstr ""
166170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168172msgid "Comments:"
169173msgstr ""
170174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Zene"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Videók"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212176msgid "Emergency Call"
213177msgstr ""
214178
@@ -245,11 +209,21 @@ msgstr "Beszéd…"
245209msgid "Search"
246210msgstr "Keresés"
247211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249213msgid "Sorry, there is nothing that matches your search."
250214msgstr "Elnézést, nincs találat a keresésre."
251215
252−#: Shell.qml:429
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
220+#: Shell.qml:438
253221#, qt-format
254222msgid "Please enter %1"
255223msgstr ""
224+
225+#~ msgid "Music"
226+#~ msgstr "Zene"
227+
228+#~ msgid "Videos"
229+#~ msgstr "Videók"
po/hy.po+40−66
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
1111"PO-Revision-Date: 2013-06-27 04:43+0000\n"
1212"Last-Translator: iAbaS <sosabazyan@yandex.ru>\n"
1313"Language-Team: Armenian <hy@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
2020
2121#: Applications/applications.js:23
2222msgid "Phone"
@@ -86,129 +86,93 @@ msgstr ""
8686msgid "YouTube"
8787msgstr ""
8888
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
9090msgid "Skip intro"
9191msgstr ""
9292
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
9494msgid "Right edge"
9595msgstr ""
9696
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
9898msgid "Try swiping from the right edge to unlock the phone"
9999msgstr ""
100100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102102msgid "Top edge"
103103msgstr ""
104104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106106msgid "Try swiping from the top edge to access the indicators"
107107msgstr ""
108108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110110msgid "Close"
111111msgstr ""
112112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114114msgid "Swipe up again to close the settings screen"
115115msgstr ""
116116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118118msgid "Left edge"
119119msgstr ""
120120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123123msgstr ""
124124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126126msgid "Well done"
127127msgstr ""
128128
129−#: Components/EdgeDemo.qml:218
130−msgid "You have now mastered the edge gestures and can start using the phone"
129+#: Components/EdgeDemo.qml:227
130+msgid ""
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131133msgstr ""
132134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134136msgid "Recent searches"
135137msgstr "Վերջին որոնումներ"
136138
137139#. TRANSLATORS: Number of persons who rated this app
138−#: Dash/Apps/AppInfo.qml:73
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139142#, qt-format
140143msgid "(%1)"
141144msgstr ""
142145
143146#. TRANSLATORS: Number of persons who wrote reviews for this app
144−#: Dash/Apps/AppInfo.qml:85
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145149#, qt-format
146150msgid "%1 review"
147151msgid_plural "%1 reviews"
148152msgstr[0] ""
149153msgstr[1] ""
150154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152156msgid "Rate this"
153157msgstr ""
154158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156160msgid "Add a review"
157161msgstr ""
158162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160164msgid "Review"
161165msgstr ""
162166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164168msgid "Send"
165169msgstr ""
166170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168172msgid "Comments:"
169173msgstr ""
170174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Երգեր"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Վիդեոներ"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212176msgid "Emergency Call"
213177msgstr ""
214178
@@ -245,11 +209,21 @@ msgstr "Խոսում եմ..."
245209msgid "Search"
246210msgstr "Որոնում"
247211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249213msgid "Sorry, there is nothing that matches your search."
250214msgstr "Կներերք, բայց Ձեր հարցումով ոչինչ չկար"
251215
252−#: Shell.qml:429
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
220+#: Shell.qml:438
253221#, qt-format
254222msgid "Please enter %1"
255223msgstr ""
224+
225+#~ msgid "Music"
226+#~ msgstr "Երգեր"
227+
228+#~ msgid "Videos"
229+#~ msgstr "Վիդեոներ"
po/id.po+34−66
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
1111"PO-Revision-Date: 2013-06-26 22:35+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Indonesian <id@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
2020
2121#: Applications/applications.js:23
2222msgid "Phone"
@@ -86,129 +86,93 @@ msgstr ""
8686msgid "YouTube"
8787msgstr ""
8888
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
9090msgid "Skip intro"
9191msgstr ""
9292
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
9494msgid "Right edge"
9595msgstr ""
9696
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
9898msgid "Try swiping from the right edge to unlock the phone"
9999msgstr ""
100100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102102msgid "Top edge"
103103msgstr ""
104104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106106msgid "Try swiping from the top edge to access the indicators"
107107msgstr ""
108108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110110msgid "Close"
111111msgstr ""
112112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114114msgid "Swipe up again to close the settings screen"
115115msgstr ""
116116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118118msgid "Left edge"
119119msgstr ""
120120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123123msgstr ""
124124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126126msgid "Well done"
127127msgstr ""
128128
129−#: Components/EdgeDemo.qml:218
130−msgid "You have now mastered the edge gestures and can start using the phone"
129+#: Components/EdgeDemo.qml:227
130+msgid ""
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131133msgstr ""
132134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134136msgid "Recent searches"
135137msgstr ""
136138
137139#. TRANSLATORS: Number of persons who rated this app
138−#: Dash/Apps/AppInfo.qml:73
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139142#, qt-format
140143msgid "(%1)"
141144msgstr ""
142145
143146#. TRANSLATORS: Number of persons who wrote reviews for this app
144−#: Dash/Apps/AppInfo.qml:85
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145149#, qt-format
146150msgid "%1 review"
147151msgid_plural "%1 reviews"
148152msgstr[0] ""
149153msgstr[1] ""
150154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152156msgid "Rate this"
153157msgstr ""
154158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156160msgid "Add a review"
157161msgstr ""
158162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160164msgid "Review"
161165msgstr ""
162166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164168msgid "Send"
165169msgstr ""
166170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168172msgid "Comments:"
169173msgstr ""
170174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr ""
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr ""
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212176msgid "Emergency Call"
213177msgstr ""
214178
@@ -245,11 +209,15 @@ msgstr ""
245209msgid "Search"
246210msgstr ""
247211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249213msgid "Sorry, there is nothing that matches your search."
250214msgstr ""
251215
252−#: Shell.qml:429
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
220+#: Shell.qml:438
253221#, qt-format
254222msgid "Please enter %1"
255223msgstr ""
po/is.po+55−66
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
1111"PO-Revision-Date: 2013-09-18 16:22+0000\n"
1212"Last-Translator: Andri Thorlacius <Unknown>\n"
1313"Language-Team: Icelandic <is@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-09-19 05:14+0000\n"
19−"X-Generator: Launchpad (build 16765)\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
2020
2121#: Applications/applications.js:23
2222msgid "Phone"
@@ -86,130 +86,94 @@ msgstr "Wikipedia"
8686msgid "YouTube"
8787msgstr "YouTube"
8888
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
9090msgid "Skip intro"
9191msgstr "Hoppa yfir kynningu"
9292
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
9494msgid "Right edge"
9595msgstr "Hægri brún"
9696
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
9898msgid "Try swiping from the right edge to unlock the phone"
9999msgstr ""
100100"Prufaðu að renna puttanum frá hægri brúninni til að aflæsa símanum þínum."
101101
102−#: Components/EdgeDemo.qml:135
102+#: Components/EdgeDemo.qml:144
103103msgid "Top edge"
104104msgstr "Efri brún"
105105
106−#: Components/EdgeDemo.qml:136
106+#: Components/EdgeDemo.qml:145
107107msgid "Try swiping from the top edge to access the indicators"
108108msgstr ""
109109
110−#: Components/EdgeDemo.qml:161
110+#: Components/EdgeDemo.qml:170
111111msgid "Close"
112112msgstr "Loka"
113113
114−#: Components/EdgeDemo.qml:162
114+#: Components/EdgeDemo.qml:171
115115msgid "Swipe up again to close the settings screen"
116116msgstr ""
117117
118−#: Components/EdgeDemo.qml:189
118+#: Components/EdgeDemo.qml:198
119119msgid "Left edge"
120120msgstr "Vinstri brún"
121121
122−#: Components/EdgeDemo.qml:190
122+#: Components/EdgeDemo.qml:199
123123msgid "Swipe from the left to reveal the launcher for quick access to apps"
124124msgstr ""
125125
126−#: Components/EdgeDemo.qml:217
126+#: Components/EdgeDemo.qml:226
127127msgid "Well done"
128128msgstr "Vel gert"
129129
130−#: Components/EdgeDemo.qml:218
131−msgid "You have now mastered the edge gestures and can start using the phone"
130+#: Components/EdgeDemo.qml:227
131+msgid ""
132+"You have now mastered the edge gestures and can start using the "
133+"phone<br><br>Tap anywhere to start"
132134msgstr ""
133135
134−#: Components/PageHeader.qml:298
136+#: Components/PageHeader.qml:341
135137msgid "Recent searches"
136138msgstr "Nýlegar leitir"
137139
138140#. TRANSLATORS: Number of persons who rated this app
139−#: Dash/Apps/AppInfo.qml:73
141+#. TRANSLATORS: Number of persons who rated this app/video/whatever
142+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
140143#, qt-format
141144msgid "(%1)"
142145msgstr "(%1)"
143146
144147#. TRANSLATORS: Number of persons who wrote reviews for this app
145−#: Dash/Apps/AppInfo.qml:85
148+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
149+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
146150#, qt-format
147151msgid "%1 review"
148152msgid_plural "%1 reviews"
149153msgstr[0] "%1 ummæli"
150154msgstr[1] "%1 ummæli"
151155
152−#: Dash/Apps/AppPreview.qml:175
156+#: Dash/Apps/AppPreview.qml:126
153157msgid "Rate this"
154158msgstr "Gefa þessu einkunn"
155159
156−#: Dash/Apps/AppReviews.qml:72
160+#: Dash/Previews/Reviews.qml:74
157161msgid "Add a review"
158162msgstr "Gefa umsögn"
159163
160−#: Dash/Apps/AppReviews.qml:84
164+#: Dash/Previews/Reviews.qml:86
161165msgid "Review"
162166msgstr "Umsögn"
163167
164−#: Dash/Apps/AppReviews.qml:118
168+#: Dash/Previews/Reviews.qml:121
165169msgid "Send"
166170msgstr "Senda"
167171
168−#: Dash/Apps/AppReviews.qml:136
172+#: Dash/Previews/Reviews.qml:139
169173msgid "Comments:"
170174msgstr "Athugasemdir:"
171175
172−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
173−msgid "Featured"
174−msgstr "Efst á baugi"
175−
176−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
177−msgid "Recent"
178−msgstr "Nýlegt"
179−
180−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
181−msgid "New Releases"
182−msgstr "Nýjar Útgáfur"
183−
184−#: Dash/DashMusic.qml:30
185−msgid "Top Charting"
186−msgstr "Topp Listi"
187−
188−#: Dash/DashMusic.qml:91
189−msgid "Music"
190−msgstr "Tónlist"
191−
192−#: Dash/DashVideos.qml:31
193−msgid "Popular Online"
194−msgstr "Vinsælt á Netinu"
195−
196−#: Dash/DashVideos.qml:146
197−msgid "Videos"
198−msgstr "Myndbönd"
199−
200−#: Dash/Video/VideoPreview.qml:130
201−msgid "Directed by:"
202−msgstr "Leikstýrt af:"
203−
204−#: Dash/Video/VideoPreview.qml:153
205−msgid "Starring:"
206−msgstr "Meðal leikara eru:"
207−
208−#: Dash/Video/VideoPreview.qml:176
209−msgid "Author:"
210−msgstr "Höfundur:"
211−
212−#: Greeter/Lockscreen.qml:134
176+#: Greeter/Lockscreen.qml:142
213177msgid "Emergency Call"
214178msgstr "Neyðarsímtal"
215179
@@ -246,11 +210,36 @@ msgstr "Tala..."
246210msgid "Search"
247211msgstr "Leita"
248212
249−#: plugins/Unity/scope.cpp:317
213+#: plugins/Unity/scope.cpp:398
250214msgid "Sorry, there is nothing that matches your search."
251215msgstr "Því miður, það var ekkert sem passaði við leitarorðið þitt."
252216
253−#: Shell.qml:429
217+#: plugins/Unity/showallfilteroption.cpp:41
218+msgid "All"
219+msgstr ""
220+
221+#: Shell.qml:438
254222#, qt-format
255223msgid "Please enter %1"
256224msgstr ""
225+
226+#~ msgid "Top Charting"
227+#~ msgstr "Topp Listi"
228+
229+#~ msgid "Featured"
230+#~ msgstr "Efst á baugi"
231+
232+#~ msgid "Recent"
233+#~ msgstr "Nýlegt"
234+
235+#~ msgid "New Releases"
236+#~ msgstr "Nýjar Útgáfur"
237+
238+#~ msgid "Videos"
239+#~ msgstr "Myndbönd"
240+
241+#~ msgid "Music"
242+#~ msgstr "Tónlist"
243+
244+#~ msgid "Popular Online"
245+#~ msgstr "Vinsælt á Netinu"
po/it.po+100−104
@@ -7,219 +7,190 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
11−"PO-Revision-Date: 2013-06-27 05:14+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11+"PO-Revision-Date: 2013-10-07 09:34+0000\n"
12+"Last-Translator: Claudio Arseni <claudio.arseni@gmail.com>\n"
1313"Language-Team: Italian <it@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
2020
2121#: Applications/applications.js:23
2222msgid "Phone"
23−msgstr ""
23+msgstr "Telefono"
2424
2525#: Applications/applications.js:29
2626msgid "Camera"
27−msgstr ""
27+msgstr "Fotocamera"
2828
2929#: Applications/applications.js:35
3030msgid "Gallery"
31−msgstr ""
31+msgstr "Galleria"
3232
3333#: Applications/applications.js:40
3434msgid "Facebook"
35−msgstr ""
35+msgstr "Facebook"
3636
3737#: Applications/applications.js:46
3838msgid "Browser"
39−msgstr ""
39+msgstr "Browser"
4040
4141#: Applications/applications.js:51
4242msgid "Twitter"
43−msgstr ""
43+msgstr "Twitter"
4444
4545#: Applications/applications.js:57
4646msgid "GMail"
47−msgstr ""
47+msgstr "GMail"
4848
4949#: Applications/applications.js:62
5050msgid "Weather"
51−msgstr ""
51+msgstr "Meteo"
5252
5353#: Applications/applications.js:68
5454msgid "Notepad"
55−msgstr ""
55+msgstr "Blocco note"
5656
5757#: Applications/applications.js:74
5858msgid "Calendar"
59−msgstr ""
59+msgstr "Calendario"
6060
6161#: Applications/applications.js:80
6262msgid "Media Player"
63−msgstr ""
63+msgstr "Riproduttore multimediale"
6464
6565#: Applications/applications.js:86
6666msgid "Evernote"
67−msgstr ""
67+msgstr "Evernote"
6868
6969#: Applications/applications.js:91
7070msgid "Map"
71−msgstr ""
71+msgstr "Mappa"
7272
7373#: Applications/applications.js:96
7474msgid "Pinterest"
75−msgstr ""
75+msgstr "Pinterest"
7676
7777#: Applications/applications.js:101
7878msgid "SoundCloud"
79−msgstr ""
79+msgstr "SoundCloud"
8080
8181#: Applications/applications.js:106
8282msgid "Wikipedia"
83−msgstr ""
83+msgstr "Wikipedia"
8484
8585#: Applications/applications.js:111
8686msgid "YouTube"
87−msgstr ""
87+msgstr "YouTube"
8888
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
9090msgid "Skip intro"
91−msgstr ""
91+msgstr "Salta introduzione"
9292
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
9494msgid "Right edge"
95−msgstr ""
95+msgstr "Bordo destro"
9696
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
9898msgid "Try swiping from the right edge to unlock the phone"
99−msgstr ""
99+msgstr "Provare a far scorrere dal bordo destro per sbloccare il telefono"
100100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102102msgid "Top edge"
103−msgstr ""
103+msgstr "Bordo superiore"
104104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106106msgid "Try swiping from the top edge to access the indicators"
107107msgstr ""
108+"Provare a far scorrere dal bordo in alto per accedere agli indicatori"
108109
109−#: Components/EdgeDemo.qml:161
110+#: Components/EdgeDemo.qml:170
110111msgid "Close"
111−msgstr ""
112+msgstr "Chiudi"
112113
113−#: Components/EdgeDemo.qml:162
114+#: Components/EdgeDemo.qml:171
114115msgid "Swipe up again to close the settings screen"
115116msgstr ""
117+"Far scorrere verso l'alto nuovamente per chiudere la schermata delle "
118+"impostazioni"
116119
117−#: Components/EdgeDemo.qml:189
120+#: Components/EdgeDemo.qml:198
118121msgid "Left edge"
119−msgstr ""
122+msgstr "Bordo sinistro"
120123
121−#: Components/EdgeDemo.qml:190
124+#: Components/EdgeDemo.qml:199
122125msgid "Swipe from the left to reveal the launcher for quick access to apps"
123126msgstr ""
127+"Far scorrere il bordo sinistro per mostrare il Launcher e avere un rapido "
128+"accesso alle applicazioni"
124129
125−#: Components/EdgeDemo.qml:217
130+#: Components/EdgeDemo.qml:226
126131msgid "Well done"
127−msgstr ""
132+msgstr "Ben fatto"
128133
129−#: Components/EdgeDemo.qml:218
130−msgid "You have now mastered the edge gestures and can start using the phone"
134+#: Components/EdgeDemo.qml:227
135+msgid ""
136+"You have now mastered the edge gestures and can start using the "
137+"phone<br><br>Tap anywhere to start"
131138msgstr ""
139+"I gesti sui bordi sono stati configurati ed è possibile iniziare a usare il "
140+"telefono<br><br>Toccare in un punto qualunque per iniziare"
132141
133−#: Components/PageHeader.qml:298
142+#: Components/PageHeader.qml:341
134143msgid "Recent searches"
135144msgstr "Ricerche recenti"
136145
137146#. TRANSLATORS: Number of persons who rated this app
138−#: Dash/Apps/AppInfo.qml:73
147+#. TRANSLATORS: Number of persons who rated this app/video/whatever
148+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139149#, qt-format
140150msgid "(%1)"
141−msgstr ""
151+msgstr "(%1)"
142152
143153#. TRANSLATORS: Number of persons who wrote reviews for this app
144−#: Dash/Apps/AppInfo.qml:85
154+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
155+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145156#, qt-format
146157msgid "%1 review"
147158msgid_plural "%1 reviews"
148−msgstr[0] ""
149−msgstr[1] ""
159+msgstr[0] "%1 recensione"
160+msgstr[1] "%1 recensioni"
150161
151−#: Dash/Apps/AppPreview.qml:175
162+#: Dash/Apps/AppPreview.qml:126
152163msgid "Rate this"
153−msgstr ""
164+msgstr "Valuta"
154165
155−#: Dash/Apps/AppReviews.qml:72
166+#: Dash/Previews/Reviews.qml:74
156167msgid "Add a review"
157−msgstr ""
168+msgstr "Aggiungi una recensione"
158169
159−#: Dash/Apps/AppReviews.qml:84
170+#: Dash/Previews/Reviews.qml:86
160171msgid "Review"
161−msgstr ""
172+msgstr "Recensisci"
162173
163−#: Dash/Apps/AppReviews.qml:118
174+#: Dash/Previews/Reviews.qml:121
164175msgid "Send"
165−msgstr ""
176+msgstr "Invia"
166177
167−#: Dash/Apps/AppReviews.qml:136
178+#: Dash/Previews/Reviews.qml:139
168179msgid "Comments:"
169−msgstr ""
180+msgstr "Commenti:"
170181
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Musica"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Video"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
182+#: Greeter/Lockscreen.qml:142
212183msgid "Emergency Call"
213−msgstr ""
184+msgstr "Chiamata di emergenza"
214185
215186#: Greeter/PassphraseLockscreen.qml:59
216187#, qt-format
217188msgid "Hello %1"
218−msgstr ""
189+msgstr "Ciao %1"
219190
220191#: Greeter/PassphraseLockscreen.qml:59
221192msgid "Hello"
222−msgstr ""
193+msgstr "Ciao"
223194
224195#: Hud/HudParametrizedActionsPage.qml:132
225196msgid "Confirm"
@@ -245,11 +216,36 @@ msgstr "Sto parlando..."
245216msgid "Search"
246217msgstr "Cerca"
247218
248−#: plugins/Unity/scope.cpp:317
219+#: plugins/Unity/scope.cpp:398
249220msgid "Sorry, there is nothing that matches your search."
250221msgstr "Nessun risultato corrispondente alla ricerca."
251222
252−#: Shell.qml:429
223+#: plugins/Unity/showallfilteroption.cpp:41
224+msgid "All"
225+msgstr "Tutto"
226+
227+#: Shell.qml:438
253228#, qt-format
254229msgid "Please enter %1"
255−msgstr ""
230+msgstr "Inserire %1"
231+
232+#~ msgid "Music"
233+#~ msgstr "Musica"
234+
235+#~ msgid "Videos"
236+#~ msgstr "Video"
237+
238+#~ msgid "Recent"
239+#~ msgstr "Recenti"
240+
241+#~ msgid "New Releases"
242+#~ msgstr "Nuovi rilasci"
243+
244+#~ msgid "Featured"
245+#~ msgstr "In evidenza"
246+
247+#~ msgid "Popular Online"
248+#~ msgstr "Popolari online"
249+
250+#~ msgid "Top Charting"
251+#~ msgstr "Più votate"
po/ja.po+34−66
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
1111"PO-Revision-Date: 2013-06-26 22:36+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Japanese <ja@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
2020
2121#: Applications/applications.js:23
2222msgid "Phone"
@@ -86,129 +86,93 @@ msgstr ""
8686msgid "YouTube"
8787msgstr ""
8888
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
9090msgid "Skip intro"
9191msgstr ""
9292
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
9494msgid "Right edge"
9595msgstr ""
9696
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
9898msgid "Try swiping from the right edge to unlock the phone"
9999msgstr ""
100100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102102msgid "Top edge"
103103msgstr ""
104104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106106msgid "Try swiping from the top edge to access the indicators"
107107msgstr ""
108108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110110msgid "Close"
111111msgstr ""
112112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114114msgid "Swipe up again to close the settings screen"
115115msgstr ""
116116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118118msgid "Left edge"
119119msgstr ""
120120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123123msgstr ""
124124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126126msgid "Well done"
127127msgstr ""
128128
129−#: Components/EdgeDemo.qml:218
130−msgid "You have now mastered the edge gestures and can start using the phone"
129+#: Components/EdgeDemo.qml:227
130+msgid ""
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131133msgstr ""
132134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134136msgid "Recent searches"
135137msgstr ""
136138
137139#. TRANSLATORS: Number of persons who rated this app
138−#: Dash/Apps/AppInfo.qml:73
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139142#, qt-format
140143msgid "(%1)"
141144msgstr ""
142145
143146#. TRANSLATORS: Number of persons who wrote reviews for this app
144−#: Dash/Apps/AppInfo.qml:85
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145149#, qt-format
146150msgid "%1 review"
147151msgid_plural "%1 reviews"
148152msgstr[0] ""
149153msgstr[1] ""
150154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152156msgid "Rate this"
153157msgstr ""
154158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156160msgid "Add a review"
157161msgstr ""
158162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160164msgid "Review"
161165msgstr ""
162166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164168msgid "Send"
165169msgstr ""
166170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168172msgid "Comments:"
169173msgstr ""
170174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr ""
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr ""
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212176msgid "Emergency Call"
213177msgstr ""
214178
@@ -245,11 +209,15 @@ msgstr ""
245209msgid "Search"
246210msgstr ""
247211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249213msgid "Sorry, there is nothing that matches your search."
250214msgstr ""
251215
252−#: Shell.qml:429
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
220+#: Shell.qml:438
253221#, qt-format
254222msgid "Please enter %1"
255223msgstr ""
po/km.ponew file+248
@@ -0,0 +1,248 @@
1+# Khmer translation for unity8
2+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11+"PO-Revision-Date: 2013-10-11 08:49+0000\n"
12+"Last-Translator: Khoem Sokhem <khoemsokhem@khmeros.info>\n"
13+"Language-Team: Khmer <km@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=1; plural=0;\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
20+
21+#: Applications/applications.js:23
22+msgid "Phone"
23+msgstr "ទូរស័ព្ទ"
24+
25+#: Applications/applications.js:29
26+msgid "Camera"
27+msgstr "ម៉ាស៊ីន​ថ​ត"
28+
29+#: Applications/applications.js:35
30+msgid "Gallery"
31+msgstr "វិចិត្រសាល"
32+
33+#: Applications/applications.js:40
34+msgid "Facebook"
35+msgstr "Facebook"
36+
37+#: Applications/applications.js:46
38+msgid "Browser"
39+msgstr "កម្មវិធី​រុករក"
40+
41+#: Applications/applications.js:51
42+msgid "Twitter"
43+msgstr "Twitter"
44+
45+#: Applications/applications.js:57
46+msgid "GMail"
47+msgstr "GMail"
48+
49+#: Applications/applications.js:62
50+msgid "Weather"
51+msgstr "អាកាសធាតុ"
52+
53+#: Applications/applications.js:68
54+msgid "Notepad"
55+msgstr "Notepad"
56+
57+#: Applications/applications.js:74
58+msgid "Calendar"
59+msgstr "ប្រតិទិន"
60+
61+#: Applications/applications.js:80
62+msgid "Media Player"
63+msgstr "កម្មវិធី​ចាក់​មេឌៀ"
64+
65+#: Applications/applications.js:86
66+msgid "Evernote"
67+msgstr "Evernote"
68+
69+#: Applications/applications.js:91
70+msgid "Map"
71+msgstr "ផែនទី"
72+
73+#: Applications/applications.js:96
74+msgid "Pinterest"
75+msgstr "Pinterest"
76+
77+#: Applications/applications.js:101
78+msgid "SoundCloud"
79+msgstr "SoundCloud"
80+
81+#: Applications/applications.js:106
82+msgid "Wikipedia"
83+msgstr "វីគីភីឌៀ"
84+
85+#: Applications/applications.js:111
86+msgid "YouTube"
87+msgstr "YouTube"
88+
89+#: Components/EdgeDemoOverlay.qml:149
90+msgid "Skip intro"
91+msgstr "រំលង​ការ​ណែនាំ"
92+
93+#: Components/EdgeDemo.qml:112
94+msgid "Right edge"
95+msgstr "គែម​ស្ដាំ"
96+
97+#: Components/EdgeDemo.qml:113
98+msgid "Try swiping from the right edge to unlock the phone"
99+msgstr "សាកល្បង​​អូស​ពី​គែម​ស្ដាំ​ ដើម្បី​ដោះ​សោ​ទូរស័ព្ទ"
100+
101+#: Components/EdgeDemo.qml:144
102+msgid "Top edge"
103+msgstr "គែម​ខាង​លើ"
104+
105+#: Components/EdgeDemo.qml:145
106+msgid "Try swiping from the top edge to access the indicators"
107+msgstr "សាកល្បង​អូស​ពី​គែម​ខាង​លើ ដើម្បី​ចូល​ដំណើរការ​សញ្ញា"
108+
109+#: Components/EdgeDemo.qml:170
110+msgid "Close"
111+msgstr "បិទ"
112+
113+#: Components/EdgeDemo.qml:171
114+msgid "Swipe up again to close the settings screen"
115+msgstr "អូស​ឡើង​លើ​ម្ដងទៀត ដើម្បី​បិទ​ការ​កំណត់​អេក្រង់"
116+
117+#: Components/EdgeDemo.qml:198
118+msgid "Left edge"
119+msgstr "គែមឆ្វេង"
120+
121+#: Components/EdgeDemo.qml:199
122+msgid "Swipe from the left to reveal the launcher for quick access to apps"
123+msgstr ""
124+"អូស​ពី​គែម​ឆ្វេង "
125+"ដើម្បី​បង្ហាញ​កម្មវិធី​ចាប់ផ្ដើម​សម្រាប់​ចូល​ដំណើរ​ការ​កម្មវិធី​រហ័ស"
126+
127+#: Components/EdgeDemo.qml:226
128+msgid "Well done"
129+msgstr "ធ្វើ​បាន​ល្អ"
130+
131+#: Components/EdgeDemo.qml:227
132+msgid ""
133+"You have now mastered the edge gestures and can start using the "
134+"phone<br><br>Tap anywhere to start"
135+msgstr ""
136+"ឥឡូវ​អ្នក​បាន​គ្រប់គ្រង​កាយវិការ​គែម "
137+"និង​អាច​ចាប់ផ្ដើម​ប្រើ​ទូរស័ព្ទ​បាន<br><br>ប៉ះ​កន្លែង​ណា​មួយ​ "
138+"ដើម្បី​ចាប់ផ្ដើម"
139+
140+#: Components/PageHeader.qml:341
141+msgid "Recent searches"
142+msgstr "ការ​ស្វែងរក​ថ្មី"
143+
144+#. TRANSLATORS: Number of persons who rated this app
145+#. TRANSLATORS: Number of persons who rated this app/video/whatever
146+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
147+#, qt-format
148+msgid "(%1)"
149+msgstr "(%1)"
150+
151+#. TRANSLATORS: Number of persons who wrote reviews for this app
152+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
153+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
154+#, qt-format
155+msgid "%1 review"
156+msgid_plural "%1 reviews"
157+msgstr[0] "ពិនិត្យ​មើល %1"
158+
159+#: Dash/Apps/AppPreview.qml:126
160+msgid "Rate this"
161+msgstr "វាយតម្លៃ​វា"
162+
163+#: Dash/Previews/Reviews.qml:74
164+msgid "Add a review"
165+msgstr "បន្ថែម​ការ​ពិនិត្យ"
166+
167+#: Dash/Previews/Reviews.qml:86
168+msgid "Review"
169+msgstr "ការ​ពិនិត្យ"
170+
171+#: Dash/Previews/Reviews.qml:121
172+msgid "Send"
173+msgstr "ផ្ញើ"
174+
175+#: Dash/Previews/Reviews.qml:139
176+msgid "Comments:"
177+msgstr "មតិយោបល់៖"
178+
179+#: Greeter/Lockscreen.qml:142
180+msgid "Emergency Call"
181+msgstr "ការ​ហៅ​ពេល​អាសន្ន"
182+
183+#: Greeter/PassphraseLockscreen.qml:59
184+#, qt-format
185+msgid "Hello %1"
186+msgstr "សួស្ដី %1"
187+
188+#: Greeter/PassphraseLockscreen.qml:59
189+msgid "Hello"
190+msgstr "សួស្តី"
191+
192+#: Hud/HudParametrizedActionsPage.qml:132
193+msgid "Confirm"
194+msgstr "បញ្ជាក់"
195+
196+#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
197+msgid "Type or say a command"
198+msgstr "បញ្ចូល ឬ​និយាយ​ពាក្យ​បញ្ជា"
199+
200+#: Hud/Hud.qml:84
201+msgid "Loading. Please Wait..."
202+msgstr "សូម​រង់ចាំ កំពុង​ផ្ទុក..."
203+
204+#: Hud/Hud.qml:89
205+msgid "Speak Now..."
206+msgstr "និយាយ​ឥឡូវ..."
207+
208+#: Hud/Hud.qml:94
209+msgid "Speaking..."
210+msgstr "កំពុង​និយាយ..."
211+
212+#: Panel/SearchIndicator.qml:27
213+msgid "Search"
214+msgstr "ស្វែង​រក"
215+
216+#: plugins/Unity/scope.cpp:398
217+msgid "Sorry, there is nothing that matches your search."
218+msgstr "សូម​ទោស មិនមាន​ពាក្យ​ដែល​អ្នក​ស្វែងរក​ទេ​។"
219+
220+#: plugins/Unity/showallfilteroption.cpp:41
221+msgid "All"
222+msgstr "ទាំង​អស់"
223+
224+#: Shell.qml:438
225+#, qt-format
226+msgid "Please enter %1"
227+msgstr "សូម​បញ្ចូល %1"
228+
229+#~ msgid "Popular Online"
230+#~ msgstr "លើ​បណ្ដាញ​ប្រជាប្រិយ"
231+
232+#~ msgid "Music"
233+#~ msgstr "តន្ត្រី"
234+
235+#~ msgid "New Releases"
236+#~ msgstr "ការ​ចេញ​ផ្សាយ​ថ្មី"
237+
238+#~ msgid "Top Charting"
239+#~ msgstr "តារាង​ខាង​លើ"
240+
241+#~ msgid "Featured"
242+#~ msgstr "ដែល​ល្បី"
243+
244+#~ msgid "Recent"
245+#~ msgstr "ថ្មីៗ"
246+
247+#~ msgid "Videos"
248+#~ msgstr "វីដេអូ"
po/kn.po+40−66
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
1111"PO-Revision-Date: 2013-06-27 05:43+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Kannada <kn@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
2020
2121#: Applications/applications.js:23
2222msgid "Phone"
@@ -86,129 +86,93 @@ msgstr ""
8686msgid "YouTube"
8787msgstr ""
8888
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
9090msgid "Skip intro"
9191msgstr ""
9292
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
9494msgid "Right edge"
9595msgstr ""
9696
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
9898msgid "Try swiping from the right edge to unlock the phone"
9999msgstr ""
100100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102102msgid "Top edge"
103103msgstr ""
104104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106106msgid "Try swiping from the top edge to access the indicators"
107107msgstr ""
108108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110110msgid "Close"
111111msgstr ""
112112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114114msgid "Swipe up again to close the settings screen"
115115msgstr ""
116116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118118msgid "Left edge"
119119msgstr ""
120120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123123msgstr ""
124124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126126msgid "Well done"
127127msgstr ""
128128
129−#: Components/EdgeDemo.qml:218
130−msgid "You have now mastered the edge gestures and can start using the phone"
129+#: Components/EdgeDemo.qml:227
130+msgid ""
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131133msgstr ""
132134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134136msgid "Recent searches"
135137msgstr "ಇತ್ತೀಚಿನ ಹುಡುಕಾಟಗಳು"
136138
137139#. TRANSLATORS: Number of persons who rated this app
138−#: Dash/Apps/AppInfo.qml:73
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139142#, qt-format
140143msgid "(%1)"
141144msgstr ""
142145
143146#. TRANSLATORS: Number of persons who wrote reviews for this app
144−#: Dash/Apps/AppInfo.qml:85
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145149#, qt-format
146150msgid "%1 review"
147151msgid_plural "%1 reviews"
148152msgstr[0] ""
149153msgstr[1] ""
150154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152156msgid "Rate this"
153157msgstr ""
154158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156160msgid "Add a review"
157161msgstr ""
158162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160164msgid "Review"
161165msgstr ""
162166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164168msgid "Send"
165169msgstr ""
166170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168172msgid "Comments:"
169173msgstr ""
170174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "ಸಂಗೀತ"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "ವೀಡಿಯೋಗಳು"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212176msgid "Emergency Call"
213177msgstr ""
214178
@@ -245,11 +209,21 @@ msgstr "ಮಾತನಾಡುತಿದ್ದೀರಿ"
245209msgid "Search"
246210msgstr "ಹುಡುಕು"
247211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249213msgid "Sorry, there is nothing that matches your search."
250214msgstr "ಕ್ಷಮಿಸಿ ನಿಮ್ಮ ಶೋಧನೆಗೆ ಸರಿಯಾದ ಹೊಂದಾಣಿಕೆಗಳು ದೊರಕುತ್ತಿಲ್ಲ"
251215
252−#: Shell.qml:429
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
220+#: Shell.qml:438
253221#, qt-format
254222msgid "Please enter %1"
255223msgstr ""
224+
225+#~ msgid "Music"
226+#~ msgstr "ಸಂಗೀತ"
227+
228+#~ msgid "Videos"
229+#~ msgstr "ವೀಡಿಯೋಗಳು"
po/ko.po+60−89
@@ -7,208 +7,172 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
11−"PO-Revision-Date: 2013-06-27 05:59+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11+"PO-Revision-Date: 2013-10-10 07:04+0000\n"
12+"Last-Translator: Kim Boram <boramism@gmail.com>\n"
1313"Language-Team: Korean <ko@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
2020
2121#: Applications/applications.js:23
2222msgid "Phone"
23−msgstr ""
23+msgstr "전화"
2424
2525#: Applications/applications.js:29
2626msgid "Camera"
27−msgstr ""
27+msgstr "카메라"
2828
2929#: Applications/applications.js:35
3030msgid "Gallery"
31−msgstr ""
31+msgstr "갤러리"
3232
3333#: Applications/applications.js:40
3434msgid "Facebook"
35−msgstr ""
35+msgstr "페이스북"
3636
3737#: Applications/applications.js:46
3838msgid "Browser"
39−msgstr ""
39+msgstr "브라우저"
4040
4141#: Applications/applications.js:51
4242msgid "Twitter"
43−msgstr ""
43+msgstr "트위터"
4444
4545#: Applications/applications.js:57
4646msgid "GMail"
47−msgstr ""
47+msgstr "지메일"
4848
4949#: Applications/applications.js:62
5050msgid "Weather"
51−msgstr ""
51+msgstr "날씨"
5252
5353#: Applications/applications.js:68
5454msgid "Notepad"
55−msgstr ""
55+msgstr "메모장"
5656
5757#: Applications/applications.js:74
5858msgid "Calendar"
59−msgstr ""
59+msgstr "달력"
6060
6161#: Applications/applications.js:80
6262msgid "Media Player"
63−msgstr ""
63+msgstr "미디어 재생기"
6464
6565#: Applications/applications.js:86
6666msgid "Evernote"
67−msgstr ""
67+msgstr "에버노트"
6868
6969#: Applications/applications.js:91
7070msgid "Map"
71−msgstr ""
71+msgstr "지도"
7272
7373#: Applications/applications.js:96
7474msgid "Pinterest"
75−msgstr ""
75+msgstr "핀터레스트"
7676
7777#: Applications/applications.js:101
7878msgid "SoundCloud"
79−msgstr ""
79+msgstr "사운드클라우드"
8080
8181#: Applications/applications.js:106
8282msgid "Wikipedia"
83−msgstr ""
83+msgstr "위키백과"
8484
8585#: Applications/applications.js:111
8686msgid "YouTube"
87−msgstr ""
87+msgstr "유튜브"
8888
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
9090msgid "Skip intro"
91−msgstr ""
91+msgstr "도입부 건너뛰기"
9292
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
9494msgid "Right edge"
95−msgstr ""
95+msgstr "오른쪽 끝"
9696
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
9898msgid "Try swiping from the right edge to unlock the phone"
9999msgstr ""
100100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102102msgid "Top edge"
103103msgstr ""
104104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106106msgid "Try swiping from the top edge to access the indicators"
107107msgstr ""
108108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110110msgid "Close"
111111msgstr ""
112112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114114msgid "Swipe up again to close the settings screen"
115115msgstr ""
116116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118118msgid "Left edge"
119119msgstr ""
120120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123123msgstr ""
124124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126126msgid "Well done"
127127msgstr ""
128128
129−#: Components/EdgeDemo.qml:218
130−msgid "You have now mastered the edge gestures and can start using the phone"
129+#: Components/EdgeDemo.qml:227
130+msgid ""
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131133msgstr ""
132134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134136msgid "Recent searches"
135−msgstr "요즈음 찿은 것들"
137+msgstr "최근 검색"
136138
137139#. TRANSLATORS: Number of persons who rated this app
138−#: Dash/Apps/AppInfo.qml:73
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139142#, qt-format
140143msgid "(%1)"
141144msgstr ""
142145
143146#. TRANSLATORS: Number of persons who wrote reviews for this app
144−#: Dash/Apps/AppInfo.qml:85
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145149#, qt-format
146150msgid "%1 review"
147151msgid_plural "%1 reviews"
148152msgstr[0] ""
149153msgstr[1] ""
150154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152156msgid "Rate this"
153157msgstr ""
154158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156160msgid "Add a review"
157161msgstr ""
158162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160164msgid "Review"
161165msgstr ""
162166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164168msgid "Send"
165169msgstr ""
166170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168172msgid "Comments:"
169173msgstr ""
170174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "음악"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr ""
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212176msgid "Emergency Call"
213177msgstr ""
214178
@@ -243,13 +207,20 @@ msgstr ""
243207
244208#: Panel/SearchIndicator.qml:27
245209msgid "Search"
246−msgstr "찾기"
210+msgstr "검색"
247211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249213msgid "Sorry, there is nothing that matches your search."
250214msgstr ""
251215
252−#: Shell.qml:429
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
220+#: Shell.qml:438
253221#, qt-format
254222msgid "Please enter %1"
255223msgstr ""
224+
225+#~ msgid "Music"
226+#~ msgstr "음악"
po/ky.po+40−66
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
1111"PO-Revision-Date: 2013-06-27 06:17+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Kirghiz <ky@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
2020
2121#: Applications/applications.js:23
2222msgid "Phone"
@@ -86,129 +86,93 @@ msgstr ""
8686msgid "YouTube"
8787msgstr ""
8888
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
9090msgid "Skip intro"
9191msgstr ""
9292
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
9494msgid "Right edge"
9595msgstr ""
9696
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
9898msgid "Try swiping from the right edge to unlock the phone"
9999msgstr ""
100100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102102msgid "Top edge"
103103msgstr ""
104104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106106msgid "Try swiping from the top edge to access the indicators"
107107msgstr ""
108108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110110msgid "Close"
111111msgstr ""
112112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114114msgid "Swipe up again to close the settings screen"
115115msgstr ""
116116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118118msgid "Left edge"
119119msgstr ""
120120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123123msgstr ""
124124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126126msgid "Well done"
127127msgstr ""
128128
129−#: Components/EdgeDemo.qml:218
130−msgid "You have now mastered the edge gestures and can start using the phone"
129+#: Components/EdgeDemo.qml:227
130+msgid ""
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131133msgstr ""
132134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134136msgid "Recent searches"
135137msgstr "Соңку издөөлөр"
136138
137139#. TRANSLATORS: Number of persons who rated this app
138−#: Dash/Apps/AppInfo.qml:73
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139142#, qt-format
140143msgid "(%1)"
141144msgstr ""
142145
143146#. TRANSLATORS: Number of persons who wrote reviews for this app
144−#: Dash/Apps/AppInfo.qml:85
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145149#, qt-format
146150msgid "%1 review"
147151msgid_plural "%1 reviews"
148152msgstr[0] ""
149153msgstr[1] ""
150154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152156msgid "Rate this"
153157msgstr ""
154158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156160msgid "Add a review"
157161msgstr ""
158162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160164msgid "Review"
161165msgstr ""
162166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164168msgid "Send"
165169msgstr ""
166170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168172msgid "Comments:"
169173msgstr ""
170174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Музыка"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Видеолор"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212176msgid "Emergency Call"
213177msgstr ""
214178
@@ -245,11 +209,21 @@ msgstr "Сүйлөнүүдө..."
245209msgid "Search"
246210msgstr "Издөө"
247211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249213msgid "Sorry, there is nothing that matches your search."
250214msgstr "Тилекке каршы, сиздин издөөңүзгө эч нерсе дал келген жок."
251215
252−#: Shell.qml:429
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
220+#: Shell.qml:438
253221#, qt-format
254222msgid "Please enter %1"
255223msgstr ""
224+
225+#~ msgid "Music"
226+#~ msgstr "Музыка"
227+
228+#~ msgid "Videos"
229+#~ msgstr "Видеолор"
po/lo.ponew file+229
@@ -0,0 +1,229 @@
1+# Lao translation for unity8
2+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11+"PO-Revision-Date: 2013-10-02 10:00+0000\n"
12+"Last-Translator: Anousak <anousak@gmail.com>\n"
13+"Language-Team: Lao <lo@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=1; plural=0;\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
20+
21+#: Applications/applications.js:23
22+msgid "Phone"
23+msgstr "ໂທລະສັບ"
24+
25+#: Applications/applications.js:29
26+msgid "Camera"
27+msgstr "ກ້ອງ"
28+
29+#: Applications/applications.js:35
30+msgid "Gallery"
31+msgstr "Gallery"
32+
33+#: Applications/applications.js:40
34+msgid "Facebook"
35+msgstr "Facebook"
36+
37+#: Applications/applications.js:46
38+msgid "Browser"
39+msgstr "ບາວເຊິ"
40+
41+#: Applications/applications.js:51
42+msgid "Twitter"
43+msgstr "Twitter"
44+
45+#: Applications/applications.js:57
46+msgid "GMail"
47+msgstr "GMail"
48+
49+#: Applications/applications.js:62
50+msgid "Weather"
51+msgstr "ສະພາບອາກາດ"
52+
53+#: Applications/applications.js:68
54+msgid "Notepad"
55+msgstr "Noetpad"
56+
57+#: Applications/applications.js:74
58+msgid "Calendar"
59+msgstr "ປະຕິທິນ"
60+
61+#: Applications/applications.js:80
62+msgid "Media Player"
63+msgstr ""
64+
65+#: Applications/applications.js:86
66+msgid "Evernote"
67+msgstr ""
68+
69+#: Applications/applications.js:91
70+msgid "Map"
71+msgstr "ເເຜນທີ່"
72+
73+#: Applications/applications.js:96
74+msgid "Pinterest"
75+msgstr ""
76+
77+#: Applications/applications.js:101
78+msgid "SoundCloud"
79+msgstr ""
80+
81+#: Applications/applications.js:106
82+msgid "Wikipedia"
83+msgstr ""
84+
85+#: Applications/applications.js:111
86+msgid "YouTube"
87+msgstr "ິYouTube"
88+
89+#: Components/EdgeDemoOverlay.qml:149
90+msgid "Skip intro"
91+msgstr ""
92+
93+#: Components/EdgeDemo.qml:112
94+msgid "Right edge"
95+msgstr ""
96+
97+#: Components/EdgeDemo.qml:113
98+msgid "Try swiping from the right edge to unlock the phone"
99+msgstr ""
100+
101+#: Components/EdgeDemo.qml:144
102+msgid "Top edge"
103+msgstr ""
104+
105+#: Components/EdgeDemo.qml:145
106+msgid "Try swiping from the top edge to access the indicators"
107+msgstr ""
108+
109+#: Components/EdgeDemo.qml:170
110+msgid "Close"
111+msgstr "ປິດ"
112+
113+#: Components/EdgeDemo.qml:171
114+msgid "Swipe up again to close the settings screen"
115+msgstr ""
116+
117+#: Components/EdgeDemo.qml:198
118+msgid "Left edge"
119+msgstr ""
120+
121+#: Components/EdgeDemo.qml:199
122+msgid "Swipe from the left to reveal the launcher for quick access to apps"
123+msgstr ""
124+
125+#: Components/EdgeDemo.qml:226
126+msgid "Well done"
127+msgstr "ດີຫຼາຍ"
128+
129+#: Components/EdgeDemo.qml:227
130+msgid ""
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
133+msgstr ""
134+
135+#: Components/PageHeader.qml:341
136+msgid "Recent searches"
137+msgstr ""
138+
139+#. TRANSLATORS: Number of persons who rated this app
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
142+#, qt-format
143+msgid "(%1)"
144+msgstr "(%1)"
145+
146+#. TRANSLATORS: Number of persons who wrote reviews for this app
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
149+#, qt-format
150+msgid "%1 review"
151+msgid_plural "%1 reviews"
152+msgstr[0] ""
153+msgstr[1] ""
154+
155+#: Dash/Apps/AppPreview.qml:126
156+msgid "Rate this"
157+msgstr ""
158+
159+#: Dash/Previews/Reviews.qml:74
160+msgid "Add a review"
161+msgstr ""
162+
163+#: Dash/Previews/Reviews.qml:86
164+msgid "Review"
165+msgstr ""
166+
167+#: Dash/Previews/Reviews.qml:121
168+msgid "Send"
169+msgstr "ສົ່ງ"
170+
171+#: Dash/Previews/Reviews.qml:139
172+msgid "Comments:"
173+msgstr "ຄໍ່ເຫັນ"
174+
175+#: Greeter/Lockscreen.qml:142
176+msgid "Emergency Call"
177+msgstr ""
178+
179+#: Greeter/PassphraseLockscreen.qml:59
180+#, qt-format
181+msgid "Hello %1"
182+msgstr "ສະບາຍດີ %1"
183+
184+#: Greeter/PassphraseLockscreen.qml:59
185+msgid "Hello"
186+msgstr "ສະບາຍດີ"
187+
188+#: Hud/HudParametrizedActionsPage.qml:132
189+msgid "Confirm"
190+msgstr "ຢືນຢັນ"
191+
192+#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
193+msgid "Type or say a command"
194+msgstr ""
195+
196+#: Hud/Hud.qml:84
197+msgid "Loading. Please Wait..."
198+msgstr ""
199+
200+#: Hud/Hud.qml:89
201+msgid "Speak Now..."
202+msgstr "ເວົ້າໂລດ"
203+
204+#: Hud/Hud.qml:94
205+msgid "Speaking..."
206+msgstr "ກໍາລັງເວົ້າ"
207+
208+#: Panel/SearchIndicator.qml:27
209+msgid "Search"
210+msgstr "ຊອກຫາ"
211+
212+#: plugins/Unity/scope.cpp:398
213+msgid "Sorry, there is nothing that matches your search."
214+msgstr ""
215+
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr "ທັງໝົດ"
219+
220+#: Shell.qml:438
221+#, qt-format
222+msgid "Please enter %1"
223+msgstr "ກະລູນາປ້ອນ %1"
224+
225+#~ msgid "Videos"
226+#~ msgstr "ວິດີໂອ"
227+
228+#~ msgid "Music"
229+#~ msgstr "ດົນຕີ"
po/lv.po+59−85
@@ -7,60 +7,60 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
11−"PO-Revision-Date: 2013-06-27 06:31+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11+"PO-Revision-Date: 2013-09-28 16:29+0000\n"
12+"Last-Translator: Jānis-Marks Gailis <jeanmarc.gailis@gmail.com>\n"
1313"Language-Team: Latvian <lv@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
2020
2121#: Applications/applications.js:23
2222msgid "Phone"
23−msgstr ""
23+msgstr "Tālrunis"
2424
2525#: Applications/applications.js:29
2626msgid "Camera"
27−msgstr ""
27+msgstr "Fotokamera"
2828
2929#: Applications/applications.js:35
3030msgid "Gallery"
31−msgstr ""
31+msgstr "Galerija"
3232
3333#: Applications/applications.js:40
3434msgid "Facebook"
35−msgstr ""
35+msgstr "Facebook"
3636
3737#: Applications/applications.js:46
3838msgid "Browser"
39−msgstr ""
39+msgstr "Pārlūkprogramma"
4040
4141#: Applications/applications.js:51
4242msgid "Twitter"
43−msgstr ""
43+msgstr "Twitter"
4444
4545#: Applications/applications.js:57
4646msgid "GMail"
47−msgstr ""
47+msgstr "GMail"
4848
4949#: Applications/applications.js:62
5050msgid "Weather"
51−msgstr ""
51+msgstr "Laikapstākļi"
5252
5353#: Applications/applications.js:68
5454msgid "Notepad"
55−msgstr ""
55+msgstr "Bloknots"
5656
5757#: Applications/applications.js:74
5858msgid "Calendar"
59−msgstr ""
59+msgstr "Kalendārs"
6060
6161#: Applications/applications.js:80
6262msgid "Media Player"
63−msgstr ""
63+msgstr "Mēdiju Atskaņotājs"
6464
6565#: Applications/applications.js:86
6666msgid "Evernote"
@@ -68,147 +68,111 @@ msgstr ""
6868
6969#: Applications/applications.js:91
7070msgid "Map"
71−msgstr ""
71+msgstr "Karte"
7272
7373#: Applications/applications.js:96
7474msgid "Pinterest"
75−msgstr ""
75+msgstr "Pinterest"
7676
7777#: Applications/applications.js:101
7878msgid "SoundCloud"
79−msgstr ""
79+msgstr "SoundCloud"
8080
8181#: Applications/applications.js:106
8282msgid "Wikipedia"
83−msgstr ""
83+msgstr "Vikipēdija"
8484
8585#: Applications/applications.js:111
8686msgid "YouTube"
87−msgstr ""
87+msgstr "YouTube"
8888
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
9090msgid "Skip intro"
9191msgstr ""
9292
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
9494msgid "Right edge"
95−msgstr ""
95+msgstr "Labā mala"
9696
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
9898msgid "Try swiping from the right edge to unlock the phone"
9999msgstr ""
100100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102102msgid "Top edge"
103103msgstr ""
104104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106106msgid "Try swiping from the top edge to access the indicators"
107107msgstr ""
108108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110110msgid "Close"
111111msgstr ""
112112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114114msgid "Swipe up again to close the settings screen"
115115msgstr ""
116116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118118msgid "Left edge"
119119msgstr ""
120120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123123msgstr ""
124124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126126msgid "Well done"
127127msgstr ""
128128
129−#: Components/EdgeDemo.qml:218
130−msgid "You have now mastered the edge gestures and can start using the phone"
129+#: Components/EdgeDemo.qml:227
130+msgid ""
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131133msgstr ""
132134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134136msgid "Recent searches"
135137msgstr "Nesen veiktās meklēšanas"
136138
137139#. TRANSLATORS: Number of persons who rated this app
138−#: Dash/Apps/AppInfo.qml:73
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139142#, qt-format
140143msgid "(%1)"
141144msgstr ""
142145
143146#. TRANSLATORS: Number of persons who wrote reviews for this app
144−#: Dash/Apps/AppInfo.qml:85
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145149#, qt-format
146150msgid "%1 review"
147151msgid_plural "%1 reviews"
148152msgstr[0] ""
149153msgstr[1] ""
150154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152156msgid "Rate this"
153157msgstr ""
154158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156160msgid "Add a review"
157161msgstr ""
158162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160164msgid "Review"
161165msgstr ""
162166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164168msgid "Send"
165169msgstr ""
166170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168172msgid "Comments:"
169173msgstr ""
170174
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "Mūzika"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "Video"
198−
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212176msgid "Emergency Call"
213177msgstr ""
214178
@@ -245,11 +209,21 @@ msgstr "Runa..."
245209msgid "Search"
246210msgstr "Meklēt"
247211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249213msgid "Sorry, there is nothing that matches your search."
250214msgstr "Diemžēl nekas neatbilst jūsu meklētajam."
251215
252−#: Shell.qml:429
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
220+#: Shell.qml:438
253221#, qt-format
254222msgid "Please enter %1"
255223msgstr ""
224+
225+#~ msgid "Music"
226+#~ msgstr "Mūzika"
227+
228+#~ msgid "Videos"
229+#~ msgstr "Video"
po/my.po+78−95
@@ -7,208 +7,172 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-08-27 13:36-0400\n"
11−"PO-Revision-Date: 2013-06-27 06:47+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
10+"POT-Creation-Date: 2013-10-11 12:12+0200\n"
11+"PO-Revision-Date: 2013-10-09 11:35+0000\n"
12+"Last-Translator: Pyae Sone <Unknown>\n"
1313"Language-Team: Burmese <my@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2013-08-30 05:37+0000\n"
19−"X-Generator: Launchpad (build 16750)\n"
18+"X-Launchpad-Export-Date: 2013-10-13 05:43+0000\n"
19+"X-Generator: Launchpad (build 16799)\n"
2020
2121#: Applications/applications.js:23
2222msgid "Phone"
23−msgstr ""
23+msgstr "ဖုန်း"
2424
2525#: Applications/applications.js:29
2626msgid "Camera"
27−msgstr ""
27+msgstr "ကင်မရာ"
2828
2929#: Applications/applications.js:35
3030msgid "Gallery"
31−msgstr ""
31+msgstr "ဓာတ်ပုံသိမ်းထားသည့်နေရာ"
3232
3333#: Applications/applications.js:40
3434msgid "Facebook"
35−msgstr ""
35+msgstr "Facebook"
3636
3737#: Applications/applications.js:46
3838msgid "Browser"
39−msgstr ""
39+msgstr "Browser"
4040
4141#: Applications/applications.js:51
4242msgid "Twitter"
43−msgstr ""
43+msgstr "Twitter"
4444
4545#: Applications/applications.js:57
4646msgid "GMail"
47−msgstr ""
47+msgstr "ဂျီမေးလ်"
4848
4949#: Applications/applications.js:62
5050msgid "Weather"
51−msgstr ""
51+msgstr "ရာသီဥတု"
5252
5353#: Applications/applications.js:68
5454msgid "Notepad"
55−msgstr ""
55+msgstr "Notepad"
5656
5757#: Applications/applications.js:74
5858msgid "Calendar"
59−msgstr ""
59+msgstr "ပြက္ခဒိန်"
6060
6161#: Applications/applications.js:80
6262msgid "Media Player"
63−msgstr ""
63+msgstr "မီဒီယာဖွင့်စက်"
6464
6565#: Applications/applications.js:86
6666msgid "Evernote"
67−msgstr ""
67+msgstr "Evernote"
6868
6969#: Applications/applications.js:91
7070msgid "Map"
71−msgstr ""
71+msgstr "မြေပုံ"
7272
7373#: Applications/applications.js:96
7474msgid "Pinterest"
75−msgstr ""
75+msgstr "Pinterest"
7676
7777#: Applications/applications.js:101
7878msgid "SoundCloud"
79−msgstr ""
79+msgstr "SoundCloud"
8080
8181#: Applications/applications.js:106
8282msgid "Wikipedia"
83−msgstr ""
83+msgstr "ဝီကီပီဒီးယား"
8484
8585#: Applications/applications.js:111
8686msgid "YouTube"
87−msgstr ""
87+msgstr "YouTube"
8888
89−#: Components/EdgeDemoOverlay.qml:145
89+#: Components/EdgeDemoOverlay.qml:149
9090msgid "Skip intro"
91−msgstr ""
91+msgstr "မိတ်ဆက်ကိုကျော်မည်"
9292
93−#: Components/EdgeDemo.qml:98
93+#: Components/EdgeDemo.qml:112
9494msgid "Right edge"
95−msgstr ""
95+msgstr "ညာဖက် အစွန်း"
9696
97−#: Components/EdgeDemo.qml:99
97+#: Components/EdgeDemo.qml:113
9898msgid "Try swiping from the right edge to unlock the phone"
9999msgstr ""
100100
101−#: Components/EdgeDemo.qml:135
101+#: Components/EdgeDemo.qml:144
102102msgid "Top edge"
103−msgstr ""
103+msgstr "ထိပ် အစွန်း"
104104
105−#: Components/EdgeDemo.qml:136
105+#: Components/EdgeDemo.qml:145
106106msgid "Try swiping from the top edge to access the indicators"
107107msgstr ""
108108
109−#: Components/EdgeDemo.qml:161
109+#: Components/EdgeDemo.qml:170
110110msgid "Close"
111−msgstr ""
111+msgstr "ပိတ်"
112112
113−#: Components/EdgeDemo.qml:162
113+#: Components/EdgeDemo.qml:171
114114msgid "Swipe up again to close the settings screen"
115115msgstr ""
116116
117−#: Components/EdgeDemo.qml:189
117+#: Components/EdgeDemo.qml:198
118118msgid "Left edge"
119−msgstr ""
119+msgstr "ဘယ်​ဖက် အစွန်း"
120120
121−#: Components/EdgeDemo.qml:190
121+#: Components/EdgeDemo.qml:199
122122msgid "Swipe from the left to reveal the launcher for quick access to apps"
123123msgstr ""
124124
125−#: Components/EdgeDemo.qml:217
125+#: Components/EdgeDemo.qml:226
126126msgid "Well done"
127−msgstr ""
127+msgstr "ကောင်းအောင်ပြုလုပ်ခဲ့သည်"
128128
129−#: Components/EdgeDemo.qml:218
130−msgid "You have now mastered the edge gestures and can start using the phone"
129+#: Components/EdgeDemo.qml:227
130+msgid ""
131+"You have now mastered the edge gestures and can start using the "
132+"phone<br><br>Tap anywhere to start"
131133msgstr ""
132134
133−#: Components/PageHeader.qml:298
135+#: Components/PageHeader.qml:341
134136msgid "Recent searches"
135137msgstr "မကြာသေးခင်က ရှာဖွေခြင်း"
136138
137139#. TRANSLATORS: Number of persons who rated this app
138−#: Dash/Apps/AppInfo.qml:73
140+#. TRANSLATORS: Number of persons who rated this app/video/whatever
141+#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
139142#, qt-format
140143msgid "(%1)"
141−msgstr ""
144+msgstr "(%1)"
142145
143146#. TRANSLATORS: Number of persons who wrote reviews for this app
144−#: Dash/Apps/AppInfo.qml:85
147+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148+#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
145149#, qt-format
146150msgid "%1 review"
147151msgid_plural "%1 reviews"
148152msgstr[0] ""
149153msgstr[1] ""
150154
151−#: Dash/Apps/AppPreview.qml:175
155+#: Dash/Apps/AppPreview.qml:126
152156msgid "Rate this"
153−msgstr ""
157+msgstr "ဒီဟာကိုအမှတ်ပေးမည်"
154158
155−#: Dash/Apps/AppReviews.qml:72
159+#: Dash/Previews/Reviews.qml:74
156160msgid "Add a review"
157161msgstr ""
158162
159−#: Dash/Apps/AppReviews.qml:84
163+#: Dash/Previews/Reviews.qml:86
160164msgid "Review"
161165msgstr ""
162166
163−#: Dash/Apps/AppReviews.qml:118
167+#: Dash/Previews/Reviews.qml:121
164168msgid "Send"
165−msgstr ""
169+msgstr "ပို့မည်"
166170
167−#: Dash/Apps/AppReviews.qml:136
171+#: Dash/Previews/Reviews.qml:139
168172msgid "Comments:"
169−msgstr ""
170−
171−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
172−msgid "Featured"
173−msgstr ""
174−
175−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
176−msgid "Recent"
177−msgstr ""
178−
179−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
180−msgid "New Releases"
181−msgstr ""
182−
183−#: Dash/DashMusic.qml:30
184−msgid "Top Charting"
185−msgstr ""
186−
187−#: Dash/DashMusic.qml:91
188−msgid "Music"
189−msgstr "တေးဂီတ"
190−
191−#: Dash/DashVideos.qml:31
192−msgid "Popular Online"
193−msgstr ""
194−
195−#: Dash/DashVideos.qml:146
196−msgid "Videos"
197−msgstr "ဗီဒီယိုများ"
173+msgstr "မှတ်ချက်များ-"
198174
199−#: Dash/Video/VideoPreview.qml:130
200−msgid "Directed by:"
201−msgstr ""
202−
203−#: Dash/Video/VideoPreview.qml:153
204−msgid "Starring:"
205−msgstr ""
206−
207−#: Dash/Video/VideoPreview.qml:176
208−msgid "Author:"
209−msgstr ""
210−
211−#: Greeter/Lockscreen.qml:134
175+#: Greeter/Lockscreen.qml:142
212176msgid "Emergency Call"
213177msgstr ""
214178
@@ -245,11 +209,30 @@ msgstr "ပြောနေသည်"
245209msgid "Search"
246210msgstr "ရှာဖွေ"
247211
248−#: plugins/Unity/scope.cpp:317
212+#: plugins/Unity/scope.cpp:398
249213msgid "Sorry, there is nothing that matches your search."
250214msgstr "ဆောရီး၊ သင်၏ရှာဖွေမူနှင့်တူညီတာဘာမှမရှိပါ။"
251215
252−#: Shell.qml:429
216+#: plugins/Unity/showallfilteroption.cpp:41
217+msgid "All"
218+msgstr ""
219+
220+#: Shell.qml:438
253221#, qt-format
254222msgid "Please enter %1"
255223msgstr ""
224+
225+#~ msgid "Music"
226+#~ msgstr "တေးဂီတ"
227+
228+#~ msgid "Videos"
229+#~ msgstr "ဗီဒီယိုများ"
230+
231+#~ msgid "New Releases"
232+#~ msgstr "အသစ်ထွက်ရှိသော"
233+
234+#~ msgid "Recent"
235+#~ msgstr "မကြာသေးခင်က"
236+
237+#~ msgid "Popular Online"
238+#~ msgstr "အွန်လိုင်းတွင်ပေါ်ပြူလာဖြစ်သော"
po/nb.po+40−66

This diff is too big to show here.

po/nl.po+40−66

This diff is too big to show here.

po/pl.po+59−86

This diff is too big to show here.

po/pt_BR.po+97−106

This diff is too big to show here.

po/ro.po+40−66

This diff is too big to show here.

po/ru.po+81−88

This diff is too big to show here.

po/shn.ponew file+223

This diff is too big to show here.

po/si.po+34−66

This diff is too big to show here.

po/sl.po+58−68

This diff is too big to show here.

po/sr.po+40−66

This diff is too big to show here.

po/sv.po+34−66

This diff is too big to show here.

po/te.po+37−66

This diff is too big to show here.

po/tr.po+81−91

This diff is too big to show here.

po/ug.po+61−79

This diff is too big to show here.

po/uk.po+78−85

This diff is too big to show here.

po/unity8.pot+32−64

This diff is too big to show here.

po/xh.ponew file+223

This diff is too big to show here.

po/zh_CN.po+57−68

This diff is too big to show here.

po/zh_TW.po+40−66

This diff is too big to show here.

run_on_device+1−1

This diff is too big to show here.

src/Panel/Indicators/CMakeLists.txt−1

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/AccountsService/AccountsService.h+8

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/QMenuModel/qmldir+1

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/Unity/Indicators/qmldir+2

This diff is too big to show here.

tests/mocks/Unity/fake_applications_scope.cpp+7

This diff is too big to show here.

tests/mocks/Unity/fake_categories.cpp+6

This diff is too big to show here.

tests/mocks/Unity/fake_categories.h+1

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/Unity/fake_preview.h−2

This diff is too big to show here.

tests/mocks/Unity/fake_scope.cpp+26

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/plugins/ListViewWithPageHeader/listviewwithpageheadertest.cpp+124

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/plugins/Unity/previewbindingstest.cpp+27

This diff is too big to show here.

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

This diff is too big to show here.

tests/plugins/Unity/resultstest.h+2

This diff is too big to show here.

tests/qmltests/CMakeLists.txt+6−4

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

tests/qmltests/Components/tst_PageHeader.qml+28

This diff is too big to show here.

tests/qmltests/Components/tst_Showable.qml+27

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/qmltests/Greeter/tst_Phone.qml+16

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/qmltests/tst_GreeterShell.qml+1−1

This diff is too big to show here.

tests/qmltests/tst_Shell.qml+119−1

This diff is too big to show here.