on xenial help sign in
merge
commit3d5644993592f12c01e5345b98f1643d79c53f07 authorMichael Zanetti <michael.zanetti@canonical.com> dateTue 13 May 2014, 12:41 (12 years ago) parentd906c2d7d03ee9
292 files changed+7015−10597
.bazaar/plugins/makecheck_unity_phablet.py+1−1 build+3 cmake/modules/QmlTest.cmake+60−2 data/unity8.conf+10−1 debian/changelog+232 debian/control+15−8 debian/rules−5 debian/scopes-recommends-generator−27 debian/unity8-fake-env.install+1 debian/unity8.install+1−1 include/paths.h.in+10 plugins/DashViews/listviewwithpageheader.cpp+42−13 plugins/Powerd/CMakeLists.txt+8 plugins/Powerd/Powerd.cpp+17 plugins/Powerd/Powerd.h+3 plugins/Unity/Indicators/qml/MenuItemFactory.qml+7−1 plugins/Unity/Launcher/backend/launcherbackend.cpp+10−2 plugins/Utils/CMakeLists.txt+2−3 plugins/Utils/albumartprovider.cpp−236 plugins/Utils/albumartprovider.h−56 plugins/Utils/easingcurve.cpp+67 plugins/Utils/easingcurve.h+70 plugins/Utils/mediaartcache.cpp−178 plugins/Utils/mediaartcache.h−54 plugins/Utils/plugin.cpp+2−14 po/am.po+24−30 po/ar.po+38−35 po/ast.po+19−33 po/az.po+34−31 po/bg.po+20−34 po/bs.po+16−29 po/ca.po+33−30 po/ckb.po+34−31 po/cs.po+35−32 po/da.po+16−29 po/de.po+34−31 po/el.po+34−31 po/en_AU.po+34−31 po/en_GB.po+34−31 po/eo.po+16−29 po/es.po+19−33 po/eu.po+20−34 po/fa.po+16−29 po/fi.po+19−33 po/fo.po+16−29 po/fr.po+34−31 po/gd.po+36−33 po/gl.po+19−33 po/he.po+34−31 po/hi.po+19−29 po/hr.po+16−29 po/hu.po+34−31 po/hy.po+16−29 po/id.po+16−29 po/is.po+34−31 po/it.po+34−31 po/ja.po+24−30 po/km.po+33−30 po/kn.po+16−29 po/ko.po+16−29 po/ky.po+16−29 po/lo.po+24−30 po/lt.po+35−32 po/lv.po+16−29 po/ml.po+34−31 po/mr.po+16−29 po/ms.po+34−31 po/my.po+25−31 po/nb.po+16−29 po/nl.po+34−31 po/pl.po+35−32 po/pt.po+16−29 po/pt_BR.po+34−31 po/ro.po+16−29 po/ru.po+26−40 po/shn.po+16−29 po/si.po+16−29 po/sl.po+36−33 po/sq.po+28−31 po/sr.po+16−29 po/sv.po+16−29 po/sw.po+19−29 po/ta.po+35−32 po/te.po+16−29 po/tr.po+34−31 po/ug.po+33−30 po/uk.po+35−32 po/unity8.pot+14−28 po/vi.po+16−29 po/xh.po+16−29 po/zh_CN.po+16−29 po/zh_HK.po+33−30 po/zh_TW.po+33−30 qml/CMakeLists.txt+1−1 qml/Components/ApplicationManagerWrapper.qml−169 qml/Components/ApplicationScreenshot.qml−61 qml/Components/ApplicationsModelStageFiltered.qml−49 qml/Components/Carousel.qml+69−63 qml/Components/LazyImage.qml+2−2 qml/Components/ListItems/Header.qml+2−14 qml/Components/OpenEffect.qml−138 qml/Components/PageHeader.qml+27−2 qml/Components/RatingStars.qml−41 qml/Components/ResponsiveFlowView.qml+3−10 qml/Components/ResponsiveGridView.qml−1 qml/Components/SeeMore.qml+4−2 qml/Components/Stage.qml−563 qml/Components/Tile.qml−39 qml/Components/TileStyle.qml−81 qml/Components/VolumeControl.qml+6−2 qml/Components/graphics/headerback@27.png qml/Dash/Apps/AppPreview.qml−167 qml/Dash/Apps/DashPluginFilterGrid.qml−47 qml/Dash/Apps/FrequentlyUsedAppsModel.qml−110 qml/Dash/Apps/RunningApplicationTile.qml+16−27 qml/Dash/Apps/RunningApplicationsGrid.qml+5−20 qml/Dash/Card.qml+43−14 qml/Dash/DashCarousel.qml → qml/Dash/CardCarousel.qml+30−8 qml/Dash/CardFilterGrid.qml+73 qml/Dash/CardHeader.qml+32−60 qml/Dash/CardTool.qml+47−9 qml/Dash/Dash.qml+57−4 qml/Dash/DashApps.qml+7−23 qml/Dash/DashContent.qml+75−48 qml/Dash/DashContentOpenEffect.qml−57 qml/Dash/DashContentTabBarStyle.qml+3 qml/Dash/DashFilterGrid.qml−65 qml/Dash/DashHome.qml−39 qml/Dash/DashPreview.qml−208 qml/Dash/DashPreviewPlaceholder.qml−25 qml/Dash/DashRenderer.qml+5−9 qml/Dash/Generic/FlatTileStyle.qml−79 qml/Dash/Generic/GenericCarousel.qml−53 qml/Dash/Generic/GenericFilterGrid.qml−46 qml/Dash/Generic/GenericFilterGridPotrait.qml−28 qml/Dash/Generic/GenericPreview.qml−197 qml/Dash/Generic/WeatherFilterGrid.qml−47 qml/Dash/GenericScopeView.qml+66−134 qml/Dash/Movie/MoviePreview.qml−71 qml/Dash/Music/CarouselDelegateMusic.qml−42 qml/Dash/Music/MusicCarousel.qml−34 qml/Dash/Music/MusicFilterGrid.qml−48 qml/Dash/Music/MusicPreview.qml−203 qml/Dash/Music/MusicTileStyle.qml−102 qml/Dash/PreviewDelegateMapper.qml−38 qml/Dash/PreviewListView.qml+52−133 qml/Dash/Previews/Header.qml−109 qml/Dash/Previews/Preview.qml+17−23 qml/Dash/Previews/PreviewActions.qml+1−1 qml/Dash/Previews/PreviewAudioPlayback.qml+4−3 qml/Dash/Previews/PreviewHeader.qml+5−1 qml/Dash/Previews/PreviewImageGallery.qml+19 qml/Dash/Previews/PreviewRatingInput.qml+1−1 qml/Dash/Previews/PreviewTextSummary.qml+6−3 qml/Dash/Previews/PreviewVideoPlayback.qml+1 qml/Dash/Previews/PreviewWidgetFactory.qml+1−1 qml/Dash/Previews/Reviews.qml−194 qml/Dash/ScopeDelegateMapper.qml+1−3 qml/Dash/ScopeItem.qml+94 qml/Dash/SearchableResultModel.qml−44 qml/Dash/Video/CarouselDelegateVideo.qml−42 qml/Dash/Video/VideoCarousel.qml−34 qml/Dash/Video/VideoFilterGrid.qml−47 qml/Dash/Video/VideoTileStyle.qml−87 qml/Dash/Video/graphics/icon_button_amazon@20.png qml/Dash/Video/graphics/icon_button_u1@20.png qml/Dash/Video/graphics/movie_icon_holder@27.png qml/Dash/graphics/dash_divider_top_darkgrad@27.png qml/Dash/graphics/dash_divider_top_lightgrad@27.png qml/Dash/graphics/header_handlearrow2@20.png qml/Dash/graphics/header_handlearrow2@27.png qml/Dash/graphics/header_handlearrow@20.png qml/Dash/graphics/header_handlearrow@27.png qml/Dash/graphics/paper_landscape@27.png qml/Dash/graphics/paper_portrait@27.png qml/Dash/graphics/tabbarchevron@27.png qml/Launcher/Launcher.qml+2−2 qml/Launcher/LauncherPanel.qml−1 qml/Notifications/Notification.qml+61−4 qml/Notifications/Notifications.qml+4 qml/Panel/IndicatorRow.qml+1−1 qml/Panel/Panel.qml+1−1 qml/ScopeTool.qml+9−1 qml/Shell.qml+203−327 qml/SideStage/SideStage.qml−73 qml/Stages/PhoneStage.qml+499 qml/SideStage/SidestageHandle.qml → qml/Stages/SidestageHandle.qml qml/Stages/SpreadDelegate.qml+55 qml/Stages/StageWithSideStage.qml+407 qml/Stages/SwitchingApplicationImage.qml+81 qml/Stages/TransformedSpreadDelegate.qml+327 qml/Stages/graphics/dropshadow.png qml/SideStage/graphics/sidestage_handle@20.png → qml/Stages/graphics/sidestage_handle@20.png qml/SideStage/graphics/sidestage_handle@20.sci → qml/Stages/graphics/sidestage_handle@20.sci src/ApplicationArguments.h+2−2 src/Panel/Indicators/client/indicatorsclient.cpp+2−2 src/main.cpp+3−6 tests/CMakeLists.txt+2−2 tests/autopilot/unity8/application_lifecycle/tests/test_url_dispatcher.py+5−40 tests/autopilot/unity8/shell/emulators/dash.py+31−55 tests/autopilot/unity8/shell/emulators/main_window.py+1−5 tests/autopilot/unity8/shell/tests/__init__.py+2−2 tests/autopilot/unity8/shell/tests/test_emulators.py+29−53 tests/autopilot/unity8/shell/tests/test_greeter.py−38 tests/autopilot/unity8/shell/tests/test_notifications.py+1−1 tests/autopilot/unity8/shell/tests/test_system_integration.py+2−1 tests/mocks/Ubuntu/CMakeLists.txt+1 tests/mocks/Ubuntu/Thumbnailer/CMakeLists.txt+7 tests/mocks/Ubuntu/Thumbnailer/qmldir+2 tests/mocks/Unity/Application/ApplicationInfo.cpp+9 tests/mocks/Unity/Application/ApplicationInfo.h+2 tests/mocks/Unity/Application/ApplicationManager.cpp+109−3 tests/mocks/Unity/Application/ApplicationManager.h+16 tests/mocks/Unity/Application/ApplicationScreenshotProvider.cpp+77 tests/mocks/Unity/Application/ApplicationScreenshotProvider.h+34 tests/mocks/Unity/Application/CMakeLists.txt+15 tests/mocks/Unity/Application/plugin.cpp+18−3 tests/mocks/Unity/Application/plugin.h+1 tests/mocks/Unity/CMakeLists.txt+4−4 tests/mocks/Unity/categoryresults.cpp−121 tests/mocks/Unity/categoryresults.h−68 tests/mocks/Unity/fake_applications_scope.cpp−76 tests/mocks/Unity/fake_applications_scope.h−33 tests/mocks/Unity/fake_categories.cpp+109−194 tests/mocks/Unity/fake_categories.h+25−29 tests/mocks/Unity/fake_preview.cpp−73 tests/mocks/Unity/fake_preview.h−65 tests/mocks/Unity/fake_previewmodel.cpp+86 tests/mocks/Unity/fake_previewmodel.h+67 tests/mocks/Unity/fake_previewstack.cpp+76 tests/mocks/Unity/fake_previewstack.h+61 tests/mocks/Unity/scopes-ng/fake_preview_model.cpp → tests/mocks/Unity/fake_previewwidgetmodel.cpp+6−16 tests/mocks/Unity/scopes-ng/fake_preview_model.h → tests/mocks/Unity/fake_previewwidgetmodel.h+6−18 tests/mocks/Unity/fake_resultsmodel.cpp+117 tests/mocks/Unity/fake_resultsmodel.h+80 tests/mocks/Unity/fake_scope.cpp+18−118 tests/mocks/Unity/fake_scope.h+17−18 tests/mocks/Unity/fake_scopes.cpp+1−5 tests/mocks/Unity/fake_unity_plugin.cpp+10−13 tests/plugins/DashViews/listviewwithpageheadertest.cpp+24−7 tests/plugins/DashViews/listviewwithpageheadertestsection.cpp+3−6 tests/plugins/DashViews/organicgridtest.cpp+2−1 tests/plugins/DashViews/verticaljournaltest.cpp+2−1 tests/plugins/Ubuntu/Gestures/CMakeLists.txt+2−11 tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.cpp+8 tests/plugins/Unity/Launcher/launchermodeltest.cpp+5 tests/qmltests/CMakeLists.txt+3−16 tests/qmltests/Components/CMakeLists.txt+2−10 tests/qmltests/Components/tst_Carousel.qml+194−168 tests/qmltests/Components/tst_DragHandle.cpp−1 tests/qmltests/Components/tst_LazyImage.qml+8−1 tests/qmltests/Components/tst_OpenEffect.qml−71 tests/qmltests/Components/tst_PageHeaderLabel.qml+1−1 tests/qmltests/Components/tst_RatingStars.qml−62 tests/qmltests/Components/tst_ResponsiveFlowView.qml+1−2 tests/qmltests/Components/tst_Stage.qml−278 tests/qmltests/Components/tst_Stage/AppControl.qml−42 tests/qmltests/Components/tst_Stage/FakeApplicationScreenshot.qml−53 tests/qmltests/Components/tst_Tile.qml−71 tests/qmltests/Dash/Apps/tst_AppPreview.qml−276 tests/qmltests/Dash/Apps/tst_RunningApplicationsGrid.qml+50−117 tests/qmltests/Dash/Movie/tst_MoviePreview.qml−86 tests/qmltests/Dash/Music/tst_MusicPreview.qml−174 tests/qmltests/Dash/Previews/tst_Preview.qml+4−18 tests/qmltests/Dash/Previews/tst_PreviewRatingInput.qml+1−1 tests/qmltests/Dash/Previews/tst_PreviewVideoPlayback.qml−6 tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qml+3−4 tests/qmltests/Dash/qml/FakeScopeView.qml+1−1 tests/qmltests/Dash/qml/fake_scopeView1.qml+1−1 tests/qmltests/Dash/qml/fake_scopeView2.qml+1−1 tests/qmltests/Dash/qml/fake_scopeView3.qml+1−1 tests/qmltests/Dash/tst_Card.qml+49 tests/qmltests/Dash/tst_CardHeader.qml+1−28 tests/qmltests/Dash/tst_CardTool.qml+21−1 tests/qmltests/Dash/tst_Dash.qml+14−6 tests/qmltests/Dash/tst_DashContent.qml+117−35 tests/qmltests/Dash/tst_DashPreview.qml−202 tests/qmltests/Dash/tst_FilterGrids.qml−143 tests/qmltests/Dash/tst_GenericPreview.qml−125 tests/qmltests/Dash/tst_GenericScopeView.qml+36−246 tests/qmltests/Launcher/tst_Launcher.qml+6−4 tests/qmltests/Notifications/tst_Notifications.qml+27−13 tests/qmltests/Notifications/tst_VisualSnapDecisionsQueue.qml+238 tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+47−6 tests/qmltests/SideStage/tst_SideStage.qml−52 tests/qmltests/Stages/tst_PhoneStage.qml+288 tests/qmltests/tst_Shell.qml+40−35 tests/uqmlscene/main.cpp+13 tests/utils/modules/Unity/Test/UnityTestCase.qml+10−16 tools/registry-tracker.cpp+19−4 tools/registry-tracker.h+7−2 tools/scopetool.cpp+28−8
.bazaar/plugins/makecheck_unity_phablet.py+1−1
@@ -18,7 +18,7 @@ from bzrlib import branch, errors
1818from bzrlib.urlutils import dirname, local_path_from_url
1919
2020def execute_makecheck(local_branch, master_branch, old_revision_number, old_revision_id, future_revision_number, future_revision_id, tree_delta, future_tree):
21− if not master_branch.basis_tree().has_filename("Shell.qml"):
21+ if not master_branch.basis_tree().has_filename("qml/Shell.qml"):
2222 return
2323
2424 os.chdir(local_path_from_url(master_branch.base))
build+3
@@ -41,17 +41,20 @@ install_dependencies() {
4141 sudo apt-get install devscripts \
4242 equivs \
4343 gsettings-desktop-schemas \
44+ gsettings-ubuntu-schemas \
4445 qmenumodel-qml \
4546 qtdeclarative5-dee-plugin \
4647 qtdeclarative5-gsettings1.0 \
4748 qtdeclarative5-ubuntu-ui-toolkit-plugin \
4849 qtdeclarative5-ubuntu-settings-components \
50+ qtdeclarative5-ubuntu-thumbnailer0.1 \
4951 unity-notifications-impl \
5052 qtdeclarative5-xmllistmodel-plugin \
5153 ubuntu-mobile-icons \
5254 unity-scope-home \
5355 unity-lens-applications \
5456 unity-plugin-scopes \
57+ xvfb \
5558 || exit 5
5659}
5760
cmake/modules/QmlTest.cmake+60−2
@@ -65,6 +65,7 @@ macro(add_qml_test SUBPATH COMPONENT_NAME)
6565 cmake_parse_arguments(qmltest "${options}" "" "${multi_value_keywords}" ${ARGN})
6666
6767 set(qmltest_TARGET test${COMPONENT_NAME})
68+ set(qmltest_xvfb_TARGET xvfbtest${COMPONENT_NAME})
6869 set(qmltest_FILE ${SUBPATH}/tst_${COMPONENT_NAME})
6970
7071 set(qmltestrunner_imports "")
@@ -80,13 +81,71 @@ macro(add_qml_test SUBPATH COMPONENT_NAME)
8081 endforeach(IMPORT_PATH)
8182 endif()
8283
84+ string(TOLOWER "${CMAKE_GENERATOR}" cmake_generator_lower)
85+ if(cmake_generator_lower STREQUAL "unix makefiles")
86+ set(function_ARGS $(FUNCTION))
87+ else()
88+ set(function_ARGS "")
89+ endif()
90+
8391 set(qmltest_command
8492 env ${qmltest_ENVIRONMENT}
8593 ${qmltestrunner_exe} -input ${CMAKE_CURRENT_SOURCE_DIR}/${qmltest_FILE}.qml
8694 ${qmltestrunner_imports}
8795 -o ${CMAKE_BINARY_DIR}/${qmltest_TARGET}.xml,xunitxml
8896 -o -,txt
97+ ${function_ARGS}
98+ )
99+ find_program( HAVE_GCC gcc )
100+ if (NOT ${HAVE_GCC} STREQUAL "")
101+ exec_program( gcc ARGS "-dumpmachine" OUTPUT_VARIABLE ARCH_TRIPLET )
102+ set(LD_PRELOAD_PATH "LD_PRELOAD=/usr/lib/${ARCH_TRIPLET}/mesa/libGL.so.1")
103+ endif()
104+ set(qmltest_xvfb_command
105+ env ${qmltest_ENVIRONMENT} ${LD_PRELOAD_PATH}
106+ xvfb-run --server-args "-screen 0 1024x768x24" --auto-servernum
107+ ${qmltestrunner_exe} -input ${CMAKE_CURRENT_SOURCE_DIR}/${qmltest_FILE}.qml
108+ ${qmltestrunner_imports}
109+ -o ${CMAKE_BINARY_DIR}/${qmltest_TARGET}.xml,xunitxml
110+ -o -,txt
111+ ${function_ARGS}
89112 )
113+
114+ add_qmltest_target(${qmltest_TARGET} "${qmltest_command}" TRUE ${qmltest_NO_ADD_TEST})
115+ add_qmltest_target(${qmltest_xvfb_TARGET} "${qmltest_xvfb_command}" ${qmltest_NO_TARGETS} TRUE)
116+ add_manual_qml_test(${SUBPATH} ${COMPONENT_NAME} ${ARGN})
117+endmacro(add_qml_test)
118+
119+macro(add_binary_qml_test CLASS_NAME LD_PATH DEPS)
120+ set(testCommand
121+ LD_LIBRARY_PATH=${LD_PATH}
122+ ${CMAKE_CURRENT_BINARY_DIR}/${CLASS_NAME}TestExec
123+ -o ${CMAKE_BINARY_DIR}/${CLASSNAME}Test.xml,xunitxml
124+ -o -,txt)
125+
126+ add_qmltest_target(test${CLASS_NAME} "${testCommand}" FALSE TRUE)
127+ add_dependencies(test${CLASS_NAME} ${CLASS_NAME}TestExec ${DEPS})
128+
129+ find_program( HAVE_GCC gcc )
130+ if (NOT ${HAVE_GCC} STREQUAL "")
131+ exec_program( gcc ARGS "-dumpmachine" OUTPUT_VARIABLE ARCH_TRIPLET )
132+ set(LD_PRELOAD_PATH "LD_PRELOAD=/usr/lib/${ARCH_TRIPLET}/mesa/libGL.so.1")
133+ endif()
134+ set(xvfbtestCommand
135+ ${LD_PRELOAD_PATH}
136+ LD_LIBRARY_PATH=${LD_PATH}
137+ xvfb-run --server-args "-screen 0 1024x768x24" --auto-servernum
138+ ${CMAKE_CURRENT_BINARY_DIR}/${CLASS_NAME}TestExec
139+ -o ${CMAKE_BINARY_DIR}/${CLASS_NAME}Test.xml,xunitxml
140+ -o -,txt)
141+
142+ add_qmltest_target(xvfbtest${CLASS_NAME} "${xvfbtestCommand}" FALSE TRUE)
143+ add_dependencies(qmluitests xvfbtest${CLASS_NAME})
144+
145+ add_manual_qml_test(. ${CLASS_NAME} IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
146+endmacro(add_binary_qml_test)
147+
148+macro(add_qmltest_target qmltest_TARGET qmltest_command qmltest_NO_TARGETS qmltest_NO_ADD_TEST)
90149 add_custom_target(${qmltest_TARGET} ${qmltest_command})
91150
92151 if(NOT "${qmltest_PROPERTIES}" STREQUAL "")
@@ -117,5 +176,4 @@ macro(add_qml_test SUBPATH COMPONENT_NAME)
117176 endif()
118177 endif("${qmltest_NO_TARGETS}" STREQUAL "FALSE")
119178
120− add_manual_qml_test(${SUBPATH} ${COMPONENT_NAME} ${ARGN})
121−endmacro(add_qml_test)
179+endmacro(add_qmltest_target)
data/unity8.conf+10−1
@@ -1,10 +1,12 @@
11description "Unity Shell v8"
22author "Ricardo Mendoza <ricmm@ubuntu.com>"
33
4+emits scope-ui-starting
5+
46start on ((xsession SESSION=ubuntu-touch) or (xsession SESSION=ubuntu-touch-surfaceflinger)) and started dbus
57stop on desktop-end
68
7−kill timeout 30
9+kill timeout 120
810
911respawn
1012expect stop
@@ -29,10 +31,17 @@ pre-start script
2931 gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.UpdateActivationEnvironment "@a{ss} {'MIR_SOCKET': '$MIR_SERVER_FILE'}"
3032 fi
3133
34+ if [ -z "$UNITY_SCOPES_LIST" ]; then
35+ # FIXME: remove once we have this in dconf
36+ initctl set-env UNITY_SCOPES_LIST="scopes;clickscope;musicaggregator;videoaggregator"
37+ fi
38+
3239 # Remove the socket if still there
3340 if [ -S "$MIR_SERVER_FILE" ]; then
3441 rm "$MIR_SERVER_FILE"
3542 fi
43+
44+ initctl emit scope-ui-starting
3645end script
3746
3847exec ${BINARY:-unity8} $ARGS
debian/changelog+232
@@ -1,3 +1,235 @@
1+unity8 (7.86) trusty; urgency=medium
2+
3+ * humppaaa
4+
5+ -- Michael Zanetti <michael.zanetti@canonical.com> Thu, 10 Apr 2014 15:19:28 +0200
6+
7+unity8 (7.85+14.04.20140404-0ubuntu1) trusty; urgency=low
8+
9+ [ Albert Astals ]
10+ * Adapt to new TabBar
11+
12+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 04 Apr 2014 15:03:00 +0000
13+
14+unity8 (7.85+14.04.20140403.1-0ubuntu1) trusty; urgency=low
15+
16+ [ Michael Terry ]
17+ * Re-enable test_networkmanager_integration autopilot test on phone
18+ platforms
19+
20+ [ CI bot ]
21+ * Resync trunk
22+
23+ [ Leo Arias ]
24+ * Reverted the open_preview autopilot helper to return a Preview
25+ object.
26+
27+ [ Albert Astals ]
28+ * If not running in Mir load the "fake" application manager (LP:
29+ #1301547)
30+ * Remove unused properties from DashRenderer
31+
32+ [ Michael Zanetti ]
33+ * Fix tests after right edge merge. Drop old stages tests. Fix right
34+ edge tests if someone doesn't have the GRID_UNIT_PX exported. make
35+ GenericScopeView test more robust that broke because the ordering
36+ changed
37+ * add "make xvfbtestSomething" target to run qml tests in xvfb
38+ * make the "make test" commit hook work again
39+
40+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 03 Apr 2014 10:38:53 +0000
41+
42+unity8 (7.85+14.04.20140401.3-0ubuntu1) trusty; urgency=medium
43+
44+ [ Michał Sawicz ]
45+ * Bump version to ensure incompatibility with previous Unity.Application
46+ implementations.
47+ * We'll only have the unity-mir and mock Ubuntu.Application plugins
48+ now, no need for mangling the import paths.
49+
50+ [ Michal Hruby ]
51+ * Remove the albumart image provider. (LP: #1262711)
52+ * Don't reset search string after 2 seconds. (LP: #1297246)
53+
54+ [ James Henstridge ]
55+ * Remove the albumart image provider. (LP: #1262711)
56+
57+ [ Albert Astals ]
58+ * Carousel: Add test to make sure we only create the needed delegates
59+ and not more
60+ * LVWPH: Remove processEvents() call from updatePolish() It causes
61+ some reentrancy issues and in some times you end up in polishItems()
62+ with items that have been deleted because you called processEvents()
63+ This means i need a small tweak in itemGeometryChanged to not
64+ reposition items if we are inside a setContentHeight call and two
65+ small tweaks to tests since now things happen in a different order
66+ and numbers are different (though equivalent) (LP: #1297240)
67+ * Card.qml binding loops are gone. hooray \o/ Also made the aspect
68+ properties readonly
69+
70+ [ Mirco Müller ]
71+ * A potential fix for "Cannot read property 'state' of null"-failure
72+ on Jenkins with the VisualSnapDecisionsQueue QML-test of
73+ notifications.
74+
75+ [ Michael Terry ]
76+ * Pass user's preference for auto-brightness on to powerd. (LP:
77+ #1273174)
78+
79+ [ Michael Zanetti ]
80+ * Registers a dummy QObject as QTestRootObject in uqmlscene in order
81+ to fix make trySomething with Qt 5.2.
82+
83+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 01 Apr 2014 22:56:52 +0000
84+
85+unity8 (7.84+14.04.20140327.1-0ubuntu2) trusty; urgency=medium
86+
87+ * For now, have libunity-private depending on libunity-core-6.0-9 as the
88+ gsettings schema is here. The dependency wasn't direct and dropped from
89+ Touch image #271. Consequently, unity8 didn't start (gsettings
90+ segfaulting).
91+ Proper strategy will be to include the schema in another package to only
92+ pull it.
93+
94+ -- Didier Roche <didrocks@ubuntu.com> Tue, 01 Apr 2014 09:52:14 +0200
95+
96+unity8 (7.84+14.04.20140327.1-0ubuntu1) trusty; urgency=low
97+
98+ [ Michał Sawicz ]
99+ * Increase kill timeout so that crashes are not truncated.
100+
101+ [ Ying-Chun Liu ]
102+ * Fix a small typo in LazyImage: scale -> scaleTo
103+
104+ [ Albert Astals ]
105+ * Make geometry calls for autopilot work again -geometry is a internal
106+ Qt argument that only works for QWidget based apps Before it was
107+ being returned to us in -args but now it's eaten so we need to use a
108+ different one, -windowgeometry
109+ * Make "Recent" translatable and update pot file
110+
111+ [ Mirco Müller ]
112+ * Make visual queue of (up to five) snap-decisions contract and expand
113+ according to visual design-spec.
114+
115+ [ Michael Terry ]
116+ * Pass user's preference for auto-brightness on to powerd. (LP:
117+ #1273174)
118+
119+ [ Michael Zanetti ]
120+ * allow executing a single test function example: make testShell
121+ FUNCTION="Shell::test_background"
122+
123+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 27 Mar 2014 12:38:21 +0000
124+
125+unity8 (7.84+14.04.20140324.4-0ubuntu1) trusty; urgency=low
126+
127+ [ Michal Hruby ]
128+ * Change and extend the way non-installed scopes are started with the
129+ scope-tool.
130+ * Switch to new scope backend and apply required visual adaptations.
131+ (LP: #1294294)
132+
133+ [ Gerry Boland ]
134+ * Switch to new scope backend and apply required visual adaptations.
135+ (LP: #1294294)
136+
137+ [ Michał Sawicz ]
138+ * Fix rating input action to always be "rated", not dynamic. Based on
139+ http://developer.ubuntu.com/api/devel/ubuntu-14.04/cplusplus/unity-
140+ scopes/previewwidgets.html#rating-input
141+ * Switch to new scope backend and apply required visual adaptations.
142+ (LP: #1294294)
143+
144+ [ Kevin Gunn ]
145+ * Switch to new scope backend and apply required visual adaptations.
146+ (LP: #1294294)
147+
148+ [ Albert Astals ]
149+ * Switch to new scope backend and apply required visual adaptations.
150+ (LP: #1294294)
151+ * LVWPH: cull lost items lost items will be released on the next
152+ updatePolish cycle but meanwhile don't let them be visible
153+
154+ [ Daniel d'Andrada ]
155+ * Switch to new scope backend and apply required visual adaptations.
156+ (LP: #1294294)
157+
158+ [ Michał Karnicki ]
159+ * Switch to new scope backend and apply required visual adaptations.
160+ (LP: #1294294)
161+
162+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 24 Mar 2014 16:10:24 +0000
163+
164+unity8 (7.84+14.04.20140319.1-0ubuntu1) trusty; urgency=low
165+
166+ [ Michał Sawicz ]
167+ * Work around bug #1293478 - make sure to send ints, not doubles for
168+ volume control. (LP: #1293478)
169+
170+ [ Nick Dedekind ]
171+ * Fixed binding being cleared when manually changing slider value
172+ (lp#1283191). (LP: #1283191)
173+
174+ [ Albert Astals ]
175+ * Fix indicators highlight position on 5.2 We need to take into
176+ account the list originX if we're using the list delegates x outside
177+ the list itself
178+ * LVWPH: Make sure m_firstVisibleIndex is correctly set on
179+ removeNonVisibleItems
180+
181+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 19 Mar 2014 16:40:20 +0000
182+
183+unity8 (7.84+14.04.20140317.2-0ubuntu1) trusty; urgency=low
184+
185+ [ CI bot ]
186+ * Resync trunk
187+
188+ [ Michał Sawicz ]
189+ * Revert disable-hud, we weren't ready to land it yet.
190+
191+ [ Mirco Müller ]
192+ * The snap-decision AP-test for "incoming call"-case used the wrong
193+ objectName "notification0". It has to be "notification1".
194+
195+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 17 Mar 2014 15:54:39 +0000
196+
197+unity8 (7.84+14.04.20140314-0ubuntu1) trusty; urgency=low
198+
199+ [ Michał Sawicz ]
200+ * Fix tests under Qt 5.2.
201+ * CardHeader improvements depending on background. Also drop prices,
202+ they need to be reworked into attributes.
203+ * Bring Cards closer to design
204+ * Add back the workaround for not being able scroll the image gallery
205+ Taken from AppPreview.qml (LP: #1281709)
206+ * Only allow searching when preview isn't open. (LP: #1282475)
207+ * Adds carousel dynamic switch
208+
209+ [ Leo Arias ]
210+ * Update the url dispatcher test to use the fake app fixture from the
211+ toolkit.
212+
213+ [ Albert Astals ]
214+ * Fix tests under Qt 5.2.
215+ * Workaround compiz/unity7 behaviour change/bug
216+
217+ [ Michael Zanetti ]
218+ * Fix tests under Qt 5.2.
219+ * Disable HUD from the bottom edge.
220+
221+ [ Andrea Cimitan ]
222+ * Adds carousel dynamic switch
223+
224+ [ CI bot ]
225+ * Resync trunk
226+
227+ [ Michał Karnicki ]
228+ * CardHeader improvements depending on background. Also drop prices,
229+ they need to be reworked into attributes.
230+
231+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 14 Mar 2014 15:46:10 +0000
232+
1233unity8 (7.84+14.04.20140307-0ubuntu1) trusty; urgency=low
2234
3235 * New rebuild forced
debian/control+15−8
@@ -13,14 +13,12 @@ Build-Depends: cmake,
1313 libgles2-mesa-dev[armhf],
1414 libgsettings-qt-dev,
1515 libhud-client2-dev,
16− libjson-perl,
1716 libnih-dbus-dev,
1817 libnih-dev,
1918 libpulse-dev,
2019 libqmenumodel-dev (>= 0.2.7),
21− libunity-api-dev (>= 7.80.4),
20+ libunity-api-dev (>= 7.80.6),
2221 libunity-mir-dev,
23− libunity-scopes-json-def-phone,
2422 libupstart-dev,
2523 libusermetricsoutput1-dev,
2624 libxcb1-dev,
@@ -82,12 +80,15 @@ Depends: gsettings-desktop-schemas,
8280 qtdeclarative5-dee-plugin,
8381 qtdeclarative5-gsettings1.0,
8482 qtdeclarative5-ubuntu-settings-components,
83+ qtdeclarative5-ubuntu-thumbnailer0.1 | ubuntu-thumbnailer-impl,
84+ ubuntu-thumbnailer-impl-0,
8585 qtdeclarative5-ubuntu-ui-toolkit-plugin,
8686 qtdeclarative5-unity-notifications-plugin | unity-notifications-impl,
8787 qtdeclarative5-xmllistmodel-plugin,
88+ unity-application-impl-2,
8889 unity-launcher-impl-3,
8990 unity-notifications-impl-2,
90− unity8-fake-env | qtubuntu-shell,
91+ unity8-fake-env | unity-application-impl,
9192 unity8-private (= ${binary:Version}),
9293 unity8-private | unity-launcher-impl,
9394 unity-plugin-scopes | unity-scopes-impl,
@@ -96,8 +97,11 @@ Depends: gsettings-desktop-schemas,
9697 libcap2-bin,
9798 ${misc:Depends},
9899 ${shlibs:Depends},
99−Recommends: ${unity-default-masterscopes},
100−Breaks: indicator-network (<< 0.5.1)
100+Recommends: unity-scope-click,
101+ unity-scope-mediascanner2,
102+ unity-scope-scopes,
103+Breaks: indicator-network (<< 0.5.1),
104+ ubuntu-touch-session (<< 0.107),
101105Replaces: ubuntu-touch-session (<< 0.82~)
102106Description: Unity 8 shell
103107 The Unity 8 shell is the primary user interface for Ubuntu devices.
@@ -134,7 +138,8 @@ Multi-Arch: same
134138Pre-Depends: ${misc:Pre-Depends},
135139Depends: ${misc:Depends},
136140 ${shlibs:Depends},
137−Provides: qtubuntu-shell,
141+Provides: unity-application-impl,
142+ unity-application-impl-2,
138143Description: Fake environment for running Unity 8 shell
139144 Provides fake implementations of some QML modules used by Unity 8 shell
140145 (e.g Ubuntu.Application) so that you can run it in a sandboxed environment.
@@ -143,8 +148,10 @@ Package: unity8-private
143148Architecture: any
144149Multi-Arch: same
145150Pre-Depends: ${misc:Pre-Depends},
146−Depends: ${misc:Depends},
151+Depends: gsettings-ubuntu-schemas,
152+ ${misc:Depends},
147153 ${shlibs:Depends},
154+ libunity-core-6.0-9,
148155Provides: unity-launcher-impl,
149156 unity-launcher-impl-3,
150157Description: Unity 8 private libs
debian/rules−5
@@ -6,8 +6,6 @@
66export DPKG_GENSYMBOLS_CHECK_LEVEL=4
77export NO_PNG_PKG_MANGLE=1
88
9−SCOPES_RECOMMENDS := $(shell perl debian/scopes-recommends-generator /usr/share/unity/client-scopes.json)
10−
119.PHONY: build
1210build %:
1311 dh $@ --parallel --fail-missing --with python2,python3
@@ -41,6 +39,3 @@ override_dh_makeshlibs:
4139# libMockLightDM-qml.so links against liblightdm-qt5-2.so which doesn't exist
4240override_dh_shlibdeps:
4341 dh_shlibdeps -XlibMockLightDM-qml.so
44−
45−override_dh_gencontrol:
46− dh_gencontrol -- -Vunity-default-masterscopes="$(SCOPES_RECOMMENDS)"
debian/scopes-recommends-generatordeleted−27
@@ -1,27 +0,0 @@
1−#!/usr/bin/perl -w
2−
3−use strict;
4−binmode STDOUT, ":utf8";
5−use utf8;
6−
7−use JSON;
8−
9−my $json;
10−{
11− local $/; #Enable 'slurp' mode
12− open my $fh, "<", $ARGV[0];
13− $json = <$fh>;
14− close $fh;
15−}
16−# get it to a scalar
17−my $j = "[" . $json . "]";
18−
19−my $decoded_json = decode_json( $j );
20−
21−my $recommends_list = "";
22−for my $record ( @$decoded_json ) {
23− foreach my $key ( keys(%$record) ) {
24− $recommends_list = $recommends_list . $key . ", ";
25− }
26−}
27−print $recommends_list;
debian/unity8-fake-env.install+1
@@ -1,3 +1,4 @@
1+usr/lib/*/unity8/qml/nonmirplugins
12usr/lib/*/unity8/qml/mocks
23usr/lib/*/unity8/qml/scopefakes
34usr/share/unity8/mocks
debian/unity8.install+1−1
@@ -10,6 +10,6 @@ usr/share/unity8/Launcher
1010usr/share/unity8/Notifications
1111usr/share/unity8/Panel
1212usr/share/unity8/Shell.qml
13−usr/share/unity8/SideStage
13+usr/share/unity8/Stages
1414usr/share/unity8/graphics
1515data/unity8.conf usr/share/upstart/sessions/
include/paths.h.in+10
@@ -57,6 +57,16 @@ inline QStringList overrideImportPaths() {
5757 return paths;
5858}
5959
60+inline QStringList nonMirImportPaths() {
61+ QStringList paths;
62+ if (isRunningInstalled()) {
63+ paths << QString("@CMAKE_INSTALL_PREFIX@/@SHELL_INSTALL_QML@/nonmirplugins");
64+ } else {
65+ paths << QString("@CMAKE_BINARY_DIR@/nonmirplugins");
66+ }
67+ return paths;
68+}
69+
6070inline QStringList fallbackImportPaths() {
6171 QStringList paths;
6272 if (isRunningInstalled()) {
plugins/DashViews/listviewwithpageheader.cpp+42−13
@@ -91,6 +91,7 @@
9191
9292#include "listviewwithpageheader.h"
9393
94+#include <QCoreApplication>
9495#include <QDebug>
9596#include <qqmlinfo.h>
9697#include <qqmlengine.h>
@@ -366,6 +367,18 @@ void ListViewWithPageHeader::positionAtBeginning()
366367 m_previousContentY = m_visibleItems.first()->y() - headerHeight;
367368 }
368369 setContentY(m_visibleItems.first()->y() + m_clipItem->y() - headerHeight);
370+ if (m_headerItem) {
371+ // TODO This should not be needed and the code that adjust the m_headerItem position
372+ // in viewportMoved() should be enough but in some cases we have not found a way to reproduce
373+ // yet the code of viewportMoved() fails so here we make sure that at least if we are calling
374+ // positionAtBeginning the header item will be correctly positioned
375+ m_headerItem->setY(-m_minYExtent);
376+ }
377+}
378+
379+static inline bool uFuzzyCompare(qreal r1, qreal r2)
380+{
381+ return qFuzzyCompare(r1, r2) || (qFuzzyIsNull(r1) && qFuzzyIsNull(r2));
369382}
370383
371384void ListViewWithPageHeader::showHeader()
@@ -373,8 +386,8 @@ void ListViewWithPageHeader::showHeader()
373386 if (!m_headerItem)
374387 return;
375388
376− auto to = qMax(-minYExtent(), contentY() - m_headerItem->height() + m_headerItemShownHeight);
377− if (to != contentY()) {
389+ const auto to = qMax(-minYExtent(), contentY() - m_headerItem->height() + m_headerItemShownHeight);
390+ if (!uFuzzyCompare(to, contentY())) {
378391 const bool headerShownByItsOwn = contentY() < m_headerItem->y() + m_headerItem->height();
379392 if (headerShownByItsOwn && m_headerItemShownHeight == 0) {
380393 // We are not clipping since we are just at the top of the viewport
@@ -491,11 +504,7 @@ void ListViewWithPageHeader::viewportMoved(Qt::Orientations orient)
491504 const bool showHeaderAnimationRunning = m_contentYAnimation->isRunning() && contentYAnimationType == ContentYAnimationShowHeader;
492505 if (m_headerItem) {
493506 const auto oldHeaderItemShownHeight = m_headerItemShownHeight;
494− if (contentY() < -m_minYExtent) {
495− // Stick the header item to the top when dragging down
496− m_headerItem->setY(contentY());
497− m_headerItem->setHeight(m_headerItem->implicitHeight() + (-m_minYExtent - contentY()));
498− } else {
507+ if (uFuzzyCompare(contentY(), -m_minYExtent) || contentY() > -m_minYExtent) {
499508 m_headerItem->setHeight(m_headerItem->implicitHeight());
500509 // We are going down (but it's not because of the rebound at the end)
501510 // (but the header was not shown by it's own position)
@@ -509,21 +518,32 @@ void ListViewWithPageHeader::viewportMoved(Qt::Orientations orient)
509518 m_headerItemShownHeight = 0;
510519 m_headerItem->setY(-m_minYExtent);
511520 } else if ((scrolledUp && notRebounding && notShownByItsOwn && !maximizeVisibleAreaRunning) || (m_headerItemShownHeight > 0) || m_inContentHeightKeepHeaderShown) {
512− if (maximizeVisibleAreaRunning && diff > 0) // If we are maximizing and the header was shown, make sure we hide it
521+ if (maximizeVisibleAreaRunning && diff > 0) {
522+ // If we are maximizing and the header was shown, make sure we hide it
513523 m_headerItemShownHeight -= diff;
514− else
524+ } else {
515525 m_headerItemShownHeight += diff;
516− if (contentY() == -m_minYExtent) {
526+ }
527+ if (uFuzzyCompare(contentY(), -m_minYExtent)) {
517528 m_headerItemShownHeight = 0;
518529 } else {
519530 m_headerItemShownHeight = qBound(static_cast<qreal>(0.), m_headerItemShownHeight, m_headerItem->height());
520531 }
521532 if (m_headerItemShownHeight > 0) {
522− m_headerItem->setY(contentY() - m_headerItem->height() + m_headerItemShownHeight);
533+ if (uFuzzyCompare(m_headerItem->height(), m_headerItemShownHeight)) {
534+ m_headerItem->setY(contentY());
535+ m_headerItemShownHeight = m_headerItem->height();
536+ } else {
537+ m_headerItem->setY(contentY() - m_headerItem->height() + m_headerItemShownHeight);
538+ }
523539 } else {
524540 m_headerItem->setY(-m_minYExtent);
525541 }
526542 }
543+ } else {
544+ // Stick the header item to the top when dragging down
545+ m_headerItem->setY(contentY());
546+ m_headerItem->setHeight(m_headerItem->implicitHeight() + (-m_minYExtent - contentY()));
527547 }
528548 // We will be changing the clip item, need to accomadate for it
529549 // otherwise we move the firstItem down/up twice (unless the
@@ -759,6 +779,9 @@ bool ListViewWithPageHeader::removeNonVisibleItems(qreal bufferFrom, qreal buffe
759779 ++i;
760780 }
761781 }
782+ if (!foundVisible) {
783+ m_firstVisibleIndex = -1;
784+ }
762785 if (m_firstVisibleIndex != oldFirstVisibleIndex) {
763786 adjustMinYExtent();
764787 }
@@ -824,6 +847,7 @@ ListViewWithPageHeader::ListItem *ListViewWithPageHeader::createItem(int modelIn
824847 }
825848 }
826849 if (lostItem) {
850+ listItem->setCulled(true);
827851 releaseItem(listItem);
828852 listItem = nullptr;
829853 } else {
@@ -1073,7 +1097,7 @@ void ListViewWithPageHeader::itemGeometryChanged(QQuickItem * /*item*/, const QR
10731097{
10741098 const qreal heightDiff = newGeometry.height() - oldGeometry.height();
10751099 if (heightDiff != 0) {
1076− if (oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY() && !m_visibleItems.isEmpty()) {
1100+ if (!m_inContentHeightKeepHeaderShown && oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY() && !m_visibleItems.isEmpty()) {
10771101 ListItem *firstItem = m_visibleItems.first();
10781102 firstItem->setY(firstItem->y() - heightDiff);
10791103 adjustMinYExtent();
@@ -1128,7 +1152,12 @@ void ListViewWithPageHeader::adjustMinYExtent()
11281152 nonCreatedHeight = m_firstVisibleIndex * visibleItemsHeight / visibleItems;
11291153// qDebug() << m_firstVisibleIndex << visibleItemsHeight << visibleItems << nonCreatedHeight;
11301154 }
1131− m_minYExtent = nonCreatedHeight - m_visibleItems.first()->y() - m_clipItem->y() + (m_headerItem ? m_headerItem->implicitHeight() : 0);
1155+ const qreal headerHeight = (m_headerItem ? m_headerItem->implicitHeight() : 0);
1156+ m_minYExtent = nonCreatedHeight - m_visibleItems.first()->y() - m_clipItem->y() + headerHeight;
1157+ if (m_minYExtent != 0 && qFuzzyIsNull(m_minYExtent)) {
1158+ m_minYExtent = 0;
1159+ m_visibleItems.first()->setY(nonCreatedHeight - m_clipItem->y() + headerHeight);
1160+ }
11321161 }
11331162}
11341163
plugins/Powerd/CMakeLists.txt+8
@@ -1,4 +1,11 @@
11include(Plugins)
2+include(FindPkgConfig)
3+
4+pkg_search_module(GIO REQUIRED gio-2.0)
5+
6+include_directories(
7+ ${GIO_INCLUDE_DIRS}
8+)
29
310add_definitions(-DSM_BUSNAME=systemBus)
411
@@ -8,6 +15,7 @@ add_library(Powerd-qml MODULE
815 )
916
1017qt5_use_modules(Powerd-qml DBus Qml)
18+target_link_libraries(Powerd-qml ${GIO_LDFLAGS})
1119
1220export_qmlfiles(Powerd Powerd)
1321export_qmlplugin(Powerd 0.1 Powerd TARGETS Powerd-qml)
plugins/Powerd/Powerd.cpp+17
@@ -17,6 +17,13 @@
1717 */
1818
1919#include "Powerd.h"
20+#include <QDBusPendingCall>
21+
22+void autoBrightnessChanged(GSettings *settings, const gchar *key, QDBusInterface *powerd)
23+{
24+ bool value = g_settings_get_boolean(settings, key);
25+ powerd->asyncCall("userAutobrightnessEnable", QVariant(value));
26+}
2027
2128Powerd::Powerd(QObject* parent)
2229 : QObject(parent),
@@ -33,4 +40,14 @@ Powerd::Powerd(QObject* parent)
3340 "DisplayPowerStateChange",
3441 this,
3542 SIGNAL(displayPowerStateChange(int, unsigned int)));
43+
44+ systemSettings = g_settings_new("com.ubuntu.touch.system");
45+ g_signal_connect(systemSettings, "changed::auto-brightness", G_CALLBACK(autoBrightnessChanged), powerd);
46+ autoBrightnessChanged(systemSettings, "auto-brightness", powerd);
47+}
48+
49+Powerd::~Powerd()
50+{
51+ g_signal_handlers_disconnect_by_data(systemSettings, powerd);
52+ g_object_unref(systemSettings);
3653}
plugins/Powerd/Powerd.h+3
@@ -20,6 +20,7 @@
2020#ifndef UNITY_POWERD_H
2121#define UNITY_POWERD_H
2222
23+#include <gio/gio.h>
2324#include <QtCore/QObject>
2425#include <QtDBus/QDBusInterface>
2526
@@ -43,12 +44,14 @@ public:
4344 };
4445
4546 explicit Powerd(QObject *parent = 0);
47+ ~Powerd();
4648
4749Q_SIGNALS:
4850 void displayPowerStateChange(int status, unsigned int flags);
4951
5052private:
5153 QDBusInterface *powerd;
54+ GSettings *systemSettings;
5255};
5356
5457#endif
plugins/Unity/Indicators/qml/MenuItemFactory.qml+7−1
@@ -77,6 +77,7 @@ Item {
7777 property var menuModel: menuFactory.menuModel
7878 property int menuIndex: -1
7979 property var extendedData: menuData && menuData.ext || undefined
80+ property var serverValue: getExtendedProperty(menuData, "actionState", undefined)
8081
8182 text: menuData && menuData.label || ""
8283 iconSource: menuData && menuData.icon || ""
@@ -91,7 +92,6 @@ Item {
9192 }
9293 return maximum;
9394 }
94− value: menuData && menuData.actionState || 0.0
9595 enabled: menuData && menuData.sensitive || false
9696
9797 onMenuModelChanged: {
@@ -100,6 +100,12 @@ Item {
100100 onMenuIndexChanged: {
101101 loadAttributes();
102102 }
103+ onServerValueChanged: {
104+ // value can be changed by slider, so a binding won't work.
105+ if (serverValue !== undefined) {
106+ value = serverValue;
107+ }
108+ }
103109 onUpdated: {
104110 menuModel.changeState(menuIndex, value);
105111 }
plugins/Unity/Launcher/backend/launcherbackend.cpp+10−2
@@ -186,9 +186,10 @@ void LauncherBackend::syncFromAccounts()
186186 if (m_accounts && defaults) { // Checking accounts as it'll be null when !useStorage
187187 QGSettings gSettings("com.canonical.Unity.Launcher", "/com/canonical/unity/launcher/");
188188 Q_FOREACH(const QString &entry, gSettings.get("favorites").toStringList()) {
189+ qDebug() << "loading entry" << entry;
189190 if (entry.startsWith("application://")) {
190191 QString appId = entry;
191− // Transform "application://foobar.desktop" to "foobar"
192+ // Transform "application://foobar.desktop" to "application://foobar"
192193 appId.remove("application://");
193194 if (appId.endsWith(".desktop")) {
194195 appId.chop(8);
@@ -207,8 +208,14 @@ void LauncherBackend::syncFromAccounts()
207208 QString appId = entry;
208209 appId.remove("appid://");
209210 // Strip hook name and current-user-version in case its there
210− appId = appId.split('/').first();
211+
212+ if (appId.split('/').count() != 3) {
213+ qWarning() << "ignoring entry " + appId + ". Not a valid appId.";
214+ continue;
215+ }
216+ appId = appId.split('/').first() + "_" + appId.split('/').at(1);
211217 QString df = findDesktopFile(appId);
218+ qDebug() << "got df file" << df;
212219
213220 if (!df.isEmpty()) {
214221 m_storedApps << appId;
@@ -248,6 +255,7 @@ QString LauncherBackend::findDesktopFile(const QString &appId) const
248255#ifdef LAUNCHER_TESTING
249256 searchDirs << "";
250257#endif
258+ qDebug() << "search dirs are" << searchDirs;
251259
252260 do {
253261 if (dashPos != -1) {
plugins/Utils/CMakeLists.txt+2−3
@@ -11,13 +11,12 @@ include_directories(
1111)
1212
1313set(QMLPLUGIN_SRC
14− albumartprovider.cpp
1514 bottombarvisibilitycommunicatorshell.cpp
16− mediaartcache.cpp
1715 qlimitproxymodelqml.cpp
1816 qsortfilterproxymodelqml.cpp
1917 timeformatter.cpp
2018 unitymenumodelpaths.cpp
19+ easingcurve.cpp
2120 plugin.cpp
2221 )
2322
@@ -33,7 +32,7 @@ target_link_libraries(Utils-qml ${GIO_LDFLAGS})
3332# files directly in targets.
3433set_target_properties(Utils-qml PROPERTIES COMPILE_FLAGS -fvisibility=default)
3534
36−qt5_use_modules(Utils-qml Qml Quick DBus Network XmlPatterns Concurrent)
35+qt5_use_modules(Utils-qml Qml Quick DBus Network XmlPatterns Gui Concurrent)
3736
3837# export the qmldir qmltypes and plugin files
3938export_qmlfiles(Utils Utils)
plugins/Utils/albumartprovider.cppdeleted−236
@@ -1,236 +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: 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−#include <QUrlQuery>
36−#include <QtConcurrent>
37−
38−using namespace std;
39−
40−const std::string AlbumArtProvider::DEFAULT_ALBUM_ART = "/usr/share/unity/icons/album_missing.png";
41−const std::string AlbumArtProvider::UNITY_LENS_SCHEMA = "com.canonical.Unity.Lenses";
42−
43−static QByteArray download(QString url) {
44− QScopedPointer<QNetworkAccessManager> am(new QNetworkAccessManager);
45− QNetworkReply *reply = am->get(QNetworkRequest(QUrl(url)));
46− QEventLoop loop;
47− QObject::connect(am.data(), &QNetworkAccessManager::finished, &loop, &QEventLoop::quit);
48− loop.exec();
49−
50− if (reply->error() != QNetworkReply::NoError) {
51− qWarning() << "Error downloading from the network:" << reply->errorString();
52− return QByteArray();
53− }
54− return reply->readAll();
55−}
56−
57−AlbumArtProvider::AlbumArtProvider()
58− : QQuickImageProvider(QQmlImageProviderBase::Image, QQmlImageProviderBase::ForceAsynchronousImageLoading),
59− m_settings(nullptr)
60−{
61− auto schemas = g_settings_list_schemas();
62− if (schemas) {
63− for (int i = 0; schemas[i]; i++) {
64− if (g_strcmp0(schemas[i], UNITY_LENS_SCHEMA.c_str()) == 0) {
65− m_settings = g_settings_new(UNITY_LENS_SCHEMA.c_str());
66− break;
67− }
68− }
69− }
70− if (m_settings == nullptr) {
71− qWarning() << "Missing" << QString::fromStdString(UNITY_LENS_SCHEMA) << "schema";
72− }
73−}
74−
75−AlbumArtProvider::~AlbumArtProvider()
76−{
77− if (m_settings)
78− g_object_unref(m_settings);
79−}
80−
81−std::string AlbumArtProvider::get_lastfm_url(const albuminfo &ai) {
82− QString artist = QString::fromStdString(ai.artist);
83− QString album = QString::fromStdString(ai.album);
84− // audioscrobbler wants it without any / (as it would break the URL)
85− artist.remove('/');
86− album.remove('/');
87−
88− /// @todo: this is the old API which will probably get axed at some point in the future
89− /// The new 2.0 API requires an API key, but supports JSON output, etc, so switching
90− /// to it should be done ASAP.
91− QString request = QString("http://ws.audioscrobbler.com/1.0/album/%1/%2/info.xml").arg(artist)
92− .arg(album)
93− .toHtmlEscaped();
94− QFuture<QByteArray> future = QtConcurrent::run(download, request);
95− QByteArray arr = future.result();
96− if(arr.size() == 0) {
97− return "";
98− }
99− QXmlQuery query;
100− QBuffer tmp;
101− tmp.setData(arr);
102− tmp.open(QIODevice::ReadOnly);
103− query.bindVariable("reply", &tmp);
104− query.setQuery("doc($reply)/album/coverart/large[1]/text()");
105− QString image;
106− query.evaluateTo(&image);
107− image = image.trimmed();
108−
109− // return empty if last.fm tries to offer their default
110− // fallback artwork
111− if (image.contains("catalogue/noimage")) {
112− return "";
113− }
114−
115− return image.toStdString();
116−}
117−
118−bool AlbumArtProvider::download_and_store(const std::string &image_url, const std::string &output_file) {
119− QString url = QString::fromStdString(image_url);
120− QString fileName = QString::fromStdString(output_file);
121− QFuture<QByteArray> future = QtConcurrent::run(download, url);
122− QByteArray arr = future.result();
123− if (arr.size() == 0) {
124− return false;
125− }
126− QFile file(fileName);
127− if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
128− qWarning() << "Could not open file for writing:" << file.errorString();
129− return false;
130− }
131− if (file.write(arr) == -1){
132− qWarning() << "Could not write the image:" << file.error();
133− return false;
134− }
135−
136− return true;
137−}
138−
139−void AlbumArtProvider::fix_format(const std::string &fname) {
140− // MediaArtSpec requires jpg. Convert to it if necessary.
141− FILE *f = fopen(fname.c_str(), "r");
142− if(!f)
143− return;
144− unsigned char buf[2];
145− fread(buf, 1, 2, f);
146− fclose(f);
147− if(buf[0] == 0xff && buf[1] == 0xd8) {
148− return;
149− }
150− QImage im(fname.c_str());
151− im.save(fname.c_str(), "JPEG");
152−}
153−
154−std::string AlbumArtProvider::get_image(const std::string &artist, const std::string &album) {
155− albuminfo info;
156−
157− info.artist = artist;
158− info.album = album;
159−
160− if(info.album.empty() || info.artist.empty()) {
161− return DEFAULT_ALBUM_ART;
162− }
163− if(cache.has_art(info.artist, info.album)) {
164− // Image may have expired from cache between these two lines.
165− // It might expire before we return. C'est la vie.
166− return cache.get_art_file(info.artist, info.album);
167− }
168−
169− if (m_settings != nullptr && g_strcmp0(g_settings_get_string(m_settings, "remote-content-search"), "all") !=0) {
170− qDebug() << "Remote content disabled";
171− return DEFAULT_ALBUM_ART;
172− }
173−
174− std::string image_url = get_lastfm_url(info);
175− if(image_url.empty()) {
176− return DEFAULT_ALBUM_ART;
177− }
178− QTemporaryFile tempFile;
179− tempFile.open();
180− tempFile.setAutoRemove(true);
181− QString fname = tempFile.fileName();
182− std::string tmpname = fname.toUtf8().data();
183−
184− if(!download_and_store(image_url, tmpname)) {
185− return DEFAULT_ALBUM_ART;
186− }
187− fix_format(tmpname.c_str());
188− QFile f(fname);
189− if(!f.open(QIODevice::ReadWrite)) {
190− return DEFAULT_ALBUM_ART;
191− }
192− QByteArray arr = f.readAll();
193− f.close();
194−
195− cache.add_art(info.artist, info.album, arr.data(), arr.size());
196− try {
197− std::string res = cache.get_art_file(info.artist, info.album);
198− if(res.empty())
199− return DEFAULT_ALBUM_ART;
200− return res;
201− } catch(...) {
202− }
203− return DEFAULT_ALBUM_ART;
204−}
205−
206−QImage AlbumArtProvider::requestImage(const QString &id, QSize *realSize, const QSize &requestedSize) {
207− Q_UNUSED(requestedSize)
208−
209− QUrlQuery query(id);
210− if (!query.hasQueryItem(QStringLiteral("artist")) || !query.hasQueryItem(QStringLiteral("album"))) {
211− qWarning() << "Invalid albumart uri:" << id;
212− return QImage(QString::fromStdString(DEFAULT_ALBUM_ART));
213− }
214− const QString artist = query.queryItemValue(QStringLiteral("artist"), QUrl::FullyEncoded);
215− const QString album = query.queryItemValue(QStringLiteral("album"), QUrl::FullyEncoded);
216−
217− std::string tgt_path;
218− try {
219− tgt_path = get_image(artist.toStdString(), album.toStdString());
220− if(!tgt_path.empty()) {
221− QImage image;
222− image.load(QString::fromStdString(tgt_path));
223− // FIXME: Rescale to requested size preserving aspect.
224− *realSize = image.size();
225− return image;
226− }
227− } catch(std::exception &e) {
228− qDebug() << "Album art loader failed: " << e.what();
229− } catch(...) {
230− qDebug() << "Unknown error when generating image.";
231− }
232−
233− QImage fallback(QString::fromStdString(DEFAULT_ALBUM_ART));
234− *realSize = fallback.size();
235− return fallback;
236−}
plugins/Utils/albumartprovider.hdeleted−56
@@ -1,56 +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: 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/easingcurve.cppnew file+67
@@ -0,0 +1,67 @@
1+/*
2+ * Copyright 2014 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: Michael Zanetti <michael.zanetti@canonical.com>
17+*/
18+
19+#include "easingcurve.h"
20+
21+
22+EasingCurve::EasingCurve(QObject *parent):
23+ QObject(parent)
24+{
25+
26+}
27+
28+QEasingCurve::Type EasingCurve::type() const
29+{
30+ return m_easingCurve.type();
31+}
32+
33+void EasingCurve::setType(const QEasingCurve::Type &type)
34+{
35+ m_easingCurve.setType(type);
36+ Q_EMIT typeChanged();
37+}
38+
39+qreal EasingCurve::period() const
40+{
41+ return m_easingCurve.period();
42+}
43+
44+void EasingCurve::setPeriod(qreal period)
45+{
46+ m_easingCurve.setPeriod(period);
47+ Q_EMIT periodChanged();
48+}
49+
50+qreal EasingCurve::progress() const
51+{
52+ return m_progress;
53+}
54+
55+void EasingCurve::setProgress(qreal progress)
56+{
57+ if (m_progress != progress) {
58+ m_progress = progress;
59+ m_value = m_easingCurve.valueForProgress(m_progress);
60+ Q_EMIT progressChanged();
61+ }
62+}
63+
64+qreal EasingCurve::value() const
65+{
66+ return m_value;
67+}
plugins/Utils/easingcurve.hnew file+70
@@ -0,0 +1,70 @@
1+/*
2+ * Copyright 2014 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: Michael Zanetti <michael.zanetti@canonical.com>
17+*/
18+
19+#ifndef EASINGCURVE_H
20+#define EASINGCURVE_H
21+
22+#include <QObject>
23+#include <QEasingCurve>
24+
25+/**
26+ * @brief The EasingCurve class
27+ *
28+ * This class exposes the QEasingCurve C++ API to QML.
29+ * This is useful for user interactive animations. While the QML Animation types
30+ * all require a "from", "to" and "duration", this one is based on "period" and
31+ * "progress". So you can control the position of the aimation by changing the
32+ * progress, also going back and forward in the animation. Depending on the type
33+ * of the easing curve, value will return the transformed progress.
34+ */
35+
36+class EasingCurve: public QObject
37+{
38+ Q_OBJECT
39+ Q_ENUMS(QEasingCurve::Type)
40+ Q_PROPERTY(QEasingCurve::Type type READ type WRITE setType NOTIFY typeChanged)
41+ Q_PROPERTY(qreal period READ period WRITE setPeriod NOTIFY periodChanged)
42+ Q_PROPERTY(qreal progress READ progress WRITE setProgress NOTIFY progressChanged)
43+ Q_PROPERTY(qreal value READ value NOTIFY progressChanged)
44+
45+public:
46+ EasingCurve(QObject *parent = 0);
47+
48+ QEasingCurve::Type type() const;
49+ void setType(const QEasingCurve::Type &type);
50+
51+ qreal period() const;
52+ void setPeriod(qreal period);
53+
54+ qreal progress() const;
55+ void setProgress(qreal progress);
56+
57+ qreal value() const;
58+
59+Q_SIGNALS:
60+ void typeChanged();
61+ void periodChanged();
62+ void progressChanged();
63+
64+private:
65+ QEasingCurve m_easingCurve;
66+ qreal m_progress;
67+ qreal m_value;
68+};
69+
70+#endif
plugins/Utils/mediaartcache.cppdeleted−178
@@ -1,178 +0,0 @@
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.hdeleted−54
@@ -1,54 +0,0 @@
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+2−14
@@ -26,12 +26,12 @@
2626#include "plugin.h"
2727
2828// local
29−#include "albumartprovider.h"
3029#include "bottombarvisibilitycommunicatorshell.h"
3130#include "qlimitproxymodelqml.h"
3231#include "qsortfilterproxymodelqml.h"
3332#include "timeformatter.h"
3433#include "unitymenumodelpaths.h"
34+#include "easingcurve.h"
3535
3636static const char* BOTTOM_BAR_VISIBILITY_COMMUNICATOR_DBUS_PATH = "/BottomBarVisibilityCommunicator";
3737static const char* DBUS_SERVICE = "com.canonical.Shell.BottomBarVisibilityCommunicator";
@@ -46,25 +46,13 @@ void UtilsPlugin::registerTypes(const char *uri)
4646 qmlRegisterType<TimeFormatter>(uri, 0, 1, "TimeFormatter");
4747 qmlRegisterType<GDateTimeFormatter>(uri, 0, 1, "GDateTimeFormatter");
4848 qmlRegisterUncreatableType<BottomBarVisibilityCommunicatorShell>(uri, 0, 1, "BottomBarVisibilityCommunicatorShell", "Can't create BottomBarVisibilityCommunicatorShell");
49+ qmlRegisterType<EasingCurve>(uri, 0, 1, "EasingCurve");
4950}
5051
5152void UtilsPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
5253{
5354 QQmlExtensionPlugin::initializeEngine(engine, uri);
5455
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−
6856 QDBusConnection::sessionBus().registerService(DBUS_SERVICE);
6957 BottomBarVisibilityCommunicatorShell *bottomBarVisibilityCommunicator = &BottomBarVisibilityCommunicatorShell::instance();
7058 QDBusConnection::sessionBus().registerObject(BOTTOM_BAR_VISIBILITY_COMMUNICATOR_DBUS_PATH, bottomBarVisibilityCommunicator, QDBusConnection::ExportAllContents);
po/am.po+24−30
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-18 19:28+0000\n"
1212"Last-Translator: samson <Unknown>\n"
1313"Language-Team: Amharic <am@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,27 +81,18 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
97−
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
92+#: qml/Dash/PreviewListView.qml:52
10093#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
94+msgid "%1 Preview"
95+msgstr ""
10596
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr ""
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115110msgid "Add a review"
116111msgstr ""
117112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119114msgid "Send"
120115msgstr "መላኪያ"
121116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr ""
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "አስተያየቶች:"
129−
130117#: qml/Greeter/Lockscreen.qml:149
131118msgid "Emergency Call"
132119msgstr ""
@@ -172,7 +159,14 @@ msgstr ""
172159msgid "Search"
173160msgstr "መፈለጊያ"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr "እባክዎን ያስገቡ %1"
166+
167+#~ msgid "Comments:"
168+#~ msgstr "አስተያየቶች:"
169+
170+#, qt-format
171+#~ msgid "(%1)"
172+#~ msgstr "(%1)"
po/ar.po+38−35
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-02-21 11:19+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: 2014-03-15 07:34+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
20+"X-Generator: Launchpad (build 16967)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -77,7 +77,7 @@ msgstr ""
7777"أنت الآن بارع في إيماءات الحواف ويمكنك البدء باستخدام هاتفك<br><br>انقر على "
7878"الشاشة للبدء"
7979
80−#: qml/Components/PageHeader.qml:340
80+#: qml/Components/PageHeader.qml:365
8181msgid "Recent searches"
8282msgstr "عمليات البحث الأخيرة"
8383
@@ -85,31 +85,18 @@ msgstr "عمليات البحث الأخيرة"
8585msgid "See more"
8686msgstr "شاهد المزيد"
8787
88−#: qml/Components/SeeMore.qml:57
88+#: qml/Components/SeeMore.qml:58
8989msgid "See less"
9090msgstr "شاهد أقل"
9191
92−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
93−msgid "Rate this"
94−msgstr "قيّم ذلك"
95−
96−#. TRANSLATORS: Number of persons who rated this app/video/whatever
97−#: qml/Dash/Previews/Header.qml:93
98−#, qt-format
99−msgid "(%1)"
100−msgstr "(%1)"
92+#: qml/Dash/DashApps.qml:38
93+msgid "Recent"
94+msgstr ""
10195
102−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
103−#: qml/Dash/Previews/Header.qml:105
96+#: qml/Dash/PreviewListView.qml:52
10497#, qt-format
105−msgid "%1 review"
106−msgid_plural "%1 reviews"
107−msgstr[0] "لا تعليقات (%1)"
108−msgstr[1] "تعليق واحد (%1)"
109−msgstr[2] "تعليقان (%1)"
110−msgstr[3] "%1 تعليقات"
111−msgstr[4] "%1 تعليقا"
112−msgstr[5] "%1 تعليق"
98+msgid "%1 Preview"
99+msgstr ""
113100
114101#: qml/Dash/Previews/PreviewActionCombo.qml:34
115102msgid "More..."
@@ -119,22 +106,18 @@ msgstr "المزيد..."
119106msgid "Less..."
120107msgstr "أقل..."
121108
122−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
109+#: qml/Dash/Previews/PreviewRatingInput.qml:81
110+msgid "Rate this"
111+msgstr "قيّم ذلك"
112+
113+#: qml/Dash/Previews/PreviewRatingInput.qml:126
123114msgid "Add a review"
124115msgstr "أضف تعليق"
125116
126−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
117+#: qml/Dash/Previews/PreviewRatingInput.qml:166
127118msgid "Send"
128119msgstr "أرسل"
129120
130−#: qml/Dash/Previews/Reviews.qml:86
131−msgid "Review"
132−msgstr "التعليق"
133−
134−#: qml/Dash/Previews/Reviews.qml:139
135−msgid "Comments:"
136−msgstr "التعليقات:"
137−
138121#: qml/Greeter/Lockscreen.qml:149
139122msgid "Emergency Call"
140123msgstr "مكالمة طوارئ"
@@ -180,7 +163,27 @@ msgstr "من فضلك أدخِل رقم التعريف الشخصي لبطاقة
180163msgid "Search"
181164msgstr "ابحث"
182165
183−#: qml/Shell.qml:440
166+#: qml/Shell.qml:417
184167#, qt-format
185168msgid "Please enter %1"
186169msgstr "من فضلك أدخِل %1"
170+
171+#~ msgid "Review"
172+#~ msgstr "التعليق"
173+
174+#, qt-format
175+#~ msgid "(%1)"
176+#~ msgstr "(%1)"
177+
178+#~ msgid "Comments:"
179+#~ msgstr "التعليقات:"
180+
181+#, qt-format
182+#~ msgid "%1 review"
183+#~ msgid_plural "%1 reviews"
184+#~ msgstr[0] "لا تعليقات (%1)"
185+#~ msgstr[1] "تعليق واحد (%1)"
186+#~ msgstr[2] "تعليقان (%1)"
187+#~ msgstr[3] "%1 تعليقات"
188+#~ msgstr[4] "%1 تعليقا"
189+#~ msgstr[5] "%1 تعليق"
po/ast.po+19−33
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
11−"PO-Revision-Date: 2014-03-01 16:51+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11+"PO-Revision-Date: 2014-04-04 02:16+0000\n"
1212"Last-Translator: Xuacu Saturio <xuacusk8@gmail.com>\n"
1313"Language-Team: Asturian <ast@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
17+"X-Launchpad-Export-Date: 2014-04-08 07:13+0000\n"
18+"X-Generator: Launchpad (build 16976)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -77,7 +76,7 @@ msgstr ""
7776"Agora domina los xestos de los bordes y pue principiar a usar el "
7877"teléfonu<br><br>Toque la pantalla pa comenzar"
7978
80−#: qml/Components/PageHeader.qml:340
79+#: qml/Components/PageHeader.qml:365
8180msgid "Recent searches"
8281msgstr "Busques recientes"
8382
@@ -85,27 +84,18 @@ msgstr "Busques recientes"
8584msgid "See more"
8685msgstr "Ver más"
8786
88−#: qml/Components/SeeMore.qml:57
87+#: qml/Components/SeeMore.qml:58
8988msgid "See less"
9089msgstr "Ver menos"
9190
92−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
93−msgid "Rate this"
94−msgstr "Valorar esto"
91+#: qml/Dash/DashApps.qml:38
92+msgid "Recent"
93+msgstr "Reciente"
9594
96−#. TRANSLATORS: Number of persons who rated this app/video/whatever
97−#: qml/Dash/Previews/Header.qml:93
95+#: qml/Dash/PreviewListView.qml:52
9896#, qt-format
99−msgid "(%1)"
100−msgstr "(%1)"
101−
102−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
103−#: qml/Dash/Previews/Header.qml:105
104−#, qt-format
105−msgid "%1 review"
106−msgid_plural "%1 reviews"
107−msgstr[0] "%1 reseña"
108−msgstr[1] "%1 reseñes"
97+msgid "%1 Preview"
98+msgstr "Vista previa de %1"
10999
110100#: qml/Dash/Previews/PreviewActionCombo.qml:34
111101msgid "More..."
@@ -115,22 +105,18 @@ msgstr "Más…"
115105msgid "Less..."
116106msgstr "Menos…"
117107
118−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
108+#: qml/Dash/Previews/PreviewRatingInput.qml:81
109+msgid "Rate this"
110+msgstr "Valorar esto"
111+
112+#: qml/Dash/Previews/PreviewRatingInput.qml:126
119113msgid "Add a review"
120114msgstr "Amestar una reseña"
121115
122−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
116+#: qml/Dash/Previews/PreviewRatingInput.qml:166
123117msgid "Send"
124118msgstr "Unviar"
125119
126−#: qml/Dash/Previews/Reviews.qml:86
127−msgid "Review"
128−msgstr "Revisar"
129−
130−#: qml/Dash/Previews/Reviews.qml:139
131−msgid "Comments:"
132−msgstr "Comentarios:"
133−
134120#: qml/Greeter/Lockscreen.qml:149
135121msgid "Emergency Call"
136122msgstr "Llamada d'emerxencia"
@@ -176,7 +162,7 @@ msgstr "Escriba'l PIN de la SIM"
176162msgid "Search"
177163msgstr "Guetar"
178164
179−#: qml/Shell.qml:440
165+#: qml/Shell.qml:417
180166#, qt-format
181167msgid "Please enter %1"
182168msgstr "Introduz %1"
po/az.po+34−31
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-15 09:50+0000\n"
1212"Last-Translator: Turan Mahmudov <turan.mahmudov@gmail.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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,7 +74,7 @@ msgid ""
7474"phone<br><br>Tap on the screen to start"
7575msgstr ""
7676
77−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
7878msgid "Recent searches"
7979msgstr "Son axtarışlar"
8080
@@ -82,27 +82,18 @@ msgstr "Son axtarışlar"
8282msgid "See more"
8383msgstr ""
8484
85−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
8686msgid "See less"
8787msgstr ""
8888
89−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
90−msgid "Rate this"
91−msgstr "Qiymət ver"
92−
93−#. TRANSLATORS: Number of persons who rated this app/video/whatever
94−#: qml/Dash/Previews/Header.qml:93
95−#, qt-format
96−msgid "(%1)"
97−msgstr "(%1)"
89+#: qml/Dash/DashApps.qml:38
90+msgid "Recent"
91+msgstr ""
9892
99−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
100−#: qml/Dash/Previews/Header.qml:105
93+#: qml/Dash/PreviewListView.qml:52
10194#, qt-format
102−msgid "%1 review"
103−msgid_plural "%1 reviews"
104−msgstr[0] "%1 rəy"
105−msgstr[1] "%1 rəy"
95+msgid "%1 Preview"
96+msgstr ""
10697
10798#: qml/Dash/Previews/PreviewActionCombo.qml:34
10899msgid "More..."
@@ -112,22 +103,18 @@ msgstr ""
112103msgid "Less..."
113104msgstr ""
114105
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
107+msgid "Rate this"
108+msgstr "Qiymət ver"
109+
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
116111msgid "Add a review"
117112msgstr "Rəy yaz"
118113
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
120115msgid "Send"
121116msgstr "Göndər"
122117
123−#: qml/Dash/Previews/Reviews.qml:86
124−msgid "Review"
125−msgstr "Rəy"
126−
127−#: qml/Dash/Previews/Reviews.qml:139
128−msgid "Comments:"
129−msgstr "Şərhlər:"
130−
131118#: qml/Greeter/Lockscreen.qml:149
132119msgid "Emergency Call"
133120msgstr "Zərurət zəngi"
@@ -173,7 +160,23 @@ msgstr ""
173160msgid "Search"
174161msgstr "Axtar"
175162
176−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
177164#, qt-format
178165msgid "Please enter %1"
179166msgstr "Xahiş edirik daxil edin: %1"
167+
168+#~ msgid "Comments:"
169+#~ msgstr "Şərhlər:"
170+
171+#~ msgid "Review"
172+#~ msgstr "Rəy"
173+
174+#, qt-format
175+#~ msgid "%1 review"
176+#~ msgid_plural "%1 reviews"
177+#~ msgstr[0] "%1 rəy"
178+#~ msgstr[1] "%1 rəy"
179+
180+#, qt-format
181+#~ msgid "(%1)"
182+#~ msgstr "(%1)"
po/bg.po+20−34
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
11−"PO-Revision-Date: 2014-01-28 19:22+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11+"PO-Revision-Date: 2014-04-01 14:08+0000\n"
1212"Last-Translator: Atanas Kovachki <Unknown>\n"
1313"Language-Team: Bulgarian <bg@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
17+"X-Launchpad-Export-Date: 2014-04-03 06:06+0000\n"
18+"X-Generator: Launchpad (build 16967)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,7 +79,7 @@ msgid ""
8079"phone<br><br>Tap on the screen to start"
8180msgstr ""
8281
83−#: qml/Components/PageHeader.qml:340
82+#: qml/Components/PageHeader.qml:365
8483msgid "Recent searches"
8584msgstr "Последни търсения"
8685
@@ -88,27 +87,18 @@ msgstr "Последни търсения"
8887msgid "See more"
8988msgstr ""
9089
91−#: qml/Components/SeeMore.qml:57
90+#: qml/Components/SeeMore.qml:58
9291msgid "See less"
9392msgstr ""
9493
95−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
96−msgid "Rate this"
97−msgstr "Оценете това"
98−
99−#. TRANSLATORS: Number of persons who rated this app/video/whatever
100−#: qml/Dash/Previews/Header.qml:93
101−#, qt-format
102−msgid "(%1)"
103−msgstr "(%1)"
94+#: qml/Dash/DashApps.qml:38
95+msgid "Recent"
96+msgstr "Последни"
10497
105−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
106−#: qml/Dash/Previews/Header.qml:105
98+#: qml/Dash/PreviewListView.qml:52
10799#, qt-format
108−msgid "%1 review"
109−msgid_plural "%1 reviews"
110−msgstr[0] "%1 отзив"
111−msgstr[1] "%1 отзива"
100+msgid "%1 Preview"
101+msgstr ""
112102
113103#: qml/Dash/Previews/PreviewActionCombo.qml:34
114104msgid "More..."
@@ -116,24 +106,20 @@ msgstr ""
116106
117107#: qml/Dash/Previews/PreviewActionCombo.qml:34
118108msgid "Less..."
119−msgstr ""
109+msgstr "По-малко..."
120110
121−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
111+#: qml/Dash/Previews/PreviewRatingInput.qml:81
112+msgid "Rate this"
113+msgstr "Оценете това"
114+
115+#: qml/Dash/Previews/PreviewRatingInput.qml:126
122116msgid "Add a review"
123117msgstr "Добави отзив"
124118
125−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119+#: qml/Dash/Previews/PreviewRatingInput.qml:166
126120msgid "Send"
127121msgstr "Изпрати"
128122
129−#: qml/Dash/Previews/Reviews.qml:86
130−msgid "Review"
131−msgstr "Отзив"
132−
133−#: qml/Dash/Previews/Reviews.qml:139
134−msgid "Comments:"
135−msgstr "Коментари:"
136−
137123#: qml/Greeter/Lockscreen.qml:149
138124msgid "Emergency Call"
139125msgstr "Спешно повикване"
@@ -179,7 +165,7 @@ msgstr ""
179165msgid "Search"
180166msgstr "Търсене"
181167
182−#: qml/Shell.qml:440
168+#: qml/Shell.qml:417
183169#, qt-format
184170msgid "Please enter %1"
185171msgstr "Моля, въведете %1"
po/bs.po+16−29
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-16 22:33+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Bosnian <bs@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: 2014-03-15 07:34+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
20+"X-Generator: Launchpad (build 16967)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,7 +74,7 @@ msgid ""
7474"phone<br><br>Tap on the screen to start"
7575msgstr ""
7676
77−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
7878msgid "Recent searches"
7979msgstr ""
8080
@@ -82,28 +82,19 @@ msgstr ""
8282msgid "See more"
8383msgstr ""
8484
85−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
8686msgid "See less"
8787msgstr ""
8888
89−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
90−msgid "Rate this"
89+#: qml/Dash/DashApps.qml:38
90+msgid "Recent"
9191msgstr ""
9292
93−#. TRANSLATORS: Number of persons who rated this app/video/whatever
94−#: qml/Dash/Previews/Header.qml:93
93+#: qml/Dash/PreviewListView.qml:52
9594#, qt-format
96−msgid "(%1)"
95+msgid "%1 Preview"
9796msgstr ""
9897
99−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
100−#: qml/Dash/Previews/Header.qml:105
101−#, qt-format
102−msgid "%1 review"
103−msgid_plural "%1 reviews"
104−msgstr[0] ""
105−msgstr[1] ""
106−
10798#: qml/Dash/Previews/PreviewActionCombo.qml:34
10899msgid "More..."
109100msgstr ""
@@ -112,20 +103,16 @@ msgstr ""
112103msgid "Less..."
113104msgstr ""
114105
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
116−msgid "Add a review"
117−msgstr ""
118−
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
120−msgid "Send"
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
107+msgid "Rate this"
121108msgstr ""
122109
123−#: qml/Dash/Previews/Reviews.qml:86
124−msgid "Review"
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
111+msgid "Add a review"
125112msgstr ""
126113
127−#: qml/Dash/Previews/Reviews.qml:139
128−msgid "Comments:"
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
115+msgid "Send"
129116msgstr ""
130117
131118#: qml/Greeter/Lockscreen.qml:149
@@ -173,7 +160,7 @@ msgstr ""
173160msgid "Search"
174161msgstr ""
175162
176−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
177164#, qt-format
178165msgid "Please enter %1"
179166msgstr ""
po/ca.po+33−30
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-10 07:45+0000\n"
1212"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
1313"Language-Team: Catalan <ca@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -79,7 +79,7 @@ msgid ""
7979"phone<br><br>Tap on the screen to start"
8080msgstr ""
8181
82−#: qml/Components/PageHeader.qml:340
82+#: qml/Components/PageHeader.qml:365
8383msgid "Recent searches"
8484msgstr "Cerques recents"
8585
@@ -87,27 +87,18 @@ msgstr "Cerques recents"
8787msgid "See more"
8888msgstr ""
8989
90−#: qml/Components/SeeMore.qml:57
90+#: qml/Components/SeeMore.qml:58
9191msgid "See less"
9292msgstr ""
9393
94−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
95−msgid "Rate this"
94+#: qml/Dash/DashApps.qml:38
95+msgid "Recent"
9696msgstr ""
9797
98−#. TRANSLATORS: Number of persons who rated this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:93
100−#, qt-format
101−msgid "(%1)"
102−msgstr "(%1)"
103−
104−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
105−#: qml/Dash/Previews/Header.qml:105
98+#: qml/Dash/PreviewListView.qml:52
10699#, qt-format
107−msgid "%1 review"
108−msgid_plural "%1 reviews"
109−msgstr[0] "%1 ressenya"
110−msgstr[1] "%1 ressenyes"
100+msgid "%1 Preview"
101+msgstr ""
111102
112103#: qml/Dash/Previews/PreviewActionCombo.qml:34
113104msgid "More..."
@@ -117,22 +108,18 @@ msgstr ""
117108msgid "Less..."
118109msgstr ""
119110
120−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
111+#: qml/Dash/Previews/PreviewRatingInput.qml:81
112+msgid "Rate this"
113+msgstr ""
114+
115+#: qml/Dash/Previews/PreviewRatingInput.qml:126
121116msgid "Add a review"
122117msgstr "Afegiu una ressenya"
123118
124−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119+#: qml/Dash/Previews/PreviewRatingInput.qml:166
125120msgid "Send"
126121msgstr "Envia"
127122
128−#: qml/Dash/Previews/Reviews.qml:86
129−msgid "Review"
130−msgstr "Ressenya"
131−
132−#: qml/Dash/Previews/Reviews.qml:139
133−msgid "Comments:"
134−msgstr "Comentaris:"
135−
136123#: qml/Greeter/Lockscreen.qml:149
137124msgid "Emergency Call"
138125msgstr "Trucada d'emergència"
@@ -178,7 +165,23 @@ msgstr ""
178165msgid "Search"
179166msgstr "Cerca"
180167
181−#: qml/Shell.qml:440
168+#: qml/Shell.qml:417
182169#, qt-format
183170msgid "Please enter %1"
184171msgstr "Introduïu %1"
172+
173+#, qt-format
174+#~ msgid "(%1)"
175+#~ msgstr "(%1)"
176+
177+#~ msgid "Comments:"
178+#~ msgstr "Comentaris:"
179+
180+#~ msgid "Review"
181+#~ msgstr "Ressenya"
182+
183+#, qt-format
184+#~ msgid "%1 review"
185+#~ msgid_plural "%1 reviews"
186+#~ msgstr[0] "%1 ressenya"
187+#~ msgstr[1] "%1 ressenyes"
po/ckb.po+34−31
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-21 11:05+0000\n"
1212"Last-Translator: Aras <aras.noori@gmail.com>\n"
1313"Language-Team: Kurdish (Sorani) <ckb@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "دوایین گەڕانەکان"
7979
@@ -81,27 +81,18 @@ msgstr "دوایین گەڕانەکان"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
90−msgstr "پلە دابنی بۆی"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
90+msgstr ""
9791
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
92+#: qml/Dash/PreviewListView.qml:52
10093#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] "%1 پێداچوونەوە"
104−msgstr[1] "%1 پێداچوونەوەکان"
94+msgid "%1 Preview"
95+msgstr ""
10596
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "پلە دابنی بۆی"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115110msgid "Add a review"
116111msgstr "پێداچوونەوە زۆر بکە"
117112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119114msgid "Send"
120115msgstr "ناردن"
121116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr "پێداچوونەوە"
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "لێدوانەکان:"
129−
130117#: qml/Greeter/Lockscreen.qml:149
131118msgid "Emergency Call"
132119msgstr "هێڵی فریاگوزاری"
@@ -172,7 +159,23 @@ msgstr ""
172159msgid "Search"
173160msgstr "گەڕان"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr "تکایە %1 بنووسە"
166+
167+#, qt-format
168+#~ msgid "(%1)"
169+#~ msgstr "(%1)"
170+
171+#~ msgid "Comments:"
172+#~ msgstr "لێدوانەکان:"
173+
174+#, qt-format
175+#~ msgid "%1 review"
176+#~ msgid_plural "%1 reviews"
177+#~ msgstr[0] "%1 پێداچوونەوە"
178+#~ msgstr[1] "%1 پێداچوونەوەکان"
179+
180+#~ msgid "Review"
181+#~ msgstr "پێداچوونەوە"
po/cs.po+35−32
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-08 10:11+0000\n"
1212"Last-Translator: Tadeáš Pařík <tadeas.parik@gmail.com>\n"
1313"Language-Team: Czech <cs@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=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "Poslední vyhledávání"
7979
@@ -81,28 +81,18 @@ msgstr "Poslední vyhledávání"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
90−msgstr "Ohodnoťte to"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
90+msgstr ""
9791
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
92+#: qml/Dash/PreviewListView.qml:52
10093#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] "%1 recenze"
104−msgstr[1] "%1 recenze"
105−msgstr[2] "%1 recenzí"
94+msgid "%1 Preview"
95+msgstr ""
10696
10797#: qml/Dash/Previews/PreviewActionCombo.qml:34
10898msgid "More..."
@@ -112,22 +102,18 @@ msgstr ""
112102msgid "Less..."
113103msgstr ""
114104
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "Ohodnoťte to"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
116110msgid "Add a review"
117111msgstr "Přidat recenzi"
118112
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
120114msgid "Send"
121115msgstr "Odeslat"
122116
123−#: qml/Dash/Previews/Reviews.qml:86
124−msgid "Review"
125−msgstr "Recenze"
126−
127−#: qml/Dash/Previews/Reviews.qml:139
128−msgid "Comments:"
129−msgstr "Komentáře:"
130−
131117#: qml/Greeter/Lockscreen.qml:149
132118msgid "Emergency Call"
133119msgstr "Tísňové volání"
@@ -173,7 +159,24 @@ msgstr ""
173159msgid "Search"
174160msgstr "Hledat"
175161
176−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
177163#, qt-format
178164msgid "Please enter %1"
179165msgstr "Zadejte prosím %1"
166+
167+#~ msgid "Comments:"
168+#~ msgstr "Komentáře:"
169+
170+#, qt-format
171+#~ msgid "(%1)"
172+#~ msgstr "(%1)"
173+
174+#~ msgid "Review"
175+#~ msgstr "Recenze"
176+
177+#, qt-format
178+#~ msgid "%1 review"
179+#~ msgid_plural "%1 reviews"
180+#~ msgstr[0] "%1 recenze"
181+#~ msgstr[1] "%1 recenze"
182+#~ msgstr[2] "%1 recenzí"
po/da.po+16−29
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-14 20:16+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Danish <da@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr ""
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/de.po+34−31
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-15 11:01+0000\n"
1212"Last-Translator: Dennis Baudys <Unknown>\n"
1313"Language-Team: German <de@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -75,7 +75,7 @@ msgid ""
7575"phone<br><br>Tap on the screen to start"
7676msgstr ""
7777
78−#: qml/Components/PageHeader.qml:340
78+#: qml/Components/PageHeader.qml:365
7979msgid "Recent searches"
8080msgstr "Letzte Suchbegriffe"
8181
@@ -83,27 +83,18 @@ msgstr "Letzte Suchbegriffe"
8383msgid "See more"
8484msgstr ""
8585
86−#: qml/Components/SeeMore.qml:57
86+#: qml/Components/SeeMore.qml:58
8787msgid "See less"
8888msgstr ""
8989
90−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
91−msgid "Rate this"
92−msgstr "Bewerten"
93−
94−#. TRANSLATORS: Number of persons who rated this app/video/whatever
95−#: qml/Dash/Previews/Header.qml:93
96−#, qt-format
97−msgid "(%1)"
98−msgstr "(%1)"
90+#: qml/Dash/DashApps.qml:38
91+msgid "Recent"
92+msgstr ""
9993
100−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
101−#: qml/Dash/Previews/Header.qml:105
94+#: qml/Dash/PreviewListView.qml:52
10295#, qt-format
103−msgid "%1 review"
104−msgid_plural "%1 reviews"
105−msgstr[0] "%1 Bewertung"
106−msgstr[1] "%1 Bewertungen"
96+msgid "%1 Preview"
97+msgstr ""
10798
10899#: qml/Dash/Previews/PreviewActionCombo.qml:34
109100msgid "More..."
@@ -113,22 +104,18 @@ msgstr ""
113104msgid "Less..."
114105msgstr ""
115106
116−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
107+#: qml/Dash/Previews/PreviewRatingInput.qml:81
108+msgid "Rate this"
109+msgstr "Bewerten"
110+
111+#: qml/Dash/Previews/PreviewRatingInput.qml:126
117112msgid "Add a review"
118113msgstr "Bewertung hinzufügen"
119114
120−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
115+#: qml/Dash/Previews/PreviewRatingInput.qml:166
121116msgid "Send"
122117msgstr "Senden"
123118
124−#: qml/Dash/Previews/Reviews.qml:86
125−msgid "Review"
126−msgstr "Bewertung"
127−
128−#: qml/Dash/Previews/Reviews.qml:139
129−msgid "Comments:"
130−msgstr "Kommentare:"
131−
132119#: qml/Greeter/Lockscreen.qml:149
133120msgid "Emergency Call"
134121msgstr "Notruf"
@@ -174,7 +161,23 @@ msgstr ""
174161msgid "Search"
175162msgstr "Suchen"
176163
177−#: qml/Shell.qml:440
164+#: qml/Shell.qml:417
178165#, qt-format
179166msgid "Please enter %1"
180167msgstr "Bitte geben Sie %1 ein"
168+
169+#~ msgid "Comments:"
170+#~ msgstr "Kommentare:"
171+
172+#, qt-format
173+#~ msgid "(%1)"
174+#~ msgstr "(%1)"
175+
176+#~ msgid "Review"
177+#~ msgstr "Bewertung"
178+
179+#, qt-format
180+#~ msgid "%1 review"
181+#~ msgid_plural "%1 reviews"
182+#~ msgstr[0] "%1 Bewertung"
183+#~ msgstr[1] "%1 Bewertungen"
po/el.po+34−31
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-02-26 09:58+0000\n"
1212"Last-Translator: j3lc <x_nikos@yahoo.gr>\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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -77,7 +77,7 @@ msgstr ""
7777"Πλέον γνωρίζετε τις χειρονομίες από τα άκρα και μπορείτε να ξεκινήσετε να "
7878"χρησιμοποιείτε το τηλέφωνο<br><br>Αγγίξτε την οθόνη για να ξεκινήσετε"
7979
80−#: qml/Components/PageHeader.qml:340
80+#: qml/Components/PageHeader.qml:365
8181msgid "Recent searches"
8282msgstr "Πρόσφατες αναζητήσεις"
8383
@@ -85,27 +85,18 @@ msgstr "Πρόσφατες αναζητήσεις"
8585msgid "See more"
8686msgstr "Περρισότερα"
8787
88−#: qml/Components/SeeMore.qml:57
88+#: qml/Components/SeeMore.qml:58
8989msgid "See less"
9090msgstr "Λιγότερα"
9191
92−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
93−msgid "Rate this"
94−msgstr "Βαθμολογήστε το"
95−
96−#. TRANSLATORS: Number of persons who rated this app/video/whatever
97−#: qml/Dash/Previews/Header.qml:93
98−#, qt-format
99−msgid "(%1)"
100−msgstr "(%1)"
92+#: qml/Dash/DashApps.qml:38
93+msgid "Recent"
94+msgstr ""
10195
102−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
103−#: qml/Dash/Previews/Header.qml:105
96+#: qml/Dash/PreviewListView.qml:52
10497#, qt-format
105−msgid "%1 review"
106−msgid_plural "%1 reviews"
107−msgstr[0] "%1 αξιολόγηση"
108−msgstr[1] "%1 αξιολογήσεις"
98+msgid "%1 Preview"
99+msgstr ""
109100
110101#: qml/Dash/Previews/PreviewActionCombo.qml:34
111102msgid "More..."
@@ -115,22 +106,18 @@ msgstr ""
115106msgid "Less..."
116107msgstr ""
117108
118−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
109+#: qml/Dash/Previews/PreviewRatingInput.qml:81
110+msgid "Rate this"
111+msgstr "Βαθμολογήστε το"
112+
113+#: qml/Dash/Previews/PreviewRatingInput.qml:126
119114msgid "Add a review"
120115msgstr "Προσθέστε την αξιολόγησή σας"
121116
122−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
117+#: qml/Dash/Previews/PreviewRatingInput.qml:166
123118msgid "Send"
124119msgstr "Αποστολή"
125120
126−#: qml/Dash/Previews/Reviews.qml:86
127−msgid "Review"
128−msgstr "Αξιολόγηση"
129−
130−#: qml/Dash/Previews/Reviews.qml:139
131−msgid "Comments:"
132−msgstr "Σχόλια:"
133−
134121#: qml/Greeter/Lockscreen.qml:149
135122msgid "Emergency Call"
136123msgstr "Κλήση έκτακτης ανάγκης"
@@ -176,7 +163,23 @@ msgstr "Παρακαλώ εισάγετε το PIN της κάρτας SIM"
176163msgid "Search"
177164msgstr "Αναζήτηση"
178165
179−#: qml/Shell.qml:440
166+#: qml/Shell.qml:417
180167#, qt-format
181168msgid "Please enter %1"
182169msgstr "Πληκτρολογήστε %1"
170+
171+#, qt-format
172+#~ msgid "%1 review"
173+#~ msgid_plural "%1 reviews"
174+#~ msgstr[0] "%1 αξιολόγηση"
175+#~ msgstr[1] "%1 αξιολογήσεις"
176+
177+#, qt-format
178+#~ msgid "(%1)"
179+#~ msgstr "(%1)"
180+
181+#~ msgid "Comments:"
182+#~ msgstr "Σχόλια:"
183+
184+#~ msgid "Review"
185+#~ msgstr "Αξιολόγηση"
po/en_AU.po+34−31
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-09-28 07:46+0000\n"
1212"Last-Translator: Jared Norris <jarednorris@ubuntu.com>\n"
1313"Language-Team: English (Australia) <en_AU@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "Recent searches"
7979
@@ -81,27 +81,18 @@ msgstr "Recent searches"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
90−msgstr "Rate this"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
90+msgstr ""
9791
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
92+#: qml/Dash/PreviewListView.qml:52
10093#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] "%1 review"
104−msgstr[1] "%1 reviews"
94+msgid "%1 Preview"
95+msgstr ""
10596
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "Rate this"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115110msgid "Add a review"
116111msgstr "Add a review"
117112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119114msgid "Send"
120115msgstr "Send"
121116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr "Review"
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "Comments:"
129−
130117#: qml/Greeter/Lockscreen.qml:149
131118msgid "Emergency Call"
132119msgstr "Emergency Call"
@@ -172,7 +159,23 @@ msgstr ""
172159msgid "Search"
173160msgstr "Search"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr "Please enter %1"
166+
167+#~ msgid "Comments:"
168+#~ msgstr "Comments:"
169+
170+#~ msgid "Review"
171+#~ msgstr "Review"
172+
173+#, qt-format
174+#~ msgid "%1 review"
175+#~ msgid_plural "%1 reviews"
176+#~ msgstr[0] "%1 review"
177+#~ msgstr[1] "%1 reviews"
178+
179+#, qt-format
180+#~ msgid "(%1)"
181+#~ msgstr "(%1)"
po/en_GB.po+34−31
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-03-07 13:27+0000\n"
1212"Last-Translator: Andi Chandler <Unknown>\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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -75,7 +75,7 @@ msgstr ""
7575"You have now mastered the edge gestures and can start using the "
7676"phone<br><br>Tap on the screen to start"
7777
78−#: qml/Components/PageHeader.qml:340
78+#: qml/Components/PageHeader.qml:365
7979msgid "Recent searches"
8080msgstr "Recent searches"
8181
@@ -83,27 +83,18 @@ msgstr "Recent searches"
8383msgid "See more"
8484msgstr "See more"
8585
86−#: qml/Components/SeeMore.qml:57
86+#: qml/Components/SeeMore.qml:58
8787msgid "See less"
8888msgstr "See less"
8989
90−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
91−msgid "Rate this"
92−msgstr "Rate this"
93−
94−#. TRANSLATORS: Number of persons who rated this app/video/whatever
95−#: qml/Dash/Previews/Header.qml:93
96−#, qt-format
97−msgid "(%1)"
98−msgstr "(%1)"
90+#: qml/Dash/DashApps.qml:38
91+msgid "Recent"
92+msgstr ""
9993
100−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
101−#: qml/Dash/Previews/Header.qml:105
94+#: qml/Dash/PreviewListView.qml:52
10295#, qt-format
103−msgid "%1 review"
104−msgid_plural "%1 reviews"
105−msgstr[0] "%1 review"
106−msgstr[1] "%1 reviews"
96+msgid "%1 Preview"
97+msgstr ""
10798
10899#: qml/Dash/Previews/PreviewActionCombo.qml:34
109100msgid "More..."
@@ -113,22 +104,18 @@ msgstr "More..."
113104msgid "Less..."
114105msgstr "Less..."
115106
116−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
107+#: qml/Dash/Previews/PreviewRatingInput.qml:81
108+msgid "Rate this"
109+msgstr "Rate this"
110+
111+#: qml/Dash/Previews/PreviewRatingInput.qml:126
117112msgid "Add a review"
118113msgstr "Add a review"
119114
120−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
115+#: qml/Dash/Previews/PreviewRatingInput.qml:166
121116msgid "Send"
122117msgstr "Send"
123118
124−#: qml/Dash/Previews/Reviews.qml:86
125−msgid "Review"
126−msgstr "Review"
127−
128−#: qml/Dash/Previews/Reviews.qml:139
129−msgid "Comments:"
130−msgstr "Comments:"
131−
132119#: qml/Greeter/Lockscreen.qml:149
133120msgid "Emergency Call"
134121msgstr "Emergency Call"
@@ -174,7 +161,23 @@ msgstr "Please enter SIM PIN"
174161msgid "Search"
175162msgstr "Search"
176163
177−#: qml/Shell.qml:440
164+#: qml/Shell.qml:417
178165#, qt-format
179166msgid "Please enter %1"
180167msgstr "Please enter %1"
168+
169+#~ msgid "Comments:"
170+#~ msgstr "Comments:"
171+
172+#~ msgid "Review"
173+#~ msgstr "Review"
174+
175+#, qt-format
176+#~ msgid "%1 review"
177+#~ msgid_plural "%1 reviews"
178+#~ msgstr[0] "%1 review"
179+#~ msgstr[1] "%1 reviews"
180+
181+#, qt-format
182+#~ msgid "(%1)"
183+#~ msgstr "(%1)"
po/eo.po+16−29
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr ""
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/es.po+19−33
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
11−"PO-Revision-Date: 2014-02-20 05:43+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11+"PO-Revision-Date: 2014-03-28 22:37+0000\n"
1212"Last-Translator: Adolfo Jayme <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"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
17+"X-Launchpad-Export-Date: 2014-03-29 07:34+0000\n"
18+"X-Generator: Launchpad (build 16967)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -78,7 +77,7 @@ msgstr ""
7877"Ahora domina los gestos de los bordes y puede usar el teléfono<br><br>Toque "
7978"la pantalla para comenzar"
8079
81−#: qml/Components/PageHeader.qml:340
80+#: qml/Components/PageHeader.qml:365
8281msgid "Recent searches"
8382msgstr "Búsquedas recientes"
8483
@@ -86,27 +85,18 @@ msgstr "Búsquedas recientes"
8685msgid "See more"
8786msgstr "Ver más"
8887
89−#: qml/Components/SeeMore.qml:57
88+#: qml/Components/SeeMore.qml:58
9089msgid "See less"
9190msgstr "Ver menos"
9291
93−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
94−msgid "Rate this"
95−msgstr "Valorar esto"
92+#: qml/Dash/DashApps.qml:38
93+msgid "Recent"
94+msgstr "Recientes"
9695
97−#. TRANSLATORS: Number of persons who rated this app/video/whatever
98−#: qml/Dash/Previews/Header.qml:93
96+#: qml/Dash/PreviewListView.qml:52
9997#, qt-format
100−msgid "(%1)"
101−msgstr "(%1)"
102−
103−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
104−#: qml/Dash/Previews/Header.qml:105
105−#, qt-format
106−msgid "%1 review"
107−msgid_plural "%1 reviews"
108−msgstr[0] "%1 reseña"
109−msgstr[1] "%1 reseñas"
98+msgid "%1 Preview"
99+msgstr "Previsualización de %1"
110100
111101#: qml/Dash/Previews/PreviewActionCombo.qml:34
112102msgid "More..."
@@ -116,22 +106,18 @@ msgstr "Más…"
116106msgid "Less..."
117107msgstr "Menos…"
118108
119−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
109+#: qml/Dash/Previews/PreviewRatingInput.qml:81
110+msgid "Rate this"
111+msgstr "Valorar esto"
112+
113+#: qml/Dash/Previews/PreviewRatingInput.qml:126
120114msgid "Add a review"
121115msgstr "Añadir una reseña"
122116
123−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
117+#: qml/Dash/Previews/PreviewRatingInput.qml:166
124118msgid "Send"
125119msgstr "Enviar"
126120
127−#: qml/Dash/Previews/Reviews.qml:86
128−msgid "Review"
129−msgstr "Reseñar"
130−
131−#: qml/Dash/Previews/Reviews.qml:139
132−msgid "Comments:"
133−msgstr "Comentarios:"
134−
135121#: qml/Greeter/Lockscreen.qml:149
136122msgid "Emergency Call"
137123msgstr "Llamada de emergencia"
@@ -177,7 +163,7 @@ msgstr "Escriba el PIN de la SIM"
177163msgid "Search"
178164msgstr "Buscar"
179165
180−#: qml/Shell.qml:440
166+#: qml/Shell.qml:417
181167#, qt-format
182168msgid "Please enter %1"
183169msgstr "Introduzca %1"
po/eu.po+20−34
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
11−"PO-Revision-Date: 2014-03-16 17:40+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11+"PO-Revision-Date: 2014-03-30 12:44+0000\n"
1212"Last-Translator: Ibai Oihanguren Sala <Unknown>\n"
1313"Language-Team: Basque <eu@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-17 05:13+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
17+"X-Launchpad-Export-Date: 2014-03-31 06:44+0000\n"
18+"X-Generator: Launchpad (build 16967)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -77,7 +76,7 @@ msgstr ""
7776"Jadanik ezagutzen dituzu ertzetako keinuak, eta mugikorra erabiltzen has "
7877"zaitezke<br><br>Ukitu pantaila hasteko"
7978
80−#: qml/Components/PageHeader.qml:340
79+#: qml/Components/PageHeader.qml:365
8180msgid "Recent searches"
8281msgstr "Azken bilaketak"
8382
@@ -85,27 +84,18 @@ msgstr "Azken bilaketak"
8584msgid "See more"
8685msgstr "Ikusi gehiago"
8786
88−#: qml/Components/SeeMore.qml:57
87+#: qml/Components/SeeMore.qml:58
8988msgid "See less"
9089msgstr "Ikusi gutxiago"
9190
92−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
93−msgid "Rate this"
94−msgstr "Puntuatu hau"
91+#: qml/Dash/DashApps.qml:38
92+msgid "Recent"
93+msgstr "Azkenak"
9594
96−#. TRANSLATORS: Number of persons who rated this app/video/whatever
97−#: qml/Dash/Previews/Header.qml:93
95+#: qml/Dash/PreviewListView.qml:52
9896#, qt-format
99−msgid "(%1)"
100−msgstr "(%1)"
101−
102−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
103−#: qml/Dash/Previews/Header.qml:105
104−#, qt-format
105−msgid "%1 review"
106−msgid_plural "%1 reviews"
107−msgstr[0] "berrikuspen %1"
108−msgstr[1] "%1 berrikuspen"
97+msgid "%1 Preview"
98+msgstr "%1 aurrebista"
10999
110100#: qml/Dash/Previews/PreviewActionCombo.qml:34
111101msgid "More..."
@@ -115,22 +105,18 @@ msgstr "Gehiago..."
115105msgid "Less..."
116106msgstr "Gutxiago..."
117107
118−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
108+#: qml/Dash/Previews/PreviewRatingInput.qml:81
109+msgid "Rate this"
110+msgstr "Puntuatu hau"
111+
112+#: qml/Dash/Previews/PreviewRatingInput.qml:126
119113msgid "Add a review"
120−msgstr "Gehitu berrikuspena"
114+msgstr "Gehitu kritika"
121115
122−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
116+#: qml/Dash/Previews/PreviewRatingInput.qml:166
123117msgid "Send"
124118msgstr "Bidali"
125119
126−#: qml/Dash/Previews/Reviews.qml:86
127−msgid "Review"
128−msgstr "Berrikusi"
129−
130−#: qml/Dash/Previews/Reviews.qml:139
131−msgid "Comments:"
132−msgstr "Iruzkinak:"
133−
134120#: qml/Greeter/Lockscreen.qml:149
135121msgid "Emergency Call"
136122msgstr "Larrialdi-deia"
@@ -176,7 +162,7 @@ msgstr "Sartu SIMaren PINa"
176162msgid "Search"
177163msgstr "Bilatu"
178164
179−#: qml/Shell.qml:440
165+#: qml/Shell.qml:417
180166#, qt-format
181167msgid "Please enter %1"
182168msgstr "Sartu %1"
po/fa.po+16−29
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-10-31 19:02+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Persian <fa@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr ""
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/fi.po+19−33
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
11−"PO-Revision-Date: 2014-03-09 19:22+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11+"PO-Revision-Date: 2014-04-05 09:57+0000\n"
1212"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"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
17+"X-Launchpad-Export-Date: 2014-04-08 07:13+0000\n"
18+"X-Generator: Launchpad (build 16976)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -75,7 +74,7 @@ msgstr ""
7574"Hallitset nyt reunaeleet, joten voit aloittaa puhelimen "
7675"käytön<br><br>Napauta näyttöä aloittaaksesi"
7776
78−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
7978msgid "Recent searches"
8079msgstr "Viimeisimmät haut"
8180
@@ -83,27 +82,18 @@ msgstr "Viimeisimmät haut"
8382msgid "See more"
8483msgstr "Näytä lisää"
8584
86−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
8786msgid "See less"
8887msgstr "Näytä vähemmän"
8988
90−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
91−msgid "Rate this"
92−msgstr "Arvioi tämä"
89+#: qml/Dash/DashApps.qml:38
90+msgid "Recent"
91+msgstr "Viimeisimmät"
9392
94−#. TRANSLATORS: Number of persons who rated this app/video/whatever
95−#: qml/Dash/Previews/Header.qml:93
93+#: qml/Dash/PreviewListView.qml:52
9694#, qt-format
97−msgid "(%1)"
98−msgstr "(%1)"
99−
100−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
101−#: qml/Dash/Previews/Header.qml:105
102−#, qt-format
103−msgid "%1 review"
104−msgid_plural "%1 reviews"
105−msgstr[0] "%1 arvostelu"
106−msgstr[1] "%1 arvostelua"
95+msgid "%1 Preview"
96+msgstr "%1 esikatselu"
10797
10898#: qml/Dash/Previews/PreviewActionCombo.qml:34
10999msgid "More..."
@@ -113,22 +103,18 @@ msgstr "Lisää..."
113103msgid "Less..."
114104msgstr "Vähemmän..."
115105
116−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
107+msgid "Rate this"
108+msgstr "Arvioi tämä"
109+
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
117111msgid "Add a review"
118112msgstr "Lisää arvostelu"
119113
120−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
121115msgid "Send"
122116msgstr "Lähetä"
123117
124−#: qml/Dash/Previews/Reviews.qml:86
125−msgid "Review"
126−msgstr "Arvostelu"
127−
128−#: qml/Dash/Previews/Reviews.qml:139
129−msgid "Comments:"
130−msgstr "Kommentit:"
131−
132118#: qml/Greeter/Lockscreen.qml:149
133119msgid "Emergency Call"
134120msgstr "Hätäpuhelu"
@@ -174,7 +160,7 @@ msgstr "Anna SIM-kortin PIN-koodi"
174160msgid "Search"
175161msgstr "Hae"
176162
177−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
178164#, qt-format
179165msgid "Please enter %1"
180166msgstr "Kirjoita %1"
po/fo.po+16−29
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-14 20:08+0000\n"
1212"Last-Translator: Jógvan Olsen <jeggy@jebster.net>\n"
1313"Language-Team: Faroese <fo@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr "Leita"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/fr.po+34−31
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-28 00:34+0000\n"
1212"Last-Translator: Pierre <Unknown>\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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "Recherches récentes"
7979
@@ -81,27 +81,18 @@ msgstr "Recherches récentes"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
90−msgstr "Evaluez ceci"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
90+msgstr ""
9791
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
92+#: qml/Dash/PreviewListView.qml:52
10093#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] "%1 avis"
104−msgstr[1] "%1 avis"
94+msgid "%1 Preview"
95+msgstr ""
10596
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "Evaluez ceci"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115110msgid "Add a review"
116111msgstr "Ajouter un avis"
117112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119114msgid "Send"
120115msgstr "Envoyer"
121116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr "Avis"
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "Commentaires :"
129−
130117#: qml/Greeter/Lockscreen.qml:149
131118msgid "Emergency Call"
132119msgstr "Appel d'urgence"
@@ -172,7 +159,23 @@ msgstr ""
172159msgid "Search"
173160msgstr "Rechercher"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr "Veuillez saisir %1"
166+
167+#~ msgid "Review"
168+#~ msgstr "Avis"
169+
170+#, qt-format
171+#~ msgid "%1 review"
172+#~ msgid_plural "%1 reviews"
173+#~ msgstr[0] "%1 avis"
174+#~ msgstr[1] "%1 avis"
175+
176+#~ msgid "Comments:"
177+#~ msgstr "Commentaires :"
178+
179+#, qt-format
180+#~ msgid "(%1)"
181+#~ msgstr "(%1)"
po/gd.po+36−33
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-09-30 10:34+0000\n"
1212"Last-Translator: Akerbeltz <fios@akerbeltz.org>\n"
1313"Language-Team: Gaelic; Scottish <gd@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
1818"(n > 2 && n < 20) ? 2 : 3;\n"
19−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
20+"X-Generator: Launchpad (build 16967)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,7 +80,7 @@ msgid ""
8080"phone<br><br>Tap on the screen to start"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:340
83+#: qml/Components/PageHeader.qml:365
8484msgid "Recent searches"
8585msgstr "Na lorg thu o chionn goirid"
8686
@@ -88,29 +88,18 @@ msgstr "Na lorg thu o chionn goirid"
8888msgid "See more"
8989msgstr ""
9090
91−#: qml/Components/SeeMore.qml:57
91+#: qml/Components/SeeMore.qml:58
9292msgid "See less"
9393msgstr ""
9494
95−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
96−msgid "Rate this"
97−msgstr "Rangaich seo"
98−
99−#. TRANSLATORS: Number of persons who rated this app/video/whatever
100−#: qml/Dash/Previews/Header.qml:93
101−#, qt-format
102−msgid "(%1)"
103−msgstr "(%1)"
95+#: qml/Dash/DashApps.qml:38
96+msgid "Recent"
97+msgstr ""
10498
105−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
106−#: qml/Dash/Previews/Header.qml:105
99+#: qml/Dash/PreviewListView.qml:52
107100#, qt-format
108−msgid "%1 review"
109−msgid_plural "%1 reviews"
110−msgstr[0] "%1 lèirmheas"
111−msgstr[1] "%1 lèirmheas"
112−msgstr[2] "%1 lèirmheasan"
113−msgstr[3] "%1 lèirmheas"
101+msgid "%1 Preview"
102+msgstr ""
114103
115104#: qml/Dash/Previews/PreviewActionCombo.qml:34
116105msgid "More..."
@@ -120,22 +109,18 @@ msgstr ""
120109msgid "Less..."
121110msgstr ""
122111
123−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
112+#: qml/Dash/Previews/PreviewRatingInput.qml:81
113+msgid "Rate this"
114+msgstr "Rangaich seo"
115+
116+#: qml/Dash/Previews/PreviewRatingInput.qml:126
124117msgid "Add a review"
125118msgstr "Cuir lèirmheas ris"
126119
127−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
120+#: qml/Dash/Previews/PreviewRatingInput.qml:166
128121msgid "Send"
129122msgstr "Cuir"
130123
131−#: qml/Dash/Previews/Reviews.qml:86
132−msgid "Review"
133−msgstr "Lèirmheas"
134−
135−#: qml/Dash/Previews/Reviews.qml:139
136−msgid "Comments:"
137−msgstr "Beachdan"
138−
139124#: qml/Greeter/Lockscreen.qml:149
140125msgid "Emergency Call"
141126msgstr "Gairm èiginn"
@@ -181,7 +166,25 @@ msgstr ""
181166msgid "Search"
182167msgstr "Lorg"
183168
184−#: qml/Shell.qml:440
169+#: qml/Shell.qml:417
185170#, qt-format
186171msgid "Please enter %1"
187172msgstr "Cuir a-steach %1"
173+
174+#, qt-format
175+#~ msgid "(%1)"
176+#~ msgstr "(%1)"
177+
178+#~ msgid "Comments:"
179+#~ msgstr "Beachdan"
180+
181+#~ msgid "Review"
182+#~ msgstr "Lèirmheas"
183+
184+#, qt-format
185+#~ msgid "%1 review"
186+#~ msgid_plural "%1 reviews"
187+#~ msgstr[0] "%1 lèirmheas"
188+#~ msgstr[1] "%1 lèirmheas"
189+#~ msgstr[2] "%1 lèirmheasan"
190+#~ msgstr[3] "%1 lèirmheas"
po/gl.po+19−33
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
11−"PO-Revision-Date: 2014-03-08 06:58+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11+"PO-Revision-Date: 2014-04-08 07:04+0000\n"
1212"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"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
17+"X-Launchpad-Export-Date: 2014-04-09 07:31+0000\n"
18+"X-Generator: Launchpad (build 16976)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -75,7 +74,7 @@ msgstr ""
7574"Agora xa domina os xestos do bordo e pode comezar a usar o "
7675"teléfono<br><br>Toque na pantalla para comezar"
7776
78−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
7978msgid "Recent searches"
8079msgstr "Buscas recentes"
8180
@@ -83,27 +82,18 @@ msgstr "Buscas recentes"
8382msgid "See more"
8483msgstr "Ver máis"
8584
86−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
8786msgid "See less"
8887msgstr "Ver menos"
8988
90−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
91−msgid "Rate this"
92−msgstr "Valore isto"
89+#: qml/Dash/DashApps.qml:38
90+msgid "Recent"
91+msgstr "Recentes"
9392
94−#. TRANSLATORS: Number of persons who rated this app/video/whatever
95−#: qml/Dash/Previews/Header.qml:93
93+#: qml/Dash/PreviewListView.qml:52
9694#, qt-format
97−msgid "(%1)"
98−msgstr "(%1)"
99−
100−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
101−#: qml/Dash/Previews/Header.qml:105
102−#, qt-format
103−msgid "%1 review"
104−msgid_plural "%1 reviews"
105−msgstr[0] "%1 opinión"
106−msgstr[1] "%1 opinións"
95+msgid "%1 Preview"
96+msgstr "%1 previsualización"
10797
10898#: qml/Dash/Previews/PreviewActionCombo.qml:34
10999msgid "More..."
@@ -113,22 +103,18 @@ msgstr "Máis…"
113103msgid "Less..."
114104msgstr "Menos..."
115105
116−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
107+msgid "Rate this"
108+msgstr "Valore isto"
109+
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
117111msgid "Add a review"
118112msgstr "Engadir unha opinión"
119113
120−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
121115msgid "Send"
122116msgstr "Enviar"
123117
124−#: qml/Dash/Previews/Reviews.qml:86
125−msgid "Review"
126−msgstr "Opinión"
127−
128−#: qml/Dash/Previews/Reviews.qml:139
129−msgid "Comments:"
130−msgstr "Comentarios:"
131−
132118#: qml/Greeter/Lockscreen.qml:149
133119msgid "Emergency Call"
134120msgstr "Chamada de emerxencia"
@@ -174,7 +160,7 @@ msgstr "Introduza o PIN da SIM"
174160msgid "Search"
175161msgstr "Buscar"
176162
177−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
178164#, qt-format
179165msgid "Please enter %1"
180166msgstr "Introduza %1"
po/he.po+34−31
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-11-20 08:30+0000\n"
1212"Last-Translator: Yaron <sh.yaron@gmail.com>\n"
1313"Language-Team: Hebrew <he@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "חיפושים אחרונים"
7979
@@ -81,27 +81,18 @@ msgstr "חיפושים אחרונים"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
90−msgstr "דירוג היישום"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
90+msgstr ""
9791
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
92+#: qml/Dash/PreviewListView.qml:52
10093#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] "סקירה %1"
104−msgstr[1] "%1 סקירות"
94+msgid "%1 Preview"
95+msgstr ""
10596
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "דירוג היישום"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115110msgid "Add a review"
116111msgstr "הוספת סקירה"
117112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119114msgid "Send"
120115msgstr "שליחה"
121116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr "סקירה"
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "הערות:"
129−
130117#: qml/Greeter/Lockscreen.qml:149
131118msgid "Emergency Call"
132119msgstr "שיחת חירום"
@@ -172,7 +159,23 @@ msgstr ""
172159msgid "Search"
173160msgstr "חיפוש"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr "נא להזין %1"
166+
167+#, qt-format
168+#~ msgid "(%1)"
169+#~ msgstr "(%1)"
170+
171+#~ msgid "Comments:"
172+#~ msgstr "הערות:"
173+
174+#~ msgid "Review"
175+#~ msgstr "סקירה"
176+
177+#, qt-format
178+#~ msgid "%1 review"
179+#~ msgid_plural "%1 reviews"
180+#~ msgstr[0] "סקירה %1"
181+#~ msgstr[1] "%1 סקירות"
po/hi.po+19−29
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-15 01:49+0000\n"
1212"Last-Translator: Siddhanathan S. <Unknown>\n"
1313"Language-Team: Hindi <hi@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "पिछले खोजों"
7979
@@ -81,28 +81,19 @@ msgstr "पिछले खोजों"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,22 +102,18 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr ""
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115110msgid "Add a review"
116111msgstr "समीक्षा दे"
117112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119114msgid "Send"
120115msgstr "भेजें"
121116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr "समीक्षा"
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr ""
129−
130117#: qml/Greeter/Lockscreen.qml:149
131118msgid "Emergency Call"
132119msgstr "आपातकालीन कॉल"
@@ -172,7 +159,10 @@ msgstr ""
172159msgid "Search"
173160msgstr "खोजें"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
166+
167+#~ msgid "Review"
168+#~ msgstr "समीक्षा"
po/hr.po+16−29
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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: 2014-03-15 07:34+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20+"X-Generator: Launchpad (build 16967)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,7 +74,7 @@ msgid ""
7474"phone<br><br>Tap on the screen to start"
7575msgstr ""
7676
77−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
7878msgid "Recent searches"
7979msgstr "Nedavne pretrage"
8080
@@ -82,28 +82,19 @@ msgstr "Nedavne pretrage"
8282msgid "See more"
8383msgstr ""
8484
85−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
8686msgid "See less"
8787msgstr ""
8888
89−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
90−msgid "Rate this"
89+#: qml/Dash/DashApps.qml:38
90+msgid "Recent"
9191msgstr ""
9292
93−#. TRANSLATORS: Number of persons who rated this app/video/whatever
94−#: qml/Dash/Previews/Header.qml:93
93+#: qml/Dash/PreviewListView.qml:52
9594#, qt-format
96−msgid "(%1)"
95+msgid "%1 Preview"
9796msgstr ""
9897
99−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
100−#: qml/Dash/Previews/Header.qml:105
101−#, qt-format
102−msgid "%1 review"
103−msgid_plural "%1 reviews"
104−msgstr[0] ""
105−msgstr[1] ""
106−
10798#: qml/Dash/Previews/PreviewActionCombo.qml:34
10899msgid "More..."
109100msgstr ""
@@ -112,20 +103,16 @@ msgstr ""
112103msgid "Less..."
113104msgstr ""
114105
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
116−msgid "Add a review"
117−msgstr ""
118−
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
120−msgid "Send"
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
107+msgid "Rate this"
121108msgstr ""
122109
123−#: qml/Dash/Previews/Reviews.qml:86
124−msgid "Review"
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
111+msgid "Add a review"
125112msgstr ""
126113
127−#: qml/Dash/Previews/Reviews.qml:139
128−msgid "Comments:"
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
115+msgid "Send"
129116msgstr ""
130117
131118#: qml/Greeter/Lockscreen.qml:149
@@ -173,7 +160,7 @@ msgstr ""
173160msgid "Search"
174161msgstr "Pretraživanje"
175162
176−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
177164#, qt-format
178165msgid "Please enter %1"
179166msgstr ""
po/hu.po+34−31
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-14 23:02+0000\n"
1212"Last-Translator: Kristóf Kiszel <Unknown>\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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -75,7 +75,7 @@ msgid ""
7575"phone<br><br>Tap on the screen to start"
7676msgstr ""
7777
78−#: qml/Components/PageHeader.qml:340
78+#: qml/Components/PageHeader.qml:365
7979msgid "Recent searches"
8080msgstr "Legutóbbi keresések"
8181
@@ -83,27 +83,18 @@ msgstr "Legutóbbi keresések"
8383msgid "See more"
8484msgstr ""
8585
86−#: qml/Components/SeeMore.qml:57
86+#: qml/Components/SeeMore.qml:58
8787msgid "See less"
8888msgstr ""
8989
90−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
91−msgid "Rate this"
92−msgstr "Osztályzás"
93−
94−#. TRANSLATORS: Number of persons who rated this app/video/whatever
95−#: qml/Dash/Previews/Header.qml:93
96−#, qt-format
97−msgid "(%1)"
98−msgstr "(%1)"
90+#: qml/Dash/DashApps.qml:38
91+msgid "Recent"
92+msgstr ""
9993
100−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
101−#: qml/Dash/Previews/Header.qml:105
94+#: qml/Dash/PreviewListView.qml:52
10295#, qt-format
103−msgid "%1 review"
104−msgid_plural "%1 reviews"
105−msgstr[0] "%1 értékelés"
106−msgstr[1] "%1 értékelés"
96+msgid "%1 Preview"
97+msgstr ""
10798
10899#: qml/Dash/Previews/PreviewActionCombo.qml:34
109100msgid "More..."
@@ -113,22 +104,18 @@ msgstr ""
113104msgid "Less..."
114105msgstr ""
115106
116−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
107+#: qml/Dash/Previews/PreviewRatingInput.qml:81
108+msgid "Rate this"
109+msgstr "Osztályzás"
110+
111+#: qml/Dash/Previews/PreviewRatingInput.qml:126
117112msgid "Add a review"
118113msgstr "Értékelés hozzáadása"
119114
120−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
115+#: qml/Dash/Previews/PreviewRatingInput.qml:166
121116msgid "Send"
122117msgstr "Küldés"
123118
124−#: qml/Dash/Previews/Reviews.qml:86
125−msgid "Review"
126−msgstr "Értékelés"
127−
128−#: qml/Dash/Previews/Reviews.qml:139
129−msgid "Comments:"
130−msgstr "Hozzászólások:"
131−
132119#: qml/Greeter/Lockscreen.qml:149
133120msgid "Emergency Call"
134121msgstr "Vészhívás"
@@ -174,7 +161,23 @@ msgstr ""
174161msgid "Search"
175162msgstr "Keresés"
176163
177−#: qml/Shell.qml:440
164+#: qml/Shell.qml:417
178165#, qt-format
179166msgid "Please enter %1"
180167msgstr "Adja meg a következőt: %1"
168+
169+#, qt-format
170+#~ msgid "%1 review"
171+#~ msgid_plural "%1 reviews"
172+#~ msgstr[0] "%1 értékelés"
173+#~ msgstr[1] "%1 értékelés"
174+
175+#, qt-format
176+#~ msgid "(%1)"
177+#~ msgstr "(%1)"
178+
179+#~ msgid "Comments:"
180+#~ msgstr "Hozzászólások:"
181+
182+#~ msgid "Review"
183+#~ msgstr "Értékelés"
po/hy.po+16−29
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "Վերջին որոնումներ"
7979
@@ -81,28 +81,19 @@ msgstr "Վերջին որոնումներ"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr "Որոնում"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/id.po+16−29
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr ""
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/is.po+34−31
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,7 +74,7 @@ msgid ""
7474"phone<br><br>Tap on the screen to start"
7575msgstr ""
7676
77−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
7878msgid "Recent searches"
7979msgstr "Nýlegar leitir"
8080
@@ -82,27 +82,18 @@ msgstr "Nýlegar leitir"
8282msgid "See more"
8383msgstr ""
8484
85−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
8686msgid "See less"
8787msgstr ""
8888
89−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
90−msgid "Rate this"
91−msgstr "Gefa þessu einkunn"
92−
93−#. TRANSLATORS: Number of persons who rated this app/video/whatever
94−#: qml/Dash/Previews/Header.qml:93
95−#, qt-format
96−msgid "(%1)"
97−msgstr "(%1)"
89+#: qml/Dash/DashApps.qml:38
90+msgid "Recent"
91+msgstr ""
9892
99−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
100−#: qml/Dash/Previews/Header.qml:105
93+#: qml/Dash/PreviewListView.qml:52
10194#, qt-format
102−msgid "%1 review"
103−msgid_plural "%1 reviews"
104−msgstr[0] "%1 ummæli"
105−msgstr[1] "%1 ummæli"
95+msgid "%1 Preview"
96+msgstr ""
10697
10798#: qml/Dash/Previews/PreviewActionCombo.qml:34
10899msgid "More..."
@@ -112,22 +103,18 @@ msgstr ""
112103msgid "Less..."
113104msgstr ""
114105
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
107+msgid "Rate this"
108+msgstr "Gefa þessu einkunn"
109+
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
116111msgid "Add a review"
117112msgstr "Gefa umsögn"
118113
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
120115msgid "Send"
121116msgstr "Senda"
122117
123−#: qml/Dash/Previews/Reviews.qml:86
124−msgid "Review"
125−msgstr "Umsögn"
126−
127−#: qml/Dash/Previews/Reviews.qml:139
128−msgid "Comments:"
129−msgstr "Athugasemdir:"
130−
131118#: qml/Greeter/Lockscreen.qml:149
132119msgid "Emergency Call"
133120msgstr "Neyðarsímtal"
@@ -173,7 +160,23 @@ msgstr ""
173160msgid "Search"
174161msgstr "Leita"
175162
176−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
177164#, qt-format
178165msgid "Please enter %1"
179166msgstr ""
167+
168+#, qt-format
169+#~ msgid "(%1)"
170+#~ msgstr "(%1)"
171+
172+#~ msgid "Comments:"
173+#~ msgstr "Athugasemdir:"
174+
175+#~ msgid "Review"
176+#~ msgstr "Umsögn"
177+
178+#, qt-format
179+#~ msgid "%1 review"
180+#~ msgid_plural "%1 reviews"
181+#~ msgstr[0] "%1 ummæli"
182+#~ msgstr[1] "%1 ummæli"
po/it.po+34−31
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-22 09:15+0000\n"
1212"Last-Translator: Domenico <domenico.verde125@live.it>\n"
1313"Language-Team: Italian <it@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -78,7 +78,7 @@ msgid ""
7878"phone<br><br>Tap on the screen to start"
7979msgstr ""
8080
81−#: qml/Components/PageHeader.qml:340
81+#: qml/Components/PageHeader.qml:365
8282msgid "Recent searches"
8383msgstr "Ricerche recenti"
8484
@@ -86,27 +86,18 @@ msgstr "Ricerche recenti"
8686msgid "See more"
8787msgstr ""
8888
89−#: qml/Components/SeeMore.qml:57
89+#: qml/Components/SeeMore.qml:58
9090msgid "See less"
9191msgstr ""
9292
93−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
94−msgid "Rate this"
95−msgstr "Valuta"
96−
97−#. TRANSLATORS: Number of persons who rated this app/video/whatever
98−#: qml/Dash/Previews/Header.qml:93
99−#, qt-format
100−msgid "(%1)"
101−msgstr "(%1)"
93+#: qml/Dash/DashApps.qml:38
94+msgid "Recent"
95+msgstr ""
10296
103−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
104−#: qml/Dash/Previews/Header.qml:105
97+#: qml/Dash/PreviewListView.qml:52
10598#, qt-format
106−msgid "%1 review"
107−msgid_plural "%1 reviews"
108−msgstr[0] "%1 recensione"
109−msgstr[1] "%1 recensioni"
99+msgid "%1 Preview"
100+msgstr ""
110101
111102#: qml/Dash/Previews/PreviewActionCombo.qml:34
112103msgid "More..."
@@ -116,22 +107,18 @@ msgstr ""
116107msgid "Less..."
117108msgstr ""
118109
119−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
110+#: qml/Dash/Previews/PreviewRatingInput.qml:81
111+msgid "Rate this"
112+msgstr "Valuta"
113+
114+#: qml/Dash/Previews/PreviewRatingInput.qml:126
120115msgid "Add a review"
121116msgstr "Aggiungi una recensione"
122117
123−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
118+#: qml/Dash/Previews/PreviewRatingInput.qml:166
124119msgid "Send"
125120msgstr "Invia"
126121
127−#: qml/Dash/Previews/Reviews.qml:86
128−msgid "Review"
129−msgstr "Recensisci"
130−
131−#: qml/Dash/Previews/Reviews.qml:139
132−msgid "Comments:"
133−msgstr "Commenti:"
134−
135122#: qml/Greeter/Lockscreen.qml:149
136123msgid "Emergency Call"
137124msgstr "Chiamata di emergenza"
@@ -177,7 +164,23 @@ msgstr ""
177164msgid "Search"
178165msgstr "Cerca"
179166
180−#: qml/Shell.qml:440
167+#: qml/Shell.qml:417
181168#, qt-format
182169msgid "Please enter %1"
183170msgstr "Inserire %1"
171+
172+#, qt-format
173+#~ msgid "(%1)"
174+#~ msgstr "(%1)"
175+
176+#, qt-format
177+#~ msgid "%1 review"
178+#~ msgid_plural "%1 reviews"
179+#~ msgstr[0] "%1 recensione"
180+#~ msgstr[1] "%1 recensioni"
181+
182+#~ msgid "Comments:"
183+#~ msgstr "Commenti:"
184+
185+#~ msgid "Review"
186+#~ msgstr "Recensisci"
po/ja.po+24−30
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-18 07:01+0000\n"
1212"Last-Translator: Shushi Kurose <md81bird@hitaki.net>\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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "最近の検索"
7979
@@ -81,27 +81,18 @@ msgstr "最近の検索"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
97−
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
92+#: qml/Dash/PreviewListView.qml:52
10093#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
94+msgid "%1 Preview"
95+msgstr ""
10596
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr ""
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115110msgid "Add a review"
116111msgstr ""
117112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119114msgid "Send"
120115msgstr "送信"
121116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr ""
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "コメント:"
129−
130117#: qml/Greeter/Lockscreen.qml:149
131118msgid "Emergency Call"
132119msgstr ""
@@ -172,7 +159,14 @@ msgstr ""
172159msgid "Search"
173160msgstr "検索"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
166+
167+#~ msgid "Comments:"
168+#~ msgstr "コメント:"
169+
170+#, qt-format
171+#~ msgid "(%1)"
172+#~ msgstr "(%1)"
po/km.po+33−30
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-03-04 02:32+0000\n"
1212"Last-Translator: Khoem Sokhem <khoemsokhem@khmeros.info>\n"
1313"Language-Team: Khmer <km@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -77,7 +77,7 @@ msgstr ""
7777"ឥឡូវ​អ្នក​បាន​ពិនិត្យ​កាយវិការ​គែម​ "
7878"និង​អាច​ចាប់ផ្ដើម​ប្រើ​ទូរស័ព្ទ<br><br>ប៉ះ លើ​អេក្រង់​ដើម្បី​ចាប់ផ្ដើម"
7979
80−#: qml/Components/PageHeader.qml:340
80+#: qml/Components/PageHeader.qml:365
8181msgid "Recent searches"
8282msgstr "ការ​ស្វែងរក​ថ្មី"
8383
@@ -85,26 +85,18 @@ msgstr "ការ​ស្វែងរក​ថ្មី"
8585msgid "See more"
8686msgstr "មើល​ច្រើន​ទៀត"
8787
88−#: qml/Components/SeeMore.qml:57
88+#: qml/Components/SeeMore.qml:58
8989msgid "See less"
9090msgstr "មើល​តិច​ជាង"
9191
92−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
93−msgid "Rate this"
94−msgstr "វាយតម្លៃ​វា"
95−
96−#. TRANSLATORS: Number of persons who rated this app/video/whatever
97−#: qml/Dash/Previews/Header.qml:93
98−#, qt-format
99−msgid "(%1)"
100−msgstr "(%1)"
92+#: qml/Dash/DashApps.qml:38
93+msgid "Recent"
94+msgstr ""
10195
102−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
103−#: qml/Dash/Previews/Header.qml:105
96+#: qml/Dash/PreviewListView.qml:52
10497#, qt-format
105−msgid "%1 review"
106−msgid_plural "%1 reviews"
107−msgstr[0] "ពិនិត្យ​មើល %1"
98+msgid "%1 Preview"
99+msgstr ""
108100
109101#: qml/Dash/Previews/PreviewActionCombo.qml:34
110102msgid "More..."
@@ -114,22 +106,18 @@ msgstr "ច្រើនជាង​..."
114106msgid "Less..."
115107msgstr "តិច​ជាង..."
116108
117−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
109+#: qml/Dash/Previews/PreviewRatingInput.qml:81
110+msgid "Rate this"
111+msgstr "វាយតម្លៃ​វា"
112+
113+#: qml/Dash/Previews/PreviewRatingInput.qml:126
118114msgid "Add a review"
119115msgstr "បន្ថែម​ការ​ពិនិត្យ"
120116
121−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
117+#: qml/Dash/Previews/PreviewRatingInput.qml:166
122118msgid "Send"
123119msgstr "ផ្ញើ"
124120
125−#: qml/Dash/Previews/Reviews.qml:86
126−msgid "Review"
127−msgstr "ការ​ពិនិត្យ"
128−
129−#: qml/Dash/Previews/Reviews.qml:139
130−msgid "Comments:"
131−msgstr "មតិយោបល់៖"
132−
133121#: qml/Greeter/Lockscreen.qml:149
134122msgid "Emergency Call"
135123msgstr "ការ​ហៅ​ពេល​អាសន្ន"
@@ -175,7 +163,22 @@ msgstr "បញ្ចូល​កូដ PIN របស់​ស៊ីមកាត"
175163msgid "Search"
176164msgstr "ស្វែង​រក"
177165
178−#: qml/Shell.qml:440
166+#: qml/Shell.qml:417
179167#, qt-format
180168msgid "Please enter %1"
181169msgstr "សូម​បញ្ចូល %1"
170+
171+#, qt-format
172+#~ msgid "(%1)"
173+#~ msgstr "(%1)"
174+
175+#, qt-format
176+#~ msgid "%1 review"
177+#~ msgid_plural "%1 reviews"
178+#~ msgstr[0] "ពិនិត្យ​មើល %1"
179+
180+#~ msgid "Comments:"
181+#~ msgstr "មតិយោបល់៖"
182+
183+#~ msgid "Review"
184+#~ msgstr "ការ​ពិនិត្យ"
po/kn.po+16−29
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "ಇತ್ತೀಚಿನ ಹುಡುಕಾಟಗಳು"
7979
@@ -81,28 +81,19 @@ msgstr "ಇತ್ತೀಚಿನ ಹುಡುಕಾಟಗಳು"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr "ಹುಡುಕು"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/ko.po+16−29
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-10-10 07:04+0000\n"
1212"Last-Translator: Kim Boram <boramism@gmail.com>\n"
1313"Language-Team: Korean <ko@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "최근 검색"
7979
@@ -81,28 +81,19 @@ msgstr "최근 검색"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr "검색"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/ky.po+16−29
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "Соңку издөөлөр"
7979
@@ -81,28 +81,19 @@ msgstr "Соңку издөөлөр"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr "Издөө"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/lo.po+24−30
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-10-02 10:00+0000\n"
1212"Last-Translator: Anousak <anousak@gmail.com>\n"
1313"Language-Team: Lao <lo@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,27 +81,18 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
97−
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
92+#: qml/Dash/PreviewListView.qml:52
10093#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
94+msgid "%1 Preview"
95+msgstr ""
10596
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr ""
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115110msgid "Add a review"
116111msgstr ""
117112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119114msgid "Send"
120115msgstr "ສົ່ງ"
121116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr ""
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "ຄໍ່ເຫັນ"
129−
130117#: qml/Greeter/Lockscreen.qml:149
131118msgid "Emergency Call"
132119msgstr ""
@@ -172,7 +159,14 @@ msgstr ""
172159msgid "Search"
173160msgstr "ຊອກຫາ"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr "ກະລູນາປ້ອນ %1"
166+
167+#, qt-format
168+#~ msgid "(%1)"
169+#~ msgstr "(%1)"
170+
171+#~ msgid "Comments:"
172+#~ msgstr "ຄໍ່ເຫັນ"
po/lt.po+35−32
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-15 12:42+0000\n"
1212"Last-Translator: Gediminas Paulauskas <menesis@pov.lt>\n"
1313"Language-Team: Lithuanian <lt@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%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20+"X-Generator: Launchpad (build 16967)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -77,7 +77,7 @@ msgid ""
7777"phone<br><br>Tap on the screen to start"
7878msgstr ""
7979
80−#: qml/Components/PageHeader.qml:340
80+#: qml/Components/PageHeader.qml:365
8181msgid "Recent searches"
8282msgstr "Paskiausios paieškos"
8383
@@ -85,28 +85,18 @@ msgstr "Paskiausios paieškos"
8585msgid "See more"
8686msgstr ""
8787
88−#: qml/Components/SeeMore.qml:57
88+#: qml/Components/SeeMore.qml:58
8989msgid "See less"
9090msgstr ""
9191
92−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
93−msgid "Rate this"
94−msgstr "Įvertinkite tai"
95−
96−#. TRANSLATORS: Number of persons who rated this app/video/whatever
97−#: qml/Dash/Previews/Header.qml:93
98−#, qt-format
99−msgid "(%1)"
100−msgstr "(%1)"
92+#: qml/Dash/DashApps.qml:38
93+msgid "Recent"
94+msgstr ""
10195
102−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
103−#: qml/Dash/Previews/Header.qml:105
96+#: qml/Dash/PreviewListView.qml:52
10497#, qt-format
105−msgid "%1 review"
106−msgid_plural "%1 reviews"
107−msgstr[0] "%1 apžvalga"
108−msgstr[1] "%1 apžvalgos"
109−msgstr[2] "%1 apžvalgų"
98+msgid "%1 Preview"
99+msgstr ""
110100
111101#: qml/Dash/Previews/PreviewActionCombo.qml:34
112102msgid "More..."
@@ -116,22 +106,18 @@ msgstr ""
116106msgid "Less..."
117107msgstr ""
118108
119−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
109+#: qml/Dash/Previews/PreviewRatingInput.qml:81
110+msgid "Rate this"
111+msgstr "Įvertinkite tai"
112+
113+#: qml/Dash/Previews/PreviewRatingInput.qml:126
120114msgid "Add a review"
121115msgstr "Pridėkite apžvalgą"
122116
123−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
117+#: qml/Dash/Previews/PreviewRatingInput.qml:166
124118msgid "Send"
125119msgstr "Siųsti"
126120
127−#: qml/Dash/Previews/Reviews.qml:86
128−msgid "Review"
129−msgstr "Apžvalga"
130−
131−#: qml/Dash/Previews/Reviews.qml:139
132−msgid "Comments:"
133−msgstr "Komentarai:"
134−
135121#: qml/Greeter/Lockscreen.qml:149
136122msgid "Emergency Call"
137123msgstr "Pagalbos skambutis"
@@ -177,7 +163,24 @@ msgstr ""
177163msgid "Search"
178164msgstr "Paieška"
179165
180−#: qml/Shell.qml:440
166+#: qml/Shell.qml:417
181167#, qt-format
182168msgid "Please enter %1"
183169msgstr "Prašom įvesti %1"
170+
171+#~ msgid "Comments:"
172+#~ msgstr "Komentarai:"
173+
174+#~ msgid "Review"
175+#~ msgstr "Apžvalga"
176+
177+#, qt-format
178+#~ msgid "%1 review"
179+#~ msgid_plural "%1 reviews"
180+#~ msgstr[0] "%1 apžvalga"
181+#~ msgstr[1] "%1 apžvalgos"
182+#~ msgstr[2] "%1 apžvalgų"
183+
184+#, qt-format
185+#~ msgid "(%1)"
186+#~ msgstr "(%1)"
po/lv.po+16−29
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-11 16:48+0000\n"
1212"Last-Translator: Jānis-Marks Gailis <jeanmarc.gailis@gmail.com>\n"
1313"Language-Team: Latvian <lv@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=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "Nesen veiktās meklēšanas"
7979
@@ -81,28 +81,19 @@ msgstr "Nesen veiktās meklēšanas"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr "Meklēt"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/ml.po+34−31
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-11-23 11:44+0000\n"
1212"Last-Translator: STyM Alfazz <Unknown>\n"
1313"Language-Team: Malayalam <ml@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -75,7 +75,7 @@ msgid ""
7575"phone<br><br>Tap on the screen to start"
7676msgstr ""
7777
78−#: qml/Components/PageHeader.qml:340
78+#: qml/Components/PageHeader.qml:365
7979msgid "Recent searches"
8080msgstr "സമീപകാല തിരയലുകള്‍"
8181
@@ -83,27 +83,18 @@ msgstr "സമീപകാല തിരയലുകള്‍"
8383msgid "See more"
8484msgstr ""
8585
86−#: qml/Components/SeeMore.qml:57
86+#: qml/Components/SeeMore.qml:58
8787msgid "See less"
8888msgstr ""
8989
90−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
91−msgid "Rate this"
92−msgstr "ഇത് അവലോകനം ചെയ്യുക"
93−
94−#. TRANSLATORS: Number of persons who rated this app/video/whatever
95−#: qml/Dash/Previews/Header.qml:93
96−#, qt-format
97−msgid "(%1)"
98−msgstr "(%1)"
90+#: qml/Dash/DashApps.qml:38
91+msgid "Recent"
92+msgstr ""
9993
100−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
101−#: qml/Dash/Previews/Header.qml:105
94+#: qml/Dash/PreviewListView.qml:52
10295#, qt-format
103−msgid "%1 review"
104−msgid_plural "%1 reviews"
105−msgstr[0] "%1 അവലോകനം"
106−msgstr[1] "%1 അവലോകനങ്ങള്‍"
96+msgid "%1 Preview"
97+msgstr ""
10798
10899#: qml/Dash/Previews/PreviewActionCombo.qml:34
109100msgid "More..."
@@ -113,22 +104,18 @@ msgstr ""
113104msgid "Less..."
114105msgstr ""
115106
116−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
107+#: qml/Dash/Previews/PreviewRatingInput.qml:81
108+msgid "Rate this"
109+msgstr "ഇത് അവലോകനം ചെയ്യുക"
110+
111+#: qml/Dash/Previews/PreviewRatingInput.qml:126
117112msgid "Add a review"
118113msgstr "ഒരു അവലോകനം ചേര്‍ക്കുക"
119114
120−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
115+#: qml/Dash/Previews/PreviewRatingInput.qml:166
121116msgid "Send"
122117msgstr "അയയ്‌ക്കുക"
123118
124−#: qml/Dash/Previews/Reviews.qml:86
125−msgid "Review"
126−msgstr "അവലോകനം"
127−
128−#: qml/Dash/Previews/Reviews.qml:139
129−msgid "Comments:"
130−msgstr "അഭിപ്രായങ്ങള്‍:"
131−
132119#: qml/Greeter/Lockscreen.qml:149
133120msgid "Emergency Call"
134121msgstr "അടിയന്തിര വിളി"
@@ -174,7 +161,23 @@ msgstr ""
174161msgid "Search"
175162msgstr "തിരയുക"
176163
177−#: qml/Shell.qml:440
164+#: qml/Shell.qml:417
178165#, qt-format
179166msgid "Please enter %1"
180167msgstr "ദയവായി %1 നല്‍കുക"
168+
169+#, qt-format
170+#~ msgid "(%1)"
171+#~ msgstr "(%1)"
172+
173+#~ msgid "Comments:"
174+#~ msgstr "അഭിപ്രായങ്ങള്‍:"
175+
176+#~ msgid "Review"
177+#~ msgstr "അവലോകനം"
178+
179+#, qt-format
180+#~ msgid "%1 review"
181+#~ msgid_plural "%1 reviews"
182+#~ msgstr[0] "%1 അവലോകനം"
183+#~ msgstr[1] "%1 അവലോകനങ്ങള്‍"
po/mr.po+16−29
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-14 19:54+0000\n"
1212"Last-Translator: Rohan Deshmukh <Unknown>\n"
1313"Language-Team: Marathi <mr@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr ""
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/ms.po+34−31
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-17 09:05+0000\n"
1212"Last-Translator: abuyop <Unknown>\n"
1313"Language-Team: Malay <ms@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "Gelintar baru-baru ini"
7979
@@ -81,27 +81,18 @@ msgstr "Gelintar baru-baru ini"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
90−msgstr "Kadar ini"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
90+msgstr ""
9791
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
92+#: qml/Dash/PreviewListView.qml:52
10093#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] "%1 ulasan"
104−msgstr[1] "%1 ulasan"
94+msgid "%1 Preview"
95+msgstr ""
10596
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "Kadar ini"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115110msgid "Add a review"
116111msgstr "Tambah ulasan"
117112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119114msgid "Send"
120115msgstr "Hantar"
121116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr "Tinjauan"
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "Ulasan:"
129−
130117#: qml/Greeter/Lockscreen.qml:149
131118msgid "Emergency Call"
132119msgstr "panggilan Kecemasan"
@@ -172,7 +159,23 @@ msgstr ""
172159msgid "Search"
173160msgstr "Gelintar"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr "Sila masukkan %1"
166+
167+#~ msgid "Comments:"
168+#~ msgstr "Ulasan:"
169+
170+#~ msgid "Review"
171+#~ msgstr "Tinjauan"
172+
173+#, qt-format
174+#~ msgid "%1 review"
175+#~ msgid_plural "%1 reviews"
176+#~ msgstr[0] "%1 ulasan"
177+#~ msgstr[1] "%1 ulasan"
178+
179+#, qt-format
180+#~ msgid "(%1)"
181+#~ msgstr "(%1)"
po/my.po+25−31
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-12-12 11:12+0000\n"
1212"Last-Translator: Pyae Sone <Unknown>\n"
1313"Language-Team: Burmese <my@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "မကြာသေးခင်က ရှာဖွေခြင်း"
7979
@@ -81,27 +81,18 @@ msgstr "မကြာသေးခင်က ရှာဖွေခြင်း"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
90−msgstr "ဒီဟာကိုအမှတ်ပေးမည်"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
90+msgstr ""
9791
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
92+#: qml/Dash/PreviewListView.qml:52
10093#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
94+msgid "%1 Preview"
95+msgstr ""
10596
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "ဒီဟာကိုအမှတ်ပေးမည်"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115110msgid "Add a review"
116111msgstr ""
117112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119114msgid "Send"
120115msgstr "ပို့မည်"
121116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr ""
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "မှတ်ချက်များ-"
129−
130117#: qml/Greeter/Lockscreen.qml:149
131118msgid "Emergency Call"
132119msgstr "အရေးပေါ်ခေါ်မည်"
@@ -172,7 +159,14 @@ msgstr ""
172159msgid "Search"
173160msgstr "ရှာဖွေ"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr "%1ကိုရိုက်ထည့်ပါ"
166+
167+#, qt-format
168+#~ msgid "(%1)"
169+#~ msgstr "(%1)"
170+
171+#~ msgid "Comments:"
172+#~ msgstr "မှတ်ချက်များ-"
po/nb.po+16−29
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-06-27 07:02+0000\n"
1212"Last-Translator: Joakim Langvand <jlangvand@gmail.com>\n"
1313"Language-Team: Norwegian Bokmal <nb@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "Siste søk"
7979
@@ -81,28 +81,19 @@ msgstr "Siste søk"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr "Søk"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/nl.po+34−31
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-15 16:42+0000\n"
1212"Last-Translator: Hannie Dumoleyn <Unknown>\n"
1313"Language-Team: Dutch <nl@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "Recente zoekopdrachten"
7979
@@ -81,27 +81,18 @@ msgstr "Recente zoekopdrachten"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
90−msgstr "Beoordeel dit"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
90+msgstr ""
9791
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
92+#: qml/Dash/PreviewListView.qml:52
10093#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] "%1 recensie"
104−msgstr[1] "%1 recensies"
94+msgid "%1 Preview"
95+msgstr ""
10596
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "Beoordeel dit"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115110msgid "Add a review"
116111msgstr "Voeg recensie toe"
117112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119114msgid "Send"
120115msgstr "Versturen"
121116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr "Recensie"
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "Reacties:"
129−
130117#: qml/Greeter/Lockscreen.qml:149
131118msgid "Emergency Call"
132119msgstr "Noodoproep"
@@ -172,7 +159,23 @@ msgstr ""
172159msgid "Search"
173160msgstr "Zoeken"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr "Voer %1 in"
166+
167+#, qt-format
168+#~ msgid "%1 review"
169+#~ msgid_plural "%1 reviews"
170+#~ msgstr[0] "%1 recensie"
171+#~ msgstr[1] "%1 recensies"
172+
173+#, qt-format
174+#~ msgid "(%1)"
175+#~ msgstr "(%1)"
176+
177+#~ msgid "Comments:"
178+#~ msgstr "Reacties:"
179+
180+#~ msgid "Review"
181+#~ msgstr "Recensie"
po/pl.po+35−32
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-10 11:38+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Polish <pl@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
1818"|| n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20+"X-Generator: Launchpad (build 16967)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -76,7 +76,7 @@ msgid ""
7676"phone<br><br>Tap on the screen to start"
7777msgstr ""
7878
79−#: qml/Components/PageHeader.qml:340
79+#: qml/Components/PageHeader.qml:365
8080msgid "Recent searches"
8181msgstr "Ostatnie wyszukiwania"
8282
@@ -84,28 +84,18 @@ msgstr "Ostatnie wyszukiwania"
8484msgid "See more"
8585msgstr ""
8686
87−#: qml/Components/SeeMore.qml:57
87+#: qml/Components/SeeMore.qml:58
8888msgid "See less"
8989msgstr ""
9090
91−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
92−msgid "Rate this"
93−msgstr "Oceń to"
94−
95−#. TRANSLATORS: Number of persons who rated this app/video/whatever
96−#: qml/Dash/Previews/Header.qml:93
97−#, qt-format
98−msgid "(%1)"
99−msgstr "(%1)"
91+#: qml/Dash/DashApps.qml:38
92+msgid "Recent"
93+msgstr ""
10094
101−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
102−#: qml/Dash/Previews/Header.qml:105
95+#: qml/Dash/PreviewListView.qml:52
10396#, qt-format
104−msgid "%1 review"
105−msgid_plural "%1 reviews"
106−msgstr[0] "%1 opinia"
107−msgstr[1] "%1 opinie"
108−msgstr[2] "%1 opinii"
97+msgid "%1 Preview"
98+msgstr ""
10999
110100#: qml/Dash/Previews/PreviewActionCombo.qml:34
111101msgid "More..."
@@ -115,22 +105,18 @@ msgstr ""
115105msgid "Less..."
116106msgstr ""
117107
118−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
108+#: qml/Dash/Previews/PreviewRatingInput.qml:81
109+msgid "Rate this"
110+msgstr "Oceń to"
111+
112+#: qml/Dash/Previews/PreviewRatingInput.qml:126
119113msgid "Add a review"
120114msgstr "Dodaj recenzję"
121115
122−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
116+#: qml/Dash/Previews/PreviewRatingInput.qml:166
123117msgid "Send"
124118msgstr "Wyślij"
125119
126−#: qml/Dash/Previews/Reviews.qml:86
127−msgid "Review"
128−msgstr "Recenzja"
129−
130−#: qml/Dash/Previews/Reviews.qml:139
131−msgid "Comments:"
132−msgstr "Komentarze:"
133−
134120#: qml/Greeter/Lockscreen.qml:149
135121msgid "Emergency Call"
136122msgstr "Telefon ratunkowy"
@@ -176,7 +162,24 @@ msgstr ""
176162msgid "Search"
177163msgstr "Szukaj"
178164
179−#: qml/Shell.qml:440
165+#: qml/Shell.qml:417
180166#, qt-format
181167msgid "Please enter %1"
182168msgstr "Wprowadź %1"
169+
170+#~ msgid "Comments:"
171+#~ msgstr "Komentarze:"
172+
173+#~ msgid "Review"
174+#~ msgstr "Recenzja"
175+
176+#, qt-format
177+#~ msgid "%1 review"
178+#~ msgid_plural "%1 reviews"
179+#~ msgstr[0] "%1 opinia"
180+#~ msgstr[1] "%1 opinie"
181+#~ msgstr[2] "%1 opinii"
182+
183+#, qt-format
184+#~ msgid "(%1)"
185+#~ msgstr "(%1)"
po/pt.po+16−29
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-14 19:18+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Portuguese <pt@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr ""
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/pt_BR.po+34−31
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-18 23:24+0000\n"
1212"Last-Translator: Fábio Nogueira <deb-user-ba@ubuntu.com>\n"
1313"Language-Team: Brazilian Portuguese <pt_BR@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -75,7 +75,7 @@ msgid ""
7575"phone<br><br>Tap on the screen to start"
7676msgstr ""
7777
78−#: qml/Components/PageHeader.qml:340
78+#: qml/Components/PageHeader.qml:365
7979msgid "Recent searches"
8080msgstr "Pesquisas recentes"
8181
@@ -83,27 +83,18 @@ msgstr "Pesquisas recentes"
8383msgid "See more"
8484msgstr ""
8585
86−#: qml/Components/SeeMore.qml:57
86+#: qml/Components/SeeMore.qml:58
8787msgid "See less"
8888msgstr ""
8989
90−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
91−msgid "Rate this"
92−msgstr "Avaliar isto"
93−
94−#. TRANSLATORS: Number of persons who rated this app/video/whatever
95−#: qml/Dash/Previews/Header.qml:93
96−#, qt-format
97−msgid "(%1)"
98−msgstr "(%1)"
90+#: qml/Dash/DashApps.qml:38
91+msgid "Recent"
92+msgstr ""
9993
100−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
101−#: qml/Dash/Previews/Header.qml:105
94+#: qml/Dash/PreviewListView.qml:52
10295#, qt-format
103−msgid "%1 review"
104−msgid_plural "%1 reviews"
105−msgstr[0] "%1 análise"
106−msgstr[1] "%1 análises"
96+msgid "%1 Preview"
97+msgstr ""
10798
10899#: qml/Dash/Previews/PreviewActionCombo.qml:34
109100msgid "More..."
@@ -113,22 +104,18 @@ msgstr ""
113104msgid "Less..."
114105msgstr ""
115106
116−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
107+#: qml/Dash/Previews/PreviewRatingInput.qml:81
108+msgid "Rate this"
109+msgstr "Avaliar isto"
110+
111+#: qml/Dash/Previews/PreviewRatingInput.qml:126
117112msgid "Add a review"
118113msgstr "Adicionar uma análise"
119114
120−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
115+#: qml/Dash/Previews/PreviewRatingInput.qml:166
121116msgid "Send"
122117msgstr "Enviar"
123118
124−#: qml/Dash/Previews/Reviews.qml:86
125−msgid "Review"
126−msgstr "Revisão"
127−
128−#: qml/Dash/Previews/Reviews.qml:139
129−msgid "Comments:"
130−msgstr "Comentários:"
131−
132119#: qml/Greeter/Lockscreen.qml:149
133120msgid "Emergency Call"
134121msgstr "Chamada de emergência"
@@ -174,7 +161,23 @@ msgstr ""
174161msgid "Search"
175162msgstr "Pesquisar"
176163
177−#: qml/Shell.qml:440
164+#: qml/Shell.qml:417
178165#, qt-format
179166msgid "Please enter %1"
180167msgstr "Por favor, digite %1"
168+
169+#, qt-format
170+#~ msgid "(%1)"
171+#~ msgstr "(%1)"
172+
173+#, qt-format
174+#~ msgid "%1 review"
175+#~ msgid_plural "%1 reviews"
176+#~ msgstr[0] "%1 análise"
177+#~ msgstr[1] "%1 análises"
178+
179+#~ msgid "Comments:"
180+#~ msgstr "Comentários:"
181+
182+#~ msgid "Review"
183+#~ msgstr "Revisão"
po/ro.po+16−29
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-06-27 07:53+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Romanian <ro@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 "
1818"== 0) && (n != 0))) ? 2: 1));\n"
19−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20+"X-Generator: Launchpad (build 16967)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,7 +74,7 @@ msgid ""
7474"phone<br><br>Tap on the screen to start"
7575msgstr ""
7676
77−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
7878msgid "Recent searches"
7979msgstr "Căutări recente"
8080
@@ -82,28 +82,19 @@ msgstr "Căutări recente"
8282msgid "See more"
8383msgstr ""
8484
85−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
8686msgid "See less"
8787msgstr ""
8888
89−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
90−msgid "Rate this"
89+#: qml/Dash/DashApps.qml:38
90+msgid "Recent"
9191msgstr ""
9292
93−#. TRANSLATORS: Number of persons who rated this app/video/whatever
94−#: qml/Dash/Previews/Header.qml:93
93+#: qml/Dash/PreviewListView.qml:52
9594#, qt-format
96−msgid "(%1)"
95+msgid "%1 Preview"
9796msgstr ""
9897
99−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
100−#: qml/Dash/Previews/Header.qml:105
101−#, qt-format
102−msgid "%1 review"
103−msgid_plural "%1 reviews"
104−msgstr[0] ""
105−msgstr[1] ""
106−
10798#: qml/Dash/Previews/PreviewActionCombo.qml:34
10899msgid "More..."
109100msgstr ""
@@ -112,20 +103,16 @@ msgstr ""
112103msgid "Less..."
113104msgstr ""
114105
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
116−msgid "Add a review"
117−msgstr ""
118−
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
120−msgid "Send"
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
107+msgid "Rate this"
121108msgstr ""
122109
123−#: qml/Dash/Previews/Reviews.qml:86
124−msgid "Review"
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
111+msgid "Add a review"
125112msgstr ""
126113
127−#: qml/Dash/Previews/Reviews.qml:139
128−msgid "Comments:"
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
115+msgid "Send"
129116msgstr ""
130117
131118#: qml/Greeter/Lockscreen.qml:149
@@ -173,7 +160,7 @@ msgstr ""
173160msgid "Search"
174161msgstr "Căutare"
175162
176−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
177164#, qt-format
178165msgid "Please enter %1"
179166msgstr ""
po/ru.po+26−40
@@ -7,17 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
11−"PO-Revision-Date: 2014-01-26 15:56+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11+"PO-Revision-Date: 2014-04-03 13:07+0000\n"
1212"Last-Translator: Zonov Roman <Unknown>\n"
1313"Language-Team: Russian <ru@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18−"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
17+"X-Launchpad-Export-Date: 2014-04-04 07:12+0000\n"
18+"X-Generator: Launchpad (build 16976)\n"
2119
2220#: plugins/Unity/Launcher/launcheritem.cpp:43
2321#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -78,62 +76,50 @@ msgid ""
7876"You have now mastered the edge gestures and can start using the "
7977"phone<br><br>Tap on the screen to start"
8078msgstr ""
79+"Вы научились пользоваться Ubuntu и можете начать использовать свой "
80+"телефон<br><br>Нажмите на экран"
8181
82−#: qml/Components/PageHeader.qml:340
82+#: qml/Components/PageHeader.qml:365
8383msgid "Recent searches"
8484msgstr "Последние поисковые запросы"
8585
8686#: qml/Components/SeeMore.qml:35
8787msgid "See more"
88−msgstr ""
88+msgstr "Подробнее"
8989
90−#: qml/Components/SeeMore.qml:57
90+#: qml/Components/SeeMore.qml:58
9191msgid "See less"
92−msgstr ""
92+msgstr "Вкратце"
9393
94−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
95−msgid "Rate this"
96−msgstr "Оцените это"
94+#: qml/Dash/DashApps.qml:38
95+msgid "Recent"
96+msgstr "Недавние"
9797
98−#. TRANSLATORS: Number of persons who rated this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:93
98+#: qml/Dash/PreviewListView.qml:52
10099#, qt-format
101−msgid "(%1)"
102−msgstr "(%1)"
103−
104−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
105−#: qml/Dash/Previews/Header.qml:105
106−#, qt-format
107−msgid "%1 review"
108−msgid_plural "%1 reviews"
109−msgstr[0] "%1 отзыв"
110−msgstr[1] "%1 отзыва"
111−msgstr[2] "%1 отзывов"
100+msgid "%1 Preview"
101+msgstr "Просмотр %1"
112102
113103#: qml/Dash/Previews/PreviewActionCombo.qml:34
114104msgid "More..."
115−msgstr ""
105+msgstr "Ещё..."
116106
117107#: qml/Dash/Previews/PreviewActionCombo.qml:34
118108msgid "Less..."
119−msgstr ""
109+msgstr "Меньше..."
110+
111+#: qml/Dash/Previews/PreviewRatingInput.qml:81
112+msgid "Rate this"
113+msgstr "Оцените это"
120114
121−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115+#: qml/Dash/Previews/PreviewRatingInput.qml:126
122116msgid "Add a review"
123117msgstr "Добавьте отзыв"
124118
125−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119+#: qml/Dash/Previews/PreviewRatingInput.qml:166
126120msgid "Send"
127121msgstr "Отправить"
128122
129−#: qml/Dash/Previews/Reviews.qml:86
130−msgid "Review"
131−msgstr "Отзыв"
132−
133−#: qml/Dash/Previews/Reviews.qml:139
134−msgid "Comments:"
135−msgstr "Комментарии:"
136−
137123#: qml/Greeter/Lockscreen.qml:149
138124msgid "Emergency Call"
139125msgstr "Экстренный вызов"
@@ -173,13 +159,13 @@ msgstr "Показать пароль"
173159
174160#: qml/Notifications/NotificationMenuItemFactory.qml:103
175161msgid "Please enter SIM PIN"
176−msgstr ""
162+msgstr "Введите PIN код"
177163
178164#: qml/Panel/SearchIndicator.qml:27
179165msgid "Search"
180166msgstr "Поиск"
181167
182−#: qml/Shell.qml:440
168+#: qml/Shell.qml:417
183169#, qt-format
184170msgid "Please enter %1"
185171msgstr "Пожалуйста, введите %1"
po/shn.po+16−29
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-10-07 11:46+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Shan <shn@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) ? 0 : 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr ""
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/si.po+16−29
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-06-26 22:36+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Sinhalese <si@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr ""
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/sl.po+36−33
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-02-21 16:38+0000\n"
1212"Last-Translator: Damir Jerovšek <Unknown>\n"
1313"Language-Team: Slovenian <sl@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
1818"n%100==4 ? 3 : 0);\n"
19−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20+"X-Generator: Launchpad (build 16967)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -78,7 +78,7 @@ msgstr ""
7878"Sedaj, ko ste osvojili poteze robov, lahko začnete uporabljati "
7979"telefon<br><br>Tapnite na zaslon za začetek"
8080
81−#: qml/Components/PageHeader.qml:340
81+#: qml/Components/PageHeader.qml:365
8282msgid "Recent searches"
8383msgstr "Nedavna iskanja"
8484
@@ -86,29 +86,18 @@ msgstr "Nedavna iskanja"
8686msgid "See more"
8787msgstr "Pokaži več"
8888
89−#: qml/Components/SeeMore.qml:57
89+#: qml/Components/SeeMore.qml:58
9090msgid "See less"
9191msgstr "Pokaži manj"
9292
93−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
94−msgid "Rate this"
95−msgstr "Ocenite"
96−
97−#. TRANSLATORS: Number of persons who rated this app/video/whatever
98−#: qml/Dash/Previews/Header.qml:93
99−#, qt-format
100−msgid "(%1)"
101−msgstr "(%1)"
93+#: qml/Dash/DashApps.qml:38
94+msgid "Recent"
95+msgstr ""
10296
103−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
104−#: qml/Dash/Previews/Header.qml:105
97+#: qml/Dash/PreviewListView.qml:52
10598#, qt-format
106−msgid "%1 review"
107−msgid_plural "%1 reviews"
108−msgstr[0] "%1 ocen"
109−msgstr[1] "%1 ocena"
110−msgstr[2] "%1 oceni"
111−msgstr[3] "%1 ocene"
99+msgid "%1 Preview"
100+msgstr ""
112101
113102#: qml/Dash/Previews/PreviewActionCombo.qml:34
114103msgid "More..."
@@ -118,22 +107,18 @@ msgstr "Več ..."
118107msgid "Less..."
119108msgstr "Manj ..."
120109
121−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
110+#: qml/Dash/Previews/PreviewRatingInput.qml:81
111+msgid "Rate this"
112+msgstr "Ocenite"
113+
114+#: qml/Dash/Previews/PreviewRatingInput.qml:126
122115msgid "Add a review"
123116msgstr "Dodaj oceno"
124117
125−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
118+#: qml/Dash/Previews/PreviewRatingInput.qml:166
126119msgid "Send"
127120msgstr "Pošlji"
128121
129−#: qml/Dash/Previews/Reviews.qml:86
130−msgid "Review"
131−msgstr "Ocena"
132−
133−#: qml/Dash/Previews/Reviews.qml:139
134−msgid "Comments:"
135−msgstr "Opombe:"
136−
137122#: qml/Greeter/Lockscreen.qml:149
138123msgid "Emergency Call"
139124msgstr "Klic v sili"
@@ -179,7 +164,25 @@ msgstr "Vnesite PIN kartice SIM"
179164msgid "Search"
180165msgstr "Iskanje"
181166
182−#: qml/Shell.qml:440
167+#: qml/Shell.qml:417
183168#, qt-format
184169msgid "Please enter %1"
185170msgstr "Vnesite %1"
171+
172+#~ msgid "Review"
173+#~ msgstr "Ocena"
174+
175+#~ msgid "Comments:"
176+#~ msgstr "Opombe:"
177+
178+#, qt-format
179+#~ msgid "%1 review"
180+#~ msgid_plural "%1 reviews"
181+#~ msgstr[0] "%1 ocen"
182+#~ msgstr[1] "%1 ocena"
183+#~ msgstr[2] "%1 oceni"
184+#~ msgstr[3] "%1 ocene"
185+
186+#, qt-format
187+#~ msgid "(%1)"
188+#~ msgstr "(%1)"
po/sq.po+28−31
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-15 13:51+0000\n"
1212"Last-Translator: Besmir Zanaj <besmirzanaj@gmail.com>\n"
1313"Language-Team: Albanian <sq@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,7 +74,7 @@ msgid ""
7474"phone<br><br>Tap on the screen to start"
7575msgstr ""
7676
77−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
7878msgid "Recent searches"
7979msgstr ""
8080
@@ -82,27 +82,18 @@ msgstr ""
8282msgid "See more"
8383msgstr ""
8484
85−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
8686msgid "See less"
8787msgstr ""
8888
89−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
90−msgid "Rate this"
91−msgstr "Vlerësoje këtë"
92−
93−#. TRANSLATORS: Number of persons who rated this app/video/whatever
94−#: qml/Dash/Previews/Header.qml:93
95−#, qt-format
96−msgid "(%1)"
97−msgstr "(%1)"
89+#: qml/Dash/DashApps.qml:38
90+msgid "Recent"
91+msgstr ""
9892
99−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
100−#: qml/Dash/Previews/Header.qml:105
93+#: qml/Dash/PreviewListView.qml:52
10194#, qt-format
102−msgid "%1 review"
103−msgid_plural "%1 reviews"
104−msgstr[0] "%1 rishikim"
105−msgstr[1] "%1 rishikime"
95+msgid "%1 Preview"
96+msgstr ""
10697
10798#: qml/Dash/Previews/PreviewActionCombo.qml:34
10899msgid "More..."
@@ -112,22 +103,18 @@ msgstr ""
112103msgid "Less..."
113104msgstr ""
114105
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
107+msgid "Rate this"
108+msgstr "Vlerësoje këtë"
109+
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
116111msgid "Add a review"
117112msgstr "Shto një rishikim"
118113
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
120115msgid "Send"
121116msgstr ""
122117
123−#: qml/Dash/Previews/Reviews.qml:86
124−msgid "Review"
125−msgstr ""
126−
127−#: qml/Dash/Previews/Reviews.qml:139
128−msgid "Comments:"
129−msgstr ""
130−
131118#: qml/Greeter/Lockscreen.qml:149
132119msgid "Emergency Call"
133120msgstr ""
@@ -173,7 +160,17 @@ msgstr ""
173160msgid "Search"
174161msgstr ""
175162
176−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
177164#, qt-format
178165msgid "Please enter %1"
179166msgstr ""
167+
168+#, qt-format
169+#~ msgid "%1 review"
170+#~ msgid_plural "%1 reviews"
171+#~ msgstr[0] "%1 rishikim"
172+#~ msgstr[1] "%1 rishikime"
173+
174+#, qt-format
175+#~ msgid "(%1)"
176+#~ msgstr "(%1)"
po/sr.po+16−29
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-06-27 09:19+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Serbian <sr@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: 2014-03-15 07:34+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20+"X-Generator: Launchpad (build 16967)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,7 +74,7 @@ msgid ""
7474"phone<br><br>Tap on the screen to start"
7575msgstr ""
7676
77−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
7878msgid "Recent searches"
7979msgstr "Скорашње претраге"
8080
@@ -82,28 +82,19 @@ msgstr "Скорашње претраге"
8282msgid "See more"
8383msgstr ""
8484
85−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
8686msgid "See less"
8787msgstr ""
8888
89−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
90−msgid "Rate this"
89+#: qml/Dash/DashApps.qml:38
90+msgid "Recent"
9191msgstr ""
9292
93−#. TRANSLATORS: Number of persons who rated this app/video/whatever
94−#: qml/Dash/Previews/Header.qml:93
93+#: qml/Dash/PreviewListView.qml:52
9594#, qt-format
96−msgid "(%1)"
95+msgid "%1 Preview"
9796msgstr ""
9897
99−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
100−#: qml/Dash/Previews/Header.qml:105
101−#, qt-format
102−msgid "%1 review"
103−msgid_plural "%1 reviews"
104−msgstr[0] ""
105−msgstr[1] ""
106−
10798#: qml/Dash/Previews/PreviewActionCombo.qml:34
10899msgid "More..."
109100msgstr ""
@@ -112,20 +103,16 @@ msgstr ""
112103msgid "Less..."
113104msgstr ""
114105
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
116−msgid "Add a review"
117−msgstr ""
118−
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
120−msgid "Send"
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
107+msgid "Rate this"
121108msgstr ""
122109
123−#: qml/Dash/Previews/Reviews.qml:86
124−msgid "Review"
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
111+msgid "Add a review"
125112msgstr ""
126113
127−#: qml/Dash/Previews/Reviews.qml:139
128−msgid "Comments:"
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
115+msgid "Send"
129116msgstr ""
130117
131118#: qml/Greeter/Lockscreen.qml:149
@@ -173,7 +160,7 @@ msgstr ""
173160msgid "Search"
174161msgstr "Претрага"
175162
176−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
177164#, qt-format
178165msgid "Please enter %1"
179166msgstr ""
po/sv.po+16−29
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-06-26 22:36+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Swedish <sv@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr ""
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/sw.po+19−29
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-14 19:28+0000\n"
1212"Last-Translator: Damas Mlabwa <Unknown>\n"
1313"Language-Team: Swahili <sw@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,22 +102,18 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr ""
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115110msgid "Add a review"
116111msgstr ""
117112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119114msgid "Send"
120115msgstr "Tuma"
121116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr ""
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "Maoni:"
129−
130117#: qml/Greeter/Lockscreen.qml:149
131118msgid "Emergency Call"
132119msgstr ""
@@ -172,7 +159,10 @@ msgstr ""
172159msgid "Search"
173160msgstr "Tafuta"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
166+
167+#~ msgid "Comments:"
168+#~ msgstr "Maoni:"
po/ta.po+35−32
@@ -7,16 +7,16 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-10-24 11:36+0000\n"
12−"Last-Translator: Thangamani Arun - தங்கமணி அருண் <thangam.arunx@gmail.com>\n"
12+"Last-Translator: Arun Kumar -அருண் குமார் <thangam.arunx@gmail.com>\n"
1313"Language-Team: Ubuntu Tamil Team/Free Tamil Computing/Thamizha\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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020"Language: ta\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
@@ -76,7 +76,7 @@ msgid ""
7676"phone<br><br>Tap on the screen to start"
7777msgstr ""
7878
79−#: qml/Components/PageHeader.qml:340
79+#: qml/Components/PageHeader.qml:365
8080msgid "Recent searches"
8181msgstr "கடையாக தேடப்பட்டவைகள்"
8282
@@ -84,27 +84,18 @@ msgstr "கடையாக தேடப்பட்டவைகள்"
8484msgid "See more"
8585msgstr ""
8686
87−#: qml/Components/SeeMore.qml:57
87+#: qml/Components/SeeMore.qml:58
8888msgid "See less"
8989msgstr ""
9090
91−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
92−msgid "Rate this"
93−msgstr "இதை மதிப்பிடு"
94−
95−#. TRANSLATORS: Number of persons who rated this app/video/whatever
96−#: qml/Dash/Previews/Header.qml:93
97−#, qt-format
98−msgid "(%1)"
99−msgstr "(%1)"
91+#: qml/Dash/DashApps.qml:38
92+msgid "Recent"
93+msgstr ""
10094
101−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
102−#: qml/Dash/Previews/Header.qml:105
95+#: qml/Dash/PreviewListView.qml:52
10396#, qt-format
104−msgid "%1 review"
105−msgid_plural "%1 reviews"
106−msgstr[0] "%1 பரிசீலனை"
107−msgstr[1] "%1 பரிசீலனைகள்"
97+msgid "%1 Preview"
98+msgstr ""
10899
109100#: qml/Dash/Previews/PreviewActionCombo.qml:34
110101msgid "More..."
@@ -114,22 +105,18 @@ msgstr ""
114105msgid "Less..."
115106msgstr ""
116107
117−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
108+#: qml/Dash/Previews/PreviewRatingInput.qml:81
109+msgid "Rate this"
110+msgstr "இதை மதிப்பிடு"
111+
112+#: qml/Dash/Previews/PreviewRatingInput.qml:126
118113msgid "Add a review"
119114msgstr "ஒரு பரிசீலனையை சேர்"
120115
121−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
116+#: qml/Dash/Previews/PreviewRatingInput.qml:166
122117msgid "Send"
123118msgstr "அனுப்பு"
124119
125−#: qml/Dash/Previews/Reviews.qml:86
126−msgid "Review"
127−msgstr "மறுஆய்வு"
128−
129−#: qml/Dash/Previews/Reviews.qml:139
130−msgid "Comments:"
131−msgstr "கருத்துகள்:"
132−
133120#: qml/Greeter/Lockscreen.qml:149
134121msgid "Emergency Call"
135122msgstr "அவசர அழைப்பு"
@@ -175,7 +162,23 @@ msgstr ""
175162msgid "Search"
176163msgstr "தெடு"
177164
178−#: qml/Shell.qml:440
165+#: qml/Shell.qml:417
179166#, qt-format
180167msgid "Please enter %1"
181168msgstr "தயவுச்செய்து %1 உள்ளிடு"
169+
170+#, qt-format
171+#~ msgid "(%1)"
172+#~ msgstr "(%1)"
173+
174+#, qt-format
175+#~ msgid "%1 review"
176+#~ msgid_plural "%1 reviews"
177+#~ msgstr[0] "%1 பரிசீலனை"
178+#~ msgstr[1] "%1 பரிசீலனைகள்"
179+
180+#~ msgid "Review"
181+#~ msgstr "மறுஆய்வு"
182+
183+#~ msgid "Comments:"
184+#~ msgstr "கருத்துகள்:"
po/te.po+16−29
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-06-27 09:57+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Telugu <te@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr ""
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/tr.po+34−31
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-03-05 08:54+0000\n"
1212"Last-Translator: Muhammed Yüce <muhammedyuceee@gmail.com>\n"
1313"Language-Team: Turkish <tr@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -76,7 +76,7 @@ msgstr ""
7676"Kenar haraketlerini öğrendiniz ve telefonu kullanmaya "
7777"başlayabilirsiniz<br><br>Başlamak için ekrana dokunun"
7878
79−#: qml/Components/PageHeader.qml:340
79+#: qml/Components/PageHeader.qml:365
8080msgid "Recent searches"
8181msgstr "Son aramalar"
8282
@@ -84,27 +84,18 @@ msgstr "Son aramalar"
8484msgid "See more"
8585msgstr "Daha fazlası"
8686
87−#: qml/Components/SeeMore.qml:57
87+#: qml/Components/SeeMore.qml:58
8888msgid "See less"
8989msgstr "Daha azını gör"
9090
91−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
92−msgid "Rate this"
93−msgstr "Oyla"
94−
95−#. TRANSLATORS: Number of persons who rated this app/video/whatever
96−#: qml/Dash/Previews/Header.qml:93
97−#, qt-format
98−msgid "(%1)"
99−msgstr "(%1)"
91+#: qml/Dash/DashApps.qml:38
92+msgid "Recent"
93+msgstr ""
10094
101−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
102−#: qml/Dash/Previews/Header.qml:105
95+#: qml/Dash/PreviewListView.qml:52
10396#, qt-format
104−msgid "%1 review"
105−msgid_plural "%1 reviews"
106−msgstr[0] "%1 inceleme"
107−msgstr[1] "%1 inceleme"
97+msgid "%1 Preview"
98+msgstr ""
10899
109100#: qml/Dash/Previews/PreviewActionCombo.qml:34
110101msgid "More..."
@@ -114,22 +105,18 @@ msgstr "Daha fazlası..."
114105msgid "Less..."
115106msgstr "Daha az.."
116107
117−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
108+#: qml/Dash/Previews/PreviewRatingInput.qml:81
109+msgid "Rate this"
110+msgstr "Oyla"
111+
112+#: qml/Dash/Previews/PreviewRatingInput.qml:126
118113msgid "Add a review"
119114msgstr "Bir inceleme ekle"
120115
121−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
116+#: qml/Dash/Previews/PreviewRatingInput.qml:166
122117msgid "Send"
123118msgstr "Gönder"
124119
125−#: qml/Dash/Previews/Reviews.qml:86
126−msgid "Review"
127−msgstr "İnceleme"
128−
129−#: qml/Dash/Previews/Reviews.qml:139
130−msgid "Comments:"
131−msgstr "Yorumlar:"
132−
133120#: qml/Greeter/Lockscreen.qml:149
134121msgid "Emergency Call"
135122msgstr "Acil Arama"
@@ -175,7 +162,23 @@ msgstr "Lütfen SIM PIN'inizi girin"
175162msgid "Search"
176163msgstr "Ara"
177164
178−#: qml/Shell.qml:440
165+#: qml/Shell.qml:417
179166#, qt-format
180167msgid "Please enter %1"
181168msgstr "Lütfen %1 girin"
169+
170+#~ msgid "Review"
171+#~ msgstr "İnceleme"
172+
173+#, qt-format
174+#~ msgid "%1 review"
175+#~ msgid_plural "%1 reviews"
176+#~ msgstr[0] "%1 inceleme"
177+#~ msgstr[1] "%1 inceleme"
178+
179+#, qt-format
180+#~ msgid "(%1)"
181+#~ msgstr "(%1)"
182+
183+#~ msgid "Comments:"
184+#~ msgstr "Yorumlar:"
po/ug.po+33−30
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-02-15 12:09+0000\n"
1212"Last-Translator: Gheyret T.Kenji <Unknown>\n"
1313"Language-Team: Uyghur <ug@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -75,7 +75,7 @@ msgstr ""
7575"ئېكراننى چېكىپ باشلاڭ<br><br>سىز ھازىر گىرۋەك بارماق ئىشارەتلىرىنى ئىگەللەپ "
7676"بولدىڭىز،ئەمدى تېلېفوننى ئىشلىتىشنى باشلىسىڭىز بولىدۇ"
7777
78−#: qml/Components/PageHeader.qml:340
78+#: qml/Components/PageHeader.qml:365
7979msgid "Recent searches"
8080msgstr "يېقىنقى ئىزدەشلەر"
8181
@@ -83,26 +83,18 @@ msgstr "يېقىنقى ئىزدەشلەر"
8383msgid "See more"
8484msgstr "جىقراق كۆرۈش"
8585
86−#: qml/Components/SeeMore.qml:57
86+#: qml/Components/SeeMore.qml:58
8787msgid "See less"
8888msgstr "ئازراق كۆرۈش"
8989
90−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
91−msgid "Rate this"
92−msgstr "بۇنى باھالاڭ"
93−
94−#. TRANSLATORS: Number of persons who rated this app/video/whatever
95−#: qml/Dash/Previews/Header.qml:93
96−#, qt-format
97−msgid "(%1)"
98−msgstr "(%1)"
90+#: qml/Dash/DashApps.qml:38
91+msgid "Recent"
92+msgstr ""
9993
100−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
101−#: qml/Dash/Previews/Header.qml:105
94+#: qml/Dash/PreviewListView.qml:52
10295#, qt-format
103−msgid "%1 review"
104−msgid_plural "%1 reviews"
105−msgstr[0] "%1 باھا"
96+msgid "%1 Preview"
97+msgstr ""
10698
10799#: qml/Dash/Previews/PreviewActionCombo.qml:34
108100msgid "More..."
@@ -112,22 +104,18 @@ msgstr ""
112104msgid "Less..."
113105msgstr ""
114106
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
107+#: qml/Dash/Previews/PreviewRatingInput.qml:81
108+msgid "Rate this"
109+msgstr "بۇنى باھالاڭ"
110+
111+#: qml/Dash/Previews/PreviewRatingInput.qml:126
116112msgid "Add a review"
117113msgstr "باھا قوشۇش"
118114
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
115+#: qml/Dash/Previews/PreviewRatingInput.qml:166
120116msgid "Send"
121117msgstr "ئەۋەت"
122118
123−#: qml/Dash/Previews/Reviews.qml:86
124−msgid "Review"
125−msgstr "تەكشۈر"
126−
127−#: qml/Dash/Previews/Reviews.qml:139
128−msgid "Comments:"
129−msgstr "ئىنكاس:"
130−
131119#: qml/Greeter/Lockscreen.qml:149
132120msgid "Emergency Call"
133121msgstr "جىددىي تېلېفون"
@@ -173,7 +161,22 @@ msgstr "پارولىنى كىرگۈزۈڭPINكارتىڭىزنىڭ SIM"
173161msgid "Search"
174162msgstr "ئىزدە"
175163
176−#: qml/Shell.qml:440
164+#: qml/Shell.qml:417
177165#, qt-format
178166msgid "Please enter %1"
179167msgstr "%1 نى كىرگۈزۈڭ"
168+
169+#, qt-format
170+#~ msgid "%1 review"
171+#~ msgid_plural "%1 reviews"
172+#~ msgstr[0] "%1 باھا"
173+
174+#, qt-format
175+#~ msgid "(%1)"
176+#~ msgstr "(%1)"
177+
178+#~ msgid "Comments:"
179+#~ msgstr "ئىنكاس:"
180+
181+#~ msgid "Review"
182+#~ msgstr "تەكشۈر"
po/uk.po+35−32
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-11-23 12:37+0000\n"
1212"Last-Translator: Ignat Kizenko <Unknown>\n"
1313"Language-Team: Ukrainian <uk@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: 2014-03-15 07:34+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20+"X-Generator: Launchpad (build 16967)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -77,7 +77,7 @@ msgid ""
7777"phone<br><br>Tap on the screen to start"
7878msgstr ""
7979
80−#: qml/Components/PageHeader.qml:340
80+#: qml/Components/PageHeader.qml:365
8181msgid "Recent searches"
8282msgstr "Нещодавні пошуки"
8383
@@ -85,28 +85,18 @@ msgstr "Нещодавні пошуки"
8585msgid "See more"
8686msgstr ""
8787
88−#: qml/Components/SeeMore.qml:57
88+#: qml/Components/SeeMore.qml:58
8989msgid "See less"
9090msgstr ""
9191
92−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
93−msgid "Rate this"
94−msgstr "Оцінити"
95−
96−#. TRANSLATORS: Number of persons who rated this app/video/whatever
97−#: qml/Dash/Previews/Header.qml:93
98−#, qt-format
99−msgid "(%1)"
100−msgstr "(%1)"
92+#: qml/Dash/DashApps.qml:38
93+msgid "Recent"
94+msgstr ""
10195
102−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
103−#: qml/Dash/Previews/Header.qml:105
96+#: qml/Dash/PreviewListView.qml:52
10497#, qt-format
105−msgid "%1 review"
106−msgid_plural "%1 reviews"
107−msgstr[0] "%1 рецензія"
108−msgstr[1] "%1 рецензії"
109−msgstr[2] "%1 рецензій"
98+msgid "%1 Preview"
99+msgstr ""
110100
111101#: qml/Dash/Previews/PreviewActionCombo.qml:34
112102msgid "More..."
@@ -116,22 +106,18 @@ msgstr ""
116106msgid "Less..."
117107msgstr ""
118108
119−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
109+#: qml/Dash/Previews/PreviewRatingInput.qml:81
110+msgid "Rate this"
111+msgstr "Оцінити"
112+
113+#: qml/Dash/Previews/PreviewRatingInput.qml:126
120114msgid "Add a review"
121115msgstr "Додати рецензію"
122116
123−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
117+#: qml/Dash/Previews/PreviewRatingInput.qml:166
124118msgid "Send"
125119msgstr "Надіслати"
126120
127−#: qml/Dash/Previews/Reviews.qml:86
128−msgid "Review"
129−msgstr "Рецензія"
130−
131−#: qml/Dash/Previews/Reviews.qml:139
132−msgid "Comments:"
133−msgstr "Коментарі:"
134−
135121#: qml/Greeter/Lockscreen.qml:149
136122msgid "Emergency Call"
137123msgstr "Терміновий виклик"
@@ -177,7 +163,24 @@ msgstr ""
177163msgid "Search"
178164msgstr "Пошук"
179165
180−#: qml/Shell.qml:440
166+#: qml/Shell.qml:417
181167#, qt-format
182168msgid "Please enter %1"
183169msgstr "Будь ласка, введіть %1"
170+
171+#~ msgid "Comments:"
172+#~ msgstr "Коментарі:"
173+
174+#~ msgid "Review"
175+#~ msgstr "Рецензія"
176+
177+#, qt-format
178+#~ msgid "%1 review"
179+#~ msgid_plural "%1 reviews"
180+#~ msgstr[0] "%1 рецензія"
181+#~ msgstr[1] "%1 рецензії"
182+#~ msgstr[2] "%1 рецензій"
183+
184+#, qt-format
185+#~ msgid "(%1)"
186+#~ msgstr "(%1)"
po/unity8.pot+14−28
@@ -8,7 +8,7 @@ msgid ""
88msgstr ""
99"Project-Id-Version: unity8\n"
1010"Report-Msgid-Bugs-To: \n"
11−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
11+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1212"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1313"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1414"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,7 +16,6 @@ msgstr ""
1616"MIME-Version: 1.0\n"
1717"Content-Type: text/plain; charset=CHARSET\n"
1818"Content-Transfer-Encoding: 8bit\n"
19−"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +72,7 @@ msgid ""
7372"phone<br><br>Tap on the screen to start"
7473msgstr ""
7574
76−#: qml/Components/PageHeader.qml:340
75+#: qml/Components/PageHeader.qml:365
7776msgid "Recent searches"
7877msgstr ""
7978
@@ -81,28 +80,19 @@ msgstr ""
8180msgid "See more"
8281msgstr ""
8382
84−#: qml/Components/SeeMore.qml:57
83+#: qml/Components/SeeMore.qml:58
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
87+#: qml/Dash/DashApps.qml:38
88+msgid "Recent"
9089msgstr ""
9190
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
91+#: qml/Dash/PreviewListView.qml:52
9492#, qt-format
95−msgid "(%1)"
93+msgid "%1 Preview"
9694msgstr ""
9795
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10696#: qml/Dash/Previews/PreviewActionCombo.qml:34
10797msgid "More..."
10898msgstr ""
@@ -111,20 +101,16 @@ msgstr ""
111101msgid "Less..."
112102msgstr ""
113103
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
104+#: qml/Dash/Previews/PreviewRatingInput.qml:81
105+msgid "Rate this"
120106msgstr ""
121107
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
108+#: qml/Dash/Previews/PreviewRatingInput.qml:126
109+msgid "Add a review"
124110msgstr ""
125111
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
112+#: qml/Dash/Previews/PreviewRatingInput.qml:166
113+msgid "Send"
128114msgstr ""
129115
130116#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +158,7 @@ msgstr ""
172158msgid "Search"
173159msgstr ""
174160
175−#: qml/Shell.qml:440
161+#: qml/Shell.qml:417
176162#, qt-format
177163msgid "Please enter %1"
178164msgstr ""
po/vi.po+16−29
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-15 01:19+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Vietnamese <vi@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr ""
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/xh.po+16−29
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-09-28 13:20+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Xhosa <xh@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr ""
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/zh_CN.po+16−29
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-10-09 13:51+0000\n"
1212"Last-Translator: Aron Xu <Unknown>\n"
1313"Language-Team: Chinese (Simplified) <zh_CN@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "近期搜索"
7979
@@ -81,28 +81,19 @@ msgstr "近期搜索"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr "搜索"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/zh_HK.po+33−30
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-25 13:32+0000\n"
1212"Last-Translator: Daniel Cheung <daniel.2345@hotmail.com>\n"
1313"Language-Team: Chinese (Hong Kong) <zh_HK@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "最近的搜尋"
7979
@@ -81,26 +81,18 @@ msgstr "最近的搜尋"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
90−msgstr "評價"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
90+msgstr ""
9791
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
92+#: qml/Dash/PreviewListView.qml:52
10093#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] "%1 評論"
94+msgid "%1 Preview"
95+msgstr ""
10496
10597#: qml/Dash/Previews/PreviewActionCombo.qml:34
10698msgid "More..."
@@ -110,22 +102,18 @@ msgstr ""
110102msgid "Less..."
111103msgstr ""
112104
113−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "評價"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
114110msgid "Add a review"
115111msgstr "新增評論"
116112
117−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
118114msgid "Send"
119115msgstr "傳送"
120116
121−#: qml/Dash/Previews/Reviews.qml:86
122−msgid "Review"
123−msgstr "評論"
124−
125−#: qml/Dash/Previews/Reviews.qml:139
126−msgid "Comments:"
127−msgstr "評論:"
128−
129117#: qml/Greeter/Lockscreen.qml:149
130118msgid "Emergency Call"
131119msgstr "緊急電話"
@@ -171,7 +159,22 @@ msgstr ""
171159msgid "Search"
172160msgstr "搜尋"
173161
174−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
175163#, qt-format
176164msgid "Please enter %1"
177165msgstr "請輸入 %1"
166+
167+#~ msgid "Comments:"
168+#~ msgstr "評論:"
169+
170+#~ msgid "Review"
171+#~ msgstr "評論"
172+
173+#, qt-format
174+#~ msgid "%1 review"
175+#~ msgid_plural "%1 reviews"
176+#~ msgstr[0] "%1 評論"
177+
178+#, qt-format
179+#~ msgid "(%1)"
180+#~ msgstr "(%1)"
po/zh_TW.po+33−30
@@ -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: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-16 06:04+0000\n"
1212"Last-Translator: Henry Yang <henry9846@hotmail.com>\n"
1313"Language-Team: Chinese (Traditional) <zh_TW@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: 2014-03-15 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "最近搜尋"
7979
@@ -81,26 +81,18 @@ msgstr "最近搜尋"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
90−msgstr "對此評比"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
90+msgstr ""
9791
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
92+#: qml/Dash/PreviewListView.qml:52
10093#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] "%1 回覆"
94+msgid "%1 Preview"
95+msgstr ""
10496
10597#: qml/Dash/Previews/PreviewActionCombo.qml:34
10698msgid "More..."
@@ -110,22 +102,18 @@ msgstr ""
110102msgid "Less..."
111103msgstr ""
112104
113−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "對此評比"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
114110msgid "Add a review"
115111msgstr "新增回覆"
116112
117−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
118114msgid "Send"
119115msgstr "發送"
120116
121−#: qml/Dash/Previews/Reviews.qml:86
122−msgid "Review"
123−msgstr "回覆"
124−
125−#: qml/Dash/Previews/Reviews.qml:139
126−msgid "Comments:"
127−msgstr "備註:"
128−
129117#: qml/Greeter/Lockscreen.qml:149
130118msgid "Emergency Call"
131119msgstr "緊急連絡"
@@ -171,7 +159,22 @@ msgstr ""
171159msgid "Search"
172160msgstr "搜尋"
173161
174−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
175163#, qt-format
176164msgid "Please enter %1"
177165msgstr ""
166+
167+#~ msgid "Comments:"
168+#~ msgstr "備註:"
169+
170+#~ msgid "Review"
171+#~ msgstr "回覆"
172+
173+#, qt-format
174+#~ msgid "%1 review"
175+#~ msgid_plural "%1 reviews"
176+#~ msgstr[0] "%1 回覆"
177+
178+#, qt-format
179+#~ msgid "(%1)"
180+#~ msgstr "(%1)"
qml/CMakeLists.txt+1−1
@@ -13,7 +13,7 @@ set(QML_DIRS
1313 Hud
1414 Panel
1515 Launcher
16− SideStage
16+ Stages
1717 Notifications
1818 )
1919
qml/Components/ApplicationManagerWrapper.qmldeleted−169
@@ -1,169 +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 Unity.Application 0.1
19−
20−Item {
21− id: root
22−
23− property alias mainStageApplications: mainStageModel
24− property alias sideStageApplications: sideStageModel
25− property variant mainStageFocusedApplication: null
26− property variant sideStageFocusedApplication: null
27− property bool sideStageEnabled: true
28− property bool keyboardVisible: ApplicationManager.keyboardVisible
29− property int keyboardHeight: ApplicationManager.keyboardHeight
30−
31− property bool fake: ApplicationManager.fake ? ApplicationManager.fake : false
32−
33− signal focusRequested(string appId)
34−
35− ApplicationsModelStageFiltered {
36− id: mainStageModel
37− stage: ApplicationInfo.MainStage
38− }
39−
40− ApplicationsModelStageFiltered {
41− id: sideStageModel
42− stage: ApplicationInfo.SideStage
43− }
44−
45− Connections {
46− target: ApplicationManager
47− onFocusedApplicationIdChanged: {
48− var app = ApplicationManager.findApplication(ApplicationManager.focusedApplicationId)
49− if (!app) { //nothing at all focused, so clear all
50− mainStageFocusedApplication = null;
51− sideStageFocusedApplication = null;
52− } else {
53− if (app.stage == ApplicationInfo.MainStage) {
54− mainStageFocusedApplication = app;
55− // possible the side stage app being unfocused fired this signal, so check for it
56− if (sideStageFocusedApplication && !sideStageFocusedApplication.focused)
57− sideStageFocusedApplication = null;
58− } else {
59− sideStageFocusedApplication = app;
60− // possible the main stage app being unfocused fired this signal, so check for it
61− if (mainStageFocusedApplication && !mainStageFocusedApplication.focused)
62− mainStageFocusedApplication = null;
63− }
64− }
65− }
66−
67− onFocusRequested: {
68− // if no side stage enabled, override application's stage parameter
69− var app = ApplicationManager.findApplication(appId);
70− if (app && app.stage === ApplicationInfo.SideStage && !sideStageEnabled) {
71− app.stage = ApplicationInfo.MainStage;
72− }
73−
74− root.focusRequested(appId);
75− }
76− }
77−
78− function activateApplication(desktopFile, argument) {
79− var appId;
80−
81− // HACK: Applications identified sometimes with with appId, but mostly with desktopFile.
82− // TODO: convert entire shell to use appId only.
83− if (desktopFile.indexOf(".desktop") >= 0) {
84− appId = desktopFileToAppId(desktopFile);
85− } else {
86− appId = desktopFile;
87− }
88−
89− var application = ApplicationManager.findApplication(appId);
90− if (application !== null) {
91− return application;
92− }
93−
94− var execFlags = sideStageEnabled ? ApplicationManager.NoFlag : ApplicationManager.ForceMainStage;
95−
96− if (argument) {
97− return ApplicationManager.startApplication(appId, execFlags, [argument]);
98− } else {
99− return ApplicationManager.startApplication(appId, execFlags);
100− }
101− }
102−
103− function stopApplication(application) {
104− var appId;
105−
106− // HACK: Applications identified sometimes with with appId, but mostly with desktopFile.
107− // TODO: convert entire shell to use appId only.
108− if (typeof application == "string") {
109− appId = application;
110− } else {
111− appId = desktopFileToAppId(application.desktopFile);
112− }
113−
114− ApplicationManager.stopApplication(appId);
115− }
116−
117− function focusApplication(application) {
118− if (application == null || application == undefined) {
119− return;
120− }
121−
122− ApplicationManager.focusApplication(application.appId);
123− }
124−
125− function unfocusCurrentApplication() {
126− ApplicationManager.unfocusCurrentApplication();
127− }
128−
129− function moveRunningApplicationStackPosition(from, to, stage) {
130− if (from == to || from < 0 || to < 0) return;
131−
132− if (stage == ApplicationInfo.SideStage) {
133− sideStageModel.move(from, to);
134− } else {
135− mainStageModel.move(from, to);
136− }
137− }
138−
139− function getApplicationFromDesktopFile(desktopFile, stage) {
140− var appId;
141−
142− // HACK: Applications identified sometimes with with appId, but mostly with desktopFile.
143− // TODO: convert entire shell to use appId only.
144− if (desktopFile.indexOf(".desktop") >= 0) {
145− appId = desktopFileToAppId(desktopFile);
146− } else {
147− appId = desktopFile;
148− }
149−
150− for (var i = 0, len = ApplicationManager.count; i < len; i++ ) {
151− var app = ApplicationManager.get(i);
152−
153− // if stage not specified, return whichever app running on either stage
154− if (app.appId == appId && (stage == undefined || app.stage == stage)) {
155− return app;
156− }
157− }
158− }
159−
160− function desktopFileToAppId(desktopFile) {
161− var right = desktopFile.lastIndexOf(".desktop");
162− var left = desktopFile.lastIndexOf("/");
163− if (left == -1 || right == -1 || left == right) {
164− console.log("ApplicationManagerWrapper: unable to extract appId from '" + desktopFile + "'");
165− return "";
166− }
167− return desktopFile.substring(left+1, right);
168− }
169−}
qml/Components/ApplicationScreenshot.qmldeleted−61
@@ -1,61 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import Unity.Application 0.1
20−
21−Item {
22− id: applicationScreenshot
23−
24− property var application: null
25− property bool withBackground: false
26− property bool ready: applicationImage.ready || withBackground
27−
28− function setApplication(application) {
29− applicationScreenshot.application = application
30− }
31−
32− function clearApplication() {
33− applicationScreenshot.withBackground = false;
34− applicationScreenshot.application = null
35− applicationScreenshot.scheduleUpdate();
36− }
37−
38− function scheduleUpdate() {
39− applicationImage.scheduleUpdate()
40− }
41−
42− function updateFromCache() {
43− applicationImage.updateFromCache()
44− }
45−
46− Rectangle {
47− id: background
48− anchors.fill: parent
49− color: "white" // FIXME should use normal background color of Suru theme
50− visible: applicationScreenshot.withBackground
51− }
52−
53− ApplicationImage {
54− id: applicationImage
55− objectName: "screenshot image"
56− width: applicationScreenshot.application ? parent.width : 0
57− height: applicationScreenshot.application ? parent.height : 0
58− visible: applicationScreenshot.application != null && ready
59− source: ApplicationManager.findApplication((application) ? application.appId : "")
60− }
61−}
qml/Components/ApplicationsModelStageFiltered.qmldeleted−49
@@ -1,49 +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 Utils 0.1
19−import Unity.Application 0.1
20−
21−SortFilterProxyModel {
22− id: root
23− property int stage
24−
25− function get(index) {
26− return model.get(mapRowToSource(index));
27− }
28−
29− function move(from, to) {
30− var realFrom = mapRowToSource(from);
31− if (realFrom == -1) {
32− console.log("ERROR; invalid from=" + from + " index in move operation");
33− return;
34− }
35− var realTo = mapRowToSource(to);
36− if (realTo == -1) {
37− // assuming wanting to move to end of list
38− realTo = model.count - 1;
39− }
40−
41− if (realFrom == realTo) return;
42− model.move(realFrom, realTo);
43− }
44−
45− model: ApplicationManager
46− dynamicSortFilter: true
47− filterRole: ApplicationManager.RoleStage
48− filterRegExp: RegExp(stage)
49−}
qml/Components/Carousel.qml+69−63
@@ -261,77 +261,83 @@ Item {
261261 listView.gapToEndPhase,
262262 listView.translationXViewFactor)
263263
264− delegate: Loader {
265− property bool explicitlyScaled: explicitScaleFactor == carousel.selectedItemScaleFactor
266− property real explicitScaleFactor: explicitScale ? carousel.selectedItemScaleFactor : 1.0
267− readonly property bool explicitScale: (!listView.moving ||
268− listView.realContentX <= 0 ||
269− listView.realContentX >= listView.realContentWidth - listView.realWidth) &&
270− listView.newContentX === listView.disabledNewContentX &&
271− index === listView.selectedIndex
272− readonly property real cachedTiles: listView.realPathItemCount + carousel.drawBuffer / listView.tileWidth
273− readonly property real distance: listView.continuousIndex - index
274− readonly property real itemTranslationScale: CarouselJS.getItemScale(0.5,
275− (index + 0.5), // good approximation of scale while changing selected item
276− listView.count,
277− listView.visibleTilesScaleFactor)
278− readonly property real itemScale: CarouselJS.getItemScale(distance,
279− listView.continuousIndex,
280− listView.count,
281− listView.visibleTilesScaleFactor)
282− readonly property real translationX: CarouselJS.getItemTranslation(index,
283− listView.selectedIndex,
284− distance,
285− itemScale,
286− itemTranslationScale,
287− listView.maximumItemTranslation)
288−
289− readonly property real xTransform: listView.viewTranslation + translationX * listView.scaleFactor
290− readonly property real center: x - listView.contentX + xTransform - drawBuffer + (width/2)
291−
292− width: listView.tileWidth
293− height: listView.tileHeight
294− scale: itemScale * explicitScaleFactor
295− sourceComponent: itemComponent
296− z: cachedTiles - Math.abs(index - listView.selectedIndex)
297−
298− transform: Translate {
299− x: xTransform
300− }
264+ delegate: tileWidth > 0 && tileHeight > 0 ? loaderComponent : undefined
265+
266+ Component {
267+ id: loaderComponent
268+
269+ Loader {
270+ property bool explicitlyScaled: explicitScaleFactor == carousel.selectedItemScaleFactor
271+ property real explicitScaleFactor: explicitScale ? carousel.selectedItemScaleFactor : 1.0
272+ readonly property bool explicitScale: (!listView.moving ||
273+ listView.realContentX <= 0 ||
274+ listView.realContentX >= listView.realContentWidth - listView.realWidth) &&
275+ listView.newContentX === listView.disabledNewContentX &&
276+ index === listView.selectedIndex
277+ readonly property real cachedTiles: listView.realPathItemCount + carousel.drawBuffer / listView.tileWidth
278+ readonly property real distance: listView.continuousIndex - index
279+ readonly property real itemTranslationScale: CarouselJS.getItemScale(0.5,
280+ (index + 0.5), // good approximation of scale while changing selected item
281+ listView.count,
282+ listView.visibleTilesScaleFactor)
283+ readonly property real itemScale: CarouselJS.getItemScale(distance,
284+ listView.continuousIndex,
285+ listView.count,
286+ listView.visibleTilesScaleFactor)
287+ readonly property real translationX: CarouselJS.getItemTranslation(index,
288+ listView.selectedIndex,
289+ distance,
290+ itemScale,
291+ itemTranslationScale,
292+ listView.maximumItemTranslation)
293+
294+ readonly property real xTransform: listView.viewTranslation + translationX * listView.scaleFactor
295+ readonly property real center: x - listView.contentX + xTransform - drawBuffer + (width/2)
296+
297+ width: listView.tileWidth
298+ height: listView.tileHeight
299+ scale: itemScale * explicitScaleFactor
300+ sourceComponent: itemComponent
301+ z: cachedTiles - Math.abs(index - listView.selectedIndex)
302+
303+ transform: Translate {
304+ x: xTransform
305+ }
301306
302− Behavior on explicitScaleFactor {
303− SequentialAnimation {
304− ScriptAction {
305− script: if (!explicitScale)
306− explicitlyScaled = false
307− }
308− NumberAnimation {
309− duration: explicitScaleFactor === 1.0 ? 250 : 150
310− easing.type: Easing.InOutQuad
311− }
312− ScriptAction {
313− script: if (explicitScale)
314− explicitlyScaled = true
307+ Behavior on explicitScaleFactor {
308+ SequentialAnimation {
309+ ScriptAction {
310+ script: if (!explicitScale)
311+ explicitlyScaled = false
312+ }
313+ NumberAnimation {
314+ duration: explicitScaleFactor === 1.0 ? 250 : 150
315+ easing.type: Easing.InOutQuad
316+ }
317+ ScriptAction {
318+ script: if (explicitScale)
319+ explicitlyScaled = true
320+ }
315321 }
316322 }
317− }
318323
319− onLoaded: {
320− item.explicitlyScaled = Qt.binding(function() { return explicitlyScaled; })
321− item.model = Qt.binding(function() { return model; })
322− }
324+ onLoaded: {
325+ item.explicitlyScaled = Qt.binding(function() { return explicitlyScaled; })
326+ item.model = Qt.binding(function() { return model; })
327+ }
323328
324− MouseArea {
325− id: mouseArea
329+ MouseArea {
330+ id: mouseArea
326331
327− anchors.fill: parent
332+ anchors.fill: parent
328333
329− onClicked: {
330− listView.itemClicked(index, item)
331− }
334+ onClicked: {
335+ listView.itemClicked(index, item)
336+ }
332337
333− onPressAndHold: {
334− listView.itemPressAndHold(index, item)
338+ onPressAndHold: {
339+ listView.itemPressAndHold(index, item)
340+ }
335341 }
336342 }
337343 }
qml/Components/LazyImage.qml+2−2
@@ -99,10 +99,10 @@ Item {
9999 horizontalAlignment: Image.AlignHCenter
100100 verticalAlignment: Image.AlignVCenter
101101 sourceSize.width: root.scaleTo == "width" ? root.width
102− : root.scaleTo == "fit" && root.width < root.height ? root.width
102+ : root.scaleTo == "fit" && root.width <= root.height ? root.width
103103 : 0
104104 sourceSize.height: root.scaleTo == "height" ? root.height
105− : root.scale == "fit" && root.height < root.width ? root.height
105+ : root.scaleTo == "fit" && root.height <= root.width ? root.height
106106 : 0
107107 }
108108 }
qml/Components/ListItems/Header.qml+2−14
@@ -36,7 +36,7 @@ Item {
3636 right: parent.right
3737 rightMargin: units.gu(0.5)
3838 top: parent.top
39− bottom: bottomBorder.top
39+ bottom: parent.bottom
4040 }
4141
4242 Label {
@@ -47,14 +47,11 @@ Item {
4747 verticalCenter: parent.verticalCenter
4848 }
4949
50− color: Theme.palette.selected.backgroundText //at 60%
51− opacity: 0.6
50+ color: "grey" // TODO karni: Update Ubuntu.Compoonents.Themes.Palette.
5251 font.family: "Ubuntu"
5352 fontSize: "medium"
5453 elide: Text.ElideRight
5554 textFormat: Text.PlainText
56− style: Text.Raised
57− styleColor: "black"
5855 width: parent.width - image.width - image.leftMargin - anchors.leftMargin
5956 }
6057
@@ -68,15 +65,6 @@ Item {
6865 }
6966 }
7067
71− ThinDivider {
72− id: bottomBorder
73− anchors {
74− left: parent.left
75− right: parent.right
76− bottom: parent.bottom
77− }
78− }
79−
8068 MouseArea {
8169 anchors.fill: parent
8270 onClicked: parent.clicked(mouse)
qml/Components/OpenEffect.qmldeleted−138
@@ -1,138 +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−
19−Item {
20− id: effect
21− property bool enabled: topGapPx != positionPx || bottomGapPx != positionPx
22− property alias live: effectSource.live
23− property Item sourceItem
24− property ShaderEffectSource source: ShaderEffectSource {
25− id: effectSource
26− sourceItem: effect.enabled ? effect.sourceItem : null
27− hideSource: effect.enabled
28− live: false
29− sourceRect: {
30− if (effect.enabled) {
31− Qt.rect(0, -effect.topOverflow, sourceItem.width, sourceItem.height + effect.topOverflow + effect.bottomOverflow)
32− } else {
33− Qt.rect(0, 0, 0, 0)
34− }
35− }
36− }
37−
38− onEnabledChanged: if (!live && enabled) scheduleUpdate()
39−
40− /*!
41− \qmlproperty real positionPx
42− The y coordinate of where to perform the split.
43−
44− \qmlproperty real topGapPx
45− Gap's top edge.
46−
47− \qmlproperty real bottomGapPx
48− Gap's bottom edge.
49−
50− \qmlproperty real topOverflow
51− How much of the sourceItem should be sourced above its bounds.
52−
53− \qmlproperty real bottomOverflow
54− How much of the sourceItem should be sourced below its bounds.
55− */
56−
57− property real positionPx: 0
58− property real topGapPx: 0
59− property real bottomGapPx: height
60− property real topOverflow: 0.0
61− property real bottomOverflow: 0.0
62− property real topOpacity: 1.0
63− property real bottomOpacity: 1.0
64−
65− property real __roundedPositionPx: Math.round(positionPx)
66−
67− function scheduleUpdate() {
68− source.scheduleUpdate();
69− }
70−
71− ShaderEffect {
72− id: top
73− visible: effect.enabled
74− opacity: topOpacity
75− property ShaderEffectSource source: effect.source
76− property real positionPx: __roundedPositionPx
77− property real factor: effect.height / height
78−
79− clip: true
80−
81− anchors {
82− top: parent.top
83− left: parent.left
84− right: parent.right
85− topMargin: -topOverflow - positionPx + topGapPx
86− }
87− height: topOverflow + positionPx
88−
89− vertexShader: "
90− uniform highp mat4 qt_Matrix;
91− attribute highp vec4 qt_Vertex;
92− attribute highp vec2 qt_MultiTexCoord0;
93− varying highp vec2 qt_TexCoord0;
94− uniform highp float factor;
95−
96− void main() {
97− highp vec4 pos = qt_Vertex;
98− pos.y *= factor;
99− gl_Position = qt_Matrix * pos;
100− qt_TexCoord0 = qt_MultiTexCoord0;
101− }
102− "
103− }
104−
105− ShaderEffect {
106− id: bottom
107− visible: effect.enabled
108− opacity: bottomOpacity
109− property ShaderEffectSource source: effect.source
110− property real offset: effect.topOverflow + __roundedPositionPx
111− property real factor: effect.height / height
112−
113− clip: true
114−
115− anchors {
116− left: parent.left
117− right: parent.right
118− }
119− y: topOverflow + bottomGapPx
120− height: sourceItem.height - positionPx + bottomOverflow
121−
122− vertexShader: "
123− uniform highp mat4 qt_Matrix;
124− attribute highp vec4 qt_Vertex;
125− attribute highp vec2 qt_MultiTexCoord0;
126− varying highp vec2 qt_TexCoord0;
127− uniform highp float factor;
128− uniform highp float offset;
129−
130− void main() {
131− highp vec4 pos = qt_Vertex;
132− pos.y = (pos.y * factor) - offset;
133− gl_Position = qt_Matrix * pos;
134− qt_TexCoord0 = qt_MultiTexCoord0;
135− }
136− "
137− }
138−}
qml/Components/PageHeader.qml+27−2
@@ -18,7 +18,7 @@ import QtQuick 2.0
1818import Ubuntu.Components 0.1
1919import Ubuntu.Components.Popups 0.1
2020import Ubuntu.Components.ListItems 0.1 as ListItem
21−import Unity 0.1
21+import Unity 0.2
2222
2323Item {
2424 id: root
@@ -27,6 +27,9 @@ Item {
2727 property ListModel searchHistory
2828 property Scope scope
2929 property alias childItem: itemContainer.children
30+ property alias showBackButton: backButton.visible
31+
32+ signal backClicked
3033
3134 height: units.gu(8.5)
3235 implicitHeight: units.gu(8.5)
@@ -69,11 +72,33 @@ Item {
6972
7073 Behavior on contentY { NumberAnimation { duration: 200; easing.type: Easing.OutQuad } }
7174
75+ AbstractButton {
76+ id: backButton
77+ objectName: root.objectName + "_backButton"
78+ visible: false
79+ height: header.height
80+ y: header.contentY
81+ anchors {
82+ left: parent.left
83+ leftMargin: visible ? units.gu(2) : 0
84+ }
85+ width: visible ? image.width + units.gu(2) : 0
86+ onClicked: root.backClicked();
87+ Image {
88+ id: image
89+ anchors.centerIn: parent
90+ source: "graphics/headerback.png"
91+ }
92+ }
93+
7294 // FIXME this could potentially be simplified to avoid all the containers
7395 Item {
7496 id: headerContainer
7597
76− width: parent.width
98+ anchors {
99+ left: backButton.right
100+ right: parent.right
101+ }
77102 height: childrenRect.height
78103
79104 Item {
qml/Components/RatingStars.qmldeleted−41
@@ -1,41 +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−
19−Row {
20− id: root
21− property int rating
22− property int maximumRating: 5
23− property int starCount: 5
24− height: childrenRect.height
25− width: childrenRect.width
26−
27− readonly property int effectiveRating: Math.max(0, Math.min(root.starCount * root.rating / root.maximumRating, root.maximumRating))
28−
29− Repeater {
30− model: root.effectiveRating
31− Image {
32− source: "graphics/icon_star_on.png"
33− }
34− }
35− Repeater {
36− model: root.starCount - root.effectiveRating
37− Image {
38− source: "graphics/icon_star_off.png"
39− }
40− }
41−}
qml/Components/ResponsiveFlowView.qml+3−10
@@ -27,9 +27,8 @@ Item {
2727 property alias verticalSpacing: flow.verticalSpacing
2828 property alias horizontalSpacing: flow.horizontalSpacing
2929 property int referenceDelegateWidth
30− property alias firstModel: repeater1.model
31− property alias secondModel: repeater2.model
32− property alias delegate: repeater1.delegate
30+ property alias model: repeater.model
31+ property alias delegate: repeater.delegate
3332 readonly property int cellWidth: referenceDelegateWidth + horizontalSpacing
3433 readonly property int cellHeight: referenceDelegateWidth + verticalSpacing
3534 property alias move: flow.move
@@ -69,13 +68,7 @@ Item {
6968 property int margin: allocatableVerticalSpace - columns * horizontalSpacing
7069
7170 Repeater {
72− id: repeater1
73− model: (root.model) ? root.model[0] : null
74− }
75− Repeater {
76− id: repeater2
77− model: (root.model) ? root.model[1] : null
78− delegate: repeater1.delegate
71+ id: repeater
7972 }
8073 }
8174}
qml/Components/ResponsiveGridView.qml−1
@@ -56,7 +56,6 @@ Item {
5656 fill: parent
5757 leftMargin: margin/2
5858 rightMargin: margin/2
59− topMargin: verticalSpacing
6059 }
6160 clip: parent.height != totalContentHeight
6261
qml/Components/SeeMore.qml+4−2
@@ -34,7 +34,8 @@ Item {
3434 objectName: "seeMoreLabel"
3535 text: i18n.tr("See more")
3636 opacity: !more ? 0.8 : 0.4
37− color: Theme.palette.selected.backgroundText
37+ // TODO: Fix requiring Palette update
38+ color: "grey" //Theme.palette.selected.backgroundText
3839 font.weight: Font.Bold
3940
4041 MouseArea {
@@ -56,7 +57,8 @@ Item {
5657 objectName: "seeLessLabel"
5758 text: i18n.tr("See less")
5859 opacity: more ? 0.8 : 0.4
59− color: Theme.palette.selected.backgroundText
60+ // TODO: Fix requiring Palette update
61+ color: "grey" //Theme.palette.selected.backgroundText
6062 font.weight: Font.Bold
6163
6264 MouseArea {
qml/Components/Stage.qmldeleted−563
@@ -1,563 +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 Unity.Application 0.1
19−import Ubuntu.Components 0.1
20−import Ubuntu.Gestures 0.1
21−
22−/*
23− Responsible for application switching.
24−
25− Drag from the right edge to switch to the next application.
26− While being dragged, this component will show an animation for the user to
27− visualize that he's changing the stacking of applications (next/new app comes from
28− right edge and current/old app fades out).
29− */
30−Showable {
31− id: stage
32−
33− width: units.gu(40)
34− height: units.gu(71)
35−
36− property int type: ApplicationInfo.MainStage
37− property var applicationManager
38− readonly property var applications:
39− type == ApplicationInfo.MainStage ? applicationManager.mainStageApplications
40− : applicationManager.sideStageApplications
41− property bool fullyShown: false
42− property bool fullyHidden: true
43− readonly property var focusedApplication:
44− type == ApplicationInfo.MainStage ? applicationManager.mainStageFocusedApplication
45− : applicationManager.sideStageFocusedApplication
46− property bool shouldUseScreenshots: true
47−
48− /* Will be true whenever application screenshots are being shown.
49− i.e. during application window transitions */
50− readonly property bool usingScreenshots: {
51− if (newApplicationScreenshot.application != null && oldApplicationScreenshot.application != null) {
52− return newApplicationScreenshot.ready && oldApplicationScreenshot.ready;
53− } else {
54− return newApplicationScreenshot.ready || oldApplicationScreenshot.ready;
55− }
56− }
57−
58− property bool rightEdgeEnabled: true
59− property bool switchingFromFullscreenToFullscreen: false
60−
61− property alias rightEdgeDraggingAreaWidth: rightEdgeDraggingArea.width
62−
63− // Y coordinate for non-fullscreen applications
64− property int normalApplicationY: 0
65−
66− function activateApplication(desktopFile, addDelay) {
67− var application = applicationManager.getApplicationFromDesktopFile(desktopFile, stage.type);
68− if (application != null && application == stage.focusedApplication) {
69− stage.show();
70− return;
71− }
72−
73− showStartingApplicationAnimation.prepare(application);
74− if (!stage.fullyShown) {
75− // if launching this app reveals the stage, make new application screenshot visible
76− newApplicationScreenshot.visible = true;
77− stage.show();
78− } else {
79− showStartingApplicationAnimation.start();
80− }
81−
82− if (addDelay) {
83− stage.__startingApplicationDesktopFile = desktopFile;
84− }
85− }
86−
87− Connections {
88− target: applicationManager
89− onFocusRequested: activateApplication(appId)
90− }
91−
92− /* Keep a reference to the focused application so that we can safely
93− unfocus it when the stage is not fully shown and refocus it when the stage
94− is fully shown again.
95− */
96− property var focusedApplicationWhenUsingScreenshots
97− onShouldUseScreenshotsChanged: {
98− if (showStartingApplicationAnimation.running || switchToApplicationAnimation.running) {
99− return;
100− }
101−
102− if (shouldUseScreenshots) {
103− stage.__focusApplicationUsingScreenshots(stage.focusedApplication);
104− } else {
105− if (stage.focusedApplicationWhenUsingScreenshots) {
106− stage.__focusActualApplication(stage.focusedApplicationWhenUsingScreenshots);
107− }
108− }
109− }
110−
111−
112− property Item newApplicationScreenshot: ApplicationScreenshot {
113− parent: stage
114− width: stage.width
115− height: stage.height - y
116− }
117− property Item oldApplicationScreenshot: ApplicationScreenshot {
118− parent: stage
119− width: stage.width
120− height: stage.height - y
121− }
122−
123− function __getApplicationIndex(application) {
124− if (!application)
125− return -1
126− for (var i = 0; i < stage.applications.count; i++ ) {
127− if (stage.applications.get(i).desktopFile == application.desktopFile) {
128− return i
129− }
130− }
131− return -1
132− }
133−
134−
135− property string __startingApplicationDesktopFile
136−
137− Timer {
138− id: delayedHideScreenshots
139− interval: 500 // on Galaxy Nexus, Telephony app is slowest application to draw a frame so needs this delay
140− onTriggered: {
141− __hideScreenshots();
142− }
143− }
144−
145− function __hideScreenshots() {
146− newApplicationScreenshot.clearApplication();
147− oldApplicationScreenshot.clearApplication();
148− newApplicationScreenshot.visible = false;
149− oldApplicationScreenshot.visible = false;
150− }
151−
152− function __focusApplication(application) {
153− if (!application) return
154− if (shouldUseScreenshots) {
155− stage.__focusApplicationUsingScreenshots(application);
156− } else {
157− stage.__focusActualApplication(application);
158− }
159− }
160−
161−
162− function __focusActualApplication(application) {
163− if (application == null) {
164− return;
165− }
166−
167− if (stage.focusedApplication == application) {
168− /* FIXME: this case is reached when showing the sidestage, we
169− need to refocus the side stage app in order to show it.
170− FIXME: this case is reached when doing a right edge swipe
171− while in the dash to bring back the stage.
172− FIXME: this case is reached when showStartingApplicationAnimation
173− finishes after the newly started application has been focused
174− automatically by the ApplicationManager.
175− */
176− if (stage.type == ApplicationInfo.SideStage) {
177− applicationManager.focusApplication(application);
178− }
179− if (!delayedHideScreenshots.running) {
180− stage.__hideScreenshots();
181− }
182− } else {
183− /* FIXME: calling ApplicationManager::focusApplication does not focus
184− the application immediately nor show the application's surface
185− immediately. Delay hiding the screenshots until it has done so.
186− */
187− delayedHideScreenshots.stop();
188− applicationManager.focusApplication(application);
189− }
190− stage.focusedApplicationWhenUsingScreenshots = null;
191− }
192−
193− function __focusApplicationUsingScreenshots(application) {
194− delayedHideScreenshots.stop();
195− if (application == null) {
196− return;
197− }
198−
199− if (newApplicationScreenshot.application != null) {
200− stage.focusedApplicationWhenUsingScreenshots = application;
201− return;
202− }
203−
204− newApplicationScreenshot.setApplication(application);
205− newApplicationScreenshot.scheduleUpdate();
206− newApplicationScreenshot.opacity = 1.0;
207− newApplicationScreenshot.x = 0.0;
208− newApplicationScreenshot.y = __getApplicationY(application);
209− newApplicationScreenshot.scale = 1.0;
210− newApplicationScreenshot.visible = true;
211− stage.focusedApplicationWhenUsingScreenshots = application;
212− stage.switchingFromFullscreenToFullscreen = false;
213− }
214−
215− function __getApplicationY(application) {
216− return Qt.binding( function(){
217− return (application && application.fullscreen
218− && application.stage !== ApplicationInfo.SideStage)
219− ? 0 : normalApplicationY;
220− } )
221− }
222−
223− /* FIXME: should hide the screenshots when the focused application's surface
224− is visible. There is no API in QtUbuntu to support that yet.
225− */
226− Connections {
227− target: stage
228− onFocusedApplicationChanged: {
229− if (stage.focusedApplication != null) {
230− /* Move application to the beginning of the list of running applications */
231− var index = stage.__getApplicationIndex(stage.focusedApplication);
232− applicationManager.moveRunningApplicationStackPosition(index, 0, stage.type);
233−
234− var startingApplication = applicationManager.getApplicationFromDesktopFile(
235− stage.__startingApplicationDesktopFile, stage.type);
236−
237− if (stage.focusedApplication == startingApplication) {
238− stage.__startingApplicationDesktopFile = "";
239−
240− /* Screenshots might still be in use at this point and their
241− use can be stopped before delayedHideScreenshots is complete.
242− Prepare for that case by setting appropriately
243− stage.focusedApplicationWhenUsingScreenshots.
244− */
245− stage.focusedApplicationWhenUsingScreenshots = stage.focusedApplication;
246−
247− /* FIXME: should hide the screenshots when the focused application's window
248− is visible. There is no API in qtubuntu to support that yet. Therefore
249− we delay their hiding to avoid a state where neither the screenshot nor
250− the application's window is visible.
251− */
252− delayedHideScreenshots.start();
253− } else {
254− stage.focusedApplicationWhenUsingScreenshots = null;
255− stage.__hideScreenshots();
256− }
257− }
258− }
259− }
260−
261− Connections {
262− target: stage.applications
263− onCountChanged: { __discardObsoleteScreenshots(); }
264− ignoreUnknownSignals: true
265− }
266− onFullyHiddenChanged: { __discardObsoleteScreenshots(); }
267− function __discardObsoleteScreenshots() {
268− if (stage.fullyHidden && stage.applications && stage.applications.count == 0) {
269− stage.focusedApplicationWhenUsingScreenshots = undefined;
270− stage.__hideScreenshots();
271− }
272− }
273−
274−
275− SequentialAnimation {
276− id: showStartingApplicationAnimation
277−
278− function prepare(newApplication) {
279− var oldApplication = stage.focusedApplication;
280− newApplicationScreenshot.setApplication(newApplication);
281− newApplicationScreenshot.updateFromCache();
282− oldApplicationScreenshot.setApplication(oldApplication);
283− oldApplicationScreenshot.scheduleUpdate();
284− newApplicationScreenshot.withBackground = true; // FIXME: should be withBackground = newApplication.state == Application.Starting
285− newApplicationScreenshot.y = __getApplicationY(newApplication);
286− oldApplicationScreenshot.y = __getApplicationY(oldApplication);
287− stage.focusedApplicationWhenUsingScreenshots = newApplication;
288− stage.switchingFromFullscreenToFullscreen = false;
289− }
290−
291− PropertyAction {target: newApplicationScreenshot; property: "visible"; value: false}
292− PropertyAction {target: oldApplicationScreenshot; property: "visible"; value: false}
293− PropertyAction {target: newApplicationScreenshot; property: "z"; value: 0}
294− PropertyAction {target: oldApplicationScreenshot; property: "z"; value: 1}
295− PropertyAction {target: newApplicationScreenshot; property: "scale"; value: 0.8}
296− PropertyAction {target: oldApplicationScreenshot; property: "scale"; value: 1.0}
297− PropertyAction {target: newApplicationScreenshot; property: "opacity"; value: 0.0}
298− PropertyAction {target: oldApplicationScreenshot; property: "opacity"; value: 1.0}
299− PropertyAction {target: newApplicationScreenshot; property: "x"; value: 0.0}
300− PropertyAction {target: oldApplicationScreenshot; property: "x"; value: 0.0}
301−
302− ParallelAnimation {
303− PropertyAction {target: newApplicationScreenshot; property: "visible"; value: true}
304− NumberAnimation {
305− target: newApplicationScreenshot
306− property: "scale"
307− duration: 500
308− easing.type: Easing.OutQuad
309− to: 1.0
310− }
311− NumberAnimation {
312− target: newApplicationScreenshot
313− property: "opacity"
314− duration: 500
315− easing.type: Easing.OutQuad
316− to: 1.0
317− }
318−
319− PropertyAction {target: oldApplicationScreenshot; property: "visible"; value: true}
320−
321− NumberAnimation {
322− target: oldApplicationScreenshot
323− property: "x"
324− duration: 400
325− easing.type: Easing.OutQuad
326− to: stage.width
327− }
328− }
329−
330− ScriptAction {
331− script: {
332− if (!stage.focusedApplicationWhenUsingScreenshots) {
333− // FIXME: only here to support case where application does
334− // not exist yet but is about to
335− return;
336− }
337−
338− stage.__focusApplication(stage.focusedApplicationWhenUsingScreenshots);
339− }
340− }
341− }
342−
343−
344− SequentialAnimation {
345− id: switchToApplicationAnimation
346−
347− function prepare(newApplication) {
348− var oldApplication = stage.focusedApplication;
349− newApplicationScreenshot.setApplication(newApplication);
350− newApplicationScreenshot.updateFromCache();
351− oldApplicationScreenshot.setApplication(oldApplication);
352− oldApplicationScreenshot.scheduleUpdate();
353− newApplicationScreenshot.withBackground = false;
354− newApplicationScreenshot.y = __getApplicationY(newApplication);
355− oldApplicationScreenshot.y = __getApplicationY(oldApplication);
356− stage.focusedApplicationWhenUsingScreenshots = newApplication;
357− stage.switchingFromFullscreenToFullscreen = newApplication && newApplication.fullscreen;
358− }
359−
360− PropertyAction {target: newApplicationScreenshot; property: "visible"; value: false}
361− PropertyAction {target: oldApplicationScreenshot; property: "visible"; value: false}
362− PropertyAction {target: newApplicationScreenshot; property: "z"; value: 1}
363− PropertyAction {target: oldApplicationScreenshot; property: "z"; value: 0}
364− PropertyAction {target: newApplicationScreenshot; property: "scale"; value: 1.0}
365− PropertyAction {target: oldApplicationScreenshot; property: "scale"; value: 1.0}
366− PropertyAction {target: newApplicationScreenshot; property: "opacity"; value: 1.0}
367− PropertyAction {target: oldApplicationScreenshot; property: "opacity"; value: 1.0}
368− PropertyAction {target: newApplicationScreenshot; property: "x"; value: stage.width}
369− PropertyAction {target: oldApplicationScreenshot; property: "x"; value: 0.0}
370− PropertyAction {target: newApplicationScreenshot; property: "visible"; value: true}
371− PropertyAction {target: oldApplicationScreenshot; property: "visible"; value: true}
372−
373− ParallelAnimation {
374− NumberAnimation {
375− target: oldApplicationScreenshot
376− property: "scale"
377− duration: 500
378− easing.type: Easing.OutQuad
379− to: 0.8
380− }
381− NumberAnimation {
382− target: oldApplicationScreenshot
383− property: "opacity"
384− duration: 500
385− easing.type: Easing.OutQuad
386− to: 0.0
387− }
388−
389− NumberAnimation {
390− target: newApplicationScreenshot
391− property: "x"
392− duration: 500
393− easing.type: Easing.OutQuad
394− to: 0
395− }
396− }
397−
398− ScriptAction {
399− script: {
400− // move previously focused application to the end of the list of running applications
401− var oldApplication = oldApplicationScreenshot.application;
402− if (oldApplication != null) {
403− var oldApplicationIndex = stage.__getApplicationIndex(oldApplicationScreenshot.application);
404− applicationManager.moveRunningApplicationStackPosition(
405− oldApplicationIndex, stage.applications.count - 1, stage.type);
406− }
407−
408− stage.__focusApplication(stage.focusedApplicationWhenUsingScreenshots);
409− }
410− }
411− }
412−
413−
414− function __dragValueToProgress(dragValue, startValue, applicationsCount) {
415− if (applicationsCount == 0) {
416− return 0;
417− } else if (applicationsCount == 1) {
418− // prevent the current app from moving more than 1/4 of the screen
419− var elasticValue = __elastic(dragValue, startValue/4);
420− return elasticValue / startValue;
421− } else {
422− return dragValue / startValue;
423− }
424− }
425−
426− function __elastic(x, limit) {
427− return limit * ( 1 - Math.pow( ( limit - 1 ) / limit, x ) )
428− }
429−
430− property real __startValue: stage.width
431−
432− AnimationControllerWithSignals {
433− id: switchToApplicationAnimationController
434−
435− onAnimationCompletedAtBeginning: {
436− animation = null;
437− stage.__focusApplication(oldApplicationScreenshot.application);
438− }
439− }
440−
441− EdgeDragEvaluator {
442− id: dragEvaluator
443− trackedPosition: rightEdgeDraggingArea.touchX
444− direction: rightEdgeDraggingArea.direction
445− maxDragDistance: stage.width
446− }
447−
448− EdgeDragArea {
449− id: rightEdgeDraggingArea
450−
451− enabled: {
452− if (status == DirectionalDragArea.WaitingForTouch) {
453− return switchToApplicationAnimationController.completed
454− && stage.applications.count > 0 && stage.rightEdgeEnabled
455− && !delayedHideScreenshots.running
456− } else {
457− return true
458− }
459− }
460− width: units.gu(2)
461− anchors.top: parent.top
462− anchors.bottom: parent.bottom
463− anchors.right: parent.right
464−
465− direction: Direction.Leftwards
466−
467− onDistanceChanged: {
468− if (status !== DirectionalDragArea.Recognized)
469− return
470−
471− var targetProgress = __dragValueToProgress(-distance, __startValue,
472− stage.applications.count)
473− var delta = targetProgress - switchToApplicationAnimationController.progress
474−
475− // When the gesture finally gets recognized, the finger will likely be
476− // reasonably far from the edge. If we made the progress immediately
477− // follow the finger position it would be visually unpleasant as there
478− // would be a jump to meet the finger's current position.
479− //
480− // The trick is not to go all the way (1.0) as it would cause the
481− // aforementioned jump.
482− switchToApplicationAnimationController.progress += 0.4 * delta
483− }
484−
485− property int lastStatus: -1
486−
487− onStatusChanged: {
488− if (status == DirectionalDragArea.Undecided) {
489− onUndecided();
490− } else if (status == DirectionalDragArea.WaitingForTouch) {
491− if (lastStatus == DirectionalDragArea.Undecided) {
492− // got rejected
493− switchToApplicationAnimationController.completeToBeginningWithSignal();
494− } else {
495− onGestureEnded();
496− }
497− }
498− lastStatus = status;
499− }
500−
501− function onUndecided() {
502− dragEvaluator.reset();
503−
504− var nextApplication = null;
505− if (stage.applications.count > 1) {
506− nextApplication = stage.applications.get(1);
507− }
508− switchToApplicationAnimationController.progress = 0
509− switchToApplicationAnimation.prepare(nextApplication);
510− switchToApplicationAnimationController.animation = switchToApplicationAnimation;
511−
512− }
513−
514− function onGestureEnded() {
515− if (stage.applications.count > 1 && dragEvaluator.shouldAutoComplete()) {
516− switchToApplicationAnimationController.completeToEndWithSignal();
517− } else {
518− switchToApplicationAnimationController.completeToBeginningWithSignal();
519− }
520− }
521− }
522−
523−
524− // FIXME: very bad hack to detect when an application was closed or crashed
525− property var __previouslyFocusedApplication
526− Connections {
527− target: stage
528− onFocusedApplicationChanged: {
529− if (stage.focusedApplication == null
530− && __getApplicationIndex(stage.__previouslyFocusedApplication) == -1) {
531− stage.__onFocusedApplicationClosed();
532− }
533− stage.__previouslyFocusedApplication = stage.focusedApplication;
534− }
535− }
536−
537− function __onFocusedApplicationClosed() {
538− if (!stage.shown) {
539− return;
540− }
541−
542− if (stage.applications.count > 0) {
543− // Do not change the focused application from within onFocusedApplicationChanged.
544− // This causes binding loop warnings besides being a bad practice in general
545− // (setting a property from within its "changed" signal handling)
546− // Hence the timer.
547− focusTopmostAppTimer.start();
548− } else {
549− stage.hide();
550− }
551− }
552−
553− Timer {
554− id: focusTopmostAppTimer
555− interval: 1; repeat: false
556− onTriggered: {
557− if (stage.applications.count > 0) {
558− stage.__focusApplication(stage.applications.get(0));
559− }
560− }
561− }
562−
563−}
qml/Components/Tile.qmldeleted−39
@@ -1,39 +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−
20−AbstractButton {
21− property url source
22− property int fillMode: Image.PreserveAspectCrop
23− property int horizontalAlignment: Text.AlignHCenter
24− property string text
25− property int imageWidth
26− property int imageHeight
27− property int maximumLineCount: 1
28−
29− readonly property int center: (index % GridView.view.columns * width) + (width / 2)
30−
31− opacity: GridView.view.highlightIndex === -1 ? 1 :
32− GridView.view.highlightIndex === index ? 0.6 : 0.2
33−
34− Behavior on opacity {
35− UbuntuNumberAnimation {}
36− }
37−
38− style: TileStyle {}
39−}
qml/Components/TileStyle.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 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−}
qml/Components/VolumeControl.qml+6−2
@@ -22,6 +22,10 @@ Item {
2222 objectName: "volumeControl"
2323 visible: false
2424
25+ // TODO Work around http://pad.lv/1293478 until qmenumodel knows to cast
26+ readonly property int stepUp: 1
27+ readonly property int stepDown: -1
28+
2529 QDBusActionGroup {
2630 id: actionGroup
2731 busType: 1
@@ -32,11 +36,11 @@ Item {
3236 }
3337
3438 function volumeUp() {
35− actionGroup.actionObject.activate(1);
39+ actionGroup.actionObject.activate(stepUp);
3640 }
3741
3842 function volumeDown() {
39− actionGroup.actionObject.activate(-1);
43+ actionGroup.actionObject.activate(stepDown);
4044 }
4145
4246 Component.onCompleted: actionGroup.start()
qml/Components/graphics/headerback@27.pngnew file

Binary file not shown.

qml/Dash/Apps/AppPreview.qmldeleted−167
@@ -1,167 +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 Ubuntu.Components.ListItems 0.1 as ListItems
20−import ".."
21−import "../Generic"
22−import "../Previews"
23−import "../../Components"
24−
25−GenericPreview {
26− id: root
27−
28− signal sendUserReview(string review)
29−
30− previewImages: previewImagesComponent
31− description: descriptionComponent
32− header: headerComponent
33−
34− // TODO: Ratings are not yet complete... enable this once they work
35− //ratings: ratingsComponent
36−
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− // FIXME: Because of ListViews inside ListViews inside Flickables inside ListViews (and some more)
48− // we finally reached the point where this ListView doesn't correctly get swipe input any more but
49− // instead the parent ListView is the one that is swiped. This MouseArea sort of creates a blocking
50− // layer to make sure this ListView can be swiped, regardless of what's behind it.
51− MouseArea {
52− anchors.fill: parent
53− enabled: parent.contentWidth > parent.width
54− }
55−
56− LazyImage {
57− objectName: "placeholderScreenshot"
58− anchors {
59− top: parent.top
60− bottom: parent.bottom
61− }
62− scaleTo: "height"
63− source: "broken_image"
64− initialWidth: units.gu(13)
65− visible: previewImageListView.count == 0
66− }
67−
68− delegate: LazyImage {
69− id: shape
70− anchors {
71− top: parent.top
72− bottom: parent.bottom
73− }
74− source: modelData ? modelData : ""
75− scaleTo: "height"
76− initialWidth: units.gu(13)
77− }
78− }
79− }
80−
81− Component {
82− id: headerComponent
83− Header {
84− objectName: "previewHeader"
85− title: previewData.title
86− icon: previewData.appIcon
87− subtitle: root.previewData.infoMap["publisher"] ? root.previewData.infoMap["publisher"].value : ""
88− rating: Math.round(root.previewData.rating * 10)
89− reviews: root.previewData.numRatings
90− rated: root.previewData.infoMap["rated"] ? root.previewData.infoMap["rated"].value : 0
91− }
92− }
93−
94− Component {
95− id: descriptionComponent
96− Column {
97− spacing: units.gu(1)
98−
99− Label {
100− objectName: "descriptionLabel"
101− anchors { left: parent.left; right: parent.right }
102− text: root.previewData.description
103− fontSize: "medium"
104− color: Theme.palette.selected.backgroundText
105− opacity: .6
106− wrapMode: Text.WordWrap
107− style: Text.Raised
108− styleColor: "black"
109− }
110− }
111− }
112−
113− Component {
114− id: ratingsComponent
115− Column {
116− id: columnReviewRating
117− objectName: "columnReviewRating"
118− visible: root.previewData.rating >= 0
119−
120− spacing: units.gu(1)
121− height: childrenRect.height
122−
123− ListItems.ThinDivider { }
124−
125− Item {
126− anchors { left: parent.left; right: parent.right }
127− height: rateLabel.height
128−
129− Label {
130− id: rateLabel
131− fontSize: "medium"
132− color: "white"
133− style: Text.Raised
134− styleColor: "black"
135− opacity: .9
136− text: i18n.tr("Rate this")
137−
138− anchors.left: parent.left
139− anchors.verticalCenter: parent.verticalCenter
140− }
141−
142− // FIXME these need to be made interactive and connected to the scope
143− RatingStars {
144− anchors.right: parent.right
145− anchors.verticalCenter: parent.verticalCenter
146− }
147− }
148−
149− ListItems.ThinDivider { }
150−
151− Reviews {
152− id: appReviews
153− objectName: "appReviews"
154−
155− anchors { left: parent.left; right: parent.right }
156−
157− model: root.previewData.infoMap["comments"] ? root.previewData.infoMap["comments"].value : undefined
158−
159− onSendReview: root.sendUserReview(review);
160−
161− onEditing: {
162− root.ensureVisible(appReviews.textArea);
163− }
164− }
165− }
166− }
167−}
qml/Dash/Apps/DashPluginFilterGrid.qmldeleted−47
@@ -1,47 +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 "../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− filtergrid.clicked(index, tile.y)
41− }
42−
43− onPressAndHold: {
44− filtergrid.pressAndHold(index, tile.y)
45− }
46− }
47−}
qml/Dash/Apps/FrequentlyUsedAppsModel.qmldeleted−110
@@ -1,110 +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−
19−ListModel {
20− ListElement {
21− uri: "application://dialer-app.desktop"
22− icon: "../../graphics/applicationIcons/phone-app.png"
23− category: 0
24− mimetype: "application/x-desktop"
25− title: "Dialer"
26− comment: ""
27− dndUri: "file:///usr/share/applications/dialer-app.desktop"
28− metadata: "subscope:applications.scope/applications-non-click.scope"
29− }
30− ListElement {
31− uri: "application://messaging-app.desktop"
32− icon: "../../graphics/applicationIcons/messages-app.png"
33− category: 0
34− mimetype: "application/x-desktop"
35− title: "Messaging"
36− comment: ""
37− dndUri: "file:///usr/share/applications/messaging-app.desktop"
38− metadata: "subscope:applications.scope/applications-non-click.scope"
39− }
40− ListElement {
41− uri: "application://address-book-app.desktop"
42− icon: "../../graphics/applicationIcons/contacts-app.png"
43− category: 0
44− mimetype: "application/x-desktop"
45− title: "Contacts"
46− comment: ""
47− dndUri: "file:///usr/share/applications/address-book-app.desktop"
48− metadata: "subscope:applications.scope/applications-non-click.scope"
49− }
50− ListElement {
51− uri: "appid://com.ubuntu.camera/camera/current-user-version"
52− icon: "../../graphics/applicationIcons/camera.png"
53− category: 0
54− mimetype: "application/x-desktop"
55− title: "Camera"
56− comment: ""
57− dndUri: "appid://com.ubuntu.camera/camera/current-user-version"
58− metadata: "subscope:applications.scope/applications-click.scope?app_id=com.ubuntu.camera"
59− }
60− ListElement {
61− uri: "appid://com.ubuntu.gallery/gallery/current-user-version"
62− icon: "../../graphics/applicationIcons/gallery.png"
63− category: 0
64− mimetype: "application/x-desktop"
65− title: "Gallery"
66− comment: ""
67− dndUri: "appid://com.ubuntu.gallery/gallery/current-user-version"
68− metadata: "subscope:applications.scope/applications-click.scope?app_id=com.ubuntu.gallery"
69− }
70− ListElement {
71− uri: "appid://com.ubuntu.developer.webapps.webapp-facebook/webapp-facebook/current-user-version"
72− icon: "../../graphics/applicationIcons/facebook.png"
73− category: 0
74− mimetype: "application/x-desktop"
75− title: "Facebook"
76− comment: ""
77− dndUri: "appid://com.ubuntu.developer.webapps.webapp-facebook/webapp-facebook/current-user-version"
78− metadata: "subscope:applications.scope/applications-click.scope?app_id=com.ubuntu.developer.webapps.webapp-facebook"
79− }
80− ListElement {
81− uri: "application://webbrowser-app.desktop"
82− icon: "../../graphics/applicationIcons/browser.png"
83− category: 0
84− mimetype: "application/x-desktop"
85− title: "Browser"
86− comment: ""
87− dndUri: "file:///usr/share/applications/webbrowser-app.desktop"
88− metadata: "subscope:applications.scope/applications-non-click.scope"
89− }
90− ListElement {
91− uri: "appid://com.ubuntu.developer.webapps.webapp-gmail/webapp-gmail/current-user-version"
92− icon: "../../graphics/applicationIcons/gmail.png"
93− category: 0
94− mimetype: "application/x-desktop"
95− title: "GMail"
96− comment: ""
97− dndUri: "appid://com.ubuntu.developer.webapps.webapp-gmail/webapp-gmail/current-user-version"
98− metadata: "subscope:applications.scope/applications-click.scope?app_id=com.ubuntu.developer.webapps.webapp-gmail"
99− }
100− ListElement {
101− uri: "application://ubuntu-system-settings.desktop"
102− icon: "../../graphics/applicationIcons/system-settings.png"
103− category: 0
104− mimetype: "application/x-desktop"
105− title: "System Settings"
106− comment: ""
107− dndUri: "file:///usr/share/applications/ubuntu-system-settings.desktop"
108− metadata: "subscope:applications.scope/applications-non-click.scope"
109− }
110−}
qml/Dash/Apps/RunningApplicationTile.qml+16−27
@@ -23,7 +23,6 @@ import "../../Components/ListItems"
2323AbstractButton {
2424 id: root
2525 property var application
26− property bool __sideStageEnabled: shell.applicationManager.sideStageEnabled
2726
2827 signal requestedApplicationActivation(var application)
2928 signal requestedApplicationTermination(var application)
@@ -34,7 +33,7 @@ AbstractButton {
3433 // To avoid "binding loop" warning
3534 height: shapedApplicationImage.height + labelContainer.height
3635
37− width: shapedApplicationImage.width
36+ width: shapedApplicationImage.width <= units.gu(11) ? units.gu(11) : height
3837
3938 property bool terminationModeEnabled: false
4039
@@ -51,32 +50,23 @@ AbstractButton {
5150 }
5251 }
5352
54− function updateScreenshotFromCache() {
55− applicationImage.updateFromCache();
56− }
57−
58− // FIXME: should use UbuntuShape from SDK
59− UbuntuShapeForItem {
53+ UbuntuShape {
6054 id: shapedApplicationImage
61− anchors {
62− top: parent.top
63− horizontalCenter: parent.horizontalCenter
64− }
55+ anchors { top: parent.top; horizontalCenter: parent.horizontalCenter }
6556
66− // FIXME: width and height should be defined according to the
67− // application window's aspect ratio.
68− width: (application.stage === ApplicationInfo.MainStage && __sideStageEnabled) ?
69− units.gu(22) : units.gu(11)
70− height: (__sideStageEnabled) ? units.gu(22) : units.gu(19)
57+ height: units.gu(17)
58+ width: applicationImage.width
7159 radius: "medium"
72− image: applicationImage
73− }
7460
75− ApplicationImage {
76− id: applicationImage
77− source: ApplicationManager.findApplication((application) ? application.appId : "")
78− width: shapedApplicationImage.width
79− height: shapedApplicationImage.height
61+ image: Image {
62+ id: applicationImage
63+ source: application.screenshot
64+ // height : width = ss.height : ss.width
65+ height: shapedApplicationImage.height
66+ fillMode: Image.PreserveAspectCrop
67+ width: Math.min(height, height * sourceSize.width / sourceSize.height)
68+ }
69+
8070 }
8171
8272 UbuntuShape {
@@ -108,10 +98,9 @@ AbstractButton {
10898 }
10999 text: (application) ? application.name : ""
110100
111− color: Theme.palette.selected.backgroundText
101+ // TODO karni: Update Ubuntu.Components.Themes.Palette and use theme color instead
102+ color: "grey"
112103 opacity: 0.9
113− style: Text.Raised
114− styleColor: "black"
115104 fontSize: "small"
116105 elide: Text.ElideMiddle
117106 horizontalAlignment: Text.AlignHCenter
qml/Dash/Apps/RunningApplicationsGrid.qml+5−20
@@ -18,6 +18,7 @@ import QtQuick 2.0
1818import "../../Components"
1919
2020import Ubuntu.Gestures 0.1
21+import Unity.Application 0.1
2122
2223ResponsiveFlowView {
2324 id: root
@@ -25,13 +26,7 @@ ResponsiveFlowView {
2526
2627 signal updateScreenshots
2728 property alias enableHeightBehavior: heightBehaviour.enabled
28− property bool enableHeightBehaviorOnNextCreation: firstModel.count + secondModel.count == 0
29−
30− Connections {
31− target: shell
32− onDashShownChanged: if (shell.dashShown && shell.stageScreenshotsReady) updateScreenshots();
33− onStageScreenshotsReadyChanged: if (shell.dashShown && shell.stageScreenshotsReady) updateScreenshots();
34− }
29+ property bool enableHeightBehaviorOnNextCreation: model.count === 0
3530
3631 Behavior on height {
3732 id: heightBehaviour
@@ -40,13 +35,7 @@ ResponsiveFlowView {
4035 }
4136
4237 Connections {
43− target: root.firstModel
44− onCountChanged: {
45− heightBehaviour.enabled = true;
46− }
47− }
48− Connections {
49− target: root.secondModel
38+ target: root.model
5039 onCountChanged: {
5140 heightBehaviour.enabled = true;
5241 }
@@ -85,17 +74,13 @@ ResponsiveFlowView {
8574 root.terminationModeEnabled = true
8675 }
8776 onRequestedApplicationTermination: {
88− shell.applicationManager.stopApplication(model.appId)
77+ ApplicationManager.stopApplication(model.appId)
8978 }
9079 onRequestedApplicationActivation: {
91− shell.activateApplication(model.appId)
80+ ApplicationManager.requestFocusApplication(model.appId)
9281 }
9382
9483 terminationModeEnabled: root.terminationModeEnabled
95−
96− Component.onCompleted: {
97− root.updateScreenshots.connect(updateScreenshotFromCache);
98− }
9984 }
10085 }
10186
qml/Dash/Card.qml+43−14
@@ -16,8 +16,10 @@
1616
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
19+// For image://albumart and image://thumbnailer image providers
20+import Ubuntu.Thumbnailer 0.1
1921
20−Item {
22+AbstractButton {
2123 id: root
2224 property var template
2325 property var components
@@ -25,7 +27,8 @@ Item {
2527
2628 property alias fontScale: header.fontScale
2729 property alias headerAlignment: header.headerAlignment
28− readonly property alias headerHeight: header.height
30+ property alias headerHeight: header.height
31+ readonly property alias title: header.title
2932
3033 property bool showHeader: true
3134
@@ -44,6 +47,8 @@ Item {
4447 anchors.fill: parent
4548 image: backgroundImage.source ? backgroundImage : null
4649
50+ property real luminance: 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b
51+
4752 property Image backgroundImage: Image {
4853 objectName: "backgroundImage"
4954 source: {
@@ -68,31 +73,50 @@ Item {
6873 id: artShape
6974 radius: "medium"
7075 objectName: "artShape"
71− width: {
72− if (!visible) return 0
73− return image.fillMode === Image.PreserveAspectCrop || aspect < image.aspect ? image.width : height * image.aspect
74− }
75− height: {
76− if (!visible) return 0
77− return image.fillMode === Image.PreserveAspectCrop || aspect > image.aspect ? image.height : width / image.aspect
78− }
7976 anchors.horizontalCenter: template && template["card-layout"] === "horizontal" ? undefined : parent.horizontalCenter
8077 anchors.left: template && template["card-layout"] === "horizontal" ? parent.left : undefined
8178 visible: cardData && cardData["art"] || false
8279
83− property real aspect: components !== undefined ? components["art"]["aspect-ratio"] : 1
80+ readonly property real aspect: components !== undefined ? components["art"]["aspect-ratio"] : 1
81+ readonly property bool aspectSmallerThanImageAspect: aspect < image.aspect
82+
83+ Component.onCompleted: updateWidthHeightBindings();
84+ onAspectSmallerThanImageAspectChanged: updateWidthHeightBindings();
85+
86+ function updateWidthHeightBindings() {
87+ if (aspectSmallerThanImageAspect) {
88+ width = Qt.binding(function() { return !visible ? 0 : image.width });
89+ height = Qt.binding(function() { return !visible ? 0 : image.fillMode === Image.PreserveAspectCrop ? image.height : width / image.aspect });
90+ } else {
91+ width = Qt.binding(function() { return !visible ? 0 : image.fillMode === Image.PreserveAspectCrop ? image.width : height * image.aspect });
92+ height = Qt.binding(function() { return !visible ? 0 : image.height });
93+ }
94+ }
8495
8596 image: Image {
86− width: template && template["card-layout"] === "horizontal" ? height * artShape.aspect : root.width
87− height: template && template["card-layout"] === "horizontal" ? header.height : width / artShape.aspect
8897 objectName: "artImage"
8998 source: cardData && cardData["art"] || ""
99+ cache: true
90100 // FIXME uncomment when having investigated / fixed the crash
91101 //sourceSize.width: width > height ? width : 0
92102 //sourceSize.height: height > width ? height : 0
93103 fillMode: components && components["art"]["fill-mode"] === "fit" ? Image.PreserveAspectFit: Image.PreserveAspectCrop
94104
95− property real aspect: implicitWidth / implicitHeight
105+ readonly property real aspect: implicitWidth / implicitHeight
106+ readonly property bool isHorizontal: template && template["card-layout"] === "horizontal"
107+
108+ Component.onCompleted: updateWidthHeightBindings();
109+ onIsHorizontalChanged: updateWidthHeightBindings();
110+
111+ function updateWidthHeightBindings() {
112+ if (isHorizontal) {
113+ width = Qt.binding(function() { return height * artShape.aspect });
114+ height = Qt.binding(function() { return header.height });
115+ } else {
116+ width = Qt.binding(function() { return root.width });
117+ height = Qt.binding(function() { return width / artShape.aspect });
118+ }
119+ }
96120 }
97121 }
98122
@@ -163,6 +187,9 @@ Item {
163187 titleWeight: components && components["subtitle"] ? Font.DemiBold : Font.Normal
164188
165189 opacity: showHeader ? 1 : 0
190+ inOverlay: root.template && root.template["overlay"] === true
191+ fontColor: inOverlay ? "white" : summary.color
192+ useMascotShape: !background.visible && !inOverlay
166193
167194 Behavior on opacity { NumberAnimation { duration: UbuntuAnimation.SnapDuration } }
168195 }
@@ -183,5 +210,7 @@ Item {
183210 text: cardData && cardData["summary"] || ""
184211 height: text ? implicitHeight : 0
185212 fontSize: "small"
213+ // TODO karni: Change "grey" to Ubuntu.Components.Palette color once updated.
214+ color: background.visible && background.luminance < 0.7 ? "white" : "grey"
186215 }
187216}
qml/Dash/DashCarousel.qml → qml/Dash/CardCarousel.qmlrenamed+30−8
@@ -18,8 +18,9 @@ import QtQuick 2.0
1818import Ubuntu.Components 0.1
1919import "../Components"
2020
21+
2122DashRenderer {
22− id: dashCarousel
23+ id: cardCarousel
2324
2425 property alias cacheBuffer: carousel.cacheBuffer
2526 property alias itemComponent: carousel.itemComponent
@@ -34,14 +35,35 @@ DashRenderer {
3435 Carousel {
3536 id: carousel
3637 anchors.fill: parent
37− tileAspectRatio: 198 / 288
38− minimumTileWidth: units.gu(13)
39− selectedItemScaleFactor: 1.14
38+ tileAspectRatio: cardCarousel.components && cardCarousel.components["art"]["aspect-ratio"] || 1.0
39+ // FIXME we need to "reverse" the carousel to make the selected item the size
40+ // and push others back.
41+ minimumTileWidth: cardTool.cardWidth / selectedItemScaleFactor
42+ selectedItemScaleFactor: cardTool.carouselSelectedItemScaleFactor
4043 cacheBuffer: 1404 // 18px * 13gu * 6
41− model: dashCarousel.model
42− highlightIndex: dashCarousel.highlightIndex
44+ model: cardCarousel.model
45+
46+ onClicked: cardCarousel.clicked(index, itemY)
47+ onPressAndHold: cardCarousel.pressAndHold(index, itemY)
48+
49+ property real fontScale: 1 / selectedItemScaleFactor
50+ property real headerHeight: cardTool.headerHeight / selectedItemScaleFactor
51+
52+ itemComponent: Card {
53+ id: card
54+ objectName: "carouselDelegate" + index
55+ headerHeight: carousel.headerHeight
56+ cardData: model
57+ template: cardTool.template
58+ components: cardTool.components
59+
60+ property bool explicitlyScaled
61+ property var model
62+
63+ enabled: false
64+ showHeader: explicitlyScaled
4365
44− onClicked: dashCarousel.clicked(index, itemY)
45− onPressAndHold: dashCarousel.pressAndHold(index, itemY)
66+ fontScale: carousel.fontScale
67+ }
4668 }
4769}
qml/Dash/CardFilterGrid.qmlnew file+73
@@ -0,0 +1,73 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import "../Components"
19+
20+DashRenderer {
21+ id: genericFilterGrid
22+
23+ expandable: filterGrid.expandable
24+ collapsedHeight: filterGrid.collapsedHeight
25+ margins: filterGrid.margins
26+ uncollapsedHeight: filterGrid.uncollapsedHeight
27+ verticalSpacing: units.gu(1)
28+ currentItem: filterGrid.currentItem
29+ height: filterGrid.height
30+
31+ function startFilterAnimation(filter) {
32+ filterGrid.startFilterAnimation(filter)
33+ }
34+
35+ FilterGrid {
36+ id: filterGrid
37+ width: genericFilterGrid.width
38+ minimumHorizontalSpacing: units.gu(1)
39+ delegateWidth: cardTool.cardWidth
40+ delegateHeight: cardTool.cardHeight
41+ verticalSpacing: genericFilterGrid.verticalSpacing
42+ model: genericFilterGrid.model
43+ filter: genericFilterGrid.filter
44+ collapsedRowCount: Math.min(2, cardTool && cardTool.template && cardTool.template["collapsed-rows"] || 2)
45+ delegateCreationBegin: genericFilterGrid.delegateCreationBegin
46+ delegateCreationEnd: genericFilterGrid.delegateCreationEnd
47+ delegate: Item {
48+ width: filterGrid.cellWidth
49+ height: filterGrid.cellHeight
50+ Card {
51+ id: card
52+ width: cardTool.cardWidth
53+ height: cardTool.cardHeight
54+ headerHeight: cardTool.headerHeight
55+ anchors.horizontalCenter: parent.horizontalCenter
56+ objectName: "delegate" + index
57+ cardData: model
58+ template: cardTool.template
59+ components: cardTool.components
60+
61+ headerAlignment: cardTool.headerAlignment
62+
63+ onClicked: genericFilterGrid.clicked(index, card.y)
64+ onPressAndHold: genericFilterGrid.pressAndHold(index, card.y)
65+ }
66+ }
67+
68+ onFilterChanged: {
69+ genericFilterGrid.filter = filter
70+ filter = Qt.binding(function() { return genericFilterGrid.filter })
71+ }
72+ }
73+}
qml/Dash/CardHeader.qml+32−60
@@ -22,18 +22,20 @@ Item {
2222 property alias mascot: mascotImage.source
2323 property alias title: titleLabel.text
2424 property alias subtitle: subtitleLabel.text
25− property alias price: priceLabel.text
26− property alias oldPrice: oldPriceLabel.text
27− property alias altPrice: altPriceLabel.text
2825
2926 property alias titleWeight: titleLabel.font.weight
27+ property alias titleSize: titleLabel.fontSize
3028
3129 // FIXME: Saviq, used to scale fonts down in Carousel
3230 property real fontScale: 1.0
3331
3432 property alias headerAlignment: titleLabel.horizontalAlignment
3533
36− visible: mascotImage.status === Image.Ready || title || price
34+ property bool inOverlay: false
35+ property bool useMascotShape: true
36+ property color fontColor: Theme.palette.selected.backgroundText
37+
38+ visible: mascotImage.status === Image.Ready || title
3739 height: row.height > 0 ? row.height + row.margins * 2 : 0
3840
3941 Row {
@@ -42,13 +44,13 @@ Item {
4244
4345 property real margins: units.gu(1)
4446
47+ spacing: mascotShape.visible || mascotImage.visible || inOverlay ? margins : 0
4548 anchors {
4649 top: parent.top; left: parent.left; right: parent.right
4750 margins: margins
4851 leftMargin: spacing
4952 rightMargin: spacing
5053 }
51− spacing: mascotShape.visible || (template && template["overlay"]) ? margins : 0
5254
5355 UbuntuShape {
5456 id: mascotShape
@@ -57,35 +59,45 @@ Item {
5759 // TODO karni: Icon aspect-ratio is 8:7.5. Revisit these values to avoid fraction of pixels.
5860 width: units.gu(6)
5961 height: units.gu(5.625)
60− visible: image.status === Image.Ready
61− readonly property int maxSize: Math.max(width, height)
62+ anchors.verticalCenter: parent.verticalCenter
63+ visible: useMascotShape && image && image.status === Image.Ready
64+ readonly property int maxSize: Math.max(width, height) * 4
6265
63− image: Image {
64− id: mascotImage
66+ image: useMascotShape ? mascotImage : null
67+ }
6568
66− sourceSize { width: mascotShape.maxSize; height: mascotShape.maxSize }
67− fillMode: Image.PreserveAspectCrop
68− horizontalAlignment: Image.AlignHCenter
69− verticalAlignment: Image.AlignVCenter
70− }
69+ Image {
70+ id: mascotImage
71+ objectName: "mascotImage"
72+
73+ width: source ? mascotShape.width : 0
74+ height: mascotShape.height
75+ anchors.verticalCenter: parent.verticalCenter
76+ visible: !useMascotShape && status === Image.Ready
77+
78+ sourceSize { width: mascotShape.maxSize; height: mascotShape.maxSize }
79+ fillMode: Image.PreserveAspectCrop
80+ horizontalAlignment: Image.AlignHCenter
81+ verticalAlignment: Image.AlignVCenter
7182 }
7283
7384 Column {
7485 objectName: "column"
7586 width: parent.width - x
76− spacing: units.gu(0.5)
87+ spacing: units.dp(2)
88+ anchors.verticalCenter: parent.verticalCenter
7789
7890 Label {
7991 id: titleLabel
8092 objectName: "titleLabel"
8193 anchors { left: parent.left; right: parent.right }
8294 elide: Text.ElideRight
83− font.weight: Font.DemiBold
95+ font.weight: Font.Normal
96+ fontSize: "small"
8497 wrapMode: Text.Wrap
8598 maximumLineCount: 2
86− fontSize: "small"
8799 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale)
88− color: template["overlay"] === true ? "white" : Theme.palette.selected.backgroundText
100+ color: fontColor
89101 }
90102
91103 Label {
@@ -93,51 +105,11 @@ Item {
93105 objectName: "subtitleLabel"
94106 anchors { left: parent.left; right: parent.right }
95107 elide: Text.ElideRight
108+ fontSize: "small"
96109 font.weight: Font.Light
97110 visible: titleLabel.text && text
98− fontSize: "x-small"
99111 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale)
100− color: template["overlay"] === true ? "white" : Theme.palette.selected.backgroundText
101− }
102−
103− Row {
104− id: prices
105− objectName: "prices"
106− anchors { left: parent.left; right: parent.right }
107−
108− property int labels: {
109− var labels = 1; // price always visible
110− if (oldPriceLabel.text !== "") labels += 1;
111− if (altPriceLabel.text !== "") labels += 1;
112− return labels;
113− }
114− property real labelWidth: width / labels
115−
116− Label {
117− id: priceLabel
118− width: parent.labelWidth
119− elide: Text.ElideRight
120− font.weight: Font.DemiBold
121− color: Theme.palette.selected.foreground
122− visible: text
123− }
124−
125− Label {
126− id: oldPriceLabel
127− objectName: "oldPriceLabel"
128− width: parent.labelWidth
129− elide: Text.ElideRight
130− horizontalAlignment: parent.labels === 3 ? Text.AlignHCenter : Text.AlignRight
131− visible: text
132− }
133−
134− Label {
135− id: altPriceLabel
136− width: parent.labelWidth
137− elide: Text.ElideRight
138− horizontalAlignment: Text.AlignRight
139− visible: text
140− }
112+ color: fontColor
141113 }
142114 }
143115 }
qml/Dash/CardTool.qml+47−9
@@ -28,6 +28,22 @@ import QtQuick 2.0
2828
2929Item {
3030 id: cardTool
31+
32+ /*!
33+ \brief Number of cards.
34+ */
35+ property int count
36+
37+ /*!
38+ \brief Width of the category view.
39+ */
40+ property real viewWidth
41+
42+ /*!
43+ \brief Scaling factor of selected Carousel item.
44+ */
45+ readonly property real carouselSelectedItemScaleFactor: 1.38 // XXX assuming 1.38 carousel scaling factor for cards
46+
3147 /*!
3248 \brief Template supplied for the category.
3349 */
@@ -39,9 +55,15 @@ Item {
3955 property var components
4056
4157 /*!
42− \brief Width of the view, based on which carousel width is calculated.
58+ \brief The category layout for this card tool.
4359 */
44− property var viewWidth
60+ property string categoryLayout: {
61+ var layout = template["category-layout"];
62+
63+ // carousel fallback mode to grid
64+ if (layout === "carousel" && count <= Math.ceil(carouselTool.realPathItemCount)) layout = "grid";
65+ return layout;
66+ }
4567
4668 // FIXME: Saviq
4769 // Only way for the card below to actually be laid out completely.
@@ -56,7 +78,7 @@ Item {
5678 If undefined, should use implicit width of the actual card.
5779 */
5880 readonly property var cardWidth: {
59− switch (template !== undefined && template["category-layout"]) {
81+ switch (categoryLayout) {
6082 case "grid":
6183 case "vertical-journal":
6284 if (template["card-layout"] === "horizontal") return units.gu(38);
@@ -66,10 +88,7 @@ Item {
6688 }
6789 return units.gu(18.5);
6890 case "carousel":
69− if (viewWidth === undefined) return undefined
70− if (viewWidth <= units.gu(40)) return units.gu(18)
71− if (viewWidth >= units.gu(128)) return units.gu(26)
72− return units.gu(18 + Math.round((viewWidth - units.gu(40))/ units.gu(11)))
91+ return carouselTool.minimumTileWidth;
7392 case undefined:
7493 case "organic-grid":
7594 case "journal":
@@ -84,7 +103,7 @@ Item {
84103 If undefined, should use implicit height of the actual card.
85104 */
86105 readonly property var cardHeight: {
87− switch (template !== undefined && template["category-layout"]) {
106+ switch (categoryLayout) {
88107 case "journal":
89108 if (template["card-size"] >= 12 && template["card-size"] <= 38) return units.gu(template["card-size"]);
90109 return units.gu(18.5);
@@ -123,9 +142,28 @@ Item {
123142 return (template["card-layout"] === "horizontal") ? Text.AlignLeft : Text.AlignHCenter;
124143 }
125144
145+ QtObject {
146+ id: carouselTool
147+
148+ property real minimumTileWidth: {
149+ if (cardTool.viewWidth === undefined) return undefined;
150+ if (cardTool.viewWidth <= units.gu(40)) return units.gu(18);
151+ if (cardTool.viewWidth >= units.gu(128)) return units.gu(26);
152+ return units.gu(18 + Math.round((cardTool.viewWidth - units.gu(40)) / units.gu(11)));
153+ }
154+
155+ readonly property real pathItemCount: 4.8457 /// (848 / 175) reference values
156+
157+ property real realPathItemCount: {
158+ var scaledMinimumTileWidth = minimumTileWidth / cardTool.carouselSelectedItemScaleFactor;
159+ var tileWidth = Math.max(cardTool.viewWidth / pathItemCount, scaledMinimumTileWidth);
160+ return Math.min(cardTool.viewWidth / tileWidth, pathItemCount);
161+ }
162+ }
163+
126164 Card {
127165 id: card
128− objectName: "card"
166+ objectName: "cardToolCard"
129167 template: cardTool.template
130168 components: cardTool.components
131169
qml/Dash/Dash.qml+57−4
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -16,7 +16,7 @@
1616
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
19−import Unity 0.1
19+import Unity 0.2
2020import Utils 0.1
2121import "../Components"
2222
@@ -27,8 +27,9 @@ Showable {
2727 visible: shown
2828
2929 property ListModel searchHistory: SearchHistoryModel {}
30+ property bool searchable: !dashContent.previewOpen && !scopeItem.previewOpen
3031
31− property string showScopeOnLoaded: "home.scope"
32+ property string showScopeOnLoaded: "clickscope"
3233 property real contentScale: 1.0
3334
3435 function setCurrentScope(scopeId, animate, reset) {
@@ -39,6 +40,10 @@ Showable {
3940 return
4041 }
4142
43+ closeOverlayScope();
44+
45+ dashContent.closePreview();
46+
4247 if (scopeIndex == dashContent.currentIndex && !reset) {
4348 // the scope is already the current one
4449 return
@@ -47,6 +52,12 @@ Showable {
4752 dashContent.setCurrentScopeAtIndex(scopeIndex, animate, reset)
4853 }
4954
55+ function closeOverlayScope() {
56+ if (dashContent.x != 0) {
57+ dashContent.x = 0;
58+ }
59+ }
60+
5061 SortFilterProxyModel {
5162 id: filteredScopes
5263 model: Scopes {
@@ -61,10 +72,19 @@ Showable {
6172 DashContent {
6273 id: dashContent
6374 objectName: "dashContent"
64− anchors.fill: parent
75+ width: parent.width
76+ height: parent.height
6577 model: filteredScopes
6678 scopes: scopes
6779 searchHistory: dash.searchHistory
80+ visible: x != -width
81+ onGotoScope: {
82+ dash.setCurrentScope(scopeId, true, false);
83+ }
84+ onOpenScope: {
85+ scopeItem.scope = scope;
86+ x = -width;
87+ }
6888 onScopeLoaded: {
6989 if (scopeId == dash.showScopeOnLoaded) {
7090 dash.setCurrentScope(scopeId, false, false)
@@ -72,6 +92,39 @@ Showable {
7292 }
7393 }
7494 scale: dash.contentScale
95+ clip: scale != 1.0 || scopeItem.visible
96+ Behavior on x {
97+ UbuntuNumberAnimation {
98+ onRunningChanged: {
99+ if (!running && dashContent.x == 0) {
100+ dashContent.closeScope(scopeItem.scope);
101+ scopeItem.scope = null;
102+ }
103+ }
104+ }
105+ }
106+ }
107+
108+ ScopeItem {
109+ id: scopeItem
110+ anchors.left: dashContent.right
111+ width: parent.width
112+ height: parent.height
113+ searchHistory: dash.searchHistory
114+ scale: dash.contentScale
75115 clip: scale != 1.0
116+ visible: scope != null
117+ onBack: {
118+ closeOverlayScope();
119+ }
120+ onGotoScope: {
121+ // TODO
122+ console.log("gotoScope from an openScope scope is not implemented");
123+ }
124+ onOpenScope: {
125+ // TODO
126+ console.log("openScope from an openScope scope is not implemented");
127+ }
128+
76129 }
77130}
qml/Dash/DashApps.qml+7−23
@@ -17,6 +17,7 @@
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
1919import Utils 0.1
20+import Unity.Application 0.1
2021import "../Components"
2122import "../Components/ListItems"
2223import "Apps"
@@ -25,32 +26,15 @@ GenericScopeView {
2526 id: scopeView
2627 objectName: "DashApps"
2728
28− // FIXME: a way to aggregate these models would be ideal
29− property var mainStageApplicationsModel: shell.applicationManager.mainStageApplications
30− property var sideStageApplicationModel: shell.applicationManager.sideStageApplications
29+ property var runningApps: ApplicationManager
3130
32− ListModel {
33− id: dummyVisibilityModifier
34−
35− ListElement { name: "running-apps" }
36− }
37−
38− SortFilterProxyModel {
39− id: runningApplicationsModel
40−
41− property var firstModel: mainStageApplicationsModel
42− property var secondModel: sideStageApplicationModel
43− property bool canEnableTerminationMode: scopeView.isCurrent
44−
45− model: dummyVisibilityModifier
46− filterRole: 0
47− filterRegExp: invertMatch ? ((mainStageApplicationsModel.count === 0 &&
48− sideStageApplicationModel.count === 0) ? RegExp("running-apps") : RegExp("")) : RegExp("disabled")
49− invertMatch: scopeView.scope.searchQuery.length == 0
31+ QtObject {
32+ id: countObject
33+ property int count: scopeView.scope.searchQuery.length == 0 ? scopeView.runningApps.count : 0
5034 }
5135
5236 onScopeChanged: {
53− scopeView.scope.categories.overrideResults("recent", runningApplicationsModel);
54− enableHeightBehaviorOnNextCreation = (mainStageApplicationsModel.count + sideStageApplicationModel.count == 0)
37+ scopeView.scope.categories.addSpecialCategory("running.apps.category", i18n.tr("Recent"), "", "{ \"template\": { \"category-layout\": \"running-apps\" } }", countObject);
38+ enableHeightBehaviorOnNextCreation = scopeView.runningApps.count === 0
5539 }
5640}
qml/Dash/DashContent.qml+75−48
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -16,7 +16,8 @@
1616
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
19−import Unity 0.1
19+import Unity 0.2
20+import Utils 0.1
2021import "../Components"
2122
2223Item {
@@ -24,7 +25,8 @@ Item {
2425
2526 property var model: null
2627 property var scopes: null
27− property alias currentIndex: dashContentList.currentIndex
28+ readonly property alias currentIndex: dashContentList.currentIndex
29+ property alias previewOpen: previewListView.open
2830
2931 property ScopeDelegateMapper scopeMapper : ScopeDelegateMapper {}
3032 property ListModel searchHistory
@@ -33,6 +35,8 @@ Item {
3335 signal movementEnded()
3436 signal scopeLoaded(string scopeId)
3537 signal positionedAtBeginning()
38+ signal gotoScope(string scopeId)
39+ signal openScope(var scope)
3640
3741 // If we set the current scope index before the scopes have been added,
3842 // then we need to wait until the loaded signals gets emitted from the scopes
@@ -48,6 +52,12 @@ Item {
4852 }
4953
5054 function setCurrentScopeAtIndex(index, animate, reset) {
55+ // if the scopes haven't loaded yet, then wait until they are.
56+ if (!scopes.loaded) {
57+ set_current_index = [ index, animate, reset ]
58+ return;
59+ }
60+
5161 var storedMoveDuration = dashContentList.highlightMoveDuration
5262 var storedMoveSpeed = dashContentList.highlightMoveVelocity
5363 if (!animate) {
@@ -55,11 +65,6 @@ Item {
5565 dashContentList.highlightMoveDuration = 0
5666 }
5767
58− // if the scopes haven't loaded yet, then wait until they are.
59− if (!scopes.loaded) {
60− set_current_index = [ index, animate, reset ]
61− return;
62− }
6368 set_current_index = undefined;
6469
6570 if (dashContentList.count > index)
@@ -77,15 +82,27 @@ Item {
7782 }
7883 }
7984
85+ function closeScope(scope) {
86+ dashContentList.currentItem.theScope.closeScope(scope)
87+ }
88+
89+ function closePreview() {
90+ previewListView.open = false;
91+ }
92+
8093 Item {
8194 id: dashContentListHolder
82− anchors.fill: parent
95+
96+ x: previewListView.open ? -width : 0
97+ Behavior on x { UbuntuNumberAnimation { } }
98+ width: parent.width
99+ height: parent.height
83100
84101 ListView {
85102 id: dashContentList
86103 objectName: "dashContentList"
87104
88− interactive: dashContent.scopes.loaded && !previewListView.onScreen && !currentItem.moving
105+ interactive: dashContent.scopes.loaded && !previewListView.open && currentItem && !currentItem.moving
89106
90107 anchors.fill: parent
91108 model: dashContent.model
@@ -100,6 +117,7 @@ Item {
100117 cacheBuffer: 1073741823
101118 onMovementStarted: dashContent.movementStarted()
102119 onMovementEnded: dashContent.movementEnded()
120+ clip: parent.x != 0
103121
104122 // If the number of items is less than the current index, then need to reset to another item.
105123 onCountChanged: {
@@ -108,7 +126,7 @@ Item {
108126 dashContent.setCurrentScopeAtIndex(count-1, true, true)
109127 } else if (currentIndex < 0) {
110128 // setting currentIndex directly, cause we don't want to loose set_current_index
111− dashContent.currentIndex = 0
129+ dashContentList.currentIndex = 0
112130 }
113131 }
114132 }
@@ -131,81 +149,90 @@ Item {
131149 readonly property bool isLoaded: status == Loader.Ready
132150
133151 onLoaded: {
152+ item.objectName = scope.id
153+ item.pageHeader = dashPageHeader;
154+ item.previewListView = previewListView;
134155 item.scope = Qt.binding(function() { return scope })
135156 item.isCurrent = Qt.binding(function() { return visible && ListView.isCurrentItem })
136− item.tabBarHeight = pageHeader.implicitHeight;
137− item.pageHeader = pageHeader;
138− item.openEffect = openEffect;
139− item.previewListView = previewListView;
157+ item.tabBarHeight = dashPageHeader.implicitHeight;
140158 dashContentList.movementStarted.connect(item.movementStarted)
141159 dashContent.positionedAtBeginning.connect(item.positionedAtBeginning)
142160 dashContent.scopeLoaded(item.scope.id)
143161 }
162+ Connections {
163+ target: isCurrent ? scope : null
164+ onGotoScope: {
165+ // Note here scopeId is the signal parameter and not the loader property
166+ dashContent.gotoScope(scopeId);
167+ }
168+ onOpenScope: {
169+ dashContent.openScope(scope);
170+ }
171+ }
144172
145173 Component.onDestruction: active = false
146174 }
147175 }
148176
149177 PageHeader {
150− id: pageHeader
178+ id: dashPageHeader
151179 objectName: "pageHeader"
152180 width: parent.width
153181 searchEntryEnabled: true
154182 searchHistory: dashContent.searchHistory
155− scope: dashContentList.currentItem.theScope
183+ scope: dashContentList.currentItem && dashContentList.currentItem.theScope
156184
157185 childItem: TabBar {
158186 id: tabBar
159187 objectName: "tabbar"
160− height: units.gu(7)
188+ height: units.gu(6.5)
161189 width: parent.width
162− selectionMode: false
163190 style: DashContentTabBarStyle {}
164191
165− model: dashContentList.model
166−
167− onSelectedIndexChanged: {
168− dashContentList.currentIndex = selectedIndex;
192+ SortFilterProxyModel {
193+ id: tabBarModel
194+
195+ model: dashContentList.model
196+
197+ property int selectedIndex: -1
198+ onSelectedIndexChanged: {
199+ if (dashContentList.currentIndex == -1 && tabBar.selectedIndex != -1) {
200+ // TODO This together with the Timer below
201+ // are a workaround for the first tab sometimes not showing the text.
202+ // But Tabs are going away in the future so not sure if makes
203+ // sense invetigating what's the problem at this stage
204+ selectionModeTimer.restart();
205+ }
206+ dashContentList.currentIndex = selectedIndex;
207+ }
169208 }
170209
210+ model: tabBarModel.count > 0 ? tabBarModel : null
211+
171212 Connections {
172213 target: dashContentList
173214 onCurrentIndexChanged: {
174− tabBar.selectedIndex = dashContentList.currentIndex
215+ tabBarModel.selectedIndex = dashContentList.currentIndex
175216 }
176217 }
177218
178− Connections {
179− target: model
180− onCountChanged: {
181− if (tabBar.selectedIndex < 0 && model.count > 0)
182− tabBar.selectedIndex = 0;
183− }
184− }
185−
186− Component.onCompleted: {
187− __styleInstance.headerTextStyle = Text.Raised
188− __styleInstance.headerTextStyleColor = "black"
219+ Timer {
220+ id: selectionModeTimer
221+ interval: 1
222+ onTriggered: tabBar.selectionMode = false
189223 }
190224 }
191225 }
192226 }
193227
194− DashContentOpenEffect {
195− id: openEffect
196− anchors {
197− fill: parent
198− bottomMargin: -bottomOverflow
199− }
200− sourceItem: dashContentListHolder
201− previewListView: previewListView
202− }
203−
204228 PreviewListView {
205229 id: previewListView
206− openEffect: openEffect
207− categoryView: dashContentList.currentItem ? dashContentList.currentItem.categoryView : null
230+ objectName: "dashContentPreviewList"
231+ visible: x != width
208232 scope: dashContentList.currentItem ? dashContentList.currentItem.theScope : null
209− anchors.fill: parent
233+ pageHeader: dashPageHeader
234+ width: parent.width
235+ height: parent.height
236+ anchors.left: dashContentListHolder.right
210237 }
211238}
qml/Dash/DashContentOpenEffect.qmldeleted−57
@@ -1,57 +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−
21−OpenEffect {
22− property PreviewListView previewListView: null
23−
24− objectName: "openEffect"
25− anchors {
26− fill: parent
27− bottomMargin: -bottomOverflow
28− }
29−
30− enabled: gap > 0.0
31−
32− topGapPx: (1 - gap) * positionPx
33− topOpacity: (1 - gap * 1.2)
34− bottomGapPx: positionPx + gap * (targetBottomGapPx - positionPx)
35− bottomOverflow: units.gu(20)
36− live: !expansionAnimation.running
37−
38− property int targetBottomGapPx: height - units.gu(8) - bottomOverflow
39− property real gap: previewListView.open ? 1.0 : 0.0
40−
41− Behavior on gap {
42− NumberAnimation {
43− id: expansionAnimation
44− duration: 200
45− easing.type: Easing.InOutQuad
46− onRunningChanged: {
47− if (!previewListView.open && !running) {
48− previewListView.onScreen = false
49− }
50− }
51− }
52− }
53− Behavior on positionPx {
54− enabled: previewListView.open
55− UbuntuNumberAnimation {}
56− }
57−}
qml/Dash/DashContentTabBarStyle.qml+3
@@ -18,4 +18,7 @@ import Ubuntu.Components.Themes.Ambiance 0.1
1818
1919TabBarStyle {
2020 indicatorImageSource: "graphics/tabbarchevron.png"
21+ // TODO karni: These should come from updated Ubuntu Palette.
22+ headerTextColor: "#88888888"
23+ headerTextSelectedColor: "#888888"
2124}
qml/Dash/DashFilterGrid.qmldeleted−65
@@ -1,65 +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 "../Components"
19−import ".."
20−
21−DashRenderer {
22− id: dashFilterGrid
23−
24− property alias cellWidth: filterGrid.cellWidth
25− property alias cellHeight: filterGrid.cellHeight
26− property alias delegate: filterGrid.delegate
27− property alias delegateWidth: filterGrid.delegateWidth
28− property alias delegateHeight: filterGrid.delegateHeight
29− property alias maximumNumberOfColumns: filterGrid.maximumNumberOfColumns
30− property alias minimumHorizontalSpacing: filterGrid.minimumHorizontalSpacing
31−
32− collapsedHeight: filterGrid.collapsedHeight
33− collapsedRowCount: filterGrid.collapsedRowCount
34− columns: filterGrid.columns
35− rows: filter ? filterGrid.collapsedRowCount : filterGrid.uncollapsedRowCount
36− currentItem: filterGrid.currentItem
37− expandable: filterGrid.expandable
38− height: filterGrid.height
39− margins: filterGrid.margins
40− uncollapsedHeight: filterGrid.uncollapsedHeight
41− verticalSpacing: filterGrid.verticalSpacing
42−
43− function startFilterAnimation(filter) {
44− filterGrid.startFilterAnimation(filter)
45− }
46−
47− FilterGrid {
48− id: filterGrid
49− width: dashFilterGrid.width
50− minimumHorizontalSpacing: units.gu(0.5)
51− delegateWidth: units.gu(11)
52− delegateHeight: units.gu(9.5)
53− verticalSpacing: units.gu(2)
54− model: dashFilterGrid.model
55− filter: dashFilterGrid.filter
56− highlightIndex: dashFilterGrid.highlightIndex
57− delegateCreationBegin: dashFilterGrid.delegateCreationBegin
58− delegateCreationEnd: dashFilterGrid.delegateCreationEnd
59−
60− onFilterChanged: {
61− dashFilterGrid.filter = filter
62− filter = Qt.binding(function() { return dashFilterGrid.filter })
63− }
64− }
65−}
qml/Dash/DashHome.qmldeleted−39
@@ -1,39 +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 Utils 0.1
20−import "../Components"
21−import "../Components/ListItems"
22−import "Apps"
23−
24−GenericScopeView {
25− id: root
26− objectName: "DashHome"
27−
28− SearchableResultModel {
29− id: appsModel
30−
31− model: FrequentlyUsedAppsModel {}
32− filterRole: 3
33− searchQuery: root.scope.searchQuery
34− }
35−
36− onScopeChanged: {
37− root.scope.categories.overrideResults("applications.scope", appsModel);
38− }
39−}
qml/Dash/DashPreview.qmldeleted−208
@@ -1,208 +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−
20−Item {
21− id: root
22−
23− property int keyboardSize: Qt.inputMethod.visible ? Qt.inputMethod.keyboardRectangle.height : 0
24− property var previewData
25− property alias showProcessingAction: waitingForActionMouseArea.enabled
26−
27− property real previewWidthRatio: 0.5
28− property bool isCurrent: false
29−
30− property Component previewImages
31− property Component header
32− property Component actions
33− property Component description
34− property Component ratings
35−
36− readonly property bool narrowMode: width <= height * 1.5
37− readonly property int columnWidth: narrowMode ? contentRow.width : (contentRow.width / 3) - contentRow.spacing
38− readonly property int contentSpacing: units.gu(3)
39−
40− clip: true
41−
42− function ensureVisible(item) {
43− var o = leftFlickable.mapFromItem(item, 0, 0, item.width, item.height);
44− var keyboardY = shell.height - root.keyboardSize;
45− if ((o.y + o.height) > keyboardY) {
46− leftFlickable.contentY += o.y + o.height - keyboardY;
47− }
48− }
49−
50− Connections {
51− target: shell.applicationManager
52− onMainStageFocusedApplicationChanged: {
53− root.close();
54− }
55− onSideStageFocusedApplicationChanged: {
56− root.close();
57− }
58− }
59−
60− onPreviewDataChanged: showProcessingAction = false
61−
62− MouseArea {
63− anchors.fill: parent
64− }
65−
66− Row {
67− id: contentRow
68− anchors {
69− left: parent.left
70− top: parent.top
71− right: parent.right
72− bottom: parent.bottom
73− topMargin: root.contentSpacing
74− leftMargin: root.contentSpacing
75− rightMargin: root.contentSpacing
76− }
77− height: childrenRect.height
78−
79− spacing: units.gu(2)
80−
81−
82− Flickable {
83− id: leftFlickable
84− objectName: "leftFlickable"
85− anchors {
86− top: parent.top
87− bottom: parent.bottom
88− }
89− width: root.columnWidth
90− contentHeight: leftColumn.height + root.contentSpacing
91− anchors.bottomMargin: root.keyboardSize
92− clip: true
93−
94− Behavior on contentY { NumberAnimation { duration: 300 } }
95−
96− Column {
97− id: leftColumn
98− objectName: "leftColumn"
99− height: childrenRect.height
100− spacing: root.contentSpacing
101− anchors {
102− left: parent.left
103− right: parent.right
104− }
105− }
106− }
107−
108− Flickable {
109− id: centerFlickable
110− anchors {
111− top: parent.top
112− bottom: parent.bottom
113− }
114− width: root.columnWidth
115− contentHeight: centerColumn.height
116− clip: true
117−
118− Column {
119− id: centerColumn
120− objectName: "centerColumn"
121− height: childrenRect.height
122− anchors {
123− left: parent.left
124− right: parent.right
125− }
126− spacing: root.contentSpacing
127− }
128− }
129−
130− Flickable {
131− id: rightFlickable
132− anchors {
133− top: parent.top
134− bottom: parent.bottom
135− }
136− width: root.columnWidth
137− contentHeight: rightColumn.height
138− clip: true
139−
140− Column {
141− id: rightColumn
142− objectName: "rightColumn"
143− height: childrenRect.height
144− anchors {
145− left: parent.left
146− right: parent.right
147− }
148− }
149− }
150− }
151−
152− Loader {
153− id: previewImageLoader
154− parent: leftColumn
155− sourceComponent: root.previewImages
156− anchors {
157− left: parent.left
158− right: parent.right
159− }
160− }
161−
162− Loader {
163− id: ratingsLoader
164− parent: root.narrowMode ? leftColumn : rightColumn
165− anchors {
166− left: parent.left
167− right: parent.right
168− }
169− sourceComponent: root.ratings
170− }
171−
172− Loader {
173− id: descriptionLoader
174− parent: root.narrowMode ? leftColumn : centerColumn
175− anchors {
176− left: parent.left
177− right: parent.right
178− }
179− sourceComponent: root.description
180− }
181−
182− Loader {
183− id: actionsLoader
184− parent: root.narrowMode ? leftColumn : centerColumn
185− anchors {
186− left: parent.left
187− right: parent.right
188− }
189− sourceComponent: root.actions
190− }
191−
192− Loader {
193− id: headerLoader
194− parent: root.narrowMode ? leftColumn : centerColumn
195− anchors {
196− left: parent.left
197− right: parent.right
198− }
199− sourceComponent: root.header
200− }
201−
202− MouseArea {
203− id: waitingForActionMouseArea
204− objectName: "waitingForActionMouseArea"
205− anchors.fill: parent
206− enabled: false
207− }
208−}
qml/Dash/DashPreviewPlaceholder.qmldeleted−25
@@ -1,25 +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−
20−DashPreview {
21− ActivityIndicator {
22− anchors.centerIn: parent
23− running: true
24− }
25−}
qml/Dash/DashRenderer.qml+5−9
@@ -23,17 +23,8 @@ Item {
2323 // In case it can be expanded, should we filter it
2424 property bool filter: true
2525
26− property int collapsedRowCount: 1
27−
2826 property int collapsedHeight: height
2927
30− property int columns: 1
31−
32− property int rows: 1
33−
34− // Index of the highlighted item
35− property int highlightIndex: -1
36−
3728 property int margins: 0
3829
3930 property int uncollapsedHeight: height
@@ -50,6 +41,11 @@ Item {
5041 // The model to renderer
5142 property var model
5243
44+ /*!
45+ \brief CardTool component.
46+ */
47+ property var cardTool: undefined
48+
5349 /// Emitted when the user clicked on an item
5450 /// @param index is the index of the clicked item
5551 /// @param itemY is y of the clicked delegate
qml/Dash/Generic/FlatTileStyle.qmldeleted−79
@@ -1,79 +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−
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−}
qml/Dash/Generic/GenericCarousel.qmldeleted−53
@@ -1,53 +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 ".."
21−
22−DashCarousel {
23− id: genericCarousel
24− itemComponent: carouselDelegateGeneric
25−
26− Component {
27− id: carouselDelegateGeneric
28−
29− BaseCarouselDelegate {
30− id: item
31− objectName: "carouselDelegate"
32−
33− UbuntuShape {
34− anchors.fill: parent
35− radius: "medium"
36− borderSource: ""
37− image: Image {
38− asynchronous: true
39− sourceSize { width: item.width; height: item.height }
40− source: model ? model.icon : ""
41− }
42− }
43−
44− BorderImage {
45− anchors.centerIn: parent
46− opacity: 0.6
47− source: "../../Components/graphics/non-selected.sci"
48− width: parent.width + units.gu(1.5)
49− height: parent.height + units.gu(1.5)
50− }
51− }
52− }
53−}
qml/Dash/Generic/GenericFilterGrid.qmldeleted−46
@@ -1,46 +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 ".."
21−
22−DashFilterGrid {
23− id: genericFilterGrid
24−
25− property int iconWidth: units.gu(8)
26− property int iconHeight: units.gu(7.5)
27−
28− minimumHorizontalSpacing: units.gu(0.5)
29− delegateWidth: units.gu(11)
30− delegateHeight: units.gu(9.5)
31− verticalSpacing: units.gu(2)
32−
33− delegate: Tile {
34− id: tile
35− objectName: "delegate" + index
36− width: genericFilterGrid.cellWidth
37− height: genericFilterGrid.cellHeight
38− text: model.title
39− imageWidth: genericFilterGrid.iconWidth
40− imageHeight: genericFilterGrid.iconHeight
41− source: model.icon
42−
43− onClicked: genericFilterGrid.clicked(index, tile.y)
44− onPressAndHold: genericFilterGrid.pressAndHold(index, tile.y)
45− }
46−}
qml/Dash/Generic/GenericFilterGridPotrait.qmldeleted−28
@@ -1,28 +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−
21−GenericFilterGrid {
22− minimumHorizontalSpacing: units.gu(0.5)
23− delegateWidth: units.gu(11)
24− delegateHeight: units.gu(18)
25− verticalSpacing: units.gu(2)
26− iconWidth: (width / columns) * 0.8
27− iconHeight: iconWidth * 16 / 11
28−}
qml/Dash/Generic/GenericPreview.qmldeleted−197
@@ -1,197 +0,0 @@
1−/*
2− * Copyright (C) 2013, 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import Ubuntu.Components.ListItems 0.1 as ListItems
20−import Ubuntu.DownloadDaemonListener 0.1
21−import "../../Components"
22−import ".."
23−import "../Previews"
24−
25−DashPreview {
26− id: genericPreview
27−
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
53− }
54− }
55−
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: {
75− previewData.execute(modelData.id, { })
76− genericPreview.showProcessingAction = true;
77− }
78− }
79− }
80− }
81− }
82−
83− Component {
84− id: progressComponent
85−
86− ProgressBar {
87− id: progressBar
88− objectName: "progressBar"
89− value: 0
90− maximumValue: 100
91− height: units.gu(5)
92−
93− property var model: previewData.actions
94−
95− DownloadTracker {
96− service: "com.canonical.applications.Downloader"
97− dbusPath: previewData.infoMap["progressbar_source"] ? previewData.infoMap["progressbar_source"].value : ""
98−
99− onProgress: {
100− var percentage = parseInt(received * 100 / total);
101− progressBar.value = percentage;
102− }
103−
104− onFinished: {
105− previewData.execute(progressBar.model[0].id, { })
106− }
107−
108− onError: {
109− previewData.execute(progressBar.model[1].id, { "error": error });
110− }
111− }
112−
113− }
114− }
115−
116− Component {
117− id: descriptionComponent
118− Column {
119− spacing: units.gu(2)
120−
121− Label {
122− id: descriptionLabel
123− objectName: "descriptionLabel"
124− anchors { left: parent.left; right: parent.right }
125− visible: text != ""
126− fontSize: "small"
127− opacity: 0.6
128− color: "white"
129− text: previewData.description.replace(/[\r\n]/g, "<br />")
130− style: Text.Raised
131− styleColor: "black"
132− wrapMode: Text.WordWrap
133− textFormat: Text.RichText
134− // FIXME: workaround for https://bugreports.qt-project.org/browse/QTBUG-33020
135− onWidthChanged: { wrapMode = Text.NoWrap; wrapMode = Text.WordWrap }
136− }
137−
138− Column {
139− objectName: "infoHintColumn"
140− anchors {
141− left: parent.left
142− right: parent.right
143− }
144− Repeater {
145− objectName: "infoHintRepeater"
146− model: previewData.infoHints
147−
148− delegate: Item {
149− objectName: "infoHintItem" + index
150− width: parent.width
151− height: units.gu(5)
152− Row {
153− width: parent.width
154− spacing: units.gu(1)
155− property int columnWidth: (width - spacing) / 2
156− anchors.verticalCenter: parent.verticalCenter
157−
158− Label {
159− objectName: "displayNameLabel"
160− visible: valueLabel.visible
161− fontSize: "small"
162− opacity: 0.9
163− color: "white"
164− horizontalAlignment: Text.AlignLeft
165− width: parent.columnWidth
166− text: modelData.displayName
167− style: Text.Raised
168− styleColor: "black"
169− }
170− Label {
171− id: valueLabel
172− objectName: "valueLabel"
173− visible: modelData.value != ""
174− fontSize: "small"
175− opacity: 0.6
176− color: "white"
177− horizontalAlignment: Text.AlignRight
178− width: parent.columnWidth
179− text: modelData.value ? modelData.value : ""
180− style: Text.Raised
181− styleColor: "black"
182− wrapMode: Text.WordWrap
183− }
184− }
185− ListItems.ThinDivider {
186− anchors {
187− left: parent.left
188− bottom: parent.bottom
189− right: parent.right
190− }
191− }
192− }
193− }
194− }
195− }
196− }
197−}
qml/Dash/Generic/WeatherFilterGrid.qmldeleted−47
@@ -1,47 +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−
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− filtergrid.clicked(index, tile.y)
41− }
42−
43− onPressAndHold: {
44− filtergrid.pressAndHold(index, tile.y)
45− }
46− }
47−}
qml/Dash/GenericScopeView.qml+66−134
@@ -17,20 +17,20 @@
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
1919import Utils 0.1
20−import Unity 0.1
20+import Unity 0.2
21+import Unity.Application 0.1
2122import "../Components"
2223import "../Components/ListItems" as ListItems
2324
2425FocusScope {
2526 id: scopeView
2627
27− property Scope scope
28+ property Scope scope: null
2829 property SortFilterProxyModel categories: categoryFilter
29− property bool isCurrent
30+ property bool isCurrent: false
3031 property alias moving: categoryView.moving
3132 property int tabBarHeight: 0
3233 property PageHeader pageHeader: null
33− property OpenEffect openEffect: null
3434 property Item previewListView: null
3535
3636 signal movementStarted
@@ -39,11 +39,8 @@ FocusScope {
3939 property bool enableHeightBehaviorOnNextCreation: false
4040 property var categoryView: categoryView
4141
42− // FIXME delay the search so that daemons have time to settle, note that
43− // removing this will break ScopeView::test_changeScope
4442 onScopeChanged: {
4543 if (scope) {
46− timer.restart();
4744 scope.activateApplication.connect(activateApp);
4845 }
4946 }
@@ -55,13 +52,7 @@ FocusScope {
5552 Binding {
5653 target: scope
5754 property: "isActive"
58− value: isCurrent && !previewListView.onScreen
59− }
60−
61− Timer {
62− id: timer
63− interval: 2000
64− onTriggered: scope.searchQuery = ""
55+ value: isCurrent && !previewListView.open
6556 }
6657
6758 SortFilterProxyModel {
@@ -92,7 +83,7 @@ FocusScope {
9283 Binding {
9384 target: pageHeader
9485 property: "searchQuery"
95− value: scopeView.scope.searchQuery
86+ value: scopeView.scope ? scopeView.scope.searchQuery : ""
9687 when: isCurrent
9788 }
9889
@@ -115,30 +106,34 @@ FocusScope {
115106 objectName: "categoryListView"
116107 anchors.fill: parent
117108 model: scopeView.categories
118− forceNoClip: previewListView.onScreen
109+ forceNoClip: previewListView.open
119110
120111 property string expandedCategoryId: ""
121− signal correctExpandedCategory();
122112
123113 onContentYChanged: pageHeader.positionRealHeader();
124114 onOriginYChanged: pageHeader.positionRealHeader();
125115 onContentHeightChanged: pageHeader.positionRealHeader();
126116
127− Behavior on contentY {
128− enabled: previewListView.open
129− UbuntuNumberAnimation {}
130− }
131−
132117 delegate: ListItems.Base {
133118 id: baseItem
134119 objectName: "dashCategory" + category
135120 highlightWhenPressed: false
121+ showDivider: false
136122
137123 readonly property bool expandable: rendererLoader.item ? rendererLoader.item.expandable : false
138124 readonly property bool filtered: rendererLoader.item ? rendererLoader.item.filter : true
139125 readonly property string category: categoryId
140126 readonly property var item: rendererLoader.item
141127
128+ CardTool {
129+ id: cardTool
130+
131+ count: results.count
132+ template: model.renderer
133+ components: model.components
134+ viewWidth: parent.width
135+ }
136+
142137 Loader {
143138 id: rendererLoader
144139 anchors {
@@ -147,7 +142,14 @@ FocusScope {
147142 right: parent.right
148143 }
149144
150− source: getRenderer(model.renderer, model.contentType, model.rendererHint, results)
145+ source: {
146+ switch (cardTool.categoryLayout) {
147+ case "carousel": return "CardCarousel.qml";
148+ case "running-apps": return "Apps/RunningApplicationsGrid.qml";
149+ case "grid":
150+ default: return "CardFilterGrid.qml";
151+ }
152+ }
151153
152154 onLoaded: {
153155 if (item.enableHeightBehavior !== undefined && item.enableHeightBehaviorOnNextCreation !== undefined) {
@@ -155,9 +157,9 @@ FocusScope {
155157 scopeView.enableHeightBehaviorOnNextCreation = false;
156158 }
157159 if (source.toString().indexOf("Apps/RunningApplicationsGrid.qml") != -1) {
158− // TODO: the running apps grid doesn't support standard scope results model yet
159− item.firstModel = Qt.binding(function() { return results.firstModel })
160− item.secondModel = Qt.binding(function() { return results.secondModel })
160+ // TODO: this is still a kludge :D Ideally add some kind of hook so that we
161+ // can do this from DashApps.qml or think a better way that needs no special casing
162+ item.model = Qt.binding(function() { return runningApps; })
161163 item.canEnableTerminationMode = Qt.binding(function() { return scopeView.isCurrent })
162164 } else {
163165 item.model = Qt.binding(function() { return results })
@@ -170,6 +172,7 @@ FocusScope {
170172 }
171173 }
172174 updateDelegateCreationRange();
175+ item.cardTool = cardTool;
173176 }
174177
175178 Component.onDestruction: {
@@ -181,39 +184,24 @@ FocusScope {
181184 Connections {
182185 target: rendererLoader.item
183186 onClicked: {
184− // Prepare the preview in case activate() triggers a preview only
185− openEffect.positionPx = Math.max(mapToItem(categoryView, 0, itemY).y, pageHeader.height + categoryView.stickyHeaderHeight);
186− previewListView.categoryId = categoryId
187− previewListView.categoryDelegate = rendererLoader.item
188− previewListView.model = target.model;
189− previewListView.init = true;
190− previewListView.currentIndex = index;
191−
192− var item = target.model.get(index);
193−
194− if ((scopeView.scope.id == "applications.scope" && categoryId == "installed")
195− || (scopeView.scope.id == "home.scope" && categoryId == "applications.scope")) {
196− scopeView.scope.activate(item.uri, item.icon, item.category, 0, item.mimetype, item.title,
197− item.comment, item.dndUri, item.metadata)
187+ if (scopeView.scope.id === "scopes" || (scopeView.scope.id == "clickscope" && categoryId == "local")) {
188+ // TODO Technically it is possible that calling activate() will make the scope emit
189+ // previewRequested so that we show a preview but there's no scope that does that yet
190+ // so it's not implemented
191+ var item = target.model.get(index);
192+ scopeView.scope.activate(item.result)
198193 } else {
194+ previewListView.model = target.model;
195+ previewListView.currentIndex = -1
196+ previewListView.currentIndex = index;
199197 previewListView.open = true
200−
201− scopeView.scope.preview(item.uri, item.icon, item.category, 0, item.mimetype, item.title,
202− item.comment, item.dndUri, item.metadata)
203198 }
204199 }
205200 onPressAndHold: {
206− openEffect.positionPx = Math.max(mapToItem(categoryView, 0, itemY).y, pageHeader.height + categoryView.stickyHeaderHeight);
207− previewListView.categoryId = categoryId
208− previewListView.categoryDelegate = rendererLoader.item
209201 previewListView.model = target.model;
210− previewListView.init = true;
202+ previewListView.currentIndex = -1
211203 previewListView.currentIndex = index;
212204 previewListView.open = true
213−
214− var item = target.model.get(index)
215− scopeView.scope.preview(item.uri, item.icon, item.category, 0, item.mimetype, item.title,
216− item.comment, item.dndUri, item.metadata)
217205 }
218206 }
219207 Connections {
@@ -221,9 +209,6 @@ FocusScope {
221209 onExpandedCategoryIdChanged: {
222210 collapseAllButExpandedCategory();
223211 }
224− onCorrectExpandedCategory: {
225− collapseAllButExpandedCategory();
226− }
227212 function collapseAllButExpandedCategory() {
228213 var item = rendererLoader.item;
229214 if (item.expandable) {
@@ -275,6 +260,31 @@ FocusScope {
275260 }
276261 }
277262 }
263+
264+ Image {
265+ visible: index != 0
266+ anchors {
267+ top: parent.top
268+ left: parent.left
269+ right: parent.right
270+ }
271+ fillMode: Image.Stretch
272+ source: "graphics/dash_divider_top_lightgrad.png"
273+ z: -1
274+ }
275+
276+ Image {
277+ // FIXME Should not rely on model.count but view.count, but ListViewWithPageHeader doesn't expose it yet.
278+ visible: index != categoryView.model.count - 1
279+ anchors {
280+ bottom: parent.bottom
281+ left: parent.left
282+ right: parent.right
283+ }
284+ fillMode: Image.Stretch
285+ source: "graphics/dash_divider_top_darkgrad.png"
286+ z: -1
287+ }
278288 }
279289
280290 onHeightChanged: rendererLoader.updateDelegateCreationRange();
@@ -302,95 +312,17 @@ FocusScope {
302312 pageHeader: Item {
303313 implicitHeight: scopeView.tabBarHeight
304314 onHeightChanged: {
305− if (scopeView.pageHeader) {
315+ if (scopeView.pageHeader && scopeView.isCurrent) {
306316 scopeView.pageHeader.height = height;
307317 }
308318 }
309319 onYChanged: positionRealHeader();
310320
311321 function positionRealHeader() {
312− if (scopeView.pageHeader) {
322+ if (scopeView.pageHeader && scopeView.isCurrent) {
313323 scopeView.pageHeader.y = y + parent.y;
314324 }
315325 }
316326 }
317327 }
318−
319− function getDefaultRendererId(contentType) {
320− switch (contentType) {
321− default: return "grid";
322− }
323− }
324−
325− function getRenderer(rendererId, contentType, rendererHint, results) {
326− if (rendererId == "default") {
327− rendererId = getDefaultRendererId(contentType);
328− }
329− if (rendererId == "carousel") {
330− // Selectively disable carousel, 6 is fixed for now, should change on the form factor
331− if (results.count <= 6)
332− rendererId = "grid"
333− }
334− switch (rendererId) {
335− case "carousel": {
336− switch (contentType) {
337− case "music": return "Music/MusicCarousel.qml";
338− case "video": return "Video/VideoCarousel.qml";
339− default: return "Generic/GenericCarousel.qml";
340− }
341− }
342− case "grid": {
343− switch (contentType) {
344− case "apps": {
345− if (rendererHint == "toggled")
346− return "Apps/DashPluginFilterGrid.qml";
347− else
348− return "Generic/GenericFilterGrid.qml";
349− }
350− case "music": return "Music/MusicFilterGrid.qml";
351− case "video": return "Video/VideoFilterGrid.qml";
352− case "weather": return "Generic/WeatherFilterGrid.qml";
353− default: return "Generic/GenericFilterGrid.qml";
354− }
355− }
356− case "special": {
357− switch (contentType) {
358− case "apps": return "Apps/RunningApplicationsGrid.qml";
359− default: return "Generic/GenericFilterGrid.qml";
360− }
361− }
362− default: return "Generic/GenericFilterGrid.qml";
363− }
364− }
365−
366− Connections {
367− target: scopeView.scope
368− onPreviewReady: {
369− if (previewListView.init) {
370− // Preview was triggered because of a click on the item. Need to expand now.
371− if (!previewListView.open) {
372− previewListView.open = true
373− }
374−
375− var index = previewListView.currentIndex
376− previewListView.currentIndex = -1
377− previewListView.currentIndex = index
378− previewListView.init = false
379− }
380− previewListView.currentItem.previewData = preview
381− }
382− }
383−
384− // TODO: Move as InverseMouseArea to DashPreview
385− MouseArea {
386− objectName: "closePreviewMouseArea"
387− enabled: previewListView.onScreen
388− anchors {
389− fill: parent
390− topMargin: openEffect.bottomGapPx
391− }
392− onClicked: {
393− previewListView.open = false;
394− }
395− }
396328}
qml/Dash/Movie/MoviePreview.qmldeleted−71
@@ -1,71 +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 "../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−}
qml/Dash/Music/CarouselDelegateMusic.qmldeleted−42
@@ -1,42 +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−
21−BaseCarouselDelegate {
22− id: item
23−
24− UbuntuShape {
25− anchors.fill: parent
26− radius: "medium"
27− borderSource: ""
28− image: Image {
29− asynchronous: true
30− sourceSize { width: item.width; height: item.height }
31− source: model ? model.icon : ""
32− }
33− }
34−
35− BorderImage {
36− anchors.centerIn: parent
37− opacity: 0.6
38− source: "../../Components/graphics/non-selected.sci"
39− width: parent.width + units.gu(1.5)
40− height: parent.height + units.gu(1.5)
41− }
42−}
qml/Dash/Music/MusicCarousel.qmldeleted−34
@@ -1,34 +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 "../../Components"
19−import ".."
20−
21−DashCarousel {
22− id: musicCarousel
23− tileAspectRatio: 1
24− minimumTileWidth: units.gu(13)
25− itemComponent: carouselDelegateMusic
26− selectedItemScaleFactor: 1.2
27− cacheBuffer: 1404 // 18px * 13gu * 6
28−
29− Component {
30− id: carouselDelegateMusic
31− CarouselDelegateMusic {
32− }
33− }
34−}
qml/Dash/Music/MusicFilterGrid.qmldeleted−48
@@ -1,48 +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 "../../Components"
19−import "../Generic"
20−
21−GenericFilterGrid {
22− id: musicFilterGrid
23−
24− delegateWidth: units.gu(11)
25− delegateHeight: units.gu(16)
26− iconWidth: units.gu(11)
27− iconHeight: units.gu(11)
28−
29− delegate: Tile {
30− id: tile
31− objectName: "delegate" + index
32− width: musicFilterGrid.cellWidth
33− height: musicFilterGrid.cellHeight
34− text: model.comment
35− imageWidth: musicFilterGrid.iconWidth
36− imageHeight: musicFilterGrid.iconHeight
37− source: model.icon
38− maximumLineCount: 2
39− horizontalAlignment: Text.AlignLeft
40−
41− style: MusicTileStyle {
42− artist: model.title
43− }
44−
45− onClicked: musicFilterGrid.clicked(index, tile.y)
46− onPressAndHold: musicFilterGrid.pressAndHold(index, tile.y)
47− }
48−}
qml/Dash/Music/MusicPreview.qmldeleted−203
@@ -1,203 +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 QtMultimedia 5.0
19−import Ubuntu.Components 0.1
20−import Ubuntu.Components.ListItems 0.1
21−import ".."
22−import "../Generic"
23−import "../../Components"
24−import "../Previews"
25−
26−GenericPreview {
27− id: root
28−
29− previewImages: previewImageComponent
30− header: headerComponent
31− description: descriptionComponent
32−
33− Component {
34− id: previewImageComponent
35− LazyImage {
36− height: units.gu(22)
37− scaleTo: "height"
38− source: previewData ? previewData.image : ""
39− initialHeight: height
40− initialWidth: height
41− }
42− }
43−
44− Component {
45− id: headerComponent
46− Header {
47− title: previewData.title
48− subtitle: previewData.subtitle
49− }
50− }
51−
52− Component {
53− id: descriptionComponent
54−
55− Item {
56− height: childrenRect.height
57− Audio {
58− id: audioPlayer
59− objectName: "audioPlayer"
60− property real progress: audioPlayer.position / audioPlayer.duration
61−
62− property Item playingItem
63−
64− Component.onDestruction: {
65− audioPlayer.stop();
66− }
67−
68− onErrorStringChanged: console.warn("Audio player error:", errorString)
69−
70− }
71−
72− Connections {
73− target: root
74− onIsCurrentChanged: {
75− if (!root.isCurrent) {
76− audioPlayer.stop();
77− }
78− }
79− }
80−
81− Column {
82− anchors { left: parent.left; right: parent.right }
83− visible: trackRepeater.count > 0
84−
85− ThinDivider {
86− objectName: "topDivider"
87− anchors { left: parent.left; right: parent.right }
88− }
89−
90− Repeater {
91− id: trackRepeater
92− objectName: "trackRepeater"
93−
94− model: previewData.tracks
95−
96− delegate: Item {
97− id: trackItem
98− objectName: "trackItem" + index
99− anchors { left: parent.left; right: parent.right }
100− height: units.gu(5)
101− property bool isPlayingItem: audioPlayer.playingItem == trackItem
102−
103− function play() {
104− audioPlayer.stop();
105− // Make sure we change the source, even if two items point to the same uri location
106− audioPlayer.source = "";
107− audioPlayer.source = model.uri;
108− audioPlayer.playingItem = trackItem;
109− audioPlayer.play();
110− }
111−
112− Row {
113− id: trackRow
114− width: parent.width
115− spacing: units.gu(1)
116− property int column1Width: units.gu(3)
117− property int column2Width: width - (2 * spacing) - column1Width - column3Width
118− property int column3Width: units.gu(4)
119− anchors.verticalCenter: parent.verticalCenter
120−
121− Button {
122− objectName: "playButton"
123− width: trackRow.column1Width
124− height: width
125− iconSource: audioPlayer.playbackState == Audio.PlayingState && trackItem.isPlayingItem ? "image://theme/media-playback-pause" : "image://theme/media-playback-start"
126−
127− // Can't be "transparent" or "#00xxxxxx" as the button optimizes away the surrounding shape
128− // FIXME when this is resolved: https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1251685
129− color: "#01000000"
130−
131− onClicked: {
132− if (trackItem.isPlayingItem) {
133− if (audioPlayer.playbackState == Audio.PlayingState) {
134− audioPlayer.pause();
135− } else if (audioPlayer.playbackState == Audio.PausedState){
136− audioPlayer.play();
137− }
138− } else {
139− trackItem.play();
140− }
141− }
142− }
143−
144− Label {
145− objectName: "trackTitleLabel"
146− fontSize: "small"
147− opacity: 0.9
148− color: "white"
149− horizontalAlignment: Text.AlignLeft
150− anchors.verticalCenter: parent.verticalCenter
151− width: parent.column2Width
152− text: title
153− style: Text.Raised
154− styleColor: "black"
155− elide: Text.ElideRight
156−
157− UbuntuShape {
158− id: progressBarFill
159− objectName: "progressBarFill"
160− color: UbuntuColors.orange
161− anchors.left: progressBarImage.left
162− anchors.right: progressBarImage.right
163− anchors.verticalCenter: progressBarImage.verticalCenter
164− height: units.dp(2)
165− anchors.margins: units.dp(2)
166− anchors.rightMargin: maxWidth - (maxWidth * audioPlayer.progress) + units.dp(2)
167− visible: progressBarImage.visible
168− property int maxWidth: progressBarImage.width - units.dp(4)
169− }
170−
171− Image {
172− id: progressBarImage
173− anchors { left: parent.left; top: parent.bottom; right: parent.right }
174− height: units.dp(6)
175− visible: audioPlayer.playbackState != Audio.StoppedState && trackItem.isPlayingItem && model.length.length > 0
176− source: "graphics/music_progress_bg.png"
177− }
178− }
179−
180− Label {
181− id: valueLabel
182− objectName: "timeLabel"
183− fontSize: "small"
184− opacity: 0.9
185− color: "white"
186− anchors.verticalCenter: parent.verticalCenter
187− horizontalAlignment: Text.AlignRight
188− width: parent.column3Width
189− text: length
190− style: Text.Raised
191− styleColor: "black"
192− }
193− }
194−
195− ThinDivider {
196− anchors { left: parent.left; bottom: parent.bottom; right: parent.right }
197− }
198− }
199− }
200− }
201− }
202− }
203−}
qml/Dash/Music/MusicTileStyle.qmldeleted−102
@@ -1,102 +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−
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−}
qml/Dash/PreviewDelegateMapper.qmldeleted−38
@@ -1,38 +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−
19−QtObject {
20− property var d: QtObject {
21− readonly property string genericPreview: "Generic/GenericPreview.qml"
22− readonly property string appPreview: "Apps/AppPreview.qml"
23− property var previewDelegateMapping: {"preview-generic": genericPreview,
24− "preview-application": appPreview,
25− "preview-movie": "Movie/MoviePreview.qml",
26− "preview-music": "Music/MusicPreview.qml",
27− }
28− }
29−
30− function map(rendererName) {
31− var customPreview = d.previewDelegateMapping[rendererName]
32− if (customPreview != undefined) {
33− return customPreview
34− }
35− console.debug("Renderer "+rendererName+" not found, using preview-generic")
36− return d.genericPreview
37− }
38−}
qml/Dash/PreviewListView.qml+52−133
@@ -16,53 +16,55 @@
1616
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
19−import Unity 0.1
19+import Unity 0.2
2020import "../Components"
21+import "Previews" as Previews
2122
2223Item {
23− property OpenEffect openEffect: null
24− property ScopeListView categoryView: null
24+ id: root
25+
2526 property Scope scope: null
27+ property var pageHeader: null
2628
2729 property alias open: previewListView.open
28− property alias onScreen: previewListView.onScreen
29− property alias categoryId: previewListView.categoryId
30− property alias categoryDelegate: previewListView.categoryDelegate
31− property alias init: previewListView.init
3230 property alias model: previewListView.model
3331 property alias currentIndex: previewListView.currentIndex
3432 property alias currentItem: previewListView.currentItem
3533 property alias count: previewListView.count
3634
37− Image {
38− objectName: "pointerArrow"
39− anchors {
40− top: previewListView.bottom
41− left: parent.left
42− leftMargin: previewListView.categoryDelegate !== undefined && previewListView.categoryDelegate.currentItem ?
43− previewListView.categoryDelegate.currentItem.center + (-width + margins) / 2 : 0
44−
45− Behavior on leftMargin {
46− SmoothedAnimation {
47− duration: UbuntuAnimation.FastDuration
48− }
35+ PageHeader {
36+ id: header
37+ objectName: root.objectName + "_pageHeader"
38+ width: parent.width
39+ searchEntryEnabled: false
40+ scope: root.scope
41+ height: units.gu(8.5)
42+ showBackButton: true
43+ onBackClicked: root.open = false
44+
45+ childItem: Label {
46+ id: label
47+ anchors {
48+ left: parent.left
49+ right: parent.right
50+ verticalCenter: parent.verticalCenter
4951 }
52+ text: scope ? i18n.tr("%1 Preview").arg(scope.name) : ""
53+ // TODO Saviq: These should come from updated Ubuntu Palette.
54+ color: "#888888"
55+ font.family: "Ubuntu"
56+ font.weight: Font.Light
57+ fontSize: "x-large"
58+ elide: Text.ElideRight
5059 }
51− height: units.gu(1)
52− width: units.gu(2)
53− property int margins: previewListView.categoryDelegate ? previewListView.categoryDelegate.margins : 0
54− opacity: previewListView.open ? .5 : 0
55−
56− source: "graphics/tooltip_arrow.png"
5760 }
5861
5962 ListView {
6063 id: previewListView
61− objectName: "previewListView"
62− height: openEffect.bottomGapPx - openEffect.topGapPx
64+ objectName: root.objectName + "_listView"
6365 anchors {
64− top: parent.top
65− topMargin: openEffect.topGapPx
66+ top: header.bottom
67+ bottom: parent.bottom
6668 left: parent.left
6769 right: parent.right
6870 }
@@ -77,140 +79,57 @@ Item {
7779
7880 // To be set before opening the preview
7981 property string categoryId: ""
80− property var categoryDelegate
8182
8283 // because the ListView is built asynchronous, setting the
8384 // currentIndex directly won't work. We need to refresh it
8485 // when the first preview is ready to be displayed.
8586 property bool init: true
8687
87− PreviewDelegateMapper {
88− id: previewDelegateMapper
89− }
90−
91− onCurrentIndexChanged: positionListView();
92−
93− function positionListView() {
94− if (!open) {
95− return;
96− }
97−
98− var row = Math.floor(currentIndex / categoryDelegate.columns);
99− if (categoryDelegate.collapsedRowCount <= row) {
100− categoryView.expandedCategoryId = categoryId
101− }
102−
103− categoryDelegate.highlightIndex = currentIndex
104−
105− if (!init && model !== undefined) {
106− var item = model.get(currentIndex)
107− scope.preview(item.uri, item.icon, item.category, 0, item.mimetype, item.title, item.comment, item.dndUri, item.metadata)
108− }
109−
110− // Adjust contentY in case we need to change to it to show the next row
111− if (categoryDelegate.rows > 1) {
112− var itemY = categoryView.contentItem.mapFromItem(categoryDelegate.currentItem).y;
113−
114− // Find new contentY and effect.postionPx
115− var newContentY = itemY - openEffect.positionPx - categoryDelegate.verticalSpacing;
116−
117− // Make sure the item is not covered by a header. Move the effect split down if necessary
118− var headerHeight = pageHeader.height + categoryView.stickyHeaderHeight;
119− var effectAdjust = Math.max(openEffect.positionPx, headerHeight);
120−
121− // Make sure we don't overscroll the listview. If yes, adjust effect position
122− if (newContentY < 0) {
123− effectAdjust += newContentY;
124− newContentY = 0;
125− }
126− if (newContentY > Math.max(0, categoryView.contentHeight - categoryView.height)) {
127− effectAdjust += -(categoryView.contentHeight - categoryView.height) + newContentY
128− newContentY = categoryView.contentHeight - categoryView.height;
129− }
130−
131− openEffect.positionPx = effectAdjust;
132− categoryView.contentY = newContentY;
133− }
134− }
135−
13688 property bool open: false
137− property bool onScreen: false
13889
13990 onOpenChanged: {
14091 if (open) {
141− onScreen = true;
142− categoryDelegate.highlightIndex = currentIndex;
14392 pageHeader.unfocus();
144− positionListView();
14593 } else {
14694 // Cancel any pending preview requests or actions
147− if (previewListView.currentItem.previewData !== undefined) {
95+ if (previewListView.currentItem && previewListView.currentItem.previewData !== undefined) {
14896 previewListView.currentItem.previewData.cancelAction();
14997 }
15098 scope.cancelActivation();
15199 model = undefined;
152− categoryView.correctExpandedCategory();
153− categoryDelegate.highlightIndex = -1;
154100 }
155101 }
156102
157− Rectangle {
158− anchors.fill: parent
159− color: Qt.rgba(0, 0, 0, .3)
160− z: -1
161− }
162−
163− delegate: Loader {
164− id: previewLoader
165− objectName: "previewLoader" + index
103+ delegate: Item {
104+ objectName: "previewItem" + index
166105 height: previewListView.height
167106 width: previewListView.width
168− asynchronous: true
169− source: previewListView.onScreen ?
170− (previewData !== undefined ? previewDelegateMapper.map(previewData.rendererName) : "DashPreviewPlaceholder.qml") : ""
171107
172− onPreviewDataChanged: {
173− if (previewData !== undefined && source.toString().indexOf("DashPreviewPlaceholder.qml") != -1) {
174− previewLoader.opacity = 0;
175− }
176− }
177−
178− onSourceChanged: {
179− if (previewData !== undefined) {
180− fadeIn.start()
181− }
182− }
108+ readonly property bool ready: preview.previewModel.loaded
183109
184− PropertyAnimation {
185− id: fadeIn
186− target: previewLoader
187− property: "opacity"
188− from: 0.0
189− to: 1.0
190− duration: UbuntuAnimation.BriskDuration
191− }
110+ Previews.Preview {
111+ id: preview
112+ objectName: "preview" + index
113+ anchors.fill: parent
192114
193− property var previewData
194− property bool valid: item !== null
115+ isCurrent: parent.ListView.isCurrentItem
195116
196− onLoaded: {
197− if (previewListView.onScreen && previewData !== undefined) {
198− item.previewData = Qt.binding(function() { return previewData })
199− item.isCurrent = Qt.binding(function() { return ListView.isCurrentItem })
117+ previewModel: {
118+ var previewStack = root.scope.preview(result);
119+ return previewStack.get(0);
200120 }
201121 }
202122
203− Connections {
204− ignoreUnknownSignals: true
205− target: item
206− onClose: {
207− previewListView.open = false
208− }
209− }
123+ MouseArea {
124+ id: processingMouseArea
125+ objectName: "processingMouseArea"
126+ anchors.fill: parent
127+ enabled: !preview.previewModel.loaded || preview.previewModel.processingAction
210128
211− function closePreviewSpinner() {
212− if (item) {
213− item.showProcessingAction = false;
129+ ActivityIndicator {
130+ anchors.centerIn: parent
131+ visible: root.open && parent.enabled
132+ running: visible
214133 }
215134 }
216135 }
qml/Dash/Previews/Header.qmldeleted−109
@@ -1,109 +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−
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−}
qml/Dash/Previews/Preview.qml+17−23
@@ -38,18 +38,12 @@ Item {
3838
3939 clip: true
4040
41− Connections {
42− target: shell.applicationManager
43− onMainStageFocusedApplicationChanged: {
44− root.close();
45− }
46− onSideStageFocusedApplicationChanged: {
47− root.close();
48− }
41+ Binding {
42+ target: previewModel
43+ property: "widgetColumnCount"
44+ value: row.columns
4945 }
5046
51− onPreviewModelChanged: processingMouseArea.enabled = false
52−
5347 MouseArea {
5448 anchors.fill: parent
5549 }
@@ -60,18 +54,21 @@ Item {
6054 spacing: units.gu(1)
6155 anchors { fill: parent; margins: spacing }
6256
57+ property int columns: width >= units.gu(80) ? 2 : 1
58+ property real columnWidth: width / columns
59+
6360 Repeater {
64− model: 1
61+ model: previewModel
6562
6663 delegate: ListView {
6764 id: column
6865 anchors { top: parent.top; bottom: parent.bottom }
69− width: row.width
66+ width: row.columnWidth
7067 spacing: row.spacing
7168 bottomMargin: Qt.inputMethod.visible ? Qt.inputMethod.keyboardRectangle.height : 0
7269
73− model: previewModel
74− cacheBuffer: units.gu(40)
70+ model: columnModel
71+ cacheBuffer: height
7572
7673 Behavior on contentY { UbuntuNumberAnimation { } }
7774
@@ -80,10 +77,14 @@ Item {
8077 widgetType: model.type
8178 widgetData: model.properties
8279 isCurrentPreview: root.isCurrent
83− anchors { left: parent.left; right: parent.right }
80+ anchors {
81+ left: parent.left
82+ right: parent.right
83+ leftMargin: units.gu(1)
84+ rightMargin: units.gu(1)
85+ }
8486
8587 onTriggered: {
86− processingMouseArea.enabled = true;
8788 previewModel.triggered(widgetId, actionId, data);
8889 }
8990
@@ -94,11 +95,4 @@ Item {
9495 }
9596 }
9697 }
97−
98− MouseArea {
99− id: processingMouseArea
100− objectName: "processingMouseArea"
101− anchors.fill: parent
102− enabled: false
103− }
10498}
qml/Dash/Previews/PreviewActions.qml+1−1
@@ -24,7 +24,7 @@ import QtQuick 2.1
2424PreviewWidget {
2525 id: root
2626
27− height: row.height
27+ height: row.height + units.gu(1)
2828
2929 Row {
3030 id: row
qml/Dash/Previews/PreviewAudioPlayback.qml+4−3
@@ -139,7 +139,7 @@ PreviewWidget {
139139 objectName: "trackTitleLabel"
140140 anchors { top: parent.top; left: parent.left; right: parent.right }
141141 opacity: 0.9
142− color: Theme.palette.selected.backgroundText
142+ color: "grey"//Theme.palette.selected.backgroundText // TODO karni: Use updated Palette.
143143 fontSize: "small"
144144 horizontalAlignment: Text.AlignLeft
145145 text: modelData["title"]
@@ -152,7 +152,8 @@ PreviewWidget {
152152 anchors { top: trackTitleLabel.bottom; left: parent.left; right: parent.right }
153153 visible: text !== ""
154154 opacity: 0.9
155− color: Theme.palette.selected.backgroundText
155+ color: "grey"//Theme.palette.selected.backgroundText // TODO karni: Use updated Palette.
156+ font.weight: Font.Light
156157 fontSize: "small"
157158 horizontalAlignment: Text.AlignLeft
158159 text: modelData["subtitle"] || ""
@@ -192,7 +193,7 @@ PreviewWidget {
192193 anchors.verticalCenter: parent.verticalCenter
193194 width: parent.column3Width
194195 opacity: 0.9
195− color: Theme.palette.selected.backgroundText
196+ color: "grey"//Theme.palette.selected.backgroundText // TODO karni: Use updated Palette.
196197 fontSize: "small"
197198 horizontalAlignment: Text.AlignRight
198199 text: audio.lengthToString(modelData["length"])
qml/Dash/Previews/PreviewHeader.qml+5−1
@@ -34,5 +34,9 @@ PreviewWidget {
3434 title: root.widgetData["title"] || ""
3535 subtitle: root.widgetData["subtitle"] || ""
3636 width: parent.width
37+
38+ titleSize: "large"
39+ // TODO Change "grey" to Ubuntu.Components.Palette color once updated.
40+ fontColor: "grey"
3741 }
38−}
42+}
qml/Dash/Previews/PreviewImageGallery.qml+19
@@ -32,6 +32,25 @@ PreviewWidget {
3232 orientation: ListView.Horizontal
3333 cacheBuffer: width * 3
3434 model: root.widgetData["sources"]
35+ clip: true
36+
37+ // FIXME: Because of ListViews inside ListViews inside Flickables inside ListViews (and some more)
38+ // we finally reached the point where this ListView doesn't correctly get swipe input any more but
39+ // instead the parent ListView is the one that is swiped. This MouseArea sort of creates a blocking
40+ // layer to make sure this ListView can be swiped, regardless of what's behind it.
41+ MouseArea {
42+ anchors.fill: parent
43+ enabled: parent.contentWidth > parent.width
44+ }
45+
46+ // FIXME: Because of ListViews inside ListViews inside Flickables inside ListViews (and some more)
47+ // we finally reached the point where this ListView doesn't correctly get swipe input any more but
48+ // instead the parent ListView is the one that is swiped. This MouseArea sort of creates a blocking
49+ // layer to make sure this ListView can be swiped, regardless of what's behind it.
50+ MouseArea {
51+ anchors.fill: parent
52+ enabled: parent.contentWidth > parent.width
53+ }
3554
3655 LazyImage {
3756 objectName: "placeholderScreenshot"
qml/Dash/Previews/PreviewRatingInput.qml+1−1
@@ -58,7 +58,7 @@ PreviewWidget {
5858 reviewTextArea.text === "")) return;
5959
6060 var data = {"rating": rating.value, "review": reviewTextArea.text, "author": null};
61− triggered(root.widgetId, widgetData["required"], data);
61+ triggered(root.widgetId, "rated", data);
6262 }
6363
6464 Item {
qml/Dash/Previews/PreviewTextSummary.qml+6−3
@@ -38,7 +38,8 @@ PreviewWidget {
3838 right: parent.right
3939 }
4040 fontSize: "large"
41− color: Theme.palette.selected.backgroundText
41+ // TODO karni: Yet another fix requiring Palette update.
42+ color: "grey" //Theme.palette.selected.backgroundText
4243 visible: text !== ""
4344 opacity: .8
4445 text: widgetData["title"] || ""
@@ -58,8 +59,10 @@ PreviewWidget {
5859 }
5960 height: (!seeMore.visible || seeMore.more) ? contentHeight : contentHeight / lineCount * (maximumCollapsedLineCount - 2)
6061 clip: true
61− fontSize: "medium"
62− color: Theme.palette.selected.backgroundText
62+ fontSize: "small"
63+ lineHeight: 1.2
64+ // TODO karni: Yet another fix requiring Palette update.
65+ color: "grey" //Theme.palette.selected.backgroundText
6366 opacity: .8
6467 text: widgetData["text"]
6568 wrapMode: Text.Wrap
qml/Dash/Previews/PreviewVideoPlayback.qml+1
@@ -16,6 +16,7 @@
1616
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
19+import Ubuntu.Thumbnailer 0.1
1920import "../../Components"
2021
2122/*! \brief Preview widget for video.
qml/Dash/Previews/PreviewWidgetFactory.qml+1−1
@@ -46,7 +46,7 @@ Loader {
4646 case "audio": return "PreviewAudioPlayback.qml";
4747 case "gallery": return "PreviewImageGallery.qml";
4848 case "header": return "PreviewHeader.qml";
49− case "image": return "PreviewZoomableImage.qml"
49+ case "image": return "PreviewZoomableImage.qml";
5050 case "progress": return "PreviewProgress.qml";
5151 case "rating-input": return "PreviewRatingInput.qml";
5252 case "reviews": return "PreviewRatingDisplay.qml";
qml/Dash/Previews/Reviews.qmldeleted−194
@@ -1,194 +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 Ubuntu.Components.ListItems 0.1 as ListItem
20−import "../../Components"
21−
22−Column {
23− id: root
24−
25− property var model
26− property alias textArea: reviewField
27−
28− signal sendReview(string review)
29− signal editing
30−
31− spacing: units.gu(2)
32− state: ""
33−
34− states: [
35− State {
36− name: ""
37− PropertyChanges { target: reviewField; width: root.width }
38− PropertyChanges { target: sendButton; opacity: 0 }
39− PropertyChanges { target: inverseArea; enabled: false }
40− },
41− State {
42− name: "editing"
43− PropertyChanges { target: reviewField; width: (root.width - row.spacing - sendButton.width) }
44− PropertyChanges { target: sendButton; opacity: 1 }
45− PropertyChanges { target: inverseArea; enabled: true }
46− }
47− ]
48−
49− transitions: [
50− Transition {
51− from: ""
52− to: "editing"
53− SequentialAnimation {
54− UbuntuNumberAnimation { target: reviewField; properties: "width"; duration: UbuntuAnimation.SlowDuration }
55− UbuntuNumberAnimation { target: sendButton; properties: "opacity"; duration: UbuntuAnimation.SlowDuration }
56− }
57− },
58− Transition {
59− from: "editing"
60− to: ""
61− SequentialAnimation {
62− UbuntuNumberAnimation { target: sendButton; properties: "opacity"; duration: UbuntuAnimation.SlowDuration }
63− UbuntuNumberAnimation { target: reviewField; properties: "width"; duration: UbuntuAnimation.SlowDuration }
64− }
65− }
66− ]
67−
68− Label {
69− fontSize: "medium"
70− color: "white"
71− style: Text.Raised
72− styleColor: "black"
73− opacity: .9
74− text: i18n.tr("Add a review")
75− }
76−
77− Row {
78− id: row
79− spacing: units.gu(1)
80− width: root.width
81−
82− // FIXME: needs to react to Qt.inputMethod geometry
83− TextArea {
84− id: reviewField
85− objectName: "reviewField"
86− placeholderText: i18n.tr("Review")
87− width: parent.width
88− verticalAlignment: Text.AlignVCenter
89− autoSize: true
90− maximumLineCount: 5
91−
92− Behavior on height { UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration } }
93−
94− onFocusChanged: {
95− if(reviewField.focus){
96− root.state = "editing";
97− reviewField.selectAll();
98− root.editing();
99− }
100− }
101−
102− // FIXME: not active when in wide mode
103− InverseMouseArea {
104− id: inverseArea
105− anchors.fill: parent
106− enabled: false
107− onPressed: {
108− reviewField.focus = false;
109− root.state = "";
110− }
111− }
112− }
113−
114− Button {
115− id: sendButton
116− objectName: "sendButton"
117− width: units.gu(10)
118− height: units.gu(4)
119− anchors.bottom: reviewField.bottom
120− color: Theme.palette.selected.foreground
121− text: i18n.tr("Send")
122− opacity: 0
123−
124− onClicked: {
125− root.sendReview(reviewField.text);
126− reviewField.text = ""
127− }
128− }
129− }
130−
131− ListItem.ThinDivider {}
132−
133− Label {
134− fontSize: "medium"
135− color: "white"
136− style: Text.Raised
137− styleColor: "black"
138− opacity: .9
139− text: i18n.tr("Comments:")
140− }
141−
142− Repeater {
143− objectName: "commentsArea"
144− model: root.model
145−
146− Column {
147− anchors { left: parent.left; right: parent.right }
148−
149− Column {
150− anchors { left: parent.left; right: parent.right }
151−
152− Label {
153− anchors { left: parent.left; right: parent.right }
154− text: modelData[0]
155− fontSize: "medium"
156− color: "white"
157− opacity: .8
158− wrapMode: Text.WordWrap
159− style: Text.Raised
160− styleColor: "black"
161− }
162−
163− Row {
164− spacing: units.gu(1)
165−
166− RatingStars {
167− maximumRating: 10
168− rating: modelData[1]
169− }
170−
171− Label {
172− text: modelData[2]
173− fontSize: "medium"
174− color: Theme.palette.selected.backgroundText
175− opacity: .6
176− style: Text.Raised
177− styleColor: "black"
178− }
179− }
180− }
181−
182− Label {
183− anchors { left: parent.left; right: parent.right }
184− text: modelData[3]
185− fontSize: "medium"
186− color: Theme.palette.selected.backgroundText
187− opacity: .6
188− wrapMode: Text.WordWrap
189− style: Text.Raised
190− styleColor: "black"
191− }
192− }
193− }
194−}
qml/Dash/ScopeDelegateMapper.qml+1−3
@@ -17,9 +17,7 @@
1717import QtQuick 2.0
1818
1919QtObject {
20− property var scopeDelegateMapping: {"applications.scope": "DashApps.qml",
21− "home.scope": "DashHome.qml"
22− }
20+ property var scopeDelegateMapping: {"clickscope": "DashApps.qml"}
2321 property string genericScope: "GenericScopeView.qml"
2422
2523 function map(scopeId) {
qml/Dash/ScopeItem.qmlnew file+94
@@ -0,0 +1,94 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+import Unity 0.2
20+import "../Components"
21+
22+Item {
23+ id: root
24+
25+ property alias scope: scopeView.scope
26+ property alias previewOpen: previewListView.open
27+
28+ property ListModel searchHistory
29+
30+ signal back
31+ signal gotoScope(string scopeId)
32+ signal openScope(var scope)
33+
34+ Item {
35+ id: scopeViewHolder
36+
37+ x: previewListView.open ? -width : 0
38+ Behavior on x { UbuntuNumberAnimation { } }
39+ width: parent.width
40+ height: parent.height
41+
42+ GenericScopeView {
43+ id: scopeView
44+ width: parent.width
45+ height: parent.height
46+ isCurrent: scope != null
47+ tabBarHeight: scopeItemPageHeader.implicitHeight
48+ pageHeader: scopeItemPageHeader
49+ previewListView: previewListView
50+
51+ Connections {
52+ target: scopeView.isCurrent ? scope : null
53+ onGotoScope: root.gotoScope(scopeId);
54+ onOpenScope: root.openScope(scope);
55+ }
56+ }
57+
58+ PageHeader {
59+ id: scopeItemPageHeader
60+ width: parent.width
61+ searchEntryEnabled: true
62+ searchHistory: root.searchHistory
63+ scope: root.scope
64+ height: units.gu(8.5)
65+ showBackButton: true
66+ onBackClicked: root.back();
67+
68+ childItem: Label {
69+ id: label
70+ anchors {
71+ left: parent.left
72+ right: parent.right
73+ verticalCenter: parent.verticalCenter
74+ }
75+ text: scope ? scope.name : ""
76+ color: "#888888"
77+ font.family: "Ubuntu"
78+ font.weight: Font.Light
79+ fontSize: "x-large"
80+ elide: Text.ElideRight
81+ }
82+ }
83+ }
84+
85+ PreviewListView {
86+ id: previewListView
87+ visible: x != width
88+ pageHeader: scopeItemPageHeader
89+ scope: root.scope
90+ width: parent.width
91+ height: parent.height
92+ anchors.left: scopeViewHolder.right
93+ }
94+}
qml/Dash/SearchableResultModel.qmldeleted−44
@@ -1,44 +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 Utils 0.1
18−import Unity 0.1
19−
20−SortFilterProxyModel {
21− id: root
22−
23− property string searchQuery: ""
24− property bool hideOnSearch: false
25−
26− filterRole: CategoryResults.RoleTitle
27−
28− function get(index) {
29− return model.get(mapToSource(index))
30− }
31−
32− onSearchQueryChanged: {
33− if (searchQuery.length == 0) {
34− filterRegExp = RegExp("");
35− filterCaseSensitivity = Qt.CaseInsensitive;
36− } else if (!hideOnSearch) {
37− setFilterWildcard(searchQuery);
38− filterCaseSensitivity = Qt.CaseInsensitive;
39− } else {
40− filterRegExp = /^$/;
41− filterCaseSensitivity = Qt.CaseInsensitive;
42− }
43− }
44−}
qml/Dash/Video/CarouselDelegateVideo.qmldeleted−42
@@ -1,42 +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−
21−BaseCarouselDelegate {
22− id: item
23−
24− UbuntuShape {
25− anchors.fill: parent
26− radius: "medium"
27− borderSource: ""
28− image: Image {
29− asynchronous: true
30− sourceSize { width: item.width; height: item.height }
31− source: model ? model.icon : ""
32− }
33− }
34−
35− BorderImage {
36− anchors.centerIn: parent
37− opacity: 0.6
38− source: "../../Components/graphics/non-selected.sci"
39− width: parent.width + units.gu(1.5)
40− height: parent.height + units.gu(1.5)
41− }
42−}
qml/Dash/Video/VideoCarousel.qmldeleted−34
@@ -1,34 +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 "../../Components"
19−import ".."
20−
21−DashCarousel {
22− id: videosCarousel
23− tileAspectRatio: 198 / 288
24− minimumTileWidth: units.gu(13)
25− itemComponent: carouselDelegateVideo
26− selectedItemScaleFactor: 1.14
27− cacheBuffer: 1404 // 18px * 13gu * 6
28−
29− Component {
30− id: carouselDelegateVideo
31− CarouselDelegateVideo {
32− }
33− }
34−}
qml/Dash/Video/VideoFilterGrid.qmldeleted−47
@@ -1,47 +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 "../Generic"
21−
22−GenericFilterGrid {
23− id: videoFilterGrid
24−
25− delegateWidth: units.gu(11)
26− delegateHeight: units.gu(15)
27− iconWidth: units.gu(11)
28− iconHeight: units.gu(11)
29−
30− delegate: Tile {
31− id: tile
32− objectName: "delegate" + index
33− width: videoFilterGrid.cellWidth
34− height: videoFilterGrid.cellHeight
35− text: model.title
36− imageWidth: videoFilterGrid.iconWidth
37− imageHeight: videoFilterGrid.iconHeight
38− source: model.icon
39− maximumLineCount: 2
40− horizontalAlignment: Text.AlignLeft
41−
42− style: VideoTileStyle {}
43−
44− onClicked: videoFilterGrid.clicked(index, tile.y)
45− onPressAndHold: videoFilterGrid.pressAndHold(index, tile.y)
46− }
47−}
qml/Dash/Video/VideoTileStyle.qmldeleted−87
@@ -1,87 +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−
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−}
qml/Dash/Video/graphics/icon_button_amazon@20.pngdeleted

Binary file not shown.

qml/Dash/Video/graphics/icon_button_u1@20.pngdeleted

Binary file not shown.

qml/Dash/Video/graphics/movie_icon_holder@27.pngdeleted

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

qml/Dash/graphics/header_handlearrow2@20.pngdeleted

Binary file not shown.

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

Binary file not shown.

qml/Dash/graphics/header_handlearrow@20.pngdeleted

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

qml/Dash/graphics/tabbarchevron@27.png

Binary file not shown.

qml/Launcher/Launcher.qml+2−2
@@ -18,7 +18,6 @@ import QtQuick 2.0
1818import "../Components"
1919import Ubuntu.Components 0.1
2020import Ubuntu.Gestures 0.1
21−import Unity 0.1
2221import Unity.Launcher 0.1
2322
2423Item {
@@ -30,7 +29,8 @@ Item {
3029 property int dragAreaWidth: units.gu(1)
3130 property int minimizeDistance: units.gu(26)
3231 property real progress: dragArea.dragging && dragArea.touchX > panelWidth ?
33− (width * (dragArea.touchX-panelWidth) / (width - panelWidth)) : 0
32+ (width * (dragArea.touchX-panelWidth) / (width - panelWidth)) :
33+ (dragArea.dragging ? 0.001 : 0)
3434
3535 readonly property bool shown: panel.x > -panel.width
3636
qml/Launcher/LauncherPanel.qml−1
@@ -17,7 +17,6 @@
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
1919import Ubuntu.Components.ListItems 0.1 as ListItems
20−import Unity 0.1
2120import Unity.Launcher 0.1
2221import Ubuntu.Components.Popups 0.1
2322import "../Components/ListItems"
qml/Notifications/Notification.qml+61−4
@@ -39,20 +39,72 @@ Item {
3939
4040 fullscreen: false
4141 objectName: "background"
42− implicitHeight: type !== Notification.PlaceHolder ? (fullscreen ? maxHeight : contentColumn.height + contentColumn.spacing * 4) : 0
42+ implicitHeight: type !== Notification.PlaceHolder ? (fullscreen ? maxHeight : contentColumn.height + contentColumn.spacing * 2) : 0
4343
4444 color: Qt.rgba(0.132, 0.117, 0.109, 0.97)
4545 opacity: 0
4646
47+ state: {
48+ var result = "";
49+
50+ if (type == Notification.SnapDecision) {
51+ if (ListView.view.currentIndex == index) {
52+ result = "expanded";
53+ } else {
54+ if (ListView.view.count > 2) {
55+ if (ListView.view.currentIndex == -1 && index == 1) {
56+ result = "expanded";
57+ } else {
58+ result = "contracted";
59+ }
60+ } else {
61+ result = "expanded";
62+ }
63+ }
64+ }
65+
66+ return result;
67+ }
68+
69+ Behavior on height {
70+ id: normalHeightBehavior
71+
72+ //enabled: menuItemFactory.progress == 1
73+ enabled: true
74+ SequentialAnimation {
75+ PauseAnimation {
76+ duration: UbuntuAnimation.SnapDuration
77+ }
78+ UbuntuNumberAnimation {
79+ duration: UbuntuAnimation.SnapDuration
80+ }
81+ }
82+ }
83+
84+ states:[
85+ State {
86+ name: "contracted"
87+ PropertyChanges {target: notification; height: units.gu(8)}
88+ },
89+ State {
90+ name: "expanded"
91+ PropertyChanges {target: notification; height: implicitHeight}
92+ }
93+ ]
94+
4795 clip: fullscreen ? false : true
96+
4897 visible: type != Notification.PlaceHolder
4998
5099 UbuntuShape {
51100 id: shapedBack
52101
53102 visible: !fullscreen
54− anchors.fill: parent
55− anchors.margins: notification.margins
103+ anchors {
104+ fill: parent
105+ leftMargin: notification.margins
106+ rightMargin: notification.margins
107+ }
56108 color: parent.color
57109 opacity: parent.opacity
58110 radius: "medium"
@@ -104,17 +156,20 @@ Item {
104156 MouseArea {
105157 id: interactiveArea
106158
107− anchors.fill: contentColumn
159+ anchors.fill: parent
108160 objectName: "interactiveArea"
109161 onClicked: {
110162 if (notification.type == Notification.Interactive) {
111163 notification.notification.invokeAction(actionRepeater.itemAt(0).actionId)
164+ } else {
165+ notificationList.currentIndex = index;
112166 }
113167 }
114168 }
115169
116170 Column {
117171 id: contentColumn
172+ objectName: "contentColumn"
118173
119174 anchors {
120175 left: parent.left
@@ -207,6 +262,8 @@ Item {
207262 model: unityMenuModel
208263
209264 NotificationMenuItemFactory {
265+ id: menuItemFactory
266+
210267 anchors.left: parent.left; anchors.right: parent.right
211268
212269 menuModel: unityMenuModel
qml/Notifications/Notifications.qml+4
@@ -25,6 +25,9 @@ ListView {
2525 interactive: false
2626
2727 property real margin
28+ spacing: delegate.fullscreen ? 0 : units.gu(.5)
29+
30+ currentIndex: (currentIndex < 1 && count > 1) ? 1 : -1
2831
2932 delegate: Notification {
3033 objectName: "notification" + index
@@ -75,6 +78,7 @@ ListView {
7578 displaced: Transition {
7679 UbuntuNumberAnimation {
7780 properties: "x,y"
81+ duration: UbuntuAnimation.SnapDuration
7882 }
7983 }
8084}
qml/Panel/IndicatorRow.qml+1−1
@@ -137,7 +137,7 @@ Item {
137137 anchors.top: row.bottom
138138 visible: indicatorRow.currentItem != null
139139
140− property real intendedX: row.x + (indicatorRow.currentItem != null ? indicatorRow.currentItem.x + centerOffset : 0)
140+ property real intendedX: row.x + (indicatorRow.currentItem != null ? (indicatorRow.currentItem.x - row.originX) + centerOffset : 0)
141141 x: intendedX >= row.x ? (intendedX + width <= row.x + row.width ? intendedX : row.x + row.width - width) : row.x // listview boundaries
142142 width: indicatorRow.currentItem != null ? indicatorRow.currentItem.width : 0
143143
qml/Panel/Panel.qml+1−1
@@ -62,7 +62,7 @@ Item {
6262 height: __panelMinusSeparatorLineHeight
6363 y: 0
6464
65− Behavior on y { StandardAnimation {} }
65+ Behavior on y { StandardAnimation { duration: UbuntuAnimation.FastDuration } }
6666 }
6767
6868 PanelSeparatorLine {
qml/ScopeTool.qml+9−1
@@ -18,7 +18,7 @@ import QtQuick 2.0
1818import Ubuntu.Components 0.1
1919import Ubuntu.Components.Popups 0.1
2020import Utils 0.1
21−import Unity 0.1
21+import Unity 0.2
2222import "Components"
2323import "Dash"
2424
@@ -61,6 +61,14 @@ Rectangle {
6161 color: "#FCFCFC"
6262 }
6363
64+ Image {
65+ anchors.fill: dashContent
66+ source: root.width > root.height ? "Dash/graphics/paper_landscape.png" : "Dash/graphics/paper_portrait.png"
67+ fillMode: Image.PreserveAspectCrop
68+ horizontalAlignment: Image.AlignRight
69+ verticalAlignment: Image.AlignTop
70+ }
71+
6472 DashContent {
6573 id: dashContent
6674
qml/Shell.qml+203−327
@@ -31,7 +31,6 @@ import "Panel"
3131import "Hud"
3232import "Components"
3333import "Bottombar"
34−import "SideStage"
3534import "Notifications"
3635import Unity.Notifications 1.0 as NotificationBackend
3736
@@ -49,20 +48,24 @@ FocusScope {
4948 readonly property real panelHeight: panel.panelHeight
5049
5150 property bool dashShown: dash.shown
52− property bool stageScreenshotsReady: {
53− if (sideStage.shown) {
54− if (mainStage.applications.count > 0) {
55− return mainStage.usingScreenshots && sideStage.usingScreenshots;
56− } else {
57− return sideStage.usingScreenshots;
51+
52+ property bool sideStageEnabled: shell.width >= units.gu(100)
53+ readonly property string focusedApplicationId: ApplicationManager.focusedApplicationId
54+
55+ function activateApplication(appId) {
56+ if (ApplicationManager.findApplication(appId)) {
57+ ApplicationManager.requestFocusApplication(appId);
58+ stages.show(true);
59+ if (stages.locked && ApplicationManager.focusedApplicationId == appId) {
60+ applicationsDisplayLoader.item.select(appId);
5861 }
5962 } else {
60− return mainStage.usingScreenshots;
63+ var execFlags = shell.sideStageEnabled ? ApplicationManager.NoFlag : ApplicationManager.ForceMainStage;
64+ ApplicationManager.startApplication(appId, execFlags);
65+ stages.show(false);
6166 }
6267 }
6368
64− property var applicationManager: ApplicationManagerWrapper {}
65−
6669 Binding {
6770 target: LauncherModel
6871 property: "applicationManager"
@@ -71,49 +74,6 @@ FocusScope {
7174
7275 Component.onCompleted: {
7376 Theme.name = "Ubuntu.Components.Themes.SuruGradient"
74−
75− applicationManager.sideStageEnabled = Qt.binding(function() { return sideStage.enabled })
76−
77− // FIXME: if application focused before shell starts, shell draws on top of it only.
78− // We should detect already running applications on shell start and bring them to the front.
79− applicationManager.unfocusCurrentApplication();
80− }
81−
82− readonly property bool applicationFocused: !!applicationManager.mainStageFocusedApplication
83− || !!applicationManager.sideStageFocusedApplication
84− // Used for autopilot testing.
85− readonly property string currentFocusedAppId: ApplicationManager.focusedApplicationId
86−
87− readonly property bool fullscreenMode: {
88− if (greeter.shown || lockscreen.shown) {
89− return false;
90− } else if (mainStage.usingScreenshots) { // Window Manager animating so want to re-evaluate fullscreen mode
91− return mainStage.switchingFromFullscreenToFullscreen;
92− } else if (applicationManager.mainStageFocusedApplication) {
93− return applicationManager.mainStageFocusedApplication.fullscreen;
94− } else {
95− return false;
96− }
97− }
98−
99− function activateApplication(appId, argument) {
100− if (applicationManager) {
101− // For newly started applications, as it takes them time to draw their first frame
102− // we add a delay before we hide the animation screenshots to compensate.
103− var addDelay = !applicationManager.getApplicationFromDesktopFile(appId);
104−
105− var application;
106− application = applicationManager.activateApplication(appId, argument);
107− if (application == null) {
108− return;
109− }
110− if (application.stage == ApplicationInfo.MainStage || !sideStage.enabled) {
111− mainStage.activateApplication(appId, addDelay);
112− } else {
113− sideStage.activateApplication(appId, addDelay);
114− }
115− stages.show();
116− }
11777 }
11878
11979 GSettings {
@@ -125,27 +85,6 @@ FocusScope {
12585 shell.background = gSettingsPicture
12686 }
12787
128− // This is a dummy image that is needed to determine if the picture url
129− // in backgroundSettings points to a valid picture file.
130− // We can't do this with the real background image because setting a
131− // new source in onStatusChanged triggers a binding loop detection
132− // inside Image, which causes it not to render even though a valid source
133− // would be set. We don't mind about this image staying black and just
134− // use it for verification to populate the source for the real
135− // background image.
136− Image {
137− source: shell.background
138− height: 0
139− width: 0
140− sourceSize.height: 0
141− sourceSize.width: 0
142− onStatusChanged: {
143− if (status == Image.Error && source != shell.defaultBackground) {
144− shell.background = defaultBackground
145− }
146− }
147− }
148−
14988 VolumeControl {
15089 id: volumeControl
15190 }
@@ -154,245 +93,219 @@ FocusScope {
15493 Keys.onVolumeDownPressed: volumeControl.volumeDown()
15594
15695 Item {
157− id: underlay
158− objectName: "underlay"
96+ id: underlayClipper
15997 anchors.fill: parent
98+ anchors.rightMargin: stages.overlayWidth
99+ clip: stages.overlayMode && !stages.painting
100+
101+ InputFilterArea {
102+ anchors.fill: parent
103+ blockInput: parent.clip
104+ }
105+
106+ Item {
107+ id: underlay
108+ objectName: "underlay"
109+ anchors.fill: parent
110+ anchors.rightMargin: -parent.anchors.rightMargin
160111
161− // Whether the underlay is fully covered by opaque UI elements.
162− property bool fullyCovered: panel.indicators.fullyOpened && shell.width <= panel.indicatorsMenuWidth
112+ // Whether the underlay is fully covered by opaque UI elements.
113+ property bool fullyCovered: panel.indicators.fullyOpened && shell.width <= panel.indicatorsMenuWidth
163114
164− readonly property bool applicationRunning: ((mainStage.applications && mainStage.applications.count > 0)
165− || (sideStage.applications && sideStage.applications.count > 0))
115+ // Whether the user should see the topmost application surface (if there's one at all).
116+ readonly property bool applicationSurfaceShouldBeSeen: stages.shown && !stages.painting && !stages.overlayMode
166117
167− // Whether the user should see the topmost application surface (if there's one at all).
168− readonly property bool applicationSurfaceShouldBeSeen: applicationRunning && !stages.fullyHidden
169− && !mainStage.usingScreenshots // but want sideStage animating over app surface
118+ // NB! Application surfaces are stacked behind the shell one. So they can only be seen by the user
119+ // through the translucent parts of the shell surface.
120+ visible: !fullyCovered && !applicationSurfaceShouldBeSeen
170121
122+ CrossFadeImage {
123+ id: backgroundImage
124+ objectName: "backgroundImage"
171125
126+ anchors.fill: parent
127+ source: shell.background
128+ fillMode: Image.PreserveAspectCrop
129+ }
172130
173− // NB! Application surfaces are stacked behing the shell one. So they can only be seen by the user
174− // through the translucent parts of the shell surface.
175− visible: !fullyCovered && !applicationSurfaceShouldBeSeen
131+ Rectangle {
132+ anchors.fill: parent
133+ color: "black"
134+ opacity: dash.disappearingAnimationProgress
135+ }
176136
177− CrossFadeImage {
178− id: backgroundImage
179− objectName: "backgroundImage"
137+ Image {
138+ anchors.fill: dash
139+ source: shell.width > shell.height ? "Dash/graphics/paper_landscape.png" : "Dash/graphics/paper_portrait.png"
140+ fillMode: Image.PreserveAspectCrop
141+ horizontalAlignment: Image.AlignRight
142+ verticalAlignment: Image.AlignTop
143+ }
180144
181− anchors.fill: parent
182− source: shell.background
183− fillMode: Image.PreserveAspectCrop
184− }
145+ Dash {
146+ id: dash
147+ objectName: "dash"
185148
186− Rectangle {
187− anchors.fill: parent
188− color: "black"
189− opacity: dash.disappearingAnimationProgress
190− }
149+ available: !greeter.shown && !lockscreen.shown
150+ hides: [stages, launcher, panel.indicators]
151+ shown: disappearingAnimationProgress !== 1.0
152+ enabled: disappearingAnimationProgress === 0.0 && edgeDemo.dashEnabled
191153
192− Dash {
193− id: dash
194− objectName: "dash"
195−
196− available: !greeter.shown && !lockscreen.shown
197− hides: [stages, launcher, panel.indicators]
198− shown: disappearingAnimationProgress !== 1.0
199− enabled: disappearingAnimationProgress === 0.0 && edgeDemo.dashEnabled
200− // FIXME: unfocus all applications when going back to the dash
201− onEnabledChanged: {
202− if (enabled) {
203− shell.applicationManager.unfocusCurrentApplication()
154+ anchors {
155+ fill: parent
156+ topMargin: panel.panelHeight
204157 }
205− }
206158
207− anchors {
208− fill: parent
209− topMargin: panel.panelHeight
159+ contentScale: 1.0 - 0.2 * disappearingAnimationProgress
160+ opacity: 1.0 - disappearingAnimationProgress
161+ property real disappearingAnimationProgress: {
162+ if (greeter.shown) {
163+ return greeter.showProgress;
164+ } else {
165+ if (stages.overlayMode) {
166+ return 0;
167+ }
168+ return stages.showProgress
169+ }
170+ }
171+
172+ // FIXME: only necessary because stages.showProgress and
173+ // greeterRevealer.animatedProgress are not animated
174+ Behavior on disappearingAnimationProgress { SmoothedAnimation { velocity: 5 }}
210175 }
176+ }
177+ }
178+
179+ EdgeDragArea {
180+ id: stagesDragHandle
181+ direction: Direction.Leftwards
182+
183+ anchors { top: parent.top; right: parent.right; bottom: parent.bottom }
184+ width: shell.edgeSize
211185
212− contentScale: 1.0 - 0.2 * disappearingAnimationProgress
213− opacity: 1.0 - disappearingAnimationProgress
214− property real disappearingAnimationProgress: {
215− if (greeter.shown) {
216− return greeter.showProgress;
186+ property real progress: stages.width
187+
188+ onTouchXChanged: {
189+ if (status == DirectionalDragArea.Recognized) {
190+ if (ApplicationManager.count == 0) {
191+ progress = Math.max(stages.width - stagesDragHandle.width + touchX, stages.width * .3)
217192 } else {
218− return stagesOuterContainer.showProgress;
193+ progress = stages.width - stagesDragHandle.width + touchX
219194 }
220195 }
196+ }
221197
222− // FIXME: only necessary because stagesOuterContainer.showProgress and
223− // greeterRevealer.animatedProgress are not animated
224− Behavior on disappearingAnimationProgress { SmoothedAnimation { velocity: 5 }}
198+ onDraggingChanged: {
199+ if (!dragging) {
200+ if (ApplicationManager.count > 0 && progress < stages.width - units.gu(10)) {
201+ stages.show(true)
202+ }
203+ stagesDragHandle.progress = stages.width;
204+ }
225205 }
226206 }
227207
228208 Item {
229− id: stagesOuterContainer
230−
209+ id: stages
210+ objectName: "stages"
231211 width: parent.width
232212 height: parent.height
233− x: launcher.progress
234− Behavior on x {SmoothedAnimation{velocity: 600}}
235213
236− property real showProgress:
237− MathUtils.clamp(1 - (x + stages.x) / shell.width, 0, 1)
214+ x: {
215+ if (shown) {
216+ if (overlayMode || locked) {
217+ return 0;
218+ }
219+ return launcher.progress
220+ } else {
221+ return stagesDragHandle.progress
222+ }
223+ }
224+
225+ Behavior on x { SmoothedAnimation { velocity: 600; duration: UbuntuAnimation.FastDuration } }
238226
239− Showable {
240− id: stages
241− objectName: "stages"
227+ property bool shown: false
242228
243− x: width
229+ property real showProgress: overlayMode ? 0 : MathUtils.clamp(1 - x / shell.width, 0, 1)
244230
245− property bool fullyShown: shown && x == 0 && parent.x == 0
246− property bool fullyHidden: !shown && x == width
247− available: !greeter.shown
248− hides: [panel.indicators]
249− shown: false
250− opacity: 1.0
251− showAnimation: StandardAnimation { property: "x"; duration: 350; to: 0; easing.type: Easing.OutCubic }
252− hideAnimation: StandardAnimation { property: "x"; duration: 350; to: width; easing.type: Easing.OutCubic }
231+ property bool fullyShown: x == 0
232+ property bool fullyHidden: x == width
253233
254− width: parent.width
255− height: parent.height
234+ property bool painting: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.painting : false
235+ property bool fullscreen: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.fullscreen : false
236+ property bool overlayMode: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.overlayMode : false
237+ property int overlayWidth: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.overlayWidth : false
238+ property bool locked: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.locked : false
256239
257− // close the stages when no focused application remains
258− Connections {
259− target: shell.applicationManager
260− onMainStageFocusedApplicationChanged: stages.closeIfNoApplications()
261− onSideStageFocusedApplicationChanged: stages.closeIfNoApplications()
262− ignoreUnknownSignals: true
240+ function show(focusApp) {
241+ shown = true;
242+ panel.indicators.hide();
243+ if (!ApplicationManager.focusedApplicationId && ApplicationManager.count > 0 && focusApp) {
244+ ApplicationManager.focusApplication(ApplicationManager.get(0).appId);
263245 }
246+ }
264247
265− function closeIfNoApplications() {
266− if (!shell.applicationManager.mainStageFocusedApplication
267− && !shell.applicationManager.sideStageFocusedApplication
268− && shell.applicationManager.mainStageApplications.count == 0
269− && shell.applicationManager.sideStageApplications.count == 0) {
270− stages.hide();
271− }
248+ function hide() {
249+ shown = false;
250+ if (ApplicationManager.focusedApplicationId) {
251+ ApplicationManager.unfocusCurrentApplication();
272252 }
253+ }
273254
274− // show the stages when an application gets the focus
275− Connections {
276− target: shell.applicationManager
277− onMainStageFocusedApplicationChanged: {
278− if (shell.applicationManager.mainStageFocusedApplication) {
279− mainStage.show();
280− stages.show();
281− }
282− }
283− onSideStageFocusedApplicationChanged: {
284− if (shell.applicationManager.sideStageFocusedApplication) {
285− sideStage.show();
286− stages.show();
255+ Connections {
256+ target: ApplicationManager
257+
258+ onFocusRequested: {
259+ stages.show(true);
260+ }
261+
262+ onFocusedApplicationIdChanged: {
263+ if (ApplicationManager.focusedApplicationId.length > 0) {
264+ stages.show(false);
265+ } else {
266+ if (!stages.overlayMode) {
267+ stages.hide();
287268 }
288269 }
289− ignoreUnknownSignals: true
290− }
291270
292− Stage {
293− id: mainStage
271+ // If any app is focused when greeter is open, it's due to a user action
272+ // like a snap decision (say, an incoming call).
273+ // TODO: these should be protected to only unlock for certain applications / certain usecases
274+ // potentially only in connection with a notification.
275+ greeter.hide()
276+ }
294277
295− anchors.fill: parent
296− fullyShown: stages.fullyShown
297− fullyHidden: stages.fullyHidden
298− shouldUseScreenshots: !fullyShown
299− rightEdgeEnabled: !sideStage.enabled
300−
301− applicationManager: shell.applicationManager
302− rightEdgeDraggingAreaWidth: shell.edgeSize
303− normalApplicationY: shell.panelHeight
304−
305− shown: true
306− function show() {
307− stages.show();
308− }
309− function hide() {
310− }
278+ onApplicationAdded: {
279+ stages.show(false);
280+ }
311281
312− // FIXME: workaround the fact that focusing a main stage application
313− // raises its surface on top of all other surfaces including the ones
314− // that belong to side stage applications.
315− onFocusedApplicationChanged: {
316− if (focusedApplication && sideStage.focusedApplication && sideStage.fullyShown) {
317− shell.applicationManager.focusApplication(sideStage.focusedApplication);
318− }
282+ onApplicationRemoved: {
283+ if (ApplicationManager.focusedApplicationId.length == 0) {
284+ stages.hide();
319285 }
320286 }
287+ }
321288
322− SideStage {
323− id: sideStage
324−
325− applicationManager: shell.applicationManager
326− rightEdgeDraggingAreaWidth: shell.edgeSize
327− normalApplicationY: shell.panelHeight
289+ Loader {
290+ id: applicationsDisplayLoader
291+ anchors.fill: parent
328292
329− onShownChanged: {
330− if (!shown && mainStage.applications.count == 0) {
331− stages.hide();
332− }
333− }
334− // FIXME: when hiding the side stage, refocus the main stage
335− // application so that it goes in front of the side stage
336− // application and hides it
337− onFullyShownChanged: {
338− if (!fullyShown && stages.fullyShown && sideStage.focusedApplication != null) {
339− shell.applicationManager.focusApplication(mainStage.focusedApplication);
340− }
341− }
293+ source: shell.sideStageEnabled ? "Stages/StageWithSideStage.qml" : "Stages/PhoneStage.qml"
342294
343− enabled: shell.width >= units.gu(100)
344− visible: enabled
345− fullyShown: stages.fullyShown && shown
346− && sideStage[sideStageRevealer.boundProperty] == sideStageRevealer.openedValue
347− shouldUseScreenshots: !fullyShown || mainStage.usingScreenshots || sideStageRevealer.pressed
348−
349− available: !greeter.shown && !lockscreen.shown && enabled
350− hides: [launcher, panel.indicators]
351− shown: false
352− showAnimation: StandardAnimation { property: "x"; duration: 350; to: sideStageRevealer.openedValue; easing.type: Easing.OutQuint }
353− hideAnimation: StandardAnimation { property: "x"; duration: 350; to: sideStageRevealer.closedValue; easing.type: Easing.OutQuint }
354−
355− width: units.gu(40)
356− height: stages.height
357− handleExpanded: sideStageRevealer.pressed
358− }
359−
360− Revealer {
361− id: sideStageRevealer
362−
363− enabled: mainStage.applications.count > 0 && sideStage.applications.count > 0
364− && sideStage.available
365− direction: Qt.RightToLeft
366− openedValue: parent.width - sideStage.width
367− hintDisplacement: units.gu(3)
368− /* The size of the sidestage handle needs to be bigger than the
369− typical size used for edge detection otherwise it is really
370− hard to grab.
371− */
372− handleSize: sideStage.shown ? units.gu(4) : shell.edgeSize
373− closedValue: parent.width + sideStage.handleSizeCollapsed
374− target: sideStage
375− x: parent.width - width
376− width: sideStage.width + handleSize * 0.7
377− height: sideStage.height
378− orientation: Qt.Horizontal
379− }
380−
381− DragHandle {
382− id: stagesDragHandle
383−
384− anchors.top: parent.top
385− anchors.bottom: parent.bottom
386− anchors.right: parent.left
387−
388− width: shell.edgeSize
389− direction: Direction.Leftwards
390− enabled: greeter.showProgress == 0 && edgeDemo.dashEnabled
391− property bool haveApps: mainStage.applications.count > 0 || sideStage.applications.count > 0
392−
393− maxTotalDragDistance: haveApps ? parent.width : parent.width * 0.7
394− // Make autocompletion impossible when !haveApps
395− edgeDragEvaluator.minDragDistance: haveApps ? maxTotalDragDistance * 0.1 : Number.MAX_VALUE
295+ Binding {
296+ target: applicationsDisplayLoader.item
297+ property: "moving"
298+ value: !stages.fullyShown
299+ }
300+ Binding {
301+ target: applicationsDisplayLoader.item
302+ property: "shown"
303+ value: stages.shown
304+ }
305+ Binding {
306+ target: applicationsDisplayLoader.item
307+ property: "dragAreaWidth"
308+ value: shell.edgeSize
396309 }
397310 }
398311 }
@@ -469,26 +382,6 @@ FocusScope {
469382
470383 dragHandleWidth: shell.edgeSize
471384
472− property var previousMainApp: null
473− property var previousSideApp: null
474−
475− function removeApplicationFocus() {
476− greeter.previousMainApp = applicationManager.mainStageFocusedApplication;
477− greeter.previousSideApp = applicationManager.sideStageFocusedApplication;
478− applicationManager.unfocusCurrentApplication();
479− }
480−
481− function restoreApplicationFocus() {
482− if (greeter.previousMainApp) {
483− applicationManager.focusApplication(greeter.previousMainApp);
484− greeter.previousMainApp = null;
485− }
486− if (greeter.previousSideApp) {
487− applicationManager.focusApplication(greeter.previousSideApp);
488− greeter.previousSideApp = null;
489− }
490− }
491−
492385 onShownChanged: {
493386 if (shown) {
494387 lockscreen.reset();
@@ -498,9 +391,6 @@ FocusScope {
498391 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
499392 }
500393 greeter.forceActiveFocus();
501− removeApplicationFocus();
502− } else {
503− restoreApplicationFocus();
504394 }
505395 }
506396
@@ -518,33 +408,16 @@ FocusScope {
518408 }
519409 }
520410
521− Connections {
522− target: applicationManager
523− ignoreUnknownSignals: true
524− // If any app is focused when greeter is open, it's due to a user action
525− // like a snap decision (say, an incoming call).
526− // TODO: these should be protected to only unlock for certain applications / certain usecases
527− // potentially only in connection with a notification.
528− onMainStageFocusedApplicationChanged: {
529− if (greeter.shown && applicationManager.mainStageFocusedApplication) {
530− greeter.previousMainApp = null // make way for new focused app
531− greeter.previousSideApp = null
532− greeter.hide()
533− }
534− }
535− onSideStageFocusedApplicationChanged: {
536− if (greeter.shown && applicationManager.sideStageFocusedApplication) {
537− greeter.previousMainApp = null // make way for new focused app
538− greeter.previousSideApp = null
539− greeter.hide()
540− }
541− }
411+ Binding {
412+ target: ApplicationManager
413+ property: "suspended"
414+ value: greeter.shown && greeter.showProgress == 1
542415 }
543416 }
544417
545418 InputFilterArea {
546419 anchors.fill: parent
547− blockInput: !applicationFocused || greeter.shown || lockscreen.shown || launcher.shown
420+ blockInput: ApplicationManager.focusedApplicationId.length === 0 || greeter.shown || lockscreen.shown || launcher.shown
548421 || panel.indicators.shown || hud.shown
549422 }
550423
@@ -571,7 +444,7 @@ FocusScope {
571444 function showHome() {
572445 var animate = !greeter.shown && !stages.shown
573446 greeter.hide()
574− dash.setCurrentScope("home.scope", animate, false)
447+ dash.setCurrentScope("clickscope", animate, false)
575448 stages.hide()
576449 }
577450
@@ -593,8 +466,10 @@ FocusScope {
593466 available: edgeDemo.panelEnabled
594467 contentEnabled: edgeDemo.panelContentEnabled
595468 }
596− fullscreenMode: shell.fullscreenMode
597− searchVisible: !greeter.shown && !lockscreen.shown && dash.shown
469+ property string focusedAppId: ApplicationManager.focusedApplicationId
470+ property var focusedApplication: ApplicationManager.findApplication(focusedAppId)
471+ fullscreenMode: focusedApplication && stages.fullscreen && !greeter.shown && !lockscreen.shown
472+ searchVisible: !greeter.shown && !lockscreen.shown && dash.shown && dash.searchable
598473
599474 InputFilterArea {
600475 anchors {
@@ -619,9 +494,8 @@ FocusScope {
619494 hideAnimation: StandardAnimation { property: "y"; duration: hud.showableAnimationDuration; to: hudRevealer.closedValue; easing.type: Easing.Linear }
620495
621496 Connections {
622− target: shell.applicationManager
623− onMainStageFocusedApplicationChanged: hud.hide()
624− onSideStageFocusedApplicationChanged: hud.hide()
497+ target: ApplicationManager
498+ onFocusedApplicationIdChanged: hud.hide()
625499 }
626500 }
627501
@@ -646,7 +520,7 @@ FocusScope {
646520 theHud: hud
647521 anchors.fill: parent
648522 enabled: hud.available
649− applicationIsOnForeground: applicationFocused
523+ applicationIsOnForeground: ApplicationManager.focusedApplicationId
650524 }
651525
652526 InputFilterArea {
@@ -677,12 +551,14 @@ FocusScope {
677551 showHome()
678552 }
679553 onDash: {
680− if (stages.shown) {
681− stages.hide();
682− launcher.hide();
554+ if (stages.shown && !stages.overlayMode) {
555+ if (!stages.locked) {
556+ stages.hide();
557+ launcher.hide();
558+ }
683559 }
684560 }
685− onDashSwipeChanged: if (dashSwipe && stages.shown) dash.setCurrentScope("applications.scope", false, true)
561+ onDashSwipeChanged: if (dashSwipe && stages.shown) dash.setCurrentScope("clickscope", false, true)
686562 onLauncherApplicationSelected:{
687563 if (edgeDemo.running)
688564 return;
@@ -772,14 +648,14 @@ FocusScope {
772648 anchors.bottom: parent.bottom
773649 anchors.left: parent.left
774650 anchors.right: parent.right
775− height: shell.applicationManager ? shell.applicationManager.keyboardHeight : 0
651+ height: ApplicationManager.keyboardVisible ? ApplicationManager.keyboardHeight : 0
776652
777− enabled: shell.applicationManager && shell.applicationManager.keyboardVisible
653+ enabled: ApplicationManager.keyboardVisible
778654 }
779655
780656 Label {
781657 anchors.centerIn: parent
782− visible: applicationManager.fake
658+ visible: ApplicationManager.fake ? ApplicationManager.fake : false
783659 text: "EARLY ALPHA\nNOT READY FOR USE"
784660 color: "lightgrey"
785661 opacity: 0.2
qml/SideStage/SideStage.qmldeleted−73
@@ -1,73 +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 Unity.Application 0.1
19−import Ubuntu.Components 0.1
20−import "../Components"
21−
22−Stage {
23− id: stage
24−
25− type: ApplicationInfo.SideStage
26− property real handleSizeCollapsed: units.gu(2.5)
27− property real handleSizeExpanded: units.gu(4)
28− property bool handleExpanded
29−
30− /* FIXME: workaround so that when a main stage app goes fullscreen
31− the sidestage's top is not transparent. Proper fix would be to
32− resize the side stage app.
33− */
34− Rectangle {
35− id: backgroundBeneathPanel
36− anchors {
37− top: parent.top
38− left: parent.left
39− right: parent.right
40− }
41− height: shell.panelHeight
42− color: background.color
43− z: -1
44− }
45−
46− Rectangle {
47− id: background
48− anchors.fill: parent
49− color: "#2c2924"
50− z: -1
51− visible: stage.usingScreenshots
52− }
53−
54− SidestageHandle {
55− id: handle
56− objectName: "sideStageHandle"
57−
58− anchors {
59− top: parent.top
60− bottom: parent.bottom
61− left: parent.left
62− leftMargin: -width
63− }
64− width: handleExpanded ? handleSizeExpanded : handleSizeCollapsed
65− Behavior on width { NumberAnimation { easing.type: Easing.OutQuart} }
66− z: -1
67− }
68−
69− InputFilterArea {
70− anchors.fill: handle
71− blockInput: visible
72− }
73−}
qml/Stages/PhoneStage.qmlnew file+499
@@ -0,0 +1,499 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+import Ubuntu.Gestures 0.1
20+import Unity.Application 0.1
21+import Utils 0.1
22+import "../Components"
23+
24+Item {
25+ id: root
26+
27+ // Controls to be set from outside
28+ property bool shown: false
29+ property bool moving: false
30+ property int dragAreaWidth
31+
32+ // State information propagated to the outside
33+ readonly property bool painting: mainScreenshotImage.visible || fadeInScreenshotImage.visible || appSplash.visible || spreadView.visible
34+ property bool fullscreen: priv.focusedApplication ? priv.focusedApplication.fullscreen : false
35+ property bool locked: spreadView.visible
36+
37+ // Not used for PhoneStage, only useful for SideStage and similar
38+ property bool overlayMode: false
39+ property int overlayWidth: 0
40+
41+ function select(appId) {
42+ spreadView.snapTo(priv.indexOf(appId))
43+ }
44+
45+ onMovingChanged: {
46+ if (moving) {
47+ if (ApplicationManager.focusedApplicationId) {
48+ priv.requestNewScreenshot();
49+ } else {
50+ mainScreenshotImage.anchors.leftMargin = 0;
51+ mainScreenshotImage.source = ApplicationManager.get(0).screenshot;
52+ mainScreenshotImage.visible = true;
53+ }
54+ } else {
55+ mainScreenshotImage.visible = false;
56+ }
57+ }
58+
59+ Connections {
60+ target: ApplicationManager
61+
62+ onFocusRequested: {
63+ if (spreadView.visible) {
64+ spreadView.snapTo(priv.indexOf(appId));
65+ } else {
66+ priv.switchToApp(appId);
67+ }
68+ }
69+
70+ onFocusedApplicationIdChanged: {
71+ if (ApplicationManager.focusedApplicationId.length > 0) {
72+ if (priv.secondApplicationStarting || priv.applicationStarting) {
73+ appSplashTimer.restart();
74+ } else {
75+ var application = priv.focusedApplication;
76+ root.fullscreen = application.fullscreen;
77+ mainScreenshotImage.source = application.screenshot;
78+ }
79+ } else {
80+ spreadView.selectedIndex = -1;
81+ spreadView.phase = 0;
82+ spreadView.contentX = -spreadView.shift;
83+ }
84+ }
85+
86+ onApplicationAdded: {
87+ if (!priv.focusedApplication) {
88+ mainScreenshotImage.source = "";
89+ mainScreenshotImage.visible = false;
90+ priv.applicationStarting = true;
91+ } else {
92+ mainScreenshotImage.source = "";
93+ priv.newFocusedAppId = appId;
94+ priv.secondApplicationStarting = true;
95+ priv.requestNewScreenshot();
96+ }
97+
98+ if (spreadView.visible) {
99+ spreadView.snapTo(0);
100+ }
101+ }
102+
103+ onApplicationRemoved: {
104+ if (ApplicationManager.count == 0) {
105+ mainScreenshotImage.source = ""
106+ mainScreenshotImage.visible = false;
107+ } else {
108+ mainScreenshotImage.source = ApplicationManager.get(0).screenshot;
109+ }
110+ }
111+ }
112+
113+ QtObject {
114+ id: priv
115+
116+ property string focusedAppId: ApplicationManager.focusedApplicationId
117+ property var focusedApplication: ApplicationManager.findApplication(focusedAppId)
118+ property url focusedScreenshot: focusedApplication ? focusedApplication.screenshot : ""
119+
120+ property bool waitingForScreenshot: false
121+
122+ property bool applicationStarting: false
123+ property bool secondApplicationStarting: false
124+
125+ property string newFocusedAppId
126+
127+ onFocusedScreenshotChanged: {
128+ if (root.moving && priv.waitingForScreenshot) {
129+ mainScreenshotImage.anchors.leftMargin = 0;
130+ mainScreenshotImage.source = priv.focusedScreenshot
131+ mainScreenshotImage.visible = true;
132+ } else if (priv.secondApplicationStarting && priv.waitingForScreenshot) {
133+ applicationSwitchingAnimation.start();
134+ }
135+ waitingForScreenshot = false;
136+ }
137+
138+ function requestNewScreenshot() {
139+ waitingForScreenshot = true;
140+ ApplicationManager.updateScreenshot(focusedAppId);
141+ }
142+
143+ function switchToApp(appId) {
144+ if (priv.focusedAppId) {
145+ priv.newFocusedAppId = appId;
146+ root.fullscreen = ApplicationManager.findApplication(appId).fullscreen;
147+ applicationSwitchingAnimation.start();
148+ } else {
149+ ApplicationManager.focusApplication(appId);
150+ }
151+ }
152+
153+ function indexOf(appId) {
154+ for (var i = 0; i < ApplicationManager.count; i++) {
155+ if (ApplicationManager.get(i).appId == appId) {
156+ return i;
157+ }
158+ }
159+ return -1;
160+ }
161+
162+ }
163+
164+ // FIXME: the signal connections seems to get lost.
165+ Connections {
166+ target: priv.focusedApplication
167+ onScreenshotChanged: priv.focusedScreenshot = priv.focusedApplication.screenshot
168+ }
169+ Binding {
170+ target: root
171+ property: "fullscreen"
172+ value: priv.focusedApplication ? priv.focusedApplication.fullscreen : false
173+ }
174+
175+ Timer {
176+ id: appSplashTimer
177+ // FIXME: We really need to show something meaningful in the app surface instead of guessing
178+ // when it might be ready
179+ interval: 500
180+ repeat: false
181+ onTriggered: {
182+ priv.applicationStarting = false;
183+ priv.secondApplicationStarting = false;
184+ }
185+ }
186+
187+ SequentialAnimation {
188+ id: applicationSwitchingAnimation
189+ // setup
190+ PropertyAction { target: mainScreenshotImage; property: "anchors.leftMargin"; value: 0 }
191+ PropertyAction { target: mainScreenshotImage; property: "source"; value: priv.focusedScreenshot }
192+ PropertyAction { targets: [mainScreenshotImage, fadeInScreenshotImage]; property: "visible"; value: true }
193+ PropertyAction { target: fadeInScreenshotImage; property: "source"; value: {
194+ var newFocusedApp = ApplicationManager.findApplication(priv.newFocusedAppId);
195+ return newFocusedApp ? newFocusedApp.screenshot : "" }
196+ }
197+ PropertyAction { target: fadeInScreenshotImage; property: "opacity"; value: 0 }
198+ PropertyAction { target: fadeInScreenshotImage; property: "scale"; value: .8 }
199+
200+
201+ // The actual animation
202+ ParallelAnimation {
203+ UbuntuNumberAnimation { target: mainScreenshotImage; property: "anchors.leftMargin"; to: root.width; duration: UbuntuAnimation.SlowDuration }
204+ UbuntuNumberAnimation { target: fadeInScreenshotImage; properties: "opacity,scale"; to: 1; duration: UbuntuAnimation.SlowDuration }
205+ }
206+
207+ // restore stuff
208+ ScriptAction { script: ApplicationManager.focusApplication(priv.newFocusedAppId); }
209+ PropertyAction { target: fadeInScreenshotImage; property: "visible"; value: false }
210+ PropertyAction { target: mainScreenshotImage; property: "visible"; value: false }
211+ }
212+
213+ // FIXME: Drop this and make the imageprovider show a splashscreen instead
214+ Rectangle {
215+ id: appSplash2
216+ anchors.fill: parent
217+ color: "white"
218+ visible: priv.secondApplicationStarting
219+ }
220+ Image {
221+ id: fadeInScreenshotImage
222+ anchors { left: parent.left; bottom: parent.bottom }
223+ width: parent.width
224+ scale: .7
225+ visible: false
226+ }
227+
228+ Rectangle {
229+ id: appSplash
230+ anchors.fill: parent
231+ color: "white"
232+ visible: priv.applicationStarting
233+ }
234+ Image {
235+ id: mainScreenshotImage
236+ anchors { left: parent.left; bottom: parent.bottom }
237+ width: parent.width
238+ visible: false
239+ }
240+
241+ EdgeDragArea {
242+ id: spreadDragArea
243+ direction: Direction.Leftwards
244+ enabled: ApplicationManager.count > 1 && spreadView.phase != 2
245+
246+ anchors { top: parent.top; right: parent.right; bottom: parent.bottom }
247+ width: root.dragAreaWidth
248+
249+ // Sitting at the right edge of the screen, this EdgeDragArea directly controls the spreadView when
250+ // attachedToView is true. When the finger movement passes positionMarker3 we detach it from the
251+ // spreadView and make the spreadView snap to positionMarker4.
252+ property bool attachedToView: true
253+
254+ property var gesturePoints: new Array()
255+
256+ onTouchXChanged: {
257+ if (!dragging && !priv.waitingForScreenshot) {
258+ // Initial touch. Let's update the screenshot and reset the spreadView to the starting position.
259+ priv.requestNewScreenshot();
260+ spreadView.phase = 0;
261+ spreadView.contentX = -spreadView.shift;
262+ }
263+ if (dragging && attachedToView) {
264+ // Gesture recognized. Let's move the spreadView with the finger
265+ spreadView.contentX = -touchX - spreadView.shift;
266+ }
267+ if (attachedToView && spreadView.shiftedContentX >= spreadView.width * spreadView.positionMarker3) {
268+ // We passed positionMarker3. Detach from spreadView and snap it.
269+ attachedToView = false;
270+ spreadView.snap();
271+ }
272+ gesturePoints.push(touchX);
273+ }
274+
275+ onStatusChanged: {
276+ if (status == DirectionalDragArea.Recognized) {
277+ attachedToView = true;
278+ }
279+ }
280+
281+ onDraggingChanged: {
282+ if (dragging) {
283+ // Gesture recognized. Start recording this gesture
284+ gesturePoints = [];
285+ return;
286+ }
287+
288+ // Ok. The user released. Find out if it was a one-way movement.
289+ var oneWayFlick = true;
290+ var smallestX = spreadDragArea.width;
291+ for (var i = 0; i < gesturePoints.length; i++) {
292+ if (gesturePoints[i] >= smallestX) {
293+ oneWayFlick = false;
294+ break;
295+ }
296+ smallestX = gesturePoints[i];
297+ }
298+ gesturePoints = [];
299+
300+ if (oneWayFlick && spreadView.shiftedContentX > units.gu(2) &&
301+ spreadView.shiftedContentX < spreadView.positionMarker1 * spreadView.width) {
302+ // If it was a short one-way movement, do the Alt+Tab switch
303+ // no matter if we didn't cross positionMarker1 yet.
304+ spreadView.snapTo(1);
305+ } else if (!dragging && attachedToView) {
306+ // otherwise snap to the closest snap position we can find
307+ // (might be back to start, to app 1 or to spread)
308+ spreadView.snap();
309+ }
310+ }
311+ }
312+
313+ Rectangle {
314+ id: coverFlipBackground
315+ anchors.fill: parent
316+ color: "black"
317+ visible: spreadView.visible
318+ }
319+
320+ InputFilterArea {
321+ anchors.fill: root
322+ blockInput: spreadView.visible
323+ }
324+
325+ Flickable {
326+ id: spreadView
327+ objectName: "spreadView"
328+ anchors.fill: parent
329+ visible: spreadDragArea.status == DirectionalDragArea.Recognized || phase > 1 || snapAnimation.running
330+ contentWidth: spreadRow.width - shift
331+ contentX: -shift
332+
333+ // The flickable needs to fill the screen in order to get touch events all over.
334+ // However, we don't want to the user to be able to scroll back all the way. For
335+ // that, the beginning of the gesture starts with a negative value for contentX
336+ // so the flickable wants to pull it into the view already. "shift" tunes the
337+ // distance where to "lock" the content.
338+ property real shift: width / 2
339+ property real shiftedContentX: contentX + shift
340+
341+ property int tileDistance: width / 4
342+
343+ // Those markers mark the various positions in the spread (ratio to screen width from right to left):
344+ // 0 - 1: following finger, snap back to the beginning on release
345+ property real positionMarker1: 0.3
346+ // 1 - 2: curved snapping movement, snap to app 1 on release
347+ property real positionMarker2: 0.45
348+ // 2 - 3: movement follows finger, snaps back to app 1 on release
349+ property real positionMarker3: 0.6
350+ // passing 3, we detach movement from the finger and snap to 4
351+ property real positionMarker4: 0.9
352+
353+ // This is where the first app snaps to when bringing it in from the right edge.
354+ property real snapPosition: 0.75
355+
356+ // Phase of the animation:
357+ // 0: Starting from right edge, a new app (index 1) comes in from the right
358+ // 1: The app has reached the first snap position.
359+ // 2: The list is dragged further and snaps into the spread view when entering phase 2
360+ property int phase: 0
361+
362+ property int selectedIndex: -1
363+
364+ onShiftedContentXChanged: {
365+ switch (phase) {
366+ case 0:
367+ if (shiftedContentX > width * positionMarker2) {
368+ phase = 1;
369+ }
370+ break;
371+ case 1:
372+ if (shiftedContentX < width * positionMarker2) {
373+ phase = 0;
374+ } else if (shiftedContentX >= width * positionMarker4) {
375+ phase = 2;
376+ }
377+ break;
378+ }
379+ }
380+
381+ function snap() {
382+ if (shiftedContentX < positionMarker1 * width) {
383+ snapAnimation.targetContentX = -shift;
384+ snapAnimation.start();
385+ } else if (shiftedContentX < positionMarker2 * width) {
386+ snapTo(1)
387+ } else if (shiftedContentX < positionMarker3 * width) {
388+ snapTo(1)
389+ } else if (phase < 2){
390+ // Add 1 pixel to make sure we definitely hit positionMarker4 even with rounding errors of the animation.
391+ snapAnimation.targetContentX = width * positionMarker4 + 1 - shift;
392+ snapAnimation.start();
393+ }
394+ }
395+ function snapTo(index) {
396+ spreadView.selectedIndex = index;
397+ root.fullscreen = ApplicationManager.get(index).fullscreen;
398+ snapAnimation.targetContentX = -shift;
399+ snapAnimation.start();
400+ }
401+
402+ SequentialAnimation {
403+ id: snapAnimation
404+ property int targetContentX: -spreadView.shift
405+
406+ UbuntuNumberAnimation {
407+ target: spreadView
408+ property: "contentX"
409+ to: snapAnimation.targetContentX
410+ duration: UbuntuAnimation.FastDuration
411+ }
412+
413+ ScriptAction {
414+ script: {
415+ if (spreadView.selectedIndex >= 0) {
416+ ApplicationManager.focusApplication(ApplicationManager.get(spreadView.selectedIndex).appId);
417+ spreadView.selectedIndex = -1
418+ spreadView.phase = 0;
419+ spreadView.contentX = -spreadView.shift;
420+ }
421+ }
422+ }
423+ }
424+
425+ Item {
426+ id: spreadRow
427+ // This width controls how much the spread can be flicked left/right. It's composed of:
428+ // tileDistance * app count (with a minimum of 3 apps, in order to also allow moving 1 and 2 apps a bit)
429+ // + some constant value (still scales with the screen width) which looks good and somewhat fills the screen
430+ width: Math.max(3, ApplicationManager.count) * spreadView.tileDistance + (spreadView.width - spreadView.tileDistance) * 1.5
431+
432+ x: spreadView.contentX
433+
434+ Repeater {
435+ id: spreadRepeater
436+ model: ApplicationManager
437+ delegate: TransformedSpreadDelegate {
438+ id: appDelegate
439+ objectName: "appDelegate" + index
440+ startAngle: 45
441+ endAngle: 5
442+ startScale: 1.1
443+ endScale: 0.7
444+ startDistance: spreadView.tileDistance
445+ endDistance: units.gu(.5)
446+ width: spreadView.width
447+ height: spreadView.height
448+ selected: spreadView.selectedIndex == index
449+ otherSelected: spreadView.selectedIndex >= 0 && !selected
450+
451+ z: index
452+ x: index == 0 ? 0 : spreadView.width + (index - 1) * spreadView.tileDistance
453+
454+ // Each tile has a different progress value running from 0 to 1.
455+ // A progress value of 0 means the tile is at the right edge. 1 means the tile has reched the left edge.
456+ progress: {
457+ var tileProgress = (spreadView.shiftedContentX - index * spreadView.tileDistance) / spreadView.width;
458+ // Tile 1 needs to move directly from the beginning...
459+ if (index == 1 && spreadView.phase < 2) {
460+ tileProgress += spreadView.tileDistance / spreadView.width;
461+ }
462+ return tileProgress;
463+ }
464+
465+ // This mostly is the same as progress, just adds the snapping to phase 1 for tiles 0 and 1
466+ animatedProgress: {
467+ if (spreadView.phase == 0 && index < 2) {
468+ if (progress < spreadView.positionMarker1) {
469+ return progress;
470+ } else if (progress < spreadView.positionMarker1 + snappingCurve.period){
471+ return spreadView.positionMarker1 + snappingCurve.value * 3;
472+ } else {
473+ return spreadView.positionMarker2;
474+ }
475+ }
476+ return progress;
477+ }
478+
479+ EasingCurve {
480+ id: snappingCurve
481+ type: EasingCurve.OutQuad
482+ period: 0.05
483+ progress: appDelegate.progress - spreadView.positionMarker1
484+ }
485+
486+ onClicked: {
487+ if (spreadView.phase == 2) {
488+ if (ApplicationManager.focusedApplicationId == ApplicationManager.get(index).appId) {
489+ spreadView.snapTo(index);
490+ } else {
491+ ApplicationManager.requestFocusApplication(ApplicationManager.get(index).appId);
492+ }
493+ }
494+ }
495+ }
496+ }
497+ }
498+ }
499+}
qml/SideStage/SidestageHandle.qml → qml/Stages/SidestageHandle.qmlrenamed

The content is the same.

qml/Stages/SpreadDelegate.qmlnew file+55
@@ -0,0 +1,55 @@
1+/*
2+ * Copyright 2014 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: Michael Zanetti <michael.zanetti@canonical.com>
17+*/
18+
19+import QtQuick 2.0
20+
21+Item {
22+ id: root
23+
24+ signal clicked()
25+
26+ property real topMarginProgress
27+
28+ QtObject {
29+ id: priv
30+ property real heightDifference: root.height - appImage.implicitHeight
31+ }
32+
33+ Image {
34+ id: dropShadow
35+ anchors.fill: appImage
36+ anchors.margins: -units.gu(2)
37+ source: "graphics/dropshadow.png"
38+ opacity: .4
39+ }
40+ Image {
41+ id: appImage
42+ anchors {
43+ left: parent.left;
44+ bottom: parent.bottom;
45+ top: parent.top;
46+ topMargin: priv.heightDifference * Math.max(0, 1 - root.topMarginProgress)
47+ }
48+ source: model.screenshot
49+ antialiasing: true
50+ }
51+ MouseArea {
52+ anchors.fill: appImage
53+ onClicked: root.clicked()
54+ }
55+}
qml/Stages/StageWithSideStage.qmlnew file+407
@@ -0,0 +1,407 @@
1+/*
2+ * Copyright (C) 2014 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 Unity.Application 0.1
21+import Ubuntu.Gestures 0.1
22+
23+Item {
24+ id: root
25+ objectName: "stages"
26+ anchors.fill: parent
27+
28+ // Controls to be set from outside
29+ property bool shown: false
30+ property bool moving: false
31+ property int dragAreaWidth
32+
33+ // State information propagated to the outside
34+ readonly property bool painting: mainStageImage.visible || sideStageImage.visible || sideStageSnapAnimation.running
35+ property bool fullscreen: priv.focusedApplication ? priv.focusedApplication.fullscreen : false
36+ property bool overlayMode: (sideStageImage.shown && priv.mainStageAppId.length == 0) || priv.overlayOverride
37+ || (priv.mainStageAppId.length == 0 && sideStageSnapAnimation.running)
38+
39+ readonly property int overlayWidth: priv.overlayOverride ? 0 : priv.sideStageWidth
40+
41+ onShownChanged: {
42+ if (!shown) {
43+ priv.mainStageAppId = "";
44+ }
45+ }
46+
47+ onMovingChanged: {
48+ if (moving) {
49+ if (!priv.mainStageAppId && !priv.sideStageAppId) {
50+ // Pulling in from the right, make the last used (topmost) app visible
51+ var application = ApplicationManager.get(0);
52+ if (application.stage == ApplicationInfoInterface.SideStage) {
53+ sideStageImage.application = application;
54+ sideStageImage.x = root.width - sideStageImage.width
55+ sideStageImage.visible = true;
56+ } else {
57+ mainStageImage.application = application;
58+ mainStageImage.visible = true;
59+ }
60+ } else {
61+ priv.requestNewScreenshot(ApplicationInfoInterface.MainStage)
62+ if (priv.focusedApplicationId == priv.sideStageAppId) {
63+ priv.requestNewScreenshot(ApplicationInfoInterface.SideStage)
64+ }
65+ }
66+ } else {
67+ mainStageImage.visible = false;
68+ sideStageImage.visible = false;
69+ }
70+ }
71+
72+ QtObject {
73+ id: priv
74+
75+ property int sideStageWidth: units.gu(40)
76+
77+
78+ property string sideStageAppId
79+ property string mainStageAppId
80+
81+
82+ property var sideStageApp: ApplicationManager.findApplication(sideStageAppId)
83+ property var mainStageApp: ApplicationManager.findApplication(mainStageAppId)
84+
85+ property string sideStageScreenshot: sideStageApp ? sideStageApp.screenshot : ""
86+ property string mainStageScreenshot: mainStageApp ? mainStageApp.screenshot : ""
87+
88+ property string focusedApplicationId: ApplicationManager.focusedApplicationId
89+ property var focusedApplication: ApplicationManager.findApplication(focusedApplicationId)
90+ property url focusedScreenshot: focusedApplication ? focusedApplication.screenshot : ""
91+
92+ property bool waitingForMainScreenshot: false
93+ property bool waitingForSideScreenshot: false
94+ property bool waitingForScreenshots: waitingForMainScreenshot || waitingForSideScreenshot
95+
96+ property string startingAppId: ""
97+
98+ // Keep overlayMode even if there is no focused app (to allow pulling in the sidestage from the right)
99+ property bool overlayOverride: false
100+
101+ onFocusedApplicationChanged: {
102+ if (focusedApplication) {
103+ if (focusedApplication.stage == ApplicationInfoInterface.MainStage) {
104+ mainStageAppId = focusedApplicationId;
105+ priv.overlayOverride = false;
106+ if (priv.startingAppId == focusedApplicationId && sideStageImage.shown) {
107+ // There was already a sidestage app on top. bring it back!
108+ ApplicationManager.focusApplication(priv.sideStageAppId)
109+ priv.startingAppId = "";
110+ }
111+ } else if (focusedApplication.stage == ApplicationInfoInterface.SideStage) {
112+ sideStageAppId = focusedApplicationId;
113+ if (priv.startingAppId == focusedApplicationId && !sideStageImage.shown) {
114+ sideStageImage.snapToApp(focusedApplication);
115+ priv.startingAppId = "";
116+ }
117+ }
118+ } else if (root.overlayMode){
119+ sideStageImage.snapTo(root.width)
120+ }
121+ }
122+
123+ onMainStageScreenshotChanged: {
124+ waitingForMainScreenshot = false;
125+ }
126+
127+ onSideStageScreenshotChanged: {
128+ waitingForSideScreenshot = false;
129+ }
130+
131+ onFocusedScreenshotChanged: {
132+ waitingForSideScreenshot = false;
133+ }
134+
135+ onWaitingForScreenshotsChanged: {
136+ if (waitingForScreenshots) {
137+ return;
138+ }
139+
140+ if (root.moving) {
141+ if (mainStageAppId) {
142+ mainStageImage.application = mainStageApp
143+ mainStageImage.visible = true;
144+ }
145+ if (sideStageAppId && focusedApplicationId == sideStageAppId) {
146+ sideStageImage.application = sideStageApp;
147+ sideStageImage.x = root.width - sideStageImage.width
148+ sideStageImage.visible = true;
149+ }
150+ }
151+ if (sideStageHandleMouseArea.pressed) {
152+ if (sideStageAppId) {
153+ sideStageImage.application = sideStageApp;
154+ sideStageImage.x = root.width - sideStageImage.width
155+ sideStageImage.visible = true;
156+ }
157+ if (mainStageAppId) {
158+ mainStageImage.application = mainStageApp
159+ mainStageImage.visible = true;
160+ }
161+ }
162+ }
163+
164+ function requestNewScreenshot(stage) {
165+ if (stage == ApplicationInfoInterface.MainStage && mainStageAppId) {
166+ waitingForMainScreenshot = true;
167+ ApplicationManager.updateScreenshot(mainStageAppId);
168+ } else if (stage == ApplicationInfoInterface.SideStage && sideStageAppId) {
169+ waitingForSideScreenshot = true;
170+ ApplicationManager.updateScreenshot(sideStageAppId);
171+ }
172+ }
173+
174+ }
175+ // FIXME: the signal connection seems to get lost with the fake application manager.
176+ Connections {
177+ target: priv.sideStageApp
178+ onScreenshotChanged: priv.sideStageScreenshot = priv.sideStageApp.screenshot
179+ }
180+ Connections {
181+ target: priv.mainStageApp
182+ onScreenshotChanged: priv.mainStageScreenshot = priv.mainStageApp.screenshot
183+ }
184+
185+ Connections {
186+ target: ApplicationManager
187+
188+ onApplicationAdded: {
189+ priv.startingAppId = appId;
190+ splashScreenTimer.start();
191+ var application = ApplicationManager.findApplication(appId)
192+ if (application.stage == ApplicationInfoInterface.SideStage) {
193+ sideStageSplash.visible = true;
194+ } else if (application.stage == ApplicationInfoInterface.MainStage) {
195+ mainStageSplash.visible = true;
196+ }
197+ }
198+
199+ onFocusRequested: {
200+ var application = ApplicationManager.findApplication(appId)
201+ if (application.stage == ApplicationInfoInterface.SideStage) {
202+ if (!root.shown) {
203+ priv.mainStageAppId = "";
204+ mainStageImage.application = null
205+ }
206+ if (sideStageImage.shown) {
207+ sideStageImage.switchTo(application);
208+ if (priv.mainStageAppId) {
209+ mainStageImage.application = priv.mainStageApp;
210+ mainStageImage.visible = true;
211+ }
212+ } else {
213+ sideStageImage.application = application;
214+ sideStageImage.snapToApp(application);
215+ }
216+ } else if (application.stage == ApplicationInfoInterface.MainStage) {
217+ if (root.shown) {
218+ if (sideStageImage.shown) {
219+ sideStageImage.application = priv.sideStageApp;
220+ sideStageImage.visible = true;
221+ }
222+ priv.mainStageAppId = application.appId;
223+ mainStageImage.switchTo(application)
224+ ApplicationManager.focusApplication(appId)
225+ if (sideStageImage.shown) {
226+ // There was already a focused SS app. Bring it back
227+ ApplicationManager.focusApplication(priv.sideStageAppId)
228+ }
229+ } else {
230+ if (sideStageImage.shown) {
231+ sideStageImage.visible = false;
232+ sideStageImage.x = root.width;
233+ }
234+
235+ mainStageImage.application = application;
236+ ApplicationManager.focusApplication(appId)
237+ }
238+ }
239+ }
240+
241+ onApplicationRemoved: {
242+ if (priv.mainStageAppId == appId) {
243+ priv.mainStageAppId = "";
244+ }
245+ if (priv.sideStageAppId == appId) {
246+ priv.sideStageAppId = "";
247+ }
248+ if (priv.sideStageAppId.length == 0) {
249+ sideStageImage.shown = false;
250+ priv.overlayOverride = false;
251+ }
252+ }
253+
254+ }
255+
256+ Timer {
257+ id: splashScreenTimer
258+ // FIXME: apart from removing this completely in the future and make the app surface paint
259+ // meaningful stuff, also check for colin's stuff to land so we can shape 1.4 secs away from here
260+ // https://code.launchpad.net/~cjwatson/upstart-app-launch/libclick-manifest/+merge/210520
261+ // https://code.launchpad.net/~cjwatson/upstart-app-launch/libclick-pkgdir/+merge/209909
262+ interval: 1700
263+ repeat: false
264+ onTriggered: {
265+ mainStageSplash.visible = false;
266+ sideStageSplash.visible = false;
267+ }
268+ }
269+
270+ SwitchingApplicationImage {
271+ id: mainStageImage
272+ anchors.bottom: parent.bottom
273+ width: parent.width
274+ visible: false
275+
276+ onSwitched: {
277+ sideStageImage.visible = false;
278+ }
279+ }
280+
281+ Rectangle {
282+ id: mainStageSplash
283+ anchors.fill: root
284+ anchors.rightMargin: root.width - sideStageImage.x
285+ color: "white"
286+ }
287+
288+ SidestageHandle {
289+ id: sideStageHandle
290+ anchors { top: parent.top; right: sideStageImage.left; bottom: parent.bottom }
291+ width: root.dragAreaWidth
292+ visible: root.shown && priv.sideStageAppId && sideStageImage.x < root.width
293+
294+ }
295+ MouseArea {
296+ id: sideStageHandleMouseArea
297+ anchors { top: parent.top; right: parent.right; bottom: parent.bottom; rightMargin: sideStageImage.shown ? sideStageImage.width : 0}
298+ width: root.dragAreaWidth
299+ visible: priv.sideStageAppId
300+
301+ property var dragPoints: new Array()
302+
303+ onPressed: {
304+ priv.requestNewScreenshot(ApplicationInfoInterface.SideStage)
305+ if (priv.mainStageAppId) {
306+ priv.requestNewScreenshot(ApplicationInfoInterface.MainStage)
307+ }
308+ }
309+
310+ onMouseXChanged: {
311+ dragPoints.push(mouseX)
312+
313+ var dragPoint = root.width + mouseX;
314+ if (sideStageImage.shown) {
315+ dragPoint -= sideStageImage.width
316+ }
317+ sideStageImage.x = Math.max(root.width - sideStageImage.width, dragPoint)
318+ }
319+
320+ onReleased: {
321+ var distance = 0;
322+ var lastX = dragPoints[0];
323+ var oneWayFlick = true;
324+ for (var i = 0; i < dragPoints.length; ++i) {
325+ if (dragPoints[i] < lastX) {
326+ oneWayFlick = false;
327+ }
328+ distance += dragPoints[i] - lastX;
329+ lastX = dragPoints[i];
330+ }
331+ dragPoints = [];
332+
333+ if (oneWayFlick || distance > sideStageImage.width / 2) {
334+ sideStageImage.snapTo(root.width)
335+ } else {
336+ sideStageImage.snapToApp(priv.sideStageApp)
337+ }
338+ }
339+ }
340+
341+ SwitchingApplicationImage {
342+ id: sideStageImage
343+ width: priv.sideStageWidth
344+ height: root.height
345+ x: root.width
346+ anchors.bottom: parent.bottom
347+ visible: true
348+ property bool shown: false
349+
350+ onSwitched: {
351+ mainStageImage.visible = false;
352+ ApplicationManager.focusApplication(application.appId)
353+ }
354+
355+ function snapTo(targetX) {
356+ sideStageSnapAnimation.targetX = targetX
357+ sideStageImage.visible = true;
358+ if (priv.mainStageAppId) {
359+ mainStageImage.application = priv.mainStageApp
360+ mainStageImage.visible = true;
361+ }
362+ sideStageSnapAnimation.start();
363+ }
364+
365+ function snapToApp(application) {
366+ sideStageImage.application = application
367+ sideStageSnapAnimation.snapToId = application.appId;
368+ snapTo(root.width - sideStageImage.width);
369+ }
370+
371+ SequentialAnimation {
372+ id: sideStageSnapAnimation
373+ property int targetX: root.width
374+ property string snapToId
375+
376+ UbuntuNumberAnimation { target: sideStageImage; property: "x"; to: sideStageSnapAnimation.targetX; duration: UbuntuAnimation.SlowDuration }
377+ ScriptAction {
378+ script: {
379+ if (sideStageSnapAnimation.targetX == root.width) {
380+ if (priv.mainStageAppId) {
381+ ApplicationManager.focusApplication(priv.mainStageAppId)
382+ } else {
383+ priv.overlayOverride = true;
384+ ApplicationManager.unfocusCurrentApplication();
385+ }
386+ sideStageImage.shown = false;
387+ }
388+ if (sideStageSnapAnimation.snapToId) {
389+ ApplicationManager.focusApplication(sideStageSnapAnimation.snapToId)
390+ sideStageSnapAnimation.snapToId = "";
391+ sideStageImage.shown = true;
392+ priv.overlayOverride = false;
393+ }
394+ sideStageImage.visible = false;
395+ mainStageImage.visible = false;
396+ }
397+ }
398+ }
399+ }
400+
401+ Rectangle {
402+ id: sideStageSplash
403+ anchors.fill: parent
404+ anchors.leftMargin: sideStageImage.x
405+ color: "white"
406+ }
407+}
qml/Stages/SwitchingApplicationImage.qmlnew file+81
@@ -0,0 +1,81 @@
1+/*
2+ * Copyright 2014 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: Michael Zanetti <michael.zanetti@canonical.com>
17+*/
18+
19+import QtQuick 2.0
20+import Ubuntu.Components 0.1
21+
22+Rectangle {
23+ id: root
24+ implicitHeight: image.implicitHeight
25+ implicitWidth: image.implicitWidth
26+ color: "black"
27+
28+ property var application
29+
30+ signal switched()
31+
32+ function switchTo(application) {
33+ if (root.application == application) {
34+ root.switched();
35+ return;
36+ }
37+
38+ priv.newApplication = application
39+ root.visible = true;
40+ switchToAnimation.start()
41+ }
42+
43+ QtObject {
44+ id: priv
45+ property var newApplication
46+ }
47+
48+ Image {
49+ id: newImage
50+ anchors.bottom: parent.bottom
51+ width: root.width
52+ source: priv.newApplication ? priv.newApplication.screenshot : ""
53+ }
54+
55+ Image {
56+ id: image
57+ visible: true
58+ source: root.application ? root.application.screenshot : ""
59+ width: root.width
60+ height: sourceSize.height
61+ anchors.bottom: parent.bottom
62+
63+ }
64+
65+ SequentialAnimation {
66+ id: switchToAnimation
67+ ParallelAnimation {
68+ UbuntuNumberAnimation { target: image; property: "x"; from: 0; to: root.width; duration: UbuntuAnimation.SlowDuration }
69+ UbuntuNumberAnimation { target: newImage; property: "scale"; from: 0.7; to: 1; duration: UbuntuAnimation.SlowDuration }
70+ }
71+ ScriptAction {
72+ script: {
73+ image.x = 0
74+ root.application = priv.newApplication
75+ root.visible = false;
76+ priv.newApplication = null
77+ root.switched();
78+ }
79+ }
80+ }
81+}
qml/Stages/TransformedSpreadDelegate.qmlnew file+327
@@ -0,0 +1,327 @@
1+/*
2+ * Copyright 2014 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: Michael Zanetti <michael.zanetti@canonical.com>
17+*/
18+
19+import QtQuick 2.0
20+import Utils 0.1
21+import Ubuntu.Components 0.1
22+
23+SpreadDelegate {
24+ id: root
25+
26+ property bool selected: false
27+ property bool otherSelected: false
28+
29+ // The progress animates the tiles. A value > 0 makes it appear from the right edge. At 1 it reaches the end position.
30+ property real progress: 0
31+ // This is required to snap tile 1 during phase 1 and 2.
32+ property real animatedProgress: 0
33+
34+ property real startAngle: 0
35+ property real endAngle: 0
36+
37+ property real startScale: 1
38+ property real endScale: 1
39+
40+ // Specific to just one tile
41+ property real tile1StartScale: startScale + .4
42+ property real tile0SnapAngle: 10
43+
44+ property real startDistance: units.gu(5)
45+ property real endDistance: units.gu(.5)
46+
47+ onSelectedChanged: {
48+ if (selected) {
49+ priv.snapshot();
50+ }
51+ priv.isSelected = selected;
52+ }
53+
54+ onOtherSelectedChanged: {
55+ if (otherSelected) {
56+ priv.snapshot();
57+ }
58+ priv.otherSelected = otherSelected;
59+ }
60+
61+ Connections {
62+ target: spreadView
63+ onPhaseChanged: {
64+ if (spreadView.phase == 1) {
65+ if (index == 0) {
66+ priv.phase2startTranslate = priv.easingAnimation(0, spreadView.positionMarker4, 0, -spreadView.width, spreadView.positionMarker4) + spreadView.width;
67+ priv.phase2startAngle = priv.easingAnimation(0, spreadView.positionMarker4, root.startAngle, root.endAngle, spreadView.positionMarker4);
68+ priv.phase2startScale = priv.easingAnimation(0, spreadView.positionMarker4, root.startScale, root.endScale, spreadView.positionMarker4);
69+ priv.phase2startTopMarginProgress = priv.easingAnimation(0, 1, 0, 1, spreadView.positionMarker4);
70+ } else if (index == 1) {
71+ // find where the main easing for Tile 1 would be when reaching phase 2
72+ var phase2Progress = spreadView.positionMarker4 - spreadView.tileDistance / spreadView.width;
73+ priv.phase2startTranslate = priv.easingAnimation(0, phase2Progress, 0, -spreadView.width + root.endDistance, phase2Progress);
74+ priv.phase2startAngle = priv.easingAnimation(0, phase2Progress, root.startAngle, root.endAngle, phase2Progress);
75+ priv.phase2startScale = priv.easingAnimation(0, phase2Progress, root.startScale, root.endScale, phase2Progress);
76+ priv.phase2startTopMarginProgress = priv.easingAnimation(0, 1, 0, spreadView.positionMarker4, phase2Progress);
77+ }
78+ }
79+ }
80+ }
81+
82+ QtObject {
83+ id: priv
84+ property bool isSelected: false
85+ property bool otherSelected: false
86+ property real selectedProgress
87+ property real selectedXTranslate
88+ property real selectedAngle
89+ property real selectedScale
90+ property real selectedOpacity
91+ property real selectedTopMarginProgress
92+
93+ // Those values are needed as target values for the end of phase 1.
94+ // As they are static values, lets calculate them once when entering phase 1 instead of calculating them in each animation pass.
95+ property real phase2startTranslate
96+ property real phase2startAngle
97+ property real phase2startScale
98+ property real phase2startTopMarginProgress
99+
100+ function snapshot() {
101+ selectedProgress = root.progress;
102+ selectedXTranslate = xTranslate;
103+ selectedAngle = angle;
104+ selectedScale = scale;
105+ selectedOpacity = opacity;
106+ selectedTopMarginProgress = topMarginProgress;
107+ }
108+
109+ // This calculates how much negative progress there can be if unwinding the spread completely
110+ // the progress for each tile starts at 0 when it crosses the right edge, so the later a tile comes in,
111+ // the bigger its negativeProgress can be.
112+ property real negativeProgress: {
113+ if (index == 1 && spreadView.phase < 2) {
114+ return 0;
115+ }
116+ return -index * spreadView.tileDistance / spreadView.width;
117+ }
118+
119+ function linearAnimation(startProgress, endProgress, startValue, endValue, progress) {
120+ // progress : progressDiff = value : valueDiff => value = progress * valueDiff / progressDiff
121+ return (progress - startProgress) * (endValue - startValue) / (endProgress - startProgress) + startValue;
122+ }
123+
124+ function easingAnimation(startProgress, endProgress, startValue, endValue, progress) {
125+ helperEasingCurve.progress = progress - startProgress;
126+ helperEasingCurve.period = endProgress - startProgress;
127+ return helperEasingCurve.value * (endValue - startValue) + startValue;
128+ }
129+
130+ property real animatedEndDistance: linearAnimation(0, 2, root.endDistance, 0, root.progress)
131+
132+ // The following blocks handle the animation of the tile in the spread.
133+ // At the beginning, each tile is attached at the right edge, outside the screen.
134+ // The progress for each tile starts at 0 and it reaches its end position at a progress of 1.
135+ // The first phases are handled special for the first 2 tiles. as we do the alt-tab and snapping in there
136+ // Once we reached phase 3, the animation is the same for all tiles.
137+ // When a tile is selected, the animation state is snapshotted, and the spreadView is unwound (progress animates
138+ // back to negativeProgress). All tiles are kept in place and faded out to 0 opacity except
139+ // the selected tile, which is animated from the snapshotted position to be fullscreen.
140+
141+ property real xTranslate: {
142+ if (otherSelected) {
143+ if (spreadView.phase < 2 && index == 0) {
144+ return linearAnimation(selectedProgress, negativeProgress,
145+ selectedXTranslate, selectedXTranslate - spreadView.tileDistance, root.progress);
146+ }
147+
148+ return selectedXTranslate;
149+ }
150+
151+ switch (index) {
152+ case 0:
153+ if (spreadView.phase == 0) {
154+ return Math.min(0, linearAnimation(0, spreadView.positionMarker2,
155+ 0, -spreadView.width * .25, root.animatedProgress));
156+ } else if (spreadView.phase == 1){
157+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4,
158+ -spreadView.width * .25, priv.phase2startTranslate, root.progress);
159+ } else if (!priv.isSelected){ // phase 2
160+ // Apply the same animation as with the rest but add spreadView.width to align it with the others.
161+ return -easingCurve.value * spreadView.width + spreadView.width;
162+ } else if (priv.isSelected) {
163+ return linearAnimation(selectedProgress, negativeProgress, selectedXTranslate, 0, root.progress);
164+ }
165+
166+ case 1:
167+ if (spreadView.phase == 0 && !priv.isSelected) {
168+ return linearAnimation(0, spreadView.positionMarker2,
169+ 0, -spreadView.width * spreadView.snapPosition, root.animatedProgress);
170+ } else if (spreadView.phase == 1 && !priv.isSelected) {
171+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4,
172+ -spreadView.width * spreadView.snapPosition, priv.phase2startTranslate,
173+ root.progress);
174+ }
175+ }
176+
177+ if (priv.isSelected) {
178+ // Distance to left edge
179+ var targetTranslate = -spreadView.width - ((index - 1) * root.startDistance);
180+ return linearAnimation(selectedProgress, negativeProgress,
181+ selectedXTranslate, targetTranslate, root.progress);
182+ }
183+
184+ // Fix it at the right edge...
185+ var rightEdgeOffset = -((index - 1) * root.startDistance);
186+ // ...and use our easing to move them to the left. Stop a bit earlier for each tile
187+ return -easingCurve.value * spreadView.width + (index * animatedEndDistance) + rightEdgeOffset;
188+
189+ }
190+
191+ property real angle: {
192+ if (priv.otherSelected) {
193+ return priv.selectedAngle;
194+ }
195+ if (priv.isSelected) {
196+ return linearAnimation(selectedProgress, negativeProgress, selectedAngle, 0, root.progress);
197+ }
198+ switch (index) {
199+ case 0:
200+ if (spreadView.phase == 0) {
201+ return Math.max(0, linearAnimation(0, spreadView.positionMarker2,
202+ 0, root.tile0SnapAngle, root.animatedProgress));
203+ } else if (spreadView.phase == 1) {
204+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4,
205+ root.tile0SnapAngle, phase2startAngle, root.progress);
206+ }
207+ case 1:
208+ if (spreadView.phase == 0) {
209+ return linearAnimation(0, spreadView.positionMarker2, root.startAngle,
210+ root.startAngle * (1-spreadView.snapPosition), root.animatedProgress);
211+ } else if (spreadView.phase == 1) {
212+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4,
213+ root.startAngle * (1-spreadView.snapPosition), priv.phase2startAngle,
214+ root.progress);
215+ }
216+ }
217+ return root.startAngle - easingCurve.value * (root.startAngle - root.endAngle);
218+ }
219+
220+ property real scale: {
221+ if (priv.otherSelected) {
222+ return priv.selectedScale;
223+ }
224+ if (priv.isSelected) {
225+ return linearAnimation(selectedProgress, negativeProgress, selectedScale, 1, root.progress);
226+ }
227+
228+ switch (index) {
229+ case 0:
230+ if (spreadView.phase == 0) {
231+ return 1;
232+ } else if (spreadView.phase == 1) {
233+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4,
234+ 1, phase2startScale, root.progress);
235+ }
236+ case 1:
237+ if (spreadView.phase == 0) {
238+ var targetScale = tile1StartScale - ((tile1StartScale - 1) * spreadView.snapPosition);
239+ return linearAnimation(0, spreadView.positionMarker2,
240+ root.tile1StartScale, targetScale, root.animatedProgress);
241+ } else if (spreadView.phase == 1) {
242+ var startScale = tile1StartScale - ((tile1StartScale - 1) * spreadView.snapPosition);
243+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4,
244+ startScale, priv.phase2startScale, root.progress);
245+ }
246+ }
247+ return root.startScale - easingCurve.value * (root.startScale - root.endScale);
248+ }
249+
250+ property real opacity: {
251+ if (priv.otherSelected) {
252+ return linearAnimation (selectedProgress, Math.max(0, selectedProgress - .5),
253+ selectedOpacity, 0, root.progress);
254+ }
255+ if (index == 0) {
256+ switch (spreadView.phase) {
257+ case 0:
258+ return linearAnimation(0, spreadView.positionMarker2, 1, .3, root.animatedProgress);
259+ case 1:
260+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4,
261+ .3, 1, root.animatedProgress);
262+ }
263+ }
264+
265+ return 1;
266+ }
267+
268+ property real topMarginProgress: {
269+ if (priv.isSelected) {
270+ return linearAnimation(selectedProgress, negativeProgress, selectedTopMarginProgress, 0, root.progress);
271+ }
272+
273+ switch (index) {
274+ case 0:
275+ if (spreadView.phase == 0) {
276+ return 0;
277+ } else if (spreadView.phase == 1) {
278+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4,
279+ 0, priv.phase2startTopMarginProgress, root.progress);
280+ }
281+ break;
282+ case 1:
283+ if (spreadView.phase == 0) {
284+ return 0;
285+ } else if (spreadView.phase == 1) {
286+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4,
287+ 0, priv.phase2startTopMarginProgress, root.progress);
288+ }
289+ }
290+
291+ return easingCurve.value;
292+ }
293+ }
294+
295+ transform: [
296+ Rotation {
297+ origin { x: 0; y: spreadView.height / 2 }
298+ axis { x: 0; y: 1; z: 0 }
299+ angle: priv.angle
300+ },
301+ Scale {
302+ origin { x: 0; y: spreadView.height / 2 }
303+ xScale: priv.scale
304+ yScale: xScale
305+ },
306+ Translate {
307+ x: priv.xTranslate
308+ }
309+ ]
310+ opacity: priv.opacity
311+ topMarginProgress: priv.topMarginProgress
312+
313+ EasingCurve {
314+ id: easingCurve
315+ type: EasingCurve.OutSine
316+ period: 1 - spreadView.positionMarker2
317+ progress: root.animatedProgress
318+ }
319+
320+ // This is used as a calculation helper to figure values for progress other than the current one
321+ // Do not bind anything to this...
322+ EasingCurve {
323+ id: helperEasingCurve
324+ type: easingCurve.type
325+ period: easingCurve.period
326+ }
327+}
qml/Stages/graphics/dropshadow.pngnew file

Binary file not shown.

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

Binary file not shown.

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

The content is the same.

src/ApplicationArguments.h+2−2
@@ -29,8 +29,8 @@ class ApplicationArguments : public QObject
2929 Q_OBJECT
3030public:
3131 ApplicationArguments(const QStringList& args) {
32− if (args.contains(QLatin1String("-geometry")) && args.size() > args.indexOf(QLatin1String("-geometry")) + 1) {
33− QStringList geometryArg = args.at(args.indexOf(QLatin1String("-geometry")) + 1).split('x');
32+ if (args.contains(QLatin1String("-windowgeometry")) && args.size() > args.indexOf(QLatin1String("-windowgeometry")) + 1) {
33+ QStringList geometryArg = args.at(args.indexOf(QLatin1String("-windowgeometry")) + 1).split('x');
3434 if (geometryArg.size() == 2) {
3535 m_size.rwidth() = geometryArg.at(0).toInt();
3636 m_size.rheight() = geometryArg.at(1).toInt();
src/Panel/Indicators/client/indicatorsclient.cpp+2−2
@@ -49,8 +49,8 @@ IndicatorsClient::IndicatorsClient(int &argc, char **argv)
4949
5050 m_view->setSource(QUrl("IndicatorsClient.qml"));
5151 m_view->setResizeMode(QQuickView::SizeRootObjectToView);
52− if (args.contains(QLatin1String("-geometry")) && args.size() > args.indexOf(QLatin1String("-geometry")) + 1) {
53− QStringList geometryArg = args.at(args.indexOf(QLatin1String("-geometry")) + 1).split('x');
52+ if (args.contains(QLatin1String("-windowgeometry")) && args.size() > args.indexOf(QLatin1String("-windowgeometry")) + 1) {
53+ QStringList geometryArg = args.at(args.indexOf(QLatin1String("-windowgeometry")) + 1).split('x');
5454 if (geometryArg.size() == 2) {
5555 m_view->resize(geometryArg.at(0).toInt(), geometryArg.at(1).toInt());
5656 }
src/main.cpp+3−6
@@ -117,13 +117,10 @@ int startShell(int argc, const char** argv, void* server)
117117
118118 QUrl source(::qmlDirectory()+"Shell.qml");
119119 prependImportPaths(view->engine(), ::overrideImportPaths());
120− appendImportPaths(view->engine(), ::fallbackImportPaths());
121−
122− if (isUbuntuMirServer) {
123− QStringList importPaths = view->engine()->importPathList();
124− importPaths.replaceInStrings(QRegExp("qt5/imports$"), "qt5/imports/Unity-Mir");
125− view->engine()->setImportPathList(importPaths);
120+ if (!isUbuntuMirServer) {
121+ prependImportPaths(view->engine(), ::nonMirImportPaths());
126122 }
123+ appendImportPaths(view->engine(), ::fallbackImportPaths());
127124
128125 view->setSource(source);
129126 view->setColor("transparent");
tests/CMakeLists.txt+2−2
@@ -1,7 +1,7 @@
1−# QML tests that do not require graphical capabitlies.
1+# QML tests that do not require graphical capabilities.
22add_custom_target(qmlunittests)
33
4−# QML tests that require graphical capabitlies.
4+# QML tests that require graphical capabilities.
55add_custom_target(qmluitests)
66
77add_custom_target(qmltests)
tests/autopilot/unity8/application_lifecycle/tests/test_url_dispatcher.py+5−40
@@ -20,12 +20,11 @@
2020"""Test the integration with the URL dispatcher service."""
2121
2222import os
23−import tempfile
2423
2524from autopilot import platform
2625from autopilot.matchers import Eventually
2726from testtools.matchers import Equals
28−from ubuntuuitoolkit import base as toolkit_base
27+from ubuntuuitoolkit import fixture_setup
2928
3029from unity8 import process_helpers
3130from unity8.shell import tests
@@ -47,13 +46,6 @@ MainView {
4746 text: 'Test application.'
4847 }
4948}
50−""")
51−
52− desktop_file_contents = ("""[Desktop Entry]
53−Type=Application
54−Name=test
55−Exec={qmlscene} {qml_file_path}
56−Icon=Not important
5749""")
5850
5951 def setUp(self):
@@ -66,37 +58,10 @@ Icon=Not important
6658 process_helpers.unlock_unity(unity_proxy)
6759
6860 def create_test_application(self):
69− # FIXME most of this code is duplicated in the toolkit. We should
70− # create a fixture on the toolkit for other projects to use.
71− # http://pad.lv/1277334 --elopio - 2014-02-06
72− qml_file_path = self._write_test_qml_file()
73− self.addCleanup(os.remove, qml_file_path)
74− desktop_file_path = self._write_test_desktop_file(qml_file_path)
75− self.addCleanup(os.remove, desktop_file_path)
76− return qml_file_path, desktop_file_path
77−
78− def _write_test_qml_file(self):
79− qml_file = tempfile.NamedTemporaryFile(suffix='.qml', delete=False)
80− qml_file.write(self.test_qml.encode('utf-8'))
81− qml_file.close()
82− return qml_file.name
83−
84− def _write_test_desktop_file(self, qml_file_path):
85− desktop_file_dir = self._get_local_desktop_file_directory()
86− if not os.path.exists(desktop_file_dir):
87− os.makedirs(desktop_file_dir)
88− desktop_file = tempfile.NamedTemporaryFile(
89− suffix='.desktop', dir=desktop_file_dir, delete=False)
90− contents = self.desktop_file_contents.format(
91− qmlscene=toolkit_base.get_qmlscene_launch_command(),
92− qml_file_path=qml_file_path)
93− desktop_file.write(contents.encode('utf-8'))
94− desktop_file.close()
95− return desktop_file.name
96−
97− def _get_local_desktop_file_directory(self):
98− return os.path.join(
99− os.environ.get('HOME'), '.local', 'share', 'applications')
61+ fake_application = fixture_setup.FakeApplication(self.test_qml)
62+ self.useFixture(fake_application)
63+ return (
64+ fake_application.qml_file_path, fake_application.desktop_file_path)
10065
10166 def test_swipe_out_application_started_by_url_dispatcher(self):
10267 _, desktop_file_path = self.create_test_application()
tests/autopilot/unity8/shell/emulators/dash.py+31−55
@@ -36,11 +36,9 @@ class Dash(emulators.UnityEmulatorBase):
3636 self.dash_content_list = self.wait_select_single(
3737 'QQuickListView', objectName='dashContentList')
3838
39− def get_home_applications_grid(self):
40− get_grid = self.get_scope('home').wait_select_single(
41− "GenericFilterGrid",
42− objectName="applications.scope"
43− )
39+ def get_applications_grid(self):
40+ get_grid = self.get_scope('clickscope').wait_select_single(
41+ 'CardFilterGrid', objectName='local')
4442 return get_grid
4543
4644 def get_application_icon(self, text):
@@ -50,24 +48,22 @@ class Dash(emulators.UnityEmulatorBase):
5048 :param text: String containing the text of the icon to search for.
5149
5250 """
53− app_grid = self.get_home_applications_grid()
51+ app_grid = self.get_applications_grid()
5452 resp_grid = app_grid.wait_select_single('ResponsiveGridView')
5553 return resp_grid.select_single('Tile', text=text)
5654
57− def get_scope(self, scope_name='home'):
58− scope_id = "%s.scope" % scope_name
55+ def get_scope(self, scope_name='clickscope'):
5956 return self.dash_content_list.select_single(
60− 'QQuickLoader', scopeId=scope_id)
57+ 'QQuickLoader', scopeId=scope_name)
6158
6259 @autopilot_logging.log_action(logger.info)
63− def open_scope(self, scope_name):
60+ def open_scope(self, scope_id):
6461 """Open a dash scope.
6562
66− :parameter scope_name: The name of the scope.
63+ :parameter scope_id: The id of the scope.
6764 :return: The scope.
6865
6966 """
70− scope_id = "%s.scope" % scope_name
7167 scope_loader = self._get_scope_loader(scope_id)
7268 if scope_loader.isCurrent:
7369 logger.info('The scope is already open.')
@@ -84,10 +80,7 @@ class Dash(emulators.UnityEmulatorBase):
8480 'No scope found with id {0}'.format(scope_id))
8581
8682 def _get_scope_from_loader(self, loader):
87− if loader.scopeId == 'applications.scope':
88− return loader.select_single(DashApps)
89− else:
90− return loader.select_single(GenericScopeView)
83+ return loader.get_children()[0]
9184
9285 def _open_scope_scrolling(self, scope_loader):
9386 scroll = self._get_scroll_direction(scope_loader)
@@ -115,7 +108,7 @@ class Dash(emulators.UnityEmulatorBase):
115108 original_index = self.dash_content_list.currentIndex
116109 # Scroll on the border of the page header, because some scopes have
117110 # contents that can be scrolled horizontally.
118− page_header = self.select_single('PageHeader')
111+ page_header = self._get_page_header()
119112 border = page_header.select_single('QQuickBorderImage')
120113 start_x = border.width / 3
121114 stop_x = border.width / 3 * 2
@@ -123,12 +116,15 @@ class Dash(emulators.UnityEmulatorBase):
123116 self.pointing_device.drag(start_x, start_y, stop_x, stop_y)
124117 self.dash_content_list.currentIndex.wait_for(original_index - 1)
125118
119+ def _get_page_header(self):
120+ return self.select_single('PageHeader', objectName='pageHeader')
121+
126122 @autopilot_logging.log_action(logger.info)
127123 def _scroll_to_right_scope(self):
128124 original_index = self.dash_content_list.currentIndex
129125 # Scroll on the border of the page header, because some scopes have
130126 # contents that can be scrolled horizontally.
131− page_header = self.select_single('PageHeader')
127+ page_header = self._get_page_header()
132128 border = page_header.select_single('QQuickBorderImage')
133129 start_x = border.width / 3 * 2
134130 stop_x = border.width / 3
@@ -137,42 +133,29 @@ class Dash(emulators.UnityEmulatorBase):
137133 self.dash_content_list.currentIndex.wait_for(original_index + 1)
138134
139135
140−class DashPreview(emulators.UnityEmulatorBase):
141− """Autopilot emulator for the generic preview."""
142−
143− def get_details(self):
144− """Return the details of the open preview."""
145− title = self.select_single('Label', objectName='titleLabel').text
146− subtitle = self.select_single(
147− 'Label', objectName='subtitleLabel').text
148− description = self.select_single(
149− 'Label', objectName='descriptionLabel').text
150− return dict(title=title, subtitle=subtitle, description=description)
151−
152−
153136class GenericScopeView(emulators.UnityEmulatorBase):
154137 """Autopilot emulator for generic scopes."""
155138
156− preview_class = DashPreview
157−
158139 @autopilot_logging.log_action(logger.info)
159140 def open_preview(self, category, app_name):
160141 """Open the preview of an application.
161142
162143 :parameter category: The name of the category where the application is.
163144 :app_name: The name of the application.
145+ :return: The opened preview.
164146
165147 """
166148 category_element = self._get_category_element(category)
167− icon = category_element.select_single('Tile', text=app_name)
149+ icon = category_element.select_single('Card', title=app_name)
168150 # FIXME some categories need a long press in order to see the preview.
169151 # Some categories do not show previews, like recent apps.
170152 # --elopio - 2014-1-14
171153 self.pointing_device.click_object(icon)
172− preview = self.get_root_instance().wait_select_single(
173− self.preview_class, isCurrent=True)
174− preview.showProcessingAction.wait_for(False)
175− return preview
154+ preview_list = self.get_root_instance().wait_select_single(
155+ 'PreviewListView', objectName='dashContentPreviewList')
156+ preview_list.x.wait_for(0)
157+ return preview_list.select_single(
158+ Preview, objectName='preview{}'.format(preview_list.currentIndex))
176159
177160 def _get_category_element(self, category):
178161 try:
@@ -183,24 +166,9 @@ class GenericScopeView(emulators.UnityEmulatorBase):
183166 'No category found with name {}'.format(category))
184167
185168
186−class AppPreview(DashPreview):
187− """Autopilot emulator for the application preview."""
188−
189− def get_details(self):
190− """Return the details of the application showed in its preview."""
191− details = super(AppPreview, self).get_details()
192− # TODO return screenshots, icon, rating and reviews.
193− # --elopio - 2014-1-15
194− return dict(
195− title=details.get('title'), publisher=details.get('subtitle'),
196− description=details.get('description'))
197−
198−
199169class DashApps(GenericScopeView):
200170 """Autopilot emulator for the applications scope."""
201171
202− preview_class = AppPreview
203−
204172 def get_applications(self, category):
205173 """Return the list of applications on a category.
206174
@@ -208,7 +176,15 @@ class DashApps(GenericScopeView):
208176
209177 """
210178 category_element = self._get_category_element(category)
211− application_tiles = category_element.select_many('Tile')
179+ application_tiles = category_element.select_many('Card')
212180 # TODO return them on the same order they are displayed.
213181 # --elopio - 2014-1-15
214− return [tile.text for tile in application_tiles]
182+ result = []
183+ for card in application_tiles:
184+ if card.objectName != 'cardToolCard':
185+ result.append(card)
186+ return result
187+
188+
189+class Preview(emulators.UnityEmulatorBase):
190+ """Autopilot custom proxy object for generic previews."""
tests/autopilot/unity8/shell/emulators/main_window.py+1−5
@@ -42,10 +42,6 @@ class QQuickView(emulators.UnityEmulatorBase):
4242 objectName="greeterContentLoader"
4343 )
4444
45− def get_greeter_background(self):
46− return self.select_single(
47− "CrossFadeImage", objectName="greeterBackground")
48−
4945 def get_login_loader(self):
5046 return self.select_single("QQuickLoader", objectName="loginLoader")
5147
@@ -116,4 +112,4 @@ class QQuickView(emulators.UnityEmulatorBase):
116112
117113 def get_current_focused_app_id(self):
118114 """Return the id of the focused application."""
119− return self.select_single('Shell').currentFocusedAppId
115+ return self.select_single('Shell').focusedApplicationId
tests/autopilot/unity8/shell/tests/__init__.py+2−2
@@ -181,7 +181,7 @@ class UnityTestCase(AutopilotTestCase):
181181 )
182182 geo_string = "%dx%d" % (width, height)
183183 self.unity_geometry_args = [
184− '-geometry',
184+ '-windowgeometry',
185185 geo_string,
186186 '-frameless',
187187 '-mousetouch'
@@ -376,7 +376,7 @@ class UnityTestCase(AutopilotTestCase):
376376
377377 def assertUnityReady(self):
378378 dash = self.get_dash()
379− home_scope = dash.get_scope('home')
379+ home_scope = dash.get_scope('clickscope')
380380
381381 # FIXME! There is a huge timeout here for when we're doing CI on
382382 # VMs. See lp:1203715
tests/autopilot/unity8/shell/tests/test_emulators.py+29−53
@@ -60,14 +60,13 @@ class DashEmulatorTestCase(DashBaseTestCase):
6060 self.dash.open_scope, scope_name)
6161
6262 self.assertEqual(
63− 'No scope found with id unexisting.scope', str(exception))
63+ 'No scope found with id unexisting', str(exception))
6464 self.assertFalse(mock_pointer.called)
6565
6666 def test_open_already_opened_scope(self):
6767 scope_id = self._get_current_scope_id()
6868 with mock.patch.object(self.dash, 'pointing_device') as mock_pointer:
69− scope = self.dash.open_scope(self._get_scope_name_from_id(
70− scope_id))
69+ scope = self.dash.open_scope(scope_id)
7170
7271 self.assertFalse(mock_pointer.called)
7372 self._assert_scope_is_opened(scope, scope_id)
@@ -83,12 +82,11 @@ class DashEmulatorTestCase(DashBaseTestCase):
8382 return scope.scopeId
8483
8584 def test_open_scope_to_the_right(self):
86− leftmost_scope = self._get_scope_name_from_id(
87− self._get_leftmost_scope_id())
85+ leftmost_scope = self._get_leftmost_scope_id()
8886 self.dash.open_scope(leftmost_scope)
8987
9088 scope_id = self._get_rightmost_scope_id()
91− scope = self.dash.open_scope(self._get_scope_name_from_id(scope_id))
89+ scope = self.dash.open_scope(scope_id)
9290 self._assert_scope_is_opened(scope, scope_id)
9391
9492 def _get_leftmost_scope_id(self):
@@ -104,10 +102,6 @@ class DashEmulatorTestCase(DashBaseTestCase):
104102 'QQuickItem')[0]
105103 return item.get_children_by_type('QQuickLoader')
106104
107− def _get_scope_name_from_id(self, scope_id):
108− if scope_id.endswith('.scope'):
109− return scope_id[:-6]
110−
111105 def _get_rightmost_scope_id(self):
112106 scope_loaders = self._get_scope_loaders()
113107 rightmost_scope_loader = scope_loaders[0]
@@ -117,23 +111,22 @@ class DashEmulatorTestCase(DashBaseTestCase):
117111 return rightmost_scope_loader.scopeId
118112
119113 def test_open_scope_to_the_left(self):
120− rightmost_scope = self._get_scope_name_from_id(
121− self._get_rightmost_scope_id())
114+ rightmost_scope = self._get_rightmost_scope_id()
122115 self.dash.open_scope(rightmost_scope)
123116
124117 scope_id = self._get_leftmost_scope_id()
125− scope = self.dash.open_scope(self._get_scope_name_from_id(scope_id))
118+ scope = self.dash.open_scope(scope_id)
126119 self._assert_scope_is_opened(scope, scope_id)
127120
128121 def test_open_generic_scope(self):
129− scope_id = 'home.scope'
130− scope = self.dash.open_scope(self._get_scope_name_from_id(scope_id))
122+ scope_id = 'scopes'
123+ scope = self.dash.open_scope(scope_id)
131124 self._assert_scope_is_opened(scope, scope_id)
132125 self.assertIsInstance(scope, dash_emulators.GenericScopeView)
133126
134127 def test_open_applications_scope(self):
135− scope_id = 'applications.scope'
136− scope = self.dash.open_scope(self._get_scope_name_from_id(scope_id))
128+ scope_id = 'clickscope'
129+ scope = self.dash.open_scope(scope_id)
137130 self._assert_scope_is_opened(scope, scope_id)
138131 self.assertIsInstance(scope, dash_emulators.DashApps)
139132
@@ -144,36 +137,26 @@ class GenericScopeViewEmulatorTestCase(DashBaseTestCase):
144137 # Set up the fake scopes before launching unity.
145138 self.useFixture(fixture_setup.FakeScopes())
146139 super(GenericScopeViewEmulatorTestCase, self).setUp()
147− self.home_scope = self.dash.open_scope('home')
140+ self.generic_scope = self.dash.open_scope('MockScope1')
148141
149142 def test_open_preview(self):
150− preview = self.home_scope.open_preview('0', 'Title.0')
151− self.assertIsInstance(preview, dash_emulators.DashPreview)
143+ preview = self.generic_scope.open_preview('0', 'Title.0.0')
144+ self.assertIsInstance(preview, dash_emulators.Preview)
152145 self.assertTrue(preview.isCurrent)
153− self.assertFalse(preview.showProcessingAction)
154−
155− def test_get_details(self):
156− expected_details = dict(
157− title='Title', subtitle='Subtitle', description='Description')
158−
159− preview = self.home_scope.open_preview('0', 'Title.0')
160− details = preview.get_details()
161−
162− self.assertEqual(expected_details, details)
163146
164147
165148class DashAppsEmulatorTestCase(DashBaseTestCase):
166149
167150 available_applications = [
168− 'Title.1', 'Title.21', 'Title.41', 'Title.61', 'Title.81',
169− 'Title.101', 'Title.121', 'Title.141', 'Title.161', 'Title.181',
170− 'Title.201', 'Title.221', 'Title.241', 'Title.261', 'Title.281']
151+ 'Title.2.0', 'Title.2.1', 'Title.2.2', 'Title.2.3', 'Title.2.4',
152+ 'Title.2.5', 'Title.2.6', 'Title.2.7', 'Title.2.8', 'Title.2.9',
153+ 'Title.2.9', 'Title.2.10', 'Title.2.11']
171154
172155 def setUp(self):
173156 # Set up the fake scopes before launching unity.
174157 self.useFixture(fixture_setup.FakeScopes())
175158 super(DashAppsEmulatorTestCase, self).setUp()
176− self.applications_scope = self.dash.open_scope('applications')
159+ self.applications_scope = self.dash.open_scope('clickscope')
177160
178161 def test_get_applications_with_unexisting_category(self):
179162 exception = self.assertRaises(
@@ -185,34 +168,27 @@ class DashAppsEmulatorTestCase(DashBaseTestCase):
185168 'No category found with name unexisting category', str(exception))
186169
187170 def test_get_applications_should_return_list_with_names(self):
188− category = 'installed'
171+ category = '2'
189172 expected_apps_count = self._get_number_of_application_slots(category)
190173 expected_applications = self.available_applications[
191174 :expected_apps_count]
192175
193176 applications = self.applications_scope.get_applications(category)
177+ applications_titles = []
178+ for application in applications:
179+ cardHeader = application.select_single('CardHeader')
180+ applications_titles.append(cardHeader.title)
194181
195182 self.assertThat(applications, HasLength(expected_apps_count))
196183 for expected in expected_applications:
197− self.assertThat(applications, Contains(expected))
184+ self.assertThat(applications_titles, Contains(expected))
198185
199186 def _get_number_of_application_slots(self, category):
200187 category_element = self.applications_scope._get_category_element(
201188 category)
202− grid = category_element.select_single('GenericFilterGrid')
203− return grid.columns * grid.rows
204−
205− def test_open_preview(self):
206− preview = self.applications_scope.open_preview('installed', 'Title.1')
207− self.assertIsInstance(preview, dash_emulators.AppPreview)
208− self.assertTrue(preview.isCurrent)
209− self.assertFalse(preview.showProcessingAction)
210−
211− def test_get_details(self):
212− expected_details = dict(
213− title='Title', publisher='', description='Description')
214−
215− preview = self.applications_scope.open_preview('installed', 'Title.1')
216− details = preview.get_details()
217−
218− self.assertEqual(expected_details, details)
189+ grid = category_element.select_single('CardFilterGrid')
190+ filtergrid = grid.select_single('FilterGrid')
191+ if (grid.filter):
192+ return filtergrid.collapsedRowCount * filtergrid.columns
193+ else:
194+ return filtergrid.uncollapsedRowCount * filtergrid.columns
tests/autopilot/unity8/shell/tests/test_greeter.pydeleted−38
@@ -1,38 +0,0 @@
1−# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2−#
3−# Unity Autopilot Test Suite
4−# Copyright (C) 2012-2013 Canonical
5−#
6−# This program is free software: you can redistribute it and/or modify
7−# it under the terms of the GNU General Public License as published by
8−# the Free Software Foundation, either version 3 of the License, or
9−# (at your option) any later version.
10−#
11−# This program is distributed in the hope that it will be useful,
12−# but WITHOUT ANY WARRANTY; without even the implied warranty of
13−# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14−# GNU General Public License for more details.
15−#
16−# You should have received a copy of the GNU General Public License
17−# along with this program. If not, see <http://www.gnu.org/licenses/>.
18−#
19−
20−from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
21−
22−from testtools.matchers import Equals
23−
24−class TestGreeter(UnityTestCase):
25−
26− """Tests the Shell Greeter."""
27−
28− scenarios = _get_device_emulation_scenarios()
29−
30− def test_greeter_background(self):
31− """Test that the background of the greeter and the background of the shell are placed correctly
32−
33− """
34− self.launch_unity()
35− self.main_window.get_greeter()
36− greeter_background = self.main_window.get_greeter_background()
37− shell_background = self.main_window.get_shell_background()
38− self.assertThat(greeter_background.globalRect, Equals(shell_background.globalRect))
tests/autopilot/unity8/shell/tests/test_notifications.py+1−1
@@ -194,7 +194,7 @@ class InteractiveNotificationBase(NotificationsBase):
194194
195195 notify_list = self._get_notifications_list()
196196 get_notification = lambda: notify_list.wait_select_single(
197− 'Notification', objectName='notification0')
197+ 'Notification', objectName='notification1')
198198 notification = get_notification()
199199 self._assert_notification(notification, None, None, True, True, 1.0)
200200 initial_height = notification.height
tests/autopilot/unity8/shell/tests/test_system_integration.py+2−1
@@ -22,6 +22,7 @@
2222import subprocess
2323import unittest
2424
25+from autopilot import platform
2526from unity8.shell.emulators import UnityEmulatorBase
2627from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
2728
@@ -31,7 +32,7 @@ class SystemIntegrationTests(UnityTestCase):
3132
3233 scenarios = _get_device_emulation_scenarios()
3334
34− @unittest.skip("Disabled until we can investigate jenkins failure")
35+ @unittest.skipIf(platform.model() == "Desktop", "Test is broken on otto, see bug 1281634.")
3536 def test_networkmanager_integration(self):
3637 self.launch_unity()
3738
tests/mocks/Ubuntu/CMakeLists.txt+1
@@ -1 +1,2 @@
11add_subdirectory(DownloadDaemonListener)
2+add_subdirectory(Thumbnailer)
tests/mocks/Ubuntu/Thumbnailer/CMakeLists.txtnew file+7
@@ -0,0 +1,7 @@
1+# copy files into build directory for shadow builds
2+add_custom_target(UbuntuThumbnailerQmlDirFile ALL
3+ COMMAND cp "${CMAKE_CURRENT_SOURCE_DIR}/qmldir" ${CMAKE_CURRENT_BINARY_DIR}
4+ DEPENDS qmldir
5+)
6+
7+install(FILES qmldir DESTINATION ${SHELL_INSTALL_QML}/mocks/Ubuntu/Thumbnailer)
tests/mocks/Ubuntu/Thumbnailer/qmldirnew file+2
@@ -0,0 +1,2 @@
1+module Ubuntu.Thumbnailer
2+Dummy 0.1 Dummy.qml
tests/mocks/Unity/Application/ApplicationInfo.cpp+9
@@ -20,6 +20,7 @@
2020#include <QQuickItem>
2121#include <QQuickView>
2222#include <QQmlComponent>
23+#include <QTimer>
2324
2425ApplicationInfo::ApplicationInfo(const QString &appId, QObject *parent)
2526 : ApplicationInfoInterface(appId, parent)
@@ -32,6 +33,7 @@ ApplicationInfo::ApplicationInfo(const QString &appId, QObject *parent)
3233 ,m_windowComponent(0)
3334 ,m_parentItem(0)
3435{
36+ QTimer::singleShot(300, this, SLOT(setRunning()));
3537}
3638
3739ApplicationInfo::ApplicationInfo(QObject *parent)
@@ -44,6 +46,7 @@ ApplicationInfo::ApplicationInfo(QObject *parent)
4446 ,m_windowComponent(0)
4547 ,m_parentItem(0)
4648{
49+ QTimer::singleShot(300, this, SLOT(setRunning()));
4750}
4851
4952void ApplicationInfo::onWindowComponentStatusChanged(QQmlComponent::Status status)
@@ -52,6 +55,12 @@ void ApplicationInfo::onWindowComponentStatusChanged(QQmlComponent::Status statu
5255 doCreateWindowItem();
5356}
5457
58+void ApplicationInfo::setRunning()
59+{
60+ m_state = Running;
61+ Q_EMIT stateChanged();
62+}
63+
5564void ApplicationInfo::createWindowComponent()
5665{
5766 // The assumptions I make here really should hold.
tests/mocks/Unity/Application/ApplicationInfo.h+2
@@ -74,6 +74,7 @@ class ApplicationInfo : public ApplicationInfoInterface {
7474 IMPLEMENT_PROPERTY(fullscreen, Fullscreen, bool)
7575 IMPLEMENT_PROPERTY(imageQml, ImageQml, QString)
7676 IMPLEMENT_PROPERTY(windowQml, WindowQml, QString)
77+ IMPLEMENT_PROPERTY(screenshot, Screenshot, QUrl)
7778
7879 #undef IMPLEMENT_PROPERTY
7980
@@ -83,6 +84,7 @@ class ApplicationInfo : public ApplicationInfoInterface {
8384
8485 private Q_SLOTS:
8586 void onWindowComponentStatusChanged(QQmlComponent::Status status);
87+ void setRunning();
8688
8789 private:
8890 void createWindowItem();
tests/mocks/Unity/Application/ApplicationManager.cpp+109−3
@@ -24,13 +24,17 @@
2424#include <QQuickItem>
2525#include <QQuickView>
2626#include <QQmlComponent>
27+#include <QTimer>
28+#include <QDateTime>
2729
2830ApplicationManager::ApplicationManager(QObject *parent)
2931 : ApplicationManagerInterface(parent)
32+ , m_suspended(false)
3033 , m_mainStageComponent(0)
3134 , m_mainStage(0)
3235 , m_sideStageComponent(0)
3336 , m_sideStage(0)
37+ , m_rightMargin(0)
3438{
3539 buildListOfAvailableApplications();
3640}
@@ -63,6 +67,8 @@ QVariant ApplicationManager::data(const QModelIndex& index, int role) const {
6367 return app->state();
6468 case RoleFocused:
6569 return app->focused();
70+ case RoleScreenshot:
71+ return app->screenshot();
6672 default:
6773 return QVariant();
6874 }
@@ -84,13 +90,16 @@ ApplicationInfo *ApplicationManager::findApplication(const QString &appId) const
8490}
8591
8692void ApplicationManager::add(ApplicationInfo *application) {
87− if (!application)
93+ if (!application) {
8894 return;
95+ }
8996
9097 beginInsertRows(QModelIndex(), m_runningApplications.size(), m_runningApplications.size());
9198 m_runningApplications.append(application);
9299 endInsertRows();
100+ Q_EMIT applicationAdded(application->appId());
93101 Q_EMIT countChanged();
102+ Q_EMIT focusRequested(application->appId());
94103}
95104
96105void ApplicationManager::remove(ApplicationInfo *application) {
@@ -99,6 +108,7 @@ void ApplicationManager::remove(ApplicationInfo *application) {
99108 beginRemoveRows(QModelIndex(), i, i);
100109 m_runningApplications.removeAt(i);
101110 endRemoveRows();
111+ Q_EMIT applicationRemoved(application->appId());
102112 Q_EMIT countChanged();
103113 }
104114}
@@ -171,6 +181,8 @@ ApplicationInfo* ApplicationManager::startApplication(const QString &appId,
171181 }
172182 add(application);
173183
184+ QMetaObject::invokeMethod(this, "focusApplication", Qt::QueuedConnection, Q_ARG(QString, appId));
185+
174186 return application;
175187}
176188
@@ -180,8 +192,32 @@ bool ApplicationManager::stopApplication(const QString &appId)
180192 if (application == nullptr)
181193 return false;
182194
195+ if (application->appId() == focusedApplicationId()) {
196+ unfocusCurrentApplication();
197+ }
183198 remove(application);
184− Q_EMIT focusedApplicationIdChanged();
199+ return true;
200+}
201+
202+bool ApplicationManager::updateScreenshot(const QString &appId)
203+{
204+ int idx = -1;
205+ ApplicationInfo *application = nullptr;
206+ for (int i = 0; i < m_availableApplications.count(); ++i) {
207+ application = m_availableApplications.at(i);
208+ if (application->appId() == appId) {
209+ idx = i;
210+ break;
211+ }
212+ }
213+
214+ if (idx == -1) {
215+ return false;
216+ }
217+
218+ application->setScreenshot(QString("image://application/%1/%2").arg(appId).arg(QDateTime::currentMSecsSinceEpoch()));
219+ QModelIndex appIndex = index(idx);
220+ Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << RoleScreenshot);
185221 return true;
186222}
187223
@@ -194,6 +230,25 @@ QString ApplicationManager::focusedApplicationId() const {
194230 return QString();
195231}
196232
233+bool ApplicationManager::suspended() const
234+{
235+ return m_suspended;
236+}
237+
238+void ApplicationManager::setSuspended(bool suspended)
239+{
240+ ApplicationInfo *focusedApp = findApplication(focusedApplicationId());
241+ if (focusedApp) {
242+ if (suspended) {
243+ focusedApp->setState(ApplicationInfo::Suspended);
244+ } else {
245+ focusedApp->setState(ApplicationInfo::Running);
246+ }
247+ }
248+ m_suspended = suspended;
249+ Q_EMIT suspendedChanged();
250+}
251+
197252bool ApplicationManager::focusApplication(const QString &appId)
198253{
199254 ApplicationInfo *application = findApplication(appId);
@@ -242,6 +297,15 @@ bool ApplicationManager::focusApplication(const QString &appId)
242297 return true;
243298}
244299
300+bool ApplicationManager::requestFocusApplication(const QString &appId)
301+{
302+ if (appId != focusedApplicationId()) {
303+ QMetaObject::invokeMethod(this, "focusRequested", Qt::QueuedConnection, Q_ARG(QString, appId));
304+ return true;
305+ }
306+ return false;
307+}
308+
245309void ApplicationManager::unfocusCurrentApplication()
246310{
247311 for (ApplicationInfo *app : m_runningApplications) {
@@ -270,10 +334,12 @@ void ApplicationManager::generateQmlStrings(ApplicationInfo *application)
270334 "Image {\n"
271335 " anchors.fill: parent\n"
272336 " anchors.topMargin: %1\n"
273− " source: \"file://%2/Dash/graphics/phone/screenshots/%3.png\"\n"
337+ " anchors.rightMargin: %2\n"
338+ " source: \"file://%3/Dash/graphics/phone/screenshots/%4.png\"\n"
274339 " smooth: true\n"
275340 " fillMode: Image.PreserveAspectCrop\n"
276341 "}").arg(topMargin)
342+ .arg(m_rightMargin)
277343 .arg(qmlDirectory())
278344 .arg(application->icon().toString());
279345 application->setWindowQml(windowQml);
@@ -299,6 +365,7 @@ void ApplicationManager::buildListOfAvailableApplications()
299365 application->setName("Phone");
300366 application->setIcon(QUrl("phone"));
301367 application->setStage(ApplicationInfo::SideStage);
368+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
302369 generateQmlStrings(application);
303370 m_availableApplications.append(application);
304371
@@ -307,6 +374,7 @@ void ApplicationManager::buildListOfAvailableApplications()
307374 application->setName("Camera");
308375 application->setIcon(QUrl("camera"));
309376 application->setFullscreen(true);
377+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
310378 generateQmlStrings(application);
311379 m_availableApplications.append(application);
312380
@@ -314,6 +382,7 @@ void ApplicationManager::buildListOfAvailableApplications()
314382 application->setAppId("gallery-app");
315383 application->setName("Gallery");
316384 application->setIcon(QUrl("gallery"));
385+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
317386 generateQmlStrings(application);
318387 m_availableApplications.append(application);
319388
@@ -322,13 +391,16 @@ void ApplicationManager::buildListOfAvailableApplications()
322391 application->setName("Facebook");
323392 application->setIcon(QUrl("facebook"));
324393 application->setStage(ApplicationInfo::SideStage);
394+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
325395 generateQmlStrings(application);
326396 m_availableApplications.append(application);
327397
328398 application = new ApplicationInfo(this);
329399 application->setAppId("webbrowser-app");
400+ application->setFullscreen(true);
330401 application->setName("Browser");
331402 application->setIcon(QUrl("browser"));
403+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
332404 generateQmlStrings(application);
333405 m_availableApplications.append(application);
334406
@@ -337,6 +409,7 @@ void ApplicationManager::buildListOfAvailableApplications()
337409 application->setName("Twitter");
338410 application->setIcon(QUrl("twitter"));
339411 application->setStage(ApplicationInfo::SideStage);
412+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
340413 generateQmlStrings(application);
341414 m_availableApplications.append(application);
342415
@@ -344,6 +417,7 @@ void ApplicationManager::buildListOfAvailableApplications()
344417 application->setAppId("gmail-webapp");
345418 application->setName("GMail");
346419 application->setIcon(QUrl("gmail"));
420+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
347421 m_availableApplications.append(application);
348422
349423 application = new ApplicationInfo(this);
@@ -351,6 +425,7 @@ void ApplicationManager::buildListOfAvailableApplications()
351425 application->setName("Weather");
352426 application->setIcon(QUrl("weather"));
353427 application->setStage(ApplicationInfo::SideStage);
428+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
354429 generateQmlStrings(application);
355430 m_availableApplications.append(application);
356431
@@ -359,6 +434,7 @@ void ApplicationManager::buildListOfAvailableApplications()
359434 application->setName("Notepad");
360435 application->setIcon(QUrl("notepad"));
361436 application->setStage(ApplicationInfo::SideStage);
437+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
362438 m_availableApplications.append(application);
363439
364440 application = new ApplicationInfo(this);
@@ -366,6 +442,7 @@ void ApplicationManager::buildListOfAvailableApplications()
366442 application->setName("Calendar");
367443 application->setIcon(QUrl("calendar"));
368444 application->setStage(ApplicationInfo::SideStage);
445+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
369446 m_availableApplications.append(application);
370447
371448 application = new ApplicationInfo(this);
@@ -373,18 +450,21 @@ void ApplicationManager::buildListOfAvailableApplications()
373450 application->setName("Media Player");
374451 application->setIcon(QUrl("mediaplayer-app"));
375452 application->setFullscreen(true);
453+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
376454 m_availableApplications.append(application);
377455
378456 application = new ApplicationInfo(this);
379457 application->setAppId("evernote");
380458 application->setName("Evernote");
381459 application->setIcon(QUrl("evernote"));
460+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
382461 m_availableApplications.append(application);
383462
384463 application = new ApplicationInfo(this);
385464 application->setAppId("map");
386465 application->setName("Map");
387466 application->setIcon(QUrl("map"));
467+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
388468 generateQmlStrings(application);
389469 m_availableApplications.append(application);
390470
@@ -392,24 +472,28 @@ void ApplicationManager::buildListOfAvailableApplications()
392472 application->setAppId("pinterest");
393473 application->setName("Pinterest");
394474 application->setIcon(QUrl("pinterest"));
475+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
395476 m_availableApplications.append(application);
396477
397478 application = new ApplicationInfo(this);
398479 application->setAppId("soundcloud");
399480 application->setName("SoundCloud");
400481 application->setIcon(QUrl("soundcloud"));
482+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
401483 m_availableApplications.append(application);
402484
403485 application = new ApplicationInfo(this);
404486 application->setAppId("wikipedia");
405487 application->setName("Wikipedia");
406488 application->setIcon(QUrl("wikipedia"));
489+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
407490 m_availableApplications.append(application);
408491
409492 application = new ApplicationInfo(this);
410493 application->setAppId("youtube");
411494 application->setName("YouTube");
412495 application->setIcon(QUrl("youtube"));
496+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
413497 m_availableApplications.append(application);
414498}
415499
@@ -484,3 +568,25 @@ void ApplicationManager::createSideStage()
484568 m_sideStage->setParentItem(shell);
485569 m_sideStage->setFlag(QQuickItem::ItemHasContents, false);
486570}
571+
572+QStringList ApplicationManager::availableApplications()
573+{
574+ QStringList appIds;
575+ Q_FOREACH(ApplicationInfo *app, m_availableApplications) {
576+ appIds << app->appId();
577+ }
578+ return appIds;
579+}
580+
581+int ApplicationManager::rightMargin() const
582+{
583+ return m_rightMargin;
584+}
585+
586+void ApplicationManager::setRightMargin(int rightMargin)
587+{
588+ m_rightMargin = rightMargin;
589+ Q_FOREACH(ApplicationInfo *app, m_availableApplications) {
590+ generateQmlStrings(app);
591+ }
592+}
tests/mocks/Unity/Application/ApplicationManager.h+16
@@ -45,6 +45,10 @@ class ApplicationManager : public ApplicationManagerInterface {
4545
4646 Q_PROPERTY(bool fake READ fake CONSTANT)
4747
48+ // Only for testing
49+ // This can be used to place some controls to right, like make tryPhoneStage for example
50+ Q_PROPERTY(int rightMargin READ rightMargin WRITE setRightMargin)
51+
4852 public:
4953 ApplicationManager(QObject *parent = NULL);
5054 virtual ~ApplicationManager();
@@ -87,13 +91,22 @@ class ApplicationManager : public ApplicationManagerInterface {
8791 Q_INVOKABLE void move(int from, int to);
8892
8993 // Application control methods
94+ Q_INVOKABLE bool requestFocusApplication(const QString &appId) override;
9095 Q_INVOKABLE bool focusApplication(const QString &appId) override;
9196 Q_INVOKABLE void unfocusCurrentApplication() override;
9297 Q_INVOKABLE ApplicationInfo *startApplication(const QString &appId, const QStringList &arguments = QStringList()) override;
9398 Q_INVOKABLE ApplicationInfo *startApplication(const QString &appId, ExecFlags flags, const QStringList &arguments = QStringList());
9499 Q_INVOKABLE bool stopApplication(const QString &appId) override;
100+ Q_INVOKABLE bool updateScreenshot(const QString &appId) override;
95101
96102 QString focusedApplicationId() const override;
103+ bool suspended() const;
104+ void setSuspended(bool suspended);
105+
106+ // Only for testing
107+ Q_INVOKABLE QStringList availableApplications();
108+ int rightMargin() const;
109+ void setRightMargin(int rightMargin);
97110
98111 Q_SIGNALS:
99112 void keyboardHeightChanged();
@@ -113,12 +126,15 @@ class ApplicationManager : public ApplicationManagerInterface {
113126 void createSideStage();
114127 int m_keyboardHeight;
115128 bool m_keyboardVisible;
129+ bool m_suspended;
116130 QList<ApplicationInfo*> m_runningApplications;
117131 QList<ApplicationInfo*> m_availableApplications;
118132 QQmlComponent *m_mainStageComponent;
119133 QQuickItem *m_mainStage;
120134 QQmlComponent *m_sideStageComponent;
121135 QQuickItem *m_sideStage;
136+
137+ int m_rightMargin;
122138};
123139
124140Q_DECLARE_OPERATORS_FOR_FLAGS(ApplicationManager::ExecFlags)
tests/mocks/Unity/Application/ApplicationScreenshotProvider.cppnew file+77
@@ -0,0 +1,77 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * 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+#include "ApplicationScreenshotProvider.h"
18+#include "ApplicationManager.h"
19+#include "ApplicationInfo.h"
20+
21+#include "paths.h"
22+
23+#include <QDebug>
24+#include <QGuiApplication>
25+#include <QWindow>
26+#include <QQuickWindow>
27+
28+ApplicationScreenshotProvider::ApplicationScreenshotProvider(ApplicationManager *appManager)
29+ : QQuickImageProvider(QQuickImageProvider::Image)
30+ , m_appManager(appManager)
31+{
32+}
33+
34+QImage ApplicationScreenshotProvider::requestImage(const QString &imageId, QSize * size,
35+ const QSize &requestedSize)
36+{
37+ // We ignore requestedSize here intentionally to avoid keeping scaled copies around
38+ Q_UNUSED(requestedSize)
39+
40+ QString appId = imageId.split('/').first();
41+
42+ ApplicationInfo* app = static_cast<ApplicationInfo*>(m_appManager->findApplication(appId));
43+ if (app == nullptr) {
44+ return QImage();
45+ }
46+
47+ QString filePath = QString("%1/Dash/graphics/phone/screenshots/%2@12.png").arg(qmlDirectory()).arg(app->icon().toString());
48+
49+ QImage image;
50+ if (!image.load(filePath)) {
51+ qWarning() << "failed loading app image" << filePath;
52+ }
53+
54+
55+ if (app->stage() == ApplicationInfo::SideStage) {
56+ QByteArray gus = qgetenv("GRID_UNIT_PX");
57+ if (gus.isEmpty() || gus.toInt() == 0) {
58+ gus = "8";
59+ }
60+ image = image.scaledToWidth(gus.toInt() * 48);
61+ } else {
62+ // Lets scale main stage applications to be the size of the screen/window.
63+ QGuiApplication *unity = qobject_cast<QGuiApplication*>(qApp);
64+ Q_FOREACH (QWindow *win, unity->allWindows()) {
65+ QQuickWindow *quickWin = qobject_cast<QQuickWindow*>(win);
66+ if (quickWin) {
67+ image = image.scaledToWidth(quickWin->width() - m_appManager->rightMargin());
68+ break;
69+ }
70+ }
71+ }
72+
73+ size->setWidth(image.width());
74+ size->setHeight(image.height());
75+
76+ return image;
77+}
tests/mocks/Unity/Application/ApplicationScreenshotProvider.hnew file+34
@@ -0,0 +1,34 @@
1+/*
2+ * Copyright (C) 201 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * 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+#ifndef APPLICATIONSCREENSHOTPROVIDER_H
18+#define APPLICATIONSCREENSHOTPROVIDER_H
19+
20+#include <QQuickImageProvider>
21+
22+class ApplicationManager;
23+class ApplicationScreenshotProvider : public QQuickImageProvider
24+{
25+public:
26+ explicit ApplicationScreenshotProvider(ApplicationManager *appManager);
27+
28+ QImage requestImage(const QString &appId, QSize *size, const QSize &requestedSize) override;
29+
30+private:
31+ ApplicationManager* m_appManager;
32+};
33+
34+#endif // APPLICATIONSCREENSHOTPROVIDER_H
tests/mocks/Unity/Application/CMakeLists.txt+15
@@ -5,6 +5,7 @@ set(FakeUnityApplicationQml_SOURCES
55 ApplicationInfo.cpp
66 ApplicationImage.cpp
77 ApplicationManager.cpp
8+ ApplicationScreenshotProvider.cpp
89 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
910 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
1011)
@@ -34,3 +35,17 @@ install(TARGETS FakeUnityApplicationQml
3435install(FILES qmldir InputFilterArea.qml OSKController.qml
3536 DESTINATION ${SHELL_INSTALL_QML}/mocks/Unity/Application
3637 )
38+
39+# Duplicate the mock to nonmirplugins
40+# In shadow builds we just link it, in real installs we also install it to the other path
41+add_custom_target(OSKControllerQmlFile2 ALL
42+ COMMAND mkdir -p ${CMAKE_BINARY_DIR}/nonmirplugins/Unity && rm -f ${CMAKE_BINARY_DIR}/nonmirplugins/Unity/Application && ln -s ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_BINARY_DIR}/nonmirplugins/Unity
43+ DEPENDS qmldir
44+)
45+install(TARGETS FakeUnityApplicationQml
46+ DESTINATION ${SHELL_INSTALL_QML}/nonmirplugins/Unity/Application
47+ )
48+
49+install(FILES qmldir InputFilterArea.qml OSKController.qml
50+ DESTINATION ${SHELL_INSTALL_QML}/nonmirplugins/Unity/Application
51+ )
tests/mocks/Unity/Application/plugin.cpp+18−3
@@ -18,13 +18,20 @@
1818#include "ApplicationInfo.h"
1919#include "ApplicationImage.h"
2020#include "ApplicationManager.h"
21+#include "ApplicationScreenshotProvider.h"
2122
2223#include <qqml.h>
24+#include <QQmlEngine>
25+
26+ApplicationManager *s_appManager = 0;
2327
2428static QObject* applicationManagerSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
25− Q_UNUSED(engine);
26− Q_UNUSED(scriptEngine);
27− return new ApplicationManager();
29+ Q_UNUSED(engine);
30+ Q_UNUSED(scriptEngine);
31+ if (!s_appManager) {
32+ s_appManager = new ApplicationManager();
33+ }
34+ return s_appManager;
2835}
2936
3037void FakeUnityApplicationQmlPlugin::registerTypes(const char *uri)
@@ -37,3 +44,11 @@ void FakeUnityApplicationQmlPlugin::registerTypes(const char *uri)
3744
3845 qmlRegisterType<ApplicationImage>(uri, 0, 1, "ApplicationImage");
3946}
47+
48+void FakeUnityApplicationQmlPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
49+{
50+ QQmlExtensionPlugin::initializeEngine(engine, uri);
51+
52+ ApplicationManager* appManager = static_cast<ApplicationManager*>(applicationManagerSingleton(engine, NULL));
53+ engine->addImageProvider(QLatin1String("application"), new ApplicationScreenshotProvider(appManager));
54+}
tests/mocks/Unity/Application/plugin.h+1
@@ -25,6 +25,7 @@ class FakeUnityApplicationQmlPlugin : public QQmlExtensionPlugin
2525 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
2626public:
2727 void registerTypes(const char *uri);
28+ void initializeEngine(QQmlEngine *engine, const char *uri);
2829};
2930
3031#endif
tests/mocks/Unity/CMakeLists.txt+4−4
@@ -18,14 +18,14 @@ include_directories(
1818add_definitions(-DQT_NO_KEYWORDS)
1919
2020set(UnityQML_SOURCES
21− categoryresults.cpp
2221 iconutils.cpp
23− fake_applications_scope.cpp
24− fake_preview.cpp
2522 fake_scope.cpp
2623 fake_scopes.cpp
2724 fake_categories.cpp
28− scopes-ng/fake_preview_model.cpp
25+ fake_resultsmodel.cpp
26+ fake_previewmodel.cpp
27+ fake_previewstack.cpp
28+ fake_previewwidgetmodel.cpp
2929 fake_unity_plugin.cpp
3030)
3131
tests/mocks/Unity/categoryresults.cppdeleted−121
@@ -1,121 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * Authors:
5− * Michal Hruby <michal.hruby@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−// self
21−#include "categoryresults.h"
22−#include "iconutils.h"
23−
24−// TODO: use something from libunity once it's public
25−enum ResultsColumn {
26− URI,
27− ICON_HINT,
28− CATEGORY,
29− RESULT_TYPE,
30− MIMETYPE,
31− TITLE,
32− COMMENT,
33− DND_URI,
34− METADATA
35−};
36−
37−CategoryResults::CategoryResults(QObject* parent)
38− : DeeListModel(parent)
39− , m_categoryIndex(-1)
40−{
41− m_roles[CategoryResults::RoleUri] = "uri";
42− m_roles[CategoryResults::RoleIconHint] = "icon";
43− m_roles[CategoryResults::RoleCategory] = "category";
44− m_roles[CategoryResults::RoleMimetype] = "mimetype";
45− m_roles[CategoryResults::RoleTitle] = "title";
46− m_roles[CategoryResults::RoleComment] = "comment";
47− m_roles[CategoryResults::RoleDndUri] = "dndUri";
48− m_roles[CategoryResults::RoleMetadata] = "metadata";
49− m_roles[CategoryResults::RoleRendererHints] = "rendererHints";
50−}
51−
52−int CategoryResults::categoryIndex() const
53−{
54− return m_categoryIndex;
55−}
56−
57−void CategoryResults::setCategoryIndex(int index)
58−{
59− if (m_categoryIndex != index) {
60− m_categoryIndex = index;
61− Q_EMIT categoryIndexChanged(m_categoryIndex);
62− }
63−}
64−
65−QHash<int, QByteArray>
66−CategoryResults::roleNames() const
67−{
68− return m_roles;
69−}
70−
71−QVariant
72−CategoryResults::data(const QModelIndex& index, int role) const
73−{
74− if (!index.isValid()) {
75− return QVariant();
76− }
77−
78− switch (role) {
79− case RoleUri:
80− return DeeListModel::data(index, ResultsColumn::URI);
81− case RoleIconHint: {
82− QString giconString(DeeListModel::data(index, ResultsColumn::ICON_HINT).toString());
83− if (giconString.isEmpty()) {
84− QString mimetype(DeeListModel::data(index, ResultsColumn::MIMETYPE).toString());
85− QString uri(DeeListModel::data(index, ResultsColumn::URI).toString());
86− QString thumbnailerUri(uriToThumbnailerProviderString(uri, mimetype, DeeListModel::data(index, ResultsColumn::METADATA).toHash()));
87− if (!thumbnailerUri.isNull()) {
88− return QVariant::fromValue(thumbnailerUri);
89− }
90− }
91− return QVariant::fromValue(gIconToDeclarativeImageProviderString(giconString));
92− }
93− case RoleCategory:
94− return DeeListModel::data(index, ResultsColumn::CATEGORY);
95− case RoleMimetype:
96− return DeeListModel::data(index, ResultsColumn::MIMETYPE);
97− case RoleTitle:
98− return DeeListModel::data(index, ResultsColumn::TITLE);
99− case RoleComment:
100− return DeeListModel::data(index, ResultsColumn::COMMENT);
101− case RoleDndUri:
102− return DeeListModel::data(index, ResultsColumn::DND_URI);
103− case RoleMetadata:
104− return DeeListModel::data(index, ResultsColumn::METADATA);
105− case RoleRendererHints:
106− {
107− QVariantHash hash(DeeListModel::data(index, ResultsColumn::METADATA).toHash());
108− if (hash.contains("content")) {
109− QVariantMap hints;
110− QVariantHash innerHash(hash["content"].toHash());
111− if (innerHash.contains("scope_disabled")) {
112− hints["scope_disabled"] = innerHash["scope_disabled"];
113− }
114− return hints.empty() ? QVariant() : QVariant::fromValue(hints);
115− }
116− return QVariant();
117− }
118− default:
119− return QVariant();
120− }
121−}
tests/mocks/Unity/categoryresults.hdeleted−68
@@ -1,68 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * Authors:
5− * Michal Hruby <michal.hruby@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−
21−#ifndef CATEGORY_RESULTS_H
22−#define CATEGORY_RESULTS_H
23−
24−// dee-qt
25−#include "deelistmodel.h"
26−
27−class Q_DECL_EXPORT CategoryResults : public DeeListModel
28−{
29− Q_OBJECT
30−
31− Q_ENUMS(Roles)
32−
33− Q_PROPERTY(int categoryIndex READ categoryIndex WRITE setCategoryIndex NOTIFY categoryIndexChanged)
34−
35−public:
36− explicit CategoryResults(QObject* parent = 0);
37−
38− enum Roles {
39− RoleUri,
40− RoleIconHint,
41− RoleCategory,
42− RoleMimetype,
43− RoleTitle,
44− RoleComment,
45− RoleDndUri,
46− RoleMetadata,
47− RoleRendererHints
48− };
49−
50− QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
51−
52− QHash<int, QByteArray> roleNames() const;
53−
54− /* getters */
55− int categoryIndex() const;
56−
57− /* setters */
58− void setCategoryIndex(int index);
59−
60−Q_SIGNALS:
61− void categoryIndexChanged(int index);
62−
63−private:
64− QHash<int, QByteArray> m_roles;
65− int m_categoryIndex;
66−};
67−
68−#endif // CATEGORY_RESULTS_H
tests/mocks/Unity/fake_applications_scope.cppdeleted−76
@@ -1,76 +0,0 @@
1−/*
2− * Copyright (C) 2013, 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "fake_applications_scope.h"
18−
19−static const gchar * categories_model_schema[] = {
20− "s", //ID
21− "s", // DISPLAY_NAME
22− "s", // ICON_HINT
23− "s", // RENDERER_NAME
24− "a{sv}" // HINTS
25−};
26−
27−ApplicationsScope::ApplicationsScope(bool visible, QObject* parent)
28− : Scope(parent)
29−{
30− m_id = "applications.scope";
31− m_name = "Applications";
32− m_visible = visible;
33− m_previewRendererName = "preview-application";
34− m_categories->setModel(createCategoriesModel());
35−}
36−
37−DeeModel* ApplicationsScope::createCategoriesModel()
38−{
39− DeeModel* category_model = dee_sequence_model_new();
40− dee_model_set_schema_full(category_model, categories_model_schema, G_N_ELEMENTS(categories_model_schema));
41− GVariant* hints = g_variant_new_array(g_variant_type_element(G_VARIANT_TYPE_VARDICT), NULL, 0);
42−
43− GVariant* children[1];
44− children[0] = g_variant_new_dict_entry(g_variant_new_string("content-type"),
45− g_variant_new_variant(g_variant_new_string("apps")));
46− GVariant* recentHints = g_variant_new_array(g_variant_type_element(G_VARIANT_TYPE_VARDICT), children, 1);
47− dee_model_append(category_model,
48− "recent",
49− "Recent",
50− "gtk-apply",
51− "special",
52− recentHints);
53−
54− dee_model_append(category_model,
55− "installed",
56− "Installed",
57− "gtk-apply",
58− "grid",
59− hints);
60−
61− dee_model_append(category_model,
62− "suggested",
63− "Suggested",
64− "gtk-apply",
65− "grid",
66− hints);
67−
68− dee_model_append(category_model,
69− "outdated",
70− "Outdaded",
71− "gtk-apply",
72− "grid",
73− hints);
74−
75− return category_model;
76−}
tests/mocks/Unity/fake_applications_scope.hdeleted−33
@@ -1,33 +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−#ifndef FAKE_APPLICATIONS_SCOPE_H
18−#define FAKE_APPLICATIONS_SCOPE_H
19−
20−#include "fake_scope.h"
21−
22−class ApplicationsScope : public Scope
23−{
24− Q_OBJECT
25−
26−public:
27− ApplicationsScope(bool visible, QObject* parent = 0);
28−
29−private:
30− DeeModel* createCategoriesModel();
31−};
32−
33−#endif // FAKE_APPLICATIONS_SCOPE_H
tests/mocks/Unity/fake_categories.cpp+109−194
@@ -19,100 +19,21 @@
1919// self
2020#include "fake_categories.h"
2121
22−// local
23−#include "categoryresults.h"
22+#include "fake_resultsmodel.h"
2423
25−#define CATEGORY_COLUMN 2
26−
27−// TODO: use something from libunity once it's public
28−enum CategoryColumn {
29− ID,
30− DISPLAY_NAME,
31− ICON_HINT,
32− RENDERER_NAME,
33− HINTS
34−};
35−
36−Categories::Categories(QObject* parent)
37− : DeeListModel(parent)
24+Categories::Categories(int category_count, QObject* parent)
25+ : QAbstractListModel(parent)
26+ , m_category_count(category_count)
3827{
39− // FIXME: need to clean up unused filters on countChanged
4028 m_roles[Categories::RoleCategoryId] = "categoryId";
4129 m_roles[Categories::RoleName] = "name";
4230 m_roles[Categories::RoleIcon] = "icon";
31+ m_roles[Categories::RoleRawRendererTemplate] = "rawRendererTemplate";
4332 m_roles[Categories::RoleRenderer] = "renderer";
44− m_roles[Categories::RoleContentType] = "contentType";
45− m_roles[Categories::RoleRendererHint] = "rendererHint";
46− m_roles[Categories::RoleHints] = "hints";
33+ m_roles[Categories::RoleComponents] = "components";
34+ m_roles[Categories::RoleProgressSource] = "progressSource";
4735 m_roles[Categories::RoleResults] = "results";
4836 m_roles[Categories::RoleCount] = "count";
49−
50− // TODO This should not be needed but accumulatting the count changes
51− // makes the visualization more stable and also makes crashes on fast
52− // change of the search term harder to reproduce
53− m_timer.setSingleShot(true);
54− m_timer.setInterval(50);
55− connect(&m_timer, SIGNAL(timeout()), this, SLOT(onEmitCountChanged()));
56−}
57−
58−DeeListModel*
59−Categories::getFilter(int index) const
60−{
61− if (!m_filters.contains(index)) {
62− auto results = new CategoryResults ();
63− results->setCategoryIndex(index);
64− connect(results, SIGNAL(countChanged()), this, SLOT(onCountChanged()));
65−
66− unsigned cat_index = static_cast<unsigned>(index);
67− auto model = getResultsForCategory(cat_index);
68− results->setModel(model);
69−
70− m_filters.insert(index, results);
71− }
72−
73− return m_filters[index];
74−}
75−
76−void
77−Categories::onCountChanged()
78−{
79− DeeListModel* filter = qobject_cast<DeeListModel*>(sender());
80− if (filter) {
81− m_timerFilters << filter;
82− m_timer.start();
83− }
84−}
85−
86−void Categories::onRowCountChanged()
87−{
88− QAbstractItemModel* model = qobject_cast<QAbstractItemModel*>(sender());
89− // find the corresponding category index
90− for (auto iter = m_overriddenCategories.begin(); iter != m_overriddenCategories.end(); ++iter) {
91− if (iter.value() == model) {
92− for (int i = 0; i < rowCount(); i++) {
93− auto id = data(index(i), RoleCategoryId).toString();
94− if (id != iter.key()) continue;
95− QVector<int> roles;
96− roles.append(RoleCount);
97− QModelIndex changedIndex = index(i);
98− Q_EMIT dataChanged(changedIndex, changedIndex, roles);
99− break;
100− }
101− }
102− }
103−}
104−
105−void
106−Categories::onEmitCountChanged()
107−{
108− QVector<int> roles;
109− roles.append(Categories::RoleCount);
110− Q_FOREACH(DeeListModel* results, m_timerFilters) {
111− auto cat_results = qobject_cast<CategoryResults*>(results);
112− QModelIndex changedIndex = index(cat_results->categoryIndex());
113− Q_EMIT dataChanged(changedIndex, changedIndex, roles);
114− }
115− m_timerFilters.clear();
11637}
11738
11839QHash<int, QByteArray>
@@ -121,94 +42,46 @@ Categories::roleNames() const
12142 return m_roles;
12243}
12344
124−void Categories::onOverrideModelDestroyed()
45+int Categories::rowCount(const QModelIndex& /*parent*/) const
12546{
126− QObject* model = sender();
127− auto iter = m_overriddenCategories.begin();
128− while (iter != m_overriddenCategories.end()) {
129− if (iter.value() == model) {
130− iter = m_overriddenCategories.erase(iter);
131− continue;
132− }
133− ++iter;
134− }
47+ return m_category_count + m_specialCategories.count();
13548}
13649
137−void Categories::overrideResults(const QString& categoryId, QAbstractItemModel* model)
50+void Categories::addSpecialCategory(QString const& categoryId, QString const& name, QString const& icon, QString const& rawTemplate, QObject* countObject)
13851{
139− m_overriddenCategories[categoryId] = model;
140− // watch the model
141− connect(model, &QObject::destroyed, this, &Categories::onOverrideModelDestroyed);
142− connect(model, &QAbstractItemModel::rowsInserted, this, &Categories::onRowCountChanged);
143− connect(model, &QAbstractItemModel::rowsRemoved, this, &Categories::onRowCountChanged);
144− connect(model, &QAbstractItemModel::modelReset, this, &Categories::onRowCountChanged);
145−
146− // emit the dataChanged signal if the category is already in the model
147− for (int i = 0; i < rowCount(); i++) {
148− auto id = data(index(i), RoleCategoryId).toString();
149− if (id != categoryId) continue;
150− QVector<int> roles;
151− roles.append(RoleCount);
152− roles.append(RoleResults);
153− QModelIndex changedIndex = index(i);
154− Q_EMIT dataChanged(changedIndex, changedIndex, roles);
155− break;
52+ CategoryData catData;
53+ catData.categoryId = categoryId;
54+ catData.name = name;
55+ catData.icon = icon;
56+ catData.rawTemplate = rawTemplate;
57+ catData.countObject = countObject;
58+
59+ beginInsertRows(QModelIndex(), 0, 0);
60+ m_specialCategories.prepend(catData);
61+ endInsertRows();
62+
63+ if (countObject) {
64+ connect(countObject, SIGNAL(countChanged()), this, SLOT(countChanged()));
15665 }
15766}
15867
159−void Categories::setResultModel(DeeModel* model)
68+void Categories::countChanged()
16069{
161− // FIXME: should ref it
162− m_dee_results = model;
163−}
164−
70+ QObject* countObject = sender();
16571
166−static void category_filter_map_func (DeeModel* orig_model,
167− DeeFilterModel* filter_model,
168− gpointer user_data)
169−{
170− DeeModelIter* iter;
171− DeeModelIter* end;
172− unsigned index = GPOINTER_TO_UINT(user_data);
72+ for (int i = 0; i < m_specialCategories.count(); ++i) {
73+ const CategoryData &catData = m_specialCategories.at(i);
74+ if (catData.countObject == countObject) {
75+ QVector<int> roles;
76+ roles.append(RoleCount);
17377
174− iter = dee_model_get_first_iter(orig_model);
175− end = dee_model_get_last_iter(orig_model);
176− while (iter != end) {
177− unsigned category_index = dee_model_get_uint32(orig_model, iter, CATEGORY_COLUMN);
178− if (index == category_index) {
179− dee_filter_model_append_iter(filter_model, iter);
78+ QModelIndex changedIndex(index(i));
79+ dataChanged(changedIndex, changedIndex, roles);
80+ break;
18081 }
181− iter = dee_model_next(orig_model, iter);
18282 }
18383}
18484
185−static gboolean category_filter_notify_func (DeeModel* orig_model,
186− DeeModelIter* orig_iter,
187− DeeFilterModel* filter_model,
188− gpointer user_data)
189−{
190− unsigned index = GPOINTER_TO_UINT(user_data);
191− unsigned category_index = dee_model_get_uint32(orig_model, orig_iter, CATEGORY_COLUMN);
192−
193− if (index != category_index)
194− return FALSE;
195−
196− dee_filter_model_insert_iter_with_original_order(filter_model, orig_iter);
197− return TRUE;
198−}
199−
200−DeeModel* Categories::getResultsForCategory(unsigned cat_index) const
201−{
202− DeeFilter filter;
203− filter.map_func = category_filter_map_func;
204− filter.map_notify = category_filter_notify_func;
205− filter.destroy = nullptr;
206− filter.userdata = GUINT_TO_POINTER(cat_index);
207−
208− DeeModel* filtered_model = dee_filter_model_new(m_dee_results, &filter);
209− return filtered_model;
210−}
211−
21285QVariant
21386Categories::data(const QModelIndex& index, int role) const
21487{
@@ -216,44 +89,86 @@ Categories::data(const QModelIndex& index, int role) const
21689 return QVariant();
21790 }
21891
219− switch (role) {
220− case RoleCategoryId:
221− return DeeListModel::data(index, CategoryColumn::ID);
222− case RoleName:
223− return DeeListModel::data(index, CategoryColumn::DISPLAY_NAME);
224− case RoleIcon:
225− return DeeListModel::data(index, CategoryColumn::ICON_HINT);
226− case RoleRenderer:
227− return DeeListModel::data(index, CategoryColumn::RENDERER_NAME);
228− case RoleContentType:
229− {
230− auto hints = DeeListModel::data(index, CategoryColumn::HINTS).toHash();
231− return hints.contains("content-type") ? hints["content-type"] : QVariant(QString("default"));
232− }
233− case RoleRendererHint:
234− {
235− auto hints = DeeListModel::data(index, CategoryColumn::HINTS).toHash();
236− return hints.contains("renderer-hint") ? hints["renderer-hint"] : QVariant(QString());
92+ ResultsModel *resultsModel = m_resultsModels[index.row()];
93+ if (!resultsModel) {
94+ resultsModel = new ResultsModel(15, index.row());
95+ m_resultsModels[index.row()] = resultsModel;
96+ }
97+ if (index.row() < m_specialCategories.count()) {
98+ const CategoryData &catData = m_specialCategories.at(index.row());
99+ switch (role) {
100+ case RoleCategoryId:
101+ return catData.categoryId;
102+ case RoleName:
103+ return catData.name;
104+ case RoleIcon:
105+ return catData.icon;
106+ case RoleRawRendererTemplate:
107+ return catData.rawTemplate;
108+ case RoleRenderer:
109+ {
110+ QVariantMap map;
111+ map["category-layout"] = index.row() % 2 == 0 ? "grid" : "carousel";
112+ map["card-size"] = "small";
113+ return map;
114+ }
115+ case RoleComponents:
116+ {
117+ QVariantMap map, artMap;
118+ artMap["aspect-ratio"] = "1.0";
119+ artMap["field"] = "art";
120+ map["art"] = artMap;
121+ map["title"] = "HOLA";
122+ return map;
123+ }
124+ case RoleProgressSource:
125+ qFatal("Using un-implemented RoleProgressSource Categories role");
126+ return QVariant();
127+ case RoleResults:
128+ return QVariant();
129+ case RoleCount:
130+ return catData.countObject->property("count");
131+ default:
132+ qFatal("Using un-implemented Categories role");
133+ return QVariant();
237134 }
238− case RoleHints:
239− return DeeListModel::data(index, CategoryColumn::HINTS);
240− case RoleResults:
241− if (m_overriddenCategories.size() > 0)
135+ } else {
136+ switch (role) {
137+ case RoleCategoryId:
138+ return QString("%1").arg(index.row());
139+ case RoleName:
140+ return QString("Category %1").arg(index.row());
141+ case RoleIcon:
142+ return "gtk-apply";
143+ case RoleRawRendererTemplate:
144+ qFatal("Using un-implemented RoleRawRendererTemplate Categories role");
145+ return QVariant();
146+ case RoleRenderer:
242147 {
243− auto id = DeeListModel::data(index, CategoryColumn::ID).toString();
244− if (m_overriddenCategories.find(id) != m_overriddenCategories.end())
245− return QVariant::fromValue(m_overriddenCategories[id]);
148+ QVariantMap map;
149+ map["category-layout"] = index.row() % 2 == 0 ? "grid" : "carousel";
150+ map["card-size"] = "small";
151+ return map;
246152 }
247− return QVariant::fromValue(getFilter(index.row()));
248− case RoleCount:
249− if (m_overriddenCategories.size() > 0)
153+ case RoleComponents:
250154 {
251− auto id = DeeListModel::data(index, CategoryColumn::ID).toString();
252− if (m_overriddenCategories.find(id) != m_overriddenCategories.end())
253− return QVariant::fromValue(m_overriddenCategories[id]->rowCount());
155+ QVariantMap map, artMap;
156+ artMap["aspect-ratio"] = "1.0";
157+ artMap["field"] = "art";
158+ map["art"] = artMap;
159+ map["title"] = "HOLA";
160+ return map;
254161 }
255− return QVariant::fromValue(getFilter(index.row())->rowCount());
256− default:
257− return QVariant();
162+ case RoleProgressSource:
163+ qFatal("Using un-implemented RoleProgressSource Categories role");
164+ return QVariant();
165+ case RoleResults:
166+ return QVariant::fromValue(resultsModel);
167+ case RoleCount:
168+ return resultsModel->rowCount();
169+ default:
170+ qFatal("Using un-implemented Categories role");
171+ return QVariant();
172+ }
258173 }
259174}
tests/mocks/Unity/fake_categories.h+25−29
@@ -18,58 +18,54 @@
1818#define FAKE_CATEGORIES_H
1919
2020// Qt
21−#include <QObject>
22−#include <QSet>
23−#include <QTimer>
21+#include <QAbstractListModel>
22+#include <QList>
2423
25−#include <dee.h>
26−#include <deelistmodel.h>
24+class ResultsModel;
2725
28−class Categories : public DeeListModel
26+class Categories : public QAbstractListModel
2927{
3028 Q_OBJECT
3129
3230 Q_ENUMS(Roles)
3331
3432public:
35− Categories(QObject* parent = 0);
33+ Categories(int category_count, QObject* parent = 0);
3634 enum Roles {
3735 RoleCategoryId,
3836 RoleName,
3937 RoleIcon,
38+ RoleRawRendererTemplate,
4039 RoleRenderer,
41− RoleContentType,
42− RoleRendererHint,
43− RoleHints,
40+ RoleComponents,
41+ RoleProgressSource, // maybe
4442 RoleResults,
4543 RoleCount
4644 };
4745
48− Q_INVOKABLE void overrideResults(const QString& categoryId, QAbstractItemModel* model);
46+ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
47+ QHash<int, QByteArray> roleNames() const override;
48+ int rowCount(const QModelIndex& parent = QModelIndex()) const override;
4949
50− QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
51−
52− QHash<int, QByteArray> roleNames() const;
53−
54− /* setters */
55− void setResultModel(DeeModel* model);
50+ Q_INVOKABLE void addSpecialCategory(QString const& categoryId, QString const& name, QString const& icon, QString const& rawTemplate, QObject* countObject);
5651
5752private Q_SLOTS:
58− void onCountChanged();
59− void onRowCountChanged();
60− void onEmitCountChanged();
61− void onOverrideModelDestroyed();
53+ void countChanged();
6254
6355private:
64− DeeModel* getResultsForCategory(unsigned index) const;
65− DeeListModel* getFilter(int index) const;
66−
67− DeeModel* m_dee_results;
68− QTimer m_timer;
69− QSet<DeeListModel*> m_timerFilters;
56+ mutable QHash<int, ResultsModel*> m_resultsModels;
7057 QHash<int, QByteArray> m_roles;
71− QMap<QString, QAbstractItemModel*> m_overriddenCategories;
72− mutable QMap<int, DeeListModel*> m_filters;
58+ int m_category_count;
59+
60+ struct CategoryData {
61+ QString categoryId;
62+ QString name;
63+ QString icon;
64+ QString rawTemplate;
65+ QObject* countObject;
66+ };
67+
68+ QList<CategoryData> m_specialCategories;
7369};
7470
7571#endif // FAKE_CATEGORIES_H
tests/mocks/Unity/fake_preview.cppdeleted−73
@@ -1,73 +0,0 @@
1−/*
2− * Copyright (C) 2013, 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "fake_preview.h"
18−
19−Preview::Preview(const QString &rendererName, QObject *parent):
20− QObject(parent),
21− m_rendererName(rendererName)
22−{
23−}
24−
25−QString Preview::rendererName() const
26−{
27− return m_rendererName;
28−}
29−
30−QString Preview::title() const
31−{
32− return "Title";
33−}
34−
35−QString Preview::subtitle() const
36−{
37− return "Subtitle";
38−}
39−
40−QString Preview::description() const
41−{
42− return "Description";
43−}
44−
45−QVariant Preview::actions()
46−{
47− return QVariant();
48−}
49−
50−QVariant Preview::infoHints()
51−{
52− return QVariant();
53−}
54−
55−QVariantMap Preview::infoHintsHash() const
56−{
57− return QVariantMap();
58−}
59−
60−QString Preview::image() const
61−{
62− return "";
63−}
64−
65−void Preview::execute(const QString& actionId, const QHash<QString, QVariant>& hints)
66−{
67− Q_UNUSED(actionId);
68− Q_UNUSED(hints);
69−}
70−
71−void Preview::cancelAction()
72−{
73−}
tests/mocks/Unity/fake_preview.hdeleted−65
@@ -1,65 +0,0 @@
1−/*
2− * Copyright (C) 2013, 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef FAKE_PREVIEW_H
18−#define FAKE_PREVIEW_H
19−
20−// Qt
21−#include <QObject>
22−#include <QString>
23−#include <QMetaType>
24−#include <QList>
25−#include <QVariantMap>
26−
27−class Q_DECL_EXPORT Preview : public QObject
28−{
29− Q_OBJECT
30−
31− Q_PROPERTY(QString rendererName READ rendererName NOTIFY previewChanged)
32− Q_PROPERTY(QString title READ title NOTIFY previewChanged)
33− Q_PROPERTY(QString subtitle READ subtitle NOTIFY previewChanged)
34− Q_PROPERTY(QString description READ description NOTIFY previewChanged)
35− Q_PROPERTY(QVariant actions READ actions NOTIFY previewChanged)
36− Q_PROPERTY(QVariant infoHints READ infoHints NOTIFY previewChanged)
37− Q_PROPERTY(QVariantMap infoMap READ infoHintsHash NOTIFY previewChanged)
38− Q_PROPERTY(QString image READ image NOTIFY previewChanged)
39−
40−public:
41− explicit Preview(const QString &rendererName, QObject *parent = 0);
42−
43− QString rendererName() const;
44− QString title() const;
45− QString subtitle() const;
46− QString description() const;
47− QVariant actions();
48− QVariant infoHints();
49− QVariantMap infoHintsHash() const;
50− QString image() const;
51−
52− Q_INVOKABLE void execute(const QString& actionId, const QHash<QString, QVariant>& hints);
53−
54− Q_INVOKABLE void cancelAction();
55−
56−Q_SIGNALS:
57− void previewChanged();
58−
59−private:
60− QString m_rendererName;
61−};
62−
63−Q_DECLARE_METATYPE(Preview *)
64−
65−#endif // FAKE_PREVIEW_H
tests/mocks/Unity/fake_previewmodel.cppnew file+86
@@ -0,0 +1,86 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * Authors:
5+ * Michał Sawicz <michal.sawicz@canonical.com>
6+ * Michal Hruby <michal.hruby@canonical.com>
7+ *
8+ * This program is free software; you can redistribute it and/or modify
9+ * it under the terms of the GNU General Public License as published by
10+ * the Free Software Foundation; version 3.
11+ *
12+ * This program is distributed in the hope that it will be useful,
13+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+ * GNU General Public License for more details.
16+ *
17+ * You should have received a copy of the GNU General Public License
18+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
19+ */
20+
21+// self
22+#include "fake_previewmodel.h"
23+
24+// local
25+#include "fake_previewwidgetmodel.h"
26+
27+// Qt
28+#include <QDebug>
29+
30+PreviewModel::PreviewModel(QObject* parent) : QAbstractListModel(parent)
31+{
32+ // we have one column by default
33+ PreviewWidgetModel* columnModel = new PreviewWidgetModel(this);
34+ m_previewWidgetModels.append(columnModel);
35+}
36+
37+QHash<int, QByteArray> PreviewModel::roleNames() const
38+{
39+ QHash<int, QByteArray> roles;
40+
41+ roles[Roles::RoleColumnModel] = "columnModel";
42+
43+ return roles;
44+}
45+
46+void PreviewModel::setWidgetColumnCount(int count)
47+{
48+ if (count != 1) {
49+ qWarning("PreviewModel::setWidgetColumnCount != 1 not implemented");
50+ }
51+}
52+
53+int PreviewModel::widgetColumnCount() const
54+{
55+ return 1;
56+}
57+
58+bool PreviewModel::loaded() const
59+{
60+ return true;
61+}
62+
63+bool PreviewModel::processingAction() const
64+{
65+ return false;
66+}
67+
68+void PreviewModel::setProcessingAction(bool /*processing*/)
69+{
70+ qFatal("PreviewModel::setProcessingAction not implemented");
71+}
72+
73+int PreviewModel::rowCount(const QModelIndex&) const
74+{
75+ return m_previewWidgetModels.size();
76+}
77+
78+QVariant PreviewModel::data(const QModelIndex& index, int role) const
79+{
80+ switch (role) {
81+ case RoleColumnModel:
82+ return QVariant::fromValue(m_previewWidgetModels.at(index.row()));
83+ default:
84+ return QVariant();
85+ }
86+}
tests/mocks/Unity/fake_previewmodel.hnew file+67
@@ -0,0 +1,67 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+
18+#ifndef FAKE_PREVIEWMODEL_H
19+#define FAKE_PREVIEWMODEL_H
20+
21+#include <QAbstractListModel>
22+#include <QSharedPointer>
23+#include <QVariantMap>
24+
25+class PreviewWidgetModel;
26+
27+class PreviewModel : public QAbstractListModel
28+{
29+ Q_OBJECT
30+
31+ Q_ENUMS(Roles)
32+
33+ Q_PROPERTY(int widgetColumnCount READ widgetColumnCount WRITE setWidgetColumnCount NOTIFY widgetColumnCountChanged)
34+ Q_PROPERTY(bool loaded READ loaded NOTIFY loadedChanged)
35+ Q_PROPERTY(bool processingAction READ processingAction NOTIFY processingActionChanged)
36+
37+public:
38+ explicit PreviewModel(QObject* parent = 0);
39+
40+ enum Roles {
41+ RoleColumnModel
42+ };
43+
44+ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
45+ QHash<int, QByteArray> roleNames() const override;
46+ int rowCount(const QModelIndex& parent = QModelIndex()) const override;
47+
48+ void setWidgetColumnCount(int count);
49+ int widgetColumnCount() const;
50+ bool loaded() const;
51+ bool processingAction() const;
52+ void setProcessingAction(bool processing);
53+
54+Q_SIGNALS:
55+ void widgetColumnCountChanged();
56+ void loadedChanged();
57+ void processingActionChanged();
58+ void triggered(QString const&, QString const&, QVariantMap const&);
59+
60+private:
61+ QHash<int, QByteArray> m_roles;
62+ QList<PreviewWidgetModel*> m_previewWidgetModels;
63+};
64+
65+Q_DECLARE_METATYPE(PreviewModel*)
66+
67+#endif // FAKE_PREVIEWMODEL_H
tests/mocks/Unity/fake_previewstack.cppnew file+76
@@ -0,0 +1,76 @@
1+/*
2+ * Copyright (C) 2014 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+// self
18+#include "fake_previewstack.h"
19+
20+// local
21+#include "fake_previewmodel.h"
22+#include "fake_scope.h"
23+
24+PreviewStack::PreviewStack(QObject* parent) : QAbstractListModel(parent)
25+{
26+ m_previews << new PreviewModel(this);
27+}
28+
29+PreviewStack::~PreviewStack()
30+{
31+}
32+
33+QHash<int, QByteArray> PreviewStack::roleNames() const
34+{
35+ QHash<int, QByteArray> roles;
36+
37+ roles[Roles::RolePreviewModel] = "previewModel";
38+
39+ return roles;
40+}
41+
42+void PreviewStack::setWidgetColumnCount(int columnCount)
43+{
44+ if (columnCount != 1) {
45+ qFatal("PreviewStack::setWidgetColumnCount != 1 not implemented");
46+ }
47+}
48+
49+int PreviewStack::widgetColumnCount() const
50+{
51+ return 1;
52+}
53+
54+int PreviewStack::rowCount(const QModelIndex&) const
55+{
56+ return m_previews.size();
57+}
58+
59+PreviewModel* PreviewStack::get(int index) const
60+{
61+ if (index >= m_previews.size()) {
62+ return nullptr;
63+ }
64+
65+ return m_previews.at(index);
66+}
67+
68+QVariant PreviewStack::data(const QModelIndex& index, int role) const
69+{
70+ switch (role) {
71+ case RolePreviewModel:
72+ return QVariant::fromValue(m_previews.at(index.row()));
73+ default:
74+ return QVariant();
75+ }
76+}
tests/mocks/Unity/fake_previewstack.hnew file+61
@@ -0,0 +1,61 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+
18+#ifndef FAKE_PREVIEWSTACK_H
19+#define FAKE_PREVIEWSTACK_H
20+
21+#include <QAbstractListModel>
22+#include <QSharedPointer>
23+#include <QVariantMap>
24+
25+class PreviewModel;
26+
27+class PreviewStack : public QAbstractListModel
28+{
29+ Q_OBJECT
30+
31+ Q_ENUMS(Roles)
32+
33+ Q_PROPERTY(int widgetColumnCount READ widgetColumnCount WRITE setWidgetColumnCount NOTIFY widgetColumnCountChanged)
34+
35+public:
36+ explicit PreviewStack(QObject* parent = 0);
37+ virtual ~PreviewStack();
38+
39+ enum Roles {
40+ RolePreviewModel
41+ };
42+
43+ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
44+ QHash<int, QByteArray> roleNames() const override;
45+ int rowCount(const QModelIndex& parent = QModelIndex()) const override;
46+
47+ Q_INVOKABLE PreviewModel* get(int index) const;
48+
49+ void setWidgetColumnCount(int columnCount);
50+ int widgetColumnCount() const;
51+
52+Q_SIGNALS:
53+ void widgetColumnCountChanged();
54+
55+private:
56+ QList<PreviewModel*> m_previews;
57+};
58+
59+Q_DECLARE_METATYPE(PreviewStack*)
60+
61+#endif // FAKE_PREVIEWSTACK_H
tests/mocks/Unity/scopes-ng/fake_preview_model.cpp → tests/mocks/Unity/fake_previewwidgetmodel.cpprenamed+6−16
@@ -19,14 +19,11 @@
1919 */
2020
2121// self
22−#include "fake_preview_model.h"
22+#include "fake_previewwidgetmodel.h"
2323
2424// Qt
2525#include <QVariantMap>
2626
27−namespace scopes_ng
28−{
29−
3027struct PreviewData
3128{
3229 QString id;
@@ -38,7 +35,7 @@ struct PreviewData
3835 }
3936};
4037
41−PreviewModel::PreviewModel(QObject* parent) : QAbstractListModel(parent)
38+PreviewWidgetModel::PreviewWidgetModel(QObject* parent) : QAbstractListModel(parent)
4239{
4340 m_roles[Roles::RoleWidgetId] = "widgetId";
4441 m_roles[Roles::RoleType] = "type";
@@ -47,7 +44,7 @@ PreviewModel::PreviewModel(QObject* parent) : QAbstractListModel(parent)
4744 populateWidgets();
4845}
4946
50−void PreviewModel::populateWidgets()
47+void PreviewWidgetModel::populateWidgets()
5148{
5249 beginResetModel();
5350 m_previewWidgets.clear();
@@ -63,22 +60,17 @@ void PreviewModel::populateWidgets()
6360
6461}
6562
66−void PreviewModel::triggered(QString widgetId, QString actionId, QVariantMap data)
67−{
68− Q_EMIT actionTriggered(widgetId, actionId, data);
69−}
70−
71−QHash<int, QByteArray> PreviewModel::roleNames() const
63+QHash<int, QByteArray> PreviewWidgetModel::roleNames() const
7264{
7365 return m_roles;
7466}
7567
76−int PreviewModel::rowCount(const QModelIndex&) const
68+int PreviewWidgetModel::rowCount(const QModelIndex&) const
7769{
7870 return m_previewWidgets.size();
7971}
8072
81−QVariant PreviewModel::data(const QModelIndex& index, int role) const
73+QVariant PreviewWidgetModel::data(const QModelIndex& index, int role) const
8274{
8375 auto widget_data = m_previewWidgets.at(index.row());
8476 switch (role) {
@@ -92,5 +84,3 @@ QVariant PreviewModel::data(const QModelIndex& index, int role) const
9284 return QVariant();
9385 }
9486}
95−
96−} // namespace scopes_ng
tests/mocks/Unity/scopes-ng/fake_preview_model.h → tests/mocks/Unity/fake_previewwidgetmodel.hrenamed+6−18
@@ -15,26 +15,23 @@
1515 */
1616
1717
18−#ifndef NG_FAKE_PREVIEW_H
19−#define NG_FAKE_PREVIEW_H
18+#ifndef FAKE_PREVIEWWIDGETMODEL_H
19+#define FAKE_PREVIEWWIDGETMODEL_H
2020
2121#include <QAbstractListModel>
2222#include <QSharedPointer>
2323#include <QVariantMap>
2424
25−namespace scopes_ng
26−{
27−
2825class PreviewData;
2926
30−class Q_DECL_EXPORT PreviewModel : public QAbstractListModel
27+class PreviewWidgetModel : public QAbstractListModel
3128{
3229 Q_OBJECT
3330
3431 Q_ENUMS(Roles)
3532
3633public:
37− explicit PreviewModel(QObject* parent = 0);
34+ explicit PreviewWidgetModel(QObject* parent = 0);
3835
3936 enum Roles {
4037 RoleWidgetId,
@@ -46,12 +43,6 @@ public:
4643 QHash<int, QByteArray> roleNames() const override;
4744 int rowCount(const QModelIndex& parent = QModelIndex()) const override;
4845
49−Q_SIGNALS:
50− void actionTriggered(QString widgetId, QString actionId, QVariantMap data);
51−
52−public Q_SLOTS:
53− void triggered(QString widgetId, QString actionId, QVariantMap data);
54−
5546private:
5647 QHash<int, QByteArray> m_roles;
5748 QList<QSharedPointer<PreviewData>> m_previewWidgets;
@@ -60,9 +51,6 @@ private:
6051
6152};
6253
63−} // namespace scopes_ng
64−
65−
66−Q_DECLARE_METATYPE(scopes_ng::PreviewModel*)
54+Q_DECLARE_METATYPE(PreviewWidgetModel*)
6755
68−#endif // NG_FAKE_PREVIW_H
56+#endif // FAKE_PREVIEWWIDGETMODEL_H
tests/mocks/Unity/fake_resultsmodel.cppnew file+117
@@ -0,0 +1,117 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * Authors:
5+ * Michal Hruby <michal.hruby@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+// self
21+#include "fake_resultsmodel.h"
22+
23+#include <paths.h>
24+
25+ResultsModel::ResultsModel(int result_count, int categoryId, QObject* parent)
26+ : QAbstractListModel(parent)
27+ , m_result_count(result_count)
28+ , m_categoryId(categoryId)
29+{
30+ m_roles[ResultsModel::RoleUri] = "uri";
31+ m_roles[ResultsModel::RoleCategoryId] = "categoryId";
32+ m_roles[ResultsModel::RoleDndUri] = "dndUri";
33+ m_roles[ResultsModel::RoleResult] = "result";
34+ m_roles[ResultsModel::RoleTitle] = "title";
35+ m_roles[ResultsModel::RoleArt] = "art";
36+ m_roles[ResultsModel::RoleSubtitle] = "subtitle";
37+ m_roles[ResultsModel::RoleMascot] = "mascot";
38+ m_roles[ResultsModel::RoleEmblem] = "emblem";
39+ m_roles[ResultsModel::RoleOldPrice] = "oldPrice";
40+ m_roles[ResultsModel::RolePrice] = "price";
41+ m_roles[ResultsModel::RoleAltPrice] = "altPrice";
42+ m_roles[ResultsModel::RoleRating] = "rating";
43+ m_roles[ResultsModel::RoleAltRating] = "altRating";
44+ m_roles[ResultsModel::RoleSummary] = "summary";
45+}
46+
47+QString ResultsModel::categoryId() const
48+{
49+ return QString::number(m_categoryId);
50+}
51+
52+void ResultsModel::setCategoryId(QString const& /*id*/)
53+{
54+ qFatal("Calling un-implemented ResultsModel::setCategoryId");
55+}
56+
57+QHash<int, QByteArray>
58+ResultsModel::roleNames() const
59+{
60+ return m_roles;
61+}
62+
63+int ResultsModel::rowCount(const QModelIndex& parent) const
64+{
65+ Q_UNUSED(parent);
66+
67+ return m_result_count;
68+}
69+
70+int ResultsModel::count() const
71+{
72+ return rowCount();
73+}
74+
75+QVariant ResultsModel::get(int row) const
76+{
77+ if (row >= m_result_count || row < 0) return QVariantMap();
78+
79+ QVariantMap result;
80+ QModelIndex modelIndex(index(row));
81+ QHashIterator<int, QByteArray> it(roleNames());
82+ while (it.hasNext()) {
83+ it.next();
84+ QVariant val(data(modelIndex, it.key()));
85+ if (val.isNull()) continue;
86+ result[it.value()] = val;
87+ }
88+
89+ return result;
90+}
91+
92+QVariant
93+ResultsModel::data(const QModelIndex& index, int role) const
94+{
95+ switch (role) {
96+ case RoleUri:
97+ case RoleCategoryId:
98+ case RoleDndUri:
99+ case RoleResult:
100+ return QString();
101+ case RoleTitle:
102+ return QString("Title.%1.%2").arg(m_categoryId).arg(index.row());
103+ case RoleArt:
104+ return qmlDirectory() + "graphics/applicationIcons/dash.png";
105+ case RoleSubtitle:
106+ case RoleMascot:
107+ case RoleEmblem:
108+ case RoleOldPrice:
109+ case RolePrice:
110+ case RoleAltPrice:
111+ case RoleRating:
112+ case RoleAltRating:
113+ case RoleSummary:
114+ default:
115+ return QVariant();
116+ }
117+}
tests/mocks/Unity/fake_resultsmodel.hnew file+80
@@ -0,0 +1,80 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * Authors:
5+ * Michal Hruby <michal.hruby@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+
21+#ifndef FAKE_RESULTS_MODEL_H
22+#define FAKE_RESULTS_MODEL_H
23+
24+#include <QAbstractListModel>
25+
26+class ResultsModel : public QAbstractListModel
27+{
28+ Q_OBJECT
29+
30+ Q_ENUMS(Roles)
31+
32+ Q_PROPERTY(QString categoryId READ categoryId WRITE setCategoryId NOTIFY categoryIdChanged)
33+ Q_PROPERTY(int count READ count NOTIFY countChanged)
34+
35+public:
36+ explicit ResultsModel(int result_count, int categoryId, QObject* parent = 0);
37+
38+ enum Roles {
39+ RoleUri,
40+ RoleCategoryId,
41+ RoleDndUri,
42+ RoleResult,
43+ // card components
44+ RoleTitle,
45+ RoleArt,
46+ RoleSubtitle,
47+ RoleMascot,
48+ RoleEmblem,
49+ RoleOldPrice,
50+ RolePrice,
51+ RoleAltPrice,
52+ RoleRating,
53+ RoleAltRating,
54+ RoleSummary
55+ };
56+
57+ int rowCount(const QModelIndex& parent = QModelIndex()) const override;
58+ QHash<int, QByteArray> roleNames() const override;
59+ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
60+
61+ Q_INVOKABLE QVariant get(int row) const;
62+
63+ /* getters */
64+ QString categoryId() const;
65+ int count() const;
66+
67+ /* setters */
68+ void setCategoryId(QString const& id);
69+
70+Q_SIGNALS:
71+ void categoryIdChanged();
72+ void countChanged();
73+
74+private:
75+ QHash<int, QByteArray> m_roles;
76+ int m_result_count;
77+ int m_categoryId;
78+};
79+
80+#endif // FAKE_RESULTS_MODEL_H
tests/mocks/Unity/fake_scope.cpp+18−118
@@ -15,15 +15,7 @@
1515 */
1616
1717#include "fake_scope.h"
18−#include "fake_preview.h"
19−#include <paths.h>
20−
21−#include <dee.h>
22−
23−static DeeModel* create_categories_model(unsigned category_count);
24−static DeeModel* create_results_model(unsigned category_count, unsigned result_count);
25−
26−// TODO: Implement remaining pieces
18+#include "fake_resultsmodel.h"
2719
2820Scope::Scope(QObject* parent) : Scope(QString(), QString(), false, parent)
2921{
@@ -37,20 +29,8 @@ Scope::Scope(QString const& id, QString const& name, bool visible, QObject* pare
3729 , m_searching(false)
3830 , m_isActive(false)
3931 , m_previewRendererName("preview-generic")
40− , m_categories(new Categories(this))
41− , m_results(new DeeListModel(this))
32+ , m_categories(new Categories(20, this))
4233{
43− DeeModel* results_model = create_results_model(20, 300);
44− m_categories->setResultModel(results_model);
45− m_categories->setModel(create_categories_model(20));
46− m_results->setModel(results_model);
47−
48− m_timer.setInterval(1000);
49− m_timer.setSingleShot(true);
50− connect(&m_timer, &QTimer::timeout, [this]() {
51− Preview *p = new Preview(m_previewRendererName, this);
52− Q_EMIT previewReady(p);
53− });
5434}
5535
5636QString Scope::id() const {
@@ -133,7 +113,7 @@ void Scope::setFormFactor(const QString &str) {
133113void Scope::setActive(const bool active) {
134114 if (active != m_isActive) {
135115 m_isActive = active;
136− Q_EMIT isActiveChanged();
116+ Q_EMIT isActiveChanged(active);
137117 }
138118}
139119
@@ -151,105 +131,25 @@ void Scope::setNoResultsHint(const QString& str) {
151131 }
152132}
153133
154−void Scope::activate(const QVariant &uri, const QVariant &icon_hint, const QVariant &category,
155− const QVariant &result_type, const QVariant &mimetype, const QVariant &title,
156− const QVariant &comment, const QVariant &dnd_uri, const QVariant &metadata)
134+void Scope::activate(QVariant const& result)
157135{
158− Q_UNUSED(icon_hint);
159− Q_UNUSED(category);
160− Q_UNUSED(result_type);
161− Q_UNUSED(mimetype);
162− Q_UNUSED(title);
163− Q_UNUSED(comment);
164− Q_UNUSED(dnd_uri);
165− Q_UNUSED(metadata);
166−
167− if (uri != "uri://result.2")
168− m_timer.start();
169−}
170−
171−void Scope::preview(const QVariant &uri, const QVariant &icon_hint, const QVariant &category,
172− const QVariant &result_type, const QVariant &mimetype, const QVariant &title,
173− const QVariant &comment, const QVariant &dnd_uri, const QVariant &metadata)
136+ Q_UNUSED(result);
137+}
138+
139+PreviewStack* Scope::preview(QVariant const& result)
174140{
175− Q_UNUSED(uri);
176− Q_UNUSED(icon_hint);
177− Q_UNUSED(category);
178− Q_UNUSED(result_type);
179− Q_UNUSED(mimetype);
180− Q_UNUSED(title);
181− Q_UNUSED(comment);
182− Q_UNUSED(dnd_uri);
183− Q_UNUSED(metadata);
184−
185− m_timer.start();
186−}
187−
188−static const gchar * categories_model_schema[] = {
189− "s", //ID
190− "s", // DISPLAY_NAME
191− "s", // ICON_HINT
192− "s", // RENDERER_NAME
193− "a{sv}" // HINTS
194−};
195−
196−
197−DeeModel* create_categories_model(unsigned category_count) {
198− DeeModel* category_model = dee_sequence_model_new();
199− dee_model_set_schema_full(category_model, categories_model_schema, G_N_ELEMENTS(categories_model_schema));
200− GVariant* hints = g_variant_new_array(g_variant_type_element(G_VARIANT_TYPE_VARDICT), NULL, 0);
201−
202− for(unsigned i = 0; i < category_count; ++i)
203− {
204− dee_model_append(category_model,
205− (i == 2) ? "applications.scope" : std::to_string(i).c_str(),
206− ("Category "+std::to_string(i)).c_str(),
207− "gtk-apply",
208− i % 2 == 0 ? "grid" : "carousel",
209− hints);
210− }
211− return category_model;
212−}
213−
214−
215−/* Schema that is used in the DeeModel representing
216− the results */
217−static const gchar * results_model_schema[] = {
218− "s", // URI
219− "s", // ICON_HINT
220− "u", // CATEGORY
221− "u", // RESULT_TYPE
222− "s", // MIMETYPE
223− "s", // TITLE
224− "s", // COMMENT
225− "s", // DND_URI
226− "a{sv}" // METADATA
227−};
228−
229−DeeModel* create_results_model(unsigned category_count, unsigned result_count) {
230− DeeModel* results_model = dee_sequence_model_new();
231− dee_model_set_schema_full(results_model, results_model_schema, G_N_ELEMENTS(results_model_schema));
232− GVariant* hints = g_variant_new_array(g_variant_type_element(G_VARIANT_TYPE_VARDICT), NULL, 0);
233−
234− for(unsigned i = 0; i < result_count; ++i)
235− {
236− unsigned category = i % category_count;
237−
238− dee_model_append(results_model,
239− ("uri://result."+std::to_string(i)).c_str(),
240− (qmlDirectory() + "graphics/applicationIcons/dash.png").toLatin1().data(),
241− category,
242− 0,
243− "application/x-desktop",
244− ("Title."+std::to_string(i)).c_str(),
245− ("Comment."+std::to_string(i)).c_str(),
246− ("uri://result."+std::to_string(i)).c_str(),
247− hints);
248− }
249− return results_model;
141+ Q_UNUSED(result);
142+
143+ // This probably leaks, do we don't care
144+ // it's a test after all
145+ return new PreviewStack;
250146}
251147
252148void Scope::cancelActivation()
253149{
254− m_timer.stop();
150+}
151+
152+void Scope::closeScope(Scope* /*scope*/)
153+{
154+ qFatal("Scope::closeScope is not implemented");
255155}
tests/mocks/Unity/fake_scope.h+17−18
@@ -18,9 +18,10 @@
1818#define FAKE_SCOPE_H
1919
2020#include "fake_categories.h"
21+#include "fake_previewstack.h"
2122
2223#include <QObject>
23−#include <QDebug>
24+#include <QTimer>
2425
2526class Preview;
2627
@@ -33,12 +34,12 @@ class Scope : public QObject
3334 Q_PROPERTY(QString iconHint READ iconHint NOTIFY iconHintChanged)
3435 Q_PROPERTY(QString description READ description NOTIFY descriptionChanged)
3536 Q_PROPERTY(QString searchHint READ searchHint NOTIFY searchHintChanged)
37+ Q_PROPERTY(bool searchInProgress READ searchInProgress WRITE setSearchInProgress NOTIFY searchInProgressChanged)
3638 Q_PROPERTY(bool visible READ visible NOTIFY visibleChanged)
3739 Q_PROPERTY(QString shortcut READ shortcut NOTIFY shortcutChanged)
38− Q_PROPERTY(bool connected READ connected NOTIFY connectedChanged)
3940 Q_PROPERTY(Categories* categories READ categories NOTIFY categoriesChanged)
41+ //Q_PROPERTY(Filters* filters READ filters NOTIFY filtersChanged)
4042
41− Q_PROPERTY(bool searchInProgress READ searchInProgress WRITE setSearchInProgress NOTIFY searchInProgressChanged)
4243 Q_PROPERTY(QString searchQuery READ searchQuery WRITE setSearchQuery NOTIFY searchQueryChanged)
4344 Q_PROPERTY(QString noResultsHint READ noResultsHint WRITE setNoResultsHint NOTIFY noResultsHintChanged)
4445 Q_PROPERTY(QString formFactor READ formFactor WRITE setFormFactor NOTIFY formFactorChanged)
@@ -72,17 +73,13 @@ public:
7273 void setActive(const bool);
7374 void setSearchInProgress(const bool inProg);
7475
75− Q_INVOKABLE void activate(const QVariant &uri, const QVariant &icon_hint, const QVariant &category,
76− const QVariant &result_type, const QVariant &mimetype, const QVariant &title,
77− const QVariant &comment, const QVariant &dnd_uri, const QVariant &metadata);
78− Q_INVOKABLE void preview(const QVariant &uri, const QVariant &icon_hint, const QVariant &category,
79− const QVariant &result_type, const QVariant &mimetype, const QVariant &title,
80− const QVariant &comment, const QVariant &dnd_uri, const QVariant &metadata);
81−
76+ Q_INVOKABLE void activate(QVariant const& result);
77+ Q_INVOKABLE PreviewStack* preview(QVariant const& result);
8278 Q_INVOKABLE void cancelActivation();
79+ Q_INVOKABLE void closeScope(Scope* scope);
8380
8481Q_SIGNALS:
85− void idChanged(const QString&);
82+ void idChanged();
8683 void nameChanged(const QString&);
8784 void iconHintChanged(const QString&);
8885 void descriptionChanged(const QString&);
@@ -90,18 +87,23 @@ Q_SIGNALS:
9087 void searchInProgressChanged();
9188 void visibleChanged(bool);
9289 void shortcutChanged(const QString&);
93− void connectedChanged(bool);
9490 void categoriesChanged();
91+ //void filtersChanged();
9592 void searchQueryChanged();
9693 void noResultsHintChanged();
9794 void formFactorChanged();
98− void isActiveChanged();
95+ void isActiveChanged(bool);
9996
10097 // signals triggered by activate(..) or preview(..) requests.
101− void previewReady(Preview *preview);
102− void activateApplication(const QString &desktop);
10398 void showDash();
10499 void hideDash();
100+ void gotoUri(const QString &uri);
101+ void activated();
102+ void previewRequested(QVariant const& result);
103+ void gotoScope(QString const& scopeId);
104+ void openScope(Scope* scope);
105+
106+ void activateApplication(const QString &desktop);
105107
106108protected:
107109
@@ -119,9 +121,6 @@ protected:
119121 QString m_previewRendererName;
120122
121123 Categories* m_categories;
122− DeeListModel* m_results;
123−
124− QTimer m_timer;
125124};
126125
127126#endif // FAKE_SCOPE_H
tests/mocks/Unity/fake_scopes.cpp+1−5
@@ -19,9 +19,6 @@
1919// Self
2020#include "fake_scopes.h"
2121
22−// Local
23−#include "fake_applications_scope.h"
24−
2522// TODO: Implement remaining pieces, like Categories (i.e. LensView now gives warnings)
2623
2724// Qt
@@ -56,8 +53,7 @@ void Scopes::updateScopes()
5653 clear();
5754 addScope(new Scope("MockScope1", "People", true, this));
5855 addScope(new Scope("MockScope2", "Music", false, this));
59− addScope(new Scope("home.scope", "Home", true, this));
60− addScope(new ApplicationsScope(true, this));
56+ addScope(new Scope("clickscope", "Apps", true, this));
6157 addScope(new Scope("MockScope5", "Videos", true, this));
6258
6359 if (!m_loaded) {
tests/mocks/Unity/fake_unity_plugin.cpp+10−13
@@ -22,11 +22,9 @@
2222// local
2323#include "fake_scopes.h"
2424#include "fake_categories.h"
25−#include "fake_preview.h"
26−#include "categoryresults.h"
27−
28−// scopes-ng
29−#include "scopes-ng/fake_preview_model.h"
25+#include "fake_previewmodel.h"
26+#include "fake_previewwidgetmodel.h"
27+#include "fake_resultsmodel.h"
3028
3129// External
3230#include <glib-object.h>
@@ -41,12 +39,11 @@ void FakeUnityPlugin::registerTypes(const char *uri)
4139
4240 Q_ASSERT(uri == QLatin1String("Unity"));
4341
44− qmlRegisterUncreatableType<Preview>(uri, 0, 1, "Preview", "Can't create Preview object in QML.");
45− qmlRegisterType<Scopes>(uri, 0, 1, "Scopes");
46− qmlRegisterType<Scope>(uri, 0, 1, "Scope");
47− qmlRegisterType<Categories>(uri, 0, 1, "Categories");
48− qmlRegisterUncreatableType<CategoryResults>(uri, 0, 1, "CategoryResults", "Can't create");
49− qmlRegisterType<DeeListModel>(uri, 0, 1, "DeeListModel");
50−
51− qmlRegisterType<scopes_ng::PreviewModel>(uri, 0, 1, "FakePreviewModel");
42+ qmlRegisterType<Scopes>(uri, 0, 2, "Scopes");
43+ qmlRegisterType<Scope>(uri, 0, 2, "Scope");
44+ qmlRegisterUncreatableType<Categories>(uri, 0, 2, "Categories", "Can't create Categories object in QML.");
45+ qmlRegisterUncreatableType<ResultsModel>(uri, 0, 2, "ResultsModel", "Can't create ResultsModel object in QML.");
46+ qmlRegisterType<PreviewModel>(uri, 0, 2, "FakePreviewModel");
47+ qmlRegisterUncreatableType<PreviewWidgetModel>(uri, 0, 2, "PreviewWidgetModel", "Can't create new PreviewWidgetModel in QML. Get them from PreviewModel instance.");
48+ qmlRegisterUncreatableType<PreviewStack>(uri, 0, 2, "PreviewStack", "Can't create new PreviewStack in QML. Get them from Scope instance.");
5249}
tests/plugins/DashViews/listviewwithpageheadertest.cpp+24−7
@@ -32,6 +32,10 @@
3232#include <private/qquickitem_p.h>
3333#pragma GCC diagnostic pop
3434
35+// TODO Think on how doing a test for lost items
36+// particullary making sure that lost items are culled
37+// and then removed in the next updatePolish cycle
38+
3539class ListViewWithPageHeaderTest : public QObject
3640{
3741 Q_OBJECT
@@ -1281,9 +1285,6 @@ private Q_SLOTS:
12811285
12821286 void testShowHeaderHalfShown()
12831287 {
1284−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
1285− QSKIP("This test is extremely unstable in 5.0.x");
1286−#endif
12871288 changeContentY(20);
12881289
12891290 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
@@ -1854,15 +1855,11 @@ private Q_SLOTS:
18541855 scrollToBottom();
18551856 lvwph->showHeader();
18561857 QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning());
1857− QTest::qWait(100); // Make sure stuff is stable
18581858 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 100));
18591859 model->setProperty(3, "size", 10);
18601860 model->setProperty(4, "size", 10);
18611861 model->setProperty(5, "size", 10);
18621862 model->setProperty(6, "size", 10);
1863−#if (QT_VERSION > QT_VERSION_CHECK(5, 0, 3))
1864− QTRY_COMPARE(lvwph->m_minYExtent, 210.);
1865−#endif
18661863 QTRY_COMPARE(lvwph->m_headerItem->y(), -lvwph->m_minYExtent);
18671864 }
18681865
@@ -1893,6 +1890,26 @@ private Q_SLOTS:
18931890 QTRY_COMPARE(lvwph->m_visibleItems.count(), 1);
18941891 }
18951892
1893+ void testResizeScrolledBigItem()
1894+ {
1895+ QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 0), Q_ARG(QVariant, 6));
1896+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 0);
1897+
1898+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 10000));
1899+ changeContentY(8000);
1900+
1901+ // Pretend the list is busy requesting some other index
1902+ lvwph->m_asyncRequestedIndex = 4;
1903+
1904+ lvwph->m_visibleItems[0]->m_item->setHeight(100);
1905+ // This resize makes the item go outside the viewport so its deleted
1906+ QCOMPARE(lvwph->m_visibleItems.count(), 0);
1907+ QCOMPARE(lvwph->m_firstVisibleIndex, -1);
1908+ // On the next polish the item will be readded
1909+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 1);
1910+ QTRY_COMPARE(lvwph->m_firstVisibleIndex, 0);
1911+ }
1912+
18961913private:
18971914 QQuickView *view;
18981915 ListViewWithPageHeader *lvwph;
tests/plugins/DashViews/listviewwithpageheadertestsection.cpp+3−6
@@ -1486,9 +1486,6 @@ private Q_SLOTS:
14861486
14871487 void testShowHeaderHalfShown()
14881488 {
1489−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
1490− QSKIP("This test is extremely unstable in 5.0.x");
1491−#endif
14921489 changeContentY(20);
14931490
14941491 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
@@ -1683,12 +1680,11 @@ private Q_SLOTS:
16831680 verifyItem(18, 700, 50., false, QString(), true);
16841681 verifyItem(19, 750, 50., false, QString(), true);
16851682 verifyItem(20, 800, 50., false, QString(), true);
1686− QCOMPARE(lvwph->m_minYExtent, 5 * 1510./21. + 660 - 1970 + 50);
1687− QCOMPARE(lvwph->m_clipItem->y(), 1970.);
1683+ QCOMPARE(lvwph->m_clipItem->y(), lvwph->contentY());
1684+ QCOMPARE(lvwph->m_minYExtent, 5 * 1510./21. + 660 - lvwph->contentY() + 50);
16881685 QCOMPARE(lvwph->m_clipItem->clip(), false);
16891686 QCOMPARE(lvwph->m_headerItem->y(), 0.);
16901687 QCOMPARE(lvwph->m_headerItem->height(), 50.);
1691− QCOMPARE(lvwph->contentY(), 1970.);
16921688 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
16931689 }
16941690
@@ -2111,6 +2107,7 @@ private Q_SLOTS:
21112107 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
21122108
21132109 QTest::qWait(1);
2110+ QCoreApplication::instance()->processEvents();
21142111
21152112 changeContentY(-15);
21162113
tests/plugins/DashViews/organicgridtest.cpp+2−1
@@ -134,11 +134,12 @@ private Q_SLOTS:
134134 view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/organicgridtest.qml"));
135135
136136 view->show();
137− view->resize(470, 400);
138137 QTest::qWaitForWindowExposed(view);
138+ view->resize(470, 400);
139139
140140 grid = dynamic_cast<OrganicGrid*>(view->rootObject()->findChild<QObject*>("grid"));
141141 grid->setModel(model);
142+ QTRY_COMPARE(grid->width(), 470.);
142143
143144 checkInitialPositions();
144145 }
tests/plugins/DashViews/verticaljournaltest.cpp+2−1
@@ -135,11 +135,12 @@ private Q_SLOTS:
135135 view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/verticaljournaltest.qml"));
136136
137137 view->show();
138− view->resize(470, 400);
139138 QTest::qWaitForWindowExposed(view);
139+ view->resize(470, 400);
140140
141141 vj = dynamic_cast<VerticalJournal*>(view->rootObject()->findChild<QObject*>("vj"));
142142 vj->setModel(model);
143+ QTRY_COMPARE(vj->width(), 470.);
143144
144145 checkInitialPositions();
145146 }
tests/plugins/Ubuntu/Gestures/CMakeLists.txt+2−11
@@ -15,20 +15,11 @@ add_custom_target(UbuntuGesturesTestQmlFiles ALL
1515add_definitions(-DUBUNTU_GESTURES_PLUGIN_DIR="${CMAKE_BINARY_DIR}/plugins")
1616
1717macro(add_gesture_ui_test CLASSNAME)
18− set(testCommand
19− LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures
20− ${CMAKE_CURRENT_BINARY_DIR}/${CLASSNAME}TestExec
21− -o ${CMAKE_BINARY_DIR}/${CLASSNAME}Test.xml,xunitxml
22− -o -,txt)
23−
24− add_custom_target(test${CLASSNAME} ${testCommand})
25− add_dependencies(qmluitests test${CLASSNAME})
26− add_dependencies(test${CLASSNAME} ${CLASSNAME}TestExec UbuntuGesturesTestQmlFiles)
27−
2818 add_executable(${CLASSNAME}TestExec tst_${CLASSNAME}.cpp GestureTest.cpp)
2919 qt5_use_modules(${CLASSNAME}TestExec Test Core Qml Gui Quick)
3020 target_link_libraries(${CLASSNAME}TestExec UbuntuGestureQml)
31− add_manual_qml_test(. ${CLASSNAME} IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
21+
22+ add_binary_qml_test(${CLASSNAME} ${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures UbuntuGesturesTestQmlFiles)
3223endmacro(add_gesture_ui_test)
3324
3425macro(add_gesture_test CLASSNAME)
tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.cpp+8
@@ -103,6 +103,14 @@ void tst_DirectionalDragArea::init()
103103{
104104 GestureTest::init();
105105
106+ // We shouldn't need the three lines below, but a compiz/unity7
107+ // regression means we don't pass the test without them because
108+ // the window doesn't have the proper size. Can be removed in the
109+ // future if the regression is fixed and tests pass again
110+ m_view->resize(m_view->rootObject()->width(), m_view->rootObject()->height());
111+ QTRY_COMPARE(m_view->width(), (int)m_view->rootObject()->width());
112+ QTRY_COMPARE(m_view->height(), (int)m_view->rootObject()->height());
113+
106114 fakeTimeSource.reset(new FakeTimeSource);
107115 fakeTimer = new FakeTimer(fakeTimeSource);
108116}
tests/plugins/Unity/Launcher/launchermodeltest.cpp+5
@@ -39,6 +39,7 @@ public:
3939 ApplicationInfoInterface::Stage stage() const { return ApplicationInfoInterface::MainStage; }
4040 ApplicationInfoInterface::State state() const { return ApplicationInfoInterface::Running; }
4141 bool focused() const { return m_focused; }
42+ QUrl screenshot() const { return QUrl(); }
4243
4344 // Methods used for mocking (not in the interface)
4445 void setFocused(bool focused) { m_focused = focused; Q_EMIT focusedChanged(focused); }
@@ -92,6 +93,10 @@ public:
9293 m_list.takeAt(index)->deleteLater();
9394 endRemoveRows();
9495 }
96+ bool updateScreenshot(const QString &appId) { Q_UNUSED(appId); return true; }
97+ bool requestFocusApplication(const QString &appId) { Q_UNUSED(appId); return true; }
98+ bool suspended() const { return false; }
99+ void setSuspended(bool) {}
95100
96101private:
97102 QList<MockApp*> m_list;
tests/qmltests/CMakeLists.txt+3−16
@@ -12,9 +12,6 @@ set(qmltest_DEFAULT_TARGETS qmlunittests)
1212set(qmltest_DEFAULT_NO_ADD_TEST FALSE)
1313set(qmltest_DEFAULT_PROPERTIES ENVIRONMENT "QT_QPA_PLATFORM=minimal")
1414add_qml_test(Components AnimationControllerWithSignals)
15−add_qml_test(Components Carousel)
16−add_qml_test(Components OpenEffect)
17−add_qml_test(Components RatingStars)
1815add_qml_test(Panel IndicatorItem)
1916add_qml_test(utils/Unity/Test UnityTest)
2017
@@ -24,7 +21,7 @@ set(qmltest_DEFAULT_PROPERTIES "")
2421
2522add_qml_test(. Shell IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks
2623 ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
27−add_manual_qml_test(Components DragHandle IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
24+add_qml_test(Components Carousel)
2825add_qml_test(Components DraggingArea)
2926add_qml_test(Components EdgeDemoOverlay)
3027add_qml_test(Components FilterGrid IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
@@ -35,27 +32,16 @@ add_qml_test(Components ResponsiveGridView)
3532add_qml_test(Components Revealer)
3633add_qml_test(Components SeeMore)
3734add_qml_test(Components Showable)
38−add_qml_test(Components Stage IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS}
39− ${CMAKE_BINARY_DIR}/tests/mocks
40− ${CMAKE_BINARY_DIR}/plugins)
41−add_qml_test(Components Tile)
4235add_qml_test(Components PageHeaderLabel)
4336add_qml_test(Dash Dash IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
4437add_qml_test(Dash DashContent IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
45−add_qml_test(Dash DashPreview)
46−add_qml_test(Dash GenericPreview)
4738add_qml_test(Dash Card)
4839add_qml_test(Dash CardHeader)
4940add_qml_test(Dash CardTool)
5041add_qml_test(Dash GenericScopeView IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
51−add_qml_test(Dash FilterGrids IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins ${CMAKE_CURRENT_SOURCE_DIR}/plugins
52− ${CMAKE_BINARY_DIR}/tests/mocks)
5342add_qml_test(Dash/Apps RunningApplicationsGrid IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS}
5443 ${CMAKE_BINARY_DIR}/tests/mocks
5544 ${CMAKE_BINARY_DIR}/plugins)
56−add_qml_test(Dash/Apps AppPreview IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
57−add_qml_test(Dash/Movie MoviePreview IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
58−add_qml_test(Dash/Music MusicPreview IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
5945add_qml_test(Dash/Previews Preview IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
6046add_qml_test(Dash/Previews PreviewActions IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
6147add_qml_test(Dash/Previews PreviewAudioPlayback IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
@@ -82,6 +68,7 @@ add_qml_test(Hud Hud)
8268add_qml_test(Hud Result)
8369add_qml_test(Launcher Launcher IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
8470add_qml_test(Notifications Notifications IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
71+add_qml_test(Notifications VisualSnapDecisionsQueue IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
8572add_qml_test(Panel IndicatorRow)
8673add_qml_test(Panel Indicators IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
8774add_qml_test(Panel MenuContent IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
@@ -93,6 +80,6 @@ add_qml_test(Panel/Indicators DefaultIndicatorPage IMPORT_PATHS ${CMAKE_BINARY_D
9380 ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
9481add_qml_test(Panel/Indicators MenuItemFactory IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
9582add_qml_test(Panel/Indicators MessageMenuItemFactory IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
96−add_qml_test(SideStage SideStage IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS}
83+add_qml_test(Stages PhoneStage IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS}
9784 ${CMAKE_BINARY_DIR}/tests/mocks
9885 ${CMAKE_BINARY_DIR}/plugins)
tests/qmltests/Components/CMakeLists.txt+2−10
@@ -6,19 +6,11 @@ include_directories(
66 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
77 )
88
9−set(testCommand
10− LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures
11− ${CMAKE_CURRENT_BINARY_DIR}/DragHandleTestExec
12− -o ${CMAKE_BINARY_DIR}/DragHandleTest.xml,xunitxml
13− -o -,txt)
14−
15−add_custom_target(testDragHandle ${testCommand})
16−add_dependencies(qmluitests testDragHandle)
17−add_dependencies(testDragHandle DragHandleTestExec)
18−
199add_executable(DragHandleTestExec tst_DragHandle.cpp)
2010qt5_use_modules(DragHandleTestExec Test Core Qml Gui Quick)
2111target_link_libraries(DragHandleTestExec UbuntuGestureQml)
2212
13+add_binary_qml_test(DragHandle ${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures "")
14+
2315add_definitions(-DUBUNTU_GESTURES_PLUGIN_DIR="${CMAKE_BINARY_DIR}/plugins")
2416add_definitions(-DTEST_DIR="${CMAKE_CURRENT_LIST_DIR}")
tests/qmltests/Components/tst_Carousel.qml+194−168
@@ -16,179 +16,205 @@
1616
1717import QtQuick 2.0
1818import QtTest 1.0
19+import "../../../qml/Components/"
1920import "../../../qml/Components/carousel.js" as Carousel
2021
21−TestCase {
22− id: root
23− name: "Carousel"
24−
25− property real carouselWidth
26− property int itemCount
27− property real tileWidth
28−
29− property real contentWidth: itemCount * tileWidth
30− // following variables are copied from Carousel.qml
31− // I'm not using the variables directly from there, as then tileWidth and others would be affected as well
32− property real gapToMiddlePhase: Math.min(carouselWidth / 2 - tileWidth / 2, (contentWidth - carouselWidth) / 2)
33− property real gapToEndPhase: contentWidth - carouselWidth - gapToMiddlePhase
34− property real kMiddleIndex: (carouselWidth / 2) / tileWidth - 0.5
35− property real kGapEnd: kMiddleIndex * (1 - gapToEndPhase / gapToMiddlePhase)
36− property real kXBeginningEnd: 1 / tileWidth + kMiddleIndex / gapToMiddlePhase
37−
38− // test for the getContinuousIndex() function
39− function test_getContinuousIndex_data() {
40− // testing for 10 items of size 100 pixel
41− return [ {tag:"at start",
42− x: 0, carouselWidth:400, tileWidth:100, itemCount:10, result: 0},
43− {tag:"in startup",
44− x: 100, carouselWidth:400, tileWidth:100, itemCount:10, result: 2},
45− {tag:"in the middle",
46− x: 350, carouselWidth:400, tileWidth:100, itemCount:10, result: 5},
47− {tag:"at end",
48− x: 600, carouselWidth:400, tileWidth:100, itemCount:10, result: 9},
49− ]
50− }
22+Item {
23+ width: 700
24+ height: 400
5125
52− function test_getContinuousIndex(data) {
53− root.carouselWidth = data.carouselWidth
54− root.tileWidth = data.tileWidth
55− root.itemCount = data.itemCount
26+ Carousel {
27+ anchors.fill: parent
28+ id: carousel
29+ model: 40
5630
57− var index = Carousel.getContinuousIndex(data.x,
58− data.tileWidth,
59− gapToMiddlePhase,
60− gapToEndPhase,
61− kGapEnd,
62− kMiddleIndex,
63− kXBeginningEnd)
64− compare(index, data.result)
65− }
66−
67− // test for the getXFromContinuousIndex() function
68− function test_getXFromContinuousIndex_data() {
69− return [ {tag:"at start",
70− index: 0, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:0, result: 0},
71− {tag:"in startup",
72− index: 2, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:0, result: 100},
73− {tag:"in startup with drawBuffer",
74− index: 2, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:100, result: 0},
75− {tag:"in the middle",
76− index: 5, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:0, result: 350},
77− {tag:"in the middle with drawBuffer",
78− index: 5, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:100, result: 250},
79− {tag:"at end",
80− index: 9, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:0, result: 600},
81− {tag:"at end with drawBuffer",
82− index: 9, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:100, result: 500},
83− ]
84− }
85−
86− function test_getXFromContinuousIndex(data) {
87− root.carouselWidth = data.carouselWidth
88− root.tileWidth = data.tileWidth
89− root.itemCount = data.itemCount
90−
91− var x = Carousel.getXFromContinuousIndex(data.index,
92− data.carouselWidth,
93− contentWidth,
94− data.tileWidth,
95− gapToMiddlePhase,
96− gapToEndPhase,
97− data.drawBuffer)
98− compare(x, data.result)
99− }
100−
101− // test for the getViewTranslation() function
102− function test_getViewTranslation_data() {
103− return [ {tag:"at start - viewfactor 1",
104− x: 0, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:1, result: 150},
105− {tag:"at start - viewfactor 2",
106− x: 0, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:2, result: 300},
107− {tag:"in startup",
108− x: 100, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:1, result: 50},
109− {tag:"in the middle",
110− x: 350, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:1, result: 0},
111− {tag:"at end",
112− x: 600, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:1, result: -150},
113− ]
114− }
31+ property int createdDelegates: 0
32+ property int destroyedDelegates: 0
11533
116− function test_getViewTranslation(data) {
117− root.carouselWidth = data.carouselWidth
118− root.tileWidth = data.tileWidth
119− root.itemCount = data.itemCount
120−
121− var x = Carousel.getViewTranslation(data.x,
122− data.tileWidth,
123− root.gapToMiddlePhase,
124− root.gapToEndPhase,
125− data.translationXViewFactor)
126− compare(x, data.result)
34+ itemComponent: Rectangle {
35+ color: "red"
36+ Component.onCompleted: carousel.createdDelegates++
37+ Component.onDestruction: carousel.destroyedDelegates++
38+ }
12739 }
128−
129− // test for the getItemScale() function
130− function test_getItemScale_data() {
131− return [ // tests for distance
132− {distance: 0, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 1},
133− {distance: 9, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.01},
134− {distance: 999, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.01},
135− {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.98}, // = 1 - (1 / 50)
136− {distance: 3, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.688230855}, // = 1 - (3^2.5 / 50)
137− // tests for continuousIndex
138− {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.98}, // = 1 - (1 / 50)
139− {distance: 1, continuousIndex: 97, numberOfItems: 100, scaleFactor: 1, result: 0.99}, // = 1 - (1 / 100) - distanceToBounds is used
140− // tests for numberOfItems
141− {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.98}, // = 1 - (1 / 50)
142− {distance: 1, continuousIndex: 50, numberOfItems: 53, scaleFactor: 1, result: 0.99}, // = 1 - (1 / 100) - distanceToBounds is used
143− // tests for scaleFactor
144− {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.98}, // = 1 - (1 / 50)
145− {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 2, result: 0.99}, // = 1 - (1 / 100)
146− {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 0.5, result: 0.96}, // = 1 - (1 / 25)
147− {distance: 1, continuousIndex: 50, numberOfItems: 53, scaleFactor: 1, result: 0.99}, // = 1 - (1 / 100) - distanceToBounds is used
148− {distance: 1, continuousIndex: 50, numberOfItems: 53, scaleFactor: 2, result: 0.996666666}, // = 1 - (1 / 300) - distanceToBounds is used
149− ]
150− }
151−
152− function test_getItemScale(data) {
153− var scale = Carousel.getItemScale(data.distance,
154− data.continuousIndex,
155− data.numberOfItems,
156− data.scaleFactor)
157− compare(scale, data.result)
158− }
159−
160− // test for the getItemTranslation() function
161− function test_getItemTranslation_data() {
162− return [ // tests for index and selectedIndex
163− {index: 1, selectedIndex: 1, distance: 1, scale: 1, maxScale: 1, maxTranslation: 10, result: 0},
164− // tests if distance only affects the sign
165− {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 10, result: 10},
166− {index: 1, selectedIndex: 2, distance: 99, scale: 0, maxScale: 1, maxTranslation: 10, result: 10},
167− {index: 1, selectedIndex: 2, distance: -1, scale: 0, maxScale: 1, maxTranslation: 10, result: -10},
168− {index: 1, selectedIndex: 2, distance: -99, scale: 0, maxScale: 1, maxTranslation: 10, result: -10},
169− // tests for the scale
170− {index: 1, selectedIndex: 2, distance: 1, scale: 1, maxScale: 1, maxTranslation: 10, result: 0},
171− {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 10, result: 10},
172− {index: 1, selectedIndex: 2, distance: 1, scale: 0.5, maxScale: 1, maxTranslation: 10, result: 5},
173− // tests for maxScale
174− {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 0.98, maxTranslation: 10, result: 9.8},
175− {index: 1, selectedIndex: 2, distance: 1, scale: 0.5, maxScale: 0.95, maxTranslation: 10, result: 4.5},
176− {index: 1, selectedIndex: 2, distance: 1, scale: 0.8, maxScale: 0.93, maxTranslation: 10, result: 1.3},
177− // test for maxTranslation
178− {index: 1, selectedIndex: 2, distance: 1, scale: 1, maxScale: 1, maxTranslation: 1, result: 0},
179− {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 1, result: 1},
180− {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 10, result: 10},
181− {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 0, result: 0},
182− ]
183− }
184−
185− function test_getItemTranslation(data) {
186− var scale = Carousel.getItemTranslation(data.index,
187− data.selectedIndex,
188− data.distance,
189− data.scale,
190− data.maxScale,
191− data.maxTranslation)
192− compare(scale, data.result)
40+ TestCase {
41+ id: root
42+ name: "Carousel"
43+ when: windowShown
44+
45+ property real carouselWidth
46+ property int itemCount
47+ property real tileWidth
48+
49+ property real contentWidth: itemCount * tileWidth
50+ // following variables are copied from Carousel.qml
51+ // I'm not using the variables directly from there, as then tileWidth and others would be affected as well
52+ property real gapToMiddlePhase: Math.min(carouselWidth / 2 - tileWidth / 2, (contentWidth - carouselWidth) / 2)
53+ property real gapToEndPhase: contentWidth - carouselWidth - gapToMiddlePhase
54+ property real kMiddleIndex: (carouselWidth / 2) / tileWidth - 0.5
55+ property real kGapEnd: kMiddleIndex * (1 - gapToEndPhase / gapToMiddlePhase)
56+ property real kXBeginningEnd: 1 / tileWidth + kMiddleIndex / gapToMiddlePhase
57+
58+ function test_onlyNeededItemsCreated() {
59+ compare(carousel.createdDelegates, 10);
60+ compare(carousel.destroyedDelegates, 0);
61+ }
62+
63+ // test for the getContinuousIndex() function
64+ function test_getContinuousIndex_data() {
65+ // testing for 10 items of size 100 pixel
66+ return [ {tag:"at start",
67+ x: 0, carouselWidth:400, tileWidth:100, itemCount:10, result: 0},
68+ {tag:"in startup",
69+ x: 100, carouselWidth:400, tileWidth:100, itemCount:10, result: 2},
70+ {tag:"in the middle",
71+ x: 350, carouselWidth:400, tileWidth:100, itemCount:10, result: 5},
72+ {tag:"at end",
73+ x: 600, carouselWidth:400, tileWidth:100, itemCount:10, result: 9},
74+ ]
75+ }
76+
77+ function test_getContinuousIndex(data) {
78+ root.carouselWidth = data.carouselWidth
79+ root.tileWidth = data.tileWidth
80+ root.itemCount = data.itemCount
81+
82+ var index = Carousel.getContinuousIndex(data.x,
83+ data.tileWidth,
84+ gapToMiddlePhase,
85+ gapToEndPhase,
86+ kGapEnd,
87+ kMiddleIndex,
88+ kXBeginningEnd)
89+ compare(index, data.result)
90+ }
91+
92+ // test for the getXFromContinuousIndex() function
93+ function test_getXFromContinuousIndex_data() {
94+ return [ {tag:"at start",
95+ index: 0, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:0, result: 0},
96+ {tag:"in startup",
97+ index: 2, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:0, result: 100},
98+ {tag:"in startup with drawBuffer",
99+ index: 2, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:100, result: 0},
100+ {tag:"in the middle",
101+ index: 5, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:0, result: 350},
102+ {tag:"in the middle with drawBuffer",
103+ index: 5, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:100, result: 250},
104+ {tag:"at end",
105+ index: 9, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:0, result: 600},
106+ {tag:"at end with drawBuffer",
107+ index: 9, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:100, result: 500},
108+ ]
109+ }
110+
111+ function test_getXFromContinuousIndex(data) {
112+ root.carouselWidth = data.carouselWidth
113+ root.tileWidth = data.tileWidth
114+ root.itemCount = data.itemCount
115+
116+ var x = Carousel.getXFromContinuousIndex(data.index,
117+ data.carouselWidth,
118+ contentWidth,
119+ data.tileWidth,
120+ gapToMiddlePhase,
121+ gapToEndPhase,
122+ data.drawBuffer)
123+ compare(x, data.result)
124+ }
125+
126+ // test for the getViewTranslation() function
127+ function test_getViewTranslation_data() {
128+ return [ {tag:"at start - viewfactor 1",
129+ x: 0, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:1, result: 150},
130+ {tag:"at start - viewfactor 2",
131+ x: 0, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:2, result: 300},
132+ {tag:"in startup",
133+ x: 100, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:1, result: 50},
134+ {tag:"in the middle",
135+ x: 350, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:1, result: 0},
136+ {tag:"at end",
137+ x: 600, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:1, result: -150},
138+ ]
139+ }
140+
141+ function test_getViewTranslation(data) {
142+ root.carouselWidth = data.carouselWidth
143+ root.tileWidth = data.tileWidth
144+ root.itemCount = data.itemCount
145+
146+ var x = Carousel.getViewTranslation(data.x,
147+ data.tileWidth,
148+ root.gapToMiddlePhase,
149+ root.gapToEndPhase,
150+ data.translationXViewFactor)
151+ compare(x, data.result)
152+ }
153+
154+ // test for the getItemScale() function
155+ function test_getItemScale_data() {
156+ return [ // tests for distance
157+ {distance: 0, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 1},
158+ {distance: 9, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.01},
159+ {distance: 999, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.01},
160+ {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.98}, // = 1 - (1 / 50)
161+ {distance: 3, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.688230855}, // = 1 - (3^2.5 / 50)
162+ // tests for continuousIndex
163+ {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.98}, // = 1 - (1 / 50)
164+ {distance: 1, continuousIndex: 97, numberOfItems: 100, scaleFactor: 1, result: 0.99}, // = 1 - (1 / 100) - distanceToBounds is used
165+ // tests for numberOfItems
166+ {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.98}, // = 1 - (1 / 50)
167+ {distance: 1, continuousIndex: 50, numberOfItems: 53, scaleFactor: 1, result: 0.99}, // = 1 - (1 / 100) - distanceToBounds is used
168+ // tests for scaleFactor
169+ {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.98}, // = 1 - (1 / 50)
170+ {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 2, result: 0.99}, // = 1 - (1 / 100)
171+ {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 0.5, result: 0.96}, // = 1 - (1 / 25)
172+ {distance: 1, continuousIndex: 50, numberOfItems: 53, scaleFactor: 1, result: 0.99}, // = 1 - (1 / 100) - distanceToBounds is used
173+ {distance: 1, continuousIndex: 50, numberOfItems: 53, scaleFactor: 2, result: 0.996666666}, // = 1 - (1 / 300) - distanceToBounds is used
174+ ]
175+ }
176+
177+ function test_getItemScale(data) {
178+ var scale = Carousel.getItemScale(data.distance,
179+ data.continuousIndex,
180+ data.numberOfItems,
181+ data.scaleFactor)
182+ compare(scale, data.result)
183+ }
184+
185+ // test for the getItemTranslation() function
186+ function test_getItemTranslation_data() {
187+ return [ // tests for index and selectedIndex
188+ {index: 1, selectedIndex: 1, distance: 1, scale: 1, maxScale: 1, maxTranslation: 10, result: 0},
189+ // tests if distance only affects the sign
190+ {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 10, result: 10},
191+ {index: 1, selectedIndex: 2, distance: 99, scale: 0, maxScale: 1, maxTranslation: 10, result: 10},
192+ {index: 1, selectedIndex: 2, distance: -1, scale: 0, maxScale: 1, maxTranslation: 10, result: -10},
193+ {index: 1, selectedIndex: 2, distance: -99, scale: 0, maxScale: 1, maxTranslation: 10, result: -10},
194+ // tests for the scale
195+ {index: 1, selectedIndex: 2, distance: 1, scale: 1, maxScale: 1, maxTranslation: 10, result: 0},
196+ {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 10, result: 10},
197+ {index: 1, selectedIndex: 2, distance: 1, scale: 0.5, maxScale: 1, maxTranslation: 10, result: 5},
198+ // tests for maxScale
199+ {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 0.98, maxTranslation: 10, result: 9.8},
200+ {index: 1, selectedIndex: 2, distance: 1, scale: 0.5, maxScale: 0.95, maxTranslation: 10, result: 4.5},
201+ {index: 1, selectedIndex: 2, distance: 1, scale: 0.8, maxScale: 0.93, maxTranslation: 10, result: 1.3},
202+ // test for maxTranslation
203+ {index: 1, selectedIndex: 2, distance: 1, scale: 1, maxScale: 1, maxTranslation: 1, result: 0},
204+ {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 1, result: 1},
205+ {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 10, result: 10},
206+ {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 0, result: 0},
207+ ]
208+ }
209+
210+ function test_getItemTranslation(data) {
211+ var scale = Carousel.getItemTranslation(data.index,
212+ data.selectedIndex,
213+ data.distance,
214+ data.scale,
215+ data.maxScale,
216+ data.maxTranslation)
217+ compare(scale, data.result)
218+ }
193219 }
194220}
tests/qmltests/Components/tst_DragHandle.cpp−1
@@ -126,7 +126,6 @@ QQuickView *tst_DragHandle::createView()
126126{
127127 QQuickView *window = new QQuickView(0);
128128 window->setResizeMode(QQuickView::SizeRootObjectToView);
129− window->resize(600, 600);
130129 window->engine()->addImportPath(QLatin1String(UBUNTU_GESTURES_PLUGIN_DIR));
131130 window->engine()->addImportPath(QLatin1String(TEST_DIR));
132131
tests/qmltests/Components/tst_LazyImage.qml+8−1
@@ -152,10 +152,11 @@ Rectangle {
152152
153153 function test_lazyimage(data) {
154154 data.func();
155+ waitForRendering(baseRect);
155156
156157 if (data.transition) {
157158 // wait for the transition to complete
158− var transition = findInvisibleChild(data.image, data.transition);
159+ var transition = findChildIn(data.image, "transitions", data.transition);
159160 tryCompare(transition, "running", true);
160161 tryCompare(transition, "running", false);
161162 }
@@ -168,6 +169,12 @@ Rectangle {
168169 compare(data.image.initialHeight, data.initialHeight);
169170 compare(data.image.initialWidth, data.initialWidth);
170171
172+ // check the sourceSize
173+ var sourceHeight = (data.image.scaleTo === "height" || (data.image.scaleTo === "fit" && data.height <= data.width)) ? data.height : 0
174+ var sourceWidth = (data.image.scaleTo === "width" || (data.image.scaleTo === "fit" && data.width <= data.height)) ? data.width : 0
175+ compare(data.image.sourceSize.height, sourceHeight);
176+ compare(data.image.sourceSize.width, sourceWidth);
177+
171178 // check the shape dimensions
172179 var shape = findChild(data.image, "shape");
173180 compare(shape.width, data.imageWidth);
tests/qmltests/Components/tst_OpenEffect.qmldeleted−71
@@ -1,71 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import QtTest 1.0
19−import "../../../qml/Components"
20−
21−TestCase {
22− name: "OpenEffectTest"
23−
24− function test_openeffect_enabled() {
25− compare(openEffect1.enabled, true, "OpenEffect should be enabled if gap is greather than 0.0")
26− }
27−
28− function test_openeffect_shadereffectsource() {
29− compare(openEffect1.source.hideSource, true, "OpenEffect ShaderEffectSource is incorrect")
30− compare(openEffect1.source.sourceItem, rectangle2, "OpenEffect ShaderEffectSource is incorrect")
31− compare(openEffect1.source.live, false, "OpenEffect ShaderEffectSource is incorrect")
32− compare(openEffect1.source.sourceRect.x, 0, "OpenEffect ShaderEffectSource is incorrect")
33− compare(openEffect1.source.sourceRect.y, 0, "OpenEffect ShaderEffectSource is incorrect")
34− compare(openEffect1.source.sourceRect.width, 50, "OpenEffect ShaderEffectSource is incorrect")
35− compare(openEffect1.source.sourceRect.height, 71, "OpenEffect ShaderEffectSource is incorrect")
36− openEffect1.gap=2.0
37− compare(openEffect1.source.sourceRect.x, 0, "OpenEffect ShaderEffectSource is incorrect")
38− compare(openEffect1.source.sourceRect.y, 0, "OpenEffect ShaderEffectSource is incorrect")
39− compare(openEffect1.source.sourceRect.width, 50, "OpenEffect ShaderEffectSource is incorrect")
40− compare(openEffect1.source.sourceRect.height, 72, "OpenEffect ShaderEffectSource is incorrect")
41− }
42−
43− Rectangle {
44− id: rectangle1
45−
46− width: 100; height: 100
47−
48− Rectangle {
49− id: rectangle2
50− width: 50; height: 50
51− }
52−
53− OpenEffect {
54− id: openEffect1
55− anchors {
56− fill: parent
57− }
58−
59− property real gap: 1.0
60−
61− topGapPx: (1 - gap) * positionPx
62− topOpacity: (1 - gap * 1.2)
63− bottomGapPx: positionPx + gap * 10
64− bottomOverflow: 20 + gap
65− bottomOpacity: 1 - (gap * 0.8)
66−
67− positionPx: gap
68− sourceItem: rectangle2
69− }
70− }
71−}
tests/qmltests/Components/tst_PageHeaderLabel.qml+1−1
@@ -19,7 +19,7 @@ import QtTest 1.0
1919import ".."
2020import "../../../qml/Components"
2121import Ubuntu.Components 0.1
22−import Unity 0.1
22+import Unity 0.2
2323import Unity.Test 0.1 as UT
2424
2525Item {
tests/qmltests/Components/tst_RatingStars.qmldeleted−62

This diff is too big to show here.

tests/qmltests/Components/tst_ResponsiveFlowView.qml+1−2

This diff is too big to show here.

tests/qmltests/Components/tst_Stage.qmldeleted−278

This diff is too big to show here.

tests/qmltests/Components/tst_Stage/AppControl.qmldeleted−42

This diff is too big to show here.

tests/qmltests/Components/tst_Stage/FakeApplicationScreenshot.qmldeleted−53

This diff is too big to show here.

tests/qmltests/Components/tst_Tile.qmldeleted−71

This diff is too big to show here.

tests/qmltests/Dash/Apps/tst_AppPreview.qmldeleted−276

This diff is too big to show here.

tests/qmltests/Dash/Apps/tst_RunningApplicationsGrid.qml+50−117

This diff is too big to show here.

tests/qmltests/Dash/Movie/tst_MoviePreview.qmldeleted−86

This diff is too big to show here.

tests/qmltests/Dash/Music/tst_MusicPreview.qmldeleted−174

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_Preview.qml+4−18

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewRatingInput.qml+1−1

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewVideoPlayback.qml−6

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qml+3−4

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/qmltests/Dash/tst_Card.qml+49

This diff is too big to show here.

tests/qmltests/Dash/tst_CardHeader.qml+1−28

This diff is too big to show here.

tests/qmltests/Dash/tst_CardTool.qml+21−1

This diff is too big to show here.

tests/qmltests/Dash/tst_Dash.qml+14−6

This diff is too big to show here.

tests/qmltests/Dash/tst_DashContent.qml+117−35

This diff is too big to show here.

tests/qmltests/Dash/tst_DashPreview.qmldeleted−202

This diff is too big to show here.

tests/qmltests/Dash/tst_FilterGrids.qmldeleted−143

This diff is too big to show here.

tests/qmltests/Dash/tst_GenericPreview.qmldeleted−125

This diff is too big to show here.

tests/qmltests/Dash/tst_GenericScopeView.qml+36−246

This diff is too big to show here.

tests/qmltests/Launcher/tst_Launcher.qml+6−4

This diff is too big to show here.

tests/qmltests/Notifications/tst_Notifications.qml+27−13

This diff is too big to show here.

tests/qmltests/Notifications/tst_VisualSnapDecisionsQueue.qmlnew file+238

This diff is too big to show here.

tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+47−6

This diff is too big to show here.

tests/qmltests/SideStage/tst_SideStage.qmldeleted−52

This diff is too big to show here.

tests/qmltests/Stages/tst_PhoneStage.qmlnew file+288

This diff is too big to show here.

tests/qmltests/tst_Shell.qml+40−35

This diff is too big to show here.

tests/uqmlscene/main.cpp+13

This diff is too big to show here.

tests/utils/modules/Unity/Test/UnityTestCase.qml+10−16

This diff is too big to show here.

tools/registry-tracker.cpp+19−4

This diff is too big to show here.

tools/registry-tracker.h+7−2

This diff is too big to show here.

tools/scopetool.cpp+28−8

This diff is too big to show here.