on xenial help sign in
Merge trunk.
commit86a23ffb2d87b4ffc1dfd98f82b475b3da807366 authorMichał Sawicz <michal.sawicz@canonical.com> dateWed 15 Jan 2014, 10:38 (13 years ago) parent9aec39e7acc541
531 files changed+9912−6795
.bzrignore+1−4 Applications/Application.qml−54 Applications/applications.js−115 CMakeLists.txt+13−73 CODING+70−2 Dash/DashContent.qml−150 Notifications/Notification.qml−295 cmake/modules/autopilot.cmake+5−1 data/CMakeLists.txt+8 data/unity-scope-tool.desktop.in+8 data/unity8.conf+1 unity8.desktop.in → data/unity8.desktop.in data/unity8.override+1 debian/changelog+270−2 debian/control+13−4 debian/unity-scope-tool.install+3 debian/unity8-autopilot.install+1 debian/unity8-private.install+1−1 debian/unity8.install−1 include/CMakeLists.txt+1 paths.h.in → include/paths.h.in+42−3 plugins/CMakeLists.txt+1−1 plugins/ListViewWithPageHeader/CMakeLists.txt → plugins/DashViews/CMakeLists.txt+8−5 plugins/DashViews/abstractjournal.cpp+388 plugins/DashViews/abstractjournal.h+145 plugins/DashViews/horizontaljournal.cpp+253 plugins/DashViews/horizontaljournal.h+67 plugins/ListViewWithPageHeader/listviewwithpageheader.cpp → plugins/DashViews/listviewwithpageheader.cpp plugins/ListViewWithPageHeader/listviewwithpageheader.h → plugins/DashViews/listviewwithpageheader.h plugins/ListViewWithPageHeader/plugin.cpp → plugins/DashViews/plugin.cpp+6−2 plugins/ListViewWithPageHeader/plugin.h → plugins/DashViews/plugin.h+3−3 plugins/DashViews/qmldir+3 plugins/DashViews/verticaljournal.cpp+280 plugins/DashViews/verticaljournal.h+104 plugins/HudClient/hudclient.cpp+1−16 plugins/LightDM/CMakeLists.txt+3−1 plugins/LightDM/DBusGreeterList.cpp+77 plugins/LightDM/DBusGreeterList.h+61 plugins/LightDM/Greeter.cpp+1 plugins/LightDM/Greeter.h+6−1 plugins/LightDM/UsersModel.h+1−1 plugins/LightDM/plugin.cpp+14−2 plugins/ListViewWithPageHeader/qmldir−3 plugins/Ubuntu/Gestures/CMakeLists.txt+1 plugins/Ubuntu/Gestures/PressedOutsideNotifier.cpp+119 plugins/Ubuntu/Gestures/PressedOutsideNotifier.h+62 plugins/Ubuntu/Gestures/plugin.cpp+2 plugins/Unity/Indicators/CMakeLists.txt−1 plugins/Unity/Indicators/Messaging/qml/MessageMenuItemFactory.qml+93−60 plugins/Unity/Indicators/Messaging/qml/SimpleTextMessage.qml+2−1 plugins/Unity/Indicators/Messaging/qml/SnapDecision.qml+2−2 plugins/Unity/Indicators/Network/qml/AccessPoint.qml+2−2 plugins/Unity/Indicators/indicatorsmanager.cpp+1−1 plugins/Unity/Indicators/indicatorsmodel.cpp+4−3 plugins/Unity/Indicators/plugin.cpp−2 plugins/Unity/Indicators/qml/ButtonMenuItem.qml+1−1 plugins/Unity/Indicators/qml/IndicatorWidget.qml−28 plugins/Unity/Indicators/qml/MenuItemFactory.qml+157−89 plugins/Unity/Indicators/qml/qmldir−2 plugins/Unity/Launcher/backend/launcherbackend.cpp+6−6 plugins/Utils/CMakeLists.txt+1 plugins/Utils/plugin.cpp+3 plugins/Utils/qsortfilterproxymodelqml.cpp+12 plugins/Utils/qsortfilterproxymodelqml.h+1 plugins/Unity/Indicators/timeformatter.cpp → plugins/Utils/timeformatter.cpp+30−1 plugins/Unity/Indicators/timeformatter.h → plugins/Utils/timeformatter.h+15−3 po/ar.po+15−93 po/ast.po+16−94 po/az.po+12−90 po/bg.po+12−90 po/ca.po+17−95 po/cs.po+19−95 po/de.po+12−90 po/el.po+12−90 po/en_AU.po+12−90 po/en_GB.po+12−90 po/eo.po+12−90 po/es.po+13−91 po/fa.po+12−90 po/fi.po+12−90 po/fo.po+12−90 po/fr.po+12−90 po/gd.po+12−90 po/gl.po+16−94 po/he.po+12−90 po/hr.po+12−90 po/hu.po+41−115 po/hy.po+12−90 po/id.po+12−90 po/is.po+12−90 po/it.po+12−90 po/ja.po+12−90 po/km.po+12−90 po/kn.po+12−90 po/ko.po+12−90 po/ky.po+12−90 po/lo.po+12−90 po/lv.po+16−94 po/ml.po+12−90 po/my.po+20−98 po/nb.po+12−90 po/nl.po+12−90 po/pl.po+17−95 po/pt_BR.po+12−90 po/ro.po+12−91 po/ru.po+19−96 po/shn.po+12−90 po/si.po+12−90 po/sl.po+16−94 po/sr.po+12−90 po/sv.po+12−90 po/ta.po+12−90 po/te.po+12−90 po/tr.po+17−95 po/ug.po+12−90 po/uk.po+12−90 po/unity8.pot+10−88 po/xh.po+12−90 po/zh_CN.po+12−90 po/zh_TW.po+12−90 Bottombar/Bottombar.qml → qml/Bottombar/Bottombar.qml Bottombar/HudButton.qml → qml/Bottombar/HudButton.qml Bottombar/graphics/hud@20.png → qml/Bottombar/graphics/hud@20.png Bottombar/graphics/hud_invoke_button_active@20.png → qml/Bottombar/graphics/hud_invoke_button_active@20.png qml/CMakeLists.txt+22 Components/AnimationControllerWithSignals.qml → qml/Components/AnimationControllerWithSignals.qml Components/ApplicationManagerWrapper.qml → qml/Components/ApplicationManagerWrapper.qml Components/ApplicationScreenshot.qml → qml/Components/ApplicationScreenshot.qml Components/ApplicationsModelStageFiltered.qml → qml/Components/ApplicationsModelStageFiltered.qml Components/BaseCarouselDelegate.qml → qml/Components/BaseCarouselDelegate.qml Components/Carousel.qml → qml/Components/Carousel.qml+2−3 Components/Circle.qml → qml/Components/Circle.qml Components/DragHandle.qml → qml/Components/DragHandle.qml Components/DraggingArea.qml → qml/Components/DraggingArea.qml Components/EdgeDemo.qml → qml/Components/EdgeDemo.qml+1 Components/EdgeDemoOverlay.qml → qml/Components/EdgeDemoOverlay.qml Components/EdgeDragArea.qml → qml/Components/EdgeDragArea.qml Components/EdgeDragEvaluator.qml → qml/Components/EdgeDragEvaluator.qml Components/FilterGrid.qml → qml/Components/FilterGrid.qml+2−1 Components/LazyImage.qml → qml/Components/LazyImage.qml Components/ListItems/Base.qml → qml/Components/ListItems/Base.qml Components/ListItems/Header.qml → qml/Components/ListItems/Header.qml Components/ListItems/Highlight.qml → qml/Components/ListItems/Highlight.qml Components/ListItems/ThinDivider.qml → qml/Components/ListItems/ThinDivider.qml Components/ListItems/VerticalThinDivider.qml → qml/Components/ListItems/VerticalThinDivider.qml Components/ListItems/graphics/ListItemDividerHorizontal@18.png → qml/Components/ListItems/graphics/ListItemDividerHorizontal@18.png Components/ListItems/graphics/ListItemDividerVertical@18.png → qml/Components/ListItems/graphics/ListItemDividerVertical@18.png Components/OpenEffect.qml → qml/Components/OpenEffect.qml Components/PageHeader.qml → qml/Components/PageHeader.qml+14−39 qml/Components/PageHeaderLabel.qml+41 Components/PinPadButton.qml → qml/Components/PinPadButton.qml Components/RatingStars.qml → qml/Components/RatingStars.qml Components/ResponsiveFlowView.qml → qml/Components/ResponsiveFlowView.qml Components/ResponsiveGridView.qml → qml/Components/ResponsiveGridView.qml Components/Revealer.qml → qml/Components/Revealer.qml Components/SearchHistoryModel.qml → qml/Components/SearchHistoryModel.qml Components/Showable.qml → qml/Components/Showable.qml Components/Stage.qml → qml/Components/Stage.qml Components/StandardAnimation.qml → qml/Components/StandardAnimation.qml Components/Tile.qml → qml/Components/Tile.qml Components/TileStyle.qml → qml/Components/TileStyle.qml Components/UbuntuShapeForItem.qml → qml/Components/UbuntuShapeForItem.qml Components/VolumeControl.qml → qml/Components/VolumeControl.qml Components/WrongPasswordAnimation.qml → qml/Components/WrongPasswordAnimation.qml Components/carousel.js → qml/Components/carousel.js Components/graphics/PageHeaderBaseDivider@18.png → qml/Components/graphics/PageHeaderBaseDivider@18.png Components/graphics/PageHeaderBaseDivider@18.sci → qml/Components/graphics/PageHeaderBaseDivider@18.sci Components/graphics/close@20.png → qml/Components/graphics/close@20.png Components/graphics/icon_star_off@20.png → qml/Components/graphics/icon_star_off@20.png Components/graphics/icon_star_on@20.png → qml/Components/graphics/icon_star_on@20.png Components/graphics/non-selected@18.png → qml/Components/graphics/non-selected@18.png Components/graphics/non-selected@18.sci → qml/Components/graphics/non-selected@18.sci Dash/Apps/AppPreview.qml → qml/Dash/Apps/AppPreview.qml Dash/Apps/CloseIcon.qml → qml/Dash/Apps/CloseIcon.qml Dash/Apps/DashPluginFilterGrid.qml → qml/Dash/Apps/DashPluginFilterGrid.qml Dash/Apps/FrequentlyUsedAppsModel.qml → qml/Dash/Apps/FrequentlyUsedAppsModel.qml Dash/Apps/RunningApplicationTile.qml → qml/Dash/Apps/RunningApplicationTile.qml Dash/Apps/RunningApplicationsGrid.qml → qml/Dash/Apps/RunningApplicationsGrid.qml+17 Dash/Apps/graphics/close_btn@9.png → qml/Dash/Apps/graphics/close_btn@9.png qml/Dash/Card.qml+83 qml/Dash/CardHeader.qml+112 Dash/Dash.qml → qml/Dash/Dash.qml−18 Dash/DashApps.qml → qml/Dash/DashApps.qml−4 Dash/DashBar.qml → qml/Dash/DashBar.qml qml/Dash/DashCarousel.qml+47 qml/Dash/DashContent.qml+217 qml/Dash/DashContentOpenEffect.qml+57 qml/Dash/DashContentTabBarStyle.qml+21 qml/Dash/DashFilterGrid.qml+65 Dash/DashHome.qml → qml/Dash/DashHome.qml Dash/DashPreview.qml → qml/Dash/DashPreview.qml+1 Dash/DashPreviewPlaceholder.qml → qml/Dash/DashPreviewPlaceholder.qml qml/Dash/DashRenderer.qml+65 Dash/Generic/FlatTileStyle.qml → qml/Dash/Generic/FlatTileStyle.qml Dash/Generic/GenericCarousel.qml → qml/Dash/Generic/GenericCarousel.qml+3−7 Dash/Generic/GenericCarouselLoader.qml → qml/Dash/Generic/GenericCarouselLoader.qml Dash/Generic/GenericFilterGrid.qml → qml/Dash/Generic/GenericFilterGrid.qml+13−19 Dash/Generic/GenericFilterGridPotrait.qml → qml/Dash/Generic/GenericFilterGridPotrait.qml+1−3 Dash/Generic/GenericPreview.qml → qml/Dash/Generic/GenericPreview.qml Dash/Generic/WeatherFilterGrid.qml → qml/Dash/Generic/WeatherFilterGrid.qml Dash/GenericScopeView.qml → qml/Dash/GenericScopeView.qml+45−234 Dash/Movie/MoviePreview.qml → qml/Dash/Movie/MoviePreview.qml Dash/Music/CarouselDelegateMusic.qml → qml/Dash/Music/CarouselDelegateMusic.qml Dash/Music/MusicCarousel.qml → qml/Dash/Music/MusicCarousel.qml+2−2 Dash/Music/MusicCarouselLoader.qml → qml/Dash/Music/MusicCarouselLoader.qml Dash/Music/MusicFilterGrid.qml → qml/Dash/Music/MusicFilterGrid.qml+7−13 qml/Dash/Music/MusicPreview.qml+203 Dash/Music/MusicTileStyle.qml → qml/Dash/Music/MusicTileStyle.qml qml/Dash/Music/graphics/music_progress_bg.png Dash/PreviewDelegateMapper.qml → qml/Dash/PreviewDelegateMapper.qml+1 qml/Dash/PreviewListView.qml+212 Dash/Previews/Header.qml → qml/Dash/Previews/Header.qml Dash/Previews/Reviews.qml → qml/Dash/Previews/Reviews.qml Dash/ScopeDelegateMapper.qml → qml/Dash/ScopeDelegateMapper.qml Dash/ScopeListView.qml → qml/Dash/ScopeListView.qml+1−1 Dash/SearchableResultModel.qml → qml/Dash/SearchableResultModel.qml Dash/Video/CarouselDelegateVideo.qml → qml/Dash/Video/CarouselDelegateVideo.qml Dash/Video/VideoCarousel.qml → qml/Dash/Video/VideoCarousel.qml+2−2 Dash/Video/VideoCarouselLoader.qml → qml/Dash/Video/VideoCarouselLoader.qml Dash/Video/VideoFilterGrid.qml → qml/Dash/Video/VideoFilterGrid.qml+8−13 Dash/Video/VideoTileStyle.qml → qml/Dash/Video/VideoTileStyle.qml Dash/Video/graphics/icon_button_amazon@20.png → qml/Dash/Video/graphics/icon_button_amazon@20.png Dash/Video/graphics/icon_button_u1@20.png → qml/Dash/Video/graphics/icon_button_u1@20.png Dash/Video/graphics/movie_icon_holder@27.png → qml/Dash/Video/graphics/movie_icon_holder@27.png Dash/graphics/header_handlearrow2@20.png → qml/Dash/graphics/header_handlearrow2@20.png Dash/graphics/header_handlearrow@20.png → qml/Dash/graphics/header_handlearrow@20.png Dash/graphics/icon_clear@20.png → qml/Dash/graphics/icon_clear@20.png Dash/graphics/icon_listview_clear@20.png → qml/Dash/graphics/icon_listview_clear@20.png Dash/graphics/icon_search_active@20.png → qml/Dash/graphics/icon_search_active@20.png Dash/graphics/icon_search_inactive@20.png → qml/Dash/graphics/icon_search_inactive@20.png Dash/graphics/phone/screenshots/angrybirds@12.png → qml/Dash/graphics/phone/screenshots/angrybirds@12.png Dash/graphics/phone/screenshots/browser@12.png → qml/Dash/graphics/phone/screenshots/browser@12.png Dash/graphics/phone/screenshots/camera@12.png → qml/Dash/graphics/phone/screenshots/camera@12.png Dash/graphics/phone/screenshots/facebook@12.png → qml/Dash/graphics/phone/screenshots/facebook@12.png Dash/graphics/phone/screenshots/gallery@12.png → qml/Dash/graphics/phone/screenshots/gallery@12.png Dash/graphics/phone/screenshots/map@12.png → qml/Dash/graphics/phone/screenshots/map@12.png Dash/graphics/phone/screenshots/music@12.png → qml/Dash/graphics/phone/screenshots/music@12.png Dash/graphics/phone/screenshots/phone@12.png → qml/Dash/graphics/phone/screenshots/phone@12.png Dash/graphics/phone/screenshots/settings@12.png → qml/Dash/graphics/phone/screenshots/settings@12.png Dash/graphics/phone/screenshots/twitter@12.png → qml/Dash/graphics/phone/screenshots/twitter@12.png Dash/graphics/play_button@18.png → qml/Dash/graphics/play_button@18.png Dash/graphics/play_button_active@18.png → qml/Dash/graphics/play_button_active@18.png Dash/graphics/play_button_active_big@20.png → qml/Dash/graphics/play_button_active_big@20.png Dash/graphics/play_button_big@20.png → qml/Dash/graphics/play_button_big@20.png qml/Dash/graphics/tabbarchevron@27.png Dash/graphics/tablet/icon_close_preview@20.png → qml/Dash/graphics/tablet/icon_close_preview@20.png Dash/graphics/tooltip_arrow@27.png → qml/Dash/graphics/tooltip_arrow@27.png Greeter/Clock.qml → qml/Greeter/Clock.qml Greeter/Dot.qml → qml/Greeter/Dot.qml Greeter/Gradient.js → qml/Greeter/Gradient.js Greeter/Greeter.qml → qml/Greeter/Greeter.qml+1−1 Greeter/GreeterContent.qml → qml/Greeter/GreeterContent.qml Greeter/Infographics.qml → qml/Greeter/Infographics.qml Greeter/Lockscreen.qml → qml/Greeter/Lockscreen.qml+2−2 Greeter/LoginList.qml → qml/Greeter/LoginList.qml+11 Greeter/ObjectPositioner.qml → qml/Greeter/ObjectPositioner.qml Greeter/PassphraseLockscreen.qml → qml/Greeter/PassphraseLockscreen.qml Greeter/PinLockscreen.qml → qml/Greeter/PinLockscreen.qml Greeter/graphics/dot_empty.png → qml/Greeter/graphics/dot_empty.png Greeter/graphics/dot_filled.png → qml/Greeter/graphics/dot_filled.png Greeter/graphics/dot_pointer.png → qml/Greeter/graphics/dot_pointer.png Greeter/graphics/icon_arrow.png → qml/Greeter/graphics/icon_arrow.png Greeter/graphics/infographic_circle_back.png → qml/Greeter/graphics/infographic_circle_back.png Hud/Hud.qml → qml/Hud/Hud.qml Hud/HudParametrizedActionsPage.qml → qml/Hud/HudParametrizedActionsPage.qml+1−1 Hud/Result.qml → qml/Hud/Result.qml Hud/ResultList.qml → qml/Hud/ResultList.qml Hud/SearchBar.qml → qml/Hud/SearchBar.qml Hud/ShowingAnimation.qml → qml/Hud/ShowingAnimation.qml Hud/SliderLabel.qml → qml/Hud/SliderLabel.qml+4−2 Hud/SoundAmplitudeDelegate.qml → qml/Hud/SoundAmplitudeDelegate.qml Hud/SoundAmplitudeVisual.qml → qml/Hud/SoundAmplitudeVisual.qml Hud/ToolBar.qml → qml/Hud/ToolBar.qml Hud/ToolBarIcon.qml → qml/Hud/ToolBarIcon.qml Hud/graphics/divider@20.png → qml/Hud/graphics/divider@20.png Hud/graphics/divider@20.sci → qml/Hud/graphics/divider@20.sci Hud/graphics/dropshadow_right@20.png → qml/Hud/graphics/dropshadow_right@20.png Hud/graphics/help@20.png → qml/Hud/graphics/help@20.png Hud/graphics/hud_bg@20.png → qml/Hud/graphics/hud_bg@20.png Hud/graphics/hud_handlearrow@20.png → qml/Hud/graphics/hud_handlearrow@20.png Hud/graphics/hud_handlebar@20.png → qml/Hud/graphics/hud_handlebar@20.png Hud/graphics/icon_arrow@20.png → qml/Hud/graphics/icon_arrow@20.png Hud/graphics/icon_clear@20.png → qml/Hud/graphics/icon_clear@20.png Hud/graphics/icon_search@20.png → qml/Hud/graphics/icon_search@20.png Hud/graphics/microphone@20.png → qml/Hud/graphics/microphone@20.png Hud/graphics/popup_triangle@20.png → qml/Hud/graphics/popup_triangle@20.png Hud/graphics/settings@20.png → qml/Hud/graphics/settings@20.png Hud/graphics/undo@20.png → qml/Hud/graphics/undo@20.png Hud/graphics/view-fullscreen@20.png → qml/Hud/graphics/view-fullscreen@20.png Launcher/FoldingLauncherDelegate.qml → qml/Launcher/FoldingLauncherDelegate.qml Launcher/Launcher.qml → qml/Launcher/Launcher.qml+3−3 Launcher/LauncherDelegate.qml → qml/Launcher/LauncherDelegate.qml Launcher/LauncherPanel.qml → qml/Launcher/LauncherPanel.qml+2−2 Launcher/graphics/focused_app_arrow@30.png → qml/Launcher/graphics/focused_app_arrow@30.png Launcher/graphics/highlight@18.png → qml/Launcher/graphics/highlight@18.png Launcher/graphics/home@18.png → qml/Launcher/graphics/home@18.png Launcher/graphics/launcher_bg@30.png → qml/Launcher/graphics/launcher_bg@30.png Launcher/graphics/launcher_bg@30.sci → qml/Launcher/graphics/launcher_bg@30.sci Launcher/graphics/non-selected@18.png → qml/Launcher/graphics/non-selected@18.png Launcher/graphics/non-selected@18.sci → qml/Launcher/graphics/non-selected@18.sci Launcher/graphics/notification@30.png → qml/Launcher/graphics/notification@30.png Launcher/graphics/notification@30.sci → qml/Launcher/graphics/notification@30.sci Launcher/graphics/progressbar-fill@30.png → qml/Launcher/graphics/progressbar-fill@30.png Launcher/graphics/progressbar-fill@30.sci → qml/Launcher/graphics/progressbar-fill@30.sci Launcher/graphics/progressbar-trough@30.png → qml/Launcher/graphics/progressbar-trough@30.png Launcher/graphics/progressbar-trough@30.sci → qml/Launcher/graphics/progressbar-trough@30.sci Launcher/graphics/quicklist_tooltip@30.png → qml/Launcher/graphics/quicklist_tooltip@30.png Launcher/graphics/selected@18.png → qml/Launcher/graphics/selected@18.png Launcher/graphics/selected@18.sci → qml/Launcher/graphics/selected@18.sci Launcher/graphics/triangle@18.png → qml/Launcher/graphics/triangle@18.png qml/Notifications/Notification.qml+335 Notifications/NotificationMenuItemFactory.qml → qml/Notifications/NotificationMenuItemFactory.qml+8−2 Notifications/Notifications.qml → qml/Notifications/Notifications.qml+4−1 Notifications/ShapedIcon.qml → qml/Notifications/ShapedIcon.qml Panel/IndicatorItem.qml → qml/Panel/IndicatorItem.qml+6−12 Panel/IndicatorRow.qml → qml/Panel/IndicatorRow.qml+40−8 Panel/Indicators.qml → qml/Panel/Indicators.qml+22−11 plugins/Unity/Indicators/qml/IndicatorPage.qml → qml/Panel/Indicators/DefaultIndicatorPage.qml+43−30 Panel/Indicators/DefaultIndicatorWidget.qml → qml/Panel/Indicators/DefaultIndicatorWidget.qml+5−3 Panel/Indicators/client/IndicatorsClient.qml → qml/Panel/Indicators/client/IndicatorsClient.qml Panel/Indicators/client/IndicatorsList.qml → qml/Panel/Indicators/client/IndicatorsList.qml Panel/Indicators/client/IndicatorsPage.qml → qml/Panel/Indicators/client/IndicatorsPage.qml Panel/Indicators/client/IndicatorsTree.qml → qml/Panel/Indicators/client/IndicatorsTree.qml Panel/MenuContent.qml → qml/Panel/MenuContent.qml+3−1 Panel/Panel.qml → qml/Panel/Panel.qml+23−1 Panel/PanelBackground.qml → qml/Panel/PanelBackground.qml Panel/PanelSeparatorLine.qml → qml/Panel/PanelSeparatorLine.qml Panel/SearchIndicator.qml → qml/Panel/SearchIndicator.qml Panel/graphics/Battery@18.png → qml/Panel/graphics/Battery@18.png Panel/graphics/Bluetooth@18.png → qml/Panel/graphics/Bluetooth@18.png Panel/graphics/Clock@18.png → qml/Panel/graphics/Clock@18.png Panel/graphics/Location@18.png → qml/Panel/graphics/Location@18.png Panel/graphics/Messages@18.png → qml/Panel/graphics/Messages@18.png Panel/graphics/Network@18.png → qml/Panel/graphics/Network@18.png Panel/graphics/Sound@18.png → qml/Panel/graphics/Sound@18.png Panel/graphics/Sync@18.png → qml/Panel/graphics/Sync@18.png Panel/graphics/System@18.png → qml/Panel/graphics/System@18.png Panel/graphics/Time@18.png → qml/Panel/graphics/Time@18.png Panel/graphics/VerticalDivider@18.png → qml/Panel/graphics/VerticalDivider@18.png Panel/graphics/handle@12.png → qml/Panel/graphics/handle@12.png Panel/graphics/handle@12.sci → qml/Panel/graphics/handle@12.sci Panel/graphics/rectangular_dropshadow@30.png → qml/Panel/graphics/rectangular_dropshadow@30.png Panel/graphics/rectangular_dropshadow@30.sci → qml/Panel/graphics/rectangular_dropshadow@30.sci Panel/graphics/search@12.png → qml/Panel/graphics/search@12.png Panel/graphics/time_and_date@18.png → qml/Panel/graphics/time_and_date@18.png qml/ScopeTool.qml+175 Shell.qml → qml/Shell.qml+23−10 SideStage/SideStage.qml → qml/SideStage/SideStage.qml SideStage/SidestageHandle.qml → qml/SideStage/SidestageHandle.qml SideStage/graphics/sidestage_handle@20.png → qml/SideStage/graphics/sidestage_handle@20.png SideStage/graphics/sidestage_handle@20.sci → qml/SideStage/graphics/sidestage_handle@20.sci graphics/12_10_background_wide@12.png → qml/graphics/12_10_background_wide@12.png graphics/applicationIcons/angrybirds@18.png → qml/graphics/applicationIcons/angrybirds@18.png graphics/applicationIcons/browser@18.png → qml/graphics/applicationIcons/browser@18.png graphics/applicationIcons/calendar@18.png → qml/graphics/applicationIcons/calendar@18.png graphics/applicationIcons/camera@18.png → qml/graphics/applicationIcons/camera@18.png graphics/applicationIcons/contacts-app@18.png → qml/graphics/applicationIcons/contacts-app@18.png graphics/applicationIcons/dash@18.png → qml/graphics/applicationIcons/dash@18.png graphics/applicationIcons/evernote@18.png → qml/graphics/applicationIcons/evernote@18.png graphics/applicationIcons/facebook@18.png → qml/graphics/applicationIcons/facebook@18.png graphics/applicationIcons/gallery@18.png → qml/graphics/applicationIcons/gallery@18.png graphics/applicationIcons/gmail@18.png → qml/graphics/applicationIcons/gmail@18.png graphics/applicationIcons/map@18.png → qml/graphics/applicationIcons/map@18.png graphics/applicationIcons/media-player@18.png → qml/graphics/applicationIcons/media-player@18.png graphics/applicationIcons/messages-app@18.png → qml/graphics/applicationIcons/messages-app@18.png graphics/applicationIcons/music@18.png → qml/graphics/applicationIcons/music@18.png graphics/applicationIcons/notepad@18.png → qml/graphics/applicationIcons/notepad@18.png graphics/applicationIcons/phone-app@18.png → qml/graphics/applicationIcons/phone-app@18.png graphics/applicationIcons/pinterest@18.png → qml/graphics/applicationIcons/pinterest@18.png graphics/applicationIcons/ski_safari@18.png → qml/graphics/applicationIcons/ski_safari@18.png graphics/applicationIcons/skype@18.png → qml/graphics/applicationIcons/skype@18.png graphics/applicationIcons/soundcloud@18.png → qml/graphics/applicationIcons/soundcloud@18.png graphics/applicationIcons/system-settings@18.png → qml/graphics/applicationIcons/system-settings@18.png graphics/applicationIcons/twitter@18.png → qml/graphics/applicationIcons/twitter@18.png graphics/applicationIcons/weather@18.png → qml/graphics/applicationIcons/weather@18.png graphics/applicationIcons/wikipedia@18.png → qml/graphics/applicationIcons/wikipedia@18.png graphics/applicationIcons/youtube@18.png → qml/graphics/applicationIcons/youtube@18.png graphics/avatars/amanda@12.png → qml/graphics/avatars/amanda@12.png graphics/avatars/anna_olsson@12.png → qml/graphics/avatars/anna_olsson@12.png graphics/avatars/funky@12.png → qml/graphics/avatars/funky@12.png graphics/clock@18.png → qml/graphics/clock@18.png graphics/phone_background.jpg → qml/graphics/phone_background.jpg graphics/tablet_background.jpg → qml/graphics/tablet_background.jpg run+7−6 run_on_device−1 runtests.sh+1−13 ApplicationArguments.h → src/ApplicationArguments.h src/CMakeLists.txt+38 MouseTouchAdaptor.cpp → src/MouseTouchAdaptor.cpp MouseTouchAdaptor.h → src/MouseTouchAdaptor.h src/Panel/Indicators/client/CMakeLists.txt−4 src/Panel/Indicators/client/indicatorsclient.cpp+3−37 main.cpp → src/main.cpp+9−43 tests/autopilot/.project+17 tests/autopilot/.pydevproject+8 tests/autopilot/unity8/application_lifecycle/tests/test_application_lifecycle.py+7−6 tests/autopilot/unity8/indicators/__init__.py tests/autopilot/unity8/indicators/tests/__init__.py tests/autopilot/unity8/indicators/tests/test_indicators.py+50 tests/autopilot/unity8/process_helpers.py+17−1 tests/autopilot/unity8/shell/emulators/__init__.py+11−4 tests/autopilot/unity8/shell/emulators/create_interactive_notification.py+1−1 tests/autopilot/unity8/shell/emulators/dash.py+102−8 tests/autopilot/unity8/shell/emulators/greeter.py+2−5 tests/autopilot/unity8/shell/emulators/main_window.py+6 tests/autopilot/unity8/shell/tests/__init__.py+1 tests/autopilot/unity8/shell/tests/test_emulators.py+120 tests/autopilot/unity8/shell/tests/test_lock_screen.py+9−8 tests/autopilot/unity8/shell/tests/test_notifications.py+1−1 tests/autopilot/unity8/shell/tests/test_upstart.py+99 tests/mocks/CMakeLists.txt+1 tests/mocks/LightDM/CMakeLists.txt+3−1 tests/mocks/LightDM/demo/CMakeLists.txt−1 tests/mocks/QMenuModel/unitymenumodel.cpp+3 tests/mocks/QtMultimedia/CMakeLists.txt+19 tests/mocks/QtMultimedia/audio.cpp+107 tests/mocks/QtMultimedia/audio.h+78 tests/mocks/QtMultimedia/plugin.cpp+28 tests/mocks/QtMultimedia/plugin.h+34 tests/mocks/QtMultimedia/qmldir+2 tests/mocks/Unity/Application/ApplicationManager.cpp+4−3 tests/mocks/Unity/Application/CMakeLists.txt−1 tests/mocks/Unity/Indicators/CMakeLists.txt+2 tests/mocks/Unity/Indicators/IndicatorBase.qml+2−1 tests/mocks/Unity/Indicators/IndicatorWidget.qml → tests/mocks/Unity/Indicators/MenuItemFactory.qml+15−5 tests/mocks/Unity/Indicators/fakeplugin.cpp+2 tests/mocks/Unity/Indicators/qmldir+1−1 tests/mocks/Unity/Launcher/CMakeLists.txt−1 tests/mocks/Unity/fake_scope.cpp+3−3 tests/mocks/Unity/fake_scopes.cpp+3 tests/mocks/Unity/fake_scopes.h+2−1 tests/mocks/libusermetrics/CMakeLists.txt+4 tests/mocks/libusermetrics/UserMetrics.cpp+1−1 tests/plugins/AccountsService/CMakeLists.txt+6−1 tests/plugins/CMakeLists.txt+2−1 tests/plugins/ListViewWithPageHeader/CMakeLists.txt → tests/plugins/DashViews/CMakeLists.txt+43−5 tests/plugins/DashViews/horizontaljournaltest.cpp+465 tests/plugins/DashViews/horizontaljournaltest.qml+43 tests/plugins/DashViews/horizontaljournaltry.cpp+90 tests/plugins/DashViews/horizontaljournaltry.qml+99 tests/plugins/ListViewWithPageHeader/listviewwithpageheadertest.cpp → tests/plugins/DashViews/listviewwithpageheadertest.cpp+1−1 tests/plugins/ListViewWithPageHeader/test.qml → tests/plugins/DashViews/listviewwithpageheadertest.qml+1−1 tests/plugins/ListViewWithPageHeader/listviewwithpageheadertestsection.cpp → tests/plugins/DashViews/listviewwithpageheadertestsection.cpp+1−1 tests/plugins/ListViewWithPageHeader/test_section.qml → tests/plugins/DashViews/listviewwithpageheadertestsection.qml+1−1 tests/plugins/ListViewWithPageHeader/listviewwithpageheadertestsectionexternalmodel.cpp → tests/plugins/DashViews/listviewwithpageheadertestsectionexternalmodel.cpp+1−1 tests/plugins/ListViewWithPageHeader/test_sectionexternalmodel.qml → tests/plugins/DashViews/listviewwithpageheadertestsectionexternalmodel.qml+1−1 tests/plugins/ListViewWithPageHeader/tst_listviewwithpageheaderqml.qml → tests/plugins/DashViews/tst_listviewwithpageheaderqml.qml+1−1 tests/plugins/DashViews/verticaljournaltest.cpp+470 tests/plugins/DashViews/verticaljournaltest.qml+44 tests/plugins/DashViews/verticaljournaltry.cpp+90 tests/plugins/DashViews/verticaljournaltry.qml+100 tests/plugins/LightDM/CMakeLists.txt+24 tests/plugins/LightDM/dbus.cpp+166 Panel/Indicators/DefaultIndicatorPage.qml → tests/plugins/LightDM/greeter.qml+6−9 tests/plugins/Ubuntu/Gestures/CMakeLists.txt+2 tests/plugins/Ubuntu/Gestures/tst_PressedOutsideNotifier.cpp+150 tests/plugins/Ubuntu/Gestures/tst_PressedOutsideNotifier.qml+62 tests/plugins/Unity/Indicators/CMakeLists.txt−1 tests/plugins/Unity/Indicators/indicatorsmanagertest.cpp+2−1 tests/plugins/Unity/Indicators/indicatorsmodeltest.cpp+2−1 tests/plugins/Unity/Indicators/menucontentactivatortest.cpp−1 tests/plugins/Unity/Indicators/unitymenumodelstacktest.cpp−1 tests/plugins/Utils/CMakeLists.txt+1 tests/plugins/Unity/Indicators/timeformattertest.cpp → tests/plugins/Utils/timeformattertest.cpp+13 tests/qmltests/CMakeLists.txt+11−3 tests/qmltests/Components/CMakeLists.txt+1 tests/qmltests/Components/RevealingRectangle.qml+1−1 tests/qmltests/Components/tst_AnimationControllerWithSignals.qml+1−1 tests/qmltests/Components/tst_Carousel.qml+1−1 tests/qmltests/Components/tst_DragHandle.qml+1−1 tests/qmltests/Components/tst_DragHandle/HorizontalShowable.qml+1−1 tests/qmltests/Components/tst_DragHandle/VerticalShowable.qml+1−1 tests/qmltests/Components/tst_DraggingArea.qml+1−1 tests/qmltests/Components/tst_EdgeDemoOverlay.qml+1−1 tests/qmltests/Components/tst_FilterGrid.qml+1−1 tests/qmltests/Components/tst_LazyImage.qml+1−1 tests/qmltests/Components/tst_LazyImage/ImageControls.qml+1−1 tests/qmltests/Components/tst_OpenEffect.qml+1−1 tests/qmltests/Components/tst_PageHeader.qml → tests/qmltests/Components/tst_PageHeaderLabel.qml+3−3 tests/qmltests/Components/tst_RatingStars.qml+1−1 tests/qmltests/Components/tst_ResponsiveFlowView.qml+1−1 tests/qmltests/Components/tst_ResponsiveGridView.qml+1−1 tests/qmltests/Components/tst_Showable.qml+1−1 tests/qmltests/Components/tst_Stage.qml+1−1 tests/qmltests/Components/tst_Tile.qml+1−1 tests/qmltests/Dash/Apps/tst_AppPreview.qml+1−1 tests/qmltests/Dash/Apps/tst_RunningApplicationsGrid.qml+21−1 tests/qmltests/Dash/CardHelpers.js+75 tests/qmltests/Dash/Movie/tst_MoviePreview.qml+1−1 tests/qmltests/Dash/Music/tst_MusicPreview.qml+174 tests/qmltests/Dash/artwork/avatar@12.png tests/qmltests/Dash/artwork/music-player-design.png tests/qmltests/Dash/qml/FakeScopeView.qml+2−1 tests/qmltests/Dash/tst_Card.qml+337 tests/qmltests/Dash/tst_CardHeader.qml+138 tests/qmltests/Dash/tst_Dash.qml+12−14 tests/qmltests/Dash/tst_DashBar.qml−111 tests/qmltests/Dash/tst_DashContent.qml+100−10 tests/qmltests/Dash/tst_DashPreview.qml+1−1 tests/qmltests/Dash/tst_FilterGrids.qml+3−3 tests/qmltests/Dash/tst_GenericPreview.qml+1−1 tests/qmltests/Dash/tst_GenericScopeView.qml+151−27 tests/qmltests/Greeter/tst_Clock.qml+1−1 tests/qmltests/Greeter/tst_Infographics.qml+1−1 tests/qmltests/Greeter/tst_Lockscreen.qml+1−1 tests/qmltests/Greeter/tst_Phone.qml+4−4 tests/qmltests/Greeter/tst_Tablet.qml+12−1 tests/qmltests/Hud/tst_Hud.qml+1−1 tests/qmltests/Hud/tst_Result.qml+1−1 tests/qmltests/Launcher/tst_Launcher.qml+7−7 tests/qmltests/Notifications/tst_Notifications.qml+7−15 tests/qmltests/Panel/Indicators/tst_DefaultIndicatorPage.qml+179 tests/qmltests/Panel/Indicators/tst_DefaultIndicatorWidget.qml+1−1 tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+369 tests/qmltests/Panel/Indicators/tst_MessageMenuItemFactory.qml+177 tests/qmltests/Panel/tst_IndicatorItem.qml+1−12 tests/qmltests/Panel/tst_IndicatorRow.qml+19−5 tests/qmltests/Panel/tst_Indicators.qml+2−2 tests/qmltests/Panel/tst_MenuContent.qml+1−1 tests/qmltests/Panel/tst_Panel.qml+15−1 tests/qmltests/Panel/tst_SearchIndicator.qml+1−1 tests/qmltests/SideStage/tst_SideStage.qml+1−1 tests/qmltests/tst_Shell.qml+3−3 tests/uqmlscene/CMakeLists.txt+6−1 tests/uqmlscene/main.cpp+1−1 tests/utils/modules/Unity/Test/CMakeLists.txt+4 tools/CMakeLists.txt+11 tools/registry-tracker.cpp+116 tools/registry-tracker.h+44 tools/scopetool.cpp+84 unity8.qmlproject−25
.bzrignore+1−4
@@ -3,8 +3,5 @@
33# QtCreator project files
44/*.user
55# Eclipse project files
6−/.project
7−/.cproject
8−/.settings
9−/.pydevproject
6+.settings
107message.txt
Applications/Application.qmldeleted−54
@@ -1,54 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import "applications.js" as ApplicationsModel
19−import Unity.Application 0.1
20−
21−/* This class is temporary. It is meant to be API compatible with qthybris' Application
22− class.
23− This class can be removed as soon as qthybris' Application is instantiable from QML
24− and its 'desktopFile' property becomes writable.
25− This also requires qthybris to be easily compilable on the desktop.
26−*/
27−QtObject {
28− id: application
29−
30− property string desktopFile
31− property string name
32− property string comment
33− property string icon
34− property string exec
35− property string stage
36− property bool fullscreen
37−
38− onDesktopFileChanged: {
39− var applicationData = ApplicationsModel.__availableApplications[desktopFile];
40− if (applicationData) {
41− application.name = applicationData.name;
42− application.icon = applicationData.icon;
43− application.exec = applicationData.exec;
44− application.stage = applicationData.stage ? applicationData.stage : ApplicationInfo.MainStage;
45− application.fullscreen = applicationData.fullscreen ? applicationData.fullscreen : false;
46− } else {
47− application.name = "";
48− application.icon = "";
49− application.exec = "";
50− application.stage = "";
51− application.fullscreen = false;
52− }
53− }
54−}
Applications/applications.jsdeleted−115
@@ -1,115 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−// mimic qtubuntu's Application.Stage enum
18−var MainStage = 0;
19−var SideStage = 1;
20−
21−var __availableApplications = {
22− '/usr/share/applications/phone-app.desktop': {
23− 'name': i18n.tr("Phone"),
24− 'icon': 'phone-app',
25− 'exec': '/usr/bin/phone-app',
26− 'stage': SideStage
27− },
28− '/usr/share/applications/camera-app.desktop': {
29− 'name': i18n.tr("Camera"),
30− 'icon': 'camera',
31− 'fullscreen': true,
32− 'exec': '/usr/bin/camera-app --fullscreen'
33− },
34− '/usr/share/applications/gallery-app.desktop': {
35− 'name': i18n.tr("Gallery"),
36− 'icon': 'gallery',
37− 'exec': '/usr/bin/gallery-app'
38− },
39− '/usr/share/applications/facebook-webapp.desktop': {
40− 'name': i18n.tr("Facebook"),
41− 'icon': 'facebook',
42− 'exec': '/usr/bin/webbrowser-app --chromeless http://m.facebook.com',
43− 'stage': SideStage
44− },
45− '/usr/share/applications/webbrowser-app.desktop': {
46− 'name': i18n.tr("Browser"),
47− 'icon': 'browser',
48− 'exec': '/usr/bin/webbrowser-app'
49− },
50− '/usr/share/applications/twitter-webapp.desktop': {
51− 'name': i18n.tr("Twitter"),
52− 'icon': 'twitter',
53− 'exec': '/usr/bin/webbrowser-app --chromeless http://www.twitter.com',
54− 'stage': SideStage
55− },
56− '/usr/share/applications/gmail-webapp.desktop': {
57− 'name': i18n.tr("GMail"),
58− 'icon': 'gmail',
59− 'exec': '/usr/bin/webbrowser-app --chromeless http://m.gmail.com'
60− },
61− '/usr/share/applications/ubuntu-weather-app.desktop': {
62− 'name': i18n.tr("Weather"),
63− 'icon': 'weather',
64− 'exec': '/usr/bin/qmlscene /usr/share/ubuntu-weather-app/ubuntu-weather-app.qml',
65− 'stage': SideStage
66− },
67− '/usr/share/applications/notes-app.desktop': {
68− 'name': i18n.tr("Notepad"),
69− 'icon': 'notepad',
70− 'exec': '/usr/bin/qmlscene /usr/share/notes-app/NotesApp.qml',
71− 'stage': SideStage
72− },
73− '/usr/share/applications/calendar-app.desktop': {
74− 'name': i18n.tr("Calendar"),
75− 'icon': 'calendar',
76− 'exec': '/usr/bin/qmlscene /usr/share/calendar-app/calendar.qml',
77− 'stage': SideStage
78− },
79− '/usr/share/applications/mediaplayer-app.desktop': {
80− 'name': i18n.tr("Media Player"),
81− 'icon': 'mediaplayer-app',
82− 'fullscreen': true,
83− 'exec': '/usr/bin/mediaplayer-app'
84− },
85− '/usr/share/applications/evernote.desktop': {
86− 'name': i18n.tr("Evernote"),
87− 'icon': 'evernote',
88− 'exec': ''
89− },
90− '/usr/share/applications/map.desktop': {
91− 'name': i18n.tr("Map"),
92− 'icon': 'map',
93− 'exec': ''
94− },
95− '/usr/share/applications/pinterest.desktop': {
96− 'name': i18n.tr("Pinterest"),
97− 'icon': 'pinterest',
98− 'exec': ''
99− },
100− '/usr/share/applications/soundcloud.desktop': {
101− 'name': i18n.tr("SoundCloud"),
102− 'icon': 'soundcloud',
103− 'exec': ''
104− },
105− '/usr/share/applications/wikipedia.desktop': {
106− 'name': i18n.tr("Wikipedia"),
107− 'icon': 'wikipedia',
108− 'exec': ''
109− },
110− '/usr/share/applications/youtube.desktop': {
111− 'name': i18n.tr("YouTube"),
112− 'icon': 'youtube',
113− 'exec': ''
114− },
115−}
CMakeLists.txt+13−73
@@ -69,17 +69,6 @@ if(SHELL_PLUGINDIR STREQUAL "")
6969 message(FATAL_ERROR "Could not determine plugin import dir.")
7070endif()
7171
72−configure_file(paths.h.in ${CMAKE_CURRENT_BINARY_DIR}/paths.h @ONLY)
73−
74−pkg_check_modules(UNITY-MIR REQUIRED unity-mir)
75−
76−include_directories(
77− ${CMAKE_CURRENT_BINARY_DIR}
78− ${CMAKE_CURRENT_SOURCE_DIR}
79− ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
80− ${UNITY-MIR_INCLUDE_DIRS}
81− )
82−
8372set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
8473
8574set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fno-permissive -pedantic -Wall -Wextra")
@@ -107,74 +96,25 @@ include(autopilot)
10796declare_autopilot_test(shell unity8.shell ${CMAKE_SOURCE_DIR}/tests/autopilot/)
10897
10998set(SHELL_APP unity8)
99+set(SCOPE_TOOL unity-scope-tool)
110100
111−set(shell_app_HDRS
112− )
113−
114−add_executable(${SHELL_APP}
115− ${shellapplication_MOC_SRCS}
116− ApplicationArguments.h
117− main.cpp
118− MouseTouchAdaptor.cpp
119− )
120−
121−qt5_use_modules(${SHELL_APP} Qml Quick Test)
122−pkg_check_modules(XCB REQUIRED xcb)
123−
124−if (NOT "${XCB_INCLUDE_DIRS}" STREQUAL "")
125− set_target_properties(${SHELL_APP} PROPERTIES INCLUDE_DIRECTORIES ${XCB_INCLUDE_DIRS})
126−endif()
127−
128−target_link_libraries(${SHELL_APP}
129− ${Qt5Qml_LIBRARIES}
130− ${Qt5Quick_LIBRARIES}
131− ${XCB_LDFLAGS}
132− ${CMAKE_DL_LIBS}
133− )
134−
135−# install binaries
136−install(TARGETS ${SHELL_APP}
137− RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
138− )
139−
140−# install top level qml and js files
141−file(GLOB QML_JS_FILES *.qml *.js)
142−
143−install(FILES ${QML_JS_FILES}
144− DESTINATION ${SHELL_APP_DIR}
145− )
101+include_directories(
102+ ${CMAKE_SOURCE_DIR}/include
103+ ${CMAKE_BINARY_DIR}/include
104+)
146105
147106# add subdirectories to build
107+add_subdirectory(include)
108+add_subdirectory(src)
109+add_subdirectory(tools)
110+add_subdirectory(qml)
148111add_subdirectory(tests)
149112add_subdirectory(plugins)
150−add_subdirectory(src)
151113
152−# install subdirectories
153−set(QML_DIRS
154− Applications
155− Bottombar
156− Components
157− Dash
158− graphics
159− Greeter
160− Hud
161− Panel
162− Launcher
163− SideStage
164− Notifications
165− )
166−
167−install(DIRECTORY ${QML_DIRS}
168− DESTINATION ${SHELL_APP_DIR}
169− )
170−
171−# generate desktop file
172−configure_file(${SHELL_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop @ONLY)
173−
174−# install desktop file
175−install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop
176− DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
177− )
114+#
115+# Data files
116+#
117+add_subdirectory(data)
178118
179119#
180120# Translation
CODING+70−2
@@ -1,7 +1,7 @@
11Building Unity 8
22================
33
4−Only Ubuntu 13.10 (saucy) is supported as a developement environment.
4+Only Ubuntu 14.04 (trusty) is supported as a developement environment.
55
66download source
77---------------
@@ -68,7 +68,7 @@ Notes
6868
6969Running Unity 8 on devices
7070==========================
71−- Ubuntu Touch builds are currently only available in 13.10 flavour
71+- Ubuntu Touch builds are currently only available in 14.04 flavour
7272- supported hardware should match one of those listed here
7373 https://wiki.ubuntu.com/Touch/Devices#Running_fine
7474- follow the Ubuntu Touch install instructions for your chosen device
@@ -127,3 +127,71 @@ Unity 8.
127127If using VIM, make sure you install some syntax highlighting for QML, like
128128https://github.com/peterhoeg/vim-qml
129129
130+Running tests
131+=============
132+
133+Tests are run from the build directory (which will be ./builddir if you used
134+the ./build script).
135+
136+To run the tests that do not require any graphical capability and therefore
137+are pretty fast run:
138+
139+$ make test
140+
141+or, alternatively:
142+
143+$ ctest
144+
145+To run all graphical tests, which can take a couple of minutes:
146+
147+$ make qmluitests
148+
149+To run the tests for a single component/class:
150+
151+$ make testComponentName
152+
153+So, for the DragHandle component that would be:
154+
155+$ make testDragHandle
156+
157+To run a test application that allow you to manually test or to simply try out
158+a given component:
159+
160+$ make tryComponentName
161+
162+So to try out, for instance, the DragHandle component, you would do:
163+
164+$ make tryDragHandle
165+
166+NB: Manual test or interation doesn't make sense for all components or classes,
167+particularly the non-graphical ones. In such cases no "tryFoo" make target is
168+provided.
169+
170+NB: The tests expect the locale to be the C locale, they may fail if run
171+under a different locale, if you get failures others can not reproduce
172+prepend 'LC_ALL=C' to the 'make test' command
173+
174+Running autopilot tests
175+=======================
176+
177+Autopilot tests are run from the build directory (which will be ./builddir if you used
178+the ./build script).
179+
180+$ make autopilot
181+
182+If you want you can also run tests individually, for that you need to install first,
183+otherwise the tests will run on the system-installed version
184+
185+$ make install
186+
187+To see the list of existing autopilot tests you can do
188+
189+$ PYTHONPATH=../tests/autopilot autopilot list unity8
190+
191+And then run a single test with
192+
193+$ PYTHONPATH=../tests/autopilot autopilot run unity8.some.very.long.test.name
194+
195+or run them all with
196+
197+$ PYTHONPATH=../tests/autopilot autopilot run unity8
Dash/DashContent.qmldeleted−150
@@ -1,150 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import Unity 0.1
20−
21−Item {
22− id: dashContent
23−
24− property var model: null
25− property var scopes: null
26− property real contentProgress: Math.max(0, Math.min(dashContentList.contentX / (dashContentList.contentWidth - dashContentList.width), units.dp(1)))
27− property alias currentIndex: dashContentList.currentIndex
28−
29− property ScopeDelegateMapper scopeMapper : ScopeDelegateMapper {}
30− property ListModel searchHistory
31−
32− signal movementStarted()
33− signal movementEnded()
34− signal contentFlickStarted()
35− signal contentEndReached()
36− signal previewShown()
37− signal scopeLoaded(string scopeId)
38− signal positionedAtBeginning()
39−
40− // If we set the current scope index before the scopes have been added,
41− // then we need to wait until the loaded signals gets emitted from the scopes
42− property var set_current_index: undefined
43− Connections {
44− target: scopes
45− onLoadedChanged: {
46− if (scopes.loaded && set_current_index != undefined) {
47− setCurrentScopeAtIndex(set_current_index[0], set_current_index[1], set_current_index[2]);
48− set_current_index = undefined;
49− }
50− }
51− }
52−
53− function setCurrentScopeAtIndex(index, animate, reset) {
54− var storedMoveDuration = dashContentList.highlightMoveDuration
55− var storedMoveSpeed = dashContentList.highlightMoveVelocity
56− if (!animate) {
57− dashContentList.highlightMoveVelocity = units.gu(4167)
58− dashContentList.highlightMoveDuration = 0
59− }
60−
61− // if the scopes haven't loaded yet, then wait until they are.
62− if (!scopes.loaded) {
63− set_current_index = [ index, animate, reset ]
64− return;
65− }
66− set_current_index = undefined;
67−
68− if (dashContentList.count > index)
69− {
70− dashContentList.currentIndex = index
71−
72− if (reset) {
73− dashContent.positionedAtBeginning()
74− }
75− }
76−
77− if (!animate) {
78− dashContentList.highlightMoveDuration = storedMoveDuration
79− dashContentList.highlightMoveVelocity = storedMoveSpeed
80− }
81− }
82−
83− ListView {
84− id: dashContentList
85− objectName: "dashContentList"
86−
87− interactive: dashContent.scopes.loaded && !currentItem.previewShown && !currentItem.moving
88−
89− anchors.fill: parent
90− model: dashContent.model
91− orientation: ListView.Horizontal
92− boundsBehavior: Flickable.DragAndOvershootBounds
93− flickDeceleration: units.gu(625)
94− maximumFlickVelocity: width * 5
95− snapMode: ListView.SnapOneItem
96− highlightMoveDuration: 250
97− highlightRangeMode: ListView.StrictlyEnforceRange
98− /* FIXME: workaround rendering issue due to use of ShaderEffectSource in
99− UbuntuShape. While switching from the home scope to the People scope the
100− rendering would block midway.
101− */
102− cacheBuffer: 2147483647
103− onMovementStarted: dashContent.movementStarted()
104− onMovementEnded: dashContent.movementEnded()
105−
106− // If the number of items is less than the current index, then need to reset to another item.
107− onCountChanged: {
108− if (currentIndex >= count)
109− dashContent.setCurrentScopeAtIndex(count-1, true, true)
110− }
111−
112− delegate:
113− Loader {
114− width: ListView.view.width
115− height: ListView.view.height
116− asynchronous: true
117− source: scopeMapper.map(scope.id)
118− objectName: scope.id + " loader"
119−
120− readonly property bool previewShown: item ? item.previewShown : false
121− readonly property bool moving: item ? item.moving : false
122−
123− // these are needed for autopilot tests
124− readonly property string scopeId: scope.id
125− readonly property bool isCurrent: ListView.isCurrentItem
126− readonly property bool isLoaded: status == Loader.Ready
127−
128− onLoaded: {
129− item.scope = Qt.binding(function() { return scope })
130− item.isCurrent = Qt.binding(function() { return visible && ListView.isCurrentItem })
131− item.searchHistory = Qt.binding(function() { return dashContent.searchHistory })
132− dashContentList.movementStarted.connect(item.movementStarted)
133− dashContent.positionedAtBeginning.connect(item.positionedAtBeginning)
134− dashContent.scopeLoaded(item.scope.id)
135− }
136− Connections {
137− target: item
138− ignoreUnknownSignals: true
139− onEndReached: contentEndReached()
140− onPreviewShownChanged: {
141− if (item.previewShown) {
142− dashContent.previewShown()
143− }
144− }
145− }
146−
147− Component.onDestruction: active = false
148− }
149− }
150−}
Notifications/Notification.qmldeleted−295
@@ -1,295 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import Unity.Notifications 1.0
20−import QMenuModel 0.1
21−import Utils 0.1
22−
23−UbuntuShape {
24− id: notification
25−
26− property alias iconSource: icon.fileSource
27− property alias secondaryIconSource: secondaryIcon.source
28− property alias summary: summaryLabel.text
29− property alias body: bodyLabel.text
30− property var actions
31− property var notificationId
32− property var type
33− property var hints
34− property var notification
35−
36− objectName: "background"
37− implicitHeight: type != Notification.PlaceHolder ? contentColumn.height + contentColumn.spacing * 2 : 0
38− color: Qt.rgba(0.132, 0.117, 0.109, 0.97)
39− opacity: 0
40− radius: "medium"
41−
42− clip: true
43− visible: type != Notification.PlaceHolder
44−
45− UnityMenuModelPaths {
46− id: paths
47−
48− source: hints["x-canonical-private-menu-model"]
49−
50− busNameHint: "busName"
51− actionsHint: "actions"
52− menuObjectPathHint: "menuPath"
53− }
54−
55− UnityMenuModel {
56− id: unityMenuModel
57−
58− busName: paths.busName
59− actions: paths.actions
60− menuObjectPath: paths.menuObjectPath
61− }
62−
63− Behavior on implicitHeight {
64− id: heightBehavior
65−
66− enabled: false
67− UbuntuNumberAnimation {
68− duration: UbuntuAnimation.SnapDuration
69− }
70− }
71−
72− // delay enabling height behavior until the add transition is complete
73− onOpacityChanged: if (opacity == 1) heightBehavior.enabled = true
74−
75− MouseArea {
76− id: interactiveArea
77−
78− anchors.fill: contentColumn
79− objectName: "interactiveArea"
80− enabled: notification.type == Notification.Interactive
81− onClicked: notification.notification.invokeAction(actionRepeater.itemAt(0).actionId)
82− }
83−
84− Column {
85− id: contentColumn
86−
87− anchors {
88− left: parent.left
89− right: parent.right
90− top: parent.top
91− margins: spacing
92− }
93−
94− spacing: units.gu(1)
95−
96− Row {
97− id: topRow
98−
99− spacing: contentColumn.spacing
100− anchors {
101− left: parent.left
102− right: parent.right
103− }
104−
105− ShapedIcon {
106− id: icon
107−
108− objectName: "icon"
109− width: units.gu(6)
110− height: units.gu(6)
111− shaped: notification.hints["x-canonical-non-shaped-icon"] == "true" ? false : true
112− visible: iconSource !== undefined && iconSource != ""
113− }
114−
115− Image {
116− id: secondaryIcon
117−
118− objectName: "secondaryIcon"
119− width: units.gu(2)
120− height: units.gu(2)
121− visible: source !== undefined && source != ""
122− fillMode: Image.PreserveAspectCrop
123− }
124−
125− Column {
126− id: labelColumn
127− width: parent.width - x
128−
129− anchors.verticalCenter: (icon.visible && !bodyLabel.visible) ? icon.verticalCenter : undefined
130−
131− Label {
132− id: summaryLabel
133−
134− objectName: "summaryLabel"
135− anchors {
136− left: parent.left
137− right: parent.right
138− }
139− fontSize: "medium"
140− font.bold: true
141− color: Theme.palette.selected.backgroundText
142− elide: Text.ElideRight
143− }
144−
145− Label {
146− id: bodyLabel
147−
148− objectName: "bodyLabel"
149− anchors {
150− left: parent.left
151− right: parent.right
152− }
153− visible: body != ""
154− fontSize: "small"
155− color: Theme.palette.selected.backgroundText
156− opacity: 0.6
157− wrapMode: Text.WordWrap
158− maximumLineCount: 10
159− elide: Text.ElideRight
160− }
161− }
162− }
163−
164− Column {
165− objectName: "dialogListView"
166− spacing: units.gu(2)
167−
168− visible: count > 0
169−
170− anchors.left: parent.left; anchors.right: parent.right
171−
172− Repeater {
173− model: unityMenuModel
174−
175− NotificationMenuItemFactory {
176− anchors.left: parent.left; anchors.right: parent.right
177−
178− menuModel: unityMenuModel
179− menuData: model
180− menuIndex: index
181− }
182− }
183− }
184−
185− Item {
186− id: buttonRow
187−
188− objectName: "buttonRow"
189− anchors {
190− left: parent.left
191− right: parent.right
192− }
193− visible: notification.type == Notification.SnapDecision && actionRepeater.count > 0
194− height: units.gu(5)
195−
196− property real buttonWidth: (width - contentColumn.spacing) / 2
197− property bool expanded
198−
199− Button {
200− id: leftButton
201−
202− objectName: "button1"
203− width: parent.expanded ? parent.width : parent.buttonWidth
204− anchors {
205− top: parent.top
206− bottom: parent.bottom
207− }
208− text: notification.type == Notification.SnapDecision && actionRepeater.count >= 2 ? actionRepeater.itemAt(1).actionLabel : ""
209− gradient: UbuntuColors.greyGradient
210− onClicked: {
211− if (actionRepeater.count > 2) {
212− buttonRow.expanded = !buttonRow.expanded
213− } else {
214− notification.notification.invokeAction(actionRepeater.itemAt(1).actionId)
215− }
216− }
217−
218− Behavior on width {
219− UbuntuNumberAnimation {
220− duration: UbuntuAnimation.SnapDuration
221− }
222− }
223− }
224−
225− Button {
226− id: rightButton
227−
228− objectName: "button0"
229− anchors {
230− left: leftButton.right
231− leftMargin: contentColumn.spacing
232− right: parent.right
233− }
234− text: notification.type == Notification.SnapDecision && actionRepeater.count >= 1 ? actionRepeater.itemAt(0).actionLabel : ""
235− anchors {
236− top: parent.top
237− bottom: parent.bottom
238− }
239− gradient: notification.hints["x-canonical-private-button-tint"] == "true" ? UbuntuColors.orangeGradient : UbuntuColors.greyGradient
240− visible: width > 0
241− onClicked: notification.notification.invokeAction(actionRepeater.itemAt(0).actionId)
242− }
243− }
244−
245− Column {
246− objectName: "buttonColumn"
247− spacing: contentColumn.spacing
248− anchors {
249− left: parent.left
250− right: parent.right
251− }
252−
253− // calculate initial position before Column takes over
254− y: buttonRow.y + buttonRow.height + contentColumn.spacing
255−
256− visible: notification.type == Notification.SnapDecision
257− height: buttonRow.expanded ? implicitHeight : 0
258−
259− Repeater {
260− id: actionRepeater
261−
262− model: notification.actions
263− delegate: Loader {
264− id: loader
265−
266− property string actionId: id
267− property string actionLabel: label
268−
269− anchors {
270− left: parent.left
271− right: parent.right
272− }
273−
274− Component {
275− id: actionButton
276−
277− Button {
278− objectName: "button" + index
279− anchors {
280− left: parent.left
281− right: parent.right
282− }
283−
284− text: loader.actionLabel
285− height: units.gu(5)
286− gradient: UbuntuColors.greyGradient
287− onClicked: notification.notification.invokeAction(loader.actionId)
288− }
289− }
290− sourceComponent: (index == 0 || index == 1) ? undefined : actionButton
291− }
292− }
293− }
294− }
295−}
cmake/modules/autopilot.cmake+5−1
@@ -4,7 +4,11 @@ function(declare_autopilot_test TEST_NAME TEST_SUITE WORKING_DIR)
44 add_custom_target(autopilot-${TEST_NAME}
55 COMMAND LANG=C UBUNTU_ICON_THEME=ubuntu-mobile QML2_IMPORT_PATH=${SHELL_INSTALL_QML}/mocks autopilot run ${TEST_SUITE}
66 WORKING_DIRECTORY ${WORKING_DIR}
7− DEPENDS install
7+ DEPENDS fake_install
8+ )
9+
10+ add_custom_target(fake_install
11+ COMMAND cmake --build ${CMAKE_BINARY_DIR} --target install
812 )
913
1014 add_dependencies(autopilot autopilot-${TEST_NAME})
data/CMakeLists.txtnew file+8
@@ -0,0 +1,8 @@
1+# generate desktop file
2+configure_file(${SHELL_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop @ONLY)
3+configure_file(${SCOPE_TOOL}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${SCOPE_TOOL}.desktop @ONLY)
4+
5+# install desktop files
6+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop ${CMAKE_CURRENT_BINARY_DIR}/${SCOPE_TOOL}.desktop
7+ DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
8+ )
data/unity-scope-tool.desktop.innew file+8
@@ -0,0 +1,8 @@
1+[Desktop Entry]
2+Type=Application
3+Name=Unity Scope Tool
4+Comment=Developer tool for Unity scopes.
5+Exec=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@/unity-scope-tool
6+Terminal=false
7+Icon=unity-scope-tool
8+X-Ubuntu-Touch=true
data/unity8.conf+1
@@ -5,6 +5,7 @@ start on ((xsession SESSION=ubuntu-touch) or (xsession SESSION=ubuntu-touch-surf
55stop on desktop-end
66
77respawn
8+expect stop
89
910pre-start script
1011 if [ -n "$MIR_SOCKET" ]; then
unity8.desktop.in → data/unity8.desktop.inrenamed

The content is the same.

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

The content is the same.

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

The content is the same.

plugins/ListViewWithPageHeader/plugin.cpp → plugins/DashViews/plugin.cpprenamed+6−2
@@ -17,13 +17,17 @@
1717
1818#include "plugin.h"
1919
20+#include "horizontaljournal.h"
2021#include "listviewwithpageheader.h"
22+#include "verticaljournal.h"
2123
2224#include <QAbstractItemModel>
2325
24−void ListViewWithPageHeaderPlugin::registerTypes(const char *uri)
26+void DashViewsPlugin::registerTypes(const char *uri)
2527{
26− Q_ASSERT(uri == QLatin1String("ListViewWithPageHeader"));
28+ Q_ASSERT(uri == QLatin1String("DashViews"));
2729 qmlRegisterType<QAbstractItemModel>();
30+ qmlRegisterType<HorizontalJournal>(uri, 0, 1, "HorizontalJournal");
2831 qmlRegisterType<ListViewWithPageHeader>(uri, 0, 1, "ListViewWithPageHeader");
32+ qmlRegisterType<VerticalJournal>(uri, 0, 1, "VerticalJournal");
2933}
plugins/ListViewWithPageHeader/plugin.h → plugins/DashViews/plugin.hrenamed+3−3
@@ -15,13 +15,13 @@
1515 *
1616 */
1717
18−#ifndef LISTVIEWWITHPAGEHEADER_PLUGIN_H
19−#define LISTVIEWWITHPAGEHEADER_PLUGIN_H
18+#ifndef DASHVIEWS_PLUGIN_H
19+#define DASHVIEWS_PLUGIN_H
2020
2121#include <QtQml/QQmlEngine>
2222#include <QtQml/QQmlExtensionPlugin>
2323
24−class ListViewWithPageHeaderPlugin : public QQmlExtensionPlugin
24+class DashViewsPlugin : public QQmlExtensionPlugin
2525{
2626 Q_OBJECT
2727 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
plugins/DashViews/qmldirnew file+3
@@ -0,0 +1,3 @@
1+module DashViews
2+plugin DashViews-qml
3+typeinfo plugin.qmltypes
plugins/DashViews/verticaljournal.cppnew file+280
@@ -0,0 +1,280 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+/*
18+ * The implementation is centered around m_columnVisibleItems
19+ * that holds a vector of lists. There's a list for each of the
20+ * columns the view has. In the list the items of the column are
21+ * ordered as they appear topdown in the view. m_indexColumnMap is
22+ * used when re-building the list up since given a position
23+ * in the middle of the list and the need to create the previous does
24+ * not give us enough information to know in which column we have
25+ * to position the item so that when we reach the item the view is
26+ * correctly layouted at 0 for all the columns
27+ */
28+#include "verticaljournal.h"
29+
30+#pragma GCC diagnostic push
31+#pragma GCC diagnostic ignored "-pedantic"
32+#include <private/qquickitem_p.h>
33+#pragma GCC diagnostic pop
34+
35+static const qreal bufferRatio = 0.5;
36+
37+VerticalJournal::VerticalJournal()
38+ : m_columnWidth(0)
39+{
40+}
41+
42+qreal VerticalJournal::columnWidth() const
43+{
44+ return m_columnWidth;
45+}
46+
47+void VerticalJournal::setColumnWidth(qreal columnWidth)
48+{
49+ if (columnWidth != m_columnWidth) {
50+ m_columnWidth = columnWidth;
51+ Q_EMIT columnWidthChanged();
52+
53+ if (isComponentComplete()) {
54+ Q_FOREACH(const auto &column, m_columnVisibleItems) {
55+ Q_FOREACH(const ViewItem &item, column) {
56+ item.m_item->setWidth(columnWidth);
57+ }
58+ }
59+ relayout();
60+ }
61+ }
62+}
63+
64+void VerticalJournal::findBottomModelIndexToAdd(int *modelIndex, qreal *yPos)
65+{
66+ *modelIndex = 0;
67+ *yPos = std::numeric_limits<qreal>::max();
68+
69+ Q_FOREACH(const auto &column, m_columnVisibleItems) {
70+ if (!column.isEmpty()) {
71+ const ViewItem &item = column.last();
72+ *yPos = qMin(*yPos, item.y() + item.height() + rowSpacing());
73+ *modelIndex = qMax(*modelIndex, item.m_modelIndex + 1);
74+ } else {
75+ *yPos = 0;
76+ }
77+ }
78+}
79+
80+void VerticalJournal::findTopModelIndexToAdd(int *modelIndex, qreal *yPos)
81+{
82+ *modelIndex = INT_MAX;
83+ *yPos = std::numeric_limits<qreal>::lowest();
84+ int columnToAddTo = -1;
85+
86+ // Find the topmost free column
87+ for (int i = 0; i < m_columnVisibleItems.count(); ++i) {
88+ const auto &column = m_columnVisibleItems[i];
89+ if (!column.isEmpty()) {
90+ const ViewItem &item = column.first();
91+ const auto itemTopPos = item.y() - rowSpacing();
92+ if (itemTopPos > *yPos) {
93+ *yPos = itemTopPos;
94+ *modelIndex = item.m_modelIndex - 1;
95+ columnToAddTo = i;
96+ }
97+ }
98+ }
99+
100+ if (*modelIndex > 0) {
101+ Q_ASSERT(m_indexColumnMap.contains(*modelIndex));
102+ while (m_indexColumnMap[*modelIndex] != columnToAddTo) {
103+ // We found out that we have to add to columnToAddTo
104+ // and thought that we had to add *modelIndex, but history tells
105+ // it is not correct, so find up from *modelIndex until we found the index
106+ // that has to end up in columnToAddTo
107+ *modelIndex = *modelIndex - 1;
108+ Q_ASSERT(m_indexColumnMap.contains(*modelIndex));
109+ }
110+ }
111+}
112+
113+bool VerticalJournal::removeNonVisibleItems(qreal bufferFromY, qreal bufferToY)
114+{
115+ bool changed = false;
116+
117+ for (int i = 0; i < m_columnVisibleItems.count(); ++i) {
118+ QList<ViewItem> &column = m_columnVisibleItems[i];
119+ while (!column.isEmpty() && column.first().y() + column.first().height() < bufferFromY) {
120+ releaseItem(column.takeFirst().m_item);
121+ changed = true;
122+ }
123+
124+ while (!column.isEmpty() && column.last().y() > bufferToY) {
125+ releaseItem(column.takeLast().m_item);
126+ changed = true;
127+ }
128+ }
129+
130+ return changed;
131+}
132+
133+void VerticalJournal::positionItem(int modelIndex, QQuickItem *item)
134+{
135+ if (item->width() != m_columnWidth) {
136+ qWarning() << "Item" << modelIndex << "width is not the one that the columnWidth mandates, resetting it";
137+ item->setWidth(m_columnWidth);
138+ }
139+
140+ // Check if we add it to the bottom of existing column items
141+ const QList<ViewItem> &firstColumn = m_columnVisibleItems[0];
142+ qreal columnToAddY = !firstColumn.isEmpty() ? firstColumn.last().y() + firstColumn.last().height() : -rowSpacing();
143+ int columnToAddTo = 0;
144+ for (int i = 1; i < m_columnVisibleItems.count(); ++i) {
145+ const QList<ViewItem> &column = m_columnVisibleItems[i];
146+ const qreal iY = !column.isEmpty() ? column.last().y() + column.last().height() : -rowSpacing();
147+ if (iY < columnToAddY) {
148+ columnToAddTo = i;
149+ columnToAddY = iY;
150+ }
151+ }
152+
153+ const QList<ViewItem> &columnToAdd = m_columnVisibleItems[columnToAddTo];
154+ if (columnToAdd.isEmpty() || columnToAdd.last().m_modelIndex < modelIndex) {
155+ item->setX(columnToAddTo * (m_columnWidth + columnSpacing()));
156+ item->setY(columnToAddY + rowSpacing());
157+
158+ m_columnVisibleItems[columnToAddTo] << ViewItem(item, modelIndex);
159+ m_indexColumnMap[modelIndex] = columnToAddTo;
160+ } else {
161+ Q_ASSERT(m_indexColumnMap.contains(modelIndex));
162+ columnToAddTo = m_indexColumnMap[modelIndex];
163+ columnToAddY = m_columnVisibleItems[columnToAddTo].first().y();
164+
165+ item->setX(columnToAddTo * (m_columnWidth + columnSpacing()));
166+ item->setY(columnToAddY - rowSpacing() - item->height());
167+
168+ m_columnVisibleItems[columnToAddTo].prepend(ViewItem(item, modelIndex));
169+ }
170+}
171+
172+void VerticalJournal::cleanupExistingItems()
173+{
174+ // Cleanup the existing items
175+ for (int i = 0; i < m_columnVisibleItems.count(); ++i) {
176+ QList<ViewItem> &column = m_columnVisibleItems[i];
177+ Q_FOREACH(const ViewItem &item, column)
178+ releaseItem(item.m_item);
179+ column.clear();
180+ }
181+ m_indexColumnMap.clear();
182+}
183+
184+void VerticalJournal::calculateImplicitHeight()
185+{
186+ int lastModelIndex = -1;
187+ qreal bottomMostY = 0;
188+ Q_FOREACH(const auto &column, m_columnVisibleItems) {
189+ if (!column.isEmpty()) {
190+ const ViewItem &item = column.last();
191+ lastModelIndex = qMax(lastModelIndex, item.m_modelIndex);
192+ bottomMostY = qMax(bottomMostY, item.y() + item.height());
193+ }
194+ }
195+ if (lastModelIndex >= 0) {
196+ const double averageHeight = bottomMostY / (lastModelIndex + 1);
197+ setImplicitHeight(bottomMostY + averageHeight * (model()->rowCount() - lastModelIndex - 1));
198+ } else {
199+ setImplicitHeight(0);
200+ }
201+}
202+
203+void VerticalJournal::doRelayout()
204+{
205+ QList<ViewItem> allItems;
206+ Q_FOREACH(const auto &column, m_columnVisibleItems)
207+ allItems << column;
208+
209+ qSort(allItems);
210+
211+ const int nColumns = qMax(1., floor((double)(width() + columnSpacing()) / (m_columnWidth + columnSpacing())));
212+ m_columnVisibleItems.resize(nColumns);
213+ m_indexColumnMap.clear();
214+ for (int i = 0; i < nColumns; ++i)
215+ m_columnVisibleItems[i].clear();
216+
217+ // If the first of allItems doesn't contain index 0 we need to drop them
218+ // all since we can't consistently relayout without the first item being there
219+
220+ if (!allItems.isEmpty()) {
221+ if (allItems.first().m_modelIndex == 0) {
222+ Q_FOREACH(const ViewItem &item, allItems)
223+ positionItem(item.m_modelIndex, item.m_item);
224+ } else {
225+ Q_FOREACH(const ViewItem &item, allItems)
226+ releaseItem(item.m_item);
227+ }
228+ }
229+}
230+
231+void VerticalJournal::updateItemCulling(qreal visibleFromY, qreal visibleToY)
232+{
233+ Q_FOREACH(const auto &column, m_columnVisibleItems) {
234+ Q_FOREACH(const ViewItem &item, column) {
235+ const bool cull = item.y() + item.height() <= visibleFromY || item.y() >= visibleToY;
236+ QQuickItemPrivate::get(item.m_item)->setCulled(cull);
237+ }
238+ }
239+}
240+
241+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
242+void VerticalJournal::processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes)
243+#else
244+void VerticalJournal::processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes)
245+#endif
246+{
247+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
248+ Q_FOREACH(const QQuickChangeSet::Remove &remove, removes) {
249+#else
250+ Q_FOREACH(const QQmlChangeSet::Remove &remove, removes) {
251+#endif
252+ for (int i = remove.count - 1; i >= 0; --i) {
253+ const int indexToRemove = remove.index + i;
254+ // Since we only support removing from the end, indexToRemove
255+ // must refer to the last item of one of the columns or
256+ // be bigger than them (because it's not in the viewport and
257+ // thus we have not created a delegate for it)
258+ bool found = false;
259+ int lastCreatedIndex = INT_MIN;
260+ for (int i = 0; !found && i < m_columnVisibleItems.count(); ++i) {
261+ QList<ViewItem> &column = m_columnVisibleItems[i];
262+ if (!column.isEmpty()) {
263+ const int lastColumnIndex = column.last().m_modelIndex;
264+ if (lastColumnIndex == indexToRemove) {
265+ releaseItem(column.takeLast().m_item);
266+ found = true;
267+ }
268+ lastCreatedIndex = qMax(lastCreatedIndex, lastColumnIndex);
269+ }
270+ }
271+ if (!found) {
272+ if (indexToRemove < lastCreatedIndex) {
273+ qFatal("VerticalJournal only supports removal from the end of the model");
274+ } else {
275+ setImplicitHeightDirty();
276+ }
277+ }
278+ }
279+ }
280+}
plugins/DashViews/verticaljournal.hnew file+104
@@ -0,0 +1,104 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef VERTICALJOURNAL_H
18+#define VERTICALJOURNAL_H
19+
20+#include "abstractjournal.h"
21+
22+ /** A vertical journal is a view that creates delegates
23+ * based on a model and layouts them in columns following
24+ * a top-left most position rule.
25+ *
26+ * The number of columns is calculated using the width of
27+ * the view itself, the columnWidth (i.e. the width of each individual delegate)
28+ * and the columnSpacing between columns.
29+ *
30+ * All delegates are forced to columnWidth if they don't have it.
31+ *
32+ * The first nColumns items are layouted at row 0 from column 0
33+ * to column nColumns-1 in order. After that every new item
34+ * is positioned in the column which provides the free topmost
35+ * position as possible. If more than one column tie in providing
36+ * the topmost free position the leftmost column will be used.
37+ *
38+ * Example:
39+ *
40+ * +-----+ +-----+ +-----+
41+ * | | | 2 | | |
42+ * | | | | | |
43+ * | 1 | +-----+ | 3 |
44+ * | | +-----+ | |
45+ * | | | | +-----+
46+ * +-----+ | 4 | +-----+
47+ * +-----+ | | | 5 |
48+ * | 6 | +-----+ | |
49+ * | | +-----+
50+ * +-----+
51+ *
52+ */
53+
54+class VerticalJournal : public AbstractJournal
55+{
56+ Q_OBJECT
57+
58+ Q_PROPERTY(qreal columnWidth READ columnWidth WRITE setColumnWidth NOTIFY columnWidthChanged)
59+
60+friend class VerticalJournalTest;
61+
62+public:
63+ VerticalJournal();
64+
65+ qreal columnWidth() const;
66+ void setColumnWidth(qreal columnWidth);
67+
68+Q_SIGNALS:
69+ void columnWidthChanged();
70+
71+private:
72+ class ViewItem
73+ {
74+ public:
75+ ViewItem(QQuickItem *item, int modelIndex) : m_item(item), m_modelIndex(modelIndex) {}
76+ qreal x() const { return m_item->x(); }
77+ qreal y() const { return m_item->y(); }
78+ qreal height() const { return m_item->height(); }
79+ bool operator<(const ViewItem &v) const { return m_modelIndex < v.m_modelIndex; }
80+
81+ QQuickItem *m_item;
82+ int m_modelIndex;
83+ };
84+
85+ void findBottomModelIndexToAdd(int *modelIndex, qreal *yPos) override;
86+ void findTopModelIndexToAdd(int *modelIndex, qreal *yPos) override;
87+ bool removeNonVisibleItems(qreal bufferFromY, qreal bufferToY) override;
88+ void positionItem(int modelIndex, QQuickItem *item) override;
89+ void cleanupExistingItems() override;
90+ void calculateImplicitHeight() override;
91+ void doRelayout() override;
92+ void updateItemCulling(qreal visibleFromY, qreal visibleToY) override;
93+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
94+ void processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes) override;
95+#else
96+ void processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes) override;
97+#endif
98+
99+ QVector<QList<ViewItem>> m_columnVisibleItems;
100+ QHash<int, int> m_indexColumnMap;
101+ int m_columnWidth;
102+};
103+
104+#endif
plugins/HudClient/hudclient.cpp+1−16
@@ -243,28 +243,13 @@ void HudClient::modelReady(bool needDisconnect)
243243 }
244244}
245245
246−static QVariant QVariantFromGVariant(GVariant *value)
247−{
248− // Only handle the cases we care for now
249− switch (g_variant_classify(value)) {
250− case G_VARIANT_CLASS_BOOLEAN:
251− return QVariant((bool) g_variant_get_boolean(value));
252− case G_VARIANT_CLASS_DOUBLE:
253− return QVariant(g_variant_get_double(value));
254− case G_VARIANT_CLASS_STRING:
255− return QVariant(QString::fromUtf8(g_variant_get_string(value, NULL)));
256− default:
257− return QVariant();
258− }
259−}
260−
261246static void addAttribute(QVariantMap &properties, GMenuModel *menuModel, int item, const char *attribute) {
262247 GVariant *v = g_menu_model_get_item_attribute_value(menuModel, item, attribute, NULL);
263248
264249 if (v == NULL)
265250 return;
266251
267− properties.insert(attribute, QVariantFromGVariant(v));
252+ properties.insert(attribute, DeeListModel::VariantForData(v));
268253 g_variant_unref(v);
269254}
270255
plugins/LightDM/CMakeLists.txt+3−1
@@ -10,6 +10,7 @@ pkg_check_modules(LIBUSERMETRICSOUTPUT REQUIRED libusermetricsoutput-1)
1010include_directories(
1111 ${CMAKE_CURRENT_SOURCE_DIR}
1212 ${CMAKE_CURRENT_BINARY_DIR}
13+ ${CMAKE_SOURCE_DIR}/plugins/Utils
1314 ${CMAKE_SOURCE_DIR}/tests/mocks/LightDM
1415 #${LIBLIGHTDM_INCLUDE_DIRS}
1516 ${LIBUSERMETRICSOUTPUT_INCLUDE_DIRS}
@@ -17,6 +18,7 @@ include_directories(
1718
1819set(QMLPLUGIN_SRC
1920 ../Utils/qsortfilterproxymodelqml.cpp # FIXME evaluate a more generic approach for using other plugins
21+ DBusGreeterList.cpp
2022 Greeter.cpp
2123 plugin.cpp
2224 UsersModel.cpp
@@ -33,7 +35,7 @@ target_link_libraries(LightDM-qml
3335 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
3436 )
3537
36−qt5_use_modules(LightDM-qml Gui Qml)
38+qt5_use_modules(LightDM-qml DBus Gui Qml)
3739
3840# export the qmldir qmltypes and plugin files
3941export_qmlfiles(LightDM LightDM)
plugins/LightDM/DBusGreeterList.cppnew file+77
@@ -0,0 +1,77 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "DBusGreeterList.h"
18+#include "Greeter.h"
19+
20+#include <QDBusMessage>
21+#include <QStringList>
22+
23+DBusGreeterList::DBusGreeterList(Greeter *greeter, const QDBusConnection &connection, const QString &path)
24+ : QObject(greeter),
25+ m_greeter(greeter),
26+ m_connection(connection),
27+ m_path(path)
28+{
29+ connect(m_greeter, SIGNAL(authenticationUserChanged(const QString &)), this, SLOT(authenticationUserChangedHandler(const QString &)));
30+ connect(m_greeter, SIGNAL(promptlessChanged()), this, SLOT(promptlessChangedHandler()));
31+}
32+
33+QString DBusGreeterList::GetActiveEntry() const
34+{
35+ return m_greeter->authenticationUser();
36+}
37+
38+void DBusGreeterList::SetActiveEntry(const QString &entry)
39+{
40+ Q_EMIT m_greeter->requestAuthenticationUser(entry);
41+}
42+
43+bool DBusGreeterList::entryIsLocked() const
44+{
45+ return !m_greeter->promptless();
46+}
47+
48+void DBusGreeterList::authenticationUserChangedHandler(const QString &user)
49+{
50+ notifyPropertyChanged("ActiveEntry", user);
51+ Q_EMIT EntrySelected(user);
52+}
53+
54+void DBusGreeterList::promptlessChangedHandler()
55+{
56+ notifyPropertyChanged("EntryIsLocked", entryIsLocked());
57+ Q_EMIT entryIsLockedChanged();
58+}
59+
60+// Manually emit a PropertiesChanged signal over DBus, because QtDBus
61+// doesn't do it for us on Q_PROPERTIES, oddly enough.
62+void DBusGreeterList::notifyPropertyChanged(const QString& propertyName, const QVariant &value)
63+{
64+ QDBusMessage message;
65+ QVariantMap changedProps;
66+
67+ changedProps.insert(propertyName, value);
68+
69+ message = QDBusMessage::createSignal(m_path,
70+ "org.freedesktop.DBus.Properties",
71+ "PropertiesChanged");
72+ message << "com.canonical.UnityGreeter.List";
73+ message << changedProps;
74+ message << QStringList();
75+
76+ m_connection.send(message);
77+}
plugins/LightDM/DBusGreeterList.hnew file+61
@@ -0,0 +1,61 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef UNITY_DBUSGREETERLIST_H
18+#define UNITY_DBUSGREETERLIST_H
19+
20+#include <QDBusConnection>
21+#include <QObject>
22+
23+class Greeter;
24+class QDBusInterface;
25+
26+/** This is an internal class used to talk with the indicators.
27+ */
28+
29+class DBusGreeterList : public QObject
30+{
31+ Q_OBJECT
32+ Q_CLASSINFO("D-Bus Interface", "com.canonical.UnityGreeter.List")
33+
34+ Q_PROPERTY(QString ActiveEntry READ GetActiveEntry WRITE SetActiveEntry NOTIFY EntrySelected) // since 14.04
35+ Q_PROPERTY(bool EntryIsLocked READ entryIsLocked NOTIFY entryIsLockedChanged) // since 14.04
36+
37+public:
38+ explicit DBusGreeterList(Greeter *greeter, const QDBusConnection &connection, const QString &path);
39+
40+ Q_SCRIPTABLE void SetActiveEntry(const QString &entry); // since 13.04
41+ Q_SCRIPTABLE QString GetActiveEntry() const; // since 13.10
42+
43+ bool entryIsLocked() const;
44+
45+Q_SIGNALS:
46+ Q_SCRIPTABLE void EntrySelected(const QString &entry); // since 13.10
47+
48+ void entryIsLockedChanged();
49+
50+private Q_SLOTS:
51+ void authenticationUserChangedHandler(const QString &user);
52+ void promptlessChangedHandler();
53+ void notifyPropertyChanged(const QString &propertyName, const QVariant &value);
54+
55+private:
56+ Greeter *m_greeter;
57+ QDBusConnection m_connection;
58+ QString m_path;
59+};
60+
61+#endif
plugins/LightDM/Greeter.cpp+1
@@ -88,6 +88,7 @@ void Greeter::authenticate(const QString &username)
8888 }
8989
9090 d->m_greeter->authenticate(username);
91+ Q_EMIT authenticationUserChanged(username);
9192}
9293
9394void Greeter::respond(const QString &response)
plugins/LightDM/Greeter.h+6−1
@@ -35,7 +35,7 @@ class Greeter : public QObject
3535 Q_OBJECT
3636
3737 Q_PROPERTY(bool authenticated READ isAuthenticated)
38− Q_PROPERTY(QString authenticationUser READ authenticationUser)
38+ Q_PROPERTY(QString authenticationUser READ authenticationUser NOTIFY authenticationUserChanged)
3939 Q_PROPERTY(bool promptless READ promptless NOTIFY promptlessChanged)
4040
4141public:
@@ -54,8 +54,13 @@ Q_SIGNALS:
5454 void showMessage(const QString &text, bool isError);
5555 void showPrompt(const QString &text, bool isSecret);
5656 void authenticationComplete();
57+ void authenticationUserChanged(const QString &user);
5758 void promptlessChanged();
5859
60+ // This signal is emitted by external agents like indicators, and the UI
61+ // should switch to this user if possible.
62+ void requestAuthenticationUser(const QString &user);
63+
5964private:
6065 GreeterPrivate * const d_ptr;
6166
plugins/LightDM/UsersModel.h+1−1
@@ -23,7 +23,7 @@
2323#ifndef UNITY_USERSMODEL_H
2424#define UNITY_USERSMODEL_H
2525
26−#include "plugins/Utils/qsortfilterproxymodelqml.h"
26+#include <qsortfilterproxymodelqml.h>
2727#include <QtCore/QObject>
2828
2929class UsersModel : public QSortFilterProxyModelQML
plugins/LightDM/plugin.cpp+14−2
@@ -18,20 +18,32 @@
1818 */
1919
2020#include "plugin.h"
21+#include "DBusGreeterList.h"
2122#include "Greeter.h"
2223#include "UsersModel.h"
2324#include <libusermetricsoutput/ColorTheme.h>
2425#include <libusermetricsoutput/UserMetrics.h>
2526#include <QLightDM/UsersModel>
2627
27−#include <QtCore/QAbstractItemModel>
28+#include <QAbstractItemModel>
29+#include <QDBusConnection>
2830#include <QtQml/qqml.h>
2931
32+static const char* GREETER_LIST_DBUS_PATH = "/list";
33+static const char* GREETER_DBUS_SERVICE = "com.canonical.UnityGreeter";
34+
3035static QObject *greeter_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
3136{
3237 Q_UNUSED(engine)
3338 Q_UNUSED(scriptEngine)
34− return new Greeter();
39+
40+ Greeter *greeter = new Greeter();
41+ QDBusConnection connection = QDBusConnection::sessionBus();
42+ DBusGreeterList *list = new DBusGreeterList(greeter, connection, GREETER_LIST_DBUS_PATH);
43+ connection.registerObject(GREETER_LIST_DBUS_PATH, list, QDBusConnection::ExportScriptableContents);
44+ connection.registerService(GREETER_DBUS_SERVICE);
45+
46+ return greeter;
3547}
3648
3749static QObject *users_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
plugins/ListViewWithPageHeader/qmldirdeleted−3
@@ -1,3 +0,0 @@
1−module ListViewWithPageHeader
2−plugin ListViewWithPageHeader-qml
3−typeinfo plugin.qmltypes
plugins/Ubuntu/Gestures/CMakeLists.txt+1
@@ -6,6 +6,7 @@ set(UbuntuGestureQml_SOURCES
66 AxisVelocityCalculator.cpp
77 Direction.cpp
88 DirectionalDragArea.cpp
9+ PressedOutsideNotifier.cpp
910 TimeSource.cpp
1011)
1112
plugins/Ubuntu/Gestures/PressedOutsideNotifier.cppnew file+119
@@ -0,0 +1,119 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "PressedOutsideNotifier.h"
18+
19+#include <QMouseEvent>
20+
21+PressedOutsideNotifier::PressedOutsideNotifier(QQuickItem *parent)
22+ : QQuickItem(parent)
23+{
24+ connect(this, &QQuickItem::enabledChanged,
25+ this, &PressedOutsideNotifier::setupOrTearDownEventFiltering);
26+
27+ m_signalEmissionTimer.setSingleShot(true);
28+ m_signalEmissionTimer.setInterval(0); // times out on the next iteration of the event loop
29+ connect(&m_signalEmissionTimer, &QTimer::timeout,
30+ this, &PressedOutsideNotifier::pressedOutside);
31+}
32+
33+bool PressedOutsideNotifier::eventFilter(QObject *watched, QEvent *event)
34+{
35+ Q_UNUSED(watched);
36+ Q_ASSERT(watched == m_filteredWindow);
37+
38+ // We are already going to emit pressedOutside() anyway, thus no need
39+ // for new checks.
40+ // This case takes place when a QTouchEvent comes in and isn't handled by any item,
41+ // causing QQuickWindow to synthesize a QMouseEvent out of it, which would
42+ // be filtered by us as well and count as a second press, which is wrong.
43+ if (m_signalEmissionTimer.isActive()) {
44+ return false;
45+ }
46+
47+ switch (event->type()) {
48+ case QEvent::MouseButtonPress: {
49+ QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
50+ QPointF p = mapFromScene(mouseEvent->windowPos());
51+ if (!contains(p)) {
52+ m_signalEmissionTimer.start();
53+ }
54+ break;
55+ }
56+ case QEvent::TouchBegin:
57+ processFilteredTouchBegin(static_cast<QTouchEvent*>(event));
58+ default:
59+ break;
60+ }
61+
62+ // let the event be handled further
63+ return false;
64+}
65+
66+void PressedOutsideNotifier::itemChange(ItemChange change, const ItemChangeData &value)
67+{
68+ if (change == QQuickItem::ItemSceneChange) {
69+ setupOrTearDownEventFiltering();
70+ }
71+
72+ QQuickItem::itemChange(change, value);
73+}
74+
75+void PressedOutsideNotifier::setupOrTearDownEventFiltering()
76+{
77+ if (isEnabled() && window()) {
78+ setupEventFiltering();
79+ } else if (m_filteredWindow) {
80+ tearDownEventFiltering();
81+ }
82+}
83+
84+void PressedOutsideNotifier::setupEventFiltering()
85+{
86+ QQuickWindow *currentWindow = window();
87+ Q_ASSERT(currentWindow != nullptr);
88+
89+ if (currentWindow == m_filteredWindow)
90+ return;
91+
92+ if (m_filteredWindow) {
93+ m_filteredWindow->removeEventFilter(this);
94+ }
95+
96+ currentWindow->installEventFilter(this);
97+ m_filteredWindow = currentWindow;
98+}
99+
100+void PressedOutsideNotifier::tearDownEventFiltering()
101+{
102+ m_filteredWindow->removeEventFilter(this);
103+ m_filteredWindow.clear();
104+}
105+
106+void PressedOutsideNotifier::processFilteredTouchBegin(QTouchEvent *event)
107+{
108+ const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints();
109+ for (int i = 0; i < touchPoints.count(); ++i) {
110+ const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i);
111+ if (touchPoint.state() == Qt::TouchPointPressed) {
112+ QPointF p = mapFromScene(touchPoint.pos());
113+ if (!contains(p)) {
114+ m_signalEmissionTimer.start();
115+ return;
116+ }
117+ }
118+ }
119+}
plugins/Ubuntu/Gestures/PressedOutsideNotifier.hnew file+62
@@ -0,0 +1,62 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef PRESSED_OUTSIDE_NOTIFIER_H
18+#define PRESSED_OUTSIDE_NOTIFIER_H
19+
20+#include <QQuickItem>
21+
22+#include <QQuickWindow>
23+#include <QPointer>
24+#include <QTimer>
25+
26+#include "UbuntuGesturesGlobal.h"
27+
28+/*
29+ Notifies when a point, mouse or touch, is pressed outside its area.
30+
31+ Only enable it while needed.
32+ */
33+class UBUNTUGESTURES_EXPORT PressedOutsideNotifier : public QQuickItem {
34+ Q_OBJECT
35+
36+public:
37+ PressedOutsideNotifier(QQuickItem * parent = nullptr);
38+
39+ // From QObject
40+ bool eventFilter(QObject *watched, QEvent *event) override;
41+
42+Q_SIGNALS:
43+ void pressedOutside();
44+
45+protected:
46+ void itemChange(ItemChange change, const ItemChangeData &value) override;
47+
48+private Q_SLOTS:
49+ void setupOrTearDownEventFiltering();
50+
51+private:
52+ void setupEventFiltering();
53+ void tearDownEventFiltering();
54+ void processFilteredTouchBegin(QTouchEvent *event);
55+
56+ QPointer<QQuickWindow> m_filteredWindow;
57+
58+ // Emits pressedOutside() signal on timeout
59+ QTimer m_signalEmissionTimer;
60+};
61+
62+#endif // PRESSED_OUTSIDE_NOTIFIER_H
plugins/Ubuntu/Gestures/plugin.cpp+2
@@ -18,6 +18,7 @@
1818#include "AxisVelocityCalculator.h"
1919#include "Direction.h"
2020#include "DirectionalDragArea.h"
21+#include "PressedOutsideNotifier.h"
2122
2223#include <qqml.h>
2324
@@ -32,4 +33,5 @@ void UbuntuGestureQmlPlugin::registerTypes(const char *uri)
3233 qmlRegisterSingletonType<Direction>(uri, 0, 1, "Direction", directionSingleton);
3334 qmlRegisterType<DirectionalDragArea>(uri, 0, 1, "DirectionalDragArea");
3435 qmlRegisterType<AxisVelocityCalculator>(uri, 0, 1, "AxisVelocityCalculator");
36+ qmlRegisterType<PressedOutsideNotifier>(uri, 0, 1, "PressedOutsideNotifier");
3537}
plugins/Unity/Indicators/CMakeLists.txt−1
@@ -36,7 +36,6 @@ set(IndicatorsQML_SOURCES
3636 unitymenumodelcache.cpp
3737 unitymenumodelstack.cpp
3838 visibleindicatorsmodel.cpp
39− timeformatter.cpp
4039)
4140add_definitions(-DUNITYINDICATORS_LIBRARY)
4241
plugins/Unity/Indicators/Messaging/qml/MessageMenuItemFactory.qml+93−60
@@ -24,124 +24,153 @@ import Unity.Indicators 0.1 as Indicators
2424import QMenuModel 0.1 as QMenuModel
2525
2626Indicators.BaseMenuItem {
27− id: menuItem
28− property var actionsDescription: menu ? menu.ext.xCanonicalMessageActions : undefined
27+ id: messageFactoryItem
28+ property var menuModel: null
29+ property QtObject menuData: null
30+ property int menuIndex: -1
2931
30− implicitHeight: contents.status == Loader.Ready ? contents.item.implicitHeight : 0
32+ property var extendedData: menuData && menuData.ext || undefined
33+ property var actionsDescription: getExtendedProperty(extendedData, "xCanonicalMessageActions", undefined)
3134
32− property var model: null
35+ onMenuModelChanged: {
36+ loadAttributes();
37+ }
38+ onMenuIndexChanged: {
39+ loadAttributes();
40+ }
3341
34− Loader {
35− id: contents
36− anchors.fill: parent
42+ function loadAttributes() {
43+ if (!menuModel || menuIndex == undefined) return;
3744
38− sourceComponent: loadMessage(actionsDescription);
45+ menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-time': 'int64',
46+ 'x-canonical-text': 'string',
47+ 'x-canonical-message-actions': 'variant',
48+ 'icon': 'icon',
49+ 'x-canonical-app-icon': 'icon'});
50+ }
3951
40− // Binding all properties for the item, to make sure that any change in the
41− // property will be propagated to the contents.item at any time
42− Binding {
43− target: contents.item
44− property: "menuSelected"
45− value: menuSelected
46− when: (contents.status == Loader.Ready)
52+ function getExtendedProperty(object, propertyName, defaultValue) {
53+ if (object && object.hasOwnProperty(propertyName)) {
54+ return object[propertyName];
4755 }
56+ return defaultValue;
57+ }
4858
49− Binding {
50− target: contents.item
51− property: "menu"
52− value: menu
53− when: (contents.status == Loader.Ready)
54− }
59+ implicitHeight: contents.status == Loader.Ready ? contents.item.implicitHeight : 0
5560
56− Connections {
57− target: contents.item ? contents.item : null
58− onSelectMenu: selectMenu()
59− onDeselectMenu: deselectMenu()
60− }
61+ Loader {
62+ id: contents
63+ objectName: "loader"
64+ anchors.fill: parent
65+
66+ sourceComponent: loadMessage(actionsDescription);
6167
6268 Component {
6369 id: simpleTextMessage
6470 SimpleTextMessage {
71+ objectName: "simpleTextMessage"
6572 // text
66− title: menu && menu.label ? menu.label : ""
67− time: menu ? menu.ext.xCanonicalTime : 0
68− message: menu && menu.ext.xCanonicalText ? menu.ext.xCanonicalText : ""
73+ title: menuData && menuData.label || ""
74+ time: getExtendedProperty(extendedData, "xCanonicalTime", 0)
75+ message: getExtendedProperty(extendedData, "xCanonicalText", "")
6976 // icons
70− avatar: menu && menu.ext.icon !== undefined ? menu.ext.icon : "qrc:/indicators/artwork/messaging/default_contact.png"
71− appIcon: menu && menu.ext.xCanonicalAppIcon !== undefined ? menu.ext.xCanonicalAppIcon : "qrc:/indicators/artwork/messaging/default_app.svg"
77+ avatar: getExtendedProperty(extendedData, "icon", "qrc:/indicators/artwork/messaging/default_contact.png")
78+ appIcon: getExtendedProperty(extendedData, "xCanonicalAppIcon", "qrc:/indicators/artwork/messaging/default_app.svg")
79+ // actions
80+ enabled: menuData && menuData.sensitive || false
7281
7382 onActivateApp: {
74− menuItem.model.activate(modelIndex, true);
83+ menuModel.activate(menuIndex, true);
84+ shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
7585 }
7686 onDismiss: {
77− menuItem.model.activate(modelIndex, false);
87+ menuModel.activate(menuIndex, false);
7888 }
89+
90+ menuSelected: messageFactoryItem.menuSelected
91+ onSelectMenu: messageFactoryItem.selectMenu()
92+ onDeselectMenu: messageFactoryItem.deselectMenu()
7993 }
8094 }
8195 Component {
8296 id: textMessage
8397 TextMessage {
98+ objectName: "textMessage"
99+ property var replyActionDescription: actionsDescription && actionsDescription.length > 0 ? actionsDescription[0] : undefined
100+
84101 property var replyAction: QMenuModel.UnityMenuAction {
85− model: menuItem.model
86− index: modelIndex
87− name: menu && actionsDescription[0].name ? actionsDescription[0].name : ""
102+ model: menuModel
103+ index: menuIndex
104+ name: getExtendedProperty(replyActionDescription, "name", "")
88105 }
89106
90107 // text
91− title: menu && menu.label ? menu.label : ""
92− time: menu ? menu.ext.xCanonicalTime : 0
93− message: menu && menu.ext.xCanonicalText ? menu.ext.xCanonicalText : ""
94− replyButtonText: actionsDescription && actionsDescription[0].label ? actionsDescription[0].label : "Send"
108+ title: menuData && menuData.label || ""
109+ time: getExtendedProperty(extendedData, "xCanonicalTime", 0)
110+ message: getExtendedProperty(extendedData, "xCanonicalText", "")
111+ replyButtonText: getExtendedProperty(replyActionDescription, "label", "Send")
95112 // icons
96− avatar: menu && menu.ext.icon !== undefined ? menu.ext.icon : "qrc:/indicators/artwork/messaging/default_contact.png"
97− appIcon: menu && menu.ext.xCanonicalAppIcon !== undefined ? menu.ext.xCanonicalAppIcon : "qrc:/indicators/artwork/messaging/default_app.svg"
113+ avatar: getExtendedProperty(extendedData, "icon", "qrc:/indicators/artwork/messaging/default_contact.png")
114+ appIcon: getExtendedProperty(extendedData, "xCanonicalAppIcon", "qrc:/indicators/artwork/messaging/default_app.svg")
98115 // actions
99116 replyEnabled: replyAction.valid && replyAction.enabled
117+ enabled: menuData && menuData.sensitive || false
100118
101119 onActivateApp: {
102− menuItem.model.activate(modelIndex, true);
120+ menuModel.activate(menuIndex, true);
121+ shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
103122 }
104123 onDismiss: {
105− menuItem.model.activate(modelIndex, false);
124+ menuModel.activate(menuIndex, false);
106125 }
107126 onReply: {
108127 replyAction.activate(value);
109128 }
129+
130+ menuSelected: messageFactoryItem.menuSelected
131+ onSelectMenu: messageFactoryItem.selectMenu()
132+ onDeselectMenu: messageFactoryItem.deselectMenu()
110133 }
111134 }
112135 Component {
113136 id: snapDecision
114137 SnapDecision {
138+ objectName: "snapDecision"
139+ property var activateActionDescription: actionsDescription && actionsDescription.length > 0 ? actionsDescription[0] : undefined
140+ property var replyActionDescription: actionsDescription && actionsDescription.length > 1 ? actionsDescription[1] : undefined
141+
115142 property var activateAction: QMenuModel.UnityMenuAction {
116− model: menuItem.model
117− index: modelIndex
118− name: menu && actionsDescription[0].name ? actionsDescription[0].name : ""
143+ model: menuModel
144+ index: menuIndex
145+ name: getExtendedProperty(activateActionDescription, "name", "")
119146 }
120147 property var replyAction: QMenuModel.UnityMenuAction {
121− model: menuItem.model
122− index: modelIndex
123− name: menu && actionsDescription[1].name ? actionsDescription[1].name : ""
148+ model: menuModel
149+ index: menuIndex
150+ name: getExtendedProperty(replyActionDescription, "name", "")
124151 }
125152
126153 // text
127− title: menu && menu.label ? menu.label : ""
128− time: menu ? menu.ext.xCanonicalTime : ""
129− message: menu && menu.ext.xCanonicalText ? menu.ext.xCanonicalText : ""
130− actionButtonText: actionsDescription && actionsDescription[0].label ? actionsDescription[0].label : "Call back"
131− replyButtonText: actionsDescription && actionsDescription[1].label ? actionsDescription[1].label : "Send"
132− replyMessages: actionsDescription && actionsDescription[1]["parameter-hint"] ? actionsDescription[1]["parameter-hint"] : ""
154+ title: menuData && menuData.label || ""
155+ time: getExtendedProperty(extendedData, "xCanonicalTime", 0)
156+ message: getExtendedProperty(extendedData, "xCanonicalText", "")
157+ actionButtonText: getExtendedProperty(activateActionDescription, "label", "Call back")
158+ replyButtonText: getExtendedProperty(replyActionDescription, "label", "Send")
159+ replyMessages: getExtendedProperty(replyActionDescription, "parameter-hint", "")
133160 // icons
134− avatar: menu && menu.ext.icon !== undefined ? menu.ext.icon : "qrc:/indicators/artwork/messaging/default_contact.png"
135− appIcon: menu && menu.ext.xCanonicalAppIcon !== undefined ? menu.ext.xCanonicalAppIcon : "qrc:/indicators/artwork/messaging/default_app.svg"
161+ avatar: getExtendedProperty(extendedData, "icon", "qrc:/indicators/artwork/messaging/default_contact.png")
162+ appIcon: getExtendedProperty(extendedData, "xCanonicalAppIcon", "qrc:/indicators/artwork/messaging/default_app.svg")
136163 // actions
137164 activateEnabled: activateAction.valid && activateAction.enabled
138165 replyEnabled: replyAction.valid && replyAction.enabled
166+ enabled: menuData && menuData.sensitive || false
139167
140168 onActivateApp: {
141− menuItem.model.activate(modelIndex, true);
169+ menuModel.activate(menuIndex, true);
170+ shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
142171 }
143172 onDismiss: {
144− menuItem.model.activate(modelIndex, false);
173+ menuModel.activate(menuIndex, false);
145174 }
146175 onActivate: {
147176 activateAction.activate();
@@ -149,6 +178,10 @@ Indicators.BaseMenuItem {
149178 onReply: {
150179 replyAction.activate(value);
151180 }
181+
182+ menuSelected: messageFactoryItem.menuSelected
183+ onSelectMenu: messageFactoryItem.selectMenu()
184+ onDeselectMenu: messageFactoryItem.deselectMenu()
152185 }
153186 }
154187 }
plugins/Unity/Indicators/Messaging/qml/SimpleTextMessage.qml+2−1
@@ -21,6 +21,7 @@
2121import QtQuick 2.0
2222import Ubuntu.Components 0.1
2323import Unity.Indicators 0.1
24+import Utils 0.1 as Utils
2425
2526HeroMessage {
2627 id: __heroMessage
@@ -50,7 +51,7 @@ HeroMessage {
5051 opacity: 0.0
5152 enabled: false
5253
53− TimeFormatter {
54+ Utils.TimeFormatter {
5455 id: timeFormatter
5556 time: __heroMessage.time
5657 format: "hh:mm - MMM dd"
plugins/Unity/Indicators/Messaging/qml/SnapDecision.qml+2−2
@@ -20,8 +20,8 @@
2020
2121import QtQuick 2.0
2222import Ubuntu.Components 0.1
23−import Unity.Indicators 0.1 as Indicators
2423import Unity.Indicators 0.1
24+import Utils 0.1 as Utils
2525
2626HeroMessage {
2727 id: snapDecision
@@ -59,7 +59,7 @@ HeroMessage {
5959 height: units.gu(4)
6060 opacity: 0.0
6161
62− TimeFormatter {
62+ Utils.TimeFormatter {
6363 id: timeFormatter
6464 time: snapDecision.time
6565 format: "hh:mm - MMM dd"
plugins/Unity/Indicators/Network/qml/AccessPoint.qml+2−2
@@ -30,7 +30,7 @@ Indicators.BaseMenuItem {
3030 property bool secure: false
3131 property bool adHoc: false
3232 property int signalStrength: 0
33− property alias text: label.text
33+ property alias label: _label.text
3434
3535 signal activate()
3636
@@ -89,7 +89,7 @@ Indicators.BaseMenuItem {
8989 }
9090
9191 Label {
92− id: label
92+ id: _label
9393 anchors {
9494 left: iconSignal.right
9595 leftMargin: units.gu(1)
plugins/Unity/Indicators/indicatorsmanager.cpp+1−1
@@ -24,7 +24,7 @@
2424#include <upstart.h>
2525#include <nih/alloc.h>
2626
27−#include "paths.h"
27+#include <paths.h>
2828
2929const QString profile = "phone";
3030
plugins/Unity/Indicators/indicatorsmodel.cpp+4−3
@@ -21,7 +21,8 @@
2121#include "indicatorsmanager.h"
2222#include "indicator.h"
2323#include "indicators.h"
24−#include "paths.h"
24+
25+#include <paths.h>
2526
2627#include <QQmlContext>
2728#include <QQmlEngine>
@@ -248,9 +249,9 @@ QVariant IndicatorsModel::data(const QModelIndex &index, int role) const
248249 }
249250 break;
250251 case IndicatorsModelRole::WidgetSource:
251− return shellAppDirectory()+"/Panel/Indicators/DefaultIndicatorWidget.qml";
252+ return qmlDirectory()+"/Panel/Indicators/DefaultIndicatorWidget.qml";
252253 case IndicatorsModelRole::PageSource:
253− return shellAppDirectory()+"/Panel/Indicators/DefaultIndicatorPage.qml";
254+ return qmlDirectory()+"/Panel/Indicators/DefaultIndicatorPage.qml";
254255 default:
255256 break;
256257 }
plugins/Unity/Indicators/plugin.cpp−2
@@ -33,7 +33,6 @@
3333#include "unitymenumodelcache.h"
3434#include "unitymenumodelstack.h"
3535#include "visibleindicatorsmodel.h"
36−#include "timeformatter.h"
3736
3837static QObject* menuModelCacheSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
3938 Q_UNUSED(engine);
@@ -52,7 +51,6 @@ void Indicators2Plugin::registerTypes(const char *uri)
5251 qmlRegisterType<RootActionState>(uri, 0, 1, "RootActionState");
5352 qmlRegisterType<ModelPrinter>(uri, 0, 1, "ModelPrinter");
5453 qmlRegisterType<VisibleIndicatorsModel>(uri, 0, 1, "VisibleIndicatorsModel");
55− qmlRegisterType<TimeFormatter>(uri, 0, 1, "TimeFormatter");
5654
5755 qmlRegisterSingletonType<UnityMenuModelCache>(uri, 0, 1, "UnityMenuModelCache", menuModelCacheSingleton);
5856
plugins/Unity/Indicators/qml/ButtonMenuItem.qml+1−1
@@ -26,7 +26,7 @@ BaseMenuItem {
2626 id: menuItem
2727 implicitHeight: units.gu(7)
2828
29− property alias text: button.text
29+ property alias buttonText: button.text
3030
3131 signal activate()
3232
plugins/Unity/Indicators/qml/IndicatorWidget.qmldeleted−28
@@ -1,28 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Nick Dedekind <nick.dedekind@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Unity.Indicators 0.1 as Indicators
22−
23−IndicatorBase {
24− id: indicatorWidget
25−
26− enabled: false
27− property int iconSize: height
28−}
plugins/Unity/Indicators/qml/MenuItemFactory.qml+157−89
@@ -22,11 +22,12 @@ import Unity.Indicators 0.1 as Indicators
2222import Unity.Indicators.Network 0.1 as ICNetwork
2323import Unity.Indicators.Messaging 0.1 as ICMessaging
2424import QMenuModel 0.1 as QMenuModel
25+import Ubuntu.Components 0.1
2526
2627Item {
2728 id: menuFactory
2829
29− property var model: null
30+ property var menuModel: null
3031
3132 property var _map: {
3233 "unity.widgets.systemsettings.tablet.volumecontrol" : sliderMenu,
@@ -49,38 +50,61 @@ Item {
4950 "unity.widgets.systemsettings.tablet.accesspoint" : accessPoint,
5051 }
5152
52− Component { id: divMenu; Indicators.DivMenuItem {} }
53+ function getExtendedProperty(object, propertyName, defaultValue) {
54+ if (object && object.hasOwnProperty(propertyName)) {
55+ return object[propertyName];
56+ }
57+ return defaultValue;
58+ }
59+
60+ Component {
61+ id: divMenu;
62+ Indicators.DivMenuItem {
63+ objectName: "divMenu"
64+ }
65+ }
5366
5467 Component {
5568 id: sliderMenu;
5669 Indicators.SliderMenuItem {
57− property QtObject menu: null
58−
59− text: menu && menu.label ? menu.label : ""
60− icon: menu && menu.icon ? menu.icon : ""
61− minIcon: menu && menu.ext.minIcon ? menu.ext.minIcon : ""
62− maxIcon: menu && menu.ext.maxIcon ? menu.ext.maxIcon : ""
63−
64− minimumValue: menu.ext.minValue ? menu.ext.minValue : 0.0
70+ objectName: "sliderMenu"
71+ property QtObject menuData: null
72+ property var menuModel: menuFactory.menuModel
73+ property int menuIndex: -1
74+ property var extendedData: menuData && menuData.ext || undefined
75+
76+ text: menuData && menuData.label || ""
77+ iconSource: menuData && menuData.icon || ""
78+ minIcon: getExtendedProperty(extendedData, "minIcon", "")
79+ maxIcon: getExtendedProperty(extendedData, "maxIcon", "")
80+
81+ minimumValue: getExtendedProperty(extendedData, "minValue", 0.0)
6582 maximumValue: {
66− var maximum = menu.ext.maxValue ? menu.ext.maxValue : 1.0
83+ var maximum = getExtendedProperty(extendedData, "maxValue", 1.0);
6784 if (maximum <= minimumValue) {
6885 return minimumValue + 1;
6986 }
7087 return maximum;
7188 }
72− value: menu ? menu.actionState : 0.0
73− enabled: menu ? menu.sensitive : false
89+ value: menuData && menuData.actionState || 0.0
90+ enabled: menuData && menuData.sensitive || false
7491
75− Component.onCompleted: {
76− model.loadExtendedAttributes(modelIndex, {'min-value': 'double',
77− 'max-value': 'double',
78− 'min-icon': 'icon',
79− 'max-icon': 'icon'});
92+ onMenuModelChanged: {
93+ loadAttributes();
94+ }
95+ onMenuIndexChanged: {
96+ loadAttributes();
8097 }
81−
8298 onChangeState: {
83− model.changeState(modelIndex, value);
99+ menuModel.changeState(menuIndex, value);
100+ }
101+
102+ function loadAttributes() {
103+ if (!menuModel || menuIndex == undefined) return;
104+ menuModel.loadExtendedAttributes(menuIndex, {'min-value': 'double',
105+ 'max-value': 'double',
106+ 'min-icon': 'icon',
107+ 'max-icon': 'icon'});
84108 }
85109 }
86110 }
@@ -88,50 +112,61 @@ Item {
88112 Component {
89113 id: buttonMenu;
90114 Indicators.ButtonMenuItem {
91− property QtObject menu: null
115+ objectName: "buttonMenu"
116+ property QtObject menuData: null
117+ property var menuModel: menuFactory.menuModel
118+ property int menuIndex: -1
92119
93− text: menu && menu.label ? menu.label : ""
94− enabled: menu ? menu.sensitive : false
120+ buttonText: menuData && menuData.label || ""
121+ enabled: menuData && menuData.sensitive || false
95122
96123 onActivate: {
97− model.activate(modelIndex);
124+ menuModel.activate(menuIndex);
125+ shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
98126 }
99127 }
100128 }
101129 Component {
102130 id: sectionMenu;
103131 Indicators.SectionMenuItem {
104− property QtObject menu: null
132+ objectName: "sectionMenu"
133+ property QtObject menuData: null
134+ property var menuIndex: undefined
105135
106− text: menu && menu.label ? menu.label : ""
136+ text: menuData && menuData.label || ""
107137 }
108138 }
109139
110140 Component {
111141 id: progressMenu;
112142 Indicators.ProgressMenuItem {
113− property QtObject menu: null
114−
115− text: menu && menu.label ? menu.label : ""
116− icon: menu ? menu.icon : ""
117− value : menu ? menu.actionState : 0.0
118− enabled: menu ? menu.sensitive : false
143+ objectName: "progressMenu"
144+ property QtObject menuData: null
145+ property int menuIndex: -1
146+
147+ text: menuData && menuData.label || ""
148+ iconSource: menuData && menuData.icon || ""
149+ value : menuData && menuData.actionState || 0.0
150+ enabled: menuData && menuData.sensitive || false
119151 }
120152 }
121153
122154 Component {
123155 id: standardMenu;
124156 Indicators.StandardMenuItem {
125− property QtObject menu: null
157+ objectName: "standardMenu"
158+ property QtObject menuData: null
159+ property int menuIndex: -1
126160
127− text: menu && menu.label ? menu.label : ""
128− icon: menu && menu.icon ? menu.icon : ""
129− checkable: menu ? (menu.isCheck || menu.isRadio) : false
130− checked: checkable ? menu.isToggled : false
131− enabled: menu ? menu.sensitive : false
161+ text: menuData && menuData.label || ""
162+ iconSource: menuData && menuData.icon || ""
163+ enabled: menuData && menuData.sensitive || false
164+ checkable: menuData ? (menuData.isCheck || menuData.isRadio) : false
165+ checked: checkable ? menuData.isToggled : false
132166
133167 onActivate: {
134− model.activate(modelIndex);
168+ menuModel.activate(menuIndex);
169+ shell.hideIndicatorMenu(UbuntuAnimation.BriskDuration);
135170 }
136171 }
137172 }
@@ -139,15 +174,18 @@ Item {
139174 Component {
140175 id: switchMenu;
141176 Indicators.SwitchMenuItem {
142− property QtObject menu: null
177+ objectName: "switchMenu"
178+ property QtObject menuData: null
179+ property int menuIndex: -1
143180
144− text: menu && menu.label ? menu.label : ""
145− icon: menu && menu.icon ? menu.icon : ""
146− checked: menu ? menu.isToggled : false
147− enabled: menu ? menu.sensitive : false
181+ text: menuData && menuData.label || ""
182+ iconSource: menuData && menuData.icon || ""
183+ enabled: menuData && menuData.sensitive || false
184+ checked: menuData ? menuData.isToggled : false
148185
149186 onActivate: {
150− model.activate(modelIndex);
187+ menuModel.activate(menuIndex);
188+ shell.hideIndicatorMenu(UbuntuAnimation.BriskDuration);
151189 }
152190 }
153191 }
@@ -155,13 +193,25 @@ Item {
155193 Component {
156194 id: wifiSection;
157195 Indicators.SectionMenuItem {
158− property QtObject menu: null
196+ objectName: "wifiSection"
197+ property QtObject menuData: null
198+ property var menuModel: menuFactory.menuModel
199+ property int menuIndex: -1
200+ property var extendedData: menuData && menuData.ext || undefined
201+
202+ text: menuData && menuData.label || ""
203+ busy: getExtendedProperty(extendedData, "xCanonicalBusyAction", false)
159204
160− text: menu && menu.label ? menu.label : ""
161− busy: menu ? menu.ext.xCanonicalBusyAction : false
205+ onMenuModelChanged: {
206+ loadAttributes();
207+ }
208+ onMenuIndexChanged: {
209+ loadAttributes();
210+ }
162211
163− Component.onCompleted: {
164− model.loadExtendedAttributes(modelIndex, {'x-canonical-busy-action': 'bool'});
212+ function loadAttributes() {
213+ if (!menuModel || menuIndex == undefined) return;
214+ menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-busy-action': 'bool'})
165215 }
166216 }
167217 }
@@ -169,27 +219,41 @@ Item {
169219 Component {
170220 id: accessPoint;
171221 ICNetwork.AccessPoint {
172− property QtObject menu: null
222+ objectName: "accessPoint"
223+ property QtObject menuData: null
224+ property var menuModel: menuFactory.menuModel
225+ property int menuIndex: -1
226+ property var extendedData: menuData && menuData.ext || undefined
227+
173228 property var strengthAction: QMenuModel.UnityMenuAction {
174− model: menuFactory.model ? menuFactory.model : null
175− index: modelIndex
176− name: menu ? menu.ext.xCanonicalWifiApStrengthAction : ""
229+ model: menuModel
230+ index: menuIndex
231+ name: getExtendedProperty(extendedData, "xCanonicalWifiApStrengthAction", "")
177232 }
178233
179− text: menu && menu.label ? menu.label : ""
180− secure: menu ? menu.ext.xCanonicalWifiApIsSecure : false
181− adHoc: menu ? menu.ext.xCanonicalWifiApIsAdhoc : false
182− checked: menu ? menu.isToggled : false
234+ label: menuData && menuData.label || ""
235+ enabled: menuData && menuData.sensitive || false
236+ secure: getExtendedProperty(extendedData, "xCanonicalWifiApIsSecure", false)
237+ adHoc: getExtendedProperty(extendedData, "xCanonicalWifiApIsAdhoc", false)
238+ checked: menuData ? menuData.isToggled : false
183239 signalStrength: strengthAction.valid ? strengthAction.state : 0
184− enabled: menu ? menu.sensitive : false
185240
186− Component.onCompleted: {
187− model.loadExtendedAttributes(modelIndex, {'x-canonical-wifi-ap-is-adhoc': 'bool',
188− 'x-canonical-wifi-ap-is-secure': 'bool',
189− 'x-canonical-wifi-ap-strength-action': 'string'});
241+ onMenuModelChanged: {
242+ loadAttributes();
243+ }
244+ onMenuIndexChanged: {
245+ loadAttributes();
190246 }
191247 onActivate: {
192− model.activate(modelIndex);
248+ menuModel.activate(menuIndex);
249+ shell.hideIndicatorMenu(UbuntuAnimation.BriskDuration);
250+ }
251+
252+ function loadAttributes() {
253+ if (!menuModel || menuIndex == undefined) return;
254+ menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-wifi-ap-is-adhoc': 'bool',
255+ 'x-canonical-wifi-ap-is-secure': 'bool',
256+ 'x-canonical-wifi-ap-strength-action': 'string'});
193257 }
194258 }
195259 }
@@ -197,37 +261,42 @@ Item {
197261 Component {
198262 id: messageItem
199263 ICMessaging.MessageMenuItemFactory {
200−
201− property QtObject menu: null
202− model: menuFactory.model ? menuFactory.model : null
203−
204− Component.onCompleted: {
205− model.loadExtendedAttributes(modelIndex, {'x-canonical-time': 'int64',
206− 'x-canonical-text': 'string',
207− 'x-canonical-message-actions': 'variant',
208− 'icon': 'icon',
209− 'x-canonical-app-icon': 'icon'});
210− }
264+ objectName: "messageItem"
265+ menuModel: menuFactory.menuModel
211266 }
212267 }
213268
214269 Component {
215270 id: groupedMessage
216271 ICMessaging.GroupedMessage {
217− property QtObject menu: null
218−
219− title: menu && menu.label ? menu.label : ""
220− count: menu && menu.actionState[0] ? menu.actionState[0] : "0"
221− appIcon: menu && menu.ext.icon !== undefined ? menu.ext.icon : "qrc:/indicators/artwork/messaging/default_app.svg"
222−
223− Component.onCompleted: {
224− model.loadExtendedAttributes(modelIndex, {'icon': 'icon'});
272+ objectName: "groupedMessage"
273+ property QtObject menuData: null
274+ property var menuModel: menuFactory.menuModel
275+ property int menuIndex: -1
276+ property var extendedData: menuData && menuData.ext || undefined
277+
278+ title: menuData && menuData.label || ""
279+ appIcon: getExtendedProperty(extendedData, "icon", "qrc:/indicators/artwork/messaging/default_app.svg")
280+ count: menuData && menuData.actionState.length > 0 ? menuData.actionState[0] : "0"
281+ enabled: menuData && menuData.sensitive || false
282+
283+ onMenuModelChanged: {
284+ loadAttributes();
285+ }
286+ onMenuIndexChanged: {
287+ loadAttributes();
225288 }
226289 onActivateApp: {
227− model.activate(modelIndex, true);
290+ menuModel.activate(menuIndex, true);
291+ shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
228292 }
229293 onDismiss: {
230− model.activate(modelIndex, false);
294+ menuModel.activate(menuIndex, false);
295+ }
296+
297+ function loadAttributes() {
298+ if (!menuModel || menuIndex == undefined) return;
299+ menuModel.loadExtendedAttributes(modelIndex, {'icon': 'icon'});
231300 }
232301 }
233302 }
@@ -238,10 +307,9 @@ Item {
238307 if (component !== undefined) {
239308 return component;
240309 }
241− } else {
242− if (modelData.isSeparator) {
243− return divMenu;
244− }
310+ }
311+ if (modelData.isSeparator) {
312+ return divMenu;
245313 }
246314 return standardMenu;
247315 }
plugins/Unity/Indicators/qml/qmldir−2
@@ -9,8 +9,6 @@ DivMenuItem 0.1 DivMenuItem.qml
99FramedMenuItem 0.1 FramedMenuItem.qml
1010HLine 0.1 HLine.qml
1111IndicatorBase 0.1 IndicatorBase.qml
12−IndicatorPage 0.1 IndicatorPage.qml
13−IndicatorWidget 0.1 IndicatorWidget.qml
1412MenuActionBinding 0.1 MenuActionBinding.qml
1513MenuItemFactory 0.1 MenuItemFactory.qml
1614ProgressMenuItem 0.1 ProgressMenuItem.qml
plugins/Unity/Launcher/backend/launcherbackend.cpp+6−6
@@ -26,6 +26,7 @@
2626#include <QFileInfo>
2727#include <QGSettings>
2828#include <QDebug>
29+#include <QStandardPaths>
2930
3031class LauncherBackendItem
3132{
@@ -182,8 +183,10 @@ void LauncherBackend::syncFromAccounts()
182183
183184 if (m_accounts && !m_user.isEmpty()) {
184185 QVariant variant = m_accounts->getUserProperty(m_user, "com.canonical.unity.AccountsService", "launcher-items");
185− apps = qdbus_cast<QList<QVariantMap>>(variant.value<QDBusArgument>());
186− defaults = isDefaultsItem(apps);
186+ if (variant.isValid() && variant.canConvert<QDBusArgument>()) {
187+ apps = qdbus_cast<QList<QVariantMap>>(variant.value<QDBusArgument>());
188+ defaults = isDefaultsItem(apps);
189+ }
187190 }
188191
189192 if (m_accounts && defaults) { // Checking accounts as it'll be null when !useStorage
@@ -232,10 +235,7 @@ QString LauncherBackend::findDesktopFile(const QString &appId) const
232235 int dashPos = -1;
233236 QString helper = appId;
234237
235− QStringList searchDirs;
236− searchDirs << QDir::homePath() + "/.local/share/applications";
237− searchDirs << "/usr/share/applications";
238−
238+ QStringList searchDirs = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation);
239239#ifdef LAUNCHER_TESTING
240240 searchDirs << "";
241241#endif
plugins/Utils/CMakeLists.txt+1
@@ -16,6 +16,7 @@ set(QMLPLUGIN_SRC
1616 mediaartcache.cpp
1717 qlimitproxymodelqml.cpp
1818 qsortfilterproxymodelqml.cpp
19+ timeformatter.cpp
1920 unitymenumodelpaths.cpp
2021 plugin.cpp
2122 )
plugins/Utils/plugin.cpp+3
@@ -30,6 +30,7 @@
3030#include "bottombarvisibilitycommunicatorshell.h"
3131#include "qlimitproxymodelqml.h"
3232#include "qsortfilterproxymodelqml.h"
33+#include "timeformatter.h"
3334#include "unitymenumodelpaths.h"
3435
3536static const char* BOTTOM_BAR_VISIBILITY_COMMUNICATOR_DBUS_PATH = "/BottomBarVisibilityCommunicator";
@@ -42,6 +43,8 @@ void UtilsPlugin::registerTypes(const char *uri)
4243 qmlRegisterType<QLimitProxyModelQML>(uri, 0, 1, "LimitProxyModel");
4344 qmlRegisterType<QSortFilterProxyModelQML>(uri, 0, 1, "SortFilterProxyModel");
4445 qmlRegisterType<UnityMenuModelPaths>(uri, 0, 1, "UnityMenuModelPaths");
46+ qmlRegisterType<TimeFormatter>(uri, 0, 1, "TimeFormatter");
47+ qmlRegisterType<GDateTimeFormatter>(uri, 0, 1, "GDateTimeFormatter");
4548 qmlRegisterUncreatableType<BottomBarVisibilityCommunicatorShell>(uri, 0, 1, "BottomBarVisibilityCommunicatorShell", "Can't create BottomBarVisibilityCommunicatorShell");
4649}
4750
plugins/Utils/qsortfilterproxymodelqml.cpp+12
@@ -68,6 +68,18 @@ QSortFilterProxyModelQML::setModel(QAbstractItemModel *itemModel)
6868 }
6969}
7070
71+QVariantMap
72+QSortFilterProxyModelQML::get(int row)
73+{
74+ QVariantMap res;
75+ const QHash<int, QByteArray> roles = roleNames();
76+ auto it = roles.begin();
77+ for ( ; it != roles.end(); ++it) {
78+ res[*it] = data(row, it.key());
79+ }
80+ return res;
81+}
82+
7183QVariant
7284QSortFilterProxyModelQML::data(int row, int role)
7385{
plugins/Utils/qsortfilterproxymodelqml.h+1
@@ -31,6 +31,7 @@ class QSortFilterProxyModelQML : public QSortFilterProxyModel
3131public:
3232 explicit QSortFilterProxyModelQML(QObject *parent = 0);
3333
34+ Q_INVOKABLE QVariantMap get(int row); // Use with caution, it can be slow to query all the roles
3435 Q_INVOKABLE QVariant data(int row, int role);
3536 Q_INVOKABLE int count();
3637 Q_INVOKABLE int findFirst(int role, const QVariant& value) const;
plugins/Unity/Indicators/timeformatter.cpp → plugins/Utils/timeformatter.cpprenamed+30−1
@@ -167,6 +167,35 @@ void TimeFormatter::setTime(qint64 time)
167167
168168void TimeFormatter::update()
169169{
170− priv->timeString = QDateTime::fromMSecsSinceEpoch(priv->time / 1000).toString(priv->format);
170+ priv->timeString = formatTime();
171171 Q_EMIT timeStringChanged(priv->timeString);
172172}
173+
174+QString TimeFormatter::formatTime() const
175+{
176+ return QDateTime::fromMSecsSinceEpoch(time() / 1000).toString(format());
177+}
178+
179+GDateTimeFormatter::GDateTimeFormatter(QObject* parent)
180+: TimeFormatter(parent)
181+{
182+}
183+
184+QString GDateTimeFormatter::formatTime() const
185+{
186+ gchar* time_string;
187+ GDateTime* datetime;
188+ QByteArray formatBytes = format().toUtf8();
189+
190+ datetime = g_date_time_new_from_unix_local(time());
191+ if (!datetime) {
192+ return "";
193+ }
194+
195+ time_string = g_date_time_format(datetime, formatBytes.constData());
196+ QString formattedTime(QString::fromUtf8(time_string));
197+
198+ g_free(time_string);
199+ g_date_time_unref(datetime);
200+ return formattedTime;
201+}
plugins/Unity/Indicators/timeformatter.h → plugins/Utils/timeformatter.hrenamed+15−3
@@ -19,10 +19,10 @@
1919#ifndef TIME_FORMATTER_H
2020#define TIME_FORMATTER_H
2121
22−#include "unityindicatorsglobal.h"
2322#include <QObject>
2423
25−class UNITYINDICATORS_EXPORT TimeFormatter : public QObject
24+// TODO - bug #1260728
25+class TimeFormatter : public QObject
2626{
2727 Q_OBJECT
2828 Q_PROPERTY(QString format READ format WRITE setFormat NOTIFY formatChanged)
@@ -31,7 +31,7 @@ class UNITYINDICATORS_EXPORT TimeFormatter : public QObject
3131
3232public:
3333 TimeFormatter(QObject *parent = 0);
34− ~TimeFormatter();
34+ virtual ~TimeFormatter();
3535
3636 QString format() const;
3737 QString timeString() const;
@@ -47,8 +47,20 @@ Q_SIGNALS:
4747 void timeStringChanged(const QString &timeString);
4848 void timeChanged(qint64 time);
4949
50+protected:
51+ virtual QString formatTime() const;
52+
5053private:
5154 struct TimeFormatterPrivate *priv;
5255};
5356
57+class GDateTimeFormatter : public TimeFormatter
58+{
59+public:
60+ GDateTimeFormatter(QObject *parent = 0);
61+
62+protected:
63+ virtual QString formatTime() const;
64+};
65+
5466#endif
po/ar.po+15−93
@@ -7,8 +7,8 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
11−"PO-Revision-Date: 2013-11-15 12:29+0000\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11+"PO-Revision-Date: 2013-12-05 06:55+0000\n"
1212"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
1313"Language-Team: Arabic <ar@li.org>\n"
1414"MIME-Version: 1.0\n"
@@ -16,76 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
1818"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
19−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
20−"X-Generator: Launchpad (build 16831)\n"
21−
22−#: Applications/applications.js:23
23−msgid "Phone"
24−msgstr "الهاتف"
25−
26−#: Applications/applications.js:29
27−msgid "Camera"
28−msgstr "الكاميرا"
29−
30−#: Applications/applications.js:35
31−msgid "Gallery"
32−msgstr "المعرض"
33−
34−#: Applications/applications.js:40
35−msgid "Facebook"
36−msgstr "فيسبوك"
37−
38−#: Applications/applications.js:46
39−msgid "Browser"
40−msgstr "المتصفح"
41−
42−#: Applications/applications.js:51
43−msgid "Twitter"
44−msgstr "تويتر"
45−
46−#: Applications/applications.js:57
47−msgid "GMail"
48−msgstr "جي ميل"
49−
50−#: Applications/applications.js:62
51−msgid "Weather"
52−msgstr "الطقس"
53−
54−#: Applications/applications.js:68
55−msgid "Notepad"
56−msgstr "المذكرة"
57−
58−#: Applications/applications.js:74
59−msgid "Calendar"
60−msgstr "التقويم"
61−
62−#: Applications/applications.js:80
63−msgid "Media Player"
64−msgstr "مشغّل الوسائط"
65−
66−#: Applications/applications.js:86
67−msgid "Evernote"
68−msgstr "Evernote"
69−
70−#: Applications/applications.js:91
71−msgid "Map"
72−msgstr "الخريطة"
73−
74−#: Applications/applications.js:96
75−msgid "Pinterest"
76−msgstr "Pinterest"
77−
78−#: Applications/applications.js:101
79−msgid "SoundCloud"
80−msgstr "SoundCloud"
81−
82−#: Applications/applications.js:106
83−msgid "Wikipedia"
84−msgstr "ويكيبيديا"
85−
86−#: Applications/applications.js:111
87−msgid "YouTube"
88−msgstr "يوتيوب"
19+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
20+"X-Generator: Launchpad (build 16877)\n"
8921
9022#: Components/EdgeDemoOverlay.qml:151
9123msgid "Skip intro"
@@ -136,20 +68,22 @@ msgstr ""
13668"لقد أتقنت الآن إيماءات الحواف ويمكنك البدء باستخدام الهاتف<br><br>انقر في أي "
13769"مكان للبدء"
13870
139−#: Components/PageHeader.qml:345
71+#: Components/PageHeader.qml:364
14072msgid "Recent searches"
14173msgstr "عمليات البحث الأخيرة"
14274
143−#. TRANSLATORS: Number of persons who rated this app
75+#: Dash/Apps/AppPreview.qml:135
76+msgid "Rate this"
77+msgstr "قيّم ذلك"
78+
14479#. TRANSLATORS: Number of persons who rated this app/video/whatever
145−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
80+#: Dash/Previews/Header.qml:93
14681#, qt-format
14782msgid "(%1)"
14883msgstr "(%1)"
14984
150−#. TRANSLATORS: Number of persons who wrote reviews for this app
15185#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
152−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
86+#: Dash/Previews/Header.qml:105
15387#, qt-format
15488msgid "%1 review"
15589msgid_plural "%1 reviews"
@@ -160,10 +94,6 @@ msgstr[3] "%1 تعليقات"
16094msgstr[4] "%1 تعليقا"
16195msgstr[5] "%1 تعليق"
16296
163−#: Dash/Apps/AppPreview.qml:135
164−msgid "Rate this"
165−msgstr "قيّم ذلك"
166−
16797#: Dash/Previews/Reviews.qml:74
16898msgid "Add a review"
16999msgstr "أضف تعليق"
@@ -180,7 +110,7 @@ msgstr "أرسل"
180110msgid "Comments:"
181111msgstr "التعليقات:"
182112
183−#: Greeter/Lockscreen.qml:146
113+#: Greeter/Lockscreen.qml:149
184114msgid "Emergency Call"
185115msgstr "مكالمة طوارئ"
186116
@@ -224,21 +154,13 @@ msgstr "ابحث"
224154#: plugins/Unity/Launcher/launcheritem.cpp:43
225155#: plugins/Unity/Launcher/launcheritem.cpp:73
226156msgid "Lock to Launcher"
227−msgstr ""
157+msgstr "ثبّت في الشريط"
228158
229159#: plugins/Unity/Launcher/launcheritem.cpp:73
230160msgid "Unlock from Launcher"
231−msgstr ""
232−
233−#: plugins/Unity/scope.cpp:408
234−msgid "Sorry, there is nothing that matches your search."
235−msgstr "عذراً، لا يوجد ما يطابق بحثك."
236−
237−#: plugins/Unity/showallfilteroption.cpp:41
238−msgid "All"
239−msgstr "الكل"
161+msgstr "فُك التثبيت من الشريط"
240162
241−#: Shell.qml:441
163+#: Shell.qml:439
242164#, qt-format
243165msgid "Please enter %1"
244166msgstr "من فضلك أدخِل %1"
po/ast.po+16−94
@@ -7,84 +7,16 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
11−"PO-Revision-Date: 2013-10-03 14:02+0000\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11+"PO-Revision-Date: 2013-12-11 20:45+0000\n"
1212"Last-Translator: ivarela <ivarela@ubuntu.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"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Teléfonu"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Cámara"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "Galería"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "Facebook"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "Navegador"
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr "Twitter"
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr "GMail"
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "Meteoroloxía"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Bloc de notes"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Calendariu"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "Reproductor multimedia"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr "Evernote"
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "Map"
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr "Pinterest"
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr "SoundCloud"
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr "Wikipedia"
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr "YouTube"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -136,30 +68,28 @@ msgstr ""
13668"Agora domines los xestos de berbesos y pues usar el teléfonu<br><br>Toca la "
13769"pantalla pa entamar"
13870
139−#: Components/PageHeader.qml:345
71+#: Components/PageHeader.qml:364
14072msgid "Recent searches"
14173msgstr "Busques recientes"
14274
143−#. TRANSLATORS: Number of persons who rated this app
75+#: Dash/Apps/AppPreview.qml:135
76+msgid "Rate this"
77+msgstr "Valorar esto"
78+
14479#. TRANSLATORS: Number of persons who rated this app/video/whatever
145−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
80+#: Dash/Previews/Header.qml:93
14681#, qt-format
14782msgid "(%1)"
14883msgstr "(%1)"
14984
150−#. TRANSLATORS: Number of persons who wrote reviews for this app
15185#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
152−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
86+#: Dash/Previews/Header.qml:105
15387#, qt-format
15488msgid "%1 review"
15589msgid_plural "%1 reviews"
15690msgstr[0] "%1 reseña"
15791msgstr[1] "%1 reseñes"
15892
159−#: Dash/Apps/AppPreview.qml:135
160−msgid "Rate this"
161−msgstr "Valorar esto"
162−
16393#: Dash/Previews/Reviews.qml:74
16494msgid "Add a review"
16595msgstr "Amestar una reseña"
@@ -176,7 +106,7 @@ msgstr "Unviar"
176106msgid "Comments:"
177107msgstr "Comentarios:"
178108
179−#: Greeter/Lockscreen.qml:146
109+#: Greeter/Lockscreen.qml:149
180110msgid "Emergency Call"
181111msgstr "Llamada d'emerxencia"
182112
@@ -211,7 +141,7 @@ msgstr "Falando…"
211141
212142#: Notifications/NotificationMenuItemFactory.qml:89
213143msgid "Show password"
214−msgstr ""
144+msgstr "Amosar contraseña"
215145
216146#: Panel/SearchIndicator.qml:27
217147msgid "Search"
@@ -220,21 +150,13 @@ msgstr "Guetar"
220150#: plugins/Unity/Launcher/launcheritem.cpp:43
221151#: plugins/Unity/Launcher/launcheritem.cpp:73
222152msgid "Lock to Launcher"
223−msgstr ""
153+msgstr "Caltener nel Llanzador"
224154
225155#: plugins/Unity/Launcher/launcheritem.cpp:73
226156msgid "Unlock from Launcher"
227−msgstr ""
228−
229−#: plugins/Unity/scope.cpp:408
230−msgid "Sorry, there is nothing that matches your search."
231−msgstr "Sentímoslo, nun hai res que concase cola gueta"
232−
233−#: plugins/Unity/showallfilteroption.cpp:41
234−msgid "All"
235−msgstr "Too"
157+msgstr "Nun caltener nel llanzador"
236158
237−#: Shell.qml:441
159+#: Shell.qml:439
238160#, qt-format
239161msgid "Please enter %1"
240162msgstr "Introduz %1"
po/az.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
1111"PO-Revision-Date: 2013-06-26 23:48+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Azerbaijani <az@li.org>\n"
@@ -15,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr ""
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr ""
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr ""
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr ""
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr ""
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr ""
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr ""
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr ""
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr ""
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr ""
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr ""
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr "Son axtarışlar"
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr ""
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] ""
15387msgstr[1] ""
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172102msgid "Comments:"
173103msgstr ""
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177107msgstr ""
178108
@@ -222,15 +152,7 @@ msgstr ""
222152msgid "Unlock from Launcher"
223153msgstr ""
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "Bağışlayın, amma axtarışınıza heç bir nəticə uyğun gəlmir."
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236158msgstr ""
po/bg.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
1111"PO-Revision-Date: 2013-06-27 00:06+0000\n"
1212"Last-Translator: Miroslav E. Hadzhiev (Хаджиев) "
1313"<miroslav.hadzhiev@gmail.com>\n"
@@ -16,76 +16,8 @@ msgstr ""
1616"Content-Type: text/plain; charset=UTF-8\n"
1717"Content-Transfer-Encoding: 8bit\n"
1818"Plural-Forms: nplurals=2; plural=n != 1;\n"
19−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
20−"X-Generator: Launchpad (build 16831)\n"
21−
22−#: Applications/applications.js:23
23−msgid "Phone"
24−msgstr "Телефон"
25−
26−#: Applications/applications.js:29
27−msgid "Camera"
28−msgstr "Камера"
29−
30−#: Applications/applications.js:35
31−msgid "Gallery"
32−msgstr "Колекция"
33−
34−#: Applications/applications.js:40
35−msgid "Facebook"
36−msgstr "Фейсбук"
37−
38−#: Applications/applications.js:46
39−msgid "Browser"
40−msgstr "Браузър"
41−
42−#: Applications/applications.js:51
43−msgid "Twitter"
44−msgstr "Туитър"
45−
46−#: Applications/applications.js:57
47−msgid "GMail"
48−msgstr "Е-поща от Гугъл"
49−
50−#: Applications/applications.js:62
51−msgid "Weather"
52−msgstr "Метеоусловия"
53−
54−#: Applications/applications.js:68
55−msgid "Notepad"
56−msgstr "Бележник"
57−
58−#: Applications/applications.js:74
59−msgid "Calendar"
60−msgstr "Календар"
61−
62−#: Applications/applications.js:80
63−msgid "Media Player"
64−msgstr "Мултимедиен плеър"
65−
66−#: Applications/applications.js:86
67−msgid "Evernote"
68−msgstr ""
69−
70−#: Applications/applications.js:91
71−msgid "Map"
72−msgstr "Карта"
73−
74−#: Applications/applications.js:96
75−msgid "Pinterest"
76−msgstr ""
77−
78−#: Applications/applications.js:101
79−msgid "SoundCloud"
80−msgstr ""
81−
82−#: Applications/applications.js:106
83−msgid "Wikipedia"
84−msgstr "Уикипедия"
85−
86−#: Applications/applications.js:111
87−msgid "YouTube"
88−msgstr "YouTube"
19+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
20+"X-Generator: Launchpad (build 16877)\n"
8921
9022#: Components/EdgeDemoOverlay.qml:151
9123msgid "Skip intro"
@@ -133,30 +65,28 @@ msgid ""
13365"phone<br><br>Tap anywhere to start"
13466msgstr ""
13567
136−#: Components/PageHeader.qml:345
68+#: Components/PageHeader.qml:364
13769msgid "Recent searches"
13870msgstr "Скорошни търсения"
13971
140−#. TRANSLATORS: Number of persons who rated this app
72+#: Dash/Apps/AppPreview.qml:135
73+msgid "Rate this"
74+msgstr ""
75+
14176#. TRANSLATORS: Number of persons who rated this app/video/whatever
142−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
77+#: Dash/Previews/Header.qml:93
14378#, qt-format
14479msgid "(%1)"
14580msgstr ""
14681
147−#. TRANSLATORS: Number of persons who wrote reviews for this app
14882#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
149−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
83+#: Dash/Previews/Header.qml:105
15084#, qt-format
15185msgid "%1 review"
15286msgid_plural "%1 reviews"
15387msgstr[0] ""
15488msgstr[1] ""
15589
156−#: Dash/Apps/AppPreview.qml:135
157−msgid "Rate this"
158−msgstr ""
159−
16090#: Dash/Previews/Reviews.qml:74
16191msgid "Add a review"
16292msgstr ""
@@ -173,7 +103,7 @@ msgstr ""
173103msgid "Comments:"
174104msgstr ""
175105
176−#: Greeter/Lockscreen.qml:146
106+#: Greeter/Lockscreen.qml:149
177107msgid "Emergency Call"
178108msgstr ""
179109
@@ -223,15 +153,7 @@ msgstr ""
223153msgid "Unlock from Launcher"
224154msgstr ""
225155
226−#: plugins/Unity/scope.cpp:408
227−msgid "Sorry, there is nothing that matches your search."
228−msgstr "Съжаляваме, няма нищо, което да отговаря на вашето търсене."
229−
230−#: plugins/Unity/showallfilteroption.cpp:41
231−msgid "All"
232−msgstr ""
233−
234−#: Shell.qml:441
156+#: Shell.qml:439
235157#, qt-format
236158msgid "Please enter %1"
237159msgstr ""
po/ca.po+17−95
@@ -7,84 +7,16 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
11−"PO-Revision-Date: 2013-09-28 07:38+0000\n"
12−"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11+"PO-Revision-Date: 2014-01-10 07:45+0000\n"
12+"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
1313"Language-Team: Catalan <ca@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Telèfon"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Càmera"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "Galeria"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "Facebook"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "Navegador"
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr "Twitter"
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr "GMail"
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "El temps"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Bloc de notes"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Calendari"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "Reproductor multimèdia"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr "Evernote"
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "Mapa"
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr "Pinterest"
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr "SoundCloud"
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr "Viquipèdia"
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr "YouTube"
18+"X-Launchpad-Export-Date: 2014-01-11 06:38+0000\n"
19+"X-Generator: Launchpad (build 16890)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -138,30 +70,28 @@ msgid ""
13870"phone<br><br>Tap anywhere to start"
13971msgstr ""
14072
141−#: Components/PageHeader.qml:345
73+#: Components/PageHeader.qml:364
14274msgid "Recent searches"
14375msgstr "Cerques recents"
14476
145−#. TRANSLATORS: Number of persons who rated this app
77+#: Dash/Apps/AppPreview.qml:135
78+msgid "Rate this"
79+msgstr ""
80+
14681#. TRANSLATORS: Number of persons who rated this app/video/whatever
147−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
82+#: Dash/Previews/Header.qml:93
14883#, qt-format
14984msgid "(%1)"
15085msgstr "(%1)"
15186
152−#. TRANSLATORS: Number of persons who wrote reviews for this app
15387#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
154−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
88+#: Dash/Previews/Header.qml:105
15589#, qt-format
15690msgid "%1 review"
15791msgid_plural "%1 reviews"
15892msgstr[0] "%1 ressenya"
15993msgstr[1] "%1 ressenyes"
16094
161−#: Dash/Apps/AppPreview.qml:135
162−msgid "Rate this"
163−msgstr ""
164−
16595#: Dash/Previews/Reviews.qml:74
16696msgid "Add a review"
16797msgstr "Afegiu una ressenya"
@@ -178,7 +108,7 @@ msgstr "Envia"
178108msgid "Comments:"
179109msgstr "Comentaris:"
180110
181−#: Greeter/Lockscreen.qml:146
111+#: Greeter/Lockscreen.qml:149
182112msgid "Emergency Call"
183113msgstr "Trucada d'emergència"
184114
@@ -213,7 +143,7 @@ msgstr "S'està parlant..."
213143
214144#: Notifications/NotificationMenuItemFactory.qml:89
215145msgid "Show password"
216−msgstr ""
146+msgstr "Mostra la contrasenya"
217147
218148#: Panel/SearchIndicator.qml:27
219149msgid "Search"
@@ -222,21 +152,13 @@ msgstr "Cerca"
222152#: plugins/Unity/Launcher/launcheritem.cpp:43
223153#: plugins/Unity/Launcher/launcheritem.cpp:73
224154msgid "Lock to Launcher"
225−msgstr ""
155+msgstr "Mantén-la al llançador"
226156
227157#: plugins/Unity/Launcher/launcheritem.cpp:73
228158msgid "Unlock from Launcher"
229−msgstr ""
230−
231−#: plugins/Unity/scope.cpp:408
232−msgid "Sorry, there is nothing that matches your search."
233−msgstr "No hi ha res que coincideixi amb la cerca"
234−
235−#: plugins/Unity/showallfilteroption.cpp:41
236−msgid "All"
237−msgstr ""
159+msgstr "No la mantinguis al llançador"
238160
239−#: Shell.qml:441
161+#: Shell.qml:439
240162#, qt-format
241163msgid "Please enter %1"
242164msgstr "Introduïu %1"
po/cs.po+19−95
@@ -7,84 +7,16 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
11−"PO-Revision-Date: 2013-10-08 08:09+0000\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11+"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"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Telefon"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Fotoaparát"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "Galerie"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "Facebook"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "Prohlížeč"
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr "Twitter"
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr "GMail"
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "Počasí"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Poznámkový blok"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Kalendář"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "Přehrávač multimédií"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr "Evernote"
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "Mapa"
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr "Pinterest"
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr "Hudební Cloud"
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr "Wikipedie"
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr "YouTube"
18+"X-Launchpad-Export-Date: 2014-01-09 05:41+0000\n"
19+"X-Generator: Launchpad (build 16884)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -112,7 +44,7 @@ msgstr "Uzavřít"
11244
11345#: Components/EdgeDemo.qml:171
11446msgid "Swipe up again to close the settings screen"
115−msgstr ""
47+msgstr "Přetažením nahoru dojde k uzavření obrazovky nastavení"
11648
11749#: Components/EdgeDemo.qml:198
11850msgid "Left edge"
@@ -131,21 +63,25 @@ msgid ""
13163"You have now mastered the edge gestures and can start using the "
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
66+"Nyní jste si osvojili gesta potřebná k ovládání telefonu, můžete ho začít "
67+"používat <br><br>Klepnutím kdekoli začnete"
13468
135−#: Components/PageHeader.qml:345
69+#: Components/PageHeader.qml:364
13670msgid "Recent searches"
13771msgstr "Poslední vyhledávání"
13872
139−#. TRANSLATORS: Number of persons who rated this app
73+#: Dash/Apps/AppPreview.qml:135
74+msgid "Rate this"
75+msgstr "Ohodnoťte to"
76+
14077#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
78+#: Dash/Previews/Header.qml:93
14279#, qt-format
14380msgid "(%1)"
14481msgstr "(%1)"
14582
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14783#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
84+#: Dash/Previews/Header.qml:105
14985#, qt-format
15086msgid "%1 review"
15187msgid_plural "%1 reviews"
@@ -153,10 +89,6 @@ msgstr[0] "%1 recenze"
15389msgstr[1] "%1 recenze"
15490msgstr[2] "%1 recenzí"
15591
156−#: Dash/Apps/AppPreview.qml:135
157−msgid "Rate this"
158−msgstr "Ohodnoťte to"
159−
16092#: Dash/Previews/Reviews.qml:74
16193msgid "Add a review"
16294msgstr "Přidat recenzi"
@@ -173,7 +105,7 @@ msgstr "Odeslat"
173105msgid "Comments:"
174106msgstr "Komentáře:"
175107
176−#: Greeter/Lockscreen.qml:146
108+#: Greeter/Lockscreen.qml:149
177109msgid "Emergency Call"
178110msgstr "Tísňové volání"
179111
@@ -208,7 +140,7 @@ msgstr "Mluvte..."
208140
209141#: Notifications/NotificationMenuItemFactory.qml:89
210142msgid "Show password"
211−msgstr ""
143+msgstr "Zobrazit heslo"
212144
213145#: Panel/SearchIndicator.qml:27
214146msgid "Search"
@@ -217,21 +149,13 @@ msgstr "Hledat"
217149#: plugins/Unity/Launcher/launcheritem.cpp:43
218150#: plugins/Unity/Launcher/launcheritem.cpp:73
219151msgid "Lock to Launcher"
220−msgstr ""
152+msgstr "Přidat do Launcheru"
221153
222154#: plugins/Unity/Launcher/launcheritem.cpp:73
223155msgid "Unlock from Launcher"
224−msgstr ""
225−
226−#: plugins/Unity/scope.cpp:408
227−msgid "Sorry, there is nothing that matches your search."
228−msgstr "Je nám líto, ale nic neodpovídá zadání"
229−
230−#: plugins/Unity/showallfilteroption.cpp:41
231−msgid "All"
232−msgstr "Vše"
156+msgstr "Odebrat z Launcheru"
233157
234−#: Shell.qml:441
158+#: Shell.qml:439
235159#, qt-format
236160msgid "Please enter %1"
237161msgstr "Zadejte prosím %1"
po/de.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
1111"PO-Revision-Date: 2013-10-18 12:26+0000\n"
1212"Last-Translator: Phillip Sz <Unknown>\n"
1313"Language-Team: German <de@li.org>\n"
@@ -15,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Telefon"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Kamera"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "Galerie"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "Facebook"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "Browser"
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr "Twitter"
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr "GMail"
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "Wetter"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Notizen"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Kalender"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "Medienwiedergabe"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr "Evernote"
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "Karte"
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr "Pinterest"
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr "SoundCloud"
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr "Wikipedia"
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr "YouTube"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -136,30 +68,28 @@ msgstr ""
13668"Sie haben nun die Einführung abgeschlossen und können Ihr Gerät nun "
13769"verwenden<br><br>Antippen um zu starten"
13870
139−#: Components/PageHeader.qml:345
71+#: Components/PageHeader.qml:364
14072msgid "Recent searches"
14173msgstr "Letzte Suchbegriffe"
14274
143−#. TRANSLATORS: Number of persons who rated this app
75+#: Dash/Apps/AppPreview.qml:135
76+msgid "Rate this"
77+msgstr "Bewerten"
78+
14479#. TRANSLATORS: Number of persons who rated this app/video/whatever
145−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
80+#: Dash/Previews/Header.qml:93
14681#, qt-format
14782msgid "(%1)"
14883msgstr "(%1)"
14984
150−#. TRANSLATORS: Number of persons who wrote reviews for this app
15185#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
152−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
86+#: Dash/Previews/Header.qml:105
15387#, qt-format
15488msgid "%1 review"
15589msgid_plural "%1 reviews"
15690msgstr[0] "%1 Bewertung"
15791msgstr[1] "%1 Bewertungen"
15892
159−#: Dash/Apps/AppPreview.qml:135
160−msgid "Rate this"
161−msgstr "Bewerten"
162−
16393#: Dash/Previews/Reviews.qml:74
16494msgid "Add a review"
16595msgstr "Bewertung hinzufügen"
@@ -176,7 +106,7 @@ msgstr "Senden"
176106msgid "Comments:"
177107msgstr "Kommentare:"
178108
179−#: Greeter/Lockscreen.qml:146
109+#: Greeter/Lockscreen.qml:149
180110msgid "Emergency Call"
181111msgstr "Notruf"
182112
@@ -226,15 +156,7 @@ msgstr ""
226156msgid "Unlock from Launcher"
227157msgstr ""
228158
229−#: plugins/Unity/scope.cpp:408
230−msgid "Sorry, there is nothing that matches your search."
231−msgstr "Entschuldigung, es wurden keine Treffer erzielt."
232−
233−#: plugins/Unity/showallfilteroption.cpp:41
234−msgid "All"
235−msgstr "Alle"
236−
237−#: Shell.qml:441
159+#: Shell.qml:439
238160#, qt-format
239161msgid "Please enter %1"
240162msgstr "Bitte geben Sie %1 ein"
po/el.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
1111"PO-Revision-Date: 2013-06-27 00:53+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Greek <el@li.org>\n"
@@ -15,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr ""
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr ""
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr ""
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr ""
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr ""
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr ""
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr ""
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr ""
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr ""
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr ""
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr ""
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr "Πρόσφατες αναζητήσεις"
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr ""
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] ""
15387msgstr[1] ""
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172102msgid "Comments:"
173103msgstr ""
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177107msgstr ""
178108
@@ -222,15 +152,7 @@ msgstr ""
222152msgid "Unlock from Launcher"
223153msgstr ""
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "Λυπούμαστε, δεν υπάρχει τίποτα που να ταιριάζει στην αναζήτησή σας."
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236158msgstr ""
po/en_AU.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+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,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Phone"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Camera"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "Gallery"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "Facebook"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "Browser"
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr "Twitter"
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr "GMail"
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "Weather"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Notepad"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Calendar"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "Media Player"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr "Evernote"
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "Map"
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr "Pinterest"
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr "SoundCloud"
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr "Wikipedia"
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr "YouTube"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr "Recent searches"
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr "Rate this"
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr "(%1)"
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] "%1 review"
15387msgstr[1] "%1 reviews"
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr "Rate this"
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr "Add a review"
@@ -172,7 +102,7 @@ msgstr "Send"
172102msgid "Comments:"
173103msgstr "Comments:"
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177107msgstr "Emergency Call"
178108
@@ -222,15 +152,7 @@ msgstr ""
222152msgid "Unlock from Launcher"
223153msgstr ""
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "Sorry, there is nothing that matches your search."
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236158msgstr "Please enter %1"
po/en_GB.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
1111"PO-Revision-Date: 2013-06-27 08:53+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
@@ -15,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Phone"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Camera"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "Gallery"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "Facebook"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "Browser"
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr "Twitter"
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr "GMail"
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "Weather"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Notepad"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Calendar"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "Media Player"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr "Evernote"
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "Map"
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr "Pinterest"
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr "SoundCloud"
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr "Wikipedia"
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr "YouTube"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr "Recent searches"
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr ""
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] ""
15387msgstr[1] ""
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172102msgid "Comments:"
173103msgstr ""
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177107msgstr ""
178108
@@ -222,15 +152,7 @@ msgstr ""
222152msgid "Unlock from Launcher"
223153msgstr ""
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "Sorry, there is nothing that matches your search."
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236158msgstr "Please enter %1"
po/eo.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+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,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr ""
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr ""
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr ""
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr ""
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr ""
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr ""
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr ""
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr ""
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr ""
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr ""
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr ""
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr ""
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr ""
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] ""
15387msgstr[1] ""
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172102msgid "Comments:"
173103msgstr ""
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177107msgstr ""
178108
@@ -222,15 +152,7 @@ msgstr ""
222152msgid "Unlock from Launcher"
223153msgstr ""
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr ""
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236158msgstr ""
po/es.po+13−91
@@ -7,84 +7,16 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
1111"PO-Revision-Date: 2013-11-20 08:46+0000\n"
12−"Last-Translator: Adolfo Jayme Barrientos <fitoschido@gmail.com>\n"
12+"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
1313"Language-Team: Spanish <es@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-21 06:43+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Teléfono"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Cámara"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "Galería"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "Facebook"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "Navegador"
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr "Twitter"
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr "GMail"
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "Meteorología"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Bloc de notas"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Calendario"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "Reproductor multimedia"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr "Evernote"
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "Mapa"
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr "Pinterest"
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr "SoundCloud"
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr "Wikipedia"
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr "YouTube"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -136,30 +68,28 @@ msgstr ""
13668"Ahora domina los gestos de bordes y puede usar el teléfono<br><br>Toque la "
13769"pantalla para comenzar"
13870
139−#: Components/PageHeader.qml:345
71+#: Components/PageHeader.qml:364
14072msgid "Recent searches"
14173msgstr "Búsquedas recientes"
14274
143−#. TRANSLATORS: Number of persons who rated this app
75+#: Dash/Apps/AppPreview.qml:135
76+msgid "Rate this"
77+msgstr "Valorar esto"
78+
14479#. TRANSLATORS: Number of persons who rated this app/video/whatever
145−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
80+#: Dash/Previews/Header.qml:93
14681#, qt-format
14782msgid "(%1)"
14883msgstr "(%1)"
14984
150−#. TRANSLATORS: Number of persons who wrote reviews for this app
15185#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
152−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
86+#: Dash/Previews/Header.qml:105
15387#, qt-format
15488msgid "%1 review"
15589msgid_plural "%1 reviews"
15690msgstr[0] "%1 reseña"
15791msgstr[1] "%1 reseñas"
15892
159−#: Dash/Apps/AppPreview.qml:135
160−msgid "Rate this"
161−msgstr "Valorar esto"
162−
16393#: Dash/Previews/Reviews.qml:74
16494msgid "Add a review"
16595msgstr "Añadir una reseña"
@@ -176,7 +106,7 @@ msgstr "Enviar"
176106msgid "Comments:"
177107msgstr "Comentarios:"
178108
179−#: Greeter/Lockscreen.qml:146
109+#: Greeter/Lockscreen.qml:149
180110msgid "Emergency Call"
181111msgstr "Llamada de emergencia"
182112
@@ -226,15 +156,7 @@ msgstr "Mantener en el lanzador"
226156msgid "Unlock from Launcher"
227157msgstr "No mantener en el lanzador"
228158
229−#: plugins/Unity/scope.cpp:408
230−msgid "Sorry, there is nothing that matches your search."
231−msgstr "No hay nada que coincida con su búsqueda."
232−
233−#: plugins/Unity/showallfilteroption.cpp:41
234−msgid "All"
235−msgstr "Todo"
236−
237−#: Shell.qml:441
159+#: Shell.qml:439
238160#, qt-format
239161msgid "Please enter %1"
240162msgstr "Introduzca %1"
po/fa.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+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,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr ""
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr ""
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr ""
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr ""
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr ""
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr ""
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr ""
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr ""
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr ""
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr ""
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr ""
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr ""
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr ""
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] ""
15387msgstr[1] ""
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172102msgid "Comments:"
173103msgstr ""
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177107msgstr ""
178108
@@ -222,15 +152,7 @@ msgstr ""
222152msgid "Unlock from Launcher"
223153msgstr ""
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr ""
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236158msgstr ""
po/fi.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
1111"PO-Revision-Date: 2013-11-20 08:09+0000\n"
1212"Last-Translator: Jiri Grönroos <Unknown>\n"
1313"Language-Team: Finnish <fi@li.org>\n"
@@ -15,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-21 06:43+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Puhelin"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Kamera"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "Galleria"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "Facebook"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "Selain"
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr "Twitter"
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr "GMail"
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "Sää"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Muistio"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Kalenteri"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "Mediasoitin"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr "Evernote"
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "Kartta"
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr "Pinterest"
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr "SoundCloud"
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr "Wikipedia"
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr "YouTube"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -134,30 +66,28 @@ msgstr ""
13466"Hallitset nyt reunaeleet, joten voit aloittaa puhelimen "
13567"käytön<br><br>Napauta missä tahansa aloittaaksesi"
13668
137−#: Components/PageHeader.qml:345
69+#: Components/PageHeader.qml:364
13870msgid "Recent searches"
13971msgstr "Viimeisimmät haut"
14072
141−#. TRANSLATORS: Number of persons who rated this app
73+#: Dash/Apps/AppPreview.qml:135
74+msgid "Rate this"
75+msgstr "Arvioi tämä"
76+
14277#. TRANSLATORS: Number of persons who rated this app/video/whatever
143−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
78+#: Dash/Previews/Header.qml:93
14479#, qt-format
14580msgid "(%1)"
14681msgstr "(%1)"
14782
148−#. TRANSLATORS: Number of persons who wrote reviews for this app
14983#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
150−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
84+#: Dash/Previews/Header.qml:105
15185#, qt-format
15286msgid "%1 review"
15387msgid_plural "%1 reviews"
15488msgstr[0] "%1 arvostelu"
15589msgstr[1] "%1 arvostelua"
15690
157−#: Dash/Apps/AppPreview.qml:135
158−msgid "Rate this"
159−msgstr "Arvioi tämä"
160−
16191#: Dash/Previews/Reviews.qml:74
16292msgid "Add a review"
16393msgstr "Lisää arvostelu"
@@ -174,7 +104,7 @@ msgstr "Lähetä"
174104msgid "Comments:"
175105msgstr "Kommentit:"
176106
177−#: Greeter/Lockscreen.qml:146
107+#: Greeter/Lockscreen.qml:149
178108msgid "Emergency Call"
179109msgstr "Hätäpuhelu"
180110
@@ -224,15 +154,7 @@ msgstr "Kiinnitä käynnistimeen"
224154msgid "Unlock from Launcher"
225155msgstr "Poista käynnistimestä"
226156
227−#: plugins/Unity/scope.cpp:408
228−msgid "Sorry, there is nothing that matches your search."
229−msgstr "Hakuun täsmääviä tuloksia ei löydy."
230−
231−#: plugins/Unity/showallfilteroption.cpp:41
232−msgid "All"
233−msgstr "Kaikki"
234−
235−#: Shell.qml:441
157+#: Shell.qml:439
236158#, qt-format
237159msgid "Please enter %1"
238160msgstr "Kirjoita %1"
po/fo.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
1111"PO-Revision-Date: 2013-10-01 15:13+0000\n"
1212"Last-Translator: Jógvan Olsen <jeggy@jebster.net>\n"
1313"Language-Team: Faroese <fo@li.org>\n"
@@ -15,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Fartelefon"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Myndatól"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "Myndasavn"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "Facebook"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "Kagi"
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr "Twitter"
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr "GMail"
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "Veðrið"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Skriviblokkur"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Kalendari"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr ""
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr ""
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr ""
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr ""
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr ""
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr ""
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr ""
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr ""
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr ""
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] ""
15387msgstr[1] ""
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172102msgid "Comments:"
173103msgstr ""
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177107msgstr ""
178108
@@ -222,15 +152,7 @@ msgstr ""
222152msgid "Unlock from Launcher"
223153msgstr ""
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "Tíanverri er tað einki sum hóskar til tína leiting."
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236158msgstr ""
po/fr.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
1111"PO-Revision-Date: 2013-06-27 03:21+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: French <fr@li.org>\n"
@@ -15,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr ""
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr ""
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr ""
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr ""
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr ""
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr ""
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr ""
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr ""
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr ""
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr ""
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr ""
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr ""
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr ""
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] ""
15387msgstr[1] ""
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172102msgid "Comments:"
173103msgstr ""
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177107msgstr ""
178108
@@ -222,15 +152,7 @@ msgstr ""
222152msgid "Unlock from Launcher"
223153msgstr ""
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr ""
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236158msgstr ""
po/gd.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+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,76 +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: 2013-11-19 05:59+0000\n"
20−"X-Generator: Launchpad (build 16831)\n"
21−
22−#: Applications/applications.js:23
23−msgid "Phone"
24−msgstr "Fòn"
25−
26−#: Applications/applications.js:29
27−msgid "Camera"
28−msgstr "Camara"
29−
30−#: Applications/applications.js:35
31−msgid "Gallery"
32−msgstr "Gailearaidh"
33−
34−#: Applications/applications.js:40
35−msgid "Facebook"
36−msgstr "Facebook"
37−
38−#: Applications/applications.js:46
39−msgid "Browser"
40−msgstr "Brabhsair"
41−
42−#: Applications/applications.js:51
43−msgid "Twitter"
44−msgstr "Twitter"
45−
46−#: Applications/applications.js:57
47−msgid "GMail"
48−msgstr "GMail"
49−
50−#: Applications/applications.js:62
51−msgid "Weather"
52−msgstr "An aimsir"
53−
54−#: Applications/applications.js:68
55−msgid "Notepad"
56−msgstr "Pada nan nòtaichean"
57−
58−#: Applications/applications.js:74
59−msgid "Calendar"
60−msgstr "Am mìosachan"
61−
62−#: Applications/applications.js:80
63−msgid "Media Player"
64−msgstr "Cluicheadair mheadhanan"
65−
66−#: Applications/applications.js:86
67−msgid "Evernote"
68−msgstr "Evernote"
69−
70−#: Applications/applications.js:91
71−msgid "Map"
72−msgstr "Mapa"
73−
74−#: Applications/applications.js:96
75−msgid "Pinterest"
76−msgstr "Pinterest"
77−
78−#: Applications/applications.js:101
79−msgid "SoundCloud"
80−msgstr "SoundCloud"
81−
82−#: Applications/applications.js:106
83−msgid "Wikipedia"
84−msgstr "An Uicipeid"
85−
86−#: Applications/applications.js:111
87−msgid "YouTube"
88−msgstr "YouTube"
19+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
20+"X-Generator: Launchpad (build 16877)\n"
8921
9022#: Components/EdgeDemoOverlay.qml:151
9123msgid "Skip intro"
@@ -139,20 +71,22 @@ msgid ""
13971"phone<br><br>Tap anywhere to start"
14072msgstr ""
14173
142−#: Components/PageHeader.qml:345
74+#: Components/PageHeader.qml:364
14375msgid "Recent searches"
14476msgstr "Na lorg thu o chionn goirid"
14577
146−#. TRANSLATORS: Number of persons who rated this app
78+#: Dash/Apps/AppPreview.qml:135
79+msgid "Rate this"
80+msgstr "Rangaich seo"
81+
14782#. TRANSLATORS: Number of persons who rated this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
83+#: Dash/Previews/Header.qml:93
14984#, qt-format
15085msgid "(%1)"
15186msgstr "(%1)"
15287
153−#. TRANSLATORS: Number of persons who wrote reviews for this app
15488#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
155−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
89+#: Dash/Previews/Header.qml:105
15690#, qt-format
15791msgid "%1 review"
15892msgid_plural "%1 reviews"
@@ -161,10 +95,6 @@ msgstr[1] "%1 lèirmheas"
16195msgstr[2] "%1 lèirmheasan"
16296msgstr[3] "%1 lèirmheas"
16397
164−#: Dash/Apps/AppPreview.qml:135
165−msgid "Rate this"
166−msgstr "Rangaich seo"
167−
16898#: Dash/Previews/Reviews.qml:74
16999msgid "Add a review"
170100msgstr "Cuir lèirmheas ris"
@@ -181,7 +111,7 @@ msgstr "Cuir"
181111msgid "Comments:"
182112msgstr "Beachdan"
183113
184−#: Greeter/Lockscreen.qml:146
114+#: Greeter/Lockscreen.qml:149
185115msgid "Emergency Call"
186116msgstr "Gairm èiginn"
187117
@@ -231,15 +161,7 @@ msgstr ""
231161msgid "Unlock from Launcher"
232162msgstr ""
233163
234−#: plugins/Unity/scope.cpp:408
235−msgid "Sorry, there is nothing that matches your search."
236−msgstr "Tha sinn duilich ach chan eil dad a' freagairt ris na lorg thu."
237−
238−#: plugins/Unity/showallfilteroption.cpp:41
239−msgid "All"
240−msgstr ""
241−
242−#: Shell.qml:441
164+#: Shell.qml:439
243165#, qt-format
244166msgid "Please enter %1"
245167msgstr "Cuir a-steach %1"
po/gl.po+16−94
@@ -7,84 +7,16 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
11−"PO-Revision-Date: 2013-10-03 18:49+0000\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11+"PO-Revision-Date: 2013-12-06 17:15+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"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Teléfono"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Cámara"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "Galería"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "Facebook"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "Navegador"
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr "Twitter"
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr "GMail"
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "O tempo"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Bloc de notas"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Calendario"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "Reprodutor multimedia"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr "Evernote"
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "Mapa"
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr "Pinterest"
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr "SoundCloud"
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr "Wikipedia"
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr "YouTube"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -134,30 +66,28 @@ msgstr ""
13466"Xa domina os xestos desde os bordos e pode comezar a usar o "
13567"móbil<br><br>Toque en calquera sitio para comezar"
13668
137−#: Components/PageHeader.qml:345
69+#: Components/PageHeader.qml:364
13870msgid "Recent searches"
13971msgstr "Buscas recentes"
14072
141−#. TRANSLATORS: Number of persons who rated this app
73+#: Dash/Apps/AppPreview.qml:135
74+msgid "Rate this"
75+msgstr "Valore isto"
76+
14277#. TRANSLATORS: Number of persons who rated this app/video/whatever
143−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
78+#: Dash/Previews/Header.qml:93
14479#, qt-format
14580msgid "(%1)"
14681msgstr "(%1)"
14782
148−#. TRANSLATORS: Number of persons who wrote reviews for this app
14983#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
150−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
84+#: Dash/Previews/Header.qml:105
15185#, qt-format
15286msgid "%1 review"
15387msgid_plural "%1 reviews"
15488msgstr[0] "%1 opinión"
15589msgstr[1] "%1 opinións"
15690
157−#: Dash/Apps/AppPreview.qml:135
158−msgid "Rate this"
159−msgstr "Valore isto"
160−
16191#: Dash/Previews/Reviews.qml:74
16292msgid "Add a review"
16393msgstr "Engadir unha opinión"
@@ -174,7 +104,7 @@ msgstr "Enviar"
174104msgid "Comments:"
175105msgstr "Comentarios:"
176106
177−#: Greeter/Lockscreen.qml:146
107+#: Greeter/Lockscreen.qml:149
178108msgid "Emergency Call"
179109msgstr "Chamada de emerxencia"
180110
@@ -209,7 +139,7 @@ msgstr "Falando…"
209139
210140#: Notifications/NotificationMenuItemFactory.qml:89
211141msgid "Show password"
212−msgstr ""
142+msgstr "Mostrar contrasinal"
213143
214144#: Panel/SearchIndicator.qml:27
215145msgid "Search"
@@ -218,21 +148,13 @@ msgstr "Buscar"
218148#: plugins/Unity/Launcher/launcheritem.cpp:43
219149#: plugins/Unity/Launcher/launcheritem.cpp:73
220150msgid "Lock to Launcher"
221−msgstr ""
151+msgstr "Manter no Iniciador"
222152
223153#: plugins/Unity/Launcher/launcheritem.cpp:73
224154msgid "Unlock from Launcher"
225−msgstr ""
226−
227−#: plugins/Unity/scope.cpp:408
228−msgid "Sorry, there is nothing that matches your search."
229−msgstr "Sentímolo, non hai nada que coincida con esta busca."
230−
231−#: plugins/Unity/showallfilteroption.cpp:41
232−msgid "All"
233−msgstr "Todo"
155+msgstr "Non manter no Iniciador"
234156
235−#: Shell.qml:441
157+#: Shell.qml:439
236158#, qt-format
237159msgid "Please enter %1"
238160msgstr "Introduza %1"
po/he.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+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,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-21 06:43+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "טלפון"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "מצלמה"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "גלריה"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "Facebook"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "דפדפן"
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr "Twitter"
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr "GMail"
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "מזג אוויר"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "פנקס רשימות"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "לוח שנה"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "נגן מדיה"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr "Evernote"
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "מפה"
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr "Pinterest"
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr "SoundCloud"
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr "ויקיפדיה"
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr "YouTube"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -134,30 +66,28 @@ msgstr ""
13466"עתה מכשסיימת את ההשתלמות לשימוש במחוות קצה יש לך את הכלים להשתמש "
13567"בטלפון<br><br>ניתן לגעת במקום כלשהו במסך כדי להתחיל"
13668
137−#: Components/PageHeader.qml:345
69+#: Components/PageHeader.qml:364
13870msgid "Recent searches"
13971msgstr "חיפושים אחרונים"
14072
141−#. TRANSLATORS: Number of persons who rated this app
73+#: Dash/Apps/AppPreview.qml:135
74+msgid "Rate this"
75+msgstr "דירוג היישום"
76+
14277#. TRANSLATORS: Number of persons who rated this app/video/whatever
143−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
78+#: Dash/Previews/Header.qml:93
14479#, qt-format
14580msgid "(%1)"
14681msgstr "(%1)"
14782
148−#. TRANSLATORS: Number of persons who wrote reviews for this app
14983#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
150−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
84+#: Dash/Previews/Header.qml:105
15185#, qt-format
15286msgid "%1 review"
15387msgid_plural "%1 reviews"
15488msgstr[0] "סקירה %1"
15589msgstr[1] "%1 סקירות"
15690
157−#: Dash/Apps/AppPreview.qml:135
158−msgid "Rate this"
159−msgstr "דירוג היישום"
160−
16191#: Dash/Previews/Reviews.qml:74
16292msgid "Add a review"
16393msgstr "הוספת סקירה"
@@ -174,7 +104,7 @@ msgstr "שליחה"
174104msgid "Comments:"
175105msgstr "הערות:"
176106
177−#: Greeter/Lockscreen.qml:146
107+#: Greeter/Lockscreen.qml:149
178108msgid "Emergency Call"
179109msgstr "שיחת חירום"
180110
@@ -224,15 +154,7 @@ msgstr "נעילה למשגר"
224154msgid "Unlock from Launcher"
225155msgstr "הפרדה מהמשגר"
226156
227−#: plugins/Unity/scope.cpp:408
228−msgid "Sorry, there is nothing that matches your search."
229−msgstr "שום דבר אינו תואם לחיפוש שלך, עמך הסליחה."
230−
231−#: plugins/Unity/showallfilteroption.cpp:41
232−msgid "All"
233−msgstr "הכול"
234−
235−#: Shell.qml:441
157+#: Shell.qml:439
236158#, qt-format
237159msgid "Please enter %1"
238160msgstr "נא להזין %1"
po/hr.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+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,76 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
20−"X-Generator: Launchpad (build 16831)\n"
21−
22−#: Applications/applications.js:23
23−msgid "Phone"
24−msgstr ""
25−
26−#: Applications/applications.js:29
27−msgid "Camera"
28−msgstr ""
29−
30−#: Applications/applications.js:35
31−msgid "Gallery"
32−msgstr ""
33−
34−#: Applications/applications.js:40
35−msgid "Facebook"
36−msgstr ""
37−
38−#: Applications/applications.js:46
39−msgid "Browser"
40−msgstr ""
41−
42−#: Applications/applications.js:51
43−msgid "Twitter"
44−msgstr ""
45−
46−#: Applications/applications.js:57
47−msgid "GMail"
48−msgstr ""
49−
50−#: Applications/applications.js:62
51−msgid "Weather"
52−msgstr ""
53−
54−#: Applications/applications.js:68
55−msgid "Notepad"
56−msgstr ""
57−
58−#: Applications/applications.js:74
59−msgid "Calendar"
60−msgstr ""
61−
62−#: Applications/applications.js:80
63−msgid "Media Player"
64−msgstr ""
65−
66−#: Applications/applications.js:86
67−msgid "Evernote"
68−msgstr ""
69−
70−#: Applications/applications.js:91
71−msgid "Map"
72−msgstr ""
73−
74−#: Applications/applications.js:96
75−msgid "Pinterest"
76−msgstr ""
77−
78−#: Applications/applications.js:101
79−msgid "SoundCloud"
80−msgstr ""
81−
82−#: Applications/applications.js:106
83−msgid "Wikipedia"
84−msgstr ""
85−
86−#: Applications/applications.js:111
87−msgid "YouTube"
88−msgstr ""
19+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
20+"X-Generator: Launchpad (build 16877)\n"
8921
9022#: Components/EdgeDemoOverlay.qml:151
9123msgid "Skip intro"
@@ -133,30 +65,28 @@ msgid ""
13365"phone<br><br>Tap anywhere to start"
13466msgstr ""
13567
136−#: Components/PageHeader.qml:345
68+#: Components/PageHeader.qml:364
13769msgid "Recent searches"
13870msgstr "Nedavne pretrage"
13971
140−#. TRANSLATORS: Number of persons who rated this app
72+#: Dash/Apps/AppPreview.qml:135
73+msgid "Rate this"
74+msgstr ""
75+
14176#. TRANSLATORS: Number of persons who rated this app/video/whatever
142−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
77+#: Dash/Previews/Header.qml:93
14378#, qt-format
14479msgid "(%1)"
14580msgstr ""
14681
147−#. TRANSLATORS: Number of persons who wrote reviews for this app
14882#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
149−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
83+#: Dash/Previews/Header.qml:105
15084#, qt-format
15185msgid "%1 review"
15286msgid_plural "%1 reviews"
15387msgstr[0] ""
15488msgstr[1] ""
15589
156−#: Dash/Apps/AppPreview.qml:135
157−msgid "Rate this"
158−msgstr ""
159−
16090#: Dash/Previews/Reviews.qml:74
16191msgid "Add a review"
16292msgstr ""
@@ -173,7 +103,7 @@ msgstr ""
173103msgid "Comments:"
174104msgstr ""
175105
176−#: Greeter/Lockscreen.qml:146
106+#: Greeter/Lockscreen.qml:149
177107msgid "Emergency Call"
178108msgstr ""
179109
@@ -223,15 +153,7 @@ msgstr ""
223153msgid "Unlock from Launcher"
224154msgstr ""
225155
226−#: plugins/Unity/scope.cpp:408
227−msgid "Sorry, there is nothing that matches your search."
228−msgstr "Nažalost, ne postoji ništa što odgovara vašoj pretrazi."
229−
230−#: plugins/Unity/showallfilteroption.cpp:41
231−msgid "All"
232−msgstr ""
233−
234−#: Shell.qml:441
156+#: Shell.qml:439
235157#, qt-format
236158msgid "Please enter %1"
237159msgstr ""
po/hu.po+41−115
@@ -7,183 +7,117 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
11−"PO-Revision-Date: 2013-06-27 04:28+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11+"PO-Revision-Date: 2014-01-07 18:02+0000\n"
12+"Last-Translator: Gabor Kelemen <kelemeng@gnome.hu>\n"
1313"Language-Team: Hungarian <hu@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr ""
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr ""
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr ""
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr ""
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr ""
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr ""
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr ""
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr ""
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr ""
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr ""
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr ""
18+"X-Launchpad-Export-Date: 2014-01-08 05:43+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
91−msgstr ""
23+msgstr "A bemutató kihagyása"
9224
9325#: Components/EdgeDemo.qml:112
9426msgid "Right edge"
95−msgstr ""
27+msgstr "Jobb szél"
9628
9729#: Components/EdgeDemo.qml:113
9830msgid "Try swiping from the right edge to unlock the phone"
99−msgstr ""
31+msgstr "A telefon feloldásához csúsztassa ujját a jobb szélről"
10032
10133#: Components/EdgeDemo.qml:144
10234msgid "Top edge"
103−msgstr ""
35+msgstr "Felső szél"
10436
10537#: Components/EdgeDemo.qml:145
10638msgid "Try swiping from the top edge to access the indicators"
107−msgstr ""
39+msgstr "A jelzők eléréséhez csúsztassa ujját a felső szélről"
10840
10941#: Components/EdgeDemo.qml:170
11042msgid "Close"
111−msgstr ""
43+msgstr "Bezárás"
11244
11345#: Components/EdgeDemo.qml:171
11446msgid "Swipe up again to close the settings screen"
115−msgstr ""
47+msgstr "A beállítások bezárásához csúsztassa ujját újra felfelé"
11648
11749#: Components/EdgeDemo.qml:198
11850msgid "Left edge"
119−msgstr ""
51+msgstr "Bal szél"
12052
12153#: Components/EdgeDemo.qml:199
12254msgid "Swipe from the left to reveal the launcher for quick access to apps"
12355msgstr ""
56+"Csúsztassa ujját a bal szélről az indítón található alkalmazások gyors "
57+"eléréséhez"
12458
12559#: Components/EdgeDemo.qml:226
12660msgid "Well done"
127−msgstr ""
61+msgstr "Rendben"
12862
12963#: Components/EdgeDemo.qml:227
13064msgid ""
13165"You have now mastered the edge gestures and can start using the "
13266"phone<br><br>Tap anywhere to start"
13367msgstr ""
68+"Miután megismerte a szélek használatát, nincs más hátra...<br><br>Koppintson "
69+"a folytatáshoz!"
13470
135−#: Components/PageHeader.qml:345
71+#: Components/PageHeader.qml:364
13672msgid "Recent searches"
13773msgstr "Legutóbbi keresések"
13874
139−#. TRANSLATORS: Number of persons who rated this app
75+#: Dash/Apps/AppPreview.qml:135
76+msgid "Rate this"
77+msgstr "Osztályzás"
78+
14079#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
80+#: Dash/Previews/Header.qml:93
14281#, qt-format
14382msgid "(%1)"
144−msgstr ""
83+msgstr "(%1)"
14584
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14785#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
86+#: Dash/Previews/Header.qml:105
14987#, qt-format
15088msgid "%1 review"
15189msgid_plural "%1 reviews"
152−msgstr[0] ""
153−msgstr[1] ""
154−
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
90+msgstr[0] "%1 értékelés"
91+msgstr[1] "%1 értékelés"
15892
15993#: Dash/Previews/Reviews.qml:74
16094msgid "Add a review"
161−msgstr ""
95+msgstr "Értékelés hozzáadása"
16296
16397#: Dash/Previews/Reviews.qml:86
16498msgid "Review"
165−msgstr ""
99+msgstr "Értékelés"
166100
167101#: Dash/Previews/Reviews.qml:121
168102msgid "Send"
169−msgstr ""
103+msgstr "Küldés"
170104
171105#: Dash/Previews/Reviews.qml:139
172106msgid "Comments:"
173−msgstr ""
107+msgstr "Hozzászólások:"
174108
175−#: Greeter/Lockscreen.qml:146
109+#: Greeter/Lockscreen.qml:149
176110msgid "Emergency Call"
177−msgstr ""
111+msgstr "Vészhívás"
178112
179113#: Greeter/PassphraseLockscreen.qml:59
180114#, qt-format
181115msgid "Hello %1"
182−msgstr ""
116+msgstr "Szia %1"
183117
184118#: Greeter/PassphraseLockscreen.qml:59
185119msgid "Hello"
186−msgstr ""
120+msgstr "Szia"
187121
188122#: Hud/HudParametrizedActionsPage.qml:132
189123msgid "Confirm"
@@ -207,7 +141,7 @@ msgstr "Beszéd…"
207141
208142#: Notifications/NotificationMenuItemFactory.qml:89
209143msgid "Show password"
210−msgstr ""
144+msgstr "Jelszó megjelenítése"
211145
212146#: Panel/SearchIndicator.qml:27
213147msgid "Search"
@@ -216,21 +150,13 @@ msgstr "Keresés"
216150#: plugins/Unity/Launcher/launcheritem.cpp:43
217151#: plugins/Unity/Launcher/launcheritem.cpp:73
218152msgid "Lock to Launcher"
219−msgstr ""
153+msgstr "Indítóban tartás"
220154
221155#: plugins/Unity/Launcher/launcheritem.cpp:73
222156msgid "Unlock from Launcher"
223−msgstr ""
157+msgstr "Eltávolítás az Indítóból"
224158
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "Elnézést, nincs találat a keresésre."
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
159+#: Shell.qml:439
234160#, qt-format
235161msgid "Please enter %1"
236−msgstr ""
162+msgstr "Adja meg a következőt: %1"
po/hy.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+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,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr ""
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr ""
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr ""
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr ""
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr ""
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr ""
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr ""
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr ""
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr ""
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr ""
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr ""
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr "Վերջին որոնումներ"
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr ""
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] ""
15387msgstr[1] ""
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172102msgid "Comments:"
173103msgstr ""
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177107msgstr ""
178108
@@ -222,15 +152,7 @@ msgstr ""
222152msgid "Unlock from Launcher"
223153msgstr ""
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "Կներերք, բայց Ձեր հարցումով ոչինչ չկար"
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236158msgstr ""
po/id.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+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,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr ""
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr ""
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr ""
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr ""
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr ""
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr ""
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr ""
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr ""
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr ""
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr ""
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr ""
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr ""
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr ""
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] ""
15387msgstr[1] ""
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172102msgid "Comments:"
173103msgstr ""
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177107msgstr ""
178108
@@ -222,15 +152,7 @@ msgstr ""
222152msgid "Unlock from Launcher"
223153msgstr ""
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr ""
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236158msgstr ""
po/is.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+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,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Sími"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Myndavél"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "Myndasafn"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "Facebook"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "Vafri"
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr "Twitter"
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr "GMail"
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "Veður"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Skrifblokk"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Dagatal"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "Margmiðlunarspilari"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr "Evernote"
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "Kort"
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr "Pinterest"
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr "SoundCloud"
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr "Wikipedia"
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr "YouTube"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -133,30 +65,28 @@ msgid ""
13365"phone<br><br>Tap anywhere to start"
13466msgstr ""
13567
136−#: Components/PageHeader.qml:345
68+#: Components/PageHeader.qml:364
13769msgid "Recent searches"
13870msgstr "Nýlegar leitir"
13971
140−#. TRANSLATORS: Number of persons who rated this app
72+#: Dash/Apps/AppPreview.qml:135
73+msgid "Rate this"
74+msgstr "Gefa þessu einkunn"
75+
14176#. TRANSLATORS: Number of persons who rated this app/video/whatever
142−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
77+#: Dash/Previews/Header.qml:93
14378#, qt-format
14479msgid "(%1)"
14580msgstr "(%1)"
14681
147−#. TRANSLATORS: Number of persons who wrote reviews for this app
14882#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
149−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
83+#: Dash/Previews/Header.qml:105
15084#, qt-format
15185msgid "%1 review"
15286msgid_plural "%1 reviews"
15387msgstr[0] "%1 ummæli"
15488msgstr[1] "%1 ummæli"
15589
156−#: Dash/Apps/AppPreview.qml:135
157−msgid "Rate this"
158−msgstr "Gefa þessu einkunn"
159−
16090#: Dash/Previews/Reviews.qml:74
16191msgid "Add a review"
16292msgstr "Gefa umsögn"
@@ -173,7 +103,7 @@ msgstr "Senda"
173103msgid "Comments:"
174104msgstr "Athugasemdir:"
175105
176−#: Greeter/Lockscreen.qml:146
106+#: Greeter/Lockscreen.qml:149
177107msgid "Emergency Call"
178108msgstr "Neyðarsímtal"
179109
@@ -223,15 +153,7 @@ msgstr ""
223153msgid "Unlock from Launcher"
224154msgstr ""
225155
226−#: plugins/Unity/scope.cpp:408
227−msgid "Sorry, there is nothing that matches your search."
228−msgstr "Því miður, það var ekkert sem passaði við leitarorðið þitt."
229−
230−#: plugins/Unity/showallfilteroption.cpp:41
231−msgid "All"
232−msgstr ""
233−
234−#: Shell.qml:441
156+#: Shell.qml:439
235157#, qt-format
236158msgid "Please enter %1"
237159msgstr ""
po/it.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
1111"PO-Revision-Date: 2013-10-07 09:34+0000\n"
1212"Last-Translator: Claudio Arseni <claudio.arseni@gmail.com>\n"
1313"Language-Team: Italian <it@li.org>\n"
@@ -15,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Telefono"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Fotocamera"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "Galleria"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "Facebook"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "Browser"
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr "Twitter"
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr "GMail"
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "Meteo"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Blocco note"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Calendario"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "Riproduttore multimediale"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr "Evernote"
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "Mappa"
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr "Pinterest"
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr "SoundCloud"
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr "Wikipedia"
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr "YouTube"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -139,30 +71,28 @@ msgstr ""
13971"I gesti sui bordi sono stati configurati ed è possibile iniziare a usare il "
14072"telefono<br><br>Toccare in un punto qualunque per iniziare"
14173
142−#: Components/PageHeader.qml:345
74+#: Components/PageHeader.qml:364
14375msgid "Recent searches"
14476msgstr "Ricerche recenti"
14577
146−#. TRANSLATORS: Number of persons who rated this app
78+#: Dash/Apps/AppPreview.qml:135
79+msgid "Rate this"
80+msgstr "Valuta"
81+
14782#. TRANSLATORS: Number of persons who rated this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
83+#: Dash/Previews/Header.qml:93
14984#, qt-format
15085msgid "(%1)"
15186msgstr "(%1)"
15287
153−#. TRANSLATORS: Number of persons who wrote reviews for this app
15488#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
155−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
89+#: Dash/Previews/Header.qml:105
15690#, qt-format
15791msgid "%1 review"
15892msgid_plural "%1 reviews"
15993msgstr[0] "%1 recensione"
16094msgstr[1] "%1 recensioni"
16195
162−#: Dash/Apps/AppPreview.qml:135
163−msgid "Rate this"
164−msgstr "Valuta"
165−
16696#: Dash/Previews/Reviews.qml:74
16797msgid "Add a review"
16898msgstr "Aggiungi una recensione"
@@ -179,7 +109,7 @@ msgstr "Invia"
179109msgid "Comments:"
180110msgstr "Commenti:"
181111
182−#: Greeter/Lockscreen.qml:146
112+#: Greeter/Lockscreen.qml:149
183113msgid "Emergency Call"
184114msgstr "Chiamata di emergenza"
185115
@@ -229,15 +159,7 @@ msgstr ""
229159msgid "Unlock from Launcher"
230160msgstr ""
231161
232−#: plugins/Unity/scope.cpp:408
233−msgid "Sorry, there is nothing that matches your search."
234−msgstr "Nessun risultato corrispondente alla ricerca."
235−
236−#: plugins/Unity/showallfilteroption.cpp:41
237−msgid "All"
238−msgstr "Tutto"
239−
240−#: Shell.qml:441
162+#: Shell.qml:439
241163#, qt-format
242164msgid "Please enter %1"
243165msgstr "Inserire %1"
po/ja.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
1111"PO-Revision-Date: 2013-06-26 22:36+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Japanese <ja@li.org>\n"
@@ -15,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr ""
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr ""
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr ""
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr ""
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr ""
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr ""
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr ""
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr ""
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr ""
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr ""
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr ""
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr ""
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr ""
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] ""
15387msgstr[1] ""
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172102msgid "Comments:"
173103msgstr ""
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177107msgstr ""
178108
@@ -222,15 +152,7 @@ msgstr ""
222152msgid "Unlock from Launcher"
223153msgstr ""
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr ""
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236158msgstr ""
po/km.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
1111"PO-Revision-Date: 2013-11-20 07:34+0000\n"
1212"Last-Translator: Khoem Sokhem <khoemsokhem@khmeros.info>\n"
1313"Language-Team: Khmer <km@li.org>\n"
@@ -15,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2013-11-21 06:43+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "ទូរស័ព្ទ"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "ម៉ាស៊ីន​ថ​ត"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "វិចិត្រសាល"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "Facebook"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "កម្មវិធី​រុករក"
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr "Twitter"
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr "GMail"
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "អាកាសធាតុ"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Notepad"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "ប្រតិទិន"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "កម្មវិធី​ចាក់​មេឌៀ"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr "Evernote"
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "ផែនទី"
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr "Pinterest"
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr "SoundCloud"
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr "វីគីភីឌៀ"
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr "YouTube"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -137,29 +69,27 @@ msgstr ""
13769"និង​អាច​ចាប់ផ្ដើម​ប្រើ​ទូរស័ព្ទ​បាន<br><br>ប៉ះ​កន្លែង​ណា​មួយ​ "
13870"ដើម្បី​ចាប់ផ្ដើម"
13971
140−#: Components/PageHeader.qml:345
72+#: Components/PageHeader.qml:364
14173msgid "Recent searches"
14274msgstr "ការ​ស្វែងរក​ថ្មី"
14375
144−#. TRANSLATORS: Number of persons who rated this app
76+#: Dash/Apps/AppPreview.qml:135
77+msgid "Rate this"
78+msgstr "វាយតម្លៃ​វា"
79+
14580#. TRANSLATORS: Number of persons who rated this app/video/whatever
146−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
81+#: Dash/Previews/Header.qml:93
14782#, qt-format
14883msgid "(%1)"
14984msgstr "(%1)"
15085
151−#. TRANSLATORS: Number of persons who wrote reviews for this app
15286#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
153−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
87+#: Dash/Previews/Header.qml:105
15488#, qt-format
15589msgid "%1 review"
15690msgid_plural "%1 reviews"
15791msgstr[0] "ពិនិត្យ​មើល %1"
15892
159−#: Dash/Apps/AppPreview.qml:135
160−msgid "Rate this"
161−msgstr "វាយតម្លៃ​វា"
162−
16393#: Dash/Previews/Reviews.qml:74
16494msgid "Add a review"
16595msgstr "បន្ថែម​ការ​ពិនិត្យ"
@@ -176,7 +106,7 @@ msgstr "ផ្ញើ"
176106msgid "Comments:"
177107msgstr "មតិយោបល់៖"
178108
179−#: Greeter/Lockscreen.qml:146
109+#: Greeter/Lockscreen.qml:149
180110msgid "Emergency Call"
181111msgstr "ការ​ហៅ​ពេល​អាសន្ន"
182112
@@ -226,15 +156,7 @@ msgstr "ចាក់​សោ​​ទៅ​កម្មវិធី​ចាប
226156msgid "Unlock from Launcher"
227157msgstr "ដោះសោ​ពី​កម្មវិធី​ចាប់ផ្ដើម"
228158
229−#: plugins/Unity/scope.cpp:408
230−msgid "Sorry, there is nothing that matches your search."
231−msgstr "សូម​ទោស មិនមាន​ពាក្យ​ដែល​អ្នក​ស្វែងរក​ទេ​។"
232−
233−#: plugins/Unity/showallfilteroption.cpp:41
234−msgid "All"
235−msgstr "ទាំង​អស់"
236−
237−#: Shell.qml:441
159+#: Shell.qml:439
238160#, qt-format
239161msgid "Please enter %1"
240162msgstr "សូម​បញ្ចូល %1"
po/kn.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+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,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr ""
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr ""
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr ""
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr ""
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr ""
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr ""
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr ""
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr ""
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr ""
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr ""
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr ""
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr "ಇತ್ತೀಚಿನ ಹುಡುಕಾಟಗಳು"
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr ""
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] ""
15387msgstr[1] ""
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172102msgid "Comments:"
173103msgstr ""
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177107msgstr ""
178108
@@ -222,15 +152,7 @@ msgstr ""
222152msgid "Unlock from Launcher"
223153msgstr ""
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "ಕ್ಷಮಿಸಿ ನಿಮ್ಮ ಶೋಧನೆಗೆ ಸರಿಯಾದ ಹೊಂದಾಣಿಕೆಗಳು ದೊರಕುತ್ತಿಲ್ಲ"
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236158msgstr ""
po/ko.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+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,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "전화"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "카메라"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "갤러리"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "페이스북"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "브라우저"
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr "트위터"
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr "지메일"
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "날씨"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "메모장"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "달력"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "미디어 재생기"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr "에버노트"
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "지도"
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr "핀터레스트"
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr "사운드클라우드"
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr "위키백과"
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr "유튜브"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr "최근 검색"
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr ""
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] ""
15387msgstr[1] ""
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172102msgid "Comments:"
173103msgstr ""
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177107msgstr ""
178108
@@ -222,15 +152,7 @@ msgstr ""
222152msgid "Unlock from Launcher"
223153msgstr ""
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr ""
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236158msgstr ""
po/ky.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+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,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr ""
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr ""
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr ""
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr ""
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr ""
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr ""
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr ""
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr ""
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr ""
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr ""
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr ""
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr "Соңку издөөлөр"
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr ""
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] ""
15387msgstr[1] ""
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172102msgid "Comments:"
173103msgstr ""
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177107msgstr ""
178108
@@ -222,15 +152,7 @@ msgstr ""
222152msgid "Unlock from Launcher"
223153msgstr ""
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "Тилекке каршы, сиздин издөөңүзгө эч нерсе дал келген жок."
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236158msgstr ""
po/lo.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+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,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "ໂທລະສັບ"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "ກ້ອງ"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "Gallery"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "Facebook"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "ບາວເຊິ"
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr "Twitter"
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr "GMail"
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "ສະພາບອາກາດ"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Noetpad"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "ປະຕິທິນ"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr ""
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr ""
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "ເເຜນທີ່"
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr ""
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr ""
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr ""
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr "ິYouTube"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr ""
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr "(%1)"
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] ""
15387msgstr[1] ""
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr ""
@@ -172,7 +102,7 @@ msgstr "ສົ່ງ"
172102msgid "Comments:"
173103msgstr "ຄໍ່ເຫັນ"
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177107msgstr ""
178108
@@ -222,15 +152,7 @@ msgstr ""
222152msgid "Unlock from Launcher"
223153msgstr ""
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr ""
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr "ທັງໝົດ"
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236158msgstr "ກະລູນາປ້ອນ %1"
po/lv.po+16−94
@@ -7,84 +7,16 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
11−"PO-Revision-Date: 2013-09-28 16:29+0000\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11+"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"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Tālrunis"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Fotokamera"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "Galerija"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "Facebook"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "Pārlūkprogramma"
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr "Twitter"
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr "GMail"
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "Laikapstākļi"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Bloknots"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Kalendārs"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "Mēdiju Atskaņotājs"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr ""
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "Karte"
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr "Pinterest"
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr "SoundCloud"
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr "Vikipēdija"
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr "YouTube"
18+"X-Launchpad-Export-Date: 2014-01-12 05:52+0000\n"
19+"X-Generator: Launchpad (build 16890)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -100,7 +32,7 @@ msgstr ""
10032
10133#: Components/EdgeDemo.qml:144
10234msgid "Top edge"
103−msgstr ""
35+msgstr "Augšējā mala"
10436
10537#: Components/EdgeDemo.qml:145
10638msgid "Try swiping from the top edge to access the indicators"
@@ -108,7 +40,7 @@ msgstr ""
10840
10941#: Components/EdgeDemo.qml:170
11042msgid "Close"
111−msgstr ""
43+msgstr "Aizvērt"
11244
11345#: Components/EdgeDemo.qml:171
11446msgid "Swipe up again to close the settings screen"
@@ -116,7 +48,7 @@ msgstr ""
11648
11749#: Components/EdgeDemo.qml:198
11850msgid "Left edge"
119−msgstr ""
51+msgstr "Kreisā mala"
12052
12153#: Components/EdgeDemo.qml:199
12254msgid "Swipe from the left to reveal the launcher for quick access to apps"
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr "Nesen veiktās meklēšanas"
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr ""
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] ""
15387msgstr[1] ""
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172102msgid "Comments:"
173103msgstr ""
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177107msgstr ""
178108
@@ -222,15 +152,7 @@ msgstr ""
222152msgid "Unlock from Launcher"
223153msgstr ""
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "Diemžēl nekas neatbilst jūsu meklētajam."
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236158msgstr ""
po/ml.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+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,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-24 05:50+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "ഫോണ്‍"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "ക്യാമറ"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "ഗ്യാലറി"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "ഫേസ്ബുക്ക്"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "ബ്രൗസര്‍"
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr "ട്വിറ്റര്‍"
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr "ജിമെയില്‍"
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "കാലാവസ്ഥ"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "നോട്പാഡ്"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "കലണ്ടര്‍"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "മീഡിയ പ്ലെയര്‍"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr "എവര്‍നോട്ട്"
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "ഭുപടം"
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr "പിന്‍ട്രസ്റ്റ്"
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr "സൗണ്ട്ക്ലൗഡ്"
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr "വിക്കിപീഡിയ"
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr "യുട്യൂബ്"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -136,30 +68,28 @@ msgstr ""
13668"നിങ്ങളിപ്പോള്‍ സ്വൈപുകളും മറ്റും പഠിച്ചിരിക്കുന്നു<br><br>തുടങ്ങാന്‍ "
13769"എവിടെയെങ്കിലും ടാപ് ചെയ്യുക"
13870
139−#: Components/PageHeader.qml:345
71+#: Components/PageHeader.qml:364
14072msgid "Recent searches"
14173msgstr "സമീപകാല തിരയലുകള്‍"
14274
143−#. TRANSLATORS: Number of persons who rated this app
75+#: Dash/Apps/AppPreview.qml:135
76+msgid "Rate this"
77+msgstr "ഇത് അവലോകനം ചെയ്യുക"
78+
14479#. TRANSLATORS: Number of persons who rated this app/video/whatever
145−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
80+#: Dash/Previews/Header.qml:93
14681#, qt-format
14782msgid "(%1)"
14883msgstr "(%1)"
14984
150−#. TRANSLATORS: Number of persons who wrote reviews for this app
15185#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
152−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
86+#: Dash/Previews/Header.qml:105
15387#, qt-format
15488msgid "%1 review"
15589msgid_plural "%1 reviews"
15690msgstr[0] "%1 അവലോകനം"
15791msgstr[1] "%1 അവലോകനങ്ങള്‍"
15892
159−#: Dash/Apps/AppPreview.qml:135
160−msgid "Rate this"
161−msgstr "ഇത് അവലോകനം ചെയ്യുക"
162−
16393#: Dash/Previews/Reviews.qml:74
16494msgid "Add a review"
16595msgstr "ഒരു അവലോകനം ചേര്‍ക്കുക"
@@ -176,7 +106,7 @@ msgstr "അയയ്‌ക്കുക"
176106msgid "Comments:"
177107msgstr "അഭിപ്രായങ്ങള്‍:"
178108
179−#: Greeter/Lockscreen.qml:146
109+#: Greeter/Lockscreen.qml:149
180110msgid "Emergency Call"
181111msgstr "അടിയന്തിര വിളി"
182112
@@ -226,15 +156,7 @@ msgstr "വിക്ഷേപികയില്‍ സ്ഥിരപ്പെ
226156msgid "Unlock from Launcher"
227157msgstr "വിക്ഷേപികാ സ്ഥിരപ്പെടുത്തല്‍ ഒഴിവാക്കുക"
228158
229−#: plugins/Unity/scope.cpp:408
230−msgid "Sorry, there is nothing that matches your search."
231−msgstr "ക്ഷമിക്കണം, താങ്കളുടെ തിരച്ചിലുമായി ഒത്തുപോകുന്ന ഒന്നും തന്നെയില്ല"
232−
233−#: plugins/Unity/showallfilteroption.cpp:41
234−msgid "All"
235−msgstr "എല്ലാം"
236−
237−#: Shell.qml:441
159+#: Shell.qml:439
238160#, qt-format
239161msgid "Please enter %1"
240162msgstr "ദയവായി %1 നല്‍കുക"
po/my.po+20−98
@@ -7,84 +7,16 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
11−"PO-Revision-Date: 2013-10-09 11:35+0000\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11+"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"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "ဖုန်း"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "ကင်မရာ"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "ဓာတ်ပုံသိမ်းထားသည့်နေရာ"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "Facebook"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "Browser"
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr "Twitter"
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr "ဂျီမေးလ်"
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "ရာသီဥတု"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Notepad"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "ပြက္ခဒိန်"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "မီဒီယာဖွင့်စက်"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr "Evernote"
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "မြေပုံ"
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr "Pinterest"
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr "SoundCloud"
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr "ဝီကီပီဒီးယား"
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr "YouTube"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr "မကြာသေးခင်က ရှာဖွေခြင်း"
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr "ဒီဟာကိုအမှတ်ပေးမည်"
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr "(%1)"
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] ""
15387msgstr[1] ""
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr "ဒီဟာကိုအမှတ်ပေးမည်"
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr ""
@@ -172,18 +102,18 @@ msgstr "ပို့မည်"
172102msgid "Comments:"
173103msgstr "မှတ်ချက်များ-"
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177−msgstr ""
107+msgstr "အရေးပေါ်ခေါ်မည်"
178108
179109#: Greeter/PassphraseLockscreen.qml:59
180110#, qt-format
181111msgid "Hello %1"
182−msgstr ""
112+msgstr "ဟဲလို %1"
183113
184114#: Greeter/PassphraseLockscreen.qml:59
185115msgid "Hello"
186−msgstr ""
116+msgstr "ဟဲလို"
187117
188118#: Hud/HudParametrizedActionsPage.qml:132
189119msgid "Confirm"
@@ -207,7 +137,7 @@ msgstr "ပြောနေသည်"
207137
208138#: Notifications/NotificationMenuItemFactory.qml:89
209139msgid "Show password"
210−msgstr ""
140+msgstr "စကားဝှက်ကိုပြ"
211141
212142#: Panel/SearchIndicator.qml:27
213143msgid "Search"
@@ -216,21 +146,13 @@ msgstr "ရှာဖွေ"
216146#: plugins/Unity/Launcher/launcheritem.cpp:43
217147#: plugins/Unity/Launcher/launcheritem.cpp:73
218148msgid "Lock to Launcher"
219−msgstr ""
149+msgstr "Launcher တွင်ထားမည်"
220150
221151#: plugins/Unity/Launcher/launcheritem.cpp:73
222152msgid "Unlock from Launcher"
223−msgstr ""
153+msgstr "Launcher မှဖြုတ်မည်"
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "ဆောရီး၊ သင်၏ရှာဖွေမူနှင့်တူညီတာဘာမှမရှိပါ။"
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236−msgstr ""
158+msgstr "%1ကိုရိုက်ထည့်ပါ"
po/nb.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+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,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Telefon"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Kamera"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr ""
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "Vær"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Notisblokk"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Kalender"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr ""
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr ""
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr ""
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr ""
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr ""
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr ""
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr ""
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr "Siste søk"
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr ""
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] ""
15387msgstr[1] ""
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172102msgid "Comments:"
173103msgstr ""
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177107msgstr ""
178108
@@ -222,15 +152,7 @@ msgstr ""
222152msgid "Unlock from Launcher"
223153msgstr ""
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "Søket ga ingen treff."
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236158msgstr ""
po/nl.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
1111"PO-Revision-Date: 2013-06-27 07:19+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Dutch <nl@li.org>\n"
@@ -15,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr ""
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr ""
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr ""
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr ""
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr ""
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr ""
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr ""
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr ""
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr ""
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr ""
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr ""
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr "Recente zoekopdrachten"
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr ""
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] ""
15387msgstr[1] ""
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172102msgid "Comments:"
173103msgstr ""
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177107msgstr ""
178108
@@ -222,15 +152,7 @@ msgstr ""
222152msgid "Unlock from Launcher"
223153msgstr ""
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "Er is helaas niets dat met uw zoekopdracht overeenkomt."
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236158msgstr ""
po/pl.po+17−95
@@ -7,85 +7,17 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
11−"PO-Revision-Date: 2013-10-13 13:44+0000\n"
12−"Last-Translator: GTriderXC <gtriderxc@yahoo.com>\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11+"PO-Revision-Date: 2014-01-10 11:38+0000\n"
12+"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Polish <pl@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
1818"|| n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
20−"X-Generator: Launchpad (build 16831)\n"
21−
22−#: Applications/applications.js:23
23−msgid "Phone"
24−msgstr "Telefon"
25−
26−#: Applications/applications.js:29
27−msgid "Camera"
28−msgstr "Aparat"
29−
30−#: Applications/applications.js:35
31−msgid "Gallery"
32−msgstr "Galeria"
33−
34−#: Applications/applications.js:40
35−msgid "Facebook"
36−msgstr "Facebook"
37−
38−#: Applications/applications.js:46
39−msgid "Browser"
40−msgstr "Internet"
41−
42−#: Applications/applications.js:51
43−msgid "Twitter"
44−msgstr "Twitter"
45−
46−#: Applications/applications.js:57
47−msgid "GMail"
48−msgstr "GMail"
49−
50−#: Applications/applications.js:62
51−msgid "Weather"
52−msgstr "Pogoda"
53−
54−#: Applications/applications.js:68
55−msgid "Notepad"
56−msgstr "Notatki"
57−
58−#: Applications/applications.js:74
59−msgid "Calendar"
60−msgstr "Kalendarz"
61−
62−#: Applications/applications.js:80
63−msgid "Media Player"
64−msgstr "Odtwarzacz multimediów"
65−
66−#: Applications/applications.js:86
67−msgid "Evernote"
68−msgstr "Evernote"
69−
70−#: Applications/applications.js:91
71−msgid "Map"
72−msgstr "Mapa"
73−
74−#: Applications/applications.js:96
75−msgid "Pinterest"
76−msgstr "Pinterest"
77−
78−#: Applications/applications.js:101
79−msgid "SoundCloud"
80−msgstr "SoundCloud"
81−
82−#: Applications/applications.js:106
83−msgid "Wikipedia"
84−msgstr "Wikipedia"
85−
86−#: Applications/applications.js:111
87−msgid "YouTube"
88−msgstr "YouTube"
19+"X-Launchpad-Export-Date: 2014-01-11 06:38+0000\n"
20+"X-Generator: Launchpad (build 16890)\n"
8921
9022#: Components/EdgeDemoOverlay.qml:151
9123msgid "Skip intro"
@@ -137,20 +69,22 @@ msgstr ""
13769"Polecenia aktywatorów krawędzi ekranu zostały opanowane<br><br>Dotknij "
13870"gdziekolwiek aby kontynuować"
13971
140−#: Components/PageHeader.qml:345
72+#: Components/PageHeader.qml:364
14173msgid "Recent searches"
14274msgstr "Ostatnie wyszukiwania"
14375
144−#. TRANSLATORS: Number of persons who rated this app
76+#: Dash/Apps/AppPreview.qml:135
77+msgid "Rate this"
78+msgstr "Oceń to"
79+
14580#. TRANSLATORS: Number of persons who rated this app/video/whatever
146−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
81+#: Dash/Previews/Header.qml:93
14782#, qt-format
14883msgid "(%1)"
14984msgstr "(%1)"
15085
151−#. TRANSLATORS: Number of persons who wrote reviews for this app
15286#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
153−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
87+#: Dash/Previews/Header.qml:105
15488#, qt-format
15589msgid "%1 review"
15690msgid_plural "%1 reviews"
@@ -158,10 +92,6 @@ msgstr[0] "%1 opinia"
15892msgstr[1] "%1 opinie"
15993msgstr[2] "%1 opinii"
16094
161−#: Dash/Apps/AppPreview.qml:135
162−msgid "Rate this"
163−msgstr "Oceń to"
164−
16595#: Dash/Previews/Reviews.qml:74
16696msgid "Add a review"
16797msgstr "Dodaj recenzję"
@@ -178,7 +108,7 @@ msgstr "Wyślij"
178108msgid "Comments:"
179109msgstr "Komentarze:"
180110
181−#: Greeter/Lockscreen.qml:146
111+#: Greeter/Lockscreen.qml:149
182112msgid "Emergency Call"
183113msgstr "Telefon ratunkowy"
184114
@@ -213,7 +143,7 @@ msgstr "Rozpoznanie..."
213143
214144#: Notifications/NotificationMenuItemFactory.qml:89
215145msgid "Show password"
216−msgstr ""
146+msgstr "Wyświetl hasło"
217147
218148#: Panel/SearchIndicator.qml:27
219149msgid "Search"
@@ -222,21 +152,13 @@ msgstr "Szukaj"
222152#: plugins/Unity/Launcher/launcheritem.cpp:43
223153#: plugins/Unity/Launcher/launcheritem.cpp:73
224154msgid "Lock to Launcher"
225−msgstr ""
155+msgstr "Dodaj do panelu uruchamiania"
226156
227157#: plugins/Unity/Launcher/launcheritem.cpp:73
228158msgid "Unlock from Launcher"
229−msgstr ""
230−
231−#: plugins/Unity/scope.cpp:408
232−msgid "Sorry, there is nothing that matches your search."
233−msgstr "Nie znaleziono pasujących wyników."
234−
235−#: plugins/Unity/showallfilteroption.cpp:41
236−msgid "All"
237−msgstr "Wszystko"
159+msgstr "Usuń z panelu uruchamiania"
238160
239−#: Shell.qml:441
161+#: Shell.qml:439
240162#, qt-format
241163msgid "Please enter %1"
242164msgstr "Wprowadź %1"
po/pt_BR.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
1111"PO-Revision-Date: 2013-10-01 13:05+0000\n"
1212"Last-Translator: Rafael Neri <Unknown>\n"
1313"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
@@ -15,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Telefone"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Câmera"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "Galeria"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "Facebook"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "Navegador"
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr "Twitter"
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr "GMail"
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "Clima"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Bloco de notas"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Calendário"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "Media Player"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr "Evernote"
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "Mapa"
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr "Pinterest"
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr "SoundCloud"
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr "Wikipédia"
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr "YouTube"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -134,30 +66,28 @@ msgid ""
13466"phone<br><br>Tap anywhere to start"
13567msgstr ""
13668
137−#: Components/PageHeader.qml:345
69+#: Components/PageHeader.qml:364
13870msgid "Recent searches"
13971msgstr "Pesquisas recentes"
14072
141−#. TRANSLATORS: Number of persons who rated this app
73+#: Dash/Apps/AppPreview.qml:135
74+msgid "Rate this"
75+msgstr "Avaliar isto"
76+
14277#. TRANSLATORS: Number of persons who rated this app/video/whatever
143−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
78+#: Dash/Previews/Header.qml:93
14479#, qt-format
14580msgid "(%1)"
14681msgstr "(%1)"
14782
148−#. TRANSLATORS: Number of persons who wrote reviews for this app
14983#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
150−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
84+#: Dash/Previews/Header.qml:105
15185#, qt-format
15286msgid "%1 review"
15387msgid_plural "%1 reviews"
15488msgstr[0] "%1 análise"
15589msgstr[1] "%1 análises"
15690
157−#: Dash/Apps/AppPreview.qml:135
158−msgid "Rate this"
159−msgstr "Avaliar isto"
160−
16191#: Dash/Previews/Reviews.qml:74
16292msgid "Add a review"
16393msgstr "Adicionar uma análise"
@@ -174,7 +104,7 @@ msgstr "Enviar"
174104msgid "Comments:"
175105msgstr "Comentários:"
176106
177−#: Greeter/Lockscreen.qml:146
107+#: Greeter/Lockscreen.qml:149
178108msgid "Emergency Call"
179109msgstr "Chamada de emergência"
180110
@@ -224,15 +154,7 @@ msgstr ""
224154msgid "Unlock from Launcher"
225155msgstr ""
226156
227−#: plugins/Unity/scope.cpp:408
228−msgid "Sorry, there is nothing that matches your search."
229−msgstr "Desculpe, não há nada que corresponda à sua pesquisa."
230−
231−#: plugins/Unity/showallfilteroption.cpp:41
232−msgid "All"
233−msgstr ""
234−
235−#: Shell.qml:441
157+#: Shell.qml:439
236158#, qt-format
237159msgid "Please enter %1"
238160msgstr "Por favor, digite %1"
po/ro.po+12−91
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+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,76 +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: 2013-11-19 05:59+0000\n"
20−"X-Generator: Launchpad (build 16831)\n"
21−
22−#: Applications/applications.js:23
23−msgid "Phone"
24−msgstr ""
25−
26−#: Applications/applications.js:29
27−msgid "Camera"
28−msgstr ""
29−
30−#: Applications/applications.js:35
31−msgid "Gallery"
32−msgstr ""
33−
34−#: Applications/applications.js:40
35−msgid "Facebook"
36−msgstr ""
37−
38−#: Applications/applications.js:46
39−msgid "Browser"
40−msgstr ""
41−
42−#: Applications/applications.js:51
43−msgid "Twitter"
44−msgstr ""
45−
46−#: Applications/applications.js:57
47−msgid "GMail"
48−msgstr ""
49−
50−#: Applications/applications.js:62
51−msgid "Weather"
52−msgstr ""
53−
54−#: Applications/applications.js:68
55−msgid "Notepad"
56−msgstr ""
57−
58−#: Applications/applications.js:74
59−msgid "Calendar"
60−msgstr ""
61−
62−#: Applications/applications.js:80
63−msgid "Media Player"
64−msgstr ""
65−
66−#: Applications/applications.js:86
67−msgid "Evernote"
68−msgstr ""
69−
70−#: Applications/applications.js:91
71−msgid "Map"
72−msgstr ""
73−
74−#: Applications/applications.js:96
75−msgid "Pinterest"
76−msgstr ""
77−
78−#: Applications/applications.js:101
79−msgid "SoundCloud"
80−msgstr ""
81−
82−#: Applications/applications.js:106
83−msgid "Wikipedia"
84−msgstr ""
85−
86−#: Applications/applications.js:111
87−msgid "YouTube"
88−msgstr ""
19+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
20+"X-Generator: Launchpad (build 16877)\n"
8921
9022#: Components/EdgeDemoOverlay.qml:151
9123msgid "Skip intro"
@@ -133,30 +65,28 @@ msgid ""
13365"phone<br><br>Tap anywhere to start"
13466msgstr ""
13567
136−#: Components/PageHeader.qml:345
68+#: Components/PageHeader.qml:364
13769msgid "Recent searches"
13870msgstr "Căutări recente"
13971
140−#. TRANSLATORS: Number of persons who rated this app
72+#: Dash/Apps/AppPreview.qml:135
73+msgid "Rate this"
74+msgstr ""
75+
14176#. TRANSLATORS: Number of persons who rated this app/video/whatever
142−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
77+#: Dash/Previews/Header.qml:93
14378#, qt-format
14479msgid "(%1)"
14580msgstr ""
14681
147−#. TRANSLATORS: Number of persons who wrote reviews for this app
14882#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
149−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
83+#: Dash/Previews/Header.qml:105
15084#, qt-format
15185msgid "%1 review"
15286msgid_plural "%1 reviews"
15387msgstr[0] ""
15488msgstr[1] ""
15589
156−#: Dash/Apps/AppPreview.qml:135
157−msgid "Rate this"
158−msgstr ""
159−
16090#: Dash/Previews/Reviews.qml:74
16191msgid "Add a review"
16292msgstr ""
@@ -173,7 +103,7 @@ msgstr ""
173103msgid "Comments:"
174104msgstr ""
175105
176−#: Greeter/Lockscreen.qml:146
106+#: Greeter/Lockscreen.qml:149
177107msgid "Emergency Call"
178108msgstr ""
179109
@@ -223,16 +153,7 @@ msgstr ""
223153msgid "Unlock from Launcher"
224154msgstr ""
225155
226−#: plugins/Unity/scope.cpp:408
227−msgid "Sorry, there is nothing that matches your search."
228−msgstr ""
229−"Ne pare rău, nu este nimic care se potrivește căutării dumneavoastră."
230−
231−#: plugins/Unity/showallfilteroption.cpp:41
232−msgid "All"
233−msgstr ""
234−
235−#: Shell.qml:441
156+#: Shell.qml:439
236157#, qt-format
237158msgid "Please enter %1"
238159msgstr ""
po/ru.po+19−96
@@ -7,85 +7,17 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
11−"PO-Revision-Date: 2013-10-01 05:55+0000\n"
12−"Last-Translator: Zonov Roman <Unknown>\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11+"PO-Revision-Date: 2014-01-07 05:21+0000\n"
12+"Last-Translator: Ivlev Denis <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"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
20−"X-Generator: Launchpad (build 16831)\n"
21−
22−#: Applications/applications.js:23
23−msgid "Phone"
24−msgstr "Телефон"
25−
26−#: Applications/applications.js:29
27−msgid "Camera"
28−msgstr "Камера"
29−
30−#: Applications/applications.js:35
31−msgid "Gallery"
32−msgstr "Галерея"
33−
34−#: Applications/applications.js:40
35−msgid "Facebook"
36−msgstr "Facebook"
37−
38−#: Applications/applications.js:46
39−msgid "Browser"
40−msgstr "Обозреватель"
41−
42−#: Applications/applications.js:51
43−msgid "Twitter"
44−msgstr "Twitter"
45−
46−#: Applications/applications.js:57
47−msgid "GMail"
48−msgstr "GMail"
49−
50−#: Applications/applications.js:62
51−msgid "Weather"
52−msgstr "Погода"
53−
54−#: Applications/applications.js:68
55−msgid "Notepad"
56−msgstr "Блокнот"
57−
58−#: Applications/applications.js:74
59−msgid "Calendar"
60−msgstr "Календарь"
61−
62−#: Applications/applications.js:80
63−msgid "Media Player"
64−msgstr "Медиапроигрыватель"
65−
66−#: Applications/applications.js:86
67−msgid "Evernote"
68−msgstr "Evernote"
69−
70−#: Applications/applications.js:91
71−msgid "Map"
72−msgstr "Карты"
73−
74−#: Applications/applications.js:96
75−msgid "Pinterest"
76−msgstr "Pinterest"
77−
78−#: Applications/applications.js:101
79−msgid "SoundCloud"
80−msgstr "SoundCloud"
81−
82−#: Applications/applications.js:106
83−msgid "Wikipedia"
84−msgstr "Википедия"
85−
86−#: Applications/applications.js:111
87−msgid "YouTube"
88−msgstr "YouTube"
19+"X-Launchpad-Export-Date: 2014-01-08 05:43+0000\n"
20+"X-Generator: Launchpad (build 16877)\n"
8921
9022#: Components/EdgeDemoOverlay.qml:151
9123msgid "Skip intro"
@@ -138,28 +70,27 @@ msgid ""
13870"phone<br><br>Tap anywhere to start"
13971msgstr ""
14072
141−#: Components/PageHeader.qml:345
73+#: Components/PageHeader.qml:364
14274msgid "Recent searches"
14375msgstr "Последние поисковые запросы"
14476
145−#. TRANSLATORS: Number of persons who rated this app
77+#: Dash/Apps/AppPreview.qml:135
78+msgid "Rate this"
79+msgstr "Оцените это"
80+
14681#. TRANSLATORS: Number of persons who rated this app/video/whatever
147−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
82+#: Dash/Previews/Header.qml:93
14883#, qt-format
14984msgid "(%1)"
15085msgstr "(%1)"
15186
152−#. TRANSLATORS: Number of persons who wrote reviews for this app
15387#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
154−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
88+#: Dash/Previews/Header.qml:105
15589#, qt-format
15690msgid "%1 review"
15791msgid_plural "%1 reviews"
158−msgstr[0] "%1 отзыв"
159−
160−#: Dash/Apps/AppPreview.qml:135
161−msgid "Rate this"
162−msgstr "Оцените это"
92+msgstr[0] "%1 отзыва"
93+msgstr[1] "%1 отзывов"
16394
16495#: Dash/Previews/Reviews.qml:74
16596msgid "Add a review"
@@ -177,7 +108,7 @@ msgstr "Отправить"
177108msgid "Comments:"
178109msgstr "Комментарии:"
179110
180−#: Greeter/Lockscreen.qml:146
111+#: Greeter/Lockscreen.qml:149
181112msgid "Emergency Call"
182113msgstr "Экстренный вызов"
183114
@@ -212,7 +143,7 @@ msgstr "Говорите..."
212143
213144#: Notifications/NotificationMenuItemFactory.qml:89
214145msgid "Show password"
215−msgstr ""
146+msgstr "Показать пароль"
216147
217148#: Panel/SearchIndicator.qml:27
218149msgid "Search"
@@ -221,21 +152,13 @@ msgstr "Поиск"
221152#: plugins/Unity/Launcher/launcheritem.cpp:43
222153#: plugins/Unity/Launcher/launcheritem.cpp:73
223154msgid "Lock to Launcher"
224−msgstr ""
155+msgstr "Закрепить на панели"
225156
226157#: plugins/Unity/Launcher/launcheritem.cpp:73
227158msgid "Unlock from Launcher"
228−msgstr ""
229−
230−#: plugins/Unity/scope.cpp:408
231−msgid "Sorry, there is nothing that matches your search."
232−msgstr "Извините, поиск не дал результатов."
233−
234−#: plugins/Unity/showallfilteroption.cpp:41
235−msgid "All"
236−msgstr ""
159+msgstr "Убрать с панели"
237160
238−#: Shell.qml:441
161+#: Shell.qml:439
239162#, qt-format
240163msgid "Please enter %1"
241164msgstr "Пожалуйста, введите %1"
po/shn.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+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,76 +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: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr ""
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr ""
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr ""
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr ""
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr ""
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr ""
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr ""
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr ""
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr ""
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr ""
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr ""
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr ""
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr ""
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] ""
15387msgstr[1] ""
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172102msgid "Comments:"
173103msgstr ""
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177107msgstr ""
178108
@@ -222,15 +152,7 @@ msgstr ""
222152msgid "Unlock from Launcher"
223153msgstr ""
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr ""
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236158msgstr ""
po/si.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+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,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr ""
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr ""
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr ""
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr ""
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr ""
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr ""
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr ""
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr ""
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr ""
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr ""
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr ""
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr ""
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr ""
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] ""
15387msgstr[1] ""
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172102msgid "Comments:"
173103msgstr ""
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177107msgstr ""
178108
@@ -222,15 +152,7 @@ msgstr ""
222152msgid "Unlock from Launcher"
223153msgstr ""
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr ""
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236158msgstr ""
po/sl.po+16−94
@@ -7,8 +7,8 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
11−"PO-Revision-Date: 2013-10-02 10:55+0000\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11+"PO-Revision-Date: 2013-11-30 08:20+0000\n"
1212"Last-Translator: Damir Jerovšek <Unknown>\n"
1313"Language-Team: Slovenian <sl@li.org>\n"
1414"MIME-Version: 1.0\n"
@@ -16,76 +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: 2013-11-19 05:59+0000\n"
20−"X-Generator: Launchpad (build 16831)\n"
21−
22−#: Applications/applications.js:23
23−msgid "Phone"
24−msgstr "Telefon"
25−
26−#: Applications/applications.js:29
27−msgid "Camera"
28−msgstr "Fotoaparat"
29−
30−#: Applications/applications.js:35
31−msgid "Gallery"
32−msgstr "Galerija"
33−
34−#: Applications/applications.js:40
35−msgid "Facebook"
36−msgstr "Facebook"
37−
38−#: Applications/applications.js:46
39−msgid "Browser"
40−msgstr "Brskalnik"
41−
42−#: Applications/applications.js:51
43−msgid "Twitter"
44−msgstr "Twitter"
45−
46−#: Applications/applications.js:57
47−msgid "GMail"
48−msgstr "GMail"
49−
50−#: Applications/applications.js:62
51−msgid "Weather"
52−msgstr "Vreme"
53−
54−#: Applications/applications.js:68
55−msgid "Notepad"
56−msgstr "Beležnica"
57−
58−#: Applications/applications.js:74
59−msgid "Calendar"
60−msgstr "Koledar"
61−
62−#: Applications/applications.js:80
63−msgid "Media Player"
64−msgstr "Predvajalnik predstavnosti"
65−
66−#: Applications/applications.js:86
67−msgid "Evernote"
68−msgstr "Evernote"
69−
70−#: Applications/applications.js:91
71−msgid "Map"
72−msgstr "Zemljevid"
73−
74−#: Applications/applications.js:96
75−msgid "Pinterest"
76−msgstr "Pinterest"
77−
78−#: Applications/applications.js:101
79−msgid "SoundCloud"
80−msgstr "SoundCloud"
81−
82−#: Applications/applications.js:106
83−msgid "Wikipedia"
84−msgstr "Wikipedija"
85−
86−#: Applications/applications.js:111
87−msgid "YouTube"
88−msgstr "YouTube"
19+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
20+"X-Generator: Launchpad (build 16877)\n"
8921
9022#: Components/EdgeDemoOverlay.qml:151
9123msgid "Skip intro"
@@ -137,20 +69,22 @@ msgstr ""
13769"Sedaj ste osvojili poteze robov ter lahko začnete uporabljati "
13870"telefon<br><br>Tapnite kjerkoli na začetek"
13971
140−#: Components/PageHeader.qml:345
72+#: Components/PageHeader.qml:364
14173msgid "Recent searches"
14274msgstr "Nedavna iskanja"
14375
144−#. TRANSLATORS: Number of persons who rated this app
76+#: Dash/Apps/AppPreview.qml:135
77+msgid "Rate this"
78+msgstr "Ocenite"
79+
14580#. TRANSLATORS: Number of persons who rated this app/video/whatever
146−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
81+#: Dash/Previews/Header.qml:93
14782#, qt-format
14883msgid "(%1)"
14984msgstr "(%1)"
15085
151−#. TRANSLATORS: Number of persons who wrote reviews for this app
15286#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
153−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
87+#: Dash/Previews/Header.qml:105
15488#, qt-format
15589msgid "%1 review"
15690msgid_plural "%1 reviews"
@@ -159,10 +93,6 @@ msgstr[1] "%1 ocena"
15993msgstr[2] "%1 oceni"
16094msgstr[3] "%1 ocene"
16195
162−#: Dash/Apps/AppPreview.qml:135
163−msgid "Rate this"
164−msgstr "Ocenite"
165−
16696#: Dash/Previews/Reviews.qml:74
16797msgid "Add a review"
16898msgstr "Dodaj oceno"
@@ -179,7 +109,7 @@ msgstr "Pošlji"
179109msgid "Comments:"
180110msgstr "Opombe:"
181111
182−#: Greeter/Lockscreen.qml:146
112+#: Greeter/Lockscreen.qml:149
183113msgid "Emergency Call"
184114msgstr "Klic v sili"
185115
@@ -214,7 +144,7 @@ msgstr "Govorjenje ..."
214144
215145#: Notifications/NotificationMenuItemFactory.qml:89
216146msgid "Show password"
217−msgstr ""
147+msgstr "Pokaži geslo"
218148
219149#: Panel/SearchIndicator.qml:27
220150msgid "Search"
@@ -223,21 +153,13 @@ msgstr "Iskanje"
223153#: plugins/Unity/Launcher/launcheritem.cpp:43
224154#: plugins/Unity/Launcher/launcheritem.cpp:73
225155msgid "Lock to Launcher"
226−msgstr ""
156+msgstr "Zakleni na zaganjalnik"
227157
228158#: plugins/Unity/Launcher/launcheritem.cpp:73
229159msgid "Unlock from Launcher"
230−msgstr ""
231−
232−#: plugins/Unity/scope.cpp:408
233−msgid "Sorry, there is nothing that matches your search."
234−msgstr "Nič se ne ujema z vašim iskalnim nizom."
235−
236−#: plugins/Unity/showallfilteroption.cpp:41
237−msgid "All"
238−msgstr "Vse"
160+msgstr "Odkleni z zaganjalnika"
239161
240−#: Shell.qml:441
162+#: Shell.qml:439
241163#, qt-format
242164msgid "Please enter %1"
243165msgstr "Vnesite %1"
po/sr.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+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,76 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
20−"X-Generator: Launchpad (build 16831)\n"
21−
22−#: Applications/applications.js:23
23−msgid "Phone"
24−msgstr ""
25−
26−#: Applications/applications.js:29
27−msgid "Camera"
28−msgstr ""
29−
30−#: Applications/applications.js:35
31−msgid "Gallery"
32−msgstr ""
33−
34−#: Applications/applications.js:40
35−msgid "Facebook"
36−msgstr ""
37−
38−#: Applications/applications.js:46
39−msgid "Browser"
40−msgstr ""
41−
42−#: Applications/applications.js:51
43−msgid "Twitter"
44−msgstr ""
45−
46−#: Applications/applications.js:57
47−msgid "GMail"
48−msgstr ""
49−
50−#: Applications/applications.js:62
51−msgid "Weather"
52−msgstr ""
53−
54−#: Applications/applications.js:68
55−msgid "Notepad"
56−msgstr ""
57−
58−#: Applications/applications.js:74
59−msgid "Calendar"
60−msgstr ""
61−
62−#: Applications/applications.js:80
63−msgid "Media Player"
64−msgstr ""
65−
66−#: Applications/applications.js:86
67−msgid "Evernote"
68−msgstr ""
69−
70−#: Applications/applications.js:91
71−msgid "Map"
72−msgstr ""
73−
74−#: Applications/applications.js:96
75−msgid "Pinterest"
76−msgstr ""
77−
78−#: Applications/applications.js:101
79−msgid "SoundCloud"
80−msgstr ""
81−
82−#: Applications/applications.js:106
83−msgid "Wikipedia"
84−msgstr ""
85−
86−#: Applications/applications.js:111
87−msgid "YouTube"
88−msgstr ""
19+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
20+"X-Generator: Launchpad (build 16877)\n"
8921
9022#: Components/EdgeDemoOverlay.qml:151
9123msgid "Skip intro"
@@ -133,30 +65,28 @@ msgid ""
13365"phone<br><br>Tap anywhere to start"
13466msgstr ""
13567
136−#: Components/PageHeader.qml:345
68+#: Components/PageHeader.qml:364
13769msgid "Recent searches"
13870msgstr "Скорашње претраге"
13971
140−#. TRANSLATORS: Number of persons who rated this app
72+#: Dash/Apps/AppPreview.qml:135
73+msgid "Rate this"
74+msgstr ""
75+
14176#. TRANSLATORS: Number of persons who rated this app/video/whatever
142−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
77+#: Dash/Previews/Header.qml:93
14378#, qt-format
14479msgid "(%1)"
14580msgstr ""
14681
147−#. TRANSLATORS: Number of persons who wrote reviews for this app
14882#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
149−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
83+#: Dash/Previews/Header.qml:105
15084#, qt-format
15185msgid "%1 review"
15286msgid_plural "%1 reviews"
15387msgstr[0] ""
15488msgstr[1] ""
15589
156−#: Dash/Apps/AppPreview.qml:135
157−msgid "Rate this"
158−msgstr ""
159−
16090#: Dash/Previews/Reviews.qml:74
16191msgid "Add a review"
16292msgstr ""
@@ -173,7 +103,7 @@ msgstr ""
173103msgid "Comments:"
174104msgstr ""
175105
176−#: Greeter/Lockscreen.qml:146
106+#: Greeter/Lockscreen.qml:149
177107msgid "Emergency Call"
178108msgstr ""
179109
@@ -223,15 +153,7 @@ msgstr ""
223153msgid "Unlock from Launcher"
224154msgstr ""
225155
226−#: plugins/Unity/scope.cpp:408
227−msgid "Sorry, there is nothing that matches your search."
228−msgstr "Нажалост, претрага није наишла на икакво подударање."
229−
230−#: plugins/Unity/showallfilteroption.cpp:41
231−msgid "All"
232−msgstr ""
233−
234−#: Shell.qml:441
156+#: Shell.qml:439
235157#, qt-format
236158msgid "Please enter %1"
237159msgstr ""
po/sv.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+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,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr ""
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr ""
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr ""
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr ""
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr ""
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr ""
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr ""
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr ""
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr ""
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr ""
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr ""
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr ""
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr ""
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] ""
15387msgstr[1] ""
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172102msgid "Comments:"
173103msgstr ""
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177107msgstr ""
178108
@@ -222,15 +152,7 @@ msgstr ""
222152msgid "Unlock from Launcher"
223153msgstr ""
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr ""
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236158msgstr ""
po/ta.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
1111"PO-Revision-Date: 2013-10-24 11:36+0000\n"
1212"Last-Translator: Thangamani Arun - தங்கமணி அருண் <thangam.arunx@gmail.com>\n"
1313"Language-Team: Ubuntu Tamil Team/Free Tamil Computing/Thamizha\n"
@@ -15,78 +15,10 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
2020"Language: ta\n"
2121
22−#: Applications/applications.js:23
23−msgid "Phone"
24−msgstr "தொலைபேசி"
25−
26−#: Applications/applications.js:29
27−msgid "Camera"
28−msgstr "புகைப்பட கருவி"
29−
30−#: Applications/applications.js:35
31−msgid "Gallery"
32−msgstr "படத்தொகுப்பு"
33−
34−#: Applications/applications.js:40
35−msgid "Facebook"
36−msgstr "முகநுல்"
37−
38−#: Applications/applications.js:46
39−msgid "Browser"
40−msgstr "உலாவி"
41−
42−#: Applications/applications.js:51
43−msgid "Twitter"
44−msgstr "ட்விட்டர்"
45−
46−#: Applications/applications.js:57
47−msgid "GMail"
48−msgstr "ஜிமெயில்"
49−
50−#: Applications/applications.js:62
51−msgid "Weather"
52−msgstr "வானிலை"
53−
54−#: Applications/applications.js:68
55−msgid "Notepad"
56−msgstr "குறிப்புபலகை"
57−
58−#: Applications/applications.js:74
59−msgid "Calendar"
60−msgstr "நாள்காட்டி"
61−
62−#: Applications/applications.js:80
63−msgid "Media Player"
64−msgstr "ஊடக இயக்கி"
65−
66−#: Applications/applications.js:86
67−msgid "Evernote"
68−msgstr "எப்போதும்குறிப்பெடு"
69−
70−#: Applications/applications.js:91
71−msgid "Map"
72−msgstr "வரைபடம்"
73−
74−#: Applications/applications.js:96
75−msgid "Pinterest"
76−msgstr "விசைத்தட்டு"
77−
78−#: Applications/applications.js:101
79−msgid "SoundCloud"
80−msgstr "ஒலி கிளவுட்"
81−
82−#: Applications/applications.js:106
83−msgid "Wikipedia"
84−msgstr "விக்கிப்பீடியா"
85−
86−#: Applications/applications.js:111
87−msgid "YouTube"
88−msgstr "யூட்யுப்"
89−
9022#: Components/EdgeDemoOverlay.qml:151
9123msgid "Skip intro"
9224msgstr "அறிமுகத்தை தவிர்"
@@ -138,30 +70,28 @@ msgstr ""
13870"பயன்படுத்த தொடங்கவும் <br> <br>தட்டுவதன் மூலம் எங்க வேண்டுமானாலும் "
13971"தொடங்கலாம்."
14072
141−#: Components/PageHeader.qml:345
73+#: Components/PageHeader.qml:364
14274msgid "Recent searches"
14375msgstr "கடையாக தேடப்பட்டவைகள்"
14476
145−#. TRANSLATORS: Number of persons who rated this app
77+#: Dash/Apps/AppPreview.qml:135
78+msgid "Rate this"
79+msgstr "இதை மதிப்பிடு"
80+
14681#. TRANSLATORS: Number of persons who rated this app/video/whatever
147−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
82+#: Dash/Previews/Header.qml:93
14883#, qt-format
14984msgid "(%1)"
15085msgstr "(%1)"
15186
152−#. TRANSLATORS: Number of persons who wrote reviews for this app
15387#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
154−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
88+#: Dash/Previews/Header.qml:105
15589#, qt-format
15690msgid "%1 review"
15791msgid_plural "%1 reviews"
15892msgstr[0] "%1 பரிசீலனை"
15993msgstr[1] "%1 பரிசீலனைகள்"
16094
161−#: Dash/Apps/AppPreview.qml:135
162−msgid "Rate this"
163−msgstr "இதை மதிப்பிடு"
164−
16595#: Dash/Previews/Reviews.qml:74
16696msgid "Add a review"
16797msgstr "ஒரு பரிசீலனையை சேர்"
@@ -178,7 +108,7 @@ msgstr "அனுப்பு"
178108msgid "Comments:"
179109msgstr "கருத்துகள்:"
180110
181−#: Greeter/Lockscreen.qml:146
111+#: Greeter/Lockscreen.qml:149
182112msgid "Emergency Call"
183113msgstr "அவசர அழைப்பு"
184114
@@ -228,15 +158,7 @@ msgstr ""
228158msgid "Unlock from Launcher"
229159msgstr ""
230160
231−#: plugins/Unity/scope.cpp:408
232−msgid "Sorry, there is nothing that matches your search."
233−msgstr "மன்னிக்கவும், உங்களுடைய தேடலுக்கு தகுந்த பொருத்தம் கிடைக்கவில்லை."
234−
235−#: plugins/Unity/showallfilteroption.cpp:41
236−msgid "All"
237−msgstr "அனைத்தும்"
238−
239−#: Shell.qml:441
161+#: Shell.qml:439
240162#, qt-format
241163msgid "Please enter %1"
242164msgstr "தயவுச்செய்து %1 உள்ளிடு"
po/te.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+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,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr ""
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr ""
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr ""
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr ""
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr ""
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr ""
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr ""
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr ""
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr ""
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr ""
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr ""
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr ""
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr ""
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] ""
15387msgstr[1] ""
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172102msgid "Comments:"
173103msgstr ""
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177107msgstr ""
178108
@@ -222,15 +152,7 @@ msgstr ""
222152msgid "Unlock from Launcher"
223153msgstr ""
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr ""
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236158msgstr ""
po/tr.po+17−95
@@ -7,84 +7,16 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
11−"PO-Revision-Date: 2013-10-01 13:21+0000\n"
12−"Last-Translator: Volkan Gezer <Unknown>\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11+"PO-Revision-Date: 2013-12-12 16:06+0000\n"
12+"Last-Translator: Arda Ünlü <aarda.uunlu@gmail.com>\n"
1313"Language-Team: Turkish <tr@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "Telefon"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "Kamera"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "Galeri"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "Facebook"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "Tarayıcı"
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr "Twitter"
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr "GMail"
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "Hava Durumu"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "Not Defteri"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "Takvim"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "Ortam Oynatıcı"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr "Evernote"
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "Harita"
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr "Pinterest"
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr "SoundCloud"
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr "Vikipedi"
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr "YouTube"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -133,30 +65,28 @@ msgid ""
13365"phone<br><br>Tap anywhere to start"
13466msgstr ""
13567
136−#: Components/PageHeader.qml:345
68+#: Components/PageHeader.qml:364
13769msgid "Recent searches"
13870msgstr "Son Arananlar"
13971
140−#. TRANSLATORS: Number of persons who rated this app
72+#: Dash/Apps/AppPreview.qml:135
73+msgid "Rate this"
74+msgstr "Oyla"
75+
14176#. TRANSLATORS: Number of persons who rated this app/video/whatever
142−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
77+#: Dash/Previews/Header.qml:93
14378#, qt-format
14479msgid "(%1)"
14580msgstr "(%1)"
14681
147−#. TRANSLATORS: Number of persons who wrote reviews for this app
14882#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
149−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
83+#: Dash/Previews/Header.qml:105
15084#, qt-format
15185msgid "%1 review"
15286msgid_plural "%1 reviews"
15387msgstr[0] "%1 inceleme"
15488msgstr[1] "%1 inceleme"
15589
156−#: Dash/Apps/AppPreview.qml:135
157−msgid "Rate this"
158−msgstr "Oyla"
159−
16090#: Dash/Previews/Reviews.qml:74
16191msgid "Add a review"
16292msgstr "Bir inceleme ekle"
@@ -173,7 +103,7 @@ msgstr "Gönder"
173103msgid "Comments:"
174104msgstr "Yorumlar:"
175105
176−#: Greeter/Lockscreen.qml:146
106+#: Greeter/Lockscreen.qml:149
177107msgid "Emergency Call"
178108msgstr "Acil Arama"
179109
@@ -208,7 +138,7 @@ msgstr "Konuşuyor..."
208138
209139#: Notifications/NotificationMenuItemFactory.qml:89
210140msgid "Show password"
211−msgstr ""
141+msgstr "Parolayı göster"
212142
213143#: Panel/SearchIndicator.qml:27
214144msgid "Search"
@@ -217,21 +147,13 @@ msgstr "Ara"
217147#: plugins/Unity/Launcher/launcheritem.cpp:43
218148#: plugins/Unity/Launcher/launcheritem.cpp:73
219149msgid "Lock to Launcher"
220−msgstr ""
150+msgstr "Başlatıcıya Sabitle"
221151
222152#: plugins/Unity/Launcher/launcheritem.cpp:73
223153msgid "Unlock from Launcher"
224−msgstr ""
225−
226−#: plugins/Unity/scope.cpp:408
227−msgid "Sorry, there is nothing that matches your search."
228−msgstr "Üzgünüz, aramanızla eşleşen hiçbir şey yok."
229−
230−#: plugins/Unity/showallfilteroption.cpp:41
231−msgid "All"
232−msgstr ""
154+msgstr "Başlatıcıdan Ayır"
233155
234−#: Shell.qml:441
156+#: Shell.qml:439
235157#, qt-format
236158msgid "Please enter %1"
237159msgstr "Lütfen %1 girin"
po/ug.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
1111"PO-Revision-Date: 2013-10-09 22:38+0000\n"
1212"Last-Translator: Gheyret T.Kenji <Unknown>\n"
1313"Language-Team: Uyghur <ug@li.org>\n"
@@ -15,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "تېلېفون"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "كامېرا"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr ""
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "فېيىسبۇك(Facebook)"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "توركۆرگۈ"
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr "تىۋىتتېر(Twitter)"
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr "GMail"
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "ھاۋا رايى"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "خاتىرە دەپتەر(Notepad)"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "يىلنامە"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "ۋاسىتە قويغۇ"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr "Evernote"
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "خەرىتە"
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr "Pinterest"
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr "SoundCloud"
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr "ۋىكىپېدىيە"
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr "YouTube"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -132,29 +64,27 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr "يېقىنقى ئىزدەشلەر"
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr "(%1)"
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] "%1 باھا"
15387
154−#: Dash/Apps/AppPreview.qml:135
155−msgid "Rate this"
156−msgstr ""
157−
15888#: Dash/Previews/Reviews.qml:74
15989msgid "Add a review"
16090msgstr ""
@@ -171,7 +101,7 @@ msgstr "ئەۋەت"
171101msgid "Comments:"
172102msgstr "ئىنكاس:"
173103
174−#: Greeter/Lockscreen.qml:146
104+#: Greeter/Lockscreen.qml:149
175105msgid "Emergency Call"
176106msgstr ""
177107
@@ -221,15 +151,7 @@ msgstr ""
221151msgid "Unlock from Launcher"
222152msgstr ""
223153
224−#: plugins/Unity/scope.cpp:408
225−msgid "Sorry, there is nothing that matches your search."
226−msgstr "كەچۈرۈڭ، ئىزدىگىنىڭىزگە ماس نەتىجە تېپىلمىدى."
227−
228−#: plugins/Unity/showallfilteroption.cpp:41
229−msgid "All"
230−msgstr "ھەممىسى"
231−
232−#: Shell.qml:441
154+#: Shell.qml:439
233155#, qt-format
234156msgid "Please enter %1"
235157msgstr "%1 نى كىرگۈزۈڭ"
po/uk.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+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,76 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2013-11-24 05:50+0000\n"
20−"X-Generator: Launchpad (build 16831)\n"
21−
22−#: Applications/applications.js:23
23−msgid "Phone"
24−msgstr "Телефон"
25−
26−#: Applications/applications.js:29
27−msgid "Camera"
28−msgstr "Фотоапарат"
29−
30−#: Applications/applications.js:35
31−msgid "Gallery"
32−msgstr "Галерея"
33−
34−#: Applications/applications.js:40
35−msgid "Facebook"
36−msgstr "Facebook"
37−
38−#: Applications/applications.js:46
39−msgid "Browser"
40−msgstr "Навігатор"
41−
42−#: Applications/applications.js:51
43−msgid "Twitter"
44−msgstr "Twitter"
45−
46−#: Applications/applications.js:57
47−msgid "GMail"
48−msgstr "GMail"
49−
50−#: Applications/applications.js:62
51−msgid "Weather"
52−msgstr "Погода"
53−
54−#: Applications/applications.js:68
55−msgid "Notepad"
56−msgstr "Блокнот"
57−
58−#: Applications/applications.js:74
59−msgid "Calendar"
60−msgstr "Календар"
61−
62−#: Applications/applications.js:80
63−msgid "Media Player"
64−msgstr "Програвач"
65−
66−#: Applications/applications.js:86
67−msgid "Evernote"
68−msgstr "Evernote"
69−
70−#: Applications/applications.js:91
71−msgid "Map"
72−msgstr "Карта"
73−
74−#: Applications/applications.js:96
75−msgid "Pinterest"
76−msgstr "Pinterest"
77−
78−#: Applications/applications.js:101
79−msgid "SoundCloud"
80−msgstr "SoundCloud"
81−
82−#: Applications/applications.js:106
83−msgid "Wikipedia"
84−msgstr "Вікіпедія"
85−
86−#: Applications/applications.js:111
87−msgid "YouTube"
88−msgstr "YouTube"
19+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
20+"X-Generator: Launchpad (build 16877)\n"
8921
9022#: Components/EdgeDemoOverlay.qml:151
9123msgid "Skip intro"
@@ -138,20 +70,22 @@ msgstr ""
13870"Тепер жести налаштовано, ви можете почати користуватися "
13971"телефоном.<br><br>Натисніть у довільному місці екрана."
14072
141−#: Components/PageHeader.qml:345
73+#: Components/PageHeader.qml:364
14274msgid "Recent searches"
14375msgstr "Нещодавні пошуки"
14476
145−#. TRANSLATORS: Number of persons who rated this app
77+#: Dash/Apps/AppPreview.qml:135
78+msgid "Rate this"
79+msgstr "Оцінити"
80+
14681#. TRANSLATORS: Number of persons who rated this app/video/whatever
147−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
82+#: Dash/Previews/Header.qml:93
14883#, qt-format
14984msgid "(%1)"
15085msgstr "(%1)"
15186
152−#. TRANSLATORS: Number of persons who wrote reviews for this app
15387#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
154−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
88+#: Dash/Previews/Header.qml:105
15589#, qt-format
15690msgid "%1 review"
15791msgid_plural "%1 reviews"
@@ -159,10 +93,6 @@ msgstr[0] "%1 рецензія"
15993msgstr[1] "%1 рецензії"
16094msgstr[2] "%1 рецензій"
16195
162−#: Dash/Apps/AppPreview.qml:135
163−msgid "Rate this"
164−msgstr "Оцінити"
165−
16696#: Dash/Previews/Reviews.qml:74
16797msgid "Add a review"
16898msgstr "Додати рецензію"
@@ -179,7 +109,7 @@ msgstr "Надіслати"
179109msgid "Comments:"
180110msgstr "Коментарі:"
181111
182−#: Greeter/Lockscreen.qml:146
112+#: Greeter/Lockscreen.qml:149
183113msgid "Emergency Call"
184114msgstr "Терміновий виклик"
185115
@@ -229,15 +159,7 @@ msgstr "Зафіксувати на панелі запуску"
229159msgid "Unlock from Launcher"
230160msgstr "Від’єднати від панелі запуску"
231161
232−#: plugins/Unity/scope.cpp:408
233−msgid "Sorry, there is nothing that matches your search."
234−msgstr "Вибачте, для вказаних вами ключових слів нічого не знайдено."
235−
236−#: plugins/Unity/showallfilteroption.cpp:41
237−msgid "All"
238−msgstr "Усе"
239−
240−#: Shell.qml:441
162+#: Shell.qml:439
241163#, qt-format
242164msgid "Please enter %1"
243165msgstr "Будь ласка, введіть %1"
po/unity8.pot+10−88
@@ -8,7 +8,7 @@ msgid ""
88msgstr ""
99"Project-Id-Version: unity8\n"
1010"Report-Msgid-Bugs-To: \n"
11−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
11+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
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"
@@ -18,74 +18,6 @@ msgstr ""
1818"Content-Transfer-Encoding: 8bit\n"
1919"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
2020
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr ""
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr ""
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr ""
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr ""
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr ""
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr ""
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr ""
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr ""
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr ""
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr ""
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr ""
88−
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
9123msgstr ""
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr ""
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr ""
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] ""
15387msgstr[1] ""
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172102msgid "Comments:"
173103msgstr ""
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177107msgstr ""
178108
@@ -222,15 +152,7 @@ msgstr ""
222152msgid "Unlock from Launcher"
223153msgstr ""
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr ""
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236158msgstr ""
po/xh.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+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,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr ""
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr ""
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr ""
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr ""
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr ""
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr ""
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr ""
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr ""
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr ""
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr ""
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr ""
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr ""
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr ""
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] ""
15387msgstr[1] ""
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172102msgid "Comments:"
173103msgstr ""
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177107msgstr ""
178108
@@ -222,15 +152,7 @@ msgstr ""
222152msgid "Unlock from Launcher"
223153msgstr ""
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr ""
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236158msgstr ""
po/zh_CN.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+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,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr "电话"
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr "相机"
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr "相册"
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr "Facebook"
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr "浏览器"
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr "Twitter"
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr "GMail"
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr "天气"
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr "记事本"
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr "日历"
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr "媒体播放器"
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr "印象笔记"
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr "地图"
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr "Pinterest"
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr "SoundCloud"
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr "维基百科"
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr "YouTube"
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr "近期搜索"
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr ""
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] ""
15387msgstr[1] ""
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172102msgid "Comments:"
173103msgstr ""
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177107msgstr ""
178108
@@ -222,15 +152,7 @@ msgstr ""
222152msgid "Unlock from Launcher"
223153msgstr ""
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "对不起,没有找到您想要的结果。"
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236158msgstr ""
po/zh_TW.po+12−90
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-11-12 16:10+0100\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
1111"PO-Revision-Date: 2013-06-27 10:24+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
@@ -15,76 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2013-11-19 05:59+0000\n"
19−"X-Generator: Launchpad (build 16831)\n"
20−
21−#: Applications/applications.js:23
22−msgid "Phone"
23−msgstr ""
24−
25−#: Applications/applications.js:29
26−msgid "Camera"
27−msgstr ""
28−
29−#: Applications/applications.js:35
30−msgid "Gallery"
31−msgstr ""
32−
33−#: Applications/applications.js:40
34−msgid "Facebook"
35−msgstr ""
36−
37−#: Applications/applications.js:46
38−msgid "Browser"
39−msgstr ""
40−
41−#: Applications/applications.js:51
42−msgid "Twitter"
43−msgstr ""
44−
45−#: Applications/applications.js:57
46−msgid "GMail"
47−msgstr ""
48−
49−#: Applications/applications.js:62
50−msgid "Weather"
51−msgstr ""
52−
53−#: Applications/applications.js:68
54−msgid "Notepad"
55−msgstr ""
56−
57−#: Applications/applications.js:74
58−msgid "Calendar"
59−msgstr ""
60−
61−#: Applications/applications.js:80
62−msgid "Media Player"
63−msgstr ""
64−
65−#: Applications/applications.js:86
66−msgid "Evernote"
67−msgstr ""
68−
69−#: Applications/applications.js:91
70−msgid "Map"
71−msgstr ""
72−
73−#: Applications/applications.js:96
74−msgid "Pinterest"
75−msgstr ""
76−
77−#: Applications/applications.js:101
78−msgid "SoundCloud"
79−msgstr ""
80−
81−#: Applications/applications.js:106
82−msgid "Wikipedia"
83−msgstr ""
84−
85−#: Applications/applications.js:111
86−msgid "YouTube"
87−msgstr ""
18+"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19+"X-Generator: Launchpad (build 16877)\n"
8820
8921#: Components/EdgeDemoOverlay.qml:151
9022msgid "Skip intro"
@@ -132,30 +64,28 @@ msgid ""
13264"phone<br><br>Tap anywhere to start"
13365msgstr ""
13466
135−#: Components/PageHeader.qml:345
67+#: Components/PageHeader.qml:364
13668msgid "Recent searches"
13769msgstr "最近搜尋"
13870
139−#. TRANSLATORS: Number of persons who rated this app
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
14075#. TRANSLATORS: Number of persons who rated this app/video/whatever
141−#: Dash/Apps/AppInfo.qml:73 Dash/Previews/Header.qml:93
76+#: Dash/Previews/Header.qml:93
14277#, qt-format
14378msgid "(%1)"
14479msgstr ""
14580
146−#. TRANSLATORS: Number of persons who wrote reviews for this app
14781#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
148−#: Dash/Apps/AppInfo.qml:85 Dash/Previews/Header.qml:105
82+#: Dash/Previews/Header.qml:105
14983#, qt-format
15084msgid "%1 review"
15185msgid_plural "%1 reviews"
15286msgstr[0] ""
15387msgstr[1] ""
15488
155−#: Dash/Apps/AppPreview.qml:135
156−msgid "Rate this"
157−msgstr ""
158−
15989#: Dash/Previews/Reviews.qml:74
16090msgid "Add a review"
16191msgstr ""
@@ -172,7 +102,7 @@ msgstr ""
172102msgid "Comments:"
173103msgstr ""
174104
175−#: Greeter/Lockscreen.qml:146
105+#: Greeter/Lockscreen.qml:149
176106msgid "Emergency Call"
177107msgstr ""
178108
@@ -222,15 +152,7 @@ msgstr ""
222152msgid "Unlock from Launcher"
223153msgstr ""
224154
225−#: plugins/Unity/scope.cpp:408
226−msgid "Sorry, there is nothing that matches your search."
227−msgstr "很抱歉,找不到符合您想搜尋的結果。"
228−
229−#: plugins/Unity/showallfilteroption.cpp:41
230−msgid "All"
231−msgstr ""
232−
233−#: Shell.qml:441
155+#: Shell.qml:439
234156#, qt-format
235157msgid "Please enter %1"
236158msgstr ""
Bottombar/Bottombar.qml → qml/Bottombar/Bottombar.qmlrenamed

The content is the same.

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

The content is the same.

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

Binary file not shown.

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

Binary file not shown.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

Components/Carousel.qml → qml/Components/Carousel.qmlrenamed+2−3
@@ -63,6 +63,7 @@ Item {
6363 signal pressAndHold(int index, real itemY)
6464
6565 implicitHeight: listView.tileHeight * selectedItemScaleFactor
66+ opacity: listView.highlightIndex === -1 ? 1 : 0.6
6667
6768 /* Basic idea behind the carousel effect is to move the items of the delegates (compacting /stuffing them).
6869 One drawback is, that more delegates have to be drawn than usually. As some items are moved from the
@@ -75,11 +76,11 @@ Item {
7576 ListView {
7677 id: listView
7778
79+ property int highlightIndex: -1
7880 property real minimumTileWidth: 0
7981 property real newContentX: disabledNewContentX
8082 property real pathItemCount: referenceWidth / referenceTileWidth
8183 property real tileAspectRatio: 1
82− property int highlightIndex: -1
8384
8485 /* The positioning and scaling of the items in the carousel is based on the variable
8586 'continuousIndex', a continuous real variable between [0, 'carousel.model.count'],
@@ -293,7 +294,6 @@ Item {
293294 scale: itemScale * explicitScaleFactor
294295 sourceComponent: itemComponent
295296 z: cachedTiles - Math.abs(index - listView.selectedIndex)
296− opacity: highlightIndex == -1 ? 1 : (highlightIndex == index ? 0.6 : 0.2)
297297
298298 transform: Translate {
299299 x: xTransform
@@ -333,7 +333,6 @@ Item {
333333 onPressAndHold: {
334334 listView.itemPressAndHold(index, item)
335335 }
336−
337336 }
338337 }
339338 }
Components/Circle.qml → qml/Components/Circle.qmlrenamed

The content is the same.

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

The content is the same.

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

The content is the same.

Components/EdgeDemo.qml → qml/Components/EdgeDemo.qmlrenamed+1
@@ -31,6 +31,7 @@ Item {
3131 property bool dashEnabled: true
3232 property bool panelEnabled: true
3333 property bool panelContentEnabled: true
34+ property bool running: !launcherEnabled || !dashEnabled || !panelEnabled || !panelContentEnabled
3435
3536 property bool paused: false
3637
Components/EdgeDemoOverlay.qml → qml/Components/EdgeDemoOverlay.qmlrenamed

The content is the same.

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

The content is the same.

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

The content is the same.

Components/FilterGrid.qml → qml/Components/FilterGrid.qmlrenamed+2−1
@@ -41,11 +41,12 @@ Item {
4141
4242 /* Maximum number of rows to be show when filter=true. */
4343 property int collapsedRowCount: 2
44+ property int uncollapsedRowCount: Math.ceil(model.count / columns)
4445 readonly property int collapsedHeight: {
4546 return iconTileGrid.contentHeightForRows(Math.min(collapsedRowCount, Math.ceil(model.count / columns)))
4647 }
4748 readonly property int uncollapsedHeight: {
48− return iconTileGrid.contentHeightForRows(Math.ceil(model.count / columns))
49+ return iconTileGrid.contentHeightForRows(uncollapsedRowCount)
4950 }
5051
5152 property alias minimumHorizontalSpacing: iconTileGrid.minimumHorizontalSpacing
Components/LazyImage.qml → qml/Components/LazyImage.qmlrenamed

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

Binary file not shown.

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

Binary file not shown.

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

The content is the same.

Components/PageHeader.qml → qml/Components/PageHeader.qmlrenamed+14−39
@@ -21,17 +21,12 @@ import Ubuntu.Components.ListItems 0.1 as ListItem
2121import Unity 0.1
2222
2323Item {
24− /*!
25− \preliminary
26− The text that is shown inside the Page Header
27− \qmlproperty string text
28− */
29− property alias text: label.text
30−
24+ id: root
3125 property bool searchEntryEnabled: false
3226 property alias searchQuery: searchField.text
3327 property ListModel searchHistory
3428 property Scope scope
29+ property alias childItem: itemContainer.children
3530
3631 height: units.gu(8.5)
3732 implicitHeight: units.gu(8.5)
@@ -82,29 +77,10 @@ Item {
8277 height: childrenRect.height
8378
8479 Item {
85− id: textContainer
80+ id: itemContainer
8681
87− width: header.width
82+ width: searchContainer.narrowMode ? header.width : header.width - searchContainer.width
8883 height: header.height
89−
90− Label {
91− id: label
92− anchors {
93− left: parent.left
94− leftMargin: units.gu(2)
95− right: parent.right
96− verticalCenter: parent.verticalCenter
97− }
98−
99− color: Theme.palette.selected.backgroundText
100− opacity: 0.8
101− font.family: "Ubuntu"
102− font.weight: Font.Light
103− fontSize: "x-large"
104− elide: Text.ElideRight
105− style: Text.Raised
106− styleColor: "black"
107− }
10884 }
10985
11086 Item {
@@ -115,12 +91,12 @@ Item {
11591 property bool popoverShouldOpen: false
11692 property bool popoverShouldClose: false
11793
118− property bool narrowMode: parent.width < label.contentWidth + units.gu(50)
94+ property bool narrowMode: parent.width < units.gu(80)
11995
12096 property bool active: searchField.text != "" || searchField.activeFocus
12197 property var popover: null
12298
123− anchors.right: textContainer.right
99+ anchors.right: headerContainer.right
124100 height: header.height
125101
126102 state:
@@ -141,9 +117,8 @@ Item {
141117
142118 function openPopover() {
143119 if (searchHistory.count > 0) {
144− searchContainer.popover = PopupUtils.open(popoverComponent, searchField,
120+ searchContainer.popover = PopupUtils.open(popoverComponent, pointerPositioner,
145121 {
146− "pointerTarget": pointerPositioner,
147122 "contentWidth": searchField.width,
148123 "edgeMargins": units.gu(1)
149124 }
@@ -256,13 +231,13 @@ Item {
256231 states: [
257232 State {
258233 name: "wide"
259− AnchorChanges { target: textContainer; anchors.top: headerContainer.top }
260− AnchorChanges { target: searchContainer; anchors.left: undefined; anchors.top: textContainer.top }
234+ AnchorChanges { target: itemContainer; anchors.top: headerContainer.top }
235+ AnchorChanges { target: searchContainer; anchors.left: undefined; anchors.top: itemContainer.top }
261236 },
262237 State {
263238 name: "narrow"
264239 PropertyChanges { target: searchField; highlighted: true }
265− AnchorChanges { target: textContainer; anchors.top: searchContainer.bottom }
240+ AnchorChanges { target: itemContainer; anchors.top: searchContainer.bottom }
266241 AnchorChanges { target: searchContainer; anchors.left: headerContainer.left; anchors.top: headerContainer.top }
267242 },
268243 State {
@@ -300,7 +275,7 @@ Item {
300275 ParallelAnimation {
301276 NumberAnimation { targets: [searchContainer, searchField]; property: "width"; duration: 200; easing.type: Easing.InOutQuad }
302277 PropertyAction { target: primaryImage; property: "source" }
303− AnchorAnimation { targets: [searchContainer, textContainer]; duration: 200; easing.type: Easing.InOutQuad }
278+ AnchorAnimation { targets: [searchContainer, itemContainer]; duration: 200; easing.type: Easing.InOutQuad }
304279 }
305280 ScriptAction { script: if (searchContainer.popoverShouldOpen) { searchContainer.openPopover(); } }
306281 }
@@ -309,14 +284,14 @@ Item {
309284 to: "inactive"
310285 ScriptAction { script: if (searchContainer.popoverShouldClose) { searchContainer.closePopover(); } }
311286 NumberAnimation { targets: [searchContainer, searchField] ; property: "width"; duration: 200; easing.type: Easing.InOutQuad }
312− AnchorAnimation { targets: [searchContainer, textContainer]; duration: 200; easing.type: Easing.InOutQuad }
287+ AnchorAnimation { targets: [searchContainer, itemContainer]; duration: 200; easing.type: Easing.InOutQuad }
313288 },
314289 Transition {
315290 to: "narrowActive"
316291 SequentialAnimation {
317292 ParallelAnimation {
318293 NumberAnimation { targets: [searchContainer, searchField] ; property: "width"; duration: 200; easing.type: Easing.OutQuad }
319− AnchorAnimation { targets: [searchContainer, textContainer]; duration: 200; easing.type: Easing.InOutQuad }
294+ AnchorAnimation { targets: [searchContainer, itemContainer]; duration: 200; easing.type: Easing.InOutQuad }
320295 }
321296 ScriptAction { script: if (searchContainer.popoverShouldOpen) { searchContainer.openPopover(); } }
322297 }
@@ -325,7 +300,7 @@ Item {
325300 to: "narrowInactive"
326301 ScriptAction { script: if (searchContainer.popoverShouldClose) { searchContainer.closePopover(); } }
327302 NumberAnimation { targets: [searchContainer, searchField] ; property: "width"; duration: 200; easing.type: Easing.OutQuad }
328− AnchorAnimation { targets: [searchContainer, textContainer]; duration: 200; easing.type: Easing.InOutQuad }
303+ AnchorAnimation { targets: [searchContainer, itemContainer]; duration: 200; easing.type: Easing.InOutQuad }
329304 }
330305 ]
331306
qml/Components/PageHeaderLabel.qmlnew file+41
@@ -0,0 +1,41 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+
20+PageHeader {
21+ property alias text: label.text
22+
23+ childItem: Label {
24+ id: label
25+ anchors {
26+ left: parent.left
27+ leftMargin: units.gu(2)
28+ right: parent.right
29+ verticalCenter: parent.verticalCenter
30+ }
31+
32+ color: Theme.palette.selected.backgroundText
33+ opacity: 0.8
34+ font.family: "Ubuntu"
35+ font.weight: Font.Light
36+ fontSize: "x-large"
37+ elide: Text.ElideRight
38+ style: Text.Raised
39+ styleColor: "black"
40+ }
41+}
Components/PinPadButton.qml → qml/Components/PinPadButton.qmlrenamed

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

Binary file not shown.

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

The content is the same.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

Binary file not shown.

qml/Dash/Card.qmlnew file+83
@@ -0,0 +1,83 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+
20+Item {
21+ id: root
22+ property var template
23+ property var components
24+ property var cardData
25+
26+ width: {
27+ if (template !== undefined) {
28+ if (template["card-layout"] === "horizontal") return units.gu(38);
29+ switch (template['card-size']) {
30+ case "small": return units.gu(12);
31+ case "large": return units.gu(38);
32+ }
33+ }
34+ return units.gu(18.5);
35+ }
36+ height: childrenRect.height
37+
38+ UbuntuShape {
39+ id: artShape
40+ objectName: "artShape"
41+ width: image.fillMode === Image.PreserveAspectCrop || aspect < image.aspect ? image.width : height * image.aspect
42+ height: image.fillMode === Image.PreserveAspectCrop || aspect > image.aspect ? image.height : width / image.aspect
43+ anchors.horizontalCenter: template && template["card-layout"] === "horizontal" ? undefined : parent.horizontalCenter
44+
45+ property real aspect: components !== undefined ? components["art"]["aspect-ratio"] : 1
46+
47+ image: Image {
48+ width: template && template["card-layout"] === "horizontal" ? height * artShape.aspect : root.width
49+ height: template && template["card-layout"] === "horizontal" ? header.height : width / artShape.aspect
50+ objectName: "artImage"
51+ source: cardData && cardData["art"] || ""
52+ // FIXME uncomment when having investigated / fixed the crash
53+ //sourceSize.width: width > height ? width : 0
54+ //sourceSize.height: height > width ? height : 0
55+ fillMode: components["art"]["fill-mode"] === "fit" ? Image.PreserveAspectFit: Image.PreserveAspectCrop
56+
57+ property real aspect: implicitWidth / implicitHeight
58+ }
59+ }
60+
61+ CardHeader {
62+ id: header
63+ objectName: "cardHeader"
64+ anchors {
65+ top: template && template["card-layout"] === "horizontal" ? artShape.top : artShape.bottom
66+ left: template && template["card-layout"] === "horizontal" ? artShape.right : parent.left
67+ right: parent.right
68+ }
69+
70+ mascot: cardData && cardData["mascot"] || ""
71+ title: cardData && cardData["title"] || ""
72+ subtitle: cardData && cardData["subtitle"] || ""
73+ }
74+
75+ Label {
76+ objectName: "summaryLabel"
77+ anchors { top: header.bottom; left: parent.left; right: parent.right }
78+ wrapMode: Text.Wrap
79+ maximumLineCount: 5
80+ elide: Text.ElideRight
81+ text: cardData && cardData["summary"] || ""
82+ }
83+}
qml/Dash/CardHeader.qmlnew file+112
@@ -0,0 +1,112 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+
20+Item {
21+ id: root
22+ property alias mascot: mascotImage.source
23+ property alias title: titleLabel.text
24+ property alias subtitle: subtitleLabel.text
25+ property alias price: priceLabel.text
26+ property alias oldPrice: oldPriceLabel.text
27+ property alias altPrice: altPriceLabel.text
28+
29+ visible: mascotImage.status === Image.Ready || title || price
30+ height: row.height > 0 ? row.height + row.spacing * 2 : 0
31+
32+ Row {
33+ id: row
34+ objectName: "outerRow"
35+
36+ anchors { top: parent.top; left: parent.left; right: parent.right; margins: spacing }
37+ spacing: units.gu(1)
38+
39+ UbuntuShape {
40+ id: mascotShape
41+ objectName: "mascotShape"
42+
43+ width: units.gu(8)
44+ height: units.gu(8)
45+ visible: image.status === Image.Ready
46+
47+ image: Image {
48+ id: mascotImage
49+ sourceSize { width: mascotShape.width; height: mascotShape.height }
50+ }
51+ }
52+
53+ Column {
54+ objectName: "column"
55+ width: parent.width - x
56+
57+ Label {
58+ id: titleLabel
59+ anchors { left: parent.left; right: parent.right }
60+ elide: Text.ElideRight
61+ objectName: "titleLabel"
62+ font.weight: Font.DemiBold
63+ wrapMode: Text.Wrap
64+ maximumLineCount: 2
65+ }
66+
67+ Label {
68+ id: subtitleLabel
69+ anchors { left: parent.left; right: parent.right }
70+ elide: Text.ElideRight
71+ visible: titleLabel.text && text
72+ }
73+
74+ Row {
75+ id: prices
76+ objectName: "prices"
77+ anchors { left: parent.left; right: parent.right }
78+
79+ property int labels: {
80+ var labels = 1; // price always visible
81+ if (oldPriceLabel.text !== "") labels += 1;
82+ if (altPriceLabel.text !== "") labels += 1;
83+ return labels;
84+ }
85+ property real labelWidth: width / labels
86+
87+ Label {
88+ id: priceLabel
89+ width: parent.labelWidth
90+ elide: Text.ElideRight
91+ font.weight: Font.DemiBold
92+ color: Theme.palette.selected.foreground
93+ }
94+
95+ Label {
96+ id: oldPriceLabel
97+ objectName: "oldPriceLabel"
98+ width: parent.labelWidth
99+ elide: Text.ElideRight
100+ horizontalAlignment: parent.labels === 3 ? Text.AlignHCenter : Text.AlignRight
101+ }
102+
103+ Label {
104+ id: altPriceLabel
105+ width: parent.labelWidth
106+ elide: Text.ElideRight
107+ horizontalAlignment: Text.AlignRight
108+ }
109+ }
110+ }
111+ }
112+}
Dash/Dash.qml → qml/Dash/Dash.qmlrenamed−18
@@ -66,11 +66,6 @@ Showable {
6666 model: filteredScopes
6767 scopes: scopes
6868 searchHistory: dash.searchHistory
69− onMovementStarted: dashbar.startNavigation()
70− onMovementEnded: dashbar.stopNavigation()
71− onContentFlickStarted: dashbar.finishNavigation()
72− onContentEndReached: dashbar.finishNavigation()
73− onPreviewShown: dashbar.finishNavigation()
7469 onScopeLoaded: {
7570 if (scopeId == dash.showScopeOnLoaded) {
7671 dash.setCurrentScope(scopeId, false, false)
@@ -80,17 +75,4 @@ Showable {
8075 scale: dash.contentScale
8176 clip: scale != 1.0
8277 }
83−
84− DashBar {
85− id: dashbar
86− objectName: "dashbar"
87− anchors.bottom: parent.bottom
88− anchors.left: parent.left
89− anchors.right: parent.right
90− model: filteredScopes
91− currentIndex: dashContent.currentIndex
92− onItemSelected: dashContent.setCurrentScopeAtIndex(index, true, false)
93− opacity: dash.contentScale == 1.0 ? 1.0 : 0.0
94− Behavior on opacity { NumberAnimation { easing.type: Easing.OutQuad; duration: 150 } }
95− }
9678}
Dash/DashApps.qml → qml/Dash/DashApps.qmlrenamed−4
@@ -19,7 +19,6 @@ import Ubuntu.Components 0.1
1919import Utils 0.1
2020import "../Components"
2121import "../Components/ListItems"
22−import "../Applications"
2322import "Apps"
2423
2524GenericScopeView {
@@ -30,9 +29,6 @@ GenericScopeView {
3029 property var mainStageApplicationsModel: shell.applicationManager.mainStageApplications
3130 property var sideStageApplicationModel: shell.applicationManager.sideStageApplications
3231
33− //FIXME an alias to itself shouldn't be required. More than likely a Qt bug. Try removing with newer Qt.
34− property alias searchHistory: scopeView.searchHistory
35−
3632 ListModel {
3733 id: dummyVisibilityModifier
3834
Dash/DashBar.qml → qml/Dash/DashBar.qmlrenamed

The content is the same.

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

The content is the same.

Dash/DashPreview.qml → qml/Dash/DashPreview.qmlrenamed+1
@@ -25,6 +25,7 @@ Item {
2525 property alias showProcessingAction: waitingForActionMouseArea.enabled
2626
2727 property real previewWidthRatio: 0.5
28+ property bool isCurrent: false
2829
2930 property Component previewImages
3031 property Component header
Dash/DashPreviewPlaceholder.qml → qml/Dash/DashPreviewPlaceholder.qmlrenamed

The content is the same.

qml/Dash/DashRenderer.qmlnew file+65
@@ -0,0 +1,65 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+
19+Item {
20+ // Can the item be expanded?
21+ property bool expandable: false
22+
23+ // In case it can be expanded, should we filter it
24+ property bool filter: true
25+
26+ property int collapsedRowCount: 1
27+
28+ property int collapsedHeight: height
29+
30+ property int columns: 1
31+
32+ property int rows: 1
33+
34+ // Index of the highlighted item
35+ property int highlightIndex: -1
36+
37+ property int margins: 0
38+
39+ property int uncollapsedHeight: height
40+
41+ property var delegateCreationBegin: undefined
42+
43+ property var delegateCreationEnd: undefined
44+
45+ property real verticalSpacing: 0
46+
47+ // The current item of the renderer
48+ property var currentItem
49+
50+ // The model to renderer
51+ property var model
52+
53+ /// Emitted when the user clicked on an item
54+ /// @param index is the index of the clicked item
55+ /// @param itemY is y of the clicked delegate
56+ signal clicked(int index, real itemY)
57+
58+ /// Emitted when the user pressed and held on an item
59+ /// @param index is the index of the held item
60+ /// @param itemY is y of the held delegate
61+ signal pressAndHold(int index, real itemY)
62+
63+ function startFilterAnimation(filter) {
64+ }
65+}
Dash/Generic/FlatTileStyle.qml → qml/Dash/Generic/FlatTileStyle.qmlrenamed

The content is the same.

Dash/Generic/GenericCarousel.qml → qml/Dash/Generic/GenericCarousel.qmlrenamed+3−7
@@ -17,22 +17,18 @@
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
1919import "../../Components"
20+import ".."
2021
21−Carousel {
22+DashCarousel {
2223 id: genericCarousel
23−
24− tileAspectRatio: 198 / 288
25− minimumTileWidth: units.gu(13)
2624 itemComponent: carouselDelegateGeneric
27− selectedItemScaleFactor: 1.14
28− cacheBuffer: 1404 // 18px * 13gu * 6
29− height: implicitHeight + units.gu(6)
3025
3126 Component {
3227 id: carouselDelegateGeneric
3328
3429 BaseCarouselDelegate {
3530 id: item
31+ objectName: "carouselDelegate"
3632
3733 UbuntuShape {
3834 anchors.fill: parent
Dash/Generic/GenericCarouselLoader.qml → qml/Dash/Generic/GenericCarouselLoader.qmlrenamed

The content is the same.

Dash/Generic/GenericFilterGrid.qml → qml/Dash/Generic/GenericFilterGrid.qmlrenamed+13−19
@@ -15,38 +15,32 @@
1515 */
1616
1717import QtQuick 2.0
18+import Ubuntu.Components 0.1
1819import "../../Components"
20+import ".."
1921
20−FilterGrid {
21− id: filtergrid
22+DashFilterGrid {
23+ id: genericFilterGrid
24+
25+ property int iconWidth: units.gu(8)
26+ property int iconHeight: units.gu(7.5)
2227
2328 minimumHorizontalSpacing: units.gu(0.5)
2429 delegateWidth: units.gu(11)
2530 delegateHeight: units.gu(9.5)
2631 verticalSpacing: units.gu(2)
2732
28− property int iconWidth: units.gu(8)
29− property int iconHeight: units.gu(7.5)
30−
31− signal clicked(int index, real itemY)
32− signal pressAndHold(int index, real itemY)
33−
3433 delegate: Tile {
3534 id: tile
3635 objectName: "delegate" + index
37− width: filtergrid.cellWidth
38− height: filtergrid.cellHeight
36+ width: genericFilterGrid.cellWidth
37+ height: genericFilterGrid.cellHeight
3938 text: model.title
40− imageWidth: filtergrid.iconWidth
41− imageHeight: filtergrid.iconHeight
39+ imageWidth: genericFilterGrid.iconWidth
40+ imageHeight: genericFilterGrid.iconHeight
4241 source: model.icon
4342
44− onClicked: {
45− filtergrid.clicked(index, tile.y)
46− }
47−
48− onPressAndHold: {
49− filtergrid.pressAndHold(index, tile.y)
50− }
43+ onClicked: genericFilterGrid.clicked(index, tile.y)
44+ onPressAndHold: genericFilterGrid.pressAndHold(index, tile.y)
5145 }
5246}
Dash/Generic/GenericFilterGridPotrait.qml → qml/Dash/Generic/GenericFilterGridPotrait.qmlrenamed+1−3
@@ -15,16 +15,14 @@
1515 */
1616
1717import QtQuick 2.0
18+import Ubuntu.Components 0.1
1819import "../../Components"
1920
2021GenericFilterGrid {
21− id: filtergrid
22−
2322 minimumHorizontalSpacing: units.gu(0.5)
2423 delegateWidth: units.gu(11)
2524 delegateHeight: units.gu(18)
2625 verticalSpacing: units.gu(2)
27−
2826 iconWidth: (width / columns) * 0.8
2927 iconHeight: iconWidth * 16 / 11
3028}
Dash/Generic/GenericPreview.qml → qml/Dash/Generic/GenericPreview.qmlrenamed

The content is the same.

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

The content is the same.

Dash/GenericScopeView.qml → qml/Dash/GenericScopeView.qmlrenamed+45−234
@@ -27,15 +27,18 @@ FocusScope {
2727 property Scope scope
2828 property SortFilterProxyModel categories: categoryFilter
2929 property bool isCurrent
30− property ListModel searchHistory
3130 property alias moving: categoryView.moving
31+ property int tabBarHeight: 0
32+ property PageHeader pageHeader: null
33+ property OpenEffect openEffect: null
34+ property Item previewListView: null
3235
3336 signal endReached
3437 signal movementStarted
3538 signal positionedAtBeginning
3639
37− readonly property alias previewShown: previewListView.onScreen
3840 property bool enableHeightBehaviorOnNextCreation: false
41+ property var categoryView: categoryView
3942
4043 // FIXME delay the search so that daemons have time to settle, note that
4144 // removing this will break ScopeView::test_changeScope
@@ -46,8 +49,8 @@ FocusScope {
4649 }
4750 }
4851
49− function activateApp(desktopFilePath) {
50− shell.activateApplication(desktopFilePath);
52+ function activateApp(appId) {
53+ shell.activateApplication(appId);
5154 }
5255
5356 Binding {
@@ -84,12 +87,14 @@ FocusScope {
8487 target: scopeView.scope
8588 property: "searchQuery"
8689 value: pageHeader.searchQuery
90+ when: isCurrent
8791 }
8892
8993 Binding {
9094 target: pageHeader
9195 property: "searchQuery"
9296 value: scopeView.scope.searchQuery
97+ when: isCurrent
9398 }
9499
95100 Connections {
@@ -119,6 +124,10 @@ FocusScope {
119124 property string expandedCategoryId: ""
120125 signal correctExpandedCategory();
121126
127+ onContentYChanged: pageHeader.positionRealHeader();
128+ onOriginYChanged: pageHeader.positionRealHeader();
129+ onContentHeightChanged: pageHeader.positionRealHeader();
130+
122131 Behavior on contentY {
123132 enabled: previewListView.open
124133 UbuntuNumberAnimation {}
@@ -126,6 +135,7 @@ FocusScope {
126135
127136 delegate: ListItems.Base {
128137 id: baseItem
138+ objectName: "dashCategory" + category
129139 highlightWhenPressed: false
130140
131141 readonly property bool expandable: rendererLoader.item ? rendererLoader.item.expandable : false
@@ -140,7 +150,7 @@ FocusScope {
140150 right: parent.right
141151 }
142152
143− source: getRenderer(model.renderer, model.contentType, model.rendererHint)
153+ source: getRenderer(model.renderer, model.contentType, model.rendererHint, results)
144154
145155 onLoaded: {
146156 if (item.enableHeightBehavior !== undefined && item.enableHeightBehaviorOnNextCreation !== undefined) {
@@ -175,7 +185,7 @@ FocusScope {
175185 target: rendererLoader.item
176186 onClicked: {
177187 // Prepare the preview in case activate() triggers a preview only
178− effect.positionPx = Math.max(mapToItem(categoryView, 0, itemY).y, pageHeader.height + categoryView.stickyHeaderHeight);
188+ openEffect.positionPx = Math.max(mapToItem(categoryView, 0, itemY).y, pageHeader.height + categoryView.stickyHeaderHeight);
179189 previewListView.categoryId = categoryId
180190 previewListView.categoryDelegate = rendererLoader.item
181191 previewListView.model = target.model;
@@ -191,12 +201,12 @@ FocusScope {
191201 } else {
192202 previewListView.open = true
193203
194− scopeView.scope.preview( item.uri, item.icon, item.category, 0, item.mimetype, item.title,
195− item.comment, item.dndUri, item.metadata)
204+ scopeView.scope.preview(item.uri, item.icon, item.category, 0, item.mimetype, item.title,
205+ item.comment, item.dndUri, item.metadata)
196206 }
197207 }
198208 onPressAndHold: {
199− effect.positionPx = Math.max(mapToItem(categoryView, 0, itemY).y, pageHeader.height + categoryView.stickyHeaderHeight);
209+ openEffect.positionPx = Math.max(mapToItem(categoryView, 0, itemY).y, pageHeader.height + categoryView.stickyHeaderHeight);
200210 previewListView.categoryId = categoryId
201211 previewListView.categoryDelegate = rendererLoader.item
202212 previewListView.model = target.model;
@@ -205,7 +215,7 @@ FocusScope {
205215 previewListView.open = true
206216
207217 var item = target.model.get(index)
208− scopeView.scope.preview( item.uri, item.icon, item.category, 0, item.mimetype, item.title,
218+ scopeView.scope.preview(item.uri, item.icon, item.category, 0, item.mimetype, item.title,
209219 item.comment, item.dndUri, item.metadata)
210220 }
211221 }
@@ -271,6 +281,7 @@ FocusScope {
271281
272282 sectionProperty: "name"
273283 sectionDelegate: ListItems.Header {
284+ objectName: "dashSectionHeader" + delegate.category
274285 property var delegate: categoryView.item(delegateIndex)
275286 width: categoryView.width
276287 text: section
@@ -286,14 +297,20 @@ FocusScope {
286297 categoryView.expandedCategoryId = "";
287298 }
288299 }
289− pageHeader: PageHeader {
290− id: pageHeader
291− objectName: "pageHeader"
292− width: categoryView.width
293− text: scopeView.scope.name
294− searchEntryEnabled: true
295− scope: scopeView.scope
296− searchHistory: scopeView.searchHistory
300+ pageHeader: Item {
301+ implicitHeight: scopeView.tabBarHeight
302+ onHeightChanged: {
303+ if (scopeView.pageHeader) {
304+ scopeView.pageHeader.height = height;
305+ }
306+ }
307+ onYChanged: positionRealHeader();
308+
309+ function positionRealHeader() {
310+ if (scopeView.pageHeader) {
311+ scopeView.pageHeader.y = y + parent.y;
312+ }
313+ }
297314 }
298315 }
299316
@@ -303,16 +320,21 @@ FocusScope {
303320 }
304321 }
305322
306− function getRenderer(rendererId, contentType, rendererHint) {
323+ function getRenderer(rendererId, contentType, rendererHint, results) {
307324 if (rendererId == "default") {
308325 rendererId = getDefaultRendererId(contentType);
309326 }
327+ if (rendererId == "carousel") {
328+ // Selectively disable carousel, 6 is fixed for now, should change on the form factor
329+ if (results.count <= 6)
330+ rendererId = "grid"
331+ }
310332 switch (rendererId) {
311333 case "carousel": {
312334 switch (contentType) {
313− case "music": return "Music/MusicCarouselLoader.qml";
314− case "video": return "Video/VideoCarouselLoader.qml";
315− default: return "Generic/GenericCarouselLoader.qml";
335+ case "music": return "Music/MusicCarousel.qml";
336+ case "video": return "Video/VideoCarousel.qml";
337+ default: return "Generic/GenericCarousel.qml";
316338 }
317339 }
318340 case "grid": {
@@ -339,44 +361,6 @@ FocusScope {
339361 }
340362 }
341363
342− OpenEffect {
343− id: effect
344− objectName: "openEffect"
345− anchors {
346− fill: parent
347− bottomMargin: -bottomOverflow
348− }
349− sourceItem: categoryView
350−
351− enabled: gap > 0.0
352−
353− topGapPx: (1 - gap) * positionPx
354− topOpacity: (1 - gap * 1.2)
355− bottomGapPx: positionPx + gap * (targetBottomGapPx - positionPx)
356− bottomOverflow: units.gu(20)
357− live: !expansionAnimation.running
358−
359− property int targetBottomGapPx: height - units.gu(8) - bottomOverflow
360− property real gap: previewListView.open ? 1.0 : 0.0
361−
362− Behavior on gap {
363− NumberAnimation {
364− id: expansionAnimation
365− duration: 200
366− easing.type: Easing.InOutQuad
367− onRunningChanged: {
368− if (!previewListView.open && !running) {
369− previewListView.onScreen = false
370− }
371− }
372− }
373− }
374− Behavior on positionPx {
375− enabled: previewListView.open
376− UbuntuNumberAnimation {}
377− }
378− }
379−
380364 Connections {
381365 target: scopeView.scope
382366 onPreviewReady: {
@@ -395,186 +379,13 @@ FocusScope {
395379 }
396380 }
397381
398− PreviewDelegateMapper {
399− id: previewDelegateMapper
400− }
401−
402− ListView {
403− id: previewListView
404− objectName: "previewListView"
405− height: effect.bottomGapPx - effect.topGapPx
406− anchors {
407− top: parent.top
408− topMargin: effect.topGapPx
409− left: parent.left
410− right: parent.right
411− }
412− orientation: ListView.Horizontal
413− highlightRangeMode: ListView.StrictlyEnforceRange
414− snapMode: ListView.SnapOneItem
415− boundsBehavior: Flickable.DragAndOvershootBounds
416− highlightMoveDuration: 250
417− flickDeceleration: units.gu(625)
418− maximumFlickVelocity: width * 5
419− cacheBuffer: 0
420−
421− // To be set before opening the preview
422− property string categoryId: ""
423− property var categoryDelegate
424−
425− // because the ListView is built asynchronous, setting the
426− // currentIndex directly won't work. We need to refresh it
427− // when the first preview is ready to be displayed.
428− property bool init: true
429−
430− onCurrentIndexChanged: {
431− var row = Math.floor(currentIndex / categoryDelegate.columns);
432− if (categoryDelegate.collapsedRowCount <= row) {
433− categoryView.expandedCategoryId = categoryId
434− }
435−
436− if (open) {
437− categoryDelegate.highlightIndex = currentIndex
438− }
439−
440− if (!init && model !== undefined) {
441− var item = model.get(currentIndex)
442− scopeView.scope.preview(item.uri, item.icon, item.category, 0, item.mimetype, item.title, item.comment, item.dndUri, item.metadata)
443− }
444−
445− var itemY = categoryView.contentItem.mapFromItem(categoryDelegate.currentItem).y;
446−
447− // Find new contentY and effect.postionPx
448− var newContentY = itemY - effect.positionPx - categoryDelegate.verticalSpacing;
449−
450− // Make sure the item is not covered by a header. Move the effect split down if necessary
451− var headerHeight = pageHeader.height + categoryView.stickyHeaderHeight;
452− var effectAdjust = Math.max(effect.positionPx, headerHeight);
453−
454− // Make sure we don't overscroll the listview. If yes, adjust effect position
455− if (newContentY < 0) {
456− effectAdjust += newContentY;
457− newContentY = 0;
458− }
459− if (newContentY > Math.max(0, categoryView.contentHeight - categoryView.height)) {
460− effectAdjust += -(categoryView.contentHeight - categoryView.height) + newContentY
461− newContentY = categoryView.contentHeight - categoryView.height;
462− }
463−
464− effect.positionPx = effectAdjust;
465− categoryView.contentY = newContentY;
466− }
467−
468− property bool open: false
469− property bool onScreen: false
470−
471− onOpenChanged: {
472− if (open) {
473− onScreen = true;
474− categoryDelegate.highlightIndex = currentIndex;
475− pageHeader.unfocus();
476− } else {
477− // Cancel any pending preview requests or actions
478− if (previewListView.currentItem.previewData !== undefined) {
479− previewListView.currentItem.previewData.cancelAction();
480− }
481− scopeView.scope.cancelActivation();
482− model = undefined;
483− categoryView.correctExpandedCategory();
484− categoryDelegate.highlightIndex = -1;
485− }
486− }
487−
488− Rectangle {
489− anchors.fill: parent
490− color: Qt.rgba(0, 0, 0, .3)
491− z: -1
492− }
493−
494− delegate: Loader {
495− id: previewLoader
496− objectName: "previewLoader" + index
497− height: previewListView.height
498− width: previewListView.width
499− asynchronous: true
500− source: previewListView.onScreen ?
501− (previewData !== undefined ? previewDelegateMapper.map(previewData.rendererName) : "DashPreviewPlaceholder.qml") : ""
502−
503− onPreviewDataChanged: {
504− if (previewData !== undefined && source.toString().indexOf("DashPreviewPlaceholder.qml") != -1) {
505− previewLoader.opacity = 0;
506− }
507− }
508−
509− onSourceChanged: {
510− if (previewData !== undefined) {
511− fadeIn.start()
512− }
513− }
514−
515− PropertyAnimation {
516− id: fadeIn
517− target: previewLoader
518− property: "opacity"
519− from: 0.0
520− to: 1.0
521− duration: UbuntuAnimation.BriskDuration
522− }
523−
524− property var previewData
525− property bool valid: item !== null
526−
527− onLoaded: {
528− if (previewListView.onScreen && previewData !== undefined) {
529− item.previewData = Qt.binding(function() { return previewData })
530− }
531− }
532−
533− Connections {
534− ignoreUnknownSignals: true
535− target: item
536− onClose: {
537− previewListView.open = false
538− }
539− }
540−
541− function closePreviewSpinner() {
542− if(item) {
543− item.showProcessingAction = false;
544− }
545− }
546− }
547− }
548−
549− Image {
550− objectName: "pointerArrow"
551− anchors {
552− top: previewListView.bottom
553− left: parent.left
554− leftMargin: previewListView.categoryDelegate !== undefined && previewListView.categoryDelegate.currentItem ?
555− previewListView.categoryDelegate.currentItem.center + (-width + margins) / 2 : 0
556−
557− Behavior on leftMargin {
558− SmoothedAnimation {
559− duration: UbuntuAnimation.FastDuration
560− }
561− }
562− }
563− height: units.gu(1)
564− width: units.gu(2)
565− property int margins: previewListView.categoryDelegate ? previewListView.categoryDelegate.margins : 0
566− opacity: previewListView.open ? .5 : 0
567−
568− source: "graphics/tooltip_arrow.png"
569− }
570−
571382 // TODO: Move as InverseMouseArea to DashPreview
572383 MouseArea {
573384 objectName: "closePreviewMouseArea"
574385 enabled: previewListView.onScreen
575386 anchors {
576387 fill: parent
577− topMargin: effect.bottomGapPx
388+ topMargin: openEffect.bottomGapPx
578389 }
579390 onClicked: {
580391 previewListView.open = false;
Dash/Movie/MoviePreview.qml → qml/Dash/Movie/MoviePreview.qmlrenamed

The content is the same.

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

The content is the same.

Dash/Music/MusicCarousel.qml → qml/Dash/Music/MusicCarousel.qmlrenamed+2−2
@@ -16,15 +16,15 @@
1616
1717import QtQuick 2.0
1818import "../../Components"
19+import ".."
1920
20−Carousel {
21+DashCarousel {
2122 id: musicCarousel
2223 tileAspectRatio: 1
2324 minimumTileWidth: units.gu(13)
2425 itemComponent: carouselDelegateMusic
2526 selectedItemScaleFactor: 1.2
2627 cacheBuffer: 1404 // 18px * 13gu * 6
27− height: implicitHeight + units.gu(6)
2828
2929 Component {
3030 id: carouselDelegateMusic
Dash/Music/MusicCarouselLoader.qml → qml/Dash/Music/MusicCarouselLoader.qmlrenamed

The content is the same.

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

The content is the same.

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

Binary file not shown.

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

The content is the same.

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

The content is the same.

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

The content is the same.

Dash/ScopeListView.qml → qml/Dash/ScopeListView.qmlrenamed+1−1
@@ -15,7 +15,7 @@
1515 */
1616
1717import QtQuick 2.0
18−import ListViewWithPageHeader 0.1
18+import DashViews 0.1
1919
2020ListViewWithPageHeader {
2121 maximumFlickVelocity: height * 10
Dash/SearchableResultModel.qml → qml/Dash/SearchableResultModel.qmlrenamed

The content is the same.

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

The content is the same.

Dash/Video/VideoCarousel.qml → qml/Dash/Video/VideoCarousel.qmlrenamed+2−2
@@ -16,15 +16,15 @@
1616
1717import QtQuick 2.0
1818import "../../Components"
19+import ".."
1920
20−Carousel {
21+DashCarousel {
2122 id: videosCarousel
2223 tileAspectRatio: 198 / 288
2324 minimumTileWidth: units.gu(13)
2425 itemComponent: carouselDelegateVideo
2526 selectedItemScaleFactor: 1.14
2627 cacheBuffer: 1404 // 18px * 13gu * 6
27− height: implicitHeight + units.gu(6)
2828
2929 Component {
3030 id: carouselDelegateVideo
Dash/Video/VideoCarouselLoader.qml → qml/Dash/Video/VideoCarouselLoader.qmlrenamed

The content is the same.

Dash/Video/VideoFilterGrid.qml → qml/Dash/Video/VideoFilterGrid.qmlrenamed+8−13
@@ -15,38 +15,33 @@
1515 */
1616
1717import QtQuick 2.0
18+import Ubuntu.Components 0.1
1819import "../../Components"
1920import "../Generic"
2021
2122GenericFilterGrid {
22− id: filtergrid
23+ id: videoFilterGrid
2324
2425 delegateWidth: units.gu(11)
2526 delegateHeight: units.gu(15)
26−
2727 iconWidth: units.gu(11)
2828 iconHeight: units.gu(11)
2929
3030 delegate: Tile {
3131 id: tile
3232 objectName: "delegate" + index
33− width: filtergrid.cellWidth
34− height: filtergrid.cellHeight
33+ width: videoFilterGrid.cellWidth
34+ height: videoFilterGrid.cellHeight
3535 text: model.title
36− imageWidth: filtergrid.iconWidth
37− imageHeight: filtergrid.iconHeight
36+ imageWidth: videoFilterGrid.iconWidth
37+ imageHeight: videoFilterGrid.iconHeight
3838 source: model.icon
3939 maximumLineCount: 2
4040 horizontalAlignment: Text.AlignLeft
4141
4242 style: VideoTileStyle {}
4343
44− onClicked: {
45− filtergrid.clicked(index, tile.y)
46− }
47−
48− onPressAndHold: {
49− filtergrid.pressAndHold(index, tile.y)
50− }
44+ onClicked: videoFilterGrid.clicked(index, tile.y)
45+ onPressAndHold: videoFilterGrid.pressAndHold(index, tile.y)
5146 }
5247}
Dash/Video/VideoTileStyle.qml → qml/Dash/Video/VideoTileStyle.qmlrenamed

The content is the same.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

The content is the same.

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

The content is the same.

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

The content is the same.

Greeter/Greeter.qml → qml/Greeter/Greeter.qmlrenamed+1−1
@@ -51,7 +51,7 @@ Showable {
5151 signal unlocked(int uid)
5252
5353 onRightTeaserPressedChanged: {
54− if (rightTeaserPressed && !locked && x == 0) {
54+ if (rightTeaserPressed && (!locked || narrowMode) && x == 0) {
5555 teasingTimer.start();
5656 }
5757 }
Greeter/GreeterContent.qml → qml/Greeter/GreeterContent.qmlrenamed

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

The content is the same.

Hud/HudParametrizedActionsPage.qml → qml/Hud/HudParametrizedActionsPage.qmlrenamed+1−1
@@ -89,7 +89,7 @@ Item {
8989 anchors.left: parent.left
9090 anchors.right: parent.right
9191
92− PageHeader {
92+ PageHeaderLabel {
9393 id: header
9494 anchors.top: parent.top
9595 anchors.left: parent.left
Hud/Result.qml → qml/Hud/Result.qmlrenamed

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

Hud/SliderLabel.qml → qml/Hud/SliderLabel.qmlrenamed+4−2
@@ -36,10 +36,12 @@ Item {
3636 label.text = sliderData["label"]
3737 slider.minimumValue = sliderData["min"]
3838 slider.maximumValue = sliderData["max"]
39− slider.live = sliderData["live"]
39+ if("live" in sliderData)
40+ slider.live = sliderData["live"]
4041 // SDK Slider does not support step yet
4142// slider.step = sliderData["step"]
42− slider.value = sliderData["value"]
43+ if("value" in sliderData)
44+ slider.value = sliderData["value"]
4345 action = sliderData["action"]
4446 }
4547
Hud/SoundAmplitudeDelegate.qml → qml/Hud/SoundAmplitudeDelegate.qmlrenamed

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

Binary file not shown.

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

The content is the same.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

The content is the same.

Launcher/Launcher.qml → qml/Launcher/Launcher.qmlrenamed+3−3
@@ -41,7 +41,7 @@ Item {
4141 signal dash()
4242
4343 // emitted when the dash icon in the launcher has been tapped
44− signal dashItemSelected()
44+ signal showDashHome()
4545
4646 onStateChanged: {
4747 if (state == "") {
@@ -161,9 +161,9 @@ Item {
161161 root.state = ""
162162 launcherApplicationSelected(appId)
163163 }
164− onDashItemSelected: {
164+ onShowDashHome: {
165165 root.state = ""
166− root.dashItemSelected(index)
166+ root.showDashHome();
167167 }
168168
169169 onPreventHidingChanged: {
Launcher/LauncherDelegate.qml → qml/Launcher/LauncherDelegate.qmlrenamed

The content is the same.

Launcher/LauncherPanel.qml → qml/Launcher/LauncherPanel.qmlrenamed+2−2
@@ -36,7 +36,7 @@ Item {
3636 property int highlightIndex: -1
3737
3838 signal applicationSelected(string appId)
39− signal dashItemSelected(int index)
39+ signal showDashHome()
4040
4141 BorderImage {
4242 id: background
@@ -57,7 +57,7 @@ Item {
5757 id: dashItem
5858 width: parent.width
5959 height: units.gu(7)
60− onClicked: root.dashItemSelected(0)
60+ onClicked: root.showDashHome()
6161 z: 1
6262 Image {
6363 objectName: "dashItem"
Launcher/graphics/focused_app_arrow@30.png → qml/Launcher/graphics/focused_app_arrow@30.pngrenamed

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

The content is the same.

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

Binary file not shown.

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

The content is the same.

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

Binary file not shown.

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

The content is the same.

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

Binary file not shown.

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

The content is the same.

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

Binary file not shown.

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

The content is the same.

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

Binary file not shown.

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

Binary file not shown.

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

The content is the same.

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

Binary file not shown.

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

The content is the same.

Panel/IndicatorItem.qml → qml/Panel/IndicatorItem.qmlrenamed+6−12
@@ -23,10 +23,10 @@ Item {
2323 id: indicatorItem
2424
2525 property alias widgetSource: loader.source
26− property bool highlighted: false
2726 property bool dimmed: false
2827 property var indicatorProperties: undefined
2928 property bool indicatorVisible: loader.item ? loader.item.enabled : false
29+ property string identifier
3030
3131 opacity: dimmed ? 0.4 : 1
3232 Behavior on opacity { StandardAnimation {} }
@@ -45,17 +45,11 @@ Item {
4545 }
4646 }
4747 }
48− }
49−
50− Rectangle {
51− color: Theme.palette.selected.foreground
52− objectName: "highlight"
53− height: units.dp(2)
54− width: parent.width
55− anchors.top: parent.bottom
56− visible: highlighted
5748
58− opacity: highlighted ? 1 : 0
59− Behavior on opacity { StandardAnimation {} }
49+ Binding {
50+ target: loader.item
51+ property: "objectName"
52+ value: identifier + "-widget"
53+ }
6054 }
6155}
Panel/IndicatorRow.qml → qml/Panel/IndicatorRow.qmlrenamed+40−8
@@ -29,6 +29,8 @@ Item {
2929 property var visibleIndicators: defined
3030 property int overFlowWidth: width
3131 property bool showAll: false
32+ property real currentItemOffset: 0.0
33+ property real unitProgress: 0.0
3234
3335 width: units.gu(40)
3436 height: units.gu(3)
@@ -79,23 +81,24 @@ Item {
7981 height: indicatorRow.height
8082 width: indicatorItem.width
8183 visible: indicatorItem.indicatorVisible
82− opacity: 1.0
84+ opacity: 1.0 * opacityMultiplier
8385 y: 0
8486 state: "standard"
8587
8688 property int ownIndex: index
87− property alias highlighted: indicatorItem.highlighted
88− property alias dimmed: indicatorItem.dimmed
89+ property bool highlighted: indicatorRow.state != "initial" ? ownIndex == indicatorRow.currentItemIndex : false
90+ property bool dimmed: indicatorRow.state != "initial" ? ownIndex != indicatorRow.currentItemIndex : false
8991
90− property bool hidden: !showAll && !indicatorItem.highlighted && (indicatorRow.state == "locked" || indicatorRow.state == "commit")
92+ property bool hidden: !showAll && !highlighted && (indicatorRow.state == "locked" || indicatorRow.state == "commit")
9193 property bool overflow: row.width - itemWrapper.x > overFlowWidth
94+ property real opacityMultiplier: highlighted ? 1 : (1 - indicatorRow.unitProgress)
9295
9396 IndicatorItem {
9497 id: indicatorItem
98+ identifier: model.identifier
9599 height: parent.height
96100
97− highlighted: indicatorRow.state != "initial" ? itemWrapper.ownIndex == indicatorRow.currentItemIndex : false
98− dimmed: indicatorRow.state != "initial" ? itemWrapper.ownIndex != indicatorRow.currentItemIndex : false
101+ dimmed: itemWrapper.dimmed
99102
100103 widgetSource: model.widgetSource
101104 indicatorProperties : model.indicatorProperties
@@ -135,14 +138,43 @@ Item {
135138
136139 transitions: [
137140 Transition {
138− StandardAnimation {
141+ UbuntuNumberAnimation {
139142 target: itemWrapper
140143 property: "opacity"
141− duration: 300
144+ duration: UbuntuAnimation.BriskDuration
142145 }
143146 }
144147 ]
145148 }
146149 }
147150 }
151+
152+ Rectangle {
153+ id: highlight
154+ color: Theme.palette.selected.foreground
155+ objectName: "highlight"
156+ height: units.dp(2)
157+ anchors.top: row.bottom
158+ visible: indicatorRow.currentItem != null
159+ x: row.x + (indicatorRow.currentItem != null ? indicatorRow.currentItem.x + centerOffset : 0)
160+ width: indicatorRow.currentItem != null ? indicatorRow.currentItem.width : 0
161+
162+ property real centerOffset: {
163+ if (indicatorRow.currentItemOffset > 0.1) {
164+ return (indicatorRow.currentItemOffset - 0.1) * units.gu(0.4);
165+ } else if (indicatorRow.currentItemOffset < -0.1) {
166+ return (indicatorRow.currentItemOffset + 0.1) * units.gu(0.4);
167+ }
168+ return 0.0;
169+ }
170+
171+ Behavior on width {
172+ enabled: unitProgress > 0;
173+ UbuntuNumberAnimation { duration: UbuntuAnimation.FastDuration }
174+ }
175+ Behavior on x {
176+ enabled: unitProgress > 0;
177+ UbuntuNumberAnimation { duration: UbuntuAnimation.FastDuration }
178+ }
179+ }
148180}
Panel/Indicators.qml → qml/Panel/Indicators.qmlrenamed+22−11
@@ -39,6 +39,7 @@ Showable {
3939 property bool contentEnabled: true
4040 property bool initalizeItem: true
4141 readonly property alias content: menuContent
42+ property real unitProgress: 0.0
4243
4344 // TODO: Perhaps we need a animation standard for showing/hiding? Each showable seems to
4445 // use its own values. Need to ask design about this.
@@ -128,23 +129,31 @@ Showable {
128129 rowCoordinates = indicatorRow.mapToItem(indicatorRow.row, xValue, 0);
129130 // get the current delegate
130131 currentItem = indicatorRow.row.childAt(rowCoordinates.x, 0);
131− if (currentItem && currentItem != indicatorRow.currentItem ) {
132+ if (currentItem) {
132133 itemCoordinates = indicatorRow.row.mapToItem(currentItem, rowCoordinates.x, 0);
133134 distanceFromRightEdge = (currentItem.width - itemCoordinates.x) / (currentItem.width);
134− if (Math.abs(currentItem.ownIndex - indicatorRow.currentItemIndex) > 1) {
135− bufferExceeded = true;
136− } else {
137− if (indicatorRow.currentItemIndex < currentItem.ownIndex && distanceFromRightEdge < (1 - effectiveBufferThreshold)) {
138− bufferExceeded = true;
139− } else if (indicatorRow.currentItemIndex > currentItem.ownIndex && distanceFromRightEdge > effectiveBufferThreshold) {
135+ if (currentItem != indicatorRow.currentItem) {
136+ if (Math.abs(currentItem.ownIndex - indicatorRow.currentItemIndex) > 1) {
140137 bufferExceeded = true;
138+ } else {
139+ if (indicatorRow.currentItemIndex < currentItem.ownIndex && distanceFromRightEdge < (1 - effectiveBufferThreshold)) {
140+ bufferExceeded = true;
141+ } else if (indicatorRow.currentItemIndex > currentItem.ownIndex && distanceFromRightEdge > effectiveBufferThreshold) {
142+ bufferExceeded = true;
143+ }
141144 }
145+ if ((!useBuffer || (useBuffer && bufferExceeded)) || indicatorRow.currentItemIndex < 0 || indicatorRow.currentItem == null) {
146+ indicatorRow.currentItem = currentItem;
147+ }
148+
149+ // need to re-init the distanceFromRightEdge for offset calculation
150+ itemCoordinates = indicatorRow.row.mapToItem(indicatorRow.currentItem, rowCoordinates.x, 0);
151+ distanceFromRightEdge = (indicatorRow.currentItem.width - itemCoordinates.x) / (indicatorRow.currentItem.width);
142152 }
143− if ((!useBuffer || (useBuffer && bufferExceeded)) || indicatorRow.currentItem < 0 || indicatorRow.currentItem == null) {
144− indicatorRow.currentItem = currentItem;
145− }
146− } else if (!currentItem) {
153+ indicatorRow.currentItemOffset = 1 - (distanceFromRightEdge * 2);
154+ } else {
147155 indicatorRow.setDefaultItem();
156+ indicatorRow.currentItemOffset = 0;
148157 }
149158 initalizeItem = indicatorRow.currentItem == null;
150159 }
@@ -268,6 +277,7 @@ Showable {
268277 height: indicators.panelHeight
269278 indicatorsModel: indicatorsModel
270279 state: indicators.state
280+ unitProgress: indicators.unitProgress
271281
272282 Connections {
273283 property bool enableIndexChangeSignal: true
@@ -326,6 +336,7 @@ Showable {
326336 if (hideAnimation.running) {
327337 indicators.state = "initial";
328338 initalizeItem = true;
339+ menuContent.animateNextMenuChange = false;
329340 }
330341 }
331342 }
plugins/Unity/Indicators/qml/IndicatorPage.qml → qml/Panel/Indicators/DefaultIndicatorPage.qmlrenamed+43−30
@@ -22,7 +22,7 @@ import QtQuick 2.0
2222import Ubuntu.Components 0.1 as Components
2323import Unity.Indicators 0.1 as Indicators
2424
25−IndicatorBase {
25+Indicators.IndicatorBase {
2626 id: main
2727
2828 //const
@@ -59,10 +59,17 @@ IndicatorBase {
5959 menuStack.push(menuStack.rootMenu, 0);
6060 }
6161 }
62+ onModelReset: {
63+ if (menuStack.rootMenu !== menuStack.tail && menuStack.tail.get(0, "type") === rootMenuType) {
64+ menuStack.rootMenu = menuStack.tail.submenu(0);
65+ menuStack.push(menuStack.rootMenu, 0);
66+ }
67+ }
6268 }
6369
6470 ListView {
6571 id: mainMenu
72+ objectName: "mainMenu"
6673 model: menuStack.rootMenu
6774
6875 anchors {
@@ -115,56 +122,62 @@ IndicatorBase {
115122 }
116123 }
117124
118− delegate: Item {
119− id: menuDelegate
125+ delegate: Loader {
126+ id: loader
127+ objectName: "menuItem" + index
128+ asynchronous: false
129+ visible: height > 0
130+
131+ property int modelIndex: index
120132
121133 anchors {
122134 left: parent.left
123135 right: parent.right
124136 }
125− height: loader.height
126− visible: height > 0
127137
128− Loader {
129− id: loader
130− asynchronous: false
138+ sourceComponent: factory.load(model)
131139
132− property int modelIndex: index
133−
134− anchors {
135− left: parent.left
136− right: parent.right
140+ onLoaded: {
141+ if (item.hasOwnProperty("menuSelected")) {
142+ item.menuSelected = mainMenu.selectedIndex == index;
143+ item.selectMenu.connect(function() { mainMenu.selectedIndex = index; });
144+ item.deselectMenu.connect(function() { mainMenu.selectedIndex = -1; });
145+ }
146+ if (item.hasOwnProperty("menuData")) {
147+ item.menuData = Qt.binding(function() { return model; });
137148 }
149+ if (item.hasOwnProperty("menuIndex")) {
150+ item.menuIndex = Qt.binding(function() { return modelIndex; });
151+ }
152+ }
138153
139− sourceComponent: factory.load(model)
154+ Binding {
155+ target: item ? item : null
156+ property: "objectName"
157+ value: model.action
158+ }
140159
141− onLoaded: {
142− if (item.hasOwnProperty("menuSelected")) {
143− item.menuSelected = Qt.binding(function() { return mainMenu.selectedIndex == index; });
144− item.selectMenu.connect(function() { mainMenu.selectedIndex = index; });
145− item.deselectMenu.connect(function() { mainMenu.selectedIndex = -1; });
146− }
147− if (item.hasOwnProperty("menu")) {
148− item.menu = Qt.binding(function() { return model; });
160+ // TODO: Fixes lp#1243146
161+ // This is a workaround for a Qt bug. https://bugreports.qt-project.org/browse/QTBUG-34351
162+ Connections {
163+ target: mainMenu
164+ onSelectedIndexChanged: {
165+ if (loader.item && loader.item.hasOwnProperty("menuSelected")) {
166+ loader.item.menuSelected = mainMenu.selectedIndex == index;
149167 }
150168 }
151−
152− Binding {
153− target: item ? item : null
154− property: "objectName"
155− value: model.action
156− }
157169 }
158170 }
159171 }
160172
161− MenuItemFactory {
173+ Indicators.MenuItemFactory {
162174 id: factory
163− model: mainMenu.model
175+ menuModel: mainMenu.model ? mainMenu.model : null
164176 }
165177
166178 Components.Label {
167179 id: emptyLabel
180+ objectName: "emptyLabel"
168181 visible: mainMenu.count == 0
169182 anchors {
170183 top: parent.top
Panel/Indicators/DefaultIndicatorWidget.qml → qml/Panel/Indicators/DefaultIndicatorWidget.qmlrenamed+5−3
@@ -21,15 +21,17 @@ import QtQuick 2.0
2121import Ubuntu.Components 0.1
2222import Unity.Indicators 0.1 as Indicators
2323
24−Indicators.IndicatorWidget {
24+Indicators.IndicatorBase {
2525 id: indicatorWidget
2626
27− width: itemRow.width
28−
27+ property int iconSize: height
2928 property alias leftLabel: itemLeftLabel.text
3029 property alias rightLabel: itemRightLabel.text
3130 property var icons: undefined
3231
32+ width: itemRow.width
33+ enabled: false
34+
3335 Row {
3436 id: itemRow
3537 width: childrenRect.width
Panel/Indicators/client/IndicatorsClient.qml → qml/Panel/Indicators/client/IndicatorsClient.qmlrenamed

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

Panel/MenuContent.qml → qml/Panel/MenuContent.qmlrenamed+3−1
@@ -33,6 +33,7 @@ MainView {
3333 property int contentReleaseInterval: 20000
3434 property bool activeHeader: false
3535 property alias visibleIndicators: visibleIndicatorsModel.visible
36+ property bool animateNextMenuChange: false
3637
3738 width: units.gu(40)
3839 height: units.gu(42)
@@ -41,11 +42,12 @@ MainView {
4142 var filteredIndex = filteredIndicators.mapFromSource(index)
4243
4344 if (tabs.selectedTabIndex !== filteredIndex) {
44− if (tabs.selectedTabIndex == -1) {
45+ if (tabs.selectedTabIndex == -1 || !animateNextMenuChange) {
4546 tabs.tabBar.animate = false;
4647 }
4748 tabs.selectedTabIndex = filteredIndex;
4849 tabs.tabBar.animate = true;
50+ animateNextMenuChange = true;
4951 }
5052 }
5153
Panel/Panel.qml → qml/Panel/Panel.qmlrenamed+23−1
@@ -31,6 +31,28 @@ Item {
3131
3232 signal searchClicked
3333
34+ function hideIndicatorMenu(delay) {
35+ if (delay !== undefined) {
36+ hideTimer.interval = delay;
37+ hideTimer.start();
38+ } else {
39+ indicatorsMenu.hide();
40+ }
41+ }
42+
43+ Timer {
44+ id: hideTimer
45+ running: false
46+ onTriggered: {
47+ indicatorsMenu.hide();
48+ }
49+ }
50+
51+ Connections {
52+ target: indicatorsMenu
53+ onShown: hideTimer.stop()
54+ }
55+
3456 PanelBackground {
3557 id: panelBackground
3658 anchors {
@@ -85,7 +107,7 @@ Item {
85107 pinnedMode: !fullscreenMode
86108 overFlowWidth: search.state=="hidden" ? parent.width : parent.width - search.width
87109
88− property real unitProgress: (height - panelHeight) / (openedHeight - panelHeight)
110+ unitProgress: (height - panelHeight) / (openedHeight - panelHeight)
89111 }
90112
91113 PanelSeparatorLine {
Panel/PanelBackground.qml → qml/Panel/PanelBackground.qmlrenamed

The content is the same.

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

The content is the same.

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

The content is the same.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

The content is the same.

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

Binary file not shown.

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

The content is the same.

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

Binary file not shown.

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

Binary file not shown.

qml/ScopeTool.qmlnew file+175
@@ -0,0 +1,175 @@
1+/*
2+* Copyright (C) 2013 Canonical, Ltd.
3+*
4+* This program is free software; you can redistribute it and/or modify
5+* it under the terms of the GNU General Public License as published by
6+* the Free Software Foundation; version 3.
7+*
8+* This program is distributed in the hope that it will be useful,
9+* but WITHOUT ANY WARRANTY; without even the implied warranty of
10+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+* GNU General Public License for more details.
12+*
13+* You should have received a copy of the GNU General Public License
14+* along with this program. If not, see <http://www.gnu.org/licenses/>.
15+*/
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+import Ubuntu.Components.Popups 0.1
20+import Utils 0.1
21+import Unity 0.1
22+import "Components"
23+import "Dash"
24+
25+Rectangle {
26+ id: root
27+ width: units.gu(80)
28+ height: units.gu(72)
29+ color: "#88FFFFFF"
30+
31+ // Fake shell object
32+ QtObject {
33+ id: shell
34+ }
35+
36+ // Fake greeter object
37+ QtObject {
38+ id: greeter
39+ property bool shown
40+ }
41+
42+ // Fake panel object
43+ QtObject {
44+ id: panel
45+ signal searchClicked
46+ }
47+
48+ SortFilterProxyModel {
49+ id: filteredScopes
50+ model: Scopes {
51+ id: scopes
52+ }
53+ dynamicSortFilter: true
54+
55+ filterRole: Scopes.RoleVisible
56+ filterRegExp: RegExp("^true$")
57+ }
58+
59+ Rectangle {
60+ anchors.fill: dashContent
61+ color: "#FCFCFC"
62+ }
63+
64+ DashContent {
65+ id: dashContent
66+
67+ model: filteredScopes
68+ searchHistory: SearchHistoryModel { }
69+ property Scope scope: scopes.get(currentIndex)
70+
71+ anchors {
72+ top: parent.top
73+ bottom: parent.bottom
74+ left: parent.left
75+ right: controls.left
76+ }
77+ }
78+
79+ Rectangle {
80+ id: controls
81+ color: "lightgrey"
82+ width: units.gu(40)
83+ anchors {
84+ top: parent.top
85+ bottom: parent.bottom
86+ right: parent.right
87+ }
88+
89+ MouseArea {
90+ anchors.fill: parent
91+ }
92+
93+ Column {
94+ anchors { fill: parent; margins: units.gu(1) }
95+ spacing: units.gu(1)
96+
97+ Label {
98+ text: "Search query"
99+ }
100+
101+ TextField {
102+ id: searchField
103+ anchors { left: parent.left; right: parent.right }
104+
105+ onTextChanged: dashContent.scope.searchQuery = text
106+
107+ Connections {
108+ target: dashContent.scope
109+ onSearchQueryChanged: searchField.text = dashContent.scope.searchQuery
110+ }
111+ }
112+
113+ Label {
114+ text: "Category"
115+ height: units.gu(4)
116+ verticalAlignment: Text.AlignBottom
117+ }
118+
119+ OptionSelector {
120+ id: categorySelector
121+ anchors { left: parent.left; right: parent.right }
122+ model: dashContent.scope ? dashContent.scope.categories : null
123+
124+ property Item selectedItem
125+
126+ delegate: OptionSelectorDelegate {
127+ id: categoryDelegate
128+ text: model.name
129+ property string categoryId: model.categoryId
130+ property string template: JSON.stringify(JSON.parse(model.rawRendererTemplate), null, " ");
131+
132+ onSelectedChanged: if (selected) categorySelector.selectedItem = categoryDelegate
133+ }
134+ }
135+
136+ TextArea {
137+ id: categoryJson
138+ width: parent.width
139+ autoSize: true
140+ readOnly: true
141+ text: categorySelector.selectedItem && categorySelector.selectedItem.template
142+ }
143+
144+ Button {
145+ width: parent.width
146+ text: "Override category"
147+ onClicked: {
148+ PopupUtils.open(categoryEditor)
149+ }
150+ }
151+ }
152+ }
153+
154+ Component {
155+ id: categoryEditor
156+
157+ ComposerSheet {
158+ id: sheet
159+ title: "Editing category definition"
160+
161+ TextArea {
162+ id: categoryEditorArea
163+ anchors.fill: parent
164+ wrapMode: Text.WordWrap
165+ text: categoryJson.text
166+ }
167+
168+ onCancelClicked: PopupUtils.close(sheet)
169+ onConfirmClicked: {
170+ PopupUtils.close(sheet);
171+ dashContent.scope.categories.overrideCategoryJson(categorySelector.selectedItem.categoryId, categoryEditorArea.text);
172+ }
173+ }
174+ }
175+}
Shell.qml → qml/Shell.qmlrenamed+23−10
@@ -44,7 +44,7 @@ FocusScope {
4444 height: tablet ? units.gu(100) : applicationArguments.hasGeometry() ? applicationArguments.height() : units.gu(71)
4545
4646 property real edgeSize: units.gu(2)
47− property url defaultBackground: shell.width >= units.gu(60) ? "graphics/tablet_background.jpg" : "graphics/phone_background.jpg"
47+ property url defaultBackground: Qt.resolvedUrl(shell.width >= units.gu(60) ? "graphics/tablet_background.jpg" : "graphics/phone_background.jpg")
4848 property url background
4949 readonly property real panelHeight: panel.panelHeight
5050
@@ -96,21 +96,21 @@ FocusScope {
9696 }
9797 }
9898
99− function activateApplication(desktopFile, argument) {
99+ function activateApplication(appId, argument) {
100100 if (applicationManager) {
101101 // For newly started applications, as it takes them time to draw their first frame
102102 // we add a delay before we hide the animation screenshots to compensate.
103− var addDelay = !applicationManager.getApplicationFromDesktopFile(desktopFile);
103+ var addDelay = !applicationManager.getApplicationFromDesktopFile(appId);
104104
105105 var application;
106− application = applicationManager.activateApplication(desktopFile, argument);
106+ application = applicationManager.activateApplication(appId, argument);
107107 if (application == null) {
108108 return;
109109 }
110110 if (application.stage == ApplicationInfo.MainStage || !sideStage.enabled) {
111− mainStage.activateApplication(desktopFile, addDelay);
111+ mainStage.activateApplication(appId, addDelay);
112112 } else {
113− sideStage.activateApplication(desktopFile, addDelay);
113+ sideStage.activateApplication(appId, addDelay);
114114 }
115115 stages.show();
116116 }
@@ -413,6 +413,7 @@ FocusScope {
413413 width: parent.width
414414 height: parent.height - panel.panelHeight
415415 background: shell.background
416+ pinLength: 4
416417
417418 onEntered: LightDM.Greeter.respond(passphrase);
418419 onCancel: greeter.show()
@@ -576,6 +577,10 @@ FocusScope {
576577 stages.hide()
577578 }
578579
580+ function hideIndicatorMenu(delay) {
581+ panel.hideIndicatorMenu(delay);
582+ }
583+
579584 Item {
580585 id: overlay
581586
@@ -667,7 +672,12 @@ FocusScope {
667672 dragAreaWidth: shell.edgeSize
668673 available: (!greeter.shown || greeter.narrowMode) && edgeDemo.launcherEnabled
669674
670− onDashItemSelected: showHome()
675+ onShowDashHome: {
676+ if (edgeDemo.running)
677+ return;
678+
679+ showHome()
680+ }
671681 onDash: {
672682 if (stages.shown) {
673683 stages.hide();
@@ -676,6 +686,9 @@ FocusScope {
676686 }
677687 onDashSwipeChanged: if (dashSwipe && stages.shown) dash.setCurrentScope("applications.scope", false, true)
678688 onLauncherApplicationSelected:{
689+ if (edgeDemo.running)
690+ return;
691+
679692 greeter.hide()
680693 shell.activateApplication(appId)
681694 }
@@ -692,13 +705,13 @@ FocusScope {
692705 id: notifications
693706
694707 model: NotificationBackend.Model
708+ margin: units.gu(1)
709+
695710 anchors {
696711 top: parent.top
697712 right: parent.right
698713 bottom: parent.bottom
699− leftMargin: units.gu(1)
700− rightMargin: units.gu(1)
701− topMargin: panel.panelHeight + units.gu(1)
714+ topMargin: panel.panelHeight
702715 }
703716 states: [
704717 State {
SideStage/SideStage.qml → qml/SideStage/SideStage.qmlrenamed

The content is the same.

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

The content is the same.

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

Binary file not shown.

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

The content is the same.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

run+7−6
@@ -1,6 +1,9 @@
11#!/bin/sh
22
3−QML_PHONE_SHELL_PATH=./builddir/unity8
3+. /etc/environment
4+export QML2_IMPORT_PATH
5+
6+QML_PHONE_SHELL_PATH=./builddir/src/unity8
47GDB=false
58FAKE=false
69PINLOCK=false
@@ -40,19 +43,17 @@ do
4043done
4144
4245if $FAKE; then
43− export QML2_IMPORT_PATH=$PWD/builddir/tests/mocks:$PWD/builddir/plugins:$PWD/builddir/modules
46+ export QML2_IMPORT_PATH=$QML2_IMPORT_PATH:$PWD/builddir/tests/mocks:$PWD/builddir/plugins:$PWD/builddir/modules
4447 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/builddir/tests/mocks/libusermetrics:$PWD/builddir/tests/mocks/LightDM/single
45−else
46− export QML2_IMPORT_PATH=`pkg-config --variable=plugindir unity-shell-api`
4748fi
4849
4950if $PINLOCK; then
50− export QML2_IMPORT_PATH=$PWD/builddir/tests/mocks:$PWD/builddir/plugins:$PWD/builddir/modules
51+ export QML2_IMPORT_PATH=$QML2_IMPORT_PATH:$PWD/builddir/tests/mocks:$PWD/builddir/plugins:$PWD/builddir/modules
5152 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/builddir/tests/mocks/libusermetrics:$PWD/builddir/tests/mocks/LightDM/single-pin
5253fi
5354
5455if $KEYLOCK; then
55− export QML2_IMPORT_PATH=$PWD/builddir/tests/mocks:$PWD/builddir/plugins:$PWD/builddir/modules
56+ export QML2_IMPORT_PATH=$QML2_IMPORT_PATH:$PWD/builddir/tests/mocks:$PWD/builddir/plugins:$PWD/builddir/modules
5657 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/builddir/tests/mocks/libusermetrics:$PWD/builddir/tests/mocks/LightDM/single-passphrase
5758fi
5859
run_on_device−1
@@ -88,7 +88,6 @@ sync_code() {
8888}
8989
9090build() {
91− exec_with_ssh "[ $CODE_DIR/debian/control -nt unity8-build-deps*deb ] && $SUDO mk-build-deps --tool=\\\"apt-get -y --no-install-recommends\\\" --build-dep --install $CODE_DIR/debian/control"
9291 exec_with_ssh PATH=/usr/lib/ccache:$PATH "cd $CODE_DIR/ && PATH=/usr/lib/ccache:$PATH ./build"
9392}
9493
runtests.sh+1−13
@@ -26,19 +26,7 @@
2626# floating point operations and xml writing is natively supported.
2727
2828
29−if test -e Shell.qml; then
30− echo In-source build detected.
31− SRCDIR=`pwd`
32−elif test -e ../Shell.qml; then
33− echo Out-of-source build detected. Found source dir at ..
34− SRCDIR=`pwd`/..
35−else
36− echo Out-of-source build detected. Source dir not found at ..
37− echo Only in-source builds or out-of-source builds with source dir at .. are supported.
38− exit 1
39−fi
40−
41−cd $SRCDIR
29+SRCDIR=`dirname "$(readlink -f "$0")"`
4230
4331file_list=""
4432
ApplicationArguments.h → src/ApplicationArguments.hrenamed

The content is the same.

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

The content is the same.

MouseTouchAdaptor.h → src/MouseTouchAdaptor.hrenamed

The content is the same.

src/Panel/Indicators/client/CMakeLists.txt−4
@@ -14,10 +14,6 @@ add_executable(${INDICATORS_CLIENT_APP}
1414 ${INDICATORS_CLIENT_HEADERS}
1515)
1616
17−include_directories(
18− ${CMAKE_BINARY_DIR}
19−)
20−
2117qt5_use_modules(${INDICATORS_CLIENT_APP} Core Widgets Quick)
2218set_target_properties(${INDICATORS_CLIENT_APP} PROPERTIES COMPILE_FLAGS -fPIC)
2319
src/Panel/Indicators/client/indicatorsclient.cpp+3−37
@@ -19,48 +19,14 @@
1919 */
2020
2121#include "indicatorsclient.h"
22−#include "paths.h"
22+
23+#include <paths.h>
2324
2425#include <QQuickView>
2526#include <QQmlContext>
2627#include <QQmlEngine>
2728#include <QDebug>
2829
29−namespace {
30−
31−void prependImportPaths(QQmlEngine *engine, const QStringList &paths)
32−{
33− QStringList importPathList = engine->importPathList();
34− for (int i = paths.count()-1; i >= 0; i--) {
35− importPathList.prepend(paths[i]);
36− }
37− engine->setImportPathList(importPathList);
38−}
39−
40−/* When you append and import path to the list of import paths it will be the *last*
41− place where Qt will search for QML modules.
42− The usual QQmlEngine::addImportPath() actually prepends the given path.*/
43−void appendImportPaths(QQmlEngine *engine, const QStringList &paths)
44−{
45− QStringList importPathList = engine->importPathList();
46− Q_FOREACH(const QString& path, paths) {
47− // don't duplicate
48− QStringList::iterator iter = qFind(importPathList.begin(), importPathList.end(), path);
49− if (iter == importPathList.end()) {
50− importPathList.append(path);
51− }
52− }
53− engine->setImportPathList(importPathList);
54−}
55−
56−void resolveIconTheme() {
57− QString ubuntuIconTheme = getenv("UBUNTU_ICON_THEME");
58− if (ubuntuIconTheme.isEmpty()) {
59− QIcon::setThemeName("ubuntu-mobile");
60− }
61−}
62−} // namespace
63−
6430IndicatorsClient::IndicatorsClient(int &argc, char **argv)
6531 : QObject(0),
6632 m_view(0)
@@ -71,7 +37,7 @@ IndicatorsClient::IndicatorsClient(int &argc, char **argv)
7137 QStringList args = m_application->arguments();
7238
7339 m_view = new QQuickView;
74− m_view->engine()->setBaseUrl(QUrl::fromLocalFile(::shellAppDirectory()+"Panel/Indicators/client/"));
40+ m_view->engine()->setBaseUrl(QUrl::fromLocalFile(::qmlDirectory()+"Panel/Indicators/client/"));
7541 prependImportPaths(m_view->engine(), ::overrideImportPaths());
7642 appendImportPaths(m_view->engine(), ::fallbackImportPaths());
7743
main.cpp → src/main.cpprenamed+9−43
@@ -19,7 +19,6 @@
1919
2020// Qt
2121#include <QtQuick/QQuickView>
22−#include <QtGui/QIcon>
2322#include <QtGui/QGuiApplication>
2423#include <QtQml/QQmlEngine>
2524#include <QtQml/QQmlContext>
@@ -28,53 +27,15 @@
2827#include <QDebug>
2928#include <libintl.h>
3029#include <dlfcn.h>
30+#include <csignal>
3131
3232// local
33−#include "paths.h"
33+#include <paths.h>
3434#include "MouseTouchAdaptor.h"
3535#include "ApplicationArguments.h"
3636
3737#include <unity-mir/qmirserver.h>
3838
39−namespace {
40−
41−void prependImportPaths(QQmlEngine *engine, const QStringList &paths)
42−{
43− QStringList importPathList = engine->importPathList();
44− for (int i = paths.count() -1; i >= 0; i--) {
45− // don't duplicate
46− const QString& path = paths[i];
47− QStringList::iterator iter = qFind(importPathList.begin(), importPathList.end(), path);
48− if (iter == importPathList.end()) {
49− engine->addImportPath(path);
50− }
51− }
52−}
53−
54−/* When you append and import path to the list of import paths it will be the *last*
55− place where Qt will search for QML modules.
56− The usual QQmlEngine::addImportPath() actually prepends the given path.*/
57−void appendImportPaths(QQmlEngine *engine, const QStringList &paths)
58−{
59− QStringList importPathList = engine->importPathList();
60− Q_FOREACH(const QString& path, paths) {
61− // don't duplicate
62− QStringList::iterator iter = qFind(importPathList.begin(), importPathList.end(), path);
63− if (iter == importPathList.end()) {
64− importPathList.append(path);
65− }
66− }
67− engine->setImportPathList(importPathList);
68−}
69−
70−void resolveIconTheme() {
71− const char *ubuntuIconTheme = getenv("UBUNTU_ICON_THEME");
72− if (ubuntuIconTheme == NULL) {
73− ubuntuIconTheme = "ubuntu-mobile";
74− }
75− QIcon::setThemeName(ubuntuIconTheme);
76−}
77−} // namespace {
7839
7940int startShell(int argc, const char** argv, void* server)
8041{
@@ -125,7 +86,7 @@ int startShell(int argc, const char** argv, void* server)
12586 QQuickView* view = new QQuickView();
12687 view->setResizeMode(QQuickView::SizeRootObjectToView);
12788 view->setTitle("Qml Phone Shell");
128− view->engine()->setBaseUrl(QUrl::fromLocalFile(::shellAppDirectory()));
89+ view->engine()->setBaseUrl(QUrl::fromLocalFile(::qmlDirectory()));
12990 view->rootContext()->setContextProperty("applicationArguments", &qmlArgs);
13091 if (args.contains(QLatin1String("-frameless"))) {
13192 view->setFlags(Qt::FramelessWindowHint);
@@ -148,7 +109,7 @@ int startShell(int argc, const char** argv, void* server)
148109 nativeInterface->setProperty("ubuntuSessionType", 1);
149110 view->setProperty("role", 2); // INDICATOR_ACTOR_ROLE
150111
151− QUrl source("Shell.qml");
112+ QUrl source(::qmlDirectory()+"Shell.qml");
152113 prependImportPaths(view->engine(), ::overrideImportPaths());
153114 appendImportPaths(view->engine(), ::fallbackImportPaths());
154115
@@ -218,6 +179,11 @@ int main(int argc, const char *argv[])
218179
219180 return runWithClient(mirServer, startShell);
220181 } else {
182+ if (qgetenv("UPSTART_JOB") == "unity8") {
183+ // Emit SIGSTOP as expected by upstart, under Mir it's unity-mir that will raise it.
184+ // see http://upstart.ubuntu.com/cookbook/#expect-stop
185+ raise(SIGSTOP);
186+ }
221187 return startShell(argc, argv, nullptr);
222188 }
223189}
tests/autopilot/.projectnew file+17
@@ -0,0 +1,17 @@
1+<?xml version="1.0" encoding="UTF-8"?>
2+<projectDescription>
3+ <name>Unity8 Autopilot</name>
4+ <comment></comment>
5+ <projects>
6+ </projects>
7+ <buildSpec>
8+ <buildCommand>
9+ <name>org.python.pydev.PyDevBuilder</name>
10+ <arguments>
11+ </arguments>
12+ </buildCommand>
13+ </buildSpec>
14+ <natures>
15+ <nature>org.python.pydev.pythonNature</nature>
16+ </natures>
17+</projectDescription>
tests/autopilot/.pydevprojectnew file+8
@@ -0,0 +1,8 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<?eclipse-pydev version="1.0"?><pydev_project>
3+<pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH">
4+<path>/Unity8 Autopilot</path>
5+</pydev_pathproperty>
6+<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property>
7+<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
8+</pydev_project>
tests/autopilot/unity8/application_lifecycle/tests/test_application_lifecycle.py+7−6
@@ -21,6 +21,7 @@
2121
2222from __future__ import absolute_import
2323
24+from unity8.process_helpers import unlock_unity
2425from unity8.shell import disable_qml_mocking
2526from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
2627
@@ -78,8 +79,8 @@ class ApplicationLifecycleTests(UnityTestCase):
7879 @disable_qml_mocking
7980 def test_can_launch_application(self):
8081 """Must be able to launch an application."""
81− self.launch_unity()
82− self.main_window.get_greeter().swipe()
82+ unity_proxy = self.launch_unity()
83+ unlock_unity(unity_proxy)
8384
8485 app = self._launch_app("messaging-app")
8586
@@ -92,8 +93,8 @@ class ApplicationLifecycleTests(UnityTestCase):
9293 @disable_qml_mocking
9394 def test_can_launch_multiple_applications(self):
9495 """A second application launched must be focused."""
95− self.launch_unity()
96− self.main_window.get_greeter().swipe()
96+ unity_proxy = self.launch_unity()
97+ unlock_unity(unity_proxy)
9798
9899 self._launch_app("messaging-app")
99100 self.assertThat(
@@ -113,8 +114,8 @@ class ApplicationLifecycleTests(UnityTestCase):
113114 brought back to the focused state.
114115
115116 """
116− self.launch_unity()
117− self.main_window.get_greeter().swipe()
117+ unity_proxy = self.launch_unity()
118+ unlock_unity(unity_proxy)
118119
119120 self._launch_app("messaging-app")
120121 self.assertThat(
tests/autopilot/unity8/indicators/__init__.pynew file

No changes to the content.

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

No changes to the content.

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

Binary file not shown.

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

Binary file not shown.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/qmltests/tst_Shell.qml+3−3

This diff is too big to show here.

tests/uqmlscene/CMakeLists.txt+6−1

This diff is too big to show here.

tests/uqmlscene/main.cpp+1−1

This diff is too big to show here.

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

This diff is too big to show here.

tools/CMakeLists.txtnew file+11

This diff is too big to show here.

tools/registry-tracker.cppnew file+116

This diff is too big to show here.

tools/registry-tracker.hnew file+44

This diff is too big to show here.

tools/scopetool.cppnew file+84

This diff is too big to show here.

unity8.qmlprojectdeleted−25

This diff is too big to show here.