on xenial help sign in
689 files changed+38496−78567
since splitsnapshots
unifiedsplit
.bazaar/Makefile−6 .bazaar/plugins/makecheck_unity_phablet.py−51 .bzr-builddeb/default.conf−2 .bzrignore−7 .gitignore+7 CMakeLists.txt+1−3 Jenkinsfile+2−68 README.md+31 clickable.yaml+153 cmake/modules/QmlTest.cmake+1−1 data/CMakeLists.txt+1−9 data/com.canonical.Unity.gschema.xml+255 data/com.canonical.Unity8.gschema.xml+2−7 data/unity8-dash.desktop.in−8 data/unity8-dash.png data/unity8-dash.service−15 data/unity8-dash.svg−326 data/unity8-dash.url-dispatcher−6 data/unity8-filewatcher.conf+13 data/unity8-greeter-wrapper+23−7 data/unity8-session−81 data/unity8.conf+99 data/unity8.service−14 debian/changelog+7−1 debian/control+215−203 debian/rules+20−6 debian/tests/control+5−3 debian/unity-scope-tool.install−2 debian/unity8-common.install−2 debian/unity8-greeter.install+1−1 debian/unity8-private.install+1−3 debian/unity8-schemas.install+1 debian/unity8-tests.install−1 debian/unity8.install+6−11 debian/usr.bin.unity8-dash−21 plugins/AccountsService/AccountsService.cpp+1−30 plugins/AccountsService/AccountsService.h−16 plugins/AccountsService/com.canonical.unity.AccountsService.xml+6 plugins/CMakeLists.txt−2 plugins/Dash/AudioProgressBar.qml−54 plugins/Dash/CMakeLists.txt−46 plugins/Dash/CardAttributes.qml−71 plugins/Dash/CardAudioProgress.qml−59 plugins/Dash/CardCreator.js−999 plugins/Dash/CardCreatorCache.qml−40 plugins/Dash/CardSocialActions.qml−94 plugins/Dash/CroppedImageMinimumSourceSize.qml−38 plugins/Dash/DashAudioPlayer.qml−120 plugins/Dash/ScopeStyle.qml−102 plugins/Dash/abstractdashview.cpp−359 plugins/Dash/abstractdashview.h−128 plugins/Dash/graphics/music_progress_bg.png plugins/Dash/horizontaljournal.cpp−239 plugins/Dash/horizontaljournal.h−63 plugins/Dash/listviewwithpageheader.cpp−1396 plugins/Dash/listviewwithpageheader.h−218 plugins/Dash/organicgrid.cpp−259 plugins/Dash/organicgrid.h−91 plugins/Dash/plugin.cpp−70 plugins/Dash/plugin.h−33 plugins/Dash/qmldir−11 plugins/Dash/verticaljournal.cpp−281 plugins/Dash/verticaljournal.h−103 plugins/GlobalShortcut/globalshortcut.cpp+3 plugins/ImageCache/CMakeLists.txt−8 plugins/ImageCache/ImageCache.cpp−135 plugins/ImageCache/ImageCache.h−53 plugins/ImageCache/plugin.cpp−39 plugins/ImageCache/plugin.h−31 plugins/ImageCache/qmldir−2 plugins/LightDM/DBusGreeterList.cpp+3−3 plugins/LightDM/DBusGreeterList.h+1−1 plugins/LightDM/Greeter.cpp+16 plugins/LightDM/Greeter.h+3 plugins/LightDM/GreeterPrivate.h+1 plugins/Lights/CMakeLists.txt+5−1 plugins/Lights/HfdLights.cpp+62 tests/mocks/Unity/fake_unity_plugin.h → plugins/Lights/HfdLights.h+17−9 plugins/Lights/LegacyLights.cpp+91 tests/mocks/Unity/DashCommunicator/plugin.h → plugins/Lights/LegacyLights.h+19−8 plugins/Lights/Lights.cpp−65 plugins/Lights/Lights.h+4−8 plugins/Lights/plugin.cpp+20−1 plugins/Ubuntu/Gestures/TouchGestureArea.cpp+6 plugins/Unity/CMakeLists.txt−1 plugins/Unity/DashCommunicator/CMakeLists.txt−25 plugins/Unity/DashCommunicator/dashcommunicator.cpp−58 plugins/Unity/DashCommunicator/dashcommunicator.h−45 plugins/Unity/DashCommunicator/dashcommunicatorservice.cpp−30 plugins/Unity/DashCommunicator/dashcommunicatorservice.h−38 plugins/Unity/DashCommunicator/dashconnection.cpp−66 plugins/Unity/DashCommunicator/dashconnection.h−37 plugins/Unity/DashCommunicator/dbusdashcommunicatorservice.cpp−35 plugins/Unity/DashCommunicator/dbusdashcommunicatorservice.h−39 plugins/Unity/DashCommunicator/plugin.cpp−32 plugins/Unity/DashCommunicator/plugin.h−34 plugins/Unity/DashCommunicator/qmldir−3 plugins/Unity/Indicators/indicatorsmodel.cpp+13 plugins/Unity/Indicators/indicatorsmodel.h+9 plugins/Unity/Launcher/CMakeLists.txt+2−1 plugins/Unity/Launcher/appdrawermodel.cpp+88−19 plugins/Unity/Launcher/appdrawermodel.h+25−2 plugins/Unity/Launcher/dbusinterface.cpp−2 plugins/Unity/Launcher/launcheritem.cpp−1 plugins/Unity/Launcher/launchermodel.cpp−5 plugins/Unity/Launcher/ualwrapper.cpp+1−10 plugins/Unity/Launcher/ualwrapper.h−5 plugins/Unity/Launcher/xdgwatcher.cpp+129 plugins/Unity/Launcher/xdgwatcher.h+46 plugins/Unity/Session/dbusunitysessionservice.cpp+11−5 plugins/Utils/CMakeLists.txt−2 plugins/Utils/appdrawerproxymodel.cpp+1−1 plugins/Utils/deviceconfigparser.cpp+18 plugins/Utils/deviceconfigparser.h+3 plugins/Utils/windowstatestorage.cpp+293−131 plugins/Utils/windowstatestorage.h+14−17 plugins/WindowManager/CMakeLists.txt+1 plugins/WindowManager/InputMethodManager.cpp+56 plugins/WindowManager/InputMethodManager.h+55 plugins/WindowManager/TopLevelWindowModel.cpp+103−42 plugins/WindowManager/TopLevelWindowModel.h+50−8 plugins/WindowManager/Window.cpp+9 plugins/WindowManager/WindowManagerPlugin.cpp+9 plugins/Wizard/CMakeLists.txt+1 plugins/Wizard/Changelog.cpp+58 plugins/Wizard/Changelog.h+52 plugins/Wizard/PageList.cpp+6−5 plugins/Wizard/System.cpp+69−7 plugins/Wizard/System.h+17 plugins/Wizard/plugin.cpp+2 plugins/Wizard/test.sh−18 plugins/Wizard/timezonemodel.h+1−1 po/aa.po+154−257 po/am.po+368−334 po/ar.po+405−431 po/ast.po+469−453 po/az.po+161−260 po/be.po+374−433 po/bg.po+138−255 po/bn.po+350−420 po/br.po+327−349 po/bs.po+211−277 po/ca.po+397−358 po/ca@valencia.po+195−282 po/ce.po+112−238 po/ckb.po+132−252 po/co.po+286−279 po/cs.po+469−435 po/cy.po+211−276 po/da.po+294−358 po/de.po+404−364 po/el.po+379−420 po/en_AU.po+454−362 po/en_GB.po+362−343 po/en_US.po+814 po/eo.po+176−264 po/es.po+403−366 po/et.po+110−236 po/eu.po+216−285 po/fa.po+422−358 po/fi.po+381−341 po/fo.po+187−261 po/fr.po+442−403 po/ga.po+204−275 po/gd.po+372−353 po/gl.po+401−361 po/gu.po+814 po/gv.po+152−252 po/he.po+345−414 po/hi.po+126−248 po/hr.po+361−370 po/hu.po+416−380 po/hy.po+250−355 po/ia.po+362−341 po/id.po+202−288 po/is.po+173−275 po/it.po+410−372 po/ja.po+253−338 po/kk.po+841 po/km.po+212−283 po/kn.po+120−248 po/ko.po+358−408 po/ku.po+187−285 po/ky.po+120−248 po/lo.po+119−245 po/lt.po+404−364 po/lv.po+224−292 po/ml.po+133−254 po/mr.po+135−243 po/ms.po+372−399 po/my.po+170−253 po/nb.po+388−350 po/ne.po+115−238 po/nl.po+477−440 po/nn.po+112−238 po/oc.po+314−316 po/or.po+112−238 po/pa.po+220−288 po/pl.po+420−381 po/pt.po+400−362 po/pt_BR.po+339−393 po/ro.po+226−296 po/ru.po+408−359 po/sc.po+904 po/shn.po+112−238 po/si.po+139−258 po/sk.po+403−362 po/sl.po+351−335 po/sq.po+205−265 po/sr.po+363−344 po/sv.po+387−349 po/sw.po+189−269 po/ta.po+147−270 po/te.po+140−252 po/th.po+140−267 po/tr.po+420−349 po/ug.po+267−299 po/uk.po+372−356 po/unity8.pot+108−235 po/ur.po+141−264 po/uz.po+112−238 po/vi.po+112−238 po/wo.po+220−289 po/xh.po+112−238 po/zh_CN.po+397−334 po/zh_HK.po+149−253 po/zh_TW.po+400−381 qml/ApplicationMenus/ApplicationMenuItemFactory.qml+7−7 qml/ApplicationMenus/MenuItem.qml+3−3 qml/ApplicationMenus/RegisteredApplicationMenuModel.qml+1−1 qml/CMakeLists.txt−1 qml/Components/Background.qml+1−1 qml/Components/BaseCarouselDelegate.qml−42 qml/Components/Carousel.qml−335 qml/Components/Dialogs.qml+44−20 qml/Panel/Handle.qml → qml/Components/Handle.qml+1 qml/Components/InputMethod.qml+2−1 qml/Components/ItemGrabber.qml+1−1 qml/Components/KeyboardShortcutsOverlay.qml+2−26 qml/Components/Lockscreen.qml+2 qml/Components/PhysicalKeysMapper.qml+4−4 qml/Components/ResponsiveGridView.qml−98 qml/Components/ResponsiveVerticalJournal.qml−81 qml/Components/ShellDialog.qml+7−10 qml/Components/Showable.qml+15−12 qml/Components/Wallpaper.qml+68−16 qml/Components/WallpaperResolver.qml+17−6 qml/Dash/CardCarousel.qml−74 qml/Dash/CardGrid.qml−83 qml/Dash/CardHorizontalList.qml−66 qml/Dash/CardTool.qml−274 qml/Dash/CardVerticalJournal.qml−85 qml/Dash/Dash.qml−381 qml/Dash/DashApplication.qml−39 qml/Dash/DashBackground.qml−36 qml/Dash/DashCategoryBase.qml−54 qml/Dash/DashContent.qml−211 qml/Dash/DashContentTabBarStyle.qml−24 qml/Dash/DashNavigation.qml−199 qml/Dash/DashNavigationHeader.qml−73 qml/Dash/DashNavigationList.qml−118 qml/Dash/DashPageHeader.qml−448 qml/Dash/DashRenderer.qml−66 qml/Dash/DashSectionHeader.qml−64 qml/Dash/Filters/FilterExpandableWidget.qml−97 qml/Dash/Filters/FilterOptionSelector.qml−97 qml/Dash/Filters/FilterRangeInput.qml−136 qml/Dash/Filters/FilterValueSlider.qml−87 qml/Dash/Filters/FilterWidgetFactory.qml−89 qml/Dash/FiltersPopover.qml−106 qml/Dash/GenericScopeView.qml−797 qml/Dash/PageHeaderExtraPanel.qml−201 qml/Dash/PreviewView.qml−76 qml/Dash/Previews/Preview.qml−145 qml/Dash/Previews/PreviewActionButton.qml−27 qml/Dash/Previews/PreviewActionCombo.qml−79 qml/Dash/Previews/PreviewActions.qml−73 qml/Dash/Previews/PreviewAudioPlayback.qml−152 qml/Dash/Previews/PreviewComment.qml−86 qml/Dash/Previews/PreviewCommentInput.qml−88 qml/Dash/Previews/PreviewExpandable.qml−104 qml/Dash/Previews/PreviewHeader.qml−170 qml/Dash/Previews/PreviewIconActions.qml−88 qml/Dash/Previews/PreviewImageGallery.qml−150 qml/Dash/Previews/PreviewInlineVideo.qml−112 qml/Dash/Previews/PreviewMediaToolbar.qml−57 qml/Dash/Previews/PreviewOverlay.qml−166 qml/Dash/Previews/PreviewProgress.qml−74 qml/Dash/Previews/PreviewRatingDisplay.qml−117 qml/Dash/Previews/PreviewRatingEdit.qml−83 qml/Dash/Previews/PreviewRatingInput.qml−207 qml/Dash/Previews/PreviewRatingSingleDisplay.qml−73 qml/Dash/Previews/PreviewSingleton/qmldir−1 qml/Dash/Previews/PreviewTable.qml−91 qml/Dash/Previews/PreviewTextSummary.qml−78 qml/Dash/Previews/PreviewVideoPlayback.qml−87 qml/Dash/Previews/PreviewWidget.qml−60 qml/Dash/Previews/PreviewWidgetFactory.qml−101 qml/Dash/Previews/PreviewZoomableImage.qml−103 qml/Dash/ScopeListView.qml−28 qml/Dash/ScopeSettings/ScopeSetting.qml−46 qml/Dash/ScopeSettings/ScopeSettingBoolean.qml−63 qml/Dash/ScopeSettings/ScopeSettingList.qml−50 qml/Dash/ScopeSettings/ScopeSettingNumber.qml−21 qml/Dash/ScopeSettings/ScopeSettingString.qml−89 qml/Dash/ScopeSettings/ScopeSettingsWidgetFactory.qml−61 qml/Dash/ScopeSettingsPage.qml−72 qml/Dash/ScopesList.qml−206 qml/Dash/ScopesListCategory.qml−184 qml/Dash/ScopesListCategoryItem.qml−115 qml/Dash/graphics/dark_background.jpg qml/Dash/graphics/header_handlearrow2@27.png qml/Dash/graphics/header_handlearrow@27.png qml/Dash/graphics/icon_clear@20.png qml/Dash/graphics/icon_search_active@20.png qml/Dash/graphics/icon_search_inactive@20.png qml/Dash/graphics/overview_hint@30.png qml/Dash/graphics/pixel.png qml/Dash/graphics/play_button@18.png qml/Dash/graphics/play_button_active@18.png qml/Dash/graphics/play_button_active_big@20.png qml/Dash/graphics/play_button_big@20.png qml/Dash/graphics/rectangular_dropshadow@30.png qml/Dash/graphics/rectangular_dropshadow@30.sci−5 qml/Dash/graphics/tabbarchevron@27.png qml/Dash/graphics/tablet/icon_close_preview@20.png qml/Dash/graphics/tooltip_arrow@27.png qml/DeviceConfiguration.qml+12 qml/Greeter/ButtonPrompt.qml+51 qml/Greeter/CoverPage.qml+32−11 qml/Greeter/Greeter.qml+50−4 qml/Greeter/GreeterPrompt.qml+64−185 qml/Greeter/GreeterView.qml+534 qml/Greeter/LoginAreaContainer.qml+3−3 qml/Greeter/LoginList.qml+72−83 qml/Greeter/NarrowView.qml−263 qml/Greeter/PinPrompt.qml+184 qml/Greeter/PromptList.qml+21−18 qml/Greeter/SessionsList.qml+3−2 qml/Greeter/ShimGreeter.qml+2 qml/Greeter/TextPrompt.qml+198 qml/Greeter/WideView.qml−207 qml/Launcher/Drawer.qml+222−247 qml/Launcher/DrawerGridView.qml+41−5 qml/Launcher/DrawerListView.qml−38 qml/Launcher/Launcher.qml+70−45 qml/Launcher/LauncherDelegate.qml+1−3 qml/Launcher/LauncherPanel.qml+15−11 qml/Launcher/MoreAppsHeader.qml−69 qml/Dash/PullToRefreshScopeStyle.qml → qml/Launcher/PullToRefreshScopeStyle.qml qml/Notifications/Notification.qml+8−3 qml/Notifications/NotificationButton.qml+2−1 qml/Notifications/SwipeToAct.qml+4 qml/OrientedShell.qml+11−1 qml/Panel/ActiveCallHint.qml+3 qml/Panel/Indicators/IndicatorItem.qml+14−2 qml/Panel/Indicators/IndicatorMenuItemFactory.qml+3−3 qml/Panel/Indicators/IndicatorsLight.qml+185−12 qml/Panel/MenuContent.qml+4−1 qml/Panel/Panel.qml+60−22 qml/Panel/PanelBar.qml+10−8 qml/Panel/PanelItemRow.qml+6−4 qml/Panel/PanelMenu.qml+15−9 qml/Panel/PanelMenuPage.qml+1−1 qml/Rotation/RotationStates.qml−3 qml/ScopeTool.qml−165 qml/Shell.qml+119−65 qml/Stage/AbstractStage.qml−93 qml/Stage/ApplicationWindow.qml+15−4 qml/Stage/DesktopSpread.qml−576 qml/Stage/DesktopSpreadDelegate.qml−126 qml/Stage/MoveHandler.qml+7−7 qml/Stage/PhoneStage.qml−806 qml/Stage/SideStage.qml+10−6 qml/Stage/Splash.qml+4−4 qml/Stage/SpreadDelegate.qml−424 qml/Stage/SpreadMaths.qml−164 qml/Stage/Stage.qml+152−33 qml/Stage/StageMaths.qml+5−2 qml/Stage/TabletStage.qml−1201 qml/Stage/TransformedSpreadDelegate.qml−391 qml/Stage/TransformedTabletSpreadDelegate.qml−437 qml/Stage/WindowDecoration.qml+5−6 qml/Stage/WindowedFullscreenPolicy.qml+1−1 qml/Tutorial/Tutorial.qml+1 qml/Tutorial/TutorialContent.qml+61−42 qml/Tutorial/TutorialLeft.qml+1−1 qml/Tutorial/TutorialLeftLong.qml+1−1 qml/Tutorial/TutorialRight.qml+2−3 qml/Tutorial/TutorialTop.qml+2−2 qml/Wizard/Components/InputMethod.qml+9−9 qml/Wizard/Page.qml+15 qml/Wizard/Pages.qml+90−16 qml/Wizard/Pages/10-welcome-update.qml+137 qml/Wizard/Pages/10-welcome.qml+3 qml/Wizard/Pages/11-changelog.qml+95 qml/Wizard/Pages/30-wifi.qml+13−6 qml/Wizard/Pages/40-location.qml−290 qml/Wizard/Pages/50-timezone.qml+11−12 qml/Wizard/Pages/60-account.qml+12−10 qml/Wizard/Pages/70-passwd-type.qml+1 qml/Wizard/Pages/75-report-check.qml−91 qml/Wizard/Pages/78-firmware-update.qml.disabled+246 qml/Wizard/Pages/79-system-update.qml+148 qml/Wizard/Pages/80-finished.qml+4−2 qml/Wizard/Pages/here-terms.qml−126 qml/Wizard/Pages/passcode-desktop.qml+14−5 qml/Wizard/Pages/password-set.qml+12−4 qml/Wizard/Wizard.qml+5−2 src/ApplicationArguments.h+5 src/CMakeLists.txt−2 src/Dash/CMakeLists.txt−30 src/Dash/main.cpp−146 src/ShellApplication.cpp+14−4 src/ShellApplication.h+1−3 src/main.cpp+9−1 tests/CMakeLists.txt+9−2 tests/autopilot/unity8/dash.py−247 tests/autopilot/unity8/shell/fixture_setup.py+1−27 tests/autopilot/unity8/shell/tests/test_helpers.py−74 tests/autopilot/unity8/shell/tests/test_rotation.py+3−3 tests/copyright/check_copyright.sh+2 tests/data/unity/backgrounds/20x30.png tests/data/unity/backgrounds/black.png tests/mocks/AccountsService/AccountsService.cpp−36 tests/mocks/AccountsService/AccountsService.h−20 tests/mocks/GSettings.1.0/fake_gsettings.cpp+19−35 tests/mocks/GSettings.1.0/fake_gsettings.h+8−15 tests/mocks/Ubuntu/Connectivity/networking-status.cpp+7−1 tests/mocks/Ubuntu/Connectivity/networking-status.h+5−3 tests/mocks/Ubuntu/SystemSettings/CMakeLists.txt+1 tests/mocks/Ubuntu/SystemSettings/Update/CMakeLists.txt+1 qml/Dash/Previews/PreviewSingleton/PreviewSingleton.qml → tests/mocks/Ubuntu/SystemSettings/Update/MockSystemImage.qml+13−5 tests/mocks/Ubuntu/SystemSettings/Update/qmldir+2 tests/mocks/Unity/Application/ApplicationInfo.cpp+7−4 tests/mocks/Unity/Application/ApplicationInfo.h+2−6 tests/mocks/Unity/Application/ApplicationManager.cpp+14−1 tests/mocks/Unity/Application/MirSurface.h+1 tests/mocks/Unity/ApplicationMenu/mockapplicationmenuregistry.cpp+2−2 tests/mocks/Unity/ApplicationMenu/mockapplicationmenuregistry.h+1−1 tests/mocks/Unity/CMakeLists.txt−72 tests/mocks/Unity/DashCommunicator/CMakeLists.txt−18 tests/mocks/Unity/DashCommunicator/dashcommunicator.cpp−42 tests/mocks/Unity/DashCommunicator/dashcommunicator.h−39 tests/mocks/Unity/DashCommunicator/dashcommunicatorservice.cpp−46 tests/mocks/Unity/DashCommunicator/dashcommunicatorservice.h−41 tests/mocks/Unity/DashCommunicator/plugin.cpp−31 tests/mocks/Unity/DashCommunicator/qmldir−3 tests/mocks/Unity/Indicators/IndicatorsModel.qml+30−12 tests/mocks/Unity/Indicators/fakeindicatorsmodeldata.js+6−5 tests/mocks/Unity/Launcher/MockAppDrawerModel.cpp+26−2 tests/mocks/Unity/Launcher/MockAppDrawerModel.h+11 tests/mocks/Unity/Launcher/MockLauncherModel.cpp+1−1 tests/mocks/Unity/fake_categories.cpp−165 tests/mocks/Unity/fake_categories.h−54 tests/mocks/Unity/fake_expandablefilterwidget.cpp−53 tests/mocks/Unity/fake_expandablefilterwidget.h−48 tests/mocks/Unity/fake_filters.cpp−136 tests/mocks/Unity/fake_filters.h−46 tests/mocks/Unity/fake_navigation.cpp−123 tests/mocks/Unity/fake_navigation.h−61 tests/mocks/Unity/fake_optionselectorfilter.cpp−70 tests/mocks/Unity/fake_optionselectorfilter.h−54 tests/mocks/Unity/fake_optionselectoroptions.cpp−90 tests/mocks/Unity/fake_optionselectoroptions.h−49 tests/mocks/Unity/fake_previewmodel.cpp−103 tests/mocks/Unity/fake_previewmodel.h−58 tests/mocks/Unity/fake_previewwidgetmodel.cpp−97 tests/mocks/Unity/fake_previewwidgetmodel.h−47 tests/mocks/Unity/fake_rangeinputfilter.cpp−167 tests/mocks/Unity/fake_rangeinputfilter.h−79 tests/mocks/Unity/fake_resultsmodel.cpp−92 tests/mocks/Unity/fake_resultsmodel.h−52 tests/mocks/Unity/fake_scope.cpp−372 tests/mocks/Unity/fake_scope.h−128 tests/mocks/Unity/fake_scopes.cpp−286 tests/mocks/Unity/fake_scopes.h−83 tests/mocks/Unity/fake_scopesoverview.cpp−340 tests/mocks/Unity/fake_scopesoverview.h−119 tests/mocks/Unity/fake_settingsmodel.cpp−95 tests/mocks/Unity/fake_settingsmodel.h−54 tests/mocks/Unity/fake_unity_plugin.cpp−62 tests/mocks/Unity/fake_valuesliderfilter.cpp−84 tests/mocks/Unity/fake_valuesliderfilter.h−55 tests/mocks/Unity/fake_valueslidervalues.cpp−51 tests/mocks/Unity/qmldir−3 tests/mocks/Wizard/CMakeLists.txt+1 tests/mocks/Wizard/MockSystem.cpp+19−4 tests/mocks/Wizard/MockSystem.h+11−1 tests/mocks/Wizard/mockplugin.cpp+2 tests/plugins/AccountsService/PropertiesServer.cpp+1−1 tests/plugins/AccountsService/client.cpp+6−34 tests/plugins/CMakeLists.txt+2−4 tests/plugins/Dash/CMakeLists.txt−100 tests/plugins/Dash/cardcreator/1.res−82 tests/plugins/Dash/cardcreator/1.res.cardcreator−69 tests/plugins/Dash/cardcreator/1.tst−4 tests/plugins/Dash/cardcreator/10.res−129 tests/plugins/Dash/cardcreator/10.res.cardcreator−127 tests/plugins/Dash/cardcreator/10.tst−4 tests/plugins/Dash/cardcreator/11.res−176 tests/plugins/Dash/cardcreator/11.res.cardcreator−160 tests/plugins/Dash/cardcreator/11.tst−4 tests/plugins/Dash/cardcreator/12.res−108 tests/plugins/Dash/cardcreator/12.res.cardcreator−95 tests/plugins/Dash/cardcreator/12.tst−4 tests/plugins/Dash/cardcreator/2.res−128 tests/plugins/Dash/cardcreator/2.res.cardcreator−126 tests/plugins/Dash/cardcreator/2.tst−4 tests/plugins/Dash/cardcreator/3.res−90 tests/plugins/Dash/cardcreator/3.res.cardcreator−86 tests/plugins/Dash/cardcreator/3.tst−4 tests/plugins/Dash/cardcreator/4.res−111 tests/plugins/Dash/cardcreator/4.res.cardcreator−99 tests/plugins/Dash/cardcreator/4.tst−4 tests/plugins/Dash/cardcreator/5.res−102 tests/plugins/Dash/cardcreator/5.res.cardcreator−99 tests/plugins/Dash/cardcreator/5.tst−4 tests/plugins/Dash/cardcreator/6.res−127 tests/plugins/Dash/cardcreator/6.res.cardcreator−116 tests/plugins/Dash/cardcreator/6.tst−4 tests/plugins/Dash/cardcreator/7.res−141 tests/plugins/Dash/cardcreator/7.res.cardcreator−139 tests/plugins/Dash/cardcreator/7.tst−4 tests/plugins/Dash/cardcreator/8.res−109 tests/plugins/Dash/cardcreator/8.res.cardcreator−97 tests/plugins/Dash/cardcreator/8.tst−4 tests/plugins/Dash/cardcreator/9.res−120 tests/plugins/Dash/cardcreator/9.res.cardcreator−109 tests/plugins/Dash/cardcreator/9.tst−4 tests/plugins/Dash/cardcreatortest.cpp−126 tests/plugins/Dash/cardcreatortest.qml−29 tests/plugins/Dash/horizontaljournaltest.cpp−490 tests/plugins/Dash/horizontaljournaltest.qml−44 tests/plugins/Dash/horizontaljournaltry.cpp−91 tests/plugins/Dash/horizontaljournaltry.qml−120 tests/plugins/Dash/listviewwithpageheadersectionexternalmodeltest.cpp−246 tests/plugins/Dash/listviewwithpageheadersectiontest.cpp−2212 tests/plugins/Dash/listviewwithpageheadertest.cpp−2038 tests/plugins/Dash/listviewwithpageheadertest.qml−96 tests/plugins/Dash/listviewwithpageheadertestsection.qml−119 tests/plugins/Dash/listviewwithpageheadertestsectionexternalmodel.qml−76 tests/plugins/Dash/organicgridtest.cpp−533 tests/plugins/Dash/organicgridtest.qml−44 tests/plugins/Dash/organicgridtry.cpp−99 tests/plugins/Dash/organicgridtry.qml−114 tests/plugins/Dash/tst_CardAttributes.qml−57 tests/plugins/Dash/tst_CroppedImageMinimumSourceSize.qml−56 tests/plugins/Dash/tst_ListViewWithPageHeaderQML.qml−140 tests/plugins/Dash/tst_ScopeStyle.qml−188 tests/plugins/Dash/verticaljournaltest.cpp−564 tests/plugins/Dash/verticaljournaltest.qml−45 tests/plugins/Dash/verticaljournaltry.cpp−91 tests/plugins/Dash/verticaljournaltry.qml−121 tests/plugins/ImageCache/CMakeLists.txt−30 tests/plugins/ImageCache/graphics/wide.jpg tests/plugins/ImageCache/test.cpp−216 tests/plugins/ImageCache/test.qml−23 tests/plugins/LightDM/IntegratedLightDM/dbus.cpp+18−5 tests/plugins/LightDM/IntegratedLightDM/sessionsmodel.cpp+4 tests/plugins/Ubuntu/Gestures/tst_TouchGate.cpp+1−1 tests/plugins/Ubuntu/Gestures/tst_TouchGestureArea.cpp+30 tests/plugins/Unity/Launcher/CMakeLists.txt+2−1 tests/plugins/Unity/Launcher/appdrawermodeltest.cpp+15 tests/plugins/Unity/Launcher/launchermodeltest.cpp+1 tests/plugins/Unity/Launcher/ualwrapper.cpp−2 qml/Dash/Filters/FilterWidget.qml → tests/plugins/Unity/Launcher/xdgwatcher.cpp+24−11 tests/mocks/Unity/fake_valueslidervalues.h → tests/plugins/Unity/Launcher/xdgwatcher.h+16−13 tests/plugins/Unity/Session/CMakeLists.txt−1 tests/plugins/Unity/Session/LogindServer.cpp+5 tests/plugins/Unity/Session/LogindServer.h+1 tests/plugins/Unity/Session/interfaces.xml+4 tests/plugins/Unity/Session/server.cpp+1−1 tests/plugins/Unity/Session/sessionbackendtest.cpp+3−5 tests/plugins/Utils/DeviceConfigParserTest.cpp+3 tests/plugins/Utils/ModelTest.cpp+2−1 tests/plugins/Utils/WindowStateStorageTest.cpp+49−1 tests/plugins/WindowManager/UnityApplicationMocks.h+1 tests/plugins/WindowManager/tst_TopLevelWindowModel.cpp+63 tests/qmltests/ApplicationMenuDataLoader.qml+1−1 tests/qmltests/ApplicationMenus/tst_MenuBar.qml+46−18 tests/qmltests/ApplicationMenus/tst_MenuPopup.qml+10−9 tests/qmltests/CMakeLists.txt+4−50 tests/qmltests/Components/tst_Carousel.qml−292 tests/qmltests/Components/tst_Dialogs.qml−1 tests/qmltests/Components/tst_DraggingArea.qml+6−6 tests/qmltests/Components/tst_Lockscreen.qml+11−9 tests/qmltests/Components/tst_MediaServices.qml+5−4 tests/qmltests/Components/tst_PhysicalKeysMapper.qml+7−6 tests/qmltests/Components/tst_Rating.qml+1−1 tests/qmltests/Components/tst_ResponsiveGridView.qml−157 tests/qmltests/Components/tst_ResponsiveVerticalJournal.qml−183 tests/qmltests/Components/tst_SharingPicker.qml+3−3 tests/qmltests/Components/tst_Showable.qml+13 tests/qmltests/Components/tst_Wallpaper.qml+118 tests/qmltests/Components/tst_WallpaperResolver.qml+104−18 tests/qmltests/Dash/CardHelpers.js−115 tests/qmltests/Dash/Filters/tst_FilterExpandableWidget.qml−99 tests/qmltests/Dash/Filters/tst_FilterOptionSelector.qml−96 tests/qmltests/Dash/Filters/tst_FilterRangeInput.qml−247 tests/qmltests/Dash/Filters/tst_FilterValueSlider.qml−101 tests/qmltests/Dash/Filters/tst_FilterWidgetFactory.qml−59 tests/qmltests/Dash/Previews/MockPreviewWidget.qml−27 tests/qmltests/Dash/Previews/tst_Preview.qml−214 tests/qmltests/Dash/Previews/tst_PreviewActions.qml−262 tests/qmltests/Dash/Previews/tst_PreviewAudioPlayback.qml−182 tests/qmltests/Dash/Previews/tst_PreviewComment.qml−84 tests/qmltests/Dash/Previews/tst_PreviewCommentInput.qml−113 tests/qmltests/Dash/Previews/tst_PreviewExpandable.qml−353 tests/qmltests/Dash/Previews/tst_PreviewHeader.qml−183 tests/qmltests/Dash/Previews/tst_PreviewIconActions.qml−136 tests/qmltests/Dash/Previews/tst_PreviewImageGallery.qml−147 tests/qmltests/Dash/Previews/tst_PreviewInlineVideo.qml−155 tests/qmltests/Dash/Previews/tst_PreviewMediaToolbar.qml−69 tests/qmltests/Dash/Previews/tst_PreviewProgress.qml−100 tests/qmltests/Dash/Previews/tst_PreviewRatingDisplay.qml−123 tests/qmltests/Dash/Previews/tst_PreviewRatingDisplayCreationRanges.qml−131 tests/qmltests/Dash/Previews/tst_PreviewRatingEdit.qml−87 tests/qmltests/Dash/Previews/tst_PreviewRatingInput.qml−246 tests/qmltests/Dash/Previews/tst_PreviewTable.qml−147 tests/qmltests/Dash/Previews/tst_PreviewTextSummary.qml−87 tests/qmltests/Dash/Previews/tst_PreviewVideoPlayback.qml−61 tests/qmltests/Dash/Previews/tst_PreviewWidgetFactory.qml−104 tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qml−138 tests/qmltests/Dash/ScopeSettings/tst_ScopeSettingBoolean.qml−62 tests/qmltests/Dash/ScopeSettings/tst_ScopeSettingList.qml−84 tests/qmltests/Dash/ScopeSettings/tst_ScopeSettingNumber.qml−98 tests/qmltests/Dash/ScopeSettings/tst_ScopeSettingString.qml−88 tests/qmltests/Dash/ScopeSettings/tst_ScopeSettingsWidgetFactory.qml−65 tests/qmltests/Dash/artwork/avatar@12.png tests/qmltests/Dash/artwork/background.png tests/qmltests/Dash/artwork/checkers.png tests/qmltests/Dash/artwork/emblem.png tests/qmltests/Dash/artwork/music-player-design.png tests/qmltests/Dash/tst_Card.qml−682 tests/qmltests/Dash/tst_CardBenchmark.qml−95 tests/qmltests/Dash/tst_CardCarousel.qml−111 tests/qmltests/Dash/tst_CardTool.qml−379 tests/qmltests/Dash/tst_Dash.qml−648 tests/qmltests/Dash/tst_DashContent.qml−730 tests/qmltests/Dash/tst_DashPageHeader.qml−357 tests/qmltests/Dash/tst_DashShell.qml−84 tests/qmltests/Dash/tst_GenericScopeView.qml−706 tests/qmltests/Dash/tst_PageHeader/logo-ubuntu-orange.svg−60 tests/qmltests/Dash/tst_PreviewView.qml−122 tests/qmltests/Greeter/TestView.qml+9−1 tests/qmltests/Greeter/tst_Greeter.qml+19−24 tests/qmltests/Greeter/tst_GreeterView.qml+1366 tests/qmltests/Greeter/tst_NarrowView.qml−566 tests/qmltests/Greeter/tst_WideView.qml−780 tests/qmltests/Launcher/tst_Drawer.qml+193−58 tests/qmltests/Launcher/tst_Launcher.qml+155−83 tests/qmltests/Notifications/tst_Notifications.qml+16−10 tests/qmltests/Notifications/tst_OptionToggle.qml+12−6 tests/qmltests/Notifications/tst_SwipeToAct.qml+10−3 tests/qmltests/Notifications/tst_VisualSnapDecisionsQueue.qml+3−3 tests/qmltests/Panel/Indicators/tst_IndicatorMenuItemFactory.qml+33−79 tests/qmltests/Panel/Indicators/tst_IndicatorsLight.qml+168−8 tests/qmltests/Panel/PanelUI.qml+286 tests/qmltests/Panel/tst_ActiveCallHint.qml+14−9 tests/qmltests/Panel/tst_MenuContent.qml+2−2 tests/qmltests/Panel/tst_Panel.qml+58−240 tests/qmltests/Panel/tst_PanelItemRow.qml+2−2 tests/qmltests/Panel/tst_PanelMenu.qml+61−22 tests/qmltests/Panel/tst_PanelMenuPage.qml+1−1 tests/qmltests/Panel/tst_PanelSmallScreen.qml+133 tests/qmltests/Stage/ApplicationCheckBox.qml+6−6 tests/qmltests/Stage/tst_ApplicationWindow.qml+3−2 tests/qmltests/Stage/tst_DesktopStage.qml+22−4 tests/qmltests/Stage/tst_PhoneStage.qml+87−60 tests/qmltests/Stage/tst_QMLTopLevelWindowModel.qml+191 tests/qmltests/Stage/tst_SpreadDelegate.qml−423 tests/qmltests/Stage/tst_SurfaceContainer.qml+9−8 tests/qmltests/Stage/tst_TabletStage.qml+112−151 tests/qmltests/Stage/tst_WindowDecoration.qml+3−3 tests/qmltests/Stage/tst_WindowResizeArea.qml+4−3 tests/qmltests/Tutorial/tst_Tutorial.qml+187−189 tests/qmltests/Wizard/tst_Wizard.qml+100−136 tests/qmltests/tst_OrientedShell.qml+312−266 tests/qmltests/tst_Shell.qml+610−550 tests/qmltests/tst_ShellWithPin.qml+96−79 tests/utils/modules/Unity/Test/MouseTouchEmulationCheckbox.qml+1−1 tests/utils/modules/Unity/Test/StageTestCase.qml+14−18 tests/utils/modules/Unity/Test/UnityTestCase.qml+2−2 tools/CMakeLists.txt−1 tools/scopetool/CMakeLists.txt−12 tools/scopetool/registry-tracker.cpp−146 tools/scopetool/registry-tracker.h−49 tools/scopetool/scopetool.cpp−116
.bazaar/Makefiledeleted−6
@@ -1,6 +0,0 @@
1−install:
2− mkdir -p ~/.bazaar/plugins
3− cp plugins/* ~/.bazaar/plugins
4−
5−uninstall:
6− rm ~/.bazaar/plugins/makecheck_unity_phablet.py*
.bazaar/plugins/makecheck_unity_phablet.pydeleted−51
@@ -1,51 +0,0 @@
1−#!/usr/bin/python
2−# Copyright 2013, 2014 Canonical Ltd.
3−#
4−# This program is free software; you can redistribute it and/or modify
5−# it under the terms of the GNU 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−import os
17−import subprocess
18−from bzrlib import branch
19−from bzrlib.urlutils import local_path_from_url
20−
21−
22−def execute_makecheck(
23− local_branch, master_branch, old_revision_number, old_revision_id,
24− future_revision_number, future_revision_id, tree_delta, future_tree):
25− if not master_branch.basis_tree().has_filename("qml/Shell.qml"):
26− return
27−
28− os.chdir(local_path_from_url(master_branch.base))
29−
30− print "Executing 'make -C builddir test'.."
31− os.environ['CTEST_OUTPUT_ON_FAILURE'] = "1"
32− if (subprocess.call("make -C builddir test", shell=True) != 0):
33−
34− print("\n\n*** Warning ***\n\n"
35− "Basic tests failed. This commit will not pass continuous "
36− "integration.")
37−
38− branch = local_branch or master_branch
39− revision = branch.repository.get_revision(future_revision_id)
40− msg_file = open('message.txt', 'w')
41− msg_file.write(revision.message)
42− msg_file.close()
43−
44− print("\n\nSaved commit message to $SRC_DIR/message.txt.")
45− print("You can uncommit this revision, fix the tests and reuse your "
46− "message running:\n\nbzr commit -F message.txt\n\n")
47− elif os.path.isfile("message.txt"):
48− os.remove("message.txt")
49−
50−branch.Branch.hooks.install_named_hook(
51− 'pre_commit', execute_makecheck, 'make check pre-commit')
.bzr-builddeb/default.confdeleted−2
@@ -1,2 +0,0 @@
1−[BUILDDEB]
2−split = True
.bzrignoredeleted−7
@@ -1,7 +0,0 @@
1−# default build dir
2−/builddir
3−# QtCreator project files
4−/*.user
5−# Eclipse project files
6−.settings
7−message.txt
.gitignore+7
@@ -2,8 +2,15 @@
22/builddir
33# QtCreator project files
44/*.user
5+*.qmlc
6+*.jsc
57# Eclipse project files
68/.project
79/.cproject
810/.settings
911/.pydevproject
12+# KDevelop project Files
13+/.kdev4/
14+/build/
15+/*.kdev4
16+.clickable/
CMakeLists.txt+1−3
@@ -81,7 +81,7 @@ pkg_check_modules(GLIB REQUIRED glib-2.0>=2.32)
8181pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=13)
8282pkg_check_modules(QMENUMODEL REQUIRED qmenumodel)
8383pkg_check_modules(GD3 REQUIRED gnome-desktop-3.0)
84−pkg_check_modules(UAL REQUIRED ubuntu-app-launch-3)
84+pkg_check_modules(UAL REQUIRED ubuntu-app-launch-2)
8585pkg_check_modules(UBUNTUGESTURES REQUIRED UbuntuGestures)
8686pkg_check_modules(QTDBUSTEST REQUIRED
8787 libqtdbustest-1
@@ -148,8 +148,6 @@ include(autopilot)
148148declare_autopilot_test(shell unity8.shell ${CMAKE_SOURCE_DIR}/tests/autopilot/)
149149
150150set(SHELL_APP unity8)
151−set(DASH_APP unity8-dash)
152−set(SCOPE_TOOL unity-scope-tool)
153151set(INDICATORS_CLIENT_APP indicators-client)
154152set(GREETER_APP unity8-greeter)
155153set(MOCK_INDICATOR_SERVICE_APP unity-mock-indicator-service)
Jenkinsfile+2−68
@@ -1,68 +1,2 @@
1−pipeline {
2− agent any
3− stages {
4− stage('Build source') {
5− steps {
6− sh '/usr/bin/build-source.sh'
7− stash(name: 'source', includes: '*.gz,*.bz2,*.xz,*.deb,*.dsc,*.changes,*.buildinfo,lintian.txt')
8− cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
9− }
10− }
11− stage('Build binary - armhf') {
12− steps {
13− parallel(
14− "Build binary - armhf": {
15− node(label: 'arm64') {
16− cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
17− unstash 'source'
18− sh '''export architecture="armhf"
19−build-binary.sh'''
20− stash(includes: '*.gz,*.bz2,*.xz,*.deb,*.dsc,*.changes,*.buildinfo,lintian.txt', name: 'build-armhf')
21− cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
22− }
23−
24−
25− },
26− "Build binary - arm64": {
27− node(label: 'arm64') {
28− cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
29− unstash 'source'
30− sh '''export architecture="arm64"
31− # build-binary.sh'''
32− stash(includes: '*.gz,*.bz2,*.xz,*.deb,*.dsc,*.changes,*.buildinfo,lintian.txt', name: 'build-arm64')
33− cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
34− }
35− },
36− "Build binary - amd64": {
37− node(label: 'amd64') {
38− cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
39− unstash 'source'
40− sh '''export architecture="amd64"
41− export DEBBUILDOPTS=-sa
42−export SKIP_ARCH_BUILD=false
43−export SKIP_SOURCE_REMOVAL=true
44− build-binary.sh'''
45− stash(includes: '*.gz,*.bz2,*.xz,*.deb,*.dsc,*.changes,*.buildinfo,lintian.txt', name: 'build-amd64')
46− cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
47− }
48− }
49− )
50− }
51− }
52− stage('Results') {
53− steps {
54− cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
55− unstash 'build-armhf'
56− unstash 'build-arm64'
57− unstash 'build-amd64'
58− archiveArtifacts(artifacts: '*.gz,*.bz2,*.xz,*.deb,*.dsc,*.changes,*.buildinfo', fingerprint: true, onlyIfSuccessful: true)
59− sh '''/usr/bin/build-repo.sh'''
60− }
61− }
62− stage('Cleanup') {
63− steps {
64− cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
65− }
66− }
67− }
68−}
1+@Library('ubports-build-tools') _
2+buildAndProvideDebianPackage()
README.mdnew file+31
@@ -0,0 +1,31 @@
1+# Lomiri
2+
3+Lomiri is the operating environment for everywhere. It is able to span the gaps between touch, mouse, and keyboard; between phones, tablets, and workstations; and look good doing it.
4+
5+If you want to contribute to Lomiri on Ubuntu Touch, you've come to the right place. If you want to package Lomiri for other operating systems, you'll be better served by the main branch on the repository that we're migrating to: https://gitlab.com/ubports/core/lomiri
6+
7+Lomiri has been renamed from Unity8. Most of the software on-device in Ubuntu Touch based on Ubuntu 16.04 is still called `unity8`.
8+
9+## Where to report issues
10+
11+Issues related to the version of Lomiri that currently runs on Ubuntu Touch devices may still be reported on this repository. We will move these reports to the GitLab repository as part of our final migration.
12+
13+## Developing Lomiri on Ubuntu Touch
14+
15+This repository contains the code for Lomiri currently running on Ubuntu Touch. If you would like to modify this version of Lomiri, follow the steps below. If you would like to modify Lomiri in another operating system, check out our new repository: https://gitlab.com/ubports/core/lomiri
16+
17+Lomiri can be built and its test suite run using [`clickable`](https://clickable-ut.dev). This is a convenient method to try out most graphical changes to Lomiri without an annoying redeployment process. If you wish to test your changes on your device or make changes that are more difficult to test without real hardware, check out [Making changes and testing locally on the UBports documentation](https://docs.ubports.com/en/latest/systemdev/testing-locally.html). If not, read on.
18+
19+Before you start, [install Clickable](https://clickable-ut.dev/en/latest/install.html).
20+
21+Now, clone this repository to your computer: `git clone https://github.com/ubports/unity8.git`
22+
23+Move into this directory: `cd unity8`
24+
25+Now you can use the full suite of tools provided by this repository's [clickable.yaml](clickable.yaml). For example:
26+
27+* `clickable ide qtcreator` will open QtCreator with this repository open as a project. You can edit and build the project this way, but running the tests will be a bit difficult.
28+* `clickable build --libs --verbose` will build Lomiri in the same environment as it would receive in Ubuntu Touch.
29+* `clickable test --libs` will run the entire Lomiri test suite. This test suite includes graphical tests (which are run on a virtual, invisible desktop) and non-graphical unit tests. These tests make sure Lomiri functions as prescribed and prevents new bugs from being added. You should run them before you create a PR on this repository. This command takes about 7 minutes on an Intel i7-8550U, so plan your time accordingly and use the next two options to reduce the number of times you need to run the whole test suite...
30+* `clickable ide 'cd build/x86_64-linux-gnu/unity8/ && make tryShell'` and similar commands that replace the `Shell` with another test target defined in [tests/qmltests/CMakeLists.txt](tests/qmltests/CMakeLists.txt) allow trying out some Lomiri components in a mock environment. You can use this to try out your changes to Lomiri as you develop.
31+* `clickable ide 'cd build/x86_64-linux-gnu/unity8/ && make xvfbtestShell'` and similar commands that replace the `Shell` with another test target defined in [tests/qmltests/CMakeLists.txt](tests/qmltests/CMakeLists.txt) allow running a single TestCase. You can remove the `xvfb` part of the make target to run the test case graphically, which might help you see what is causing the test to fail.
clickable.yamlnew file+153
@@ -0,0 +1,153 @@
1+clickable_minimum_required: '7'
2+builder: custom
3+build: echo Run \'clickable build --libs --verbose\' to build && false
4+restrict_arch: amd64
5+libraries:
6+ unity8:
7+ builder: cmake
8+ src_dir: "${ROOT}"
9+ test: make xvfballtests -j${NUM_PROCS}
10+ dependencies_host:
11+ - android-headers
12+ - cmake
13+ - cmake-extras
14+ - dbus-test-runner
15+ - debhelper
16+ - dh-apparmor
17+ - doxyqml
18+ - g++:native
19+ - gdb
20+ - graphviz
21+ - gsettings-ubuntu-schemas
22+ - libandroid-properties-dev
23+ - libconnectivity-qt1-dev
24+ - libevdev-dev
25+ - libgeonames-dev
26+ - libgl1-mesa-dev
27+ - libgl1-mesa-dri
28+ - libgles2-mesa-dev
29+ - libglib2.0-dev
30+ - libgnome-desktop-3-12
31+ - libgnome-desktop-3-dev
32+ - libgsettings-qt-dev
33+ - libhardware-dev
34+ - liblightdm-qt5-3-dev
35+ - libpam0g-dev
36+ - libpulse-dev
37+ - libqmenumodel-dev
38+ - libqt5sql5-sqlite
39+ - libqt5svg5-dev
40+ - libqt5xmlpatterns5-dev
41+ - libqtdbusmock1-dev
42+ - libqtdbustest1-dev
43+ - libsystemsettings-dev
44+ - libubuntu-app-launch2-dev
45+ - libubuntu-download-manager-common-dev
46+ - libubuntugestures5-dev
47+ - libubuntugestures5-private-dev
48+ - libudev-dev
49+ - libudm-common-dev
50+ - libunity-api-dev
51+ - libusermetricsoutput1-dev
52+ - libx11-dev
53+ - libxcb1-dev
54+ - libxi-dev
55+ - pkg-config
56+ - python3-all:any
57+ - python3-setuptools:native
58+ - qml-module-qt-labs-folderlistmodel
59+ - qml-module-qt-labs-settings
60+ - qml-module-qtmultimedia
61+ - qml-module-qtqml-statemachine
62+ - qml-module-qtquick-layouts
63+ - qml-module-qtquick-xmllistmodel
64+ - qml-module-qtquick2
65+ - qml-module-qtsysteminfo
66+ - qml-module-qttest
67+ - qml-module-ubuntu-components
68+ - qml-module-ubuntu-layouts
69+ - qml-module-ubuntu-settings-components
70+ - qml-module-ubuntu-test
71+ - qtbase5-dev
72+ - qtbase5-dev-tools
73+ - qtbase5-private-dev
74+ - qtdbustest-runner
75+ - qtdeclarative5-dev
76+ - qtdeclarative5-dev-tools
77+ - qtdeclarative5-private-dev
78+ - qtdeclarative5-ubuntu-content1
79+ - ttf-ubuntu-font-family
80+ - ubports-wallpapers
81+ - xvfb
82+dependencies_target:
83+ - android-headers
84+ - cmake
85+ - cmake-extras
86+ - dbus-test-runner
87+ - debhelper
88+ - dh-apparmor
89+ - doxyqml
90+ - g++:native
91+ - gdb
92+ - graphviz
93+ - gsettings-ubuntu-schemas
94+ - libandroid-properties-dev
95+ - libconnectivity-qt1-dev
96+ - libevdev-dev
97+ - libgeonames-dev
98+ - libgl1-mesa-dev
99+ - libgl1-mesa-dri
100+ - libgles2-mesa-dev
101+ - libglib2.0-dev
102+ - libgnome-desktop-3-12
103+ - libgnome-desktop-3-dev
104+ - libgsettings-qt-dev
105+ - libhardware-dev
106+ - liblightdm-qt5-3-dev
107+ - libpam0g-dev
108+ - libpulse-dev
109+ - libqmenumodel-dev
110+ - libqt5sql5-sqlite
111+ - libqt5svg5-dev
112+ - libqt5xmlpatterns5-dev
113+ - libqtdbusmock1-dev
114+ - libqtdbustest1-dev
115+ - libsystemsettings-dev
116+ - libubuntu-app-launch2-dev
117+ - libubuntu-download-manager-common-dev
118+ - libubuntugestures5-dev
119+ - libubuntugestures5-private-dev
120+ - libudev-dev
121+ - libudm-common-dev
122+ - libunity-api-dev
123+ - libusermetricsoutput1-dev
124+ - libx11-dev
125+ - libxcb1-dev
126+ - libxi-dev
127+ - pkg-config
128+ - python3-all:any
129+ - python3-setuptools:native
130+ - qml-module-qt-labs-folderlistmodel
131+ - qml-module-qt-labs-settings
132+ - qml-module-qtmultimedia
133+ - qml-module-qtqml-statemachine
134+ - qml-module-qtquick-layouts
135+ - qml-module-qtquick-xmllistmodel
136+ - qml-module-qtquick2
137+ - qml-module-qtsysteminfo
138+ - qml-module-qttest
139+ - qml-module-ubuntu-components
140+ - qml-module-ubuntu-layouts
141+ - qml-module-ubuntu-settings-components
142+ - qml-module-ubuntu-test
143+ - qtbase5-dev
144+ - qtbase5-dev-tools
145+ - qtbase5-private-dev
146+ - qtdbustest-runner
147+ - qtdeclarative5-dev
148+ - qtdeclarative5-dev-tools
149+ - qtdeclarative5-private-dev
150+ - qtdeclarative5-ubuntu-content1
151+ - ttf-ubuntu-font-family
152+ - ubports-wallpapers
153+ - xvfb
cmake/modules/QmlTest.cmake+1−1
@@ -201,7 +201,7 @@ function(add_executable_test COMPONENT_NAME TARGET)
201201 add_qmltest_target(xvfbtest${COMPONENT_NAME} ${TARGET}
202202 COMMAND $<TARGET_FILE:xvfb-run> --server-args "-screen 0 1024x768x24" --auto-servernum ${qmltest_command}
203203 ${depends}
204− ENVIRONMENT QML2_IMPORT_PATH=${imports} LD_PRELOAD=/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/mesa/libGL.so.1 ${QMLTEST_ENVIRONMENT}
204+ ENVIRONMENT QT_QPA_PLATFORM=xcb QML2_IMPORT_PATH=${imports} LD_PRELOAD=/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/mesa/libGL.so.1 ${QMLTEST_ENVIRONMENT}
205205 TARGETS ${xvfb_targets}
206206 )
207207 endif()
data/CMakeLists.txt+1−9
@@ -1,13 +1,11 @@
11# generate desktop files
22configure_file(${SHELL_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop @ONLY)
3−configure_file(${DASH_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${DASH_APP}.desktop @ONLY)
43configure_file(${INDICATORS_CLIENT_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${INDICATORS_CLIENT_APP}.desktop @ONLY)
54configure_file(${GREETER_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${GREETER_APP}.desktop @ONLY)
65
76# install desktop files
87install(FILES
98 ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop
10− ${CMAKE_CURRENT_BINARY_DIR}/${DASH_APP}.desktop
119 ${CMAKE_CURRENT_BINARY_DIR}/${INDICATORS_CLIENT_APP}.desktop
1210 DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
1311 )
@@ -22,14 +20,8 @@ install(FILES
2220 DESTINATION ${CMAKE_INSTALL_DATADIR}/lightdm/lightdm.conf.d
2321 )
2422
25−# install dash icon
26−install(FILES
27− ${CMAKE_CURRENT_SOURCE_DIR}/${DASH_APP}.png
28− DESTINATION ${SHELL_APP_DIR}/Dash/
29− )
30−
3123add_custom_target(pkgversion ALL COMMAND dpkg-parsechangelog -l${CMAKE_SOURCE_DIR}/debian/changelog --show-field version > ${CMAKE_CURRENT_BINARY_DIR}/version)
3224
3325install(FILES com.canonical.Unity8.gschema.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/glib-2.0/schemas)
34−install(FILES unity8-dash.url-dispatcher DESTINATION ${CMAKE_INSTALL_DATADIR}/url-dispatcher/urls)
26+install(FILES com.canonical.Unity.gschema.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/glib-2.0/schemas)
3527install(FILES ${CMAKE_CURRENT_BINARY_DIR}/version DESTINATION ${CMAKE_INSTALL_LOCALSTATEDIR}/lib/unity8)
data/com.canonical.Unity.gschema.xmlnew file+255
@@ -0,0 +1,255 @@
1+<schemalist>
2+ <enum id="form-factor-enum">
3+ <value nick="Automatic" value="0" />
4+ <value nick="Desktop" value="1" />
5+ <value nick="Netbook" value="2" />
6+ <value nick="TV" value="3" />
7+ </enum>
8+ <enum id="home-expanded-enum">
9+ <value nick="Not Expanded" value="0" />
10+ <value nick="Expanded" value="1" />
11+ </enum>
12+ <enum id="launcher-position-enum">
13+ <value nick="Left" value="0" />
14+ <value nick="Bottom" value="1" />
15+ </enum>
16+ <enum id="desktop-type-enum">
17+ <value nick="Ubuntu" value="0" />
18+ <value nick="UbuntuKylin" value="1" />
19+ </enum>
20+
21+ <schema path="/com/canonical/unity/" id="com.canonical.Unity" gettext-domain="unity">
22+ <key enum="form-factor-enum" name="form-factor">
23+ <default>"Automatic"</default>
24+ <summary>The form factor Unity should target.</summary>
25+ <description>The form factor chosen will affect the size and appearance of the Dash, Launcher and also the Window Management behaviour.</description>
26+ </key>
27+ <key enum="home-expanded-enum" name="home-expanded">
28+ <default>"Expanded"</default>
29+ <summary>Whether the home screen should be expanded.</summary>
30+ <description>Whether the home screen should be expanded.</description>
31+ </key>
32+ <key enum="desktop-type-enum" name="desktop-type">
33+ <default>"Ubuntu"</default>
34+ <summary>The current desktop name.</summary>
35+ <description>The current desktop name.</description>
36+ </key>
37+ <key type="i" name="minimize-count">
38+ <default>0</default>
39+ <summary>Number of times a normal window has been minimized.</summary>
40+ <description>This is used to adjust the animation speed by making it progressively faster the more it is used.</description>
41+ </key>
42+ <key type="i" name="minimize-fast-duration">
43+ <default>300</default>
44+ <summary>The duration for the minimize animation when it is at its fastest setting.</summary>
45+ <description>This is the duration that the minimize animation will have when it has been used more than an number of times equal minimize-speed-threshold.</description>
46+ </key>
47+ <key type="i" name="minimize-slow-duration">
48+ <default>800</default>
49+ <summary>The duration for the minimize animation when it is at its slowest setting.</summary>
50+ <description>This is the duration that the minimize animation will have when it has never been used.</description>
51+ </key>
52+ <key type="i" name="minimize-speed-threshold">
53+ <default>100</default>
54+ <summary>The number of minimizations required to reach maximum speed.</summary>
55+ <description>The speed of the minimize animation will progressively get faster as minimize-count approaches this value.</description>
56+ </key>
57+ <key type="b" name="double-click-activate">
58+ <default>true</default>
59+ <summary>Enable/Disable dash result double-click activation.</summary>
60+ <description>This is used to enable/disable double-click result activation in the dash. Double-click to activate, single click preview</description>
61+ </key>
62+ <key type="b" name="integrated-menus">
63+ <default>false</default>
64+ <summary>Enable/Disable the integrated menus in Unity.</summary>
65+ <description>When this is enabled, the application menus will be shown
66+ on the window decoration, otherwise they will be always shown on the
67+ unity top panel</description>
68+ </key>
69+ <key type="u" name="show-menus-now-delay">
70+ <default>180</default>
71+ <range min="0" max="5000"/>
72+ <summary>Delay (in ms) before showing the menus when pressing Alt</summary>
73+ <description>This allows tune the delay before presenting unity menus
74+ (in non always-show-menus mode).</description>
75+ </key>
76+ <key type="b" name="always-show-menus">
77+ <default>false</default>
78+ <summary>Toggle the menu visibility based on mouse hovering.</summary>
79+ <description>When this is enabled, the application menus will be always
80+ shown (on the window decoration or in the unity panel, depending whether
81+ integrated menus are enabled), otherwise they will be shown only when
82+ the mouse cursor is over the relative mouse area.</description>
83+ </key>
84+ <key type="as" name="whitelist-repeated-keys">
85+ <default>[
86+ 'XF86KbdBrightnessUp',
87+ 'XF86KbdBrightnessDown',
88+ 'XF86MonBrightnessUp',
89+ 'XF86MonBrightnessDown',
90+ 'XF86AudioRaiseVolume',
91+ 'XF86AudioLowerVolume'
92+ ]</default>
93+ <summary>List of keycodes that should be processed even if auto-repated.</summary>
94+ <description>These keycodes are processed even if they are auto-repeated.</description>
95+ </key>
96+ <key type="b" name="pam-check-account-type">
97+ <default>false</default>
98+ <summary>Enable/Disable PAM account checking</summary>
99+ <description>Whether PAM should check the result of account modules
100+ when authenticating. Only do this if you have account
101+ configured properly on your system.</description>
102+ </key>
103+ <key type="b" name="lowgfx">
104+ <default>false</default>
105+ <summary>Enable/Disable Low Graphics Mode</summary>
106+ <description>Whether Unity runs in Low Graphics Mode.</description>
107+ </key>
108+ </schema>
109+ <schema path="/com/canonical/unity/interface/" id="com.canonical.Unity.Interface" gettext-domain="unity">
110+ <key type="d" name="text-scale-factor">
111+ <default>1.0</default>
112+ <range min="0.5" max="3.0"/>
113+ <summary>Font scaling for unity and applications.</summary>
114+ <description>This value defines the global font scaling used by both
115+ unity and applications. It will match the current system font scaling.</description>
116+ </key>
117+ <key type="d" name="cursor-scale-factor">
118+ <default>1.0</default>
119+ <range min="0.5" max="3.0"/>
120+ <summary>Mouse cursor scaling.</summary>
121+ <description>This value defines the global mouse cursor scaling used by both
122+ unity and applications. Changing this value allows to use a custom scaling
123+ for the mouse cursor.</description>
124+ </key>
125+ <key type="s" name="app-scale-factor-monitor">
126+ <default>''</default>
127+ <summary>The name of the monitor that controls the global app scaling factor.</summary>
128+ <description>This value defines the monitor that unity will use (if found) as reference
129+ for scaling all the applications.</description>
130+ </key>
131+ <key type="b" name="app-fallback-to-maximum-scale-factor">
132+ <default>true</default>
133+ <summary>Use the maximum per-monitor scale-factor as application scale factor if no target monitor is found.</summary>
134+ <description>When this is enabled, the applications scale factor will match
135+ the scale factor of the monitor with the greater value, in case the monitor
136+ defined in 'app-scale-factor-monitor' is not provided or available.</description>
137+ </key>
138+ </schema>
139+ <schema path="/com/canonical/unity/launcher/" id="com.canonical.Unity.Launcher" gettext-domain="unity">
140+ <key type="as" name="favorites">
141+ <default>[
142+ 'application://ubiquity.desktop',
143+ 'application://org.gnome.Nautilus.desktop',
144+ 'application://firefox.desktop',
145+ 'application://libreoffice-writer.desktop',
146+ 'application://libreoffice-calc.desktop',
147+ 'application://libreoffice-impress.desktop',
148+ 'application://org.gnome.Software.desktop',
149+ 'application://ubuntu-amazon-default.desktop',
150+ 'application://unity-control-center.desktop',
151+ 'unity://running-apps',
152+ 'unity://expo-icon',
153+ 'unity://devices'
154+ ]</default>
155+ <summary>List of items that should be shown by default in the launcher</summary>
156+ <description>These items can be: application://desktop-id.desktop, device://uiid and unity://special-id (including: unity://running-apps (icons of running applications) unity://devices (icons of attached devices), unity://expo-icon (icon of the workspace switcher) and unity://desktop-icon (the show-desktop icon)); the order of this list determines the launcher item's position.</description>
157+ </key>
158+ <key type="as" name="items">
159+ <default>[
160+ 'application:///dialer-app.desktop',
161+ 'application:///messaging-app.desktop',
162+ 'application:///address-book-app.desktop',
163+ 'application:///ubuntu-system-settings.desktop',
164+ 'appid://openstore.openstore-team/openstore/current-user-version',
165+ 'appid://com.ubuntu.camera/camera/current-user-version',
166+ 'appid://com.ubuntu.gallery/gallery/current-user-version',
167+ 'application:///morph-browser.desktop'
168+ ]</default>
169+ <summary>List of items that should be shown by default in the launcher</summary>
170+ <description>These items can be: application:///desktop-id.desktop or appid://package/app/current-user-version.</description>
171+ </key>
172+ <key type="s" name="favorite-migration">
173+ <default>''</default>
174+ <summary>Version of last migration done</summary>
175+ <description>This is a detection key for the favorite migration script to know whether the needed migration is done or not.</description>
176+ </key>
177+ <key enum="launcher-position-enum" name="launcher-position">
178+ <default>"Left"</default>
179+ <summary>The position of launcher.</summary>
180+ <description>The position of launcher.</description>
181+ </key>
182+ </schema>
183+ <schema path="/com/canonical/unity/devices/" id="com.canonical.Unity.Devices" gettext-domain="unity">
184+ <key type="as" name="blacklist">
185+ <default>[]</default>
186+ <summary>List of device uuid blacklist from the launcher.</summary>
187+ <description>These devices are not shown in the launcher by default.</description>
188+ </key>
189+ </schema>
190+ <schema path="/com/canonical/unity/dash/" id="com.canonical.Unity.Dash" gettext-domain="unity">
191+ <key type="as" name="scopes">
192+ <default>[ 'home.scope', 'applications.scope', 'files.scope', 'video.scope', 'music.scope', 'photos.scope', 'social.scope' ]</default>
193+ <summary>List of scope ids specifying which scopes should be created and the order to display them in.</summary>
194+ <description>The scopes listed in the scope bar will be ordered according to this list.</description>
195+ </key>
196+ <key type="as" name="favorite-scopes">
197+ <default>[ 'scope://clickscope', 'scope://musicaggregator', 'scope://videoaggregator' ]</default>
198+ <summary>List of scope queries specifying what should be displayed in the dash.</summary>
199+ <description>List of favorite scopes displayed in the dash.</description>
200+ </key>
201+ </schema>
202+ <schema path="/com/canonical/unity/decorations/" id="com.canonical.Unity.Decorations" gettext-domain="unity">
203+ <key type="u" name="grab-wait">
204+ <default>175</default>
205+ <range min="0" max="1000"/>
206+ <summary>Milliseconds to wait before considering a mouse pressure a grab</summary>
207+ <description>The number of ms to wait before starting the window movement (and then
208+ showing the proper mouse cursor, and grabbing the window)</description>
209+ </key>
210+ </schema>
211+ <schema path="/com/canonical/unity/integrated-menus/" id="com.canonical.Unity.IntegratedMenus" gettext-domain="unity">
212+ <key type="u" name="click-movement-threshold">
213+ <default>15</default>
214+ <range min="0" max="30"/>
215+ <summary>Number of pixels to ignore on mouse pressure</summary>
216+ <description>This value define how many pixels the user can move the mouse
217+ when holding the mouse button, before we consider his action a movement
218+ (to grab the window).</description>
219+ </key>
220+ <key type="u" name="double-click-wait">
221+ <default>0</default>
222+ <range min="0" max="300"/>
223+ <summary>Milliseconds to wait before activating a menu after mouse release</summary>
224+ <description>The number of ms to wait after a mouse button release event before considering
225+ it a click. When this value is greater than 0, then it's possible to maximize
226+ a window by double-clicking on its menus if the second click happens before the
227+ specified value of ms is elapsed</description>
228+ </key>
229+ <key type="b" name="unfocused-windows-popup">
230+ <default>true</default>
231+ <summary>Whether to pop-up a menu when clicking over unfocused windows entries</summary>
232+ <description>By disabling this setting you can make unity to only focus a window
233+ when clicking over unfocused menu entries</description>
234+ </key>
235+ </schema>
236+ <schema path="/com/canonical/unity/gestures/" id="com.canonical.Unity.Gestures" gettext-domain="unity">
237+ <key type="b" name="launcher-drag">
238+ <default>true</default>
239+ <summary>Multi-touch gesture to reveal the launcher.</summary>
240+ <description>When this is enabled, a 4 finger swipe from left to right will reveal launcher,
241+ provided that the launcher is set to auto-hide.</description>
242+ </key>
243+ <key type="b" name="dash-tap">
244+ <default>true</default>
245+ <summary>Multi-touch gesture to open the dash.</summary>
246+ <description>When this is enabled, a 4 finger tap will open the dash.</description>
247+ </key>
248+ <key type="b" name="windows-drag-pinch">
249+ <default>true</default>
250+ <summary>Multi-touch gestures to manage the windows.</summary>
251+ <description>When this is enabled, 3 finger gestures such as drag, and pinch, will
252+ help manage the windows.</description>
253+ </key>
254+ </schema>
255+</schemalist>
data/com.canonical.Unity8.gschema.xml+2−7
@@ -11,7 +11,7 @@
1111 <summary>The usage mode.</summary>
1212 <description>The usage mode chosen will affect the Window Management behaviour.</description>
1313 </key>
14− <key type="y" name="edge-barrier-sensitivity">
14+ <key type="u" name="edge-barrier-sensitivity">
1515 <default>50</default>
1616 <range min="1" max="100"/>
1717 <summary>Sensitivity of screen edge barriers for the mouse pointer.</summary>
@@ -43,18 +43,13 @@
4343 <summary>Width of the launcher in grid units.</summary>
4444 <description>Changes the width of the launcher in all usage modes.</description>
4545 </key>
46− <key type="b" name="enable-launcher">
47− <default>true</default>
48− <summary>Enable or disable the launcher</summary>
49− <description>Toggle the availability of the launcher</description>
50− </key>
5146 <key type="b" name="enable-indicator-menu">
5247 <default>true</default>
5348 <summary>Enable or disable the indicator pull down menus</summary>
5449 <description>Toggle the availability of the indicator pull down menus</description>
5550 </key>
5651 <key type="s" name="appstore-uri">
57− <default>'application:///org.gnome.Software.desktop'</default>
52+ <default>'appid://openstore.openstore-team/openstore/current-user-version'</default>
5853 <summary>The uri to the app store</summary>
5954 <description>This will be used whenever the user triggers an action to open the app store.</description>
6055 </key>
data/unity8-dash.desktop.indeleted−8
@@ -1,8 +0,0 @@
1−[Desktop Entry]
2−Type=Application
3−Name=Scopes
4−Comment=An interface for using the Scopes system
5−Exec=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@/unity8-dash
6−Terminal=false
7−Icon=@CMAKE_INSTALL_PREFIX@/@SHELL_APP_DIR@/Dash/unity8-dash.png
8−X-Ubuntu-Touch=true
data/unity8-dash.pngdeleted

Binary file not shown.

data/unity8-dash.servicedeleted−15
@@ -1,15 +0,0 @@
1−[Unit]
2−Description=Unity Shell v8 Dash
3−PartOf=graphical-session.target
4−BindsTo=unity8.service
5−After=unity8.service
6−
7−[Service]
8−ExecStart=/usr/bin/unity8-dash --desktop_file_hint=unity8-dash
9−Restart=always
10−TimeoutStartSec=120
11−Environment=APP_ID=unity8-dash
12−
13−# Focused app is 100 so we want to be less likely to get
14−# killed than the focused app but more than Unity8
15−OOMScoreAdjust=50
data/unity8-dash.svgdeleted−326
@@ -1,326 +0,0 @@
1−<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2−<!-- Created with Inkscape (http://www.inkscape.org/) -->
3−
4−<svg
5− xmlns:dc="http://purl.org/dc/elements/1.1/"
6− xmlns:cc="http://creativecommons.org/ns#"
7− xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8− xmlns:svg="http://www.w3.org/2000/svg"
9− xmlns="http://www.w3.org/2000/svg"
10− xmlns:xlink="http://www.w3.org/1999/xlink"
11− xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12− xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13− viewBox="0 0 512 512"
14− style="enable-background:new"
15− inkscape:export-ydpi="180"
16− inkscape:export-xdpi="180"
17− inkscape:export-filename="app_shape02.png"
18− sodipodi:docname="apps-scope.svg"
19− inkscape:version="0.91+devel r"
20− version="1.1"
21− id="svg3336"
22− height="512"
23− width="512">
24− <sodipodi:namedview
25− inkscape:snap-global="false"
26− fit-margin-bottom="18"
27− fit-margin-right="0"
28− fit-margin-left="0"
29− fit-margin-top="18"
30− inkscape:snap-grids="true"
31− inkscape:guide-bbox="true"
32− showguides="false"
33− inkscape:snap-center="true"
34− inkscape:snap-object-midpoints="true"
35− inkscape:snap-midpoints="true"
36− inkscape:snap-smooth-nodes="true"
37− inkscape:snap-intersection-paths="true"
38− inkscape:object-nodes="true"
39− inkscape:object-paths="true"
40− inkscape:snap-bbox-midpoints="true"
41− inkscape:snap-bbox-edge-midpoints="true"
42− inkscape:bbox-nodes="true"
43− inkscape:bbox-paths="true"
44− inkscape:snap-bbox="true"
45− showborder="true"
46− inkscape:showpageshadow="false"
47− inkscape:snap-page="true"
48− inkscape:window-maximized="1"
49− inkscape:window-y="24"
50− inkscape:window-x="0"
51− inkscape:window-height="1029"
52− inkscape:window-width="1920"
53− showgrid="false"
54− inkscape:current-layer="layer3"
55− inkscape:document-units="px"
56− inkscape:cy="204.04409"
57− inkscape:cx="-384.5809"
58− inkscape:zoom="0.64"
59− inkscape:pageshadow="2"
60− inkscape:pageopacity="0"
61− borderopacity="1.0"
62− bordercolor="#666666"
63− pagecolor="#4f4f4f"
64− id="base">
65− <inkscape:grid
66− type="xygrid"
67− id="grid811"
68− originx="0"
69− originy="15.999999"
70− visible="true"
71− enabled="true" />
72− <sodipodi:guide
73− orientation="1,0"
74− position="104,176"
75− id="guide819" />
76− <sodipodi:guide
77− orientation="1,0"
78− position="120,160"
79− id="guide821" />
80− <sodipodi:guide
81− orientation="1,0"
82− position="392,144"
83− id="guide823" />
84− <sodipodi:guide
85− orientation="1,0"
86− position="408,144"
87− id="guide825" />
88− <sodipodi:guide
89− orientation="0,1"
90− position="328,408"
91− id="guide827" />
92− <sodipodi:guide
93− orientation="0,1"
94− position="336,392"
95− id="guide829" />
96− <sodipodi:guide
97− orientation="0,1"
98− position="176,120"
99− id="guide831" />
100− <sodipodi:guide
101− orientation="0,1"
102− position="216,104"
103− id="guide833" />
104− <inkscape:grid
105− type="axonomgrid"
106− id="grid835"
107− units="px"
108− empspacing="60"
109− gridanglex="42.9"
110− gridanglez="42.9"
111− spacingy="3.522px"
112− enabled="false"
113− originx="0"
114− originy="16.999996" />
115− <sodipodi:guide
116− orientation="0,1"
117− position="344,376"
118− id="guide4126" />
119− <sodipodi:guide
120− orientation="0,1"
121− position="160,136"
122− id="guide4128" />
123− <sodipodi:guide
124− orientation="1,0"
125− position="136,96"
126− id="guide4130" />
127− <sodipodi:guide
128− orientation="1,0"
129− position="376,136"
130− id="guide4134" />
131− <sodipodi:guide
132− orientation="-0.70710678,0.70710678"
133− position="544,544"
134− id="guide4136" />
135− <sodipodi:guide
136− orientation="1,0"
137− position="256,-32.000001"
138− id="guide4138" />
139− <sodipodi:guide
140− orientation="0,1"
141− position="544,256"
142− id="guide4140" />
143− <sodipodi:guide
144− orientation="0.70710678,0.70710678"
145− position="544,-32.000001"
146− id="guide4142" />
147− <sodipodi:guide
148− orientation="0,1"
149− position="248,15.999999"
150− id="guide4152" />
151− <sodipodi:guide
152− orientation="0,1"
153− position="336,496"
154− id="guide4154" />
155− <sodipodi:guide
156− position="344,96"
157− orientation="1,0"
158− id="guide4361" />
159− <sodipodi:guide
160− position="576,168"
161− orientation="0,1"
162− id="guide4363" />
163− <sodipodi:guide
164− position="168,192"
165− orientation="1,0"
166− id="guide4229" />
167− <sodipodi:guide
168− position="312,344"
169− orientation="0,1"
170− id="guide4233" />
171− <sodipodi:guide
172− position="180.48,-96"
173− orientation="0,1"
174− id="guide4235" />
175− </sodipodi:namedview>
176− <defs
177− id="defs3338">
178− <linearGradient
179− inkscape:collect="always"
180− id="linearGradient4203">
181− <stop
182− style="stop-color:#ea5420;stop-opacity:1"
183− offset="0"
184− id="stop4205" />
185− <stop
186− style="stop-color:#f37e40;stop-opacity:1"
187− offset="1"
188− id="stop4207" />
189− </linearGradient>
190− <clipPath
191− clipPathUnits="userSpaceOnUse"
192− id="clipPath4755">
193− <path
194− style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.24899998;fill:#5e2c73;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
195− d="M 360,50 594,284 V 215.89844 C 594,70.73665 573.2426,50 427.94531,50 Z"
196− id="path4757"
197− inkscape:connector-curvature="0" />
198− </clipPath>
199− <clipPath
200− clipPathUnits="userSpaceOnUse"
201− id="clipPath4767">
202− <path
203− style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#f6f6f6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
204− d="M 543.8125,454.1875 312.18945,685.81055 367.94531,681 C 512.70468,668.50896 526.55393,654.72881 539,510.10156 Z"
205− id="path4769"
206− inkscape:connector-curvature="0" />
207− </clipPath>
208− <linearGradient
209− inkscape:collect="always"
210− xlink:href="#linearGradient4203"
211− id="linearGradient4209"
212− x1="167.5"
213− y1="17.25"
214− x2="343.25"
215− y2="491"
216− gradientUnits="userSpaceOnUse" />
217− <filter
218− inkscape:collect="always"
219− style="color-interpolation-filters:sRGB"
220− id="filter4220"
221− x="-0.012"
222− width="1.024"
223− y="-0.012"
224− height="1.024">
225− <feGaussianBlur
226− inkscape:collect="always"
227− stdDeviation="1.4390401"
228− id="feGaussianBlur4222" />
229− </filter>
230− <linearGradient
231− inkscape:collect="always"
232− xlink:href="#linearGradient4226"
233− id="linearGradient4232"
234− x1="255.99998"
235− y1="-255.99998"
236− x2="405.35773"
237− y2="-255.99998"
238− gradientUnits="userSpaceOnUse"
239− spreadMethod="reflect" />
240− <linearGradient
241− inkscape:collect="always"
242− id="linearGradient4226">
243− <stop
244− style="stop-color:#a73812;stop-opacity:1"
245− offset="0"
246− id="stop4228" />
247− <stop
248− style="stop-color:#973310;stop-opacity:0"
249− offset="1"
250− id="stop4230" />
251− </linearGradient>
252− <filter
253− inkscape:collect="always"
254− style="color-interpolation-filters:sRGB"
255− id="filter4234"
256− x="-0.096000001"
257− width="1.192"
258− y="-0.096000001"
259− height="1.192">
260− <feGaussianBlur
261− inkscape:collect="always"
262− stdDeviation="11.512321"
263− id="feGaussianBlur4236" />
264− </filter>
265− </defs>
266− <metadata
267− id="metadata3341">
268− <rdf:RDF>
269− <cc:Work
270− rdf:about="">
271− <dc:format>image/svg+xml</dc:format>
272− <dc:type
273− rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
274− <dc:title></dc:title>
275− </cc:Work>
276− </rdf:RDF>
277− </metadata>
278− <g
279− inkscape:groupmode="layer"
280− id="layer3"
281− inkscape:label="Background">
282− <path
283− style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient4209);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
284− d="M 0 0 L 0 183.89844 L 0 328.10156 L 0 512 L 512 512 L 512 328.10156 L 512 183.89844 L 512 0 L 0 0 z "
285− id="rect4158" />
286− <path
287− style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
288− d="M 0 256 L 0 328.10156 L 0 462.53516 C 0 479.69677 0.052846476 496.03174 0.13085938 512 L 511.86914 512 C 511.94715 496.03174 512 479.69677 512 462.53516 L 512 256 L 0 256 z "
289− id="rect4286" />
290− </g>
291− <g
292− inkscape:groupmode="layer"
293− id="layer1"
294− inkscape:label="Pictogram"
295− style="display:inline"
296− transform="translate(-32,-32)">
297− <circle
298− style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:#d04616;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:7.99999952;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;filter:url(#filter4220);enable-background:accumulate"
299− id="circle4218"
300− cx="258"
301− cy="-256"
302− r="143.90401"
303− transform="rotate(90,-7.1132638e-7,31.999996)" />
304− <circle
305− transform="rotate(90,-7.1132638e-7,31.999996)"
306− r="143.90401"
307− cy="-256"
308− cx="258"
309− id="circle4224"
310− style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#linearGradient4232);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:7.99999952;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;filter:url(#filter4234);enable-background:accumulate" />
311− <circle
312− transform="rotate(90)"
313− r="143.90401"
314− cy="-288"
315− cx="288"
316− id="circle4206"
317− style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:7.99999952;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
318− <path
319− style="display:inline;fill:#ea5420;fill-opacity:1;stroke-width:2.9398191;enable-background:new"
320− id="path4258"
321− d="m 193.9963,269.54024 c -10.19878,0 -18.46137,8.2634 -18.46137,18.46139 0,10.19309 8.26259,18.45568 18.46137,18.45568 10.19311,0 18.45569,-8.26259 18.45569,-18.45568 0,-10.19799 -8.26258,-18.46139 -18.45569,-18.46139 z m 131.78525,83.88906 c -8.82832,5.09898 -11.85536,16.38129 -6.75557,25.20475 5.0933,8.82834 16.37561,11.85455 25.20393,6.75556 8.82752,-5.0933 11.85457,-16.37561 6.75559,-25.20475 -5.0933,-8.82263 -16.38212,-11.84887 -25.20395,-6.75556 z m -91.69319,-65.42767 c 0,-18.24028 9.05999,-34.35498 22.92309,-44.11321 l -13.49406,-22.6012 c -16.14883,10.79461 -28.16435,27.28971 -33.15766,46.60863 5.82648,4.75434 9.55584,11.99194 9.55584,20.10497 0,8.10813 -3.72936,15.34572 -9.55584,20.10006 4.98681,19.32463 17.00232,35.82055 33.15766,46.61514 l 13.49406,-22.60689 c -13.8631,-9.75253 -22.92309,-25.86641 -22.92309,-44.1075 z m 53.91207,-53.91776 c 28.16514,0 51.27274,21.59491 53.69828,49.13495 l 26.30048,-0.38772 c -1.29405,-20.33173 -10.17604,-38.58421 -23.82372,-52.00594 -7.01814,2.65149 -15.12464,2.2459 -22.13139,-1.79314 -7.01894,-4.0504 -11.41969,-10.88319 -12.62271,-18.30044 -6.8214,-1.88254 -14.00046,-2.91323 -21.42257,-2.91323 -12.75925,0 -24.82271,2.99695 -35.53359,8.29836 l 12.82509,22.98243 c 6.89944,-3.21075 14.5963,-5.01526 22.71013,-5.01526 z m 0,107.82982 c -8.11383,0 -15.81069,-1.80533 -22.70931,-5.01528 l -12.82511,22.98163 c 10.71088,5.3079 22.77434,8.30568 35.53442,8.30568 7.42211,0 14.60118,-1.0315 21.42177,-2.91975 1.20301,-7.41724 5.60537,-14.24352 12.6227,-18.30125 7.01161,-4.04555 15.11326,-4.44382 22.13137,-1.79232 13.64769,-13.42174 22.52968,-31.67421 23.82372,-52.00595 l -26.30696,-0.38772 c -2.41986,27.54738 -25.52665,49.13496 -53.6926,49.13496 z m 37.77461,-119.35113 c 8.82834,5.09818 20.11145,2.07845 25.20475,-6.74987 5.099,-8.82833 2.07928,-20.11145 -6.74988,-25.21126 -8.82832,-5.0933 -20.11063,-2.06705 -25.21125,6.76127 -5.09247,8.82345 -2.06625,20.10657 6.75638,25.19986 z"
322− inkscape:connector-curvature="0"
323− inkscape:transform-center-x="16.232534"
324− inkscape:transform-center-y="-0.0024900663" />
325− </g>
326−</svg>
data/unity8-dash.url-dispatcherdeleted−6
@@ -1,6 +0,0 @@
1−[
2− {
3− "protocol": "scope"
4− }
5−]
6−
data/unity8-filewatcher.confnew file+13
@@ -0,0 +1,13 @@
1+description "File system watcher for unity8"
2+author "Michael Zanetti <michael.zanetti@canonical.com>"
3+
4+# This method of updating the launcher will not work in our new snappy world,
5+# neither for snaps installed in the system nor if we are running inside a snap.
6+# Plus it hardcodes the phablet user... To be replaced once bug 1630997 is
7+# fixed in ubuntu-app-launch.
8+
9+# Workaround for bug 1360208. ~ and * in one expression doesn't work currently
10+start on (file FILE=/home/phablet/.local/share/applications/*.desktop) or (file FILE=/usr/share/applications/*.desktop)
11+
12+exec dbus-send --type=method_call --dest=com.canonical.Unity.Launcher /com/canonical/Unity/Launcher com.canonical.Unity.Launcher.Refresh
13+
data/unity8-greeter-wrapper+23−7
@@ -20,8 +20,8 @@ cleanup()
2020{
2121 trap - TERM EXIT
2222 # Kill upstart and indicators
23− if [ -n "$IND_PID" ]; then
24− kill "$IND_PID"
23+ if [ -n "$INIT_PID" ]; then
24+ kill "$INIT_PID"
2525 fi
2626 if [ -n "$CMD_PID" ]; then
2727 kill "$CMD_PID"
@@ -32,7 +32,10 @@ cleanup()
3232set_greeter_var()
3333{
3434 export "$1=$2"
35− dbus-update-activation-environment --systemd "$1=$2"
35+ gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.UpdateActivationEnvironment "{'$1': '$2'}"
36+ if [ -n "$INIT_PID" ]; then
37+ initctl set-env --global "$1=$2"
38+ fi
3639}
3740
3841SUB_SOCKET=$XDG_RUNTIME_DIR/mir_socket
@@ -58,12 +61,25 @@ set_greeter_var QT_QPA_PLATFORM ubuntumirclient
5861# eventually need the greeter to play ringtones for users that aren't logged in.
5962set_greeter_var PA_DISABLED 1
6063
61−# Start the indicators
62−/usr/lib/gnome-session/run-systemd-session indicators.target &
63−IND_PID=$!
64+# Normal unity8 sessions are entirely driven by Upstart. But greeters
65+# are special. They need access to the file descriptors that lightdm
66+# creates for them and don't want to start all the services that a normal
67+# session would. So it's inconvenient to live within an upstart session.
68+# But... we still want to use Upstart for some services. So launch here.
69+MIR_SOCKET=$SUB_SOCKET $TOUCH_WRAPPER upstart --user --no-startup-event &
70+INIT_PID=$!
71+while [ ! -e "$XDG_RUNTIME_DIR/upstart/sessions/$INIT_PID.session" ]; do sleep 0.1; done
72+. "$XDG_RUNTIME_DIR/upstart/sessions/$INIT_PID.session"
73+export UPSTART_SESSION
74+
75+# Connect upstart to system, but do first command in a loop to avoid any
76+# race condition between the session file above being written and upstart being
77+# ready to handle requests.
78+while ! initctl notify-dbus-address "$DBUS_SESSION_BUS_ADDRESS"; do sleep 0.1; done
79+initctl start notify-cgmanager
6480
6581# Start any pre-greeter tasks if needed (like wizard)
66−#initctl emit unity8-greeter-starting FIXME
82+initctl emit unity8-greeter-starting
6783
6884# Define language here for phone if available. When phone user switches their
6985# language, they expect that to affect the greeter too. But the user doesn't
data/unity8-sessiondeleted−81
@@ -1,81 +0,0 @@
1−#!/bin/bash
2−# -*- Mode: sh; indent-tabs-mode: nil; tab-width: 2 -*-
3−
4−# Ensure the shell always gets unthrottled touch events, so that applications
5−# who want full speed low-latency input can get it (LP: #1497105) and so that
6−# apps can use QML touch compression safely (the QML touch compression
7−# algorithm does not support nesting well - LP: #1486341, LP: #1556763 - so
8−# must be fed by the raw input event stream from Unity8).
9−export QML_NO_TOUCH_COMPRESSION=1
10−
11−export MIR_SERVER_PROMPT_FILE=1
12−
13−# Hard code socket path because our snappy apparmor profile
14−# only lets us put the socket in one place. And consumers expect it there.
15−# (XDG_RUNTIME_DIR isn't typical under snappy)
16−export MIR_SERVER_FILE=/run/user/$(id -u)/mir_socket
17−
18−rm -f "$MIR_SERVER_FILE"
19−rm -f "${MIR_SERVER_FILE}_trusted"
20−
21−if [ "$XDG_SESSION_DESKTOP" = "ubuntu-touch" ]; then
22− # On Ubuntu Touch, we currently use a trick where we auto-login the
23− # user without a LightDM greeter at all. In this case, we want to
24− # start with the lockscreen visible. Once we switch to using a
25− # proper greeter for the first login, we can remove this code path.
26− MODE=full-greeter
27−else
28− MODE=full-shell
29−fi
30−
31−# Add options for settings
32−if [ -f ~/.unity8/configs.conf ]; then
33− source ~/.unity8/configs.conf
34−fi
35−
36−# Scale settings
37−isfloat='^[0-9]+([.][0-9]+)?$'
38−isint='^[0-9]+$'
39−if [[ $SCALE =~ $isfloat ]]; then
40− if ! [ $SCALE == "0" ]; then
41− export GRID_UNIT_PX=$(LC_ALL=C printf %.0f $((8 * ${SCALE})))
42− export QT_WAYLAND_FORCE_DPI=$(LC_ALL=C printf %.0f $((96 * ${SCALE})))
43− fi
44−fi
45−
46−if [[ $GRID_UNIT_PX =~ $isint ]]; then
47− dbus-update-activation-environment --systemd GRID_UNIT_PX=${GRID_UNIT_PX}
48−fi
49−
50−if [[ $QT_WAYLAND_FORCE_DPI =~ $isint ]]; then
51− dbus-update-activation-environment --systemd QT_WAYLAND_FORCE_DPI=${QT_WAYLAND_FORCE_DPI}
52−fi
53−
54−# Tell unity-mir to raise SIGSTOP after we start, which we use to tell
55−# systemd when we are done starting up.
56−export UNITY_MIR_EMITS_SIGSTOP=1
57−
58−# Set some envs
59−dbus-update-activation-environment --systemd QT_QPA_PLATFORM=wayland
60−dbus-update-activation-environment --systemd GDK_BACKEND=wayland
61−dbus-update-activation-environment --systemd SDL_VIDEODRIVER=wayland
62−dbus-update-activation-environment --systemd UNITY8_SHELL_QT_QPA_PLATFORM=mirserver
63−dbus-update-activation-environment --systemd QT_WAYLAND_DISABLE_WINDOWDECORATION=1
64−dbus-update-activation-environment --systemd QT_ACCESSIBILITY=1
65−dbus-update-activation-environment --systemd QT_AUTO_SCREEN_SCALE_FACTOR=0
66−dbus-update-activation-environment --systemd GTK_CSD=0
67−
68−# We need to be sure we dont use mir-on-mir
69−unset MIR_SERVER_HOST_SOCKET
70−
71−QT_QPA_PLATFORM=${UNITY8_SHELL_QT_QPA_PLATFORM} ${BINARY:-unity8} --mode=$MODE "$@" &
72−child=$!
73−
74−# Wait for SIGSTOP in child
75−while [ $(ps --no-headers -o state $child) != "T" ]; do
76− sleep 0.1
77−done
78−
79−kill -CONT $child
80−exit 0
81−
data/unity8.confnew file+99
@@ -0,0 +1,99 @@
1+description "Unity Shell v8"
2+author "Ricardo Mendoza <ricmm@ubuntu.com>"
3+
4+emits indicator-services-start
5+emits indicator-services-end
6+
7+start on ((xsession SESSION=ubuntu-touch) or (xsession SESSION=unity8-mir) or (xsession SESSION=unity8)) and started dbus
8+stop on desktop-end
9+
10+kill timeout 120
11+
12+#
13+# Ensure the shell always gets unthrottled touch events, so that applications
14+# who want full speed low-latency input can get it (LP: #1497105) and so that
15+# apps can use QML touch compression safely (the QML touch compression
16+# algorithm does not support nesting well - LP: #1486341, LP: #1556763 - so
17+# must be fed by the raw input event stream from Unity8).
18+#
19+env QML_NO_TOUCH_COMPRESSION=1
20+
21+respawn
22+expect stop
23+
24+# FIXME Create an autopilot test that makes sure start+stop and restart
25+# work fine at least 2 times
26+
27+pre-start script
28+ # Tell unity-mir to raise SIGSTOP after we start
29+ initctl set-env UNITY_MIR_EMITS_SIGSTOP=1
30+
31+ # Save original value of MIR_SOCKET so that we can restore it when stopped,
32+ # as we modify the variable for future jobs, including ourself.
33+ initctl set-env UNITY_MIR_SOCKET=$MIR_SOCKET
34+
35+ # Decide where we are going to put our own socket file
36+ if [ -n "$SNAP" ]; then
37+ # In snappy, we want to hard code our path because our apparmor profile
38+ # only lets us put the socket in one place. And consumers expect it
39+ # there.
40+ MIR_SERVER_FILE=/run/user/$(id -u)/mir_socket
41+ else
42+ MIR_SERVER_FILE=$XDG_RUNTIME_DIR/mir_socket
43+ fi
44+ initctl set-env MIR_SERVER_FILE=$MIR_SERVER_FILE
45+
46+ # Point all future jobs in this session to our Mir socket instead of
47+ # unity-system-compositor's socket.
48+ initctl set-env --global MIR_SOCKET=$MIR_SERVER_FILE
49+ gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.UpdateActivationEnvironment "@a{ss} {'MIR_SOCKET': '$MIR_SERVER_FILE'}"
50+
51+ # Remove the normal and trusted sockets if still there
52+ if [ -S "$MIR_SERVER_FILE" ]; then
53+ rm "$MIR_SERVER_FILE"
54+ fi
55+
56+ if [ -S "${MIR_SERVER_FILE}_trusted" ]; then
57+ rm "${MIR_SERVER_FILE}_trusted"
58+ fi
59+
60+ initctl set-env --global MIR_SERVER_PROMPT_FILE=1
61+
62+ # Disable Qt's stuttering 'touch compression' to fix scrolling smoothness
63+ # issues (LP: #1486341, LP: #1556763). As a bonus, this eliminates most of
64+ # the lag seen in the indicator panel pull-down (LP: #1488327) and also
65+ # reduces lag seen in apps:
66+ initctl set-env --global QML_NO_TOUCH_COMPRESSION=1
67+
68+ # Workaround for text not rendering correctly
69+ initctl set-env --global QT_ENABLE_GLYPH_CACHE_WORKAROUND=1
70+
71+ if [ "$XDG_SESSION_DESKTOP" = "ubuntu-touch" ]; then
72+ # On Ubuntu Touch, we currently use a trick where we auto-login the
73+ # user without a LightDM greeter at all. In this case, we want to
74+ # start with the lockscreen visible. Once we switch to using a
75+ # proper greeter for the first login, we can remove this code path.
76+ initctl set-env MODE=full-greeter
77+ else
78+ initctl set-env MODE=full-shell
79+ fi
80+
81+ # HACK! WORKAROUND FOR HALIUM MISSING UBUNTU_PLATFORM_API
82+ if [ ! -f /system/lib/libubuntu_application_api.so ]; then
83+ initctl set-env --global UBUNTU_PLATFORM_API_BACKEND=test.so.3
84+ initctl set-env --global UBUNTU_PLATFORM_API_SENSOR_TEST=/etc/ubuntusensors/test.sensors
85+ fi
86+end script
87+
88+exec ${BINARY:-unity8} --mode=$MODE $ARGS
89+
90+post-start script
91+ initctl emit --no-wait indicator-services-start
92+end script
93+
94+post-stop script
95+ initctl set-env --global MIR_SOCKET=$UNITY_MIR_SOCKET
96+ initctl unset-env --global MIR_SERVER_PROMPT_FILE
97+ initctl emit application-end
98+ initctl emit indicator-services-end
99+end script
data/unity8.servicedeleted−14
@@ -1,14 +0,0 @@
1−[Unit]
2−Description=Unity Shell v8
3−PartOf=graphical-session.target
4−Requires=dbus.socket
5−After=dbus.socket
6−Before=indicators.target
7−Wants=indicators.target
8−
9−[Service]
10−Type=forking
11−ExecStart=/usr/bin/unity8-session
12−ExecStopPost=/usr/bin/dbus-update-activation-environment --systemd MIR_SOCKET=
13−Restart=on-failure
14−TimeoutStartSec=120
debian/changelog+7−1
@@ -1,4 +1,10 @@
1−unity8 (8.16.1+ubports) bionic; urgency=medium
1+unity8 (8.20+ubports) xenial; urgency=medium
2+
3+ * Replace dependency on ubuntu-wallpapers with ubports-wallpapers
4+
5+ -- Dalton Durst <dalton@ubports.com> Fri, 5 Oct 2018 13:28:20 -0500
6+
7+unity8 (8.17+ubports3) xenial; urgency=medium
28
39 * Imported to UBports
410
debian/control+215−203
@@ -2,230 +2,224 @@ Source: unity8
22Section: x11
33Priority: optional
44Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
5−Build-Depends: cmake,
6− cmake-extras,
7− dbus-test-runner,
8− debhelper (>= 9),
9− dh-apparmor,
10− dh-systemd,
11− doxyqml,
12−# To allow cross-compiling to work, we also must append :native
13−# to g++ so we don't try to run arm g++
14−# on an x86 CPU for example, when cross-compiling.
15− g++:native,
16− gdb,
17− graphviz,
18− gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
19− libandroid-properties-dev,
20− libconnectivity-qt1-dev (>= 0.7.1),
21− libevdev-dev,
22− libgeonames-dev (>= 0.2),
23− libgnome-desktop-3-dev,
24− libgl1-mesa-dev[!arm64 !armhf] | libgl-dev[!arm64 !armhf],
25− libgl1-mesa-dri,
26− libgles2-mesa-dev[arm64 armhf],
27− libglib2.0-dev,
28− libgsettings-qt-dev,
29− libhardware-dev,
30− liblightdm-qt5-3-dev,
31− libpam0g-dev,
32− libpulse-dev,
33− libqmenumodel-dev (>= 0.2.12),
34− libqtdbusmock1-dev (>= 0.7),
35− libqtdbustest1-dev,
36− libqt5svg5-dev,
37− libqt5xmlpatterns5-dev,
38− libsystemsettings-dev,
39− libubuntu-app-launch3-dev,
40− libubuntu-download-manager-common-dev,
41− libubuntugestures5-dev (>= 1.3.2030),
42− libubuntugestures5-private-dev (>= 1.3.2030),
43− libudev-dev,
44− libudm-common-dev,
45− libunity-api-dev (>= 8.7),
46− libusermetricsoutput1-dev,
47−# Need those X11 libs touch emulation from mouse events in manual QML tests on a X11 desktop
48− libx11-dev[!arm64 !armhf],
49− libxcb1-dev[!arm64 !armhf],
50− libxi-dev[!arm64 !armhf],
51−# End of X11 libs
52− pkg-config,
53− python3-all:any,
54− python3-setuptools,
55− qtdbustest-runner,
56− qml-module-qt-labs-folderlistmodel,
57− qml-module-qt-labs-settings,
58− qml-module-qtqml-statemachine,
59− qml-module-qtmultimedia (>= 5.6),
60− qml-module-qtquick-layouts,
61− qml-module-qtquick-xmllistmodel,
62− qml-module-qtquick2,
63− qml-module-qtsysteminfo,
64− qml-module-qttest,
65− qml-module-ubuntu-components (>= 1.3.2030) | qml-module-ubuntu-components-gles (>= 1.3.2030),
66−# qml-module-ubuntu-web,
67− qt5-default,
68− qtbase5-dev (>= 5.6),
69− qtbase5-dev-tools,
70− qtbase5-private-dev (>= 5.6),
71− qtdeclarative5-dev (>= 5.6),
72− qtdeclarative5-dev-tools,
73− qtdeclarative5-private-dev (>= 5.6),
74− qtdeclarative5-ubuntu-content1,
75− qtdeclarative5-ubuntu-settings-components (>= 0.11),
76− systemd,
77− ttf-ubuntu-font-family,
78− xvfb,
5+Build-Depends:
6+ android-headers,
7+ cmake,
8+ cmake-extras,
9+ dbus-test-runner,
10+ debhelper (>= 9),
11+ dh-apparmor,
12+ doxyqml,
13+ g++:native,
14+ gdb,
15+ graphviz,
16+ gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
17+ libandroid-properties-dev,
18+ libconnectivity-qt1-dev (>= 0.7.1),
19+ libevdev-dev,
20+ libgeonames-dev (>= 0.2),
21+ libgl1-mesa-dev[!arm64 !armhf] | libgl-dev[!arm64 !armhf],
22+ libgl1-mesa-dri,
23+ libgles2-mesa-dev[arm64 armhf],
24+ libglib2.0-dev,
25+ libgnome-desktop-3-dev,
26+ libgsettings-qt-dev,
27+ libhardware-dev,
28+ liblightdm-qt5-3-dev,
29+ libpam0g-dev,
30+ libpulse-dev,
31+ libqmenumodel-dev (>= 0.2.12),
32+ libqt5sql5-sqlite,
33+ libqt5svg5-dev,
34+ libqt5xmlpatterns5-dev,
35+ libqtdbusmock1-dev (>= 0.7),
36+ libqtdbustest1-dev,
37+ libsystemsettings-dev,
38+ libubuntu-app-launch2-dev,
39+ libubuntu-download-manager-common-dev,
40+ libubuntugestures5-dev (>= 1.3.2030),
41+ libubuntugestures5-private-dev (>= 1.3.2030),
42+ libudev-dev,
43+ libudm-common-dev,
44+ libunity-api-dev (>= 8.7),
45+ libusermetricsoutput1-dev,
46+ libx11-dev[!arm64 !armhf],
47+ libxcb1-dev[!arm64 !armhf],
48+ libxi-dev[!arm64 !armhf],
49+ pkg-config,
50+ python3-all:any,
51+ python3-setuptools,
52+ qml-module-qt-labs-folderlistmodel,
53+ qml-module-qt-labs-settings,
54+ qml-module-qtmultimedia (>= 5.6),
55+ qml-module-qtqml-statemachine,
56+ qml-module-qtquick-layouts,
57+ qml-module-qtquick-xmllistmodel,
58+ qml-module-qtquick2,
59+ qml-module-qtsysteminfo,
60+ qml-module-qttest,
61+ qml-module-ubuntu-components (>= 1.3.2030) | qml-module-ubuntu-components-gles (>= 1.3.2030),
62+ qml-module-ubuntu-layouts,
63+ qml-module-ubuntu-settings-components,
64+ qml-module-ubuntu-test,
65+ qtbase5-dev (>= 5.6),
66+ qtbase5-dev-tools,
67+ qtbase5-private-dev (>= 5.6),
68+ qtdbustest-runner,
69+ qtdeclarative5-dev (>= 5.6),
70+ qtdeclarative5-dev-tools,
71+ qtdeclarative5-private-dev (>= 5.6),
72+ qtdeclarative5-ubuntu-content1,
73+ ttf-ubuntu-font-family,
74+ ubports-wallpapers,
75+ xvfb,
7976Standards-Version: 3.9.4
80−Homepage: http://launchpad.net/unity
81−# If you aren't a member of ~unity-team but need to upload
82−# packaging changes, just go ahead. ~unity-team will notice
83−# and sync up the code again.
84−Vcs-Bzr: https://code.launchpad.net/unity8
85−Vcs-Browser: https://bazaar.launchpad.net/~unity-team/unity8/trunk
77+Homepage: https://github.com/ubports/unity8
78+Vcs-Git: https://github.com/ubports/unity8
8679XS-Testsuite: autopkgtest
8780X-Ubuntu-Use-Langpack: yes
8881
8982Package: indicators-client
9083Architecture: any
91−Depends: qmenumodel-qml (>= 0.2.11),
92− qml-module-ubuntu-components (>= 1.3.2030) | qml-module-ubuntu-components-gles (>= 1.3.2030),
93− unity8 (= ${binary:Version}),
94− ${misc:Depends},
95− ${shlibs:Depends},
84+Depends:
85+ qmenumodel-qml (>= 0.2.11),
86+ qml-module-ubuntu-components (>= 1.3.2030) | qml-module-ubuntu-components-gles (>= 1.3.2030),
87+ unity8 (= ${binary:Version}),
88+ ${misc:Depends},
89+ ${shlibs:Depends},
9690Description: Indicators client test application
9791 This package contains the client application for indicators used by autopilot
9892
9993Package: unity8-greeter
10094Architecture: any
101−Depends: unity8 (= ${binary:Version}),
102− unity-system-compositor,
103− ${misc:Depends},
104− ${shlibs:Depends}
105−Recommends: lightdm
106−Provides: lightdm-greeter
95+Depends:
96+ unity-system-compositor,
97+ unity8 (= ${binary:Version}),
98+ ${misc:Depends},
99+ ${shlibs:Depends},
100+Recommends:
101+ lightdm,
102+Provides:
103+ lightdm-greeter,
107104Description: The Unity8 Greeter
108105 The Unity 8 greeter is the primary login greeter for Ubuntu devices.
109106
110−Package: unity-scope-tool
111−Architecture: any
112−Depends: unity8-common (= ${source:Version}),
113− unity8-private (= ${binary:Version}),
114− ${misc:Depends},
115− ${shlibs:Depends},
116−# We do call pkg-config libunity-scopes from the code
117− pkg-config,
118− libunity-scopes-dev,
119−Description: Development tool for Unity scopes
120− This package contains the development tool for new generation Unity scopes, based
121− on Unity8.
122−
123107Package: unity8
124108Architecture: any
125−Provides: indicator-renderer,
126−Depends: dbus,
127− dmz-cursor-theme,
128− gsettings-desktop-schemas,
129− libcap2-bin,
130− libglib2.0-bin,
131− qmenumodel-qml (>= 0.2.11),
132− qml-module-biometryd,
133− qml-module-qt-labs-folderlistmodel,
134− qml-module-qt-labs-settings,
135− qml-module-qtqml-statemachine,
136− qml-module-qtquick-xmllistmodel,
137− qml-module-qtsysteminfo,
138−# qml-module-ubuntu-web,
139− qtdeclarative5-qtmir-plugin (>= 0.4.8),
140− qtdeclarative5-ubuntu-telephony0.1,
141− qtwayland5,
142− ubuntu-system-settings (>= 0.4),
143− unity-launcher-impl-13,
144− unity8-common (= ${source:Version}),
145− unity8-private (= ${binary:Version}),
146− unity8-private | unity-launcher-impl,
147− ${misc:Depends},
148− ${shlibs:Depends},
149−Recommends: indicator-keyboard,
150− indicator-session,
151− unity-greeter-session-broadcast,
152−Suggests: unity-scope-mediascanner2,
153−Breaks: indicator-network (<< 0.5.1+14.10.20141014),
154− ubuntu-touch-session (<< 0.107),
155− unity8-greeter (<< 7.89),
156− ubuntu-keyboard (<< 0.100),
157−Replaces: ubuntu-touch-session (<< 0.82~),
158− unity8-greeter (<< 7.89),
159−Conflicts: ubuntu-system-settings-wizard,
109+Provides:
110+ indicator-renderer,
111+Depends:
112+ dmz-cursor-theme,
113+ gsettings-desktop-schemas,
114+ libcap2-bin,
115+ libglib2.0-bin,
116+ qmenumodel-qml (>= 0.2.11),
117+ qml-module-biometryd,
118+ qml-module-qt-labs-folderlistmodel,
119+ qml-module-qt-labs-settings,
120+ qml-module-qtqml-statemachine,
121+ qml-module-qtquick-xmllistmodel,
122+ qml-module-qtsysteminfo,
123+ qtdeclarative5-qtmir-plugin (>= 0.4.8),
124+ qtdeclarative5-ubuntu-telephony0.1,
125+ ubuntu-system-settings (>= 0.4),
126+ unity-launcher-impl-13,
127+ unity8-common (= ${source:Version}),
128+ unity8-private (= ${binary:Version}),
129+ unity8-private | unity-launcher-impl,
130+ ${misc:Depends},
131+ ${shlibs:Depends},
132+Recommends:
133+ indicator-keyboard,
134+ indicator-session,
135+ unity-greeter-session-broadcast,
136+Breaks:
137+ indicator-network (<< 0.5.1+14.10.20141014),
138+ ubuntu-keyboard (<< 0.100),
139+ ubuntu-touch-session (<< 0.107),
140+ unity-scope-tool,
141+ unity8-greeter (<< 7.89),
142+Replaces:
143+ ubuntu-touch-session (<< 0.82~),
144+ unity-scope-tool,
145+ unity8-greeter (<< 7.89),
146+Conflicts:
147+ ubuntu-system-settings-wizard,
160148Description: Unity 8 shell
161149 The Unity 8 shell is the primary user interface for Ubuntu devices.
162150
163151Package: unity8-common
164152Architecture: all
165−Depends: qml-module-qtquick-layouts,
166− qml-module-ubuntu-components (>= 1.3.2030) | qml-module-ubuntu-components-gles (>= 1.3.2030),
167− qml-module-ubuntu-thumbnailer0.1 | ubuntu-thumbnailer-impl,
168− qtdeclarative5-ubuntu-settings-components (>= 0.11),
169− qtdeclarative5-unity-notifications-plugin (>= 0.1.2) | unity-notifications-impl,
170− qttranslations5-l10n,
171− ubuntu-thumbnailer-impl-0,
172− ubuntu-wallpapers,
173− unity-application-impl-27,
174− unity-notifications-impl-3,
175−# unity-plugin-scopes | unity-scopes-impl,
176−# unity-scopes-impl-12,
177− unity8-tests | unity-application-impl,
178− ${misc:Depends},
179−Breaks: unity8 (<< 7.86),
180−Replaces: unity8 (<< 7.86),
153+Depends:
154+ qml-module-qtquick-layouts,
155+ qml-module-ubuntu-components (>= 1.3.2030) | qml-module-ubuntu-components-gles (>= 1.3.2030),
156+ qml-module-ubuntu-settings-components,
157+ qml-module-ubuntu-thumbnailer0.1 | ubuntu-thumbnailer-impl,
158+ qtdeclarative5-unity-notifications-plugin (>= 0.1.2) | unity-notifications-impl,
159+ qttranslations5-l10n,
160+ ubuntu-thumbnailer-impl-0,
161+ unity-application-impl-27,
162+ unity-notifications-impl-3,
163+ unity8-schemas,
164+ unity8-tests | unity-application-impl,
165+ ${misc:Depends},
166+Breaks:
167+ unity8 (<< 7.86),
168+Replaces:
169+ unity8 (<< 7.86),
181170Description: Unity 8 shell (common files)
182171 The Unity 8 shell is the primary user interface for Ubuntu devices.
183172 .
184− This package contains the QML, graphics and locale files shared between
185− unity8 and unity-scope-tool.
173+ This package contains the QML, graphics and locale files for unity8.
186174
187175Package: unity8-autopilot
188176Architecture: all
189−Depends: autopilot-qt5 (>= 1.4),
190− gir1.2-glib-2.0,
191− gir1.2-notify-0.7,
192− libqt5test5,
193− libqt5widgets5,
194− ofono-phonesim,
195− python3-autopilot,
196− python3-evdev,
197− python3-fixtures,
198− python3-gi,
199− qttestability-autopilot (>= 1.4),
200− ubuntu-ui-toolkit-autopilot (>= 1.3.2030),
201− unity8 (= ${source:Version}),
202− unity8-tests (= ${source:Version}),
203− url-dispatcher-tools,
204− xvfb,
205− ${misc:Depends},
206− ${python3:Depends},
177+Depends:
178+ autopilot-qt5 (>= 1.4),
179+ gir1.2-glib-2.0,
180+ gir1.2-notify-0.7,
181+ libqt5test5,
182+ libqt5widgets5,
183+ ofono-phonesim,
184+ python3-autopilot,
185+ python3-evdev,
186+ python3-fixtures,
187+ python3-gi,
188+ qttestability-autopilot (>= 1.4),
189+ ubuntu-ui-toolkit-autopilot (>= 1.3.2030),
190+ unity8 (= ${source:Version}),
191+ unity8-tests (= ${source:Version}),
192+ url-dispatcher-tools,
193+ xvfb,
194+ ${misc:Depends},
195+ ${python3:Depends},
207196Description: Test package for Unity 8 shell
208197 Autopilot tests for the unity8 package
209198
210199Package: unity8-tests
211200Architecture: any
212201Multi-Arch: same
213−Pre-Depends: ${misc:Pre-Depends},
214−Depends: dbus-test-runner,
215− parallel,
216− qtdbustest-runner,
217− qt5-default,
218− qtdeclarative5-dev-tools,
219− unity8 (= ${source:Version}),
220− xvfb,
221− ${misc:Depends},
222− ${shlibs:Depends},
223−Provides: unity-application-impl,
224− unity-application-impl-27,
225− unity8-fake-env,
226−Replaces: unity8-autopilot (<< 8.02+15.04.20150422-0ubuntu1),
227− unity8-fake-env,
228−Conflicts: unity8-fake-env,
202+Pre-Depends:
203+ ${misc:Pre-Depends},
204+Depends:
205+ dbus-test-runner,
206+ parallel,
207+ qt5-default,
208+ qtdbustest-runner,
209+ qtdeclarative5-dev-tools,
210+ unity8 (= ${source:Version}),
211+ xvfb,
212+ ${misc:Depends},
213+ ${shlibs:Depends},
214+Provides:
215+ unity-application-impl,
216+ unity-application-impl-27,
217+ unity8-fake-env,
218+Replaces:
219+ unity8-autopilot (<< 8.02+15.04.20150422-0ubuntu1),
220+ unity8-fake-env,
221+Conflicts:
222+ unity8-fake-env,
229223Description: Scripts and mocks for running Unity 8 shell tests
230224 Provides fake implementations of some QML modules used by Unity 8 shell
231225 (e.g Ubuntu.Application) so that you can run it in a sandboxed environment
@@ -234,27 +228,45 @@ Description: Scripts and mocks for running Unity 8 shell tests
234228Package: unity8-private
235229Architecture: any
236230Multi-Arch: same
237−Pre-Depends: ${misc:Pre-Depends},
238−Depends: accountsservice-ubuntu-schemas (>= 0.0.7),
239− gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
240− libhardware2,
241− unity-schemas (>= 7.3.1+14.10.20140915),
242− qtdeclarative5-gsettings1.0,
243− qml-module-qtmultimedia,
244− ${misc:Depends},
245− ${shlibs:Depends},
246−Provides: unity-launcher-impl,
247− unity-launcher-impl-13,
231+Pre-Depends:
232+ ${misc:Pre-Depends},
233+Depends:
234+ accountsservice-ubuntu-schemas (>= 0.0.7),
235+ gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
236+ libhardware2,
237+ qml-module-qtmultimedia,
238+ qtdeclarative5-gsettings1.0,
239+ unity8-schemas,
240+ ${misc:Depends},
241+ ${shlibs:Depends},
242+Provides:
243+ unity-launcher-impl,
244+ unity-launcher-impl-13,
248245Description: Unity 8 private libs
249246 The Unity 8 shell is the primary user interface for Ubuntu devices.
250247 .
251248 This package contains the private libraries for QML and other components
252249 only used by the shell.
253250
251+Package: unity8-schemas
252+Architecture: all
253+Multi-Arch: foreign
254+Depends:
255+ ${misc:Depends},
256+Replaces:
257+ unity-schemas (>= 7.3.1+14.10.20140915),
258+Breaks:
259+ unity-schemas (>= 7.3.1+14.10.20140915),
260+Description: Unity 8 schemas
261+ The Unity 8 shell is the primary user interface for Ubuntu devices.
262+ .
263+ This package contains the configuration schemas used by unity.
264+
254265Package: unity8-doc
255266Section: doc
256267Architecture: all
257268Multi-Arch: foreign
258−Depends: ${misc:Depends},
269+Depends:
270+ ${misc:Depends},
259271Description: Documentation for Unity8
260272 The Unity 8 shell is the primary user interface for Ubuntu devices. (documentation)
debian/rules+20−6
@@ -7,9 +7,15 @@ include /usr/share/dpkg/default.mk
77#export DH_VERBOSE=1
88export DPKG_GENSYMBOLS_CHECK_LEVEL=4
99export NO_PNG_PKG_MANGLE=1
10+export QT_SELECT=qt5
11+
12+DEB_HOST_ARCH ?= $(shell dpkg-architecture -qDEB_HOST_ARCH)
13+
14+# Skip tests on the archs they are known to be flaky with current configuration
15+testskip_architectures := arm64 powerpc ppc64el s390x
1016
1117%:
12− dh $@ --parallel --fail-missing --with python3,systemd
18+ dh $@ --parallel --fail-missing --with python3
1319
1420override_dh_auto_configure:
1521 # Debian defines CMAKE_INSTALL_LOCALSTATEDIR as /usr/var, which is wrong.
@@ -18,7 +24,19 @@ override_dh_auto_configure:
1824
1925override_dh_auto_build:
2026 # doc is not a default target
21− dh_auto_build -- all doc
27+ dh_auto_build -- -O all doc
28+
29+override_dh_auto_test:
30+ # Run the entire test battery
31+ # Parallel tests have a risk of starting xvfb on the same DISPLAY multiple times,
32+ # causing the whole battery to fail.
33+ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
34+ifneq (,$(filter $(DEB_HOST_ARCH),$(testskip_architectures)))
35+ -dh_auto_test --no-parallel -- -O -k xvfballtests
36+else
37+ dh_auto_test --no-parallel -- -O -k xvfballtests
38+endif
39+endif
2240
2341override_dh_install:
2442 # install autopilot tests
@@ -29,10 +47,6 @@ override_dh_install:
2947 cd $(CURDIR)
3048 dh_install -X'*.pyc' --fail-missing
3149
32−override_dh_installdeb:
33− #dh_apparmor --profile-name=usr.bin.unity8-dash -punity8-dash
34− dh_installdeb
35−
3650# use private lib directories
3751override_dh_makeshlibs:
3852 dh_makeshlibs -Nunity8-private -Nunity8-tests
debian/tests/control+5−3
@@ -1,9 +1,11 @@
11Tests: qmluitests.sh
22Restrictions: allow-stderr
3−Depends: dpkg-dev,
4− unity8-tests,
3+Depends:
4+ dpkg-dev,
5+ unity8-tests,
56
67Tests: autopilot.sh
78Restrictions: allow-stderr,
89 isolation-machine,
9−Depends: unity8-autopilot,
10+Depends:
11+ unity8-autopilot,
debian/unity-scope-tool.installdeleted−2
@@ -1,2 +0,0 @@
1−usr/bin/unity-scope-tool
2−usr/share/unity8/ScopeTool.qml
debian/unity8-common.install−2
@@ -1,7 +1,5 @@
1−usr/share/glib-2.0/schemas
21usr/share/locale
32usr/share/unity8/Components
4−usr/share/unity8/Dash
53usr/share/unity8/Notifications
64usr/share/unity8/graphics
75var/lib/polkit-1/localauthority/10-vendor.d
debian/unity8-greeter.install+1−1
@@ -1,5 +1,5 @@
1−data/unity8-greeter-wrapper usr/bin/
21data/unity8-greeter-init.conf usr/share/upstart/sessions/
2+data/unity8-greeter-wrapper usr/bin/
33data/unity8-greeter.pkla /var/lib/polkit-1/localauthority/10-vendor.d/
44usr/share/lightdm/greeters/unity8-greeter.desktop
55usr/share/lightdm/lightdm.conf.d/51-unity8-greeter.conf
debian/unity8-private.install+1−3
@@ -1,18 +1,16 @@
11usr/lib/*/libunity8-private.*
22usr/lib/*/unity8/qml/AccountsService
33usr/lib/*/unity8/qml/Cursor
4−usr/lib/*/unity8/qml/Dash
54usr/lib/*/unity8/qml/GlobalShortcut
65usr/lib/*/unity8/qml/Greeter
7−usr/lib/*/unity8/qml/ImageCache
86usr/lib/*/unity8/qml/LightDM
97usr/lib/*/unity8/qml/Lights
108usr/lib/*/unity8/qml/Powerd
119usr/lib/*/unity8/qml/ScreenshotDirectory
1210usr/lib/*/unity8/qml/SessionBroadcast
11+usr/lib/*/unity8/qml/UInput
1312usr/lib/*/unity8/qml/Ubuntu
1413usr/lib/*/unity8/qml/Unity
15−usr/lib/*/unity8/qml/UInput
1614usr/lib/*/unity8/qml/Utils
1715usr/lib/*/unity8/qml/WindowManager
1816usr/lib/*/unity8/qml/Wizard
debian/unity8-schemas.installnew file+1
@@ -0,0 +1 @@
1+usr/share/glib-2.0/schemas
debian/unity8-tests.install−1
@@ -2,7 +2,6 @@ data/unity-mock-indicator-service.conf usr/share/upstart/sessions/
22usr/bin/unity-mock-indicator-service
33usr/lib/*/unity8/qml/mocks
44usr/lib/*/unity8/qml/nonmirplugins
5−usr/lib/*/unity8/qml/scopefakes
65usr/lib/*/unity8/qml/utils
76usr/lib/*/unity8/tests
87usr/lib/*/unity8/uqmlscene
debian/unity8.install+6−11
@@ -1,24 +1,19 @@
1−debian/usr.bin.unity8-dash etc/apparmor.d
2−var/lib/unity8/version
3−data/unity8.service usr/lib/systemd/user
4−data/unity8-dash.service usr/lib/systemd/user
5−data/unity8-session usr/bin
61data/devices.conf etc/ubuntu/
72data/test.sensors etc/ubuntusensors/
3+data/unity8-filewatcher.conf usr/share/upstart/sessions/
4+data/unity8.conf usr/share/upstart/sessions/
85usr/bin/unity8
9−usr/bin/unity8-dash
10−usr/share/applications/unity8-dash.desktop
116usr/share/applications/unity8.desktop
127usr/share/unity8/ApplicationMenus
8+usr/share/unity8/DeviceConfiguration.qml
9+usr/share/unity8/DisabledScreenNotice.qml
1310usr/share/unity8/Greeter
1411usr/share/unity8/Launcher
12+usr/share/unity8/OrientedShell.qml
1513usr/share/unity8/Panel
1614usr/share/unity8/Rotation
17−usr/share/unity8/DeviceConfiguration.qml
18−usr/share/unity8/OrientedShell.qml
19−usr/share/unity8/DisabledScreenNotice.qml
2015usr/share/unity8/Shell.qml
2116usr/share/unity8/Stage
2217usr/share/unity8/Tutorial
2318usr/share/unity8/Wizard
24−usr/share/url-dispatcher/urls/unity8-dash.url-dispatcher
19+var/lib/unity8/version
debian/usr.bin.unity8-dashdeleted−21
@@ -1,21 +0,0 @@
1−# vim:syntax=apparmor
2−
3−#include <tunables/global>
4−
5−# v2 compatible wildly permissive profile
6−profile unity8-dash /usr/bin/unity8-dash (attach_disconnected) {
7− capability,
8− network,
9− / rwkl,
10− /** rwlkm,
11− /** pix,
12−
13− mount,
14− remount,
15− umount,
16− pivot_root,
17− dbus,
18− signal,
19− ptrace,
20− unix,
21−}
plugins/AccountsService/AccountsService.cpp+1−30
@@ -25,7 +25,6 @@
2525#include <glib.h>
2626
2727#define IFACE_ACCOUNTS_USER QStringLiteral("org.freedesktop.Accounts.User")
28−#define IFACE_LOCATION_HERE QStringLiteral("com.ubuntu.location.providers.here.AccountsService")
2928#define IFACE_UBUNTU_INPUT QStringLiteral("com.ubuntu.AccountsService.Input")
3029#define IFACE_UBUNTU_SECURITY QStringLiteral("com.ubuntu.AccountsService.SecurityPrivacy")
3130#define IFACE_UBUNTU_SECURITY_OLD QStringLiteral("com.ubuntu.touch.AccountsService.SecurityPrivacy")
@@ -33,7 +32,7 @@
3332#define IFACE_UNITY_PRIVATE QStringLiteral("com.canonical.unity.AccountsService.Private")
3433
3534#define PROP_BACKGROUND_FILE QStringLiteral("BackgroundFile")
36−#define PROP_DEMO_EDGES QStringLiteral("demo-edges")
35+#define PROP_DEMO_EDGES QStringLiteral("DemoEdges2")
3736#define PROP_DEMO_EDGES_COMPLETED QStringLiteral("DemoEdgesCompleted")
3837#define PROP_EMAIL QStringLiteral("Email")
3938#define PROP_ENABLE_FINGERPRINT_IDENTIFICATION QStringLiteral("EnableFingerprintIdentification")
@@ -93,8 +92,6 @@ AccountsService::AccountsService(QObject* parent, const QString &user)
9392 registerProperty(IFACE_ACCOUNTS_USER, PROP_EMAIL, QStringLiteral("emailChanged"));
9493 registerProperty(IFACE_ACCOUNTS_USER, PROP_REAL_NAME, QStringLiteral("realNameChanged"));
9594 registerProperty(IFACE_ACCOUNTS_USER, PROP_INPUT_SOURCES, QStringLiteral("keymapsChanged"));
96− registerProperty(IFACE_LOCATION_HERE, PROP_LICENSE_ACCEPTED, QStringLiteral("hereEnabledChanged"));
97− registerProperty(IFACE_LOCATION_HERE, PROP_LICENSE_BASE_PATH, QStringLiteral("hereLicensePathChanged"));
9895 registerProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_FINGERPRINT_IDENTIFICATION, QStringLiteral("enableFingerprintIdentificationChanged"));
9996 registerProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_LAUNCHER_WHILE_LOCKED, QStringLiteral("enableLauncherWhileLockedChanged"));
10097 registerProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_INDICATORS_WHILE_LOCKED, QStringLiteral("enableIndicatorsWhileLockedChanged"));
@@ -216,32 +213,6 @@ AccountsService::PasswordDisplayHint AccountsService::passwordDisplayHint() cons
216213 return (PasswordDisplayHint)value.toInt();
217214}
218215
219−bool AccountsService::hereEnabled() const
220−{
221− auto value = getProperty(IFACE_LOCATION_HERE, PROP_LICENSE_ACCEPTED);
222− return value.toBool();
223−}
224−
225−void AccountsService::setHereEnabled(bool enabled)
226−{
227− setProperty(IFACE_LOCATION_HERE, PROP_LICENSE_ACCEPTED, enabled);
228−}
229−
230−QString AccountsService::hereLicensePath() const
231−{
232− auto value = getProperty(IFACE_LOCATION_HERE, PROP_LICENSE_BASE_PATH);
233− QString hereLicensePath = value.toString();
234− if (hereLicensePath.isEmpty() || !QFile::exists(hereLicensePath))
235− hereLicensePath = QStringLiteral("");
236− return hereLicensePath;
237−}
238−
239−bool AccountsService::hereLicensePathValid() const
240−{
241− auto value = getProperty(IFACE_LOCATION_HERE, PROP_LICENSE_BASE_PATH);
242− return !value.toString().isNull();
243−}
244−
245216QString AccountsService::realName() const
246217{
247218 auto value = getProperty(IFACE_ACCOUNTS_USER, PROP_REAL_NAME);
plugins/AccountsService/AccountsService.h−16
@@ -66,16 +66,6 @@ class AccountsService: public QObject
6666 READ failedFingerprintLogins
6767 WRITE setFailedFingerprintLogins
6868 NOTIFY failedFingerprintLoginsChanged)
69− Q_PROPERTY(bool hereEnabled
70− READ hereEnabled
71− WRITE setHereEnabled
72− NOTIFY hereEnabledChanged)
73− Q_PROPERTY(QString hereLicensePath
74− READ hereLicensePath
75− NOTIFY hereLicensePathChanged)
76− Q_PROPERTY(bool hereLicensePathValid // qml sees a null string as "", so we use proxy setting for that
77− READ hereLicensePathValid
78− NOTIFY hereLicensePathChanged)
7969 Q_PROPERTY(QString realName READ realName WRITE setRealName NOTIFY realNameChanged)
8070 Q_PROPERTY(QString email READ email WRITE setEmail NOTIFY emailChanged)
8171 Q_PROPERTY(QStringList keymaps READ keymaps WRITE setKeymaps NOTIFY keymapsChanged)
@@ -106,10 +96,6 @@ public:
10696 void setFailedLogins(uint failedLogins);
10797 uint failedFingerprintLogins() const;
10898 void setFailedFingerprintLogins(uint failedFingerprintLogins);
109− bool hereEnabled() const;
110− void setHereEnabled(bool enabled);
111− QString hereLicensePath() const;
112− bool hereLicensePathValid() const;
11399 QString realName() const;
114100 void setRealName(const QString &realName);
115101 QString email() const;
@@ -129,8 +115,6 @@ Q_SIGNALS:
129115 void passwordDisplayHintChanged();
130116 void failedLoginsChanged();
131117 void failedFingerprintLoginsChanged();
132− void hereEnabledChanged();
133− void hereLicensePathChanged();
134118 void realNameChanged();
135119 void emailChanged();
136120 void keymapsChanged();
plugins/AccountsService/com.canonical.unity.AccountsService.xml+6
@@ -9,11 +9,17 @@
99 <annotation name="org.freedesktop.Accounts.Authentication.ChangeAny"
1010 value="com.ubuntu.AccountsService.GreeterChangeAny"/>
1111
12+ <!-- Marks that V1 (pre-8.21) edge demos have been run. Legacy value. -->
1213 <!-- Should have been named DemoEdges, sorry folks. -mterry -->
1314 <property name="demo-edges" type="b" access="readwrite">
1415 <annotation name="org.freedesktop.Accounts.DefaultValue" value="true"/>
1516 </property>
1617
18+ <!-- Marks that V2 (post-8.21) edge demos have been run -->
19+ <property name="DemoEdges2" type="b" access="readwrite">
20+ <annotation name="org.freedesktop.Accounts.DefaultValue" value="true"/>
21+ </property>
22+
1723 <!-- List of tutorial pages that have been completed by the user -->
1824 <property name="DemoEdgesCompleted" type="as" access="readwrite">
1925 <annotation name="org.freedesktop.Accounts.DefaultValue" value="[]"/>
plugins/CMakeLists.txt−2
@@ -15,10 +15,8 @@ add_subdirectory(AccountsService)
1515add_subdirectory(Cursor)
1616add_subdirectory(GlobalShortcut)
1717add_subdirectory(Greeter)
18−add_subdirectory(ImageCache)
1918add_subdirectory(LightDM)
2019add_subdirectory(Lights)
21−add_subdirectory(Dash)
2220add_subdirectory(Powerd)
2321add_subdirectory(ScreenshotDirectory)
2422add_subdirectory(SessionBroadcast)
plugins/Dash/AudioProgressBar.qmldeleted−54
@@ -1,54 +0,0 @@
1−/*
2− * Copyright 2015 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.4
18−import Ubuntu.Components 1.3
19−import Dash 0.1
20−
21−Item {
22− id: root
23−
24− implicitHeight: progressBarImage.height
25−
26− property url source
27− readonly property double progress: AudioUrlComparer.compare(source, DashAudioPlayer.currentSource) ? DashAudioPlayer.progress : 0
28−
29− Image {
30− id: progressBarImage
31− anchors { left: parent.left; right: parent.right }
32− height: units.dp(6)
33− source: "graphics/music_progress_bg.png"
34− asynchronous: true
35− sourceSize.width: width
36− sourceSize.height: height
37− }
38−
39− UbuntuShape {
40− id: progressBarFill
41− objectName: "progressBarFill"
42−
43− readonly property int maxWidth: progressBarImage.width
44−
45− anchors {
46− left: progressBarImage.left
47− right: progressBarImage.right
48− verticalCenter: progressBarImage.verticalCenter
49− rightMargin: maxWidth - (maxWidth * root.progress)
50− }
51− height: units.dp(2)
52− backgroundColor: theme.palette.normal.activity
53− }
54−}
plugins/Dash/CMakeLists.txtdeleted−46
@@ -1,46 +0,0 @@
1−# There's no cmake var for v8 include path :-/
2−# so create one
3−LIST(GET Qt5Core_INCLUDE_DIRS 0 QtCoreDir0)
4−if(${Qt5Core_VERSION_STRING} VERSION_LESS "5.1.0")
5− SET(Qt5V8_PRIVATE_INCLUDE_DIR ${QtCoreDir0}/../QtV8/${Qt5Core_VERSION_STRING}/QtV8)
6−else()
7− SET(Qt5V8_PRIVATE_INCLUDE_DIR ${QtCoreDir0}/QtV8/${Qt5Core_VERSION_STRING}/QtV8)
8−endif()
9−
10−include_directories(
11− ${CMAKE_CURRENT_SOURCE_DIR}
12− ${CMAKE_CURRENT_BINARY_DIR}
13−)
14−
15−include_directories(
16− SYSTEM
17− ${Qt5Qml_PRIVATE_INCLUDE_DIRS}
18− ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
19− ${Qt5V8_PRIVATE_INCLUDE_DIR}
20−)
21−
22−remove_definitions(-DQT_NO_KEYWORDS)
23−
24−set(QMLPLUGIN_SRC
25− plugin.cpp
26− listviewwithpageheader.cpp
27− abstractdashview.cpp
28− verticaljournal.cpp
29− horizontaljournal.cpp
30− organicgrid.cpp
31− )
32−
33−add_library(Dash-qml MODULE
34− ${QMLPLUGIN_SRC}
35− )
36−
37−target_link_libraries(Dash-qml
38− ${Qt5Gui_LIBRARIES}
39− ${Qt5Quick_LIBRARIES}
40− Qt5::Qml Qt5::Quick Qt5::Concurrent
41− )
42−
43−add_unity8_plugin(Dash 0.1 Dash TARGETS Dash-qml)
44−
45−install(FILES graphics/music_progress_bg.png DESTINATION ${SHELL_INSTALL_QML}/Dash/graphics/)
46−file(COPY graphics/music_progress_bg.png DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/graphics/)
plugins/Dash/CardAttributes.qmldeleted−71
@@ -1,71 +0,0 @@
1−/*
2− * Copyright 2014 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be 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.4
18−import QtQuick.Layouts 1.1
19−import Ubuntu.Components 1.3
20−
21−GridLayout {
22− id: grid
23− anchors {
24− left: parent.left;
25− right: parent.right;
26− }
27− columns: 2 + repeater.count % 2
28− rowSpacing: units.gu(.5)
29− property alias model: repeater.model
30− property color color: theme.palette.normal.baseText
31− property real fontScale: 1.0
32−
33− Repeater {
34− id: repeater
35− delegate: Row {
36− spacing: units.gu(0.5)
37− readonly property int column: index % grid.columns;
38− Layout.alignment: {
39− if (column == 0) return Qt.AlignLeft;
40− if (column == grid.columns - 1 || index == repeater.count - 1) return Qt.AlignRight;
41− if (column == 1) return Qt.AlignHCenter;
42− }
43− Layout.column: index % grid.columns
44− Layout.row: index / grid.columns
45− Layout.columnSpan: index == repeater.count - 1 && grid.columns == 3 && column == 1 ? 2 : 1
46− Layout.maximumWidth: Math.max(icon.width, label.x + label.implicitWidth)
47− Layout.fillWidth: true
48− height: units.gu(2)
49− Icon {
50− id: icon
51− height: units.gu(2)
52− // FIXME Workaround for bug https://bugs.launchpad.net/ubuntu/+source/ubuntu-ui-toolkit/+bug/1421293
53− width: implicitWidth > 0 && implicitHeight > 0 ? (implicitWidth / implicitHeight * height) : implicitWidth
54− source: "icon" in modelData && modelData["icon"] || ""
55− color: grid.color
56− }
57− Label {
58− id: label
59− width: parent.width - x
60− anchors.verticalCenter: parent.verticalCenter
61− text: "value" in modelData && modelData["value"] || "";
62− elide: Text.ElideRight
63− maximumLineCount: 1
64− font.weight: "style" in modelData && modelData["style"] === "highlighted" ? Font.Bold : Font.Light
65− fontSize: "x-small"
66− font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale)
67− color: grid.color
68− }
69− }
70− }
71−}
plugins/Dash/CardAudioProgress.qmldeleted−59
@@ -1,59 +0,0 @@
1−/*
2− * Copyright 2015 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.4
18−import Ubuntu.Components 1.3
19−import Dash 0.1
20−
21−Item {
22− id: root
23−
24− implicitHeight: positionLabel.y + positionLabel.height
25− visible: AudioUrlComparer.compare(source, DashAudioPlayer.currentSource)
26−
27− property int duration: 0
28− property alias source: progress.source
29− property color color: theme.palette.normal.baseText
30− readonly property int position: root.visible ? DashAudioPlayer.position / 1000 : 0
31−
32− AudioProgressBar {
33− id: progress
34− anchors { left: parent.left; right: parent.right }
35− }
36−
37− Label {
38− id: positionLabel
39− anchors {
40− left: parent.left
41− top: progress.bottom
42− }
43− verticalAlignment: Text.AlignBottom
44− fontSize: "x-small"
45− text: DashAudioPlayer.lengthToString(root.position)
46− color: root.color
47− }
48−
49− Label {
50− anchors {
51− right: parent.right
52− top: progress.bottom
53− }
54− verticalAlignment: Text.AlignBottom
55− fontSize: "x-small"
56− text: DashAudioPlayer.lengthToString(duration)
57− color: root.color
58− }
59−}
plugins/Dash/CardCreator.jsdeleted−999
@@ -1,999 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−.pragma library
18−
19−// %1 is the template["card-background"]["elements"][0]
20−// %2 is the template["card-background"]["elements"][1]
21−// %3 is whether the loader should be asynchronous or not
22−// %4 is the template["card-background"] string
23−var kBackgroundLoaderCode = 'Loader {\n\
24− id: backgroundLoader; \n\
25− objectName: "backgroundLoader"; \n\
26− anchors.fill: parent; \n\
27− asynchronous: %3; \n\
28− visible: status === Loader.Ready; \n\
29− sourceComponent: UbuntuShape { \n\
30− objectName: "background"; \n\
31− radius: "small"; \n\
32− aspect: { \n\
33− switch (root.backgroundShapeStyle) { \n\
34− case "inset": return UbuntuShape.Inset; \n\
35− case "shadow": return UbuntuShape.DropShadow; \n\
36− default: \n\
37− case "flat": return UbuntuShape.Flat; \n\
38− } \n\
39− } \n\
40− backgroundColor: getColor(0) || "white"; \n\
41− secondaryBackgroundColor: getColor(1) || backgroundColor; \n\
42− backgroundMode: UbuntuShape.VerticalGradient; \n\
43− anchors.fill: parent; \n\
44− source: backgroundImage.source ? backgroundImage : null; \n\
45− property real luminance: Style.luminance(backgroundColor); \n\
46− property Image backgroundImage: Image { \n\
47− objectName: "backgroundImage"; \n\
48− source: { \n\
49− if (cardData && typeof cardData["background"] === "string") return cardData["background"]; \n\
50− else return %4; \n\
51− } \n\
52− } \n\
53− function getColor(index) { \n\
54− if (cardData && typeof cardData["background"] === "object" \n\
55− && (cardData["background"]["type"] === "color" || cardData["background"]["type"] === "gradient")) { \n\
56− return cardData["background"]["elements"][index]; \n\
57− } else return index === 0 ? %1 : %2; \n\
58− } \n\
59− } \n\
60− }\n';
61−
62−// %1 is the aspect of the UbuntuShape
63−var kArtUbuntuShapeCode = 'UbuntuShape { \n\
64− anchors.fill: parent; \n\
65− source: artImage; \n\
66− sourceFillMode: UbuntuShape.PreserveAspectCrop; \n\
67− radius: "small"; \n\
68− aspect: %1; \n\
69− }';
70−
71−var kArtProportionalShapeCode = 'ProportionalShape { \n\
72− anchors.left: parent.left; \n\
73− anchors.right: parent.right; \n\
74− source: artImage; \n\
75− aspect: UbuntuShape.DropShadow; \n\
76− }';
77−
78−// %1 is used as anchors of artShapeLoader
79−// %2 is used as image width
80−// %3 is used as image height
81−// %4 is whether the image should be visible
82−// %5 is whether the loader should be asynchronous or not
83−// %6 is the shape code we want to use
84−// %7 is injected as code to artImage
85−// %8 is used as image fallback
86−var kArtShapeHolderCode = 'Loader { \n\
87− id: artShapeLoader; \n\
88− height: root.fixedArtShapeSize.height; \n\
89− width: root.fixedArtShapeSize.width; \n\
90− anchors { %1 } \n\
91− objectName: "artShapeLoader"; \n\
92− readonly property string cardArt: cardData && cardData["art"] || %8; \n\
93− onCardArtChanged: { if (item) { item.image.source = cardArt; } } \n\
94− active: cardArt != ""; \n\
95− asynchronous: %5; \n\
96− visible: status === Loader.Ready; \n\
97− sourceComponent: Item { \n\
98− id: artShape; \n\
99− objectName: "artShape"; \n\
100− visible: image.status === Image.Ready; \n\
101− readonly property alias image: artImage; \n\
102− %6 \n\
103− width: root.fixedArtShapeSize.width; \n\
104− height: root.fixedArtShapeSize.height; \n\
105− CroppedImageMinimumSourceSize { \n\
106− id: artImage; \n\
107− objectName: "artImage"; \n\
108− source: artShapeLoader.cardArt; \n\
109− asynchronous: %5; \n\
110− visible: %4; \n\
111− width: %2; \n\
112− height: %3; \n\
113− %7 \n\
114− } \n\
115− } \n\
116− }\n';
117−
118−// %1 is used as anchors of artShapeLoader
119−// %2 is used as image width
120−// %3 is used as image height
121−// %4 is whether the image should be visible
122−// %5 is whether the loader should be asynchronous or not
123−// %6 is the shape code we want to use
124−// %7 is injected as code to artImage
125−// %8 is used as image fallback
126−var kArtShapeHolderCodeCardToolCard = 'Loader { \n\
127− id: artShapeLoader; \n\
128− anchors { %1 } \n\
129− objectName: "artShapeLoader"; \n\
130− readonly property string cardArt: cardData && cardData["art"] || %8; \n\
131− onCardArtChanged: { if (item) { item.image.source = cardArt; } } \n\
132− active: cardArt != ""; \n\
133− asynchronous: %5; \n\
134− visible: status === Loader.Ready; \n\
135− sourceComponent: Item { \n\
136− id: artShape; \n\
137− objectName: "artShape"; \n\
138− visible: image.status === Image.Ready; \n\
139− readonly property alias image: artImage; \n\
140− %6 \n\
141− width: image.status !== Image.Ready ? 0 : image.width; \n\
142− height: image.status !== Image.Ready ? 0 : image.height; \n\
143− CroppedImageMinimumSourceSize { \n\
144− id: artImage; \n\
145− objectName: "artImage"; \n\
146− source: artShapeLoader.cardArt; \n\
147− asynchronous: %5; \n\
148− visible: %4; \n\
149− width: %2; \n\
150− height: %3; \n\
151− %7 \n\
152− } \n\
153− } \n\
154− }\n';
155−
156−// %1 is anchors.fill
157−// %2 is width
158−// %3 is height
159−// %4 is whether the icon should be asynchronous or not
160−var kAudioButtonCode = 'AbstractButton { \n\
161− id: audioButton; \n\
162− anchors.fill: %1; \n\
163− width: %2; \n\
164− height: %3; \n\
165− readonly property url source: (cardData["quickPreviewData"] && cardData["quickPreviewData"]["uri"]) || ""; \n\
166− UbuntuShape { \n\
167− anchors.fill: parent; \n\
168− visible: parent.pressed; \n\
169− radius: "small"; \n\
170− } \n\
171− Rectangle { \n\
172− color: Qt.rgba(0, 0, 0, 0.5); \n\
173− anchors.centerIn: parent; \n\
174− width: parent.width * 0.5; \n\
175− height: width; \n\
176− radius: width / 2; \n\
177− } \n\
178− Icon { \n\
179− anchors.centerIn: parent; \n\
180− width: parent.width * 0.3; \n\
181− height: width; \n\
182− opacity: 0.9; \n\
183− name: DashAudioPlayer.playing && AudioUrlComparer.compare(parent.source, DashAudioPlayer.currentSource) ? "media-playback-pause" : "media-playback-start"; \n\
184− color: "white"; \n\
185− asynchronous: %4; \n\
186− } \n\
187− onClicked: { \n\
188− if (AudioUrlComparer.compare(source, DashAudioPlayer.currentSource)) { \n\
189− if (DashAudioPlayer.playing) { \n\
190− DashAudioPlayer.pause(); \n\
191− } else { \n\
192− DashAudioPlayer.play(); \n\
193− } \n\
194− } else { \n\
195− var playlist = (cardData["quickPreviewData"] && cardData["quickPreviewData"]["playlist"]) || null; \n\
196− DashAudioPlayer.playSource(source, playlist); \n\
197− } \n\
198− } \n\
199− onPressAndHold: { \n\
200− root.pressAndHold(); \n\
201− } \n\
202− }';
203−
204−// %1 is whether the loader should be asynchronous or not
205−// %2 is the header height code
206−var kOverlayLoaderCode = 'Loader { \n\
207− id: overlayLoader; \n\
208− readonly property real overlayHeight: %2 + units.gu(2); \n\
209− anchors.fill: artShapeLoader; \n\
210− active: artShapeLoader.active && artShapeLoader.item && artShapeLoader.item.image.status === Image.Ready || false; \n\
211− asynchronous: %1; \n\
212− visible: showHeader && status === Loader.Ready; \n\
213− sourceComponent: UbuntuShapeOverlay { \n\
214− id: overlay; \n\
215− property real luminance: Style.luminance(overlayColor); \n\
216− aspect: UbuntuShape.Flat; \n\
217− radius: "small"; \n\
218− overlayColor: cardData && cardData["overlayColor"] || "#99000000"; \n\
219− overlayRect: Qt.rect(0, 1 - overlayLoader.overlayHeight / height, 1, 1); \n\
220− } \n\
221− }\n';
222−
223−// multiple row version of HeaderRowCode
224−function kHeaderRowCodeGenerator() {
225− var kHeaderRowCodeTemplate = 'Row { \n\
226− id: row; \n\
227− objectName: "outerRow"; \n\
228− property real margins: units.gu(1); \n\
229− spacing: margins; \n\
230− %2\
231− anchors { %1 } \n\
232− anchors.right: parent.right; \n\
233− anchors.margins: margins; \n\
234− anchors.rightMargin: 0; \n\
235− data: [ \n\
236− %3 \n\
237− ] \n\
238− }\n';
239− var args = Array.prototype.slice.call(arguments);
240− var isCardTool = args.shift();
241− var heightCode = isCardTool ? "" : "height: root.fixedHeaderHeight; \n";
242− var code = kHeaderRowCodeTemplate.arg(args.shift()).arg(heightCode).arg(args.join(',\n'));
243− return code;
244−}
245−
246−// multiple item version of kHeaderContainerCode
247−function kHeaderContainerCodeGenerator() {
248− var headerContainerCodeTemplate = 'Item { \n\
249− id: headerTitleContainer; \n\
250− anchors { %1 } \n\
251− width: parent.width - x; \n\
252− implicitHeight: %2; \n\
253− data: [ \n\
254− %3 \n\
255− ]\n\
256− }\n';
257− var args = Array.prototype.slice.call(arguments);
258− var code = headerContainerCodeTemplate.arg(args.shift()).arg(args.shift()).arg(args.join(',\n'));
259− return code;
260−}
261−
262−// %1 is used as anchors of mascotShapeLoader
263−// %2 is whether the loader should be asynchronous or not
264−var kMascotShapeLoaderCode = 'Loader { \n\
265− id: mascotShapeLoader; \n\
266− objectName: "mascotShapeLoader"; \n\
267− asynchronous: %2; \n\
268− active: mascotImage.status === Image.Ready; \n\
269− visible: showHeader && active && status === Loader.Ready; \n\
270− width: units.gu(6); \n\
271− height: units.gu(5.625); \n\
272− sourceComponent: UbuntuShape { aspect: UbuntuShape.Flat; image: mascotImage } \n\
273− anchors { %1 } \n\
274− }\n';
275−
276−// %1 is used as anchors of mascotImage
277−// %2 is used as visible of mascotImage
278−// %3 is injected as code to mascotImage
279−// %4 is used as fallback image
280−var kMascotImageCode = 'CroppedImageMinimumSourceSize { \n\
281− id: mascotImage; \n\
282− objectName: "mascotImage"; \n\
283− anchors { %1 } \n\
284− source: cardData && cardData["mascot"] || %4; \n\
285− width: units.gu(6); \n\
286− height: units.gu(5.625); \n\
287− horizontalAlignment: Image.AlignHCenter; \n\
288− verticalAlignment: Image.AlignVCenter; \n\
289− visible: %2; \n\
290− %3 \n\
291− }\n';
292−
293−// %1 is used as anchors of titleLabel
294−// %2 is used as color of titleLabel
295−// %3 is used as extra condition for visible of titleLabel
296−// %4 is used as title width
297−// %5 is used as horizontal alignment
298−var kTitleLabelCode = 'Label { \n\
299− id: titleLabel; \n\
300− objectName: "titleLabel"; \n\
301− anchors { %1 } \n\
302− elide: Text.ElideRight; \n\
303− fontSize: "small"; \n\
304− wrapMode: Text.Wrap; \n\
305− maximumLineCount: 2; \n\
306− font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale); \n\
307− color: %2; \n\
308− visible: showHeader %3; \n\
309− width: %4; \n\
310− text: root.title; \n\
311− font.weight: Font.Normal; \n\
312− horizontalAlignment: %5; \n\
313− }\n';
314−
315−// %1 is used as extra anchors of emblemIcon
316−// %2 is used as color of emblemIcon
317−// FIXME The width code is a
318−// Workaround for bug https://bugs.launchpad.net/ubuntu/+source/ubuntu-ui-toolkit/+bug/1421293
319−var kEmblemIconCode = 'Icon { \n\
320− id: emblemIcon; \n\
321− objectName: "emblemIcon"; \n\
322− anchors { \n\
323− bottom: titleLabel.baseline; \n\
324− right: parent.right; \n\
325− %1 \n\
326− } \n\
327− source: cardData && cardData["emblem"] || ""; \n\
328− color: %2; \n\
329− height: source != "" ? titleLabel.font.pixelSize : 0; \n\
330− width: implicitWidth > 0 && implicitHeight > 0 ? (implicitWidth / implicitHeight * height) : implicitWidth; \n\
331− }\n';
332−
333−// %1 is used as anchors of touchdown effect
334−var kTouchdownCode = 'Loader { \n\
335− active: root.pressed; \n\
336− anchors { %1 } \n\
337− sourceComponent: UbuntuShape { \n\
338− objectName: "touchdown"; \n\
339− anchors.fill: parent; \n\
340− radius: "small"; \n\
341− borderSource: "radius_pressed.sci" \n\
342− } \n\
343− }\n';
344−
345−// %1 is used as anchors of subtitleLabel
346−// %2 is used as color of subtitleLabel
347−var kSubtitleLabelCode = 'Label { \n\
348− id: subtitleLabel; \n\
349− objectName: "subtitleLabel"; \n\
350− anchors { %1 } \n\
351− anchors.topMargin: units.dp(2); \n\
352− elide: Text.ElideRight; \n\
353− maximumLineCount: 1; \n\
354− fontSize: "x-small"; \n\
355− font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale); \n\
356− color: %2; \n\
357− visible: titleLabel.visible && titleLabel.text; \n\
358− text: cardData && cardData["subtitle"] || ""; \n\
359− font.weight: Font.Light; \n\
360− }\n';
361−
362−// %1 is used as anchors of attributesRow
363−// %2 is used as color of attributesRow
364−var kAttributesRowCode = 'CardAttributes { \n\
365− id: attributesRow; \n\
366− objectName: "attributesRow"; \n\
367− anchors { %1 } \n\
368− color: %2; \n\
369− fontScale: root.fontScale; \n\
370− model: cardData && cardData["attributes"]; \n\
371− }\n';
372−
373−// %1 is used as anchors of socialActionsRow
374−// %2 is used as color of socialActionsRow
375−var kSocialActionsRowCode = 'CardSocialActions { \n\
376− id: socialActionsRow; \n\
377− objectName: "socialActionsRow"; \n\
378− anchors { %1 } \n\
379− color: %2; \n\
380− model: cardData && cardData["socialActions"]; \n\
381− onClicked: root.action(actionId); \n\
382− }\n';
383−
384−// %1 is used as top anchor of summary
385−// %2 is used as topMargin anchor of summary
386−// %3 is used as color of summary
387−var kSummaryLabelCode = 'Label { \n\
388− id: summary; \n\
389− objectName: "summaryLabel"; \n\
390− anchors { \n\
391− top: %1; \n\
392− left: parent.left; \n\
393− right: parent.right; \n\
394− margins: units.gu(1); \n\
395− topMargin: %2; \n\
396− } \n\
397− wrapMode: Text.Wrap; \n\
398− maximumLineCount: 5; \n\
399− elide: Text.ElideRight; \n\
400− text: cardData && cardData["summary"] || ""; \n\
401− height: text ? implicitHeight : 0; \n\
402− fontSize: "x-small"; \n\
403− font.weight: Font.Light; \n\
404− color: %3; \n\
405− }\n';
406−
407−// %1 is used as bottom anchor of audio progress bar
408−// %2 is used as left anchor of audio progress bar
409−// %3 is used as text color
410−var kAudioProgressBarCode = 'CardAudioProgress { \n\
411− id: audioProgressBar; \n\
412− duration: (cardData["quickPreviewData"] && cardData["quickPreviewData"]["duration"]) || 0; \n\
413− source: (cardData["quickPreviewData"] && cardData["quickPreviewData"]["uri"]) || ""; \n\
414− anchors { \n\
415− bottom: %1; \n\
416− left: %2; \n\
417− right: parent.right; \n\
418− margins: units.gu(1); \n\
419− } \n\
420− color: %3; \n\
421− }';
422−
423−function sanitizeColor(colorString) {
424− if (colorString !== undefined) {
425− if (colorString.match(/^[#a-z0-9]*$/i) === null) {
426− // This is not the perfect regexp for color
427− // but what we're trying to do here is just protect
428− // against injection so it's ok
429− return "";
430− }
431− }
432− return colorString;
433−}
434−
435−function cardString(template, components, isCardTool, artShapeStyle, categoryLayout) {
436− var code;
437−
438− var templateInteractive = (template == null ? true : (template["non-interactive"] !== undefined ? !template["non-interactive"] : true)) ? "true" : "false";
439−
440− code = 'AbstractButton { \n\
441− id: root; \n\
442− property var cardData; \n\
443− property string backgroundShapeStyle: "flat"; \n\
444− property real fontScale: 1.0; \n\
445− property var scopeStyle: null; \n\
446− readonly property string title: cardData && cardData["title"] || ""; \n\
447− property bool showHeader: true; \n\
448− implicitWidth: childrenRect.width; \n\
449− enabled: %1; \n\
450− \n'.arg(templateInteractive);
451−
452− if (!isCardTool) {
453− code += "property int fixedHeaderHeight: -1; \n\
454− property size fixedArtShapeSize: Qt.size(-1, -1); \n";
455− }
456−
457− var hasArt = components["art"] && components["art"]["field"] || false;
458− var hasSummary = components["summary"] || false;
459− var isConciergeMode = components["art"] && components["art"]["conciergeMode"] || false;
460− var artAndSummary = hasArt && hasSummary && !isConciergeMode;
461− var isHorizontal = template["card-layout"] === "horizontal";
462− var hasBackground = (!isHorizontal && (template["card-background"] || components["background"] || artAndSummary)) ||
463− (hasSummary && (template["card-background"] || components["background"]));
464− var hasTitle = components["title"] || false;
465− var hasMascot = components["mascot"] || false;
466− var hasEmblem = components["emblem"] && !(hasMascot && template["card-size"] === "small") || false;
467− var headerAsOverlay = hasArt && template && template["overlay"] === true && (hasTitle || hasMascot);
468− var hasSubtitle = hasTitle && components["subtitle"] || false;
469− var hasHeaderRow = hasMascot && hasTitle;
470− var hasAttributes = hasTitle && components["attributes"] && components["attributes"]["field"] || false;
471− var hasSocialActions = hasTitle && components["social-actions"] || false;
472− var isAudio = template["quick-preview-type"] === "audio";
473− var asynchronous = isCardTool ? "false" : "true";
474−
475− code += 'signal action(var actionId);\n';
476− if (isAudio) {
477− // For now we only support audio cards with [optional] art, title, subtitle
478− // in horizontal mode
479− // Anything else makes it behave not like an audio card
480− if (hasSummary) isAudio = false;
481− if (!isHorizontal) isAudio = false;
482− if (hasMascot) isAudio = false;
483− if (hasEmblem) isAudio = false;
484− if (headerAsOverlay) isAudio = false;
485− if (hasAttributes) isAudio = false;
486− }
487−
488− if (hasBackground) {
489− var templateCardBackground;
490− if (template && typeof template["card-background"] === "string") {
491− templateCardBackground = 'decodeURI("' + encodeURI(template["card-background"]) + '")';
492− } else {
493− templateCardBackground = '""';
494− }
495−
496− var backgroundElements0;
497− var backgroundElements1;
498− if (template && typeof template["card-background"] === "object" && (template["card-background"]["type"] === "color" || template["card-background"]["type"] === "gradient")) {
499− var element0 = sanitizeColor(template["card-background"]["elements"][0]);
500− var element1 = sanitizeColor(template["card-background"]["elements"][1]);
501− if (element0 !== undefined) {
502− backgroundElements0 = '"%1"'.arg(element0);
503− }
504− if (element1 !== undefined) {
505− backgroundElements1 = '"%1"'.arg(element1);
506− }
507− }
508− code += kBackgroundLoaderCode.arg(backgroundElements0).arg(backgroundElements1).arg(asynchronous).arg(templateCardBackground);
509− }
510−
511− if (hasArt) {
512− var artShapeAspect;
513− if (isCardTool) {
514− code += 'readonly property size artShapeSize: artShapeLoader.item ? Qt.size(artShapeLoader.item.width, artShapeLoader.item.height) : Qt.size(-1, -1);\n';
515−
516− var artShapeAspect = components["art"] && components["art"]["aspect-ratio"] || 1;
517− if (isNaN(artShapeAspect)) {
518− artShapeAspect = 1;
519− }
520− } else {
521− artShapeAspect = "(root.fixedArtShapeSize.width / root.fixedArtShapeSize.height)";
522− }
523−
524− var widthCode, heightCode;
525− var artAnchors;
526− if (isHorizontal) {
527− artAnchors = 'left: parent.left';
528− if (hasMascot || hasTitle) {
529− widthCode = 'height * ' + artShapeAspect;
530− heightCode = 'headerHeight + 2 * units.gu(1)';
531− } else {
532− // This side of the else is a bit silly, who wants an horizontal layout without mascot and title?
533− // So we define a "random" height of the image height + 2 gu for the margins
534− widthCode = 'height * ' + artShapeAspect
535− heightCode = 'units.gu(7.625)';
536− }
537− } else {
538− artAnchors = 'horizontalCenter: parent.horizontalCenter;';
539− widthCode = 'root.width'
540− heightCode = 'width / ' + artShapeAspect;
541− }
542−
543− var fallback = !isCardTool && components["art"] && components["art"]["fallback"] || "";
544− fallback = encodeURI(fallback);
545− var fallbackStatusCode = "";
546− var fallbackURICode = '""';
547− if (fallback !== "") {
548− // fallbackStatusCode has %8 in it because we want to substitute it for fallbackURICode
549− // which in kArtShapeHolderCode is %8
550− fallbackStatusCode += 'onStatusChanged: if (status === Image.Error) source = %8;';
551− fallbackURICode = 'decodeURI("%1")'.arg(fallback);
552− }
553− var artShapeHolderShapeCode;
554− if (!isConciergeMode) {
555− if (artShapeStyle === "icon") {
556− artShapeHolderShapeCode = kArtProportionalShapeCode;
557− } else {
558− var artShapeHolderShapeAspect;
559− switch (artShapeStyle) {
560− case "inset": artShapeHolderShapeAspect = "UbuntuShape.Inset"; break;
561− case "shadow": artShapeHolderShapeAspect = "UbuntuShape.DropShadow"; break;
562− default:
563− case "flat": artShapeHolderShapeAspect = "UbuntuShape.Flat"; break;
564− }
565− artShapeHolderShapeCode = kArtUbuntuShapeCode.arg(artShapeHolderShapeAspect);
566− }
567− } else {
568− artShapeHolderShapeCode = "";
569− }
570− var artShapeHolderCode = isCardTool ? kArtShapeHolderCodeCardToolCard : kArtShapeHolderCode;
571− code += artShapeHolderCode.arg(artAnchors)
572− .arg(widthCode)
573− .arg(heightCode)
574− .arg(isConciergeMode ? "true" : "false")
575− .arg(asynchronous)
576− .arg(artShapeHolderShapeCode)
577− .arg(fallbackStatusCode)
578− .arg(fallbackURICode);
579− } else if (isCardTool) {
580− code += 'readonly property size artShapeSize: Qt.size(-1, -1);\n'
581− }
582−
583− if (headerAsOverlay) {
584− var headerHeightCode = isCardTool ? "headerHeight" : "root.fixedHeaderHeight";
585− code += kOverlayLoaderCode.arg(asynchronous).arg(headerHeightCode);
586− }
587−
588− var headerVerticalAnchors;
589− if (headerAsOverlay) {
590− headerVerticalAnchors = 'bottom: artShapeLoader.bottom; \n\
591− bottomMargin: units.gu(1);\n';
592− } else {
593− if (hasArt) {
594− if (isHorizontal) {
595− headerVerticalAnchors = 'top: artShapeLoader.top; \n\
596− topMargin: units.gu(1);\n';
597− } else {
598− headerVerticalAnchors = 'top: artShapeLoader.bottom; \n\
599− topMargin: units.gu(1);\n';
600− }
601− } else {
602− headerVerticalAnchors = 'top: parent.top; \n\
603− topMargin: units.gu(1);\n';
604− }
605− }
606−
607− var headerLeftAnchor;
608− var headerLeftAnchorHasMargin = false;
609− if (isHorizontal && hasArt) {
610− headerLeftAnchor = 'left: artShapeLoader.right; \n\
611− leftMargin: units.gu(1);\n';
612− headerLeftAnchorHasMargin = true;
613− } else if (isHorizontal && isAudio) {
614− headerLeftAnchor = 'left: audioButton.right; \n\
615− leftMargin: units.gu(1);\n';
616− headerLeftAnchorHasMargin = true;
617− } else {
618− headerLeftAnchor = 'left: parent.left;\n';
619− }
620−
621− var touchdownOnArtShape = !hasBackground && hasArt && !hasMascot && !hasSummary && !isAudio;
622−
623− if (hasHeaderRow) {
624− code += 'readonly property int headerHeight: row.height;\n'
625− } else if (hasMascot) {
626− code += 'readonly property int headerHeight: mascotImage.height;\n'
627− } else if (hasAttributes) {
628− if (hasTitle && hasSubtitle) {
629− code += 'readonly property int headerHeight: titleLabel.height + subtitleLabel.height + subtitleLabel.anchors.topMargin + attributesRow.height + attributesRow.anchors.topMargin;\n'
630− } else if (hasTitle) {
631− code += 'readonly property int headerHeight: titleLabel.height + attributesRow.height + attributesRow.anchors.topMargin;\n'
632− } else {
633− code += 'readonly property int headerHeight: attributesRow.height;\n'
634− }
635− } else if (isAudio) {
636− if (hasSubtitle) {
637− code += 'readonly property int headerHeight: titleLabel.height + subtitleLabel.height + subtitleLabel.anchors.topMargin + audioProgressBar.height + audioProgressBar.anchors.topMargin;\n'
638− } else if (hasTitle) {
639− code += 'readonly property int headerHeight: titleLabel.height + audioProgressBar.height + audioProgressBar.anchors.topMargin;\n'
640− } else {
641− code += 'readonly property int headerHeight: audioProgressBar.height;\n'
642− }
643− } else if (hasSubtitle) {
644− code += 'readonly property int headerHeight: titleLabel.height + subtitleLabel.height + subtitleLabel.anchors.topMargin;\n'
645− } else if (hasTitle) {
646− code += 'readonly property int headerHeight: titleLabel.height;\n'
647− } else {
648− code += 'readonly property int headerHeight: 0;\n'
649− }
650−
651− var mascotShapeCode = '';
652− var mascotCode = '';
653− if (hasMascot) {
654− var useMascotShape = !hasBackground && !headerAsOverlay;
655− var mascotAnchors = '';
656− if (!hasHeaderRow) {
657− mascotAnchors += headerLeftAnchor;
658− mascotAnchors += headerVerticalAnchors;
659− if (!headerLeftAnchorHasMargin) {
660− mascotAnchors += 'leftMargin: units.gu(1);\n'
661− }
662− } else {
663− mascotAnchors = 'verticalCenter: parent.verticalCenter;'
664− }
665−
666− if (useMascotShape) {
667− mascotShapeCode = kMascotShapeLoaderCode.arg(mascotAnchors).arg(asynchronous);
668− }
669−
670− var mascotImageVisible = useMascotShape ? 'false' : 'showHeader';
671− var fallback = !isCardTool && components["mascot"] && components["mascot"]["fallback"] || "";
672− fallback = encodeURI(fallback);
673− var fallbackStatusCode = "";
674− var fallbackURICode = '""';
675− if (fallback !== "") {
676− // fallbackStatusCode has %4 in it because we want to substitute it for fallbackURICode
677− // which in kMascotImageCode is %4
678− fallbackStatusCode += 'onStatusChanged: if (status === Image.Error) source = %4;';
679− fallbackURICode = 'decodeURI("%1")'.arg(fallback);
680− }
681− mascotCode = kMascotImageCode.arg(mascotAnchors).arg(mascotImageVisible).arg(fallbackStatusCode).arg(fallbackURICode);
682− }
683−
684− var summaryColorWithBackground = 'backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? theme.palette.normal.baseText : "white")';
685−
686− var hasTitleContainer = hasTitle && (hasEmblem || (hasMascot && (hasSubtitle || hasAttributes)));
687− var titleSubtitleCode = '';
688− if (hasTitle) {
689− var titleColor;
690− if (headerAsOverlay) {
691− titleColor = 'root.scopeStyle && overlayLoader.item ? root.scopeStyle.getTextColor(overlayLoader.item.luminance) : (overlayLoader.item && overlayLoader.item.luminance > 0.7 ? theme.palette.normal.baseText : "white")';
692− } else if (hasSummary) {
693− titleColor = 'summary.color';
694− } else if (hasBackground) {
695− titleColor = summaryColorWithBackground;
696− } else {
697− titleColor = 'root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText';
698− }
699−
700− var titleAnchors;
701− var subtitleAnchors;
702− var attributesAnchors;
703− var titleContainerAnchors;
704− var titleRightAnchor;
705− var titleWidth = "undefined";
706−
707− var extraRightAnchor = '';
708− var extraLeftAnchor = '';
709− if (!touchdownOnArtShape) {
710− extraRightAnchor = 'rightMargin: units.gu(1); \n';
711− extraLeftAnchor = 'leftMargin: units.gu(1); \n';
712− } else if (headerAsOverlay && !hasEmblem) {
713− extraRightAnchor = 'rightMargin: units.gu(1); \n';
714− }
715−
716− if (hasMascot) {
717− titleContainerAnchors = 'verticalCenter: parent.verticalCenter; ';
718− } else {
719− titleContainerAnchors = 'right: parent.right; ';
720− titleContainerAnchors += headerLeftAnchor;
721− titleContainerAnchors += headerVerticalAnchors;
722− if (!headerLeftAnchorHasMargin) {
723− titleContainerAnchors += extraLeftAnchor;
724− }
725− }
726− if (hasEmblem) {
727− titleRightAnchor = 'right: emblemIcon.left; \n\
728− rightMargin: emblemIcon.width > 0 ? units.gu(0.5) : 0; \n';
729− } else {
730− titleRightAnchor = 'right: parent.right; \n'
731− titleRightAnchor += extraRightAnchor;
732− }
733−
734− if (hasTitleContainer) {
735− // Using headerTitleContainer
736− titleAnchors = titleRightAnchor;
737− titleAnchors += 'left: parent.left; \n\
738− top: parent.top;';
739− subtitleAnchors = 'right: parent.right; \n\
740− left: parent.left; \n';
741− subtitleAnchors += extraRightAnchor;
742− if (hasSubtitle) {
743− attributesAnchors = subtitleAnchors + 'top: subtitleLabel.bottom;\n';
744− subtitleAnchors += 'top: titleLabel.bottom;\n';
745− } else {
746− attributesAnchors = subtitleAnchors + 'top: titleLabel.bottom;\n';
747− }
748− } else if (hasMascot) {
749− // Using row without titleContainer
750− titleAnchors = 'verticalCenter: parent.verticalCenter;\n';
751− titleWidth = "parent.width - x";
752− } else {
753− if (headerAsOverlay) {
754− // Using anchors to the overlay
755− titleAnchors = titleRightAnchor;
756− titleAnchors += 'left: parent.left; \n\
757− leftMargin: units.gu(1); \n\
758− top: overlayLoader.top; \n\
759− topMargin: units.gu(1) + overlayLoader.height - overlayLoader.overlayHeight; \n';
760− } else {
761− // Using anchors to the mascot/parent
762− titleAnchors = titleRightAnchor;
763− titleAnchors += headerLeftAnchor;
764− titleAnchors += headerVerticalAnchors;
765− if (!headerLeftAnchorHasMargin) {
766− titleAnchors += extraLeftAnchor;
767− }
768− }
769− subtitleAnchors = 'left: titleLabel.left; \n\
770− leftMargin: titleLabel.leftMargin; \n';
771− subtitleAnchors += extraRightAnchor;
772− if (hasEmblem) {
773− // using container
774− subtitleAnchors += 'right: parent.right; \n';
775− } else {
776− subtitleAnchors += 'right: titleLabel.right; \n';
777− }
778−
779− if (hasSubtitle) {
780− attributesAnchors = subtitleAnchors + 'top: subtitleLabel.bottom;\n';
781− subtitleAnchors += 'top: titleLabel.bottom;\n';
782− } else {
783− attributesAnchors = subtitleAnchors + 'top: titleLabel.bottom;\n';
784− }
785− }
786−
787− var titleAlignment = "Text.AlignHCenter";
788− if (template["card-layout"] === "horizontal"
789− || typeof components["title"] !== "object"
790− || components["title"]["align"] === "left") titleAlignment = "Text.AlignLeft";
791− var keys = ["mascot", "emblem", "subtitle", "attributes", "summary"];
792− for (var key in keys) {
793− key = keys[key];
794− try {
795− if (typeof components[key] === "string"
796− || typeof components[key]["field"] === "string") titleAlignment = "Text.AlignLeft";
797− } catch (e) {
798− continue;
799− }
800− }
801−
802− // code for different elements
803− var titleLabelVisibleExtra = (headerAsOverlay ? '&& overlayLoader.active': '');
804− var titleCode = kTitleLabelCode.arg(titleAnchors).arg(titleColor).arg(titleLabelVisibleExtra).arg(titleWidth).arg(titleAlignment);
805− var subtitleCode;
806− var attributesCode;
807−
808− // code for the title container
809− var containerCode = [];
810− var containerHeight = 'titleLabel.height';
811− containerCode.push(titleCode);
812− if (hasSubtitle) {
813− subtitleCode = kSubtitleLabelCode.arg(subtitleAnchors).arg(titleColor);
814− containerCode.push(subtitleCode);
815− containerHeight += ' + subtitleLabel.height';
816− }
817− if (hasEmblem) {
818− containerCode.push(kEmblemIconCode.arg(extraRightAnchor).arg(titleColor));
819− }
820− if (hasAttributes) {
821− attributesCode = kAttributesRowCode.arg(attributesAnchors).arg(titleColor);
822− containerCode.push(attributesCode);
823− containerHeight += ' + attributesRow.height';
824− }
825−
826− if (hasTitleContainer) {
827− // use container
828− titleSubtitleCode = kHeaderContainerCodeGenerator(titleContainerAnchors, containerHeight, containerCode);
829− } else {
830− // no container
831− titleSubtitleCode = titleCode;
832− if (hasSubtitle) {
833− titleSubtitleCode += subtitleCode;
834− }
835− if (hasAttributes) {
836− titleSubtitleCode += attributesCode;
837− }
838− }
839− }
840−
841− if (hasHeaderRow) {
842− var rowCode = [mascotCode, titleSubtitleCode];
843− if (mascotShapeCode != '') {
844− rowCode.unshift(mascotShapeCode);
845− }
846− code += kHeaderRowCodeGenerator(isCardTool, headerVerticalAnchors + headerLeftAnchor, rowCode)
847− } else {
848− code += mascotShapeCode + mascotCode + titleSubtitleCode;
849− }
850−
851− if (isAudio) {
852− var audioProgressBarLeftAnchor = 'audioButton.right';
853− var audioProgressBarBottomAnchor = 'audioButton.bottom';
854− var audioProgressBarTextColor = 'root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText';
855−
856− code += kAudioProgressBarCode.arg(audioProgressBarBottomAnchor)
857− .arg(audioProgressBarLeftAnchor)
858− .arg(audioProgressBarTextColor);
859−
860− var audioButtonAnchorsFill;
861− var audioButtonWidth;
862− var audioButtonHeight;
863− if (hasArt) {
864− audioButtonAnchorsFill = 'artShapeLoader';
865− audioButtonWidth = 'undefined';
866− audioButtonHeight = 'undefined';
867− } else {
868− audioButtonAnchorsFill = 'undefined';
869− audioButtonWidth = 'height';
870− audioButtonHeight = isCardTool ? 'headerHeight + 2 * units.gu(1)'
871− : 'root.fixedHeaderHeight + 2 * units.gu(1)';
872− }
873− code += kAudioButtonCode.arg(audioButtonAnchorsFill).arg(audioButtonWidth).arg(audioButtonHeight).arg(asynchronous);
874− }
875−
876− if (hasSummary) {
877− var summaryTopAnchor;
878− if (isHorizontal && hasArt) summaryTopAnchor = 'artShapeLoader.bottom';
879− else if (headerAsOverlay && hasArt) summaryTopAnchor = 'artShapeLoader.bottom';
880− else if (hasHeaderRow) summaryTopAnchor = 'row.bottom';
881− else if (hasTitleContainer) summaryTopAnchor = 'headerTitleContainer.bottom';
882− else if (hasMascot) summaryTopAnchor = 'mascotImage.bottom';
883− else if (hasAttributes) summaryTopAnchor = 'attributesRow.bottom';
884− else if (hasSubtitle) summaryTopAnchor = 'subtitleLabel.bottom';
885− else if (hasTitle) summaryTopAnchor = 'titleLabel.bottom';
886− else if (hasArt) summaryTopAnchor = 'artShapeLoader.bottom';
887− else summaryTopAnchor = 'parent.top';
888−
889− var summaryColor;
890− if (hasBackground) {
891− summaryColor = summaryColorWithBackground;
892− } else {
893− summaryColor = 'root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText';
894− }
895−
896− var summaryTopMargin = (hasMascot || hasSubtitle || hasAttributes ? 'anchors.margins' : '0');
897−
898− code += kSummaryLabelCode.arg(summaryTopAnchor).arg(summaryTopMargin).arg(summaryColor);
899− }
900−
901− if (hasSocialActions) {
902− var socialAnchors;
903− var socialTopAnchor;
904−
905− if (hasSummary) socialTopAnchor = 'summary.bottom;';
906− else if (isHorizontal && hasArt) socialTopAnchor = 'artShapeLoader.bottom;';
907− else if (headerAsOverlay && hasArt) socialTopAnchor = 'artShapeLoader.bottom;';
908− else if (hasHeaderRow) socialTopAnchor = 'row.bottom;';
909− else if (hasTitleContainer) socialTopAnchor = 'headerTitleContainer.bottom;';
910− else if (hasMascot) socialTopAnchor = 'mascotImage.bottom;';
911− else if (hasAttributes) socialTopAnchor = 'attributesRow.bottom;';
912− else if (hasSubtitle) socialTopAnchor = 'subtitleLabel.bottom;';
913− else if (hasTitle) socialTopAnchor = 'titleLabel.bottom;';
914− else if (hasArt) socialTopAnchor = 'artShapeLoader.bottom;';
915− else socialTopAnchor = 'parent.top';
916−
917− socialAnchors = 'top: ' + socialTopAnchor + ' left: parent.left; right: parent.right; topMargin: units.gu(1);'
918−
919− var socialColor;
920− if (hasBackground) {
921− socialColor = summaryColorWithBackground;
922− } else {
923− socialColor = 'root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText';
924− }
925−
926− code += kSocialActionsRowCode.arg(socialAnchors).arg(socialColor);
927− }
928−
929− if (artShapeStyle != "shadow" && artShapeStyle != "icon" && !isCardTool) {
930− var touchdownAnchors;
931− if (hasBackground) {
932− touchdownAnchors = 'fill: backgroundLoader';
933− } else if (touchdownOnArtShape) {
934− touchdownAnchors = 'fill: artShapeLoader';
935− } else {
936− touchdownAnchors = 'fill: root'
937− }
938− code += kTouchdownCode.arg(touchdownAnchors);
939− }
940−
941− if (isCardTool || categoryLayout !== "grid") {
942− var implicitHeight = 'implicitHeight: ';
943− if (hasSocialActions) {
944− implicitHeight += 'socialActionsRow.y + socialActionsRow.height + units.gu(1);\n';
945− } else if (hasSummary) {
946− implicitHeight += 'summary.y + summary.height + units.gu(1);\n';
947− } else if (isAudio) {
948− implicitHeight += 'audioButton.height;\n';
949− } else if (headerAsOverlay) {
950− implicitHeight += 'artShapeLoader.height;\n';
951− } else if (hasHeaderRow) {
952− implicitHeight += 'row.y + row.height + units.gu(1);\n';
953− } else if (hasMascot) {
954− implicitHeight += 'mascotImage.y + mascotImage.height;\n';
955− } else if (hasTitleContainer) {
956− implicitHeight += 'headerTitleContainer.y + headerTitleContainer.height + units.gu(1);\n';
957− } else if (hasAttributes) {
958− implicitHeight += 'attributesRow.y + attributesRow.height + units.gu(1);\n';
959− } else if (hasSubtitle) {
960− implicitHeight += 'subtitleLabel.y + subtitleLabel.height + units.gu(1);\n';
961− } else if (hasTitle) {
962− implicitHeight += 'titleLabel.y + titleLabel.height + units.gu(1);\n';
963− } else if (hasArt) {
964− implicitHeight += 'artShapeLoader.height;\n';
965− } else {
966− implicitHeight = '';
967− }
968− } else {
969− implicitHeight = '';
970− }
971−
972− // Close the AbstractButton
973− code += implicitHeight + '}\n';
974−
975− return code;
976−}
977−
978−function createCardComponent(parent, template, components, isCardTool, artShapeStyle, categoryLayout, identifier) {
979− var imports = 'import QtQuick 2.4; \n\
980− import Ubuntu.Components 1.3; \n\
981− import Ubuntu.Settings.Components 0.1; \n\
982− import Dash 0.1;\n\
983− import Utils 0.1;\n';
984− var card = cardString(template, components, isCardTool, artShapeStyle, categoryLayout);
985− var code = imports + 'Component {\n' + card + '}\n';
986−
987− try {
988− return Qt.createQmlObject(code, parent, identifier);
989− } catch (e) {
990− console.error("ERROR: Invalid component created.");
991− console.error("Template:");
992− console.error(JSON.stringify(template));
993− console.error("Components:");
994− console.error(JSON.stringify(components));
995− console.error("Code:");
996− console.error(code);
997− throw e;
998− }
999−}
plugins/Dash/CardCreatorCache.qmldeleted−40
@@ -1,40 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−pragma Singleton
18−import QtQuick 2.4
19−import "CardCreator.js" as CardCreator
20−
21−QtObject {
22− id: root
23−
24− property var cache: new Object();
25−
26− function getCardComponent(template, components, isCardTool, artShapeStyle, categoryLayout) {
27− if (template === undefined || components === undefined)
28− return undefined;
29−
30− var tString = JSON.stringify(template);
31− var cString = JSON.stringify(components);
32− var allString = tString + cString + isCardTool + artShapeStyle + categoryLayout;
33− var component = cache[allString];
34− if (component === undefined) {
35− component = CardCreator.createCardComponent(root, template, components, isCardTool, artShapeStyle, categoryLayout, allString);
36− cache[allString] = component;
37− }
38− return component;
39− }
40−}
plugins/Dash/CardSocialActions.qmldeleted−94
@@ -1,94 +0,0 @@
1−/*
2− * Copyright 2016 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.4
18−import QtQuick.Layouts 1.1
19−import Ubuntu.Components 1.3
20−
21−Column {
22− id: socialActions
23− spacing: units.gu(0.5)
24−
25− property alias model: repeater.model
26− property color color: theme.palette.normal.baseText
27−
28− signal clicked(var actionId)
29−
30− Rectangle {
31− id: divider
32− visible: repeater.count > 0
33− anchors {
34− left: parent.left;
35− right: parent.right;
36− leftMargin:units.dp(1);
37− rightMargin: units.dp(1);
38− }
39− color: Qt.darker(theme.palette.normal.background, 1.12)
40− height: visible ? units.dp(1) : 0
41− }
42−
43− Row {
44− id: row
45− anchors {
46− left: parent.left
47− right: parent.right
48− leftMargin: units.gu(1)
49− rightMargin: units.gu(1)
50− }
51− spacing: units.gu(2)
52− readonly property int visibleItems: {
53− if (width <= units.gu(12)) // small card
54− return 2;
55− else if (width <= units.gu(21)) // medium card
56− return 3;
57− else // large or horizontal card
58− return 4;
59− }
60−
61− Repeater {
62− id: repeater
63− delegate: Loader {
64− height: units.gu(2)
65− active: index < row.visibleItems
66− sourceComponent: AbstractButton {
67− objectName: "delegate" + index
68− height: units.gu(2)
69− width: icon.width
70− Icon {
71− id: icon
72− objectName: "icon"
73−
74− readonly property url urlIcon: modelData && modelData["icon"] || ""
75− readonly property url urlTemporaryIcon: "temporaryIcon" in modelData && modelData["temporaryIcon"] || ""
76−
77− height: units.gu(2)
78− // FIXME Workaround for bug https://bugs.launchpad.net/ubuntu/+source/ubuntu-ui-toolkit/+bug/1421293
79− width: implicitWidth > 0 && implicitHeight > 0 ? (implicitWidth / implicitHeight * height) : implicitWidth
80− source: urlIcon
81− color: socialActions.color
82−
83− onUrlIconChanged: {
84− if (urlIcon) source = urlIcon
85− }
86− }
87−
88− onClicked: socialActions.clicked(modelData["id"]);
89− onPressedChanged: if (pressed && icon.urlTemporaryIcon != "") icon.source = icon.urlTemporaryIcon
90− }
91− }
92− }
93− }
94−}
plugins/Dash/CroppedImageMinimumSourceSize.qmldeleted−38
@@ -1,38 +0,0 @@
1−/*
2− * Copyright (C) 2014, 2015 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.4
18−
19−Image {
20− id: root
21−
22− fillMode: Image.PreserveAspectCrop
23−
24− property bool useHeight: false
25− function updateUseHeight()
26− {
27− // Do not turn into a binding since otherwise the qml
28− // engine complains about binding loops
29− useHeight = (implicitWidth / implicitHeight) > (width / height);
30− }
31−
32− onHeightChanged: updateUseHeight();
33− onWidthChanged: updateUseHeight();
34− onImplicitHeightChanged: updateUseHeight();
35− onImplicitWidthChanged: updateUseHeight();
36−
37− sourceSize: useHeight ? Qt.size(0, height) : Qt.size(width, 0)
38−}
plugins/Dash/DashAudioPlayer.qmldeleted−120
@@ -1,120 +0,0 @@
1−/*
2− * Copyright (C) 2015 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 Singleton
18−import QtQuick 2.4
19−import QtMultimedia 5.6
20−import Dash 0.1
21−
22−QtObject {
23− id: root
24− readonly property real progress: priv.audio ? priv.audio.position / priv.audio.duration : 0.0
25− readonly property bool playing: priv.audio ? priv.audio.playbackState === Audio.PlayingState : false
26− readonly property bool paused: priv.audio ? priv.audio.playbackState === Audio.PausedState : false
27− readonly property bool stopped: priv.audio ? priv.audio.playbackState === Audio.StoppedState : true
28− readonly property int position: priv.audio ? priv.audio.position : 0
29− readonly property url currentSource: priv.audio ? priv.audio.playlist.currentItemSource : ""
30− readonly property Playlist playlist: priv.audio ? priv.audio.playlist : null
31−
32− function playSource(newSource, newPlaylist) {
33− if (!priv.audio) {
34− console.info("DashAudioPlayer: creating player");
35− priv.audio = priv.audioComponent.createObject(root);
36− }
37− stop();
38− priv.audio.playlist.clear();
39− if (newPlaylist) {
40− // Look for newSource in newPlaylist
41− var sourceIndex = -1;
42− for (var i in newPlaylist) {
43− if (AudioUrlComparer.compare(newSource, newPlaylist[i])) {
44− sourceIndex = i;
45− break;
46− }
47− }
48− var urls = [];
49− if (sourceIndex === -1 && newSource != "") {
50− // If the playing song is not in the playlist, add it
51− urls.push(newSource);
52− sourceIndex = 0;
53− }
54− for (var i in newPlaylist) {
55− urls.push(newPlaylist[i]);
56− }
57− priv.audio.playlist.addItems(urls);
58− priv.audio.playlist.currentIndex = sourceIndex;
59− } else {
60− priv.audio.playlist.addItem(newSource);
61− priv.audio.playlist.currentIndex = 0;
62− }
63− play();
64− }
65−
66− function stop() {
67− if (priv.audio) {
68− priv.audio.stop();
69− }
70− }
71−
72− function play() {
73− if (priv.audio) {
74− priv.audio.play();
75− }
76− }
77−
78− function pause() {
79− if (priv.audio) {
80− priv.audio.pause();
81− }
82− }
83−
84− property QtObject priv: QtObject {
85− id: priv
86− property Audio audio: null
87− property Component audioComponent: Component {
88− Audio {
89− playlist: Playlist {
90− objectName: "playlist"
91− }
92− /* Remove player in case of error so it gets recreated next time
93− * we need it. Happens if backend media player restarted, for
94− * instance. qtmultimedia should probably handle this
95− * transparently (LP: #1616425).
96− */
97− onError: {
98− console.warn("DashAudioPlayer: error event (" +
99− priv.audio.errorString + "), destroying");
100− priv.audio.destroy();
101− }
102− }
103− }
104− }
105−
106− function lengthToString(s) {
107− if (typeof(s) !== "number" || s < 0) return "";
108−
109− var sec = "" + s % 60;
110− if (sec.length == 1) sec = "0" + sec;
111− var hour = Math.floor(s / 3600);
112− if (hour < 1) {
113− return Math.floor(s / 60) + ":" + sec;
114− } else {
115− var min = "" + Math.floor(s / 60) % 60;
116− if (min.length == 1) min = "0" + min;
117− return hour + ":" + min + ":" + sec;
118− }
119− }
120−}
plugins/Dash/ScopeStyle.qmldeleted−102
@@ -1,102 +0,0 @@
1−/*
2− * Copyright 2014 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be 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.4
18−import Utils 0.1
19−import GSettings 1.0
20−import Ubuntu.Components 1.3
21−import Ubuntu.Components.Themes 1.3
22−
23−/*! \brief Helper for processing scope customization options.
24−
25− It will take the customizations object passed by the scope and
26− process it to provide the scope UI with data such as colors or
27− image paths.
28− */
29−
30−QtObject {
31−
32− property var gsettings: GSettings {
33− schema.id: "com.ubuntu.touch.system-settings"
34− }
35−
36− /// Style object passed from the scope
37− property var style: Object()
38−
39− /// Color used for text and symbolic icons
40− property color foreground: gsettings.dashBackground ? "white" : ("foreground-color" in style ? style["foreground-color"] : d.defaultDark)
41−
42− /// Luminance of the foreground color
43− readonly property real foregroundLuminance: foreground ? Style.luminance(foreground) : Style.luminance(d.defaultDark)
44−
45− /// Color used for the overall background
46− property color background: "background-color" in style ? style["background-color"] : gsettings.dashBackground ? "transparent" : "#00f5f5f5"
47−
48− /// Luminance of the background color
49− readonly property real backgroundLuminance: background ? Style.luminance(background) : Style.luminance(d.defaultLight)
50−
51− /*! \brief Get the most contrasting available color based on luminance
52− *
53− * If background color is transparent, theme provided colors are taken into account
54− */
55− function getTextColor(luminance) {
56− if (Math.abs(foregroundLuminance - luminance) >
57− Math.abs(d.opaqueBackgroundLuminance - luminance)) {
58− return foreground;
59− } else {
60− return d.opaqueBackground;
61− }
62− }
63−
64− /// Source of the logo image for the header
65− readonly property url headerLogo: "logo" in d.headerStyle ? d.headerStyle["logo"] : ""
66−
67− /// Background style for the header
68− property url headerBackground: "background" in d.headerStyle ? d.headerStyle["background"] : gsettings.dashBackground ? "color:///transparent" : "color:///#ffffff"
69−
70− /// Foreground color for the header
71− property color headerForeground: "foreground-color" in d.headerStyle ? d.headerStyle["foreground-color"] : gsettings.dashBackground ? "white" : foreground
72−
73− /// Color of the header divider
74− property color headerDividerColor: "divider-color" in d.headerStyle ? d.headerStyle["divider-color"] : gsettings.dashBackground ? "transparent" : "#e0e0e0"
75−
76− /// Background style for the navigation
77− property url navigationBackground: "navigation-background" in d.headerStyle ? d.headerStyle["navigation-background"] : gsettings.dashBackground ? "color:///white" : "color:///#f5f5f5"
78−
79− /// Color of the primary preview button
80− readonly property color previewButtonColor: "preview-button-color" in style ? style["preview-button-color"] : theme.palette.normal.positive
81−
82− //! @cond
83− property var d: QtObject {
84− // FIXME: should be taken from the theme
85− readonly property color defaultLight: "white"
86− readonly property color defaultDark: UbuntuColors.darkGrey
87− readonly property real defaultLightLuminance: Style.luminance(defaultLight)
88− readonly property real defaultDarkLuminance: Style.luminance(defaultDark)
89−
90− readonly property color opaqueBackground: {
91− background.a > 0 ?
92− background :
93− (Math.abs(foregroundLuminance - defaultLightLuminance) >
94− Math.abs(foregroundLuminance - defaultDarkLuminance)) ?
95− defaultLight : defaultDark
96− }
97− readonly property real opaqueBackgroundLuminance: Style.luminance(opaqueBackground)
98−
99− readonly property var headerStyle: "page-header" in style ? style["page-header"] : { }
100− }
101− //! @endcond
102−}
plugins/Dash/abstractdashview.cppdeleted−359
@@ -1,359 +0,0 @@
1−/*
2− * Copyright (C) 2013, 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "abstractdashview.h"
18−
19−#include <private/qquickitem_p.h>
20−
21−AbstractDashView::AbstractDashView()
22− : m_delegateModel(nullptr)
23− , m_asyncRequestedIndex(-1)
24− , m_columnSpacing(0)
25− , m_rowSpacing(0)
26− , m_buffer(320) // Same value as QML_VIEW_DEFAULTCACHEBUFFER in qquickitemview.cpp (Qt 5.6)
27− , m_displayMarginBeginning(0)
28− , m_displayMarginEnd(0)
29− , m_needsRelayout(false)
30− , m_delegateValidated(false)
31− , m_implicitHeightDirty(false)
32−{
33− connect(this, &AbstractDashView::widthChanged, this, &AbstractDashView::relayout);
34− connect(this, &AbstractDashView::heightChanged, this, &AbstractDashView::onHeightChanged);
35−}
36−
37−QAbstractItemModel *AbstractDashView::model() const
38−{
39− return m_delegateModel ? m_delegateModel->model().value<QAbstractItemModel *>() : nullptr;
40−}
41−
42−void AbstractDashView::setModel(QAbstractItemModel *model)
43−{
44− if (model != this->model()) {
45− if (!m_delegateModel) {
46− createDelegateModel();
47− } else {
48− disconnect(m_delegateModel, &QQmlDelegateModel::modelUpdated, this, &AbstractDashView::onModelUpdated);
49− }
50− m_delegateModel->setModel(QVariant::fromValue<QAbstractItemModel *>(model));
51− connect(m_delegateModel, &QQmlDelegateModel::modelUpdated, this, &AbstractDashView::onModelUpdated);
52−
53− cleanupExistingItems();
54−
55− Q_EMIT modelChanged();
56− polish();
57− }
58−}
59−
60−QQmlComponent *AbstractDashView::delegate() const
61−{
62− return m_delegateModel ? m_delegateModel->delegate() : nullptr;
63−}
64−
65−void AbstractDashView::setDelegate(QQmlComponent *delegate)
66−{
67− if (delegate != this->delegate()) {
68− if (!m_delegateModel) {
69− createDelegateModel();
70− }
71−
72− cleanupExistingItems();
73−
74− m_delegateModel->setDelegate(delegate);
75−
76− Q_EMIT delegateChanged();
77− m_delegateValidated = false;
78− polish();
79− }
80−}
81−
82−qreal AbstractDashView::columnSpacing() const
83−{
84− return m_columnSpacing;
85−}
86−
87−void AbstractDashView::setColumnSpacing(qreal columnSpacing)
88−{
89− if (columnSpacing != m_columnSpacing) {
90− m_columnSpacing = columnSpacing;
91− Q_EMIT columnSpacingChanged();
92−
93− if (isComponentComplete()) {
94− relayout();
95− }
96− }
97−}
98−
99−qreal AbstractDashView::rowSpacing() const
100−{
101− return m_rowSpacing;
102−}
103−
104−void AbstractDashView::setRowSpacing(qreal rowSpacing)
105−{
106− if (rowSpacing != m_rowSpacing) {
107− m_rowSpacing = rowSpacing;
108− Q_EMIT rowSpacingChanged();
109−
110− if (isComponentComplete()) {
111− relayout();
112− }
113− }
114−}
115−
116−int AbstractDashView::cacheBuffer() const
117−{
118− return m_buffer;
119−}
120−
121−void AbstractDashView::setCacheBuffer(int buffer)
122−{
123− if (buffer < 0) {
124− qmlInfo(this) << "Cannot set a negative cache buffer";
125− return;
126− }
127−
128− if (m_buffer != buffer) {
129− m_buffer = buffer;
130− if (isComponentComplete()) {
131− polish();
132− }
133− emit cacheBufferChanged();
134− }
135−}
136−
137−qreal AbstractDashView::displayMarginBeginning() const
138−{
139− return m_displayMarginBeginning;
140−}
141−
142−void AbstractDashView::setDisplayMarginBeginning(qreal begin)
143−{
144− if (m_displayMarginBeginning == begin)
145− return;
146− m_displayMarginBeginning = begin;
147− if (isComponentComplete()) {
148− polish();
149− }
150− emit displayMarginBeginningChanged();
151−}
152−
153−qreal AbstractDashView::displayMarginEnd() const
154−{
155− return m_displayMarginEnd;
156−}
157−
158−void AbstractDashView::setDisplayMarginEnd(qreal end)
159−{
160− if (m_displayMarginEnd == end)
161− return;
162− m_displayMarginEnd = end;
163− if (isComponentComplete()) {
164− polish();
165− }
166− emit displayMarginEndChanged();
167−}
168−
169−void AbstractDashView::createDelegateModel()
170−{
171− m_delegateModel = new QQmlDelegateModel(qmlContext(this), this);
172− connect(m_delegateModel, &QQmlDelegateModel::createdItem, this, &AbstractDashView::itemCreated);
173− if (isComponentComplete())
174− m_delegateModel->componentComplete();
175−}
176−
177−void AbstractDashView::refill()
178−{
179− if (!isComponentComplete() || height() < 0) {
180− return;
181− }
182−
183− const qreal from = -m_displayMarginBeginning;
184− const qreal to = height() + m_displayMarginEnd;
185− const qreal bufferFrom = from - m_buffer;
186− const qreal bufferTo = to + m_buffer;
187−
188− bool added = addVisibleItems(from, to, false);
189− bool removed = removeNonVisibleItems(bufferFrom, bufferTo);
190− added |= addVisibleItems(bufferFrom, bufferTo, true);
191−
192− if (added || removed) {
193− m_implicitHeightDirty = true;
194− polish();
195− }
196−}
197−
198−bool AbstractDashView::addVisibleItems(qreal fillFromY, qreal fillToY, bool asynchronous)
199−{
200− if (fillToY <= fillFromY)
201− return false;
202−
203− if (!delegate())
204− return false;
205−
206− if (m_delegateModel->count() == 0)
207− return false;
208−
209− int modelIndex;
210− qreal yPos;
211− findBottomModelIndexToAdd(&modelIndex, &yPos);
212− bool changed = false;
213− while (modelIndex < m_delegateModel->count() && yPos <= fillToY) {
214− if (!createItem(modelIndex, asynchronous))
215− break;
216−
217− changed = true;
218− findBottomModelIndexToAdd(&modelIndex, &yPos);
219− }
220−
221− findTopModelIndexToAdd(&modelIndex, &yPos);
222− while (modelIndex >= 0 && yPos > fillFromY) {
223− if (!createItem(modelIndex, asynchronous))
224− break;
225−
226− changed = true;
227− findTopModelIndexToAdd(&modelIndex, &yPos);
228− }
229−
230− return changed;
231−}
232−
233−QQuickItem *AbstractDashView::createItem(int modelIndex, bool asynchronous)
234−{
235− if (asynchronous && m_asyncRequestedIndex != -1)
236− return nullptr;
237−
238− m_asyncRequestedIndex = -1;
239− QObject* object = m_delegateModel->object(modelIndex, asynchronous ? QQmlIncubator::Asynchronous : QQmlIncubator::AsynchronousIfNested);
240− QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
241− if (!item) {
242− if (object) {
243− m_delegateModel->release(object);
244− if (!m_delegateValidated) {
245− m_delegateValidated = true;
246− QObject* delegateObj = delegate();
247− qmlInfo(delegateObj ? delegateObj : this) << "Delegate must be of Item type";
248− }
249− } else {
250− m_asyncRequestedIndex = modelIndex;
251− }
252− return nullptr;
253− } else {
254− QQuickItemPrivate::get(item)->addItemChangeListener(this, QQuickItemPrivate::Geometry);
255− addItemToView(modelIndex, item);
256− return item;
257− }
258−}
259−
260−void AbstractDashView::releaseItem(QQuickItem *item)
261−{
262− QQuickItemPrivate::get(item)->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
263− QQmlDelegateModel::ReleaseFlags flags = m_delegateModel->release(item);
264− if (flags & QQmlDelegateModel::Destroyed) {
265− item->setParentItem(nullptr);
266− }
267−}
268−
269−void AbstractDashView::setImplicitHeightDirty()
270−{
271− m_implicitHeightDirty = true;
272−}
273−
274−void AbstractDashView::itemCreated(int modelIndex, QObject *object)
275−{
276− QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
277− if (!item) {
278− qWarning() << "AbstractDashView::itemCreated got a non item for index" << modelIndex;
279− return;
280− }
281− item->setParentItem(this);
282−
283− // We only need to call createItem if we are here because of an asynchronous generation
284− // otherwise we are in this slot because createItem is creating the item sync
285− // and thus we don't need to call createItem again, nor need to set m_implicitHeightDirty
286− // and call polish because the sync createItem was called from addVisibleItems that
287− // is called from refill that will already do those if an item was added
288− if (modelIndex == m_asyncRequestedIndex) {
289− createItem(modelIndex, false);
290− m_implicitHeightDirty = true;
291− polish();
292− }
293−}
294−
295−void AbstractDashView::onModelUpdated(const QQmlChangeSet &changeSet, bool reset)
296−{
297− if (reset) {
298− cleanupExistingItems();
299− } else {
300− processModelRemoves(changeSet.removes());
301−
302− // The current AbstractDashViews do not support insertions that are not at the end
303− // so reset if that happens
304− Q_FOREACH(const QQmlChangeSet::Change insert, changeSet.inserts()) {
305− if (insert.index < m_delegateModel->count() - 1) {
306− cleanupExistingItems();
307− break;
308− }
309− }
310− }
311− polish();
312−}
313−
314−
315−void AbstractDashView::relayout()
316−{
317− m_needsRelayout = true;
318− polish();
319−}
320−
321−void AbstractDashView::onHeightChanged()
322−{
323− polish();
324−}
325−
326−void AbstractDashView::updatePolish()
327−{
328− if (!model())
329− return;
330−
331− if (m_needsRelayout) {
332− doRelayout();
333− m_needsRelayout = false;
334− m_implicitHeightDirty = true;
335− }
336−
337− refill();
338−
339− const qreal from = -m_displayMarginBeginning;
340− const qreal to = height() + m_displayMarginEnd;
341− updateItemCulling(from, to);
342−
343− if (m_implicitHeightDirty) {
344− calculateImplicitHeight();
345− m_implicitHeightDirty = false;
346− }
347−}
348−
349−void AbstractDashView::componentComplete()
350−{
351− if (m_delegateModel)
352− m_delegateModel->componentComplete();
353−
354− QQuickItem::componentComplete();
355−
356− m_needsRelayout = true;
357−
358− polish();
359−}
plugins/Dash/abstractdashview.hdeleted−128
@@ -1,128 +0,0 @@
1−/*
2− * Copyright (C) 2013, 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef ABSTRACTDASHVIEW_H
18−#define ABSTRACTDASHVIEW_H
19−
20−#include <QQuickItem>
21−
22−class QAbstractItemModel;
23−class QQmlComponent;
24−
25−#include <private/qqmldelegatemodel_p.h>
26−#include <private/qquickitemchangelistener_p.h>
27−#include <qqmlinfo.h>
28−
29−class AbstractDashView : public QQuickItem, public QQuickItemChangeListener
30−{
31− Q_OBJECT
32−
33− Q_PROPERTY(QAbstractItemModel *model READ model WRITE setModel NOTIFY modelChanged)
34− Q_PROPERTY(QQmlComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
35− Q_PROPERTY(qreal columnSpacing READ columnSpacing WRITE setColumnSpacing NOTIFY columnSpacingChanged)
36− Q_PROPERTY(qreal rowSpacing READ rowSpacing WRITE setRowSpacing NOTIFY rowSpacingChanged)
37− Q_PROPERTY(int cacheBuffer READ cacheBuffer WRITE setCacheBuffer NOTIFY cacheBufferChanged)
38− Q_PROPERTY(qreal displayMarginBeginning READ displayMarginBeginning
39− WRITE setDisplayMarginBeginning
40− NOTIFY displayMarginBeginningChanged)
41− Q_PROPERTY(qreal displayMarginEnd READ displayMarginEnd
42− WRITE setDisplayMarginEnd
43− NOTIFY displayMarginEndChanged)
44−
45−friend class VerticalJournalTest;
46−friend class HorizontalJournalTest;
47−friend class OrganicGridTest;
48−
49−public:
50− AbstractDashView();
51−
52− QAbstractItemModel *model() const;
53− void setModel(QAbstractItemModel *model);
54−
55− QQmlComponent *delegate() const;
56− void setDelegate(QQmlComponent *delegate);
57−
58− qreal columnSpacing() const;
59− void setColumnSpacing(qreal columnSpacing);
60−
61− qreal rowSpacing() const;
62− void setRowSpacing(qreal rowSpacing);
63−
64− int cacheBuffer() const;
65− void setCacheBuffer(int);
66−
67− qreal displayMarginBeginning() const;
68− void setDisplayMarginBeginning(qreal);
69−
70− qreal displayMarginEnd() const;
71− void setDisplayMarginEnd(qreal);
72−
73−Q_SIGNALS:
74− void modelChanged();
75− void delegateChanged();
76− void columnSpacingChanged();
77− void rowSpacingChanged();
78− void cacheBufferChanged();
79− void displayMarginBeginningChanged();
80− void displayMarginEndChanged();
81−
82−protected Q_SLOTS:
83− void relayout();
84−
85−protected:
86− void updatePolish() override;
87− void componentComplete() override;
88−
89− void releaseItem(QQuickItem *item);
90− void setImplicitHeightDirty();
91−
92−private Q_SLOTS:
93− void itemCreated(int modelIndex, QObject *object);
94− void onModelUpdated(const QQmlChangeSet &changeSet, bool reset);
95− void onHeightChanged();
96−
97−private:
98− void createDelegateModel();
99− void refill();
100− bool addVisibleItems(qreal fillFromY, qreal fillToY, bool asynchronous);
101− QQuickItem *createItem(int modelIndex, bool asynchronous);
102−
103− virtual void findBottomModelIndexToAdd(int *modelIndex, qreal *yPos) = 0;
104− virtual void findTopModelIndexToAdd(int *modelIndex, qreal *yPos) = 0;
105− virtual void addItemToView(int modelIndex, QQuickItem *item) = 0;
106− virtual bool removeNonVisibleItems(qreal bufferFromY, qreal bufferToY) = 0;
107− virtual void cleanupExistingItems() = 0;
108− virtual void doRelayout() = 0;
109− virtual void updateItemCulling(qreal visibleFromY, qreal visibleToY) = 0;
110− virtual void calculateImplicitHeight() = 0;
111− virtual void processModelRemoves(const QVector<QQmlChangeSet::Change> &removes) = 0;
112−
113− QQmlDelegateModel *m_delegateModel;
114−
115− // Index we are waiting because we requested it asynchronously
116− int m_asyncRequestedIndex;
117−
118− int m_columnSpacing;
119− int m_rowSpacing;
120− int m_buffer;
121− qreal m_displayMarginBeginning;
122− qreal m_displayMarginEnd;
123− bool m_needsRelayout;
124− bool m_delegateValidated;
125− bool m_implicitHeightDirty;
126−};
127−
128−#endif
plugins/Dash/graphics/music_progress_bg.pngdeleted

Binary file not shown.

plugins/Dash/horizontaljournal.cppdeleted−239
@@ -1,239 +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−/*
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−#include <qqmlinfo.h>
30−#include <private/qqmldelegatemodel_p.h>
31−#include <private/qquickitem_p.h>
32−
33−HorizontalJournal::HorizontalJournal()
34− : m_firstVisibleIndex(-1)
35− , m_rowHeight(0)
36−{
37−}
38−
39−qreal HorizontalJournal::rowHeight() const
40−{
41− return m_rowHeight;
42−}
43−
44−void HorizontalJournal::setRowHeight(qreal rowHeight)
45−{
46− if (rowHeight != m_rowHeight) {
47− m_rowHeight = rowHeight;
48− Q_EMIT rowHeightChanged();
49−
50− if (isComponentComplete()) {
51− Q_FOREACH(QQuickItem *item, m_visibleItems) {
52− item->setHeight(rowHeight);
53− }
54− relayout();
55− }
56− }
57−}
58−
59−void HorizontalJournal::findBottomModelIndexToAdd(int *modelIndex, qreal *yPos)
60−{
61− if (m_visibleItems.isEmpty()) {
62− *modelIndex = 0;
63− *yPos = 0;
64− } else {
65− *modelIndex = m_firstVisibleIndex + m_visibleItems.count();
66− if (m_lastInRowIndexPosition.contains(*modelIndex - 1)) {
67− *yPos = m_visibleItems.last()->y() + m_rowHeight + rowSpacing();
68− } else {
69− *yPos = m_visibleItems.last()->y();
70− }
71− }
72−}
73−
74−void HorizontalJournal::findTopModelIndexToAdd(int *modelIndex, qreal *yPos)
75−{
76− if (m_visibleItems.isEmpty()) {
77− *modelIndex = -1;
78− *yPos = INT_MIN;
79− } else {
80− *modelIndex = m_firstVisibleIndex - 1;
81− if (m_lastInRowIndexPosition.contains(*modelIndex)) {
82− *yPos = m_visibleItems.first()->y() - rowSpacing() - m_rowHeight;
83− } else {
84− *yPos = m_visibleItems.first()->y();
85− }
86− }
87−}
88−
89−bool HorizontalJournal::removeNonVisibleItems(qreal bufferFromY, qreal bufferToY)
90−{
91− bool changed = false;
92−
93− while (!m_visibleItems.isEmpty() && m_visibleItems.first()->y() + m_rowHeight < bufferFromY) {
94− releaseItem(m_visibleItems.takeFirst());
95− changed = true;
96− m_firstVisibleIndex++;
97− }
98−
99− while (!m_visibleItems.isEmpty() && m_visibleItems.last()->y() > bufferToY) {
100− releaseItem(m_visibleItems.takeLast());
101− changed = true;
102− m_lastInRowIndexPosition.remove(m_firstVisibleIndex + m_visibleItems.count());
103− }
104−
105− if (m_visibleItems.isEmpty()) {
106− m_firstVisibleIndex = -1;
107− }
108−
109− return changed;
110−}
111−
112−void HorizontalJournal::addItemToView(int modelIndex, QQuickItem *item)
113−{
114− if (item->height() != m_rowHeight) {
115− qWarning() << "Item" << modelIndex << "height is not the one that the rowHeight mandates, resetting it";
116− item->setHeight(m_rowHeight);
117− }
118−
119− if (m_visibleItems.isEmpty()) {
120− Q_ASSERT(modelIndex == 0);
121− item->setY(0);
122− item->setX(0);
123− m_visibleItems << item;
124− m_firstVisibleIndex = 0;
125− } else {
126− // modelIndex has to be either m_firstVisibleIndex - 1 or m_firstVisibleIndex + m_visibleItems.count()
127− if (modelIndex == m_firstVisibleIndex + m_visibleItems.count()) {
128− QQuickItem *lastItem = m_visibleItems.last();
129− if (lastItem->x() + lastItem->width() + columnSpacing() + item->width() <= width()) {
130− // Fits in the row
131− item->setY(lastItem->y());
132− item->setX(lastItem->x() + lastItem->width() + columnSpacing());
133− } else {
134− // Starts a new row
135− item->setY(lastItem->y() + m_rowHeight + rowSpacing());
136− item->setX(0);
137− m_lastInRowIndexPosition[modelIndex - 1] = lastItem->x();
138− }
139− m_visibleItems << item;
140− } else if (modelIndex == m_firstVisibleIndex - 1) {
141− QQuickItem *firstItem = m_visibleItems.first();
142− if (m_lastInRowIndexPosition.contains(modelIndex)) {
143− // It is the last item of its row, so start a new one since we're going back
144− item->setY(firstItem->y() - rowSpacing() - m_rowHeight);
145− item->setX(m_lastInRowIndexPosition[modelIndex]);
146− } else {
147− item->setY(firstItem->y());
148− item->setX(firstItem->x() - columnSpacing() - item->width());
149− }
150− m_firstVisibleIndex = modelIndex;
151− m_visibleItems.prepend(item);
152− } else {
153− qWarning() << "HorizontalJournal::addItemToView - Got unexpected modelIndex"
154− << modelIndex << m_firstVisibleIndex << m_visibleItems.count();
155− }
156− }
157−}
158−
159−void HorizontalJournal::cleanupExistingItems()
160−{
161− // Cleanup the existing items
162− Q_FOREACH(QQuickItem *item, m_visibleItems)
163− releaseItem(item);
164− m_visibleItems.clear();
165− m_lastInRowIndexPosition.clear();
166− m_firstVisibleIndex = -1;
167− setImplicitHeightDirty();
168−}
169−
170−void HorizontalJournal::calculateImplicitHeight()
171−{
172− if (m_firstVisibleIndex >= 0) {
173− const int nIndexes = m_firstVisibleIndex + m_visibleItems.count();
174− const double bottomMostY = m_visibleItems.last()->y() + m_rowHeight;
175− const double averageHeight = bottomMostY / nIndexes;
176− setImplicitHeight(bottomMostY + averageHeight * (model()->rowCount() - nIndexes));
177− } else {
178− setImplicitHeight(0);
179− }
180−}
181−
182−void HorizontalJournal::processModelRemoves(const QVector<QQmlChangeSet::Change> &removes)
183−{
184− Q_FOREACH(const QQmlChangeSet::Change remove, removes) {
185− for (int i = remove.count - 1; i >= 0; --i) {
186− const int indexToRemove = remove.index + i;
187− // We only support removing from the end so
188− // any of the last items of a column has to be indexToRemove
189− const int lastIndex = m_firstVisibleIndex + m_visibleItems.count() - 1;
190− if (indexToRemove == lastIndex) {
191− releaseItem(m_visibleItems.takeLast());
192− m_lastInRowIndexPosition.remove(indexToRemove);
193− } else {
194− if (indexToRemove < lastIndex) {
195− qDebug() << "HorizontalJournal only supports removal from the end of the model, resetting instead";
196− cleanupExistingItems();
197− break;
198− } else {
199− setImplicitHeightDirty();
200− }
201− }
202− }
203− }
204− if (m_visibleItems.isEmpty()) {
205− m_firstVisibleIndex = -1;
206− }
207−}
208−
209−
210−void HorizontalJournal::doRelayout()
211−{
212− // If m_firstVisibleIndex is not 0 we need to drop all the delegates
213− // since we can't consistently relayout without the first item being there
214−
215− if (m_firstVisibleIndex == 0) {
216− int i = 0;
217− const QList<QQuickItem*> allItems = m_visibleItems;
218− m_visibleItems.clear();
219− m_lastInRowIndexPosition.clear();
220− Q_FOREACH(QQuickItem *item, allItems) {
221− addItemToView(i, item);
222− ++i;
223− }
224− } else {
225− Q_FOREACH(QQuickItem *item, m_visibleItems) {
226− releaseItem(item);
227− }
228− m_visibleItems.clear();
229− m_lastInRowIndexPosition.clear();
230− m_firstVisibleIndex = -1;
231− }
232−}
233−
234−void HorizontalJournal::updateItemCulling(qreal visibleFromY, qreal visibleToY)
235−{
236− Q_FOREACH(QQuickItem *item, m_visibleItems) {
237− QQuickItemPrivate::get(item)->setCulled(item->y() + m_rowHeight <= visibleFromY || item->y() >= visibleToY);
238− }
239−}
plugins/Dash/horizontaljournal.hdeleted−63
@@ -1,63 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef HORIZONTALJOURNAL_H
18−#define HORIZONTALJOURNAL_H
19−
20−#include "abstractdashview.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 AbstractDashView
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 addItemToView(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− void processModelRemoves(const QVector<QQmlChangeSet::Change> &removes) override;
56−
57− int m_firstVisibleIndex;
58− QList<QQuickItem*> m_visibleItems;
59− QMap<int, double> m_lastInRowIndexPosition;
60− int m_rowHeight;
61−};
62−
63−#endif
plugins/Dash/listviewwithpageheader.cppdeleted−1396
@@ -1,1396 +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−/*
18− * Some documentation on how this thing works:
19− *
20− * A flickable has two very important concepts that define the top and
21− * height of the flickable area.
22− * The top is returned in minYExtent()
23− * The height is set using setContentHeight()
24− * By changing those two values we can make the list grow up or down
25− * as needed. e.g. if we are in the middle of the list
26− * and something that is above the viewport grows, since we do not
27− * want to change the viewport because of that we just adjust the
28− * minYExtent so that the list grows up.
29− *
30− * The implementation on the list relies on the delegateModel doing
31− * most of the instantiation work. You call createItem() when you
32− * need to create an item asking for it async or not. If returns null
33− * it means the item will be created async and the model will call the
34− * itemCreated slot with the item.
35− *
36− * updatePolish is the central point of dispatch for the work of the
37− * class. It is called by the scene graph just before drawing the class.
38− * In it we:
39− * * Make sure all items are positioned correctly
40− * * Add/Remove items if needed
41− * * Update the content height if it was dirty
42− *
43− * m_visibleItems contains all the items we have created at the moment.
44− * Actually not all of them are visible since it includes the ones
45− * in the cache area we create asynchronously to help performance.
46− * The first item in m_visibleItems has the m_firstVisibleIndex in
47− * the model. If you actually want to know what is the first
48− * item in the viewport you have to find the first non culled element
49− * in m_visibleItems
50− *
51− * All the items (except the header) are childs of m_clipItem which
52− * is a child of the contentItem() of the flickable (The contentItem()
53− * is what actually 'moves' in a a flickable). This way
54− * we can implement the clipping needed so we can have the header
55− * shown in the middle of the list over the items without the items
56− * leaking under the header in case it is transparent.
57− *
58− * The first item of m_visibleItems is the one that defines the
59− * positions of all the rest of items (see updatePolish()) and
60− * this is why sometimes we move it even if it's not the item
61− * that has triggered the function (i.e. in itemGeometryChanged())
62− *
63− * m_visibleItems is a list of ListItem. Each ListItem
64− * will contain a item and potentially a sectionItem. The sectionItem
65− * is only there when the list is using sectionDelegate+sectionProperty
66− * and this is the first item of the section. Each ListItem is vertically
67− * layouted with the sectionItem first and then the item.
68− *
69− * For sectioning we also have a section item alone (m_topSectionItem)
70− * that is used for the cases we need to show the sticky section item at
71− * the top of the view.
72− *
73− * Each delegate item has a context property called heightToClip that is
74− * used to communicate to the delegate implementation in case it has to
75− * clip itself because of overlapping with the top sticky section item.
76− * This is an implementation decision since it has been agreed it
77− * is easier to implement the clipping in QML with this info than to
78− * do it at the C++ level.
79− *
80− * Note that minYExtent and height are not always totally accurate, since
81− * we don't have the items created we can't guess their heights
82− * so we can only guarantee the values are correct when the first/last
83− * items of the list are visible, otherwise we just live with good enough
84− * values that make the list scrollable
85− *
86− * There are a few things that are not really implemented or tested properly
87− * which we don't use at the moment like changing the model, changing
88− * the section delegate, having a section delegate that changes its size, etc.
89− * The known missing features are marked with TODOs along the code.
90− */
91−
92−#include "listviewwithpageheader.h"
93−
94−#include <QCoreApplication>
95−#include <QDebug>
96−#include <qqmlinfo.h>
97−#include <qqmlengine.h>
98−#include <private/qqmlcontext_p.h>
99−#include <private/qqmldelegatemodel_p.h>
100−#include <private/qqmlglobal_p.h>
101−#include <private/qquickitem_p.h>
102−#include <private/qquickanimation_p.h>
103−// #include <private/qquickrectangle_p.h>
104−
105−qreal ListViewWithPageHeader::ListItem::height() const
106−{
107− return m_item->height() + (m_sectionItem ? m_sectionItem->height() : 0);
108−}
109−
110−qreal ListViewWithPageHeader::ListItem::y() const
111−{
112− return m_item->y() - (m_sectionItem ? m_sectionItem->height() : 0);
113−}
114−
115−void ListViewWithPageHeader::ListItem::setY(qreal newY)
116−{
117− if (m_sectionItem) {
118− m_sectionItem->setY(newY);
119− m_item->setY(newY + m_sectionItem->height());
120− } else {
121− m_item->setY(newY);
122− }
123−}
124−
125−bool ListViewWithPageHeader::ListItem::culled() const
126−{
127− return QQuickItemPrivate::get(m_item)->culled;
128−}
129−
130−void ListViewWithPageHeader::ListItem::setCulled(bool culled)
131−{
132− QQuickItemPrivate::get(m_item)->setCulled(culled);
133− if (m_sectionItem)
134− QQuickItemPrivate::get(m_sectionItem)->setCulled(culled);
135−}
136−
137−void ListViewWithPageHeader::ListItem::setSectionItem(QQuickItem *sectionItem)
138−{
139− m_sectionItem = sectionItem;
140−}
141−
142−ListViewWithPageHeader::ListViewWithPageHeader()
143− : m_delegateModel(nullptr)
144− , m_asyncRequestedIndex(-1)
145− , m_delegateValidated(false)
146− , m_firstVisibleIndex(-1)
147− , m_minYExtent(0)
148− , m_contentHeightDirty(false)
149− , m_headerItem(nullptr)
150− , m_previousContentY(0)
151− , m_headerItemShownHeight(0)
152− , m_sectionDelegate(nullptr)
153− , m_topSectionItem(nullptr)
154− , m_forceNoClip(false)
155− , m_inLayout(false)
156− , m_inContentHeightKeepHeaderShown(false)
157− , m_cacheBuffer(0)
158−{
159− m_clipItem = new QQuickItem(contentItem());
160−// m_clipItem = new QQuickRectangle(contentItem());
161−// ((QQuickRectangle*)m_clipItem)->setColor(Qt::gray);
162−
163− m_contentYAnimation = new QQuickNumberAnimation(this);
164− m_contentYAnimation->setEasing(QEasingCurve::OutQuad);
165− m_contentYAnimation->setProperty(QStringLiteral("contentY"));
166− m_contentYAnimation->setDuration(200);
167− m_contentYAnimation->setTargetObject(this);
168−
169− connect(contentItem(), &QQuickItem::widthChanged, this, &ListViewWithPageHeader::onContentWidthChanged);
170− connect(this, &ListViewWithPageHeader::contentHeightChanged, this, &ListViewWithPageHeader::onContentHeightChanged);
171− connect(this, &ListViewWithPageHeader::heightChanged, this, &ListViewWithPageHeader::onHeightChanged);
172− connect(m_contentYAnimation, &QQuickNumberAnimation::runningChanged, this, &ListViewWithPageHeader::contentYAnimationRunningChanged);
173−
174− setFlickableDirection(VerticalFlick);
175−}
176−
177−ListViewWithPageHeader::~ListViewWithPageHeader()
178−{
179−}
180−
181−QAbstractItemModel *ListViewWithPageHeader::model() const
182−{
183− return m_delegateModel ? m_delegateModel->model().value<QAbstractItemModel *>() : nullptr;
184−}
185−
186−void ListViewWithPageHeader::setModel(QAbstractItemModel *model)
187−{
188− if (model != this->model()) {
189− if (!m_delegateModel) {
190− createDelegateModel();
191− } else {
192− disconnect(m_delegateModel, &QQmlDelegateModel::modelUpdated, this, &ListViewWithPageHeader::onModelUpdated);
193− }
194− m_delegateModel->setModel(QVariant::fromValue<QAbstractItemModel *>(model));
195− connect(m_delegateModel, &QQmlDelegateModel::modelUpdated, this, &ListViewWithPageHeader::onModelUpdated);
196− Q_EMIT modelChanged();
197− polish();
198− // TODO?
199−// Q_EMIT contentHeightChanged();
200−// Q_EMIT contentYChanged();
201− }
202−}
203−
204−QQmlComponent *ListViewWithPageHeader::delegate() const
205−{
206− return m_delegateModel ? m_delegateModel->delegate() : nullptr;
207−}
208−
209−void ListViewWithPageHeader::setDelegate(QQmlComponent *delegate)
210−{
211− if (delegate != this->delegate()) {
212− if (!m_delegateModel) {
213− createDelegateModel();
214− }
215−
216− // Cleanup the existing items
217− Q_FOREACH(ListItem *item, m_visibleItems)
218− releaseItem(item);
219− m_visibleItems.clear();
220− initializeValuesForEmptyList();
221−
222− m_delegateModel->setDelegate(delegate);
223−
224− Q_EMIT delegateChanged();
225− m_delegateValidated = false;
226− m_contentHeightDirty = true;
227− polish();
228− }
229−}
230−
231−void ListViewWithPageHeader::initializeValuesForEmptyList()
232−{
233− m_firstVisibleIndex = -1;
234− adjustMinYExtent();
235− setContentY(0);
236− m_clipItem->setY(0);
237− if (m_topSectionItem) {
238− QQuickItemPrivate::get(m_topSectionItem)->setCulled(true);
239− }
240−}
241−
242−QQuickItem *ListViewWithPageHeader::header() const
243−{
244− return m_headerItem;
245−}
246−
247−void ListViewWithPageHeader::setHeader(QQuickItem *headerItem)
248−{
249− if (m_headerItem != headerItem) {
250− qreal oldHeaderHeight = 0;
251− qreal oldHeaderY = 0;
252− if (m_headerItem) {
253− oldHeaderHeight = m_headerItem->height();
254− oldHeaderY = m_headerItem->y();
255− m_headerItem->setParentItem(nullptr);
256− QQuickItemPrivate::get(m_headerItem)->removeItemChangeListener(this, QQuickItemPrivate::ImplicitHeight);
257− }
258− m_headerItem = headerItem;
259− if (m_headerItem) {
260− m_headerItem->setParentItem(contentItem());
261− m_headerItem->setZ(1);
262− m_previousHeaderImplicitHeight = m_headerItem->implicitHeight();
263− QQuickItemPrivate::get(m_headerItem)->addItemChangeListener(this, QQuickItemPrivate::ImplicitHeight);
264− }
265− qreal newHeaderHeight = m_headerItem ? m_headerItem->height() : 0;
266− if (!m_visibleItems.isEmpty() && newHeaderHeight != oldHeaderHeight) {
267− headerHeightChanged(newHeaderHeight, oldHeaderHeight, oldHeaderY);
268− polish();
269− m_contentHeightDirty = true;
270− }
271− Q_EMIT headerChanged();
272− }
273−}
274−
275−QQmlComponent *ListViewWithPageHeader::sectionDelegate() const
276−{
277− return m_sectionDelegate;
278−}
279−
280−void ListViewWithPageHeader::setSectionDelegate(QQmlComponent *delegate)
281−{
282− if (delegate != m_sectionDelegate) {
283− // TODO clean existing sections
284−
285− m_sectionDelegate = delegate;
286−
287− m_topSectionItem = getSectionItem(QString(), false /*watchGeometry*/);
288− if (m_topSectionItem) {
289− m_topSectionItem->setZ(3);
290− QQuickItemPrivate::get(m_topSectionItem)->setCulled(true);
291− connect(m_topSectionItem, &QQuickItem::heightChanged, this, &ListViewWithPageHeader::stickyHeaderHeightChanged);
292− }
293−
294− // TODO create sections for existing items
295−
296− Q_EMIT sectionDelegateChanged();
297− Q_EMIT stickyHeaderHeightChanged();
298− }
299−}
300−
301−QString ListViewWithPageHeader::sectionProperty() const
302−{
303− return m_sectionProperty;
304−}
305−
306−void ListViewWithPageHeader::setSectionProperty(const QString &property)
307−{
308− if (property != m_sectionProperty) {
309− m_sectionProperty = property;
310−
311− updateWatchedRoles();
312−
313− // TODO recreate sections
314−
315− Q_EMIT sectionPropertyChanged();
316− }
317−}
318−
319−bool ListViewWithPageHeader::forceNoClip() const
320−{
321− return m_forceNoClip;
322−}
323−
324−void ListViewWithPageHeader::setForceNoClip(bool noClip)
325−{
326− if (noClip != m_forceNoClip) {
327− m_forceNoClip = noClip;
328− updateClipItem();
329− Q_EMIT forceNoClipChanged();
330− }
331−}
332−
333−int ListViewWithPageHeader::stickyHeaderHeight() const
334−{
335− return m_topSectionItem ? m_topSectionItem->height() : 0;
336−}
337−
338−qreal ListViewWithPageHeader::headerItemShownHeight() const
339−{
340− return m_headerItemShownHeight;
341−}
342−
343−int ListViewWithPageHeader::cacheBuffer() const
344−{
345− return m_cacheBuffer;
346−}
347−
348−void ListViewWithPageHeader::setCacheBuffer(int cacheBuffer)
349−{
350− if (cacheBuffer < 0) {
351− qmlInfo(this) << "Cannot set a negative cache buffer";
352− return;
353− }
354−
355− if (cacheBuffer != m_cacheBuffer) {
356− m_cacheBuffer = cacheBuffer;
357− Q_EMIT cacheBufferChanged();
358− polish();
359− }
360−}
361−
362−void ListViewWithPageHeader::positionAtBeginning()
363−{
364− if (m_delegateModel->count() <= 0)
365− return;
366−
367− qreal headerHeight = (m_headerItem ? m_headerItem->height() : 0);
368− if (m_firstVisibleIndex != 0) {
369− // TODO This could be optimized by trying to reuse the interesection
370− // of items that may end up intersecting between the existing
371− // m_visibleItems and the items we are creating in the next loop
372− Q_FOREACH(ListItem *item, m_visibleItems)
373− releaseItem(item);
374− m_visibleItems.clear();
375− m_firstVisibleIndex = -1;
376−
377− // Create the item 0, it will be already correctly positioned at createItem()
378− m_clipItem->setY(0);
379− ListItem *item = createItem(0, false);
380− // Create the subsequent items
381− int modelIndex = 1;
382− qreal pos = item->y() + item->height();
383− const qreal bufferTo = height() + m_cacheBuffer;
384− while (modelIndex < m_delegateModel->count() && pos <= bufferTo) {
385− if (!(item = createItem(modelIndex, false)))
386− break;
387− pos += item->height();
388− ++modelIndex;
389− }
390−
391− m_previousContentY = m_visibleItems.first()->y() - headerHeight;
392− }
393− setContentY(m_visibleItems.first()->y() + m_clipItem->y() - headerHeight);
394− if (m_headerItem) {
395− // TODO This should not be needed and the code that adjust the m_headerItem position
396− // in viewportMoved() should be enough but in some cases we have not found a way to reproduce
397− // yet the code of viewportMoved() fails so here we make sure that at least if we are calling
398− // positionAtBeginning the header item will be correctly positioned
399− m_headerItem->setY(-m_minYExtent);
400− }
401−}
402−
403−static inline bool uFuzzyCompare(qreal r1, qreal r2)
404−{
405− return qFuzzyCompare(r1, r2) || (qFuzzyIsNull(r1) && qFuzzyIsNull(r2));
406−}
407−
408−void ListViewWithPageHeader::showHeader()
409−{
410− if (!m_headerItem)
411− return;
412−
413− const auto to = qMax(-minYExtent(), contentY() - m_headerItem->height() + m_headerItemShownHeight);
414− if (!uFuzzyCompare(to, contentY())) {
415− const bool headerShownByItsOwn = contentY() < m_headerItem->y() + m_headerItem->height();
416− if (headerShownByItsOwn && m_headerItemShownHeight == 0) {
417− // We are not clipping since we are just at the top of the viewport
418− // but because of the showHeader animation we will need to, so
419− // enable the clipping without logically moving the items
420− m_headerItemShownHeight = m_headerItem->y() + m_headerItem->height() - contentY();
421− if (!m_visibleItems.isEmpty()) {
422− updateClipItem();
423− ListItem *firstItem = m_visibleItems.first();
424− firstItem->setY(firstItem->y() - m_headerItemShownHeight);
425− layout();
426− }
427− Q_EMIT headerItemShownHeightChanged();
428− }
429− m_contentYAnimation->setTo(to);
430− contentYAnimationType = ContentYAnimationShowHeader;
431− m_contentYAnimation->start();
432− }
433−}
434−
435−int ListViewWithPageHeader::firstCreatedIndex() const
436−{
437− return m_firstVisibleIndex;
438−}
439−
440−int ListViewWithPageHeader::createdItemCount() const
441−{
442− return m_visibleItems.count();
443−}
444−
445−QQuickItem *ListViewWithPageHeader::item(int modelIndex) const
446−{
447− ListItem *item = itemAtIndex(modelIndex);
448− if (item)
449− return item->m_item;
450− else
451− return nullptr;
452−}
453−
454−bool ListViewWithPageHeader::maximizeVisibleArea(int modelIndex)
455−{
456− ListItem *listItem = itemAtIndex(modelIndex);
457− if (listItem) {
458− return maximizeVisibleArea(listItem, listItem->height());
459− }
460−
461− return false;
462−}
463−
464−bool ListViewWithPageHeader::maximizeVisibleArea(int modelIndex, int itemHeight)
465−{
466− if (itemHeight < 0)
467− return false;
468−
469− ListItem *listItem = itemAtIndex(modelIndex);
470− if (listItem) {
471− return maximizeVisibleArea(listItem, itemHeight + (listItem->sectionItem() ? listItem->sectionItem()->height() : 0));
472− }
473−
474− return false;
475−}
476−
477−bool ListViewWithPageHeader::maximizeVisibleArea(ListItem *listItem, int listItemHeight)
478−{
479− if (listItem) {
480− layout();
481− const auto listItemY = m_clipItem->y() + listItem->y();
482− if (listItemY > contentY() && listItemY + listItemHeight > contentY() + height()) {
483− // we can scroll the list up to show more stuff
484− const auto to = qMin(listItemY, listItemY + listItemHeight - height());
485− m_contentYAnimation->setTo(to);
486− contentYAnimationType = ContentYAnimationMaximizeVisibleArea;
487− m_contentYAnimation->start();
488− } else if ((listItemY < contentY() && listItemY + listItemHeight < contentY() + height()) ||
489− (m_topSectionItem && !listItem->sectionItem() && listItemY - m_topSectionItem->height() < contentY() && listItemY + listItemHeight < contentY() + height()))
490− {
491− // we can scroll the list down to show more stuff
492− auto realVisibleListItemY = listItemY;
493− if (m_topSectionItem) {
494− // If we are showing the top section sticky item and this item doesn't have a section
495− // item we have to make sure to scroll it a bit more so that it is not underlapping
496− // the top section sticky item
497− bool topSectionShown = !QQuickItemPrivate::get(m_topSectionItem)->culled;
498− if (topSectionShown && !listItem->sectionItem()) {
499− realVisibleListItemY -= m_topSectionItem->height();
500− }
501− }
502− const auto to = qMax(realVisibleListItemY, listItemY + listItemHeight - height());
503− m_contentYAnimation->setTo(to);
504− contentYAnimationType = ContentYAnimationMaximizeVisibleArea;
505− m_contentYAnimation->start();
506− }
507− return true;
508− }
509− return false;
510−}
511−
512−qreal ListViewWithPageHeader::minYExtent() const
513−{
514−// qDebug() << "ListViewWithPageHeader::minYExtent" << m_minYExtent;
515− return m_minYExtent;
516−}
517−
518−qreal ListViewWithPageHeader::maxYExtent() const
519−{
520− return height() - contentHeight();
521−}
522−
523−void ListViewWithPageHeader::componentComplete()
524−{
525− if (m_delegateModel)
526− m_delegateModel->componentComplete();
527−
528− QQuickFlickable::componentComplete();
529−
530− polish();
531−}
532−
533−void ListViewWithPageHeader::viewportMoved(Qt::Orientations orient)
534−{
535− // Check we are not being taken down and don't paint anything
536− // TODO Check if we still need this in 5.2
537− // For reproduction just inifnite loop testDash or testDashContent
538− if (!QQmlEngine::contextForObject(this)->parentContext())
539− return;
540−
541− QQuickFlickable::viewportMoved(orient);
542−// qDebug() << "ListViewWithPageHeader::viewportMoved" << contentY();
543− const qreal diff = m_previousContentY - contentY();
544− adjustHeader(diff);
545− m_previousContentY = contentY();
546− layout();
547− polish();
548−}
549−
550−void ListViewWithPageHeader::adjustHeader(qreal diff)
551−{
552− const bool showHeaderAnimationRunning = m_contentYAnimation->isRunning() && contentYAnimationType == ContentYAnimationShowHeader;
553− if (m_headerItem) {
554− const auto oldHeaderItemShownHeight = m_headerItemShownHeight;
555− if (uFuzzyCompare(contentY(), -m_minYExtent) || contentY() > -m_minYExtent) {
556− m_headerItem->setHeight(m_headerItem->implicitHeight());
557− // We are going down (but it's not because of the rebound at the end)
558− // (but the header was not shown by it's own position)
559− // or the header is partially shown and we are not doing a maximizeVisibleArea either
560− const bool scrolledUp = m_previousContentY > contentY();
561− const bool notRebounding = qRound(contentY() + height()) < qRound(contentHeight());
562− const bool notShownByItsOwn = contentY() + diff >= m_headerItem->y() + m_headerItem->height();
563− const bool maximizeVisibleAreaRunning = m_contentYAnimation->isRunning() && contentYAnimationType == ContentYAnimationMaximizeVisibleArea;
564−
565− if (!scrolledUp && (contentY() == -m_minYExtent || (m_headerItemShownHeight == 0 && m_previousContentY == m_headerItem->y()))) {
566− m_headerItemShownHeight = 0;
567− m_headerItem->setY(-m_minYExtent);
568− } else if ((scrolledUp && notRebounding && notShownByItsOwn && !maximizeVisibleAreaRunning) || (m_headerItemShownHeight > 0) || m_inContentHeightKeepHeaderShown) {
569− if (maximizeVisibleAreaRunning && diff > 0) {
570− // If we are maximizing and the header was shown, make sure we hide it
571− m_headerItemShownHeight -= diff;
572− } else {
573− m_headerItemShownHeight += diff;
574− }
575− if (uFuzzyCompare(contentY(), -m_minYExtent)) {
576− m_headerItemShownHeight = 0;
577− } else {
578− m_headerItemShownHeight = qBound(static_cast<qreal>(0.), m_headerItemShownHeight, m_headerItem->height());
579− }
580− if (m_headerItemShownHeight > 0) {
581− if (uFuzzyCompare(m_headerItem->height(), m_headerItemShownHeight)) {
582− m_headerItem->setY(contentY());
583− m_headerItemShownHeight = m_headerItem->height();
584− } else {
585− m_headerItem->setY(contentY() - m_headerItem->height() + m_headerItemShownHeight);
586− }
587− } else {
588− m_headerItem->setY(-m_minYExtent);
589− }
590− } else if (m_headerItemShownHeight == 0 && m_previousContentY > m_headerItem->y() && contentY() < m_headerItem->y()) {
591− // The header was hidden but now that we've moved up (e.g. because of item removed) it's visible
592− // make sure it isn't
593− m_headerItem->setY(-m_minYExtent);
594− }
595− Q_EMIT headerItemShownHeightChanged();
596− } else {
597− // Stick the header item to the top when dragging down
598− m_headerItem->setY(contentY());
599− m_headerItem->setHeight(m_headerItem->implicitHeight() + (-m_minYExtent - contentY()));
600− }
601− // We will be changing the clip item, need to accomadate for it
602− // otherwise we move the firstItem down/up twice (unless the
603− // show header animation is running, where we want to keep the viewport stable)
604− if (!showHeaderAnimationRunning) {
605− diff += oldHeaderItemShownHeight - m_headerItemShownHeight;
606− } else {
607− diff = -diff;
608− }
609− }
610− if (!m_visibleItems.isEmpty()) {
611− updateClipItem();
612− ListItem *firstItem = m_visibleItems.first();
613− firstItem->setY(firstItem->y() + diff);
614− if (showHeaderAnimationRunning) {
615− adjustMinYExtent();
616− }
617− }
618−}
619−
620−void ListViewWithPageHeader::createDelegateModel()
621−{
622− m_delegateModel = new QQmlDelegateModel(qmlContext(this), this);
623− connect(m_delegateModel, &QQmlDelegateModel::createdItem, this, &ListViewWithPageHeader::itemCreated);
624− if (isComponentComplete())
625− m_delegateModel->componentComplete();
626− updateWatchedRoles();
627−}
628−
629−void ListViewWithPageHeader::refill()
630−{
631− if (m_inLayout) {
632− return;
633− }
634− if (!isComponentComplete()) {
635− return;
636− }
637−
638− const qreal from = contentY();
639− const qreal to = from + height();
640− const qreal bufferFrom = from - m_cacheBuffer;
641− const qreal bufferTo = to + m_cacheBuffer;
642−
643− bool added = addVisibleItems(from, to, false);
644− bool removed = removeNonVisibleItems(bufferFrom, bufferTo);
645− added |= addVisibleItems(bufferFrom, bufferTo, true);
646−
647− if (added || removed) {
648− m_contentHeightDirty = true;
649− }
650−}
651−
652−bool ListViewWithPageHeader::addVisibleItems(qreal fillFrom, qreal fillTo, bool asynchronous)
653−{
654− if (!delegate())
655− return false;
656−
657− if (m_delegateModel->count() == 0)
658− return false;
659−
660− ListItem *item;
661−// qDebug() << "ListViewWithPageHeader::addVisibleItems" << fillFrom << fillTo << asynchronous;
662−
663− int modelIndex = 0;
664− qreal pos = 0;
665− if (!m_visibleItems.isEmpty()) {
666− modelIndex = m_firstVisibleIndex + m_visibleItems.count();
667− item = m_visibleItems.last();
668− pos = item->y() + item->height() + m_clipItem->y();
669− }
670− bool changed = false;
671−// qDebug() << (modelIndex < m_delegateModel->count()) << pos << fillTo;
672− while (modelIndex < m_delegateModel->count() && pos <= fillTo) {
673−// qDebug() << "refill: append item" << modelIndex << "pos" << pos << "asynchronous" << asynchronous;
674− if (!(item = createItem(modelIndex, asynchronous)))
675− break;
676− pos += item->height();
677− ++modelIndex;
678− changed = true;
679− }
680−
681− modelIndex = 0;
682− pos = 0;
683− if (!m_visibleItems.isEmpty()) {
684− modelIndex = m_firstVisibleIndex - 1;
685− item = m_visibleItems.first();
686− pos = item->y() + m_clipItem->y();
687− }
688− while (modelIndex >= 0 && pos > fillFrom) {
689−// qDebug() << "refill: prepend item" << modelIndex << "pos" << pos << "fillFrom" << fillFrom << "asynchronous" << asynchronous;
690− if (!(item = createItem(modelIndex, asynchronous)))
691− break;
692− pos -= item->height();
693− --modelIndex;
694− changed = true;
695− }
696−
697− return changed;
698−}
699−
700−void ListViewWithPageHeader::reallyReleaseItem(ListItem *listItem)
701−{
702− QQuickItem *item = listItem->m_item;
703− QQmlDelegateModel::ReleaseFlags flags = m_delegateModel->release(item);
704− if (flags & QQmlDelegateModel::Destroyed) {
705− item->setParentItem(nullptr);
706− }
707− if (listItem->sectionItem()) {
708− listItem->sectionItem()->deleteLater();
709− }
710− delete listItem;
711−}
712−
713−void ListViewWithPageHeader::releaseItem(ListItem *listItem)
714−{
715− QQuickItemPrivate::get(listItem->m_item)->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
716− if (listItem->sectionItem()) {
717− QQuickItemPrivate::get(listItem->sectionItem())->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
718− }
719− m_itemsToRelease << listItem;
720−}
721−
722−void ListViewWithPageHeader::updateWatchedRoles()
723−{
724− if (m_delegateModel) {
725− QList<QByteArray> roles;
726− if (!m_sectionProperty.isEmpty())
727− roles << m_sectionProperty.toUtf8();
728− m_delegateModel->setWatchedRoles(roles);
729− }
730−}
731−
732−QQuickItem *ListViewWithPageHeader::getSectionItem(int modelIndex, bool alreadyInserted)
733−{
734− if (!m_sectionDelegate)
735− return nullptr;
736−
737− const QString section = m_delegateModel->stringValue(modelIndex, m_sectionProperty);
738−
739− if (modelIndex > 0) {
740− const QString prevSection = m_delegateModel->stringValue(modelIndex - 1, m_sectionProperty);
741− if (section == prevSection)
742− return nullptr;
743− }
744− if (modelIndex + 1 < model()->rowCount() && !alreadyInserted) {
745− // Already inserted items can't steal next section header
746− const QString nextSection = m_delegateModel->stringValue(modelIndex + 1, m_sectionProperty);
747− if (section == nextSection) {
748− // Steal the section header
749− ListItem *nextItem = itemAtIndex(modelIndex); // Not +1 since not yet inserted into m_visibleItems
750− if (nextItem) {
751− QQuickItem *sectionItem = nextItem->sectionItem();
752− nextItem->setSectionItem(nullptr);
753− return sectionItem;
754− }
755− }
756− }
757−
758− return getSectionItem(section);
759−}
760−
761−QQuickItem *ListViewWithPageHeader::getSectionItem(const QString &sectionText, bool watchGeometry)
762−{
763− QQuickItem *sectionItem = nullptr;
764−
765− QQmlContext *creationContext = m_sectionDelegate->creationContext();
766− QQmlContext *context = new QQmlContext(creationContext ? creationContext : qmlContext(this));
767− QObject *nobj = m_sectionDelegate->beginCreate(context);
768− if (nobj) {
769− QQml_setParent_noEvent(context, nobj);
770− sectionItem = qobject_cast<QQuickItem *>(nobj);
771− if (!sectionItem) {
772− delete nobj;
773− } else {
774− sectionItem->setProperty("text", sectionText);
775− sectionItem->setProperty("delegate", QVariant());
776− sectionItem->setZ(2);
777− QQml_setParent_noEvent(sectionItem, m_clipItem);
778− sectionItem->setParentItem(m_clipItem);
779− }
780− } else {
781− delete context;
782− }
783− m_sectionDelegate->completeCreate();
784−
785− if (watchGeometry && sectionItem) {
786− QQuickItemPrivate::get(sectionItem)->addItemChangeListener(this, QQuickItemPrivate::Geometry);
787− }
788−
789− return sectionItem;
790−}
791−
792−void ListViewWithPageHeader::updateSectionItem(int modelIndex)
793−{
794− ListItem *item = itemAtIndex(modelIndex);
795− if (item) {
796− const QString sectionText = m_delegateModel->stringValue(modelIndex, m_sectionProperty);
797−
798− bool needSectionHeader = true;
799− // if it is the same section as the previous item need to drop the section
800− if (modelIndex > 0) {
801− const QString prevSection = m_delegateModel->stringValue(modelIndex - 1, m_sectionProperty);
802− if (sectionText == prevSection) {
803− needSectionHeader = false;
804− }
805− }
806−
807− if (needSectionHeader) {
808− if (!item->sectionItem()) {
809− item->setSectionItem(getSectionItem(sectionText));
810− } else {
811− item->sectionItem()->setProperty("text", sectionText);
812− }
813− } else {
814− if (item->sectionItem()) {
815− item->sectionItem()->deleteLater();
816− item->setSectionItem(nullptr);
817− }
818− }
819− }
820−}
821−
822−bool ListViewWithPageHeader::removeNonVisibleItems(qreal bufferFrom, qreal bufferTo)
823−{
824−// qDebug() << "ListViewWithPageHeader::removeNonVisibleItems" << bufferFrom << bufferTo;
825− // Do not remove items if we are overshooting up or down, since we'll come back
826− // to the "stable" position and delete/create items without any reason
827− if (contentY() < -m_minYExtent) {
828− return false;
829− } else if (contentY() + height() > contentHeight()) {
830− return false;
831− }
832− bool changed = false;
833−
834− bool foundVisible = false;
835− int i = 0;
836− int removedItems = 0;
837− const auto oldFirstVisibleIndex = m_firstVisibleIndex;
838− while (i < m_visibleItems.count()) {
839− ListItem *item = m_visibleItems[i];
840− const qreal pos = item->y() + m_clipItem->y();
841−// qDebug() << i << pos << (pos + item->height()) << bufferFrom << bufferTo;
842− if (pos + item->height() < bufferFrom || pos > bufferTo) {
843−// qDebug() << "Releasing" << i << (pos + item->height() < bufferFrom) << pos + item->height() << bufferFrom << (pos > bufferTo) << pos << bufferTo;
844− releaseItem(item);
845− m_visibleItems.removeAt(i);
846− changed = true;
847− ++removedItems;
848− } else {
849− if (!foundVisible) {
850− foundVisible = true;
851− const int itemIndex = m_firstVisibleIndex + removedItems + i;
852− m_firstVisibleIndex = itemIndex;
853− }
854− ++i;
855− }
856− }
857− if (!foundVisible) {
858− initializeValuesForEmptyList();
859− }
860− if (m_firstVisibleIndex != oldFirstVisibleIndex) {
861− adjustMinYExtent();
862− }
863−
864− return changed;
865−}
866−
867−ListViewWithPageHeader::ListItem *ListViewWithPageHeader::createItem(int modelIndex, bool asynchronous)
868−{
869−// qDebug() << "CREATE ITEM" << modelIndex;
870− if (asynchronous && m_asyncRequestedIndex != -1)
871− return nullptr;
872−
873− m_asyncRequestedIndex = -1;
874− QObject* object = m_delegateModel->object(modelIndex, asynchronous ? QQmlIncubator::Asynchronous : QQmlIncubator::AsynchronousIfNested);
875− QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
876− if (!item) {
877− if (object) {
878− m_delegateModel->release(object);
879− if (!m_delegateValidated) {
880− m_delegateValidated = true;
881− QObject* delegateObj = delegate();
882− qmlInfo(delegateObj ? delegateObj : this) << "Delegate must be of Item type";
883− }
884− } else {
885− m_asyncRequestedIndex = modelIndex;
886− }
887− return 0;
888− } else {
889−// qDebug() << "ListViewWithPageHeader::createItem::We have the item" << modelIndex << item;
890− ListItem *listItem = new ListItem;
891− listItem->m_item = item;
892− listItem->setSectionItem(getSectionItem(modelIndex, false /*Not yet inserted into m_visibleItems*/));
893− QQuickItemPrivate::get(item)->addItemChangeListener(this, QQuickItemPrivate::Geometry);
894− ListItem *prevItem = itemAtIndex(modelIndex - 1);
895− bool lostItem = false; // Is an item that we requested async but because of model changes
896− // it is no longer attached to any of the existing items (has no prev nor next item)
897− // nor is the first item
898− if (prevItem) {
899− listItem->setY(prevItem->y() + prevItem->height());
900− } else {
901− ListItem *currItem = itemAtIndex(modelIndex);
902− if (currItem) {
903− // There's something already in m_visibleItems at out index, meaning this is an insert, so attach to its top
904− listItem->setY(currItem->y() - listItem->height());
905− } else {
906− ListItem *nextItem = itemAtIndex(modelIndex + 1);
907− if (nextItem) {
908− listItem->setY(nextItem->y() - listItem->height());
909− } else if (modelIndex == 0) {
910− listItem->setY(-m_clipItem->y() + (m_headerItem ? m_headerItem->height() : 0));
911− } else if (!m_visibleItems.isEmpty()) {
912− lostItem = true;
913− }
914− }
915− }
916− if (lostItem) {
917− listItem->setCulled(true);
918− releaseItem(listItem);
919− listItem = nullptr;
920− } else {
921− listItem->setCulled(listItem->y() + listItem->height() + m_clipItem->y() <= contentY() || listItem->y() + m_clipItem->y() >= contentY() + height());
922− if (m_visibleItems.isEmpty()) {
923− m_visibleItems << listItem;
924− } else {
925− m_visibleItems.insert(modelIndex - m_firstVisibleIndex, listItem);
926− }
927− if (m_firstVisibleIndex < 0 || modelIndex < m_firstVisibleIndex) {
928− m_firstVisibleIndex = modelIndex;
929− polish();
930− }
931− if (listItem->sectionItem()) {
932− listItem->sectionItem()->setProperty("delegate", QVariant::fromValue(listItem->m_item));
933− }
934− adjustMinYExtent();
935− m_contentHeightDirty = true;
936− }
937− return listItem;
938− }
939−}
940−
941−void ListViewWithPageHeader::itemCreated(int modelIndex, QObject *object)
942−{
943− QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
944− if (!item) {
945− qWarning() << "ListViewWithPageHeader::itemCreated got a non item for index" << modelIndex;
946− return;
947− }
948−// qDebug() << "ListViewWithPageHeader::itemCreated" << modelIndex << item;
949− // Check we are not being taken down and don't paint anything
950− // TODO Check if we still need this in 5.2
951− // For reproduction just inifnite loop testDash or testDashContent
952− if (!QQmlEngine::contextForObject(this)->parentContext())
953− return;
954−
955− item->setParentItem(m_clipItem);
956− // FIXME Why do we need the refreshExpressions call?
957− QQmlContext *context = QQmlEngine::contextForObject(item)->parentContext();
958− QQmlContextPrivate::get(context)->data->refreshExpressions();
959− item->setProperty("heightToClip", QVariant::fromValue<int>(0));
960− if (modelIndex == m_asyncRequestedIndex) {
961− createItem(modelIndex, false);
962− refill();
963− }
964−}
965−
966−void ListViewWithPageHeader::updateClipItem()
967−{
968− m_clipItem->setHeight(height() - m_headerItemShownHeight);
969− m_clipItem->setY(contentY() + m_headerItemShownHeight);
970− m_clipItem->setClip(!m_forceNoClip && m_headerItemShownHeight > 0);
971−}
972−
973−void ListViewWithPageHeader::onContentHeightChanged()
974−{
975− updateClipItem();
976−}
977−
978−void ListViewWithPageHeader::onContentWidthChanged()
979−{
980− m_clipItem->setWidth(contentItem()->width());
981−}
982−
983−void ListViewWithPageHeader::onHeightChanged()
984−{
985− m_clipItem->setHeight(height() - m_headerItemShownHeight);
986− polish();
987−}
988−
989−
990−void ListViewWithPageHeader::onModelUpdated(const QQmlChangeSet &changeSet, bool /*reset*/)
991−{
992− // TODO Do something with reset
993−// qDebug() << "ListViewWithPageHeader::onModelUpdated" << changeSet << reset;
994− const auto oldFirstVisibleIndex = m_firstVisibleIndex;
995−
996− Q_FOREACH(const QQmlChangeSet::Change remove, changeSet.removes()) {
997−// qDebug() << "ListViewWithPageHeader::onModelUpdated Remove" << remove.index << remove.count;
998− if (remove.index + remove.count > m_firstVisibleIndex && remove.index < m_firstVisibleIndex + m_visibleItems.count()) {
999− const qreal oldFirstValidIndexPos = m_visibleItems.first()->y();
1000− // If all the items we are removing are either not created or culled
1001− // we have to grow down to avoid viewport changing
1002− bool growDown = true;
1003− for (int i = 0; growDown && i < remove.count; ++i) {
1004− const int modelIndex = remove.index + i;
1005− ListItem *item = itemAtIndex(modelIndex);
1006− if (item && !item->culled()) {
1007− growDown = false;
1008− }
1009− }
1010− for (int i = remove.count - 1; i >= 0; --i) {
1011− const int visibleIndex = remove.index + i - m_firstVisibleIndex;
1012− if (visibleIndex >= 0 && visibleIndex < m_visibleItems.count()) {
1013− ListItem *item = m_visibleItems[visibleIndex];
1014− // Pass the section item down if needed
1015− if (item->sectionItem() && visibleIndex + 1 < m_visibleItems.count()) {
1016− ListItem *nextItem = m_visibleItems[visibleIndex + 1];
1017− if (!nextItem->sectionItem()) {
1018− nextItem->setSectionItem(item->sectionItem());
1019− item->setSectionItem(nullptr);
1020− }
1021− }
1022− releaseItem(item);
1023− m_visibleItems.removeAt(visibleIndex);
1024− }
1025− }
1026− if (growDown) {
1027− adjustMinYExtent();
1028− } else if (remove.index <= m_firstVisibleIndex && !m_visibleItems.isEmpty()) {
1029− m_visibleItems.first()->setY(oldFirstValidIndexPos);
1030− }
1031− if (m_visibleItems.isEmpty()) {
1032− m_firstVisibleIndex = -1;
1033− } else {
1034− m_firstVisibleIndex -= qMax(0, m_firstVisibleIndex - remove.index);
1035− }
1036− } else if (remove.index + remove.count <= m_firstVisibleIndex) {
1037− m_firstVisibleIndex -= remove.count;
1038− }
1039− for (int i = remove.count - 1; i >= 0; --i) {
1040− const int modelIndex = remove.index + i;
1041− if (modelIndex == m_asyncRequestedIndex) {
1042− m_asyncRequestedIndex = -1;
1043− } else if (modelIndex < m_asyncRequestedIndex) {
1044− m_asyncRequestedIndex--;
1045− }
1046− }
1047− }
1048−
1049− Q_FOREACH(const QQmlChangeSet::Change insert, changeSet.inserts()) {
1050−// qDebug() << "ListViewWithPageHeader::onModelUpdated Insert" << insert.index << insert.count;
1051− const bool insertingInValidIndexes = insert.index > m_firstVisibleIndex && insert.index < m_firstVisibleIndex + m_visibleItems.count();
1052− const bool firstItemWithViewOnTop = insert.index == 0 && m_firstVisibleIndex == 0 && m_visibleItems.first()->y() + m_clipItem->y() > contentY();
1053− if (insertingInValidIndexes || firstItemWithViewOnTop)
1054− {
1055− // If the items we are adding won't be really visible
1056− // we grow up instead of down to not change the viewport
1057− bool growUp = false;
1058− if (!firstItemWithViewOnTop) {
1059− for (int i = 0; i < m_visibleItems.count(); ++i) {
1060− if (!m_visibleItems[i]->culled()) {
1061− if (insert.index <= m_firstVisibleIndex + i) {
1062− growUp = true;
1063− }
1064− break;
1065− }
1066− }
1067− }
1068−
1069− const qreal oldFirstValidIndexPos = m_visibleItems.first()->y();
1070− for (int i = insert.count - 1; i >= 0; --i) {
1071− const int modelIndex = insert.index + i;
1072− ListItem *item = createItem(modelIndex, false);
1073− if (growUp) {
1074− ListItem *firstItem = m_visibleItems.first();
1075− firstItem->setY(firstItem->y() - item->height());
1076− }
1077− // Adding an item may break a "same section" chain, so check
1078− // if we need adding a new section item
1079− if (m_sectionDelegate) {
1080− ListItem *nextItem = itemAtIndex(modelIndex + 1);
1081− if (nextItem && !nextItem->sectionItem()) {
1082− nextItem->setSectionItem(getSectionItem(modelIndex + 1, true /* alredy inserted into m_visibleItems*/));
1083− if (growUp && nextItem->sectionItem()) {
1084− ListItem *firstItem = m_visibleItems.first();
1085− firstItem->setY(firstItem->y() - nextItem->sectionItem()->height());
1086− }
1087− }
1088− }
1089− }
1090− if (firstItemWithViewOnTop) {
1091− ListItem *firstItem = m_visibleItems.first();
1092− firstItem->setY(oldFirstValidIndexPos);
1093− }
1094− adjustMinYExtent();
1095− } else if (insert.index <= m_firstVisibleIndex) {
1096− m_firstVisibleIndex += insert.count;
1097− }
1098−
1099− for (int i = insert.count - 1; i >= 0; --i) {
1100− const int modelIndex = insert.index + i;
1101− if (modelIndex <= m_asyncRequestedIndex) {
1102− m_asyncRequestedIndex++;
1103− }
1104− }
1105− }
1106−
1107− Q_FOREACH(const QQmlChangeSet::Change change, changeSet.changes()) {
1108− for (int i = change.start(); i < change.end(); ++i) {
1109− updateSectionItem(i);
1110− }
1111− // Also update the section header for the next item after the change since it may be influenced
1112− updateSectionItem(change.end());
1113− }
1114−
1115− if (m_firstVisibleIndex != oldFirstVisibleIndex) {
1116− if (m_visibleItems.isEmpty()) {
1117− initializeValuesForEmptyList();
1118− } else {
1119− adjustMinYExtent();
1120− }
1121− }
1122−
1123− for (int i = 0; i < m_visibleItems.count(); ++i) {
1124− ListItem *item = m_visibleItems[i];
1125− if (item->sectionItem()) {
1126− item->sectionItem()->setProperty("delegate", QVariant::fromValue(item->m_item));
1127− }
1128− }
1129−
1130− layout();
1131− polish();
1132− m_contentHeightDirty = true;
1133−}
1134−
1135−void ListViewWithPageHeader::contentYAnimationRunningChanged(bool running)
1136−{
1137− setInteractive(!running);
1138− if (!running) {
1139− m_contentHeightDirty = true;
1140− polish();
1141− }
1142−}
1143−
1144−/*
1145−void ListViewWithPageHeader::itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry)
1146−{
1147− const qreal heightDiff = newGeometry.height() - oldGeometry.height();
1148− if (heightDiff != 0) {
1149− if (!m_visibleItems.isEmpty()) {
1150− ListItem *firstItem = m_visibleItems.first();
1151− const auto prevFirstItemY = firstItem->y();
1152− if (!m_inContentHeightKeepHeaderShown && oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY()) {
1153− firstItem->setY(firstItem->y() - heightDiff);
1154− } else if (item == firstItem->sectionItem()) {
1155− firstItem->setY(firstItem->y() + heightDiff);
1156− }
1157−
1158− if (firstItem->y() != prevFirstItemY) {
1159− adjustMinYExtent();
1160− layout();
1161− }
1162− }
1163− refill();
1164− adjustMinYExtent();
1165− polish();
1166− m_contentHeightDirty = true;
1167− }
1168−}
1169−*/
1170−
1171−void ListViewWithPageHeader::itemImplicitHeightChanged(QQuickItem *item)
1172−{
1173− if (item == m_headerItem) {
1174− const qreal diff = m_headerItem->implicitHeight() - m_previousHeaderImplicitHeight;
1175− if (diff != 0) {
1176− adjustHeader(diff);
1177− m_previousHeaderImplicitHeight = m_headerItem->implicitHeight();
1178− layout();
1179− polish();
1180− m_contentHeightDirty = true;
1181− }
1182− }
1183−}
1184−
1185−void ListViewWithPageHeader::headerHeightChanged(qreal newHeaderHeight, qreal oldHeaderHeight, qreal oldHeaderY)
1186−{
1187− const qreal heightDiff = newHeaderHeight - oldHeaderHeight;
1188− if (m_headerItemShownHeight > 0) {
1189− // If the header is shown because of the clip
1190− // Change its size
1191− m_headerItemShownHeight += heightDiff;
1192− m_headerItemShownHeight = qBound(static_cast<qreal>(0.), m_headerItemShownHeight, newHeaderHeight);
1193− updateClipItem();
1194− adjustMinYExtent();
1195− Q_EMIT headerItemShownHeightChanged();
1196− } else {
1197− if (oldHeaderY + oldHeaderHeight > contentY()) {
1198− // If the header is shown because its position
1199− // Change its size
1200− ListItem *firstItem = m_visibleItems.first();
1201− firstItem->setY(firstItem->y() + heightDiff);
1202− layout();
1203− } else {
1204− // If the header is not on screen, just change the start of the list
1205− // so the viewport is not changed
1206− adjustMinYExtent();
1207− }
1208− }
1209−}
1210−
1211−
1212−void ListViewWithPageHeader::adjustMinYExtent()
1213−{
1214− if (m_visibleItems.isEmpty() || (contentHeight() + m_minYExtent < height())) {
1215− m_minYExtent = 0;
1216− } else {
1217− qreal nonCreatedHeight = 0;
1218− if (m_firstVisibleIndex != 0) {
1219− // Calculate the average height of items to estimate the position of the list start
1220− const int visibleItems = m_visibleItems.count();
1221− qreal visibleItemsHeight = 0;
1222− Q_FOREACH(ListItem *item, m_visibleItems) {
1223− visibleItemsHeight += item->height();
1224− }
1225− nonCreatedHeight = m_firstVisibleIndex * visibleItemsHeight / visibleItems;
1226−// qDebug() << m_firstVisibleIndex << visibleItemsHeight << visibleItems << nonCreatedHeight;
1227− }
1228− const qreal headerHeight = (m_headerItem ? m_headerItem->implicitHeight() : 0);
1229− m_minYExtent = nonCreatedHeight - m_visibleItems.first()->y() - m_clipItem->y() + headerHeight;
1230− if (m_minYExtent != 0 && qFuzzyIsNull(m_minYExtent)) {
1231− m_minYExtent = 0;
1232− m_visibleItems.first()->setY(nonCreatedHeight - m_clipItem->y() + headerHeight);
1233− }
1234− }
1235−}
1236−
1237−ListViewWithPageHeader::ListItem *ListViewWithPageHeader::itemAtIndex(int modelIndex) const
1238−{
1239− const int visibleIndexedModelIndex = modelIndex - m_firstVisibleIndex;
1240− if (visibleIndexedModelIndex >= 0 && visibleIndexedModelIndex < m_visibleItems.count())
1241− return m_visibleItems[visibleIndexedModelIndex];
1242−
1243− return nullptr;
1244−}
1245−
1246−void ListViewWithPageHeader::layout()
1247−{
1248− if (m_inLayout)
1249− return;
1250−
1251− m_inLayout = true;
1252− if (!m_visibleItems.isEmpty()) {
1253− const qreal visibleFrom = contentY() - m_clipItem->y() + m_headerItemShownHeight;
1254− const qreal visibleTo = contentY() + height() - m_clipItem->y();
1255−
1256− qreal pos = m_visibleItems.first()->y();
1257−
1258−// qDebug() << "ListViewWithPageHeader::layout Updating positions and heights. contentY" << contentY() << "minYExtent" << minYExtent();
1259− int firstReallyVisibleItem = -1;
1260− int modelIndex = m_firstVisibleIndex;
1261− Q_FOREACH(ListItem *item, m_visibleItems) {
1262− const bool cull = pos + item->height() <= visibleFrom || pos >= visibleTo;
1263− item->setCulled(cull);
1264− item->setY(pos);
1265− if (!cull && firstReallyVisibleItem == -1) {
1266− firstReallyVisibleItem = modelIndex;
1267− if (m_topSectionItem) {
1268− // Positing the top section sticky item is a two step process
1269− // First we set it either we cull it (because it doesn't need to be sticked to the top)
1270− // or stick it to the top
1271− // Then after the loop we'll make sure that if there's another section just below it
1272− // pushed the sticky section up to make it disappear
1273− const qreal topSectionStickPos = m_headerItemShownHeight + contentY() - m_clipItem->y();
1274− bool showStickySectionItem;
1275− // We need to show the "top section sticky item" when the position at the "top" of the
1276− // viewport is bigger than the start of the position of the first visible item
1277− // i.e. the first visible item starts before the viewport, or when the first
1278− // visible item starts just at the viewport start and it does not have its own section item
1279− if (topSectionStickPos > pos) {
1280− showStickySectionItem = true;
1281− } else if (topSectionStickPos == pos) {
1282− showStickySectionItem = !item->sectionItem();
1283− } else {
1284− showStickySectionItem = false;
1285− }
1286− if (!showStickySectionItem) {
1287− QQuickItemPrivate::get(m_topSectionItem)->setCulled(true);
1288− if (item->sectionItem()) {
1289− // This seems it should happen since why would we cull the top section
1290− // if the first visible item has no section header? This only happens briefly
1291− // when increasing the height of a list that is at the bottom, the m_topSectionItem
1292− // gets shown shortly in the next polish call
1293− QQuickItemPrivate::get(item->sectionItem())->setCulled(false);
1294− }
1295− } else {
1296− // Update the top sticky section header
1297− const QString section = m_delegateModel->stringValue(modelIndex, m_sectionProperty);
1298− m_topSectionItem->setProperty("text", section);
1299−
1300− QQuickItemPrivate::get(m_topSectionItem)->setCulled(false);
1301− m_topSectionItem->setY(topSectionStickPos);
1302− m_topSectionItem->setProperty("delegate", QVariant::fromValue(item->m_item));
1303− if (item->sectionItem()) {
1304− QQuickItemPrivate::get(item->sectionItem())->setCulled(true);
1305− }
1306− }
1307− }
1308− }
1309− const qreal clipFrom = visibleFrom + (!item->sectionItem() && m_topSectionItem && !QQuickItemPrivate::get(m_topSectionItem)->culled ? m_topSectionItem->height() : 0);
1310− if (!cull && pos < clipFrom) {
1311− item->m_item->setProperty("heightToClip", clipFrom - pos);
1312− } else {
1313− item->m_item->setProperty("heightToClip", QVariant::fromValue<int>(0));
1314− }
1315−// qDebug() << "ListViewWithPageHeader::layout" << item->m_item;
1316− pos += item->height();
1317− ++modelIndex;
1318− }
1319−
1320− // Second step of section sticky item positioning
1321− // Look at the next section header, check if it's pushing up the sticky one
1322− if (m_topSectionItem) {
1323− if (firstReallyVisibleItem >= 0) {
1324− for (int i = firstReallyVisibleItem - m_firstVisibleIndex + 1; i < m_visibleItems.count(); ++i) {
1325− ListItem *item = m_visibleItems[i];
1326− if (item->sectionItem()) {
1327− if (m_topSectionItem->y() + m_topSectionItem->height() > item->y()) {
1328− m_topSectionItem->setY(item->y() - m_topSectionItem->height());
1329− }
1330− break;
1331− }
1332− }
1333− }
1334− }
1335− }
1336− if (m_headerItem) {
1337− const bool cullHeader = m_headerItem->y() + m_headerItem->height() < contentY();
1338− QQuickItemPrivate::get(m_headerItem)->setCulled(cullHeader);
1339− }
1340− m_inLayout = false;
1341−}
1342−
1343−void ListViewWithPageHeader::updatePolish()
1344−{
1345− // Check we are not being taken down and don't paint anything
1346− // TODO Check if we still need this in 5.2
1347− // For reproduction just inifnite loop testDash or testDashContent
1348− if (!QQmlEngine::contextForObject(this)->parentContext())
1349− return;
1350−
1351− Q_FOREACH(ListItem *item, m_itemsToRelease)
1352− reallyReleaseItem(item);
1353− m_itemsToRelease.clear();
1354−
1355− if (!model())
1356− return;
1357−
1358− layout();
1359−
1360− refill();
1361−
1362− if (m_contentHeightDirty) {
1363− qreal contentHeight;
1364− if (m_visibleItems.isEmpty()) {
1365− contentHeight = m_headerItem ? m_headerItem->height() : 0;
1366− } else {
1367− const int modelCount = model()->rowCount();
1368− const int visibleItems = m_visibleItems.count();
1369− const int lastValidIndex = m_firstVisibleIndex + visibleItems - 1;
1370− qreal nonCreatedHeight = 0;
1371− if (lastValidIndex != modelCount - 1) {
1372− const int visibleItems = m_visibleItems.count();
1373− qreal visibleItemsHeight = 0;
1374− Q_FOREACH(ListItem *item, m_visibleItems) {
1375− visibleItemsHeight += item->height();
1376− }
1377− const int unknownSizes = modelCount - (m_firstVisibleIndex + visibleItems);
1378− nonCreatedHeight = unknownSizes * visibleItemsHeight / visibleItems;
1379− }
1380− ListItem *item = m_visibleItems.last();
1381− contentHeight = nonCreatedHeight + item->y() + item->height() + m_clipItem->y();
1382− if (m_firstVisibleIndex != 0) {
1383− // Make sure that if we are shrinking we tell the view we still fit
1384− m_minYExtent = qMax(m_minYExtent, -(contentHeight - height()));
1385− }
1386− }
1387−
1388− m_contentHeightDirty = false;
1389− adjustMinYExtent();
1390− m_inContentHeightKeepHeaderShown = m_headerItem && m_headerItem->y() == contentY();
1391− setContentHeight(contentHeight);
1392− m_inContentHeightKeepHeaderShown = false;
1393− }
1394−}
1395−
1396−#include "moc_listviewwithpageheader.cpp"
plugins/Dash/listviewwithpageheader.hdeleted−218
@@ -1,218 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef LISTVIEWWITHPAGEHEADER_H
18−#define LISTVIEWWITHPAGEHEADER_H
19−
20−#include <private/qquickitemchangelistener_p.h>
21−#include <private/qquickflickable_p.h>
22−
23−class QAbstractItemModel;
24−class QQuickNumberAnimation;
25−class QQmlChangeSet;
26−class QQmlDelegateModel;
27−
28−
29−/**
30− Note for users of this class
31−
32− ListViewWithPageHeader already loads delegates async when appropiate so if
33− your delegate uses a Loader you should not enable the asynchronous feature since
34− that will need to introduce sizing problems
35−
36− With the double async it may happen what while we are scrolling down
37− we reach to a point where given the size of the just created delegate with loader not yet loaded (which will be very close to 0)
38− we are already "at the end" of the list, but then a few milliseconds later the loader finishes loading and we could
39− have kept scrolling. This is specially visible at the end of the list where you realize
40− that scrolling ended a bit before the end of the list but the speed of the flicking was good
41− to reach the end
42−
43− By not having the second async we get a better sizing when the delegate is created and things work better
44−*/
45−
46−class ListViewWithPageHeader : public QQuickFlickable, public QQuickItemChangeListener
47−{
48− Q_OBJECT
49− Q_PROPERTY(QAbstractItemModel *model READ model WRITE setModel NOTIFY modelChanged)
50− Q_PROPERTY(QQmlComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
51− Q_PROPERTY(QQuickItem *pageHeader READ header WRITE setHeader NOTIFY headerChanged)
52− Q_PROPERTY(QQmlComponent *sectionDelegate READ sectionDelegate WRITE setSectionDelegate NOTIFY sectionDelegateChanged)
53− Q_PROPERTY(QString sectionProperty READ sectionProperty WRITE setSectionProperty NOTIFY sectionPropertyChanged)
54− Q_PROPERTY(bool forceNoClip READ forceNoClip WRITE setForceNoClip NOTIFY forceNoClipChanged)
55− Q_PROPERTY(int stickyHeaderHeight READ stickyHeaderHeight NOTIFY stickyHeaderHeightChanged)
56− Q_PROPERTY(qreal headerItemShownHeight READ headerItemShownHeight NOTIFY headerItemShownHeightChanged)
57− Q_PROPERTY(int cacheBuffer READ cacheBuffer WRITE setCacheBuffer NOTIFY cacheBufferChanged)
58−
59− friend class ListViewWithPageHeaderTest;
60− friend class ListViewWithPageHeaderTestSection;
61− friend class ListViewWithPageHeaderTestExternalModel;
62−
63−public:
64− ListViewWithPageHeader();
65− ~ListViewWithPageHeader();
66−
67− QAbstractItemModel *model() const;
68− void setModel(QAbstractItemModel *model);
69−
70− QQmlComponent *delegate() const;
71− void setDelegate(QQmlComponent *delegate);
72−
73− QQuickItem *header() const;
74− void setHeader(QQuickItem *header);
75−
76− QQmlComponent *sectionDelegate() const;
77− void setSectionDelegate(QQmlComponent *delegate);
78−
79− QString sectionProperty() const;
80− void setSectionProperty(const QString &property);
81−
82− bool forceNoClip() const;
83− void setForceNoClip(bool noClip);
84−
85− int stickyHeaderHeight() const;
86− qreal headerItemShownHeight() const;
87−
88− int cacheBuffer() const;
89− void setCacheBuffer(int cacheBuffer);
90−
91− Q_INVOKABLE void positionAtBeginning();
92− Q_INVOKABLE void showHeader();
93− Q_INVOKABLE int firstCreatedIndex() const;
94− Q_INVOKABLE int createdItemCount() const;
95− Q_INVOKABLE QQuickItem *item(int modelIndex) const;
96−
97− // The index has to be created for this to try to do something
98− // Created items are those visible and the precached ones
99− // Returns if the item existed or not
100− Q_INVOKABLE bool maximizeVisibleArea(int modelIndex);
101− Q_INVOKABLE bool maximizeVisibleArea(int modelIndex, int itemHeight);
102−
103−Q_SIGNALS:
104− void modelChanged();
105− void delegateChanged();
106− void headerChanged();
107− void sectionDelegateChanged();
108− void sectionPropertyChanged();
109− void forceNoClipChanged();
110− void stickyHeaderHeightChanged();
111− void headerItemShownHeightChanged();
112− void cacheBufferChanged();
113−
114−protected:
115− void componentComplete() override;
116− void viewportMoved(Qt::Orientations orient) override;
117− qreal minYExtent() const override;
118− qreal maxYExtent() const override;
119− //void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) override;
120− void itemImplicitHeightChanged(QQuickItem *item) override;
121− void updatePolish() override;
122−
123−private Q_SLOTS:
124− void itemCreated(int modelIndex, QObject *object);
125− void onContentHeightChanged();
126− void onContentWidthChanged();
127− void onHeightChanged();
128− void onModelUpdated(const QQmlChangeSet &changeSet, bool reset);
129− void contentYAnimationRunningChanged(bool running);
130−
131−private:
132− class ListItem
133− {
134− public:
135− qreal height() const;
136−
137− qreal y() const;
138− void setY(qreal newY);
139−
140− bool culled() const;
141− void setCulled(bool culled);
142−
143− QQuickItem *sectionItem() const { return m_sectionItem; }
144− void setSectionItem(QQuickItem *sectionItem);
145−
146− QQuickItem *m_item;
147− private:
148− QQuickItem *m_sectionItem;
149− };
150−
151− bool maximizeVisibleArea(ListItem *listItem, int listItemHeight);
152−
153− void createDelegateModel();
154−
155− void layout();
156− void refill();
157− bool addVisibleItems(qreal fillFrom, qreal fillTo, bool asynchronous);
158− bool removeNonVisibleItems(qreal bufferFrom, qreal bufferTo);
159− ListItem *createItem(int modelIndex, bool asynchronous);
160−
161− void adjustHeader(qreal diff);
162− void adjustMinYExtent();
163− void updateClipItem();
164− void headerHeightChanged(qreal newHeaderHeight, qreal oldHeaderHeight, qreal oldHeaderY);
165− ListItem *itemAtIndex(int modelIndex) const; // Returns the item at modelIndex if has been created
166− void releaseItem(ListItem *item);
167− void reallyReleaseItem(ListItem *item);
168− void updateWatchedRoles();
169− QQuickItem *getSectionItem(int modelIndex, bool alreadyInserted);
170− QQuickItem *getSectionItem(const QString &sectionText, bool watchGeometry = true);
171− void updateSectionItem(int modelIndex);
172− void initializeValuesForEmptyList();
173−
174− QQmlDelegateModel *m_delegateModel;
175−
176− // Index we are waiting because we requested it asynchronously
177− int m_asyncRequestedIndex;
178−
179− // Used to only give a warning once if the delegate does not return objects
180− bool m_delegateValidated;
181−
182− // Visible indexes, [0] is m_firstValidIndex, [0+1] is m_firstValidIndex +1, ...
183− QList<ListItem *> m_visibleItems;
184− int m_firstVisibleIndex;
185−
186− qreal m_minYExtent;
187−
188− QQuickItem *m_clipItem;
189−
190− // If any of the heights has changed
191− // or new items have been added/removed
192− bool m_contentHeightDirty;
193−
194− QQuickItem *m_headerItem;
195− qreal m_previousContentY;
196− qreal m_previousHeaderImplicitHeight;
197− qreal m_headerItemShownHeight; // The height of header shown when the header is shown outside its topmost position
198− // i.e. it's being shown after dragging down in the middle of the list
199− enum ContentYAnimationType { ContentYAnimationShowHeader, ContentYAnimationMaximizeVisibleArea };
200− ContentYAnimationType contentYAnimationType;
201− QQuickNumberAnimation *m_contentYAnimation;
202−
203− QQmlComponent *m_sectionDelegate;
204− QString m_sectionProperty;
205− QQuickItem *m_topSectionItem;
206−
207− bool m_forceNoClip;
208− bool m_inLayout;
209− bool m_inContentHeightKeepHeaderShown;
210− int m_cacheBuffer;
211−
212− // Qt 5.0 doesn't like releasing the items just after itemCreated
213− // so we delay the releasing until the next updatePolish
214− QList<ListItem *> m_itemsToRelease;
215−};
216−
217−
218−#endif
plugins/Dash/organicgrid.cppdeleted−259
@@ -1,259 +0,0 @@
1−/*
2− * Copyright (C) 2014, 2016 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 "organicgrid.h"
18−
19−#include <math.h>
20−
21−#include <private/qquickitem_p.h>
22−
23−OrganicGrid::OrganicGrid()
24− : m_firstVisibleIndex(-1)
25− , m_numberOfModulesPerRow(-1)
26−{
27−}
28−
29−QSizeF OrganicGrid::smallDelegateSize() const
30−{
31− return m_smallDelegateSize;
32−}
33−
34−void OrganicGrid::setSmallDelegateSize(const QSizeF size)
35−{
36− if (m_smallDelegateSize != size) {
37− m_smallDelegateSize = size;
38− Q_EMIT smallDelegateSizeChanged();
39−
40− if (isComponentComplete()) {
41− relayout();
42− }
43− }
44−}
45−
46−QSizeF OrganicGrid::bigDelegateSize() const
47−{
48− return m_bigDelegateSize;
49−}
50−
51−void OrganicGrid::setBigDelegateSize(const QSizeF size)
52−{
53− if (m_bigDelegateSize != size) {
54− m_bigDelegateSize = size;
55− Q_EMIT bigDelegateSizeChanged();
56−
57− if (isComponentComplete()) {
58− relayout();
59− }
60− }
61−}
62−
63−QPointF OrganicGrid::positionForIndex(int modelIndex) const
64−{
65− const qreal moduleHeight = m_smallDelegateSize.height() + rowSpacing() + m_bigDelegateSize.height();
66− const qreal moduleWidth = m_smallDelegateSize.width() * 2 + columnSpacing() * 2 + m_bigDelegateSize.width();
67− const int itemsPerRow = m_numberOfModulesPerRow * 6;
68− const int rowIndex = floor(modelIndex / itemsPerRow);
69− const int columnIndex = floor((modelIndex - rowIndex * itemsPerRow) / 6);
70−
71− qreal yPos = (moduleHeight + rowSpacing()) * rowIndex;
72− const int moduleIndex = modelIndex % 6;
73− if (moduleIndex == 2) {
74− yPos += m_smallDelegateSize.height() + rowSpacing();
75− } else if (moduleIndex == 3 || moduleIndex == 5) {
76− yPos += m_bigDelegateSize.height() + rowSpacing();
77− }
78−
79− qreal xPos = (moduleWidth + columnSpacing()) * columnIndex;
80− if (moduleIndex == 1) {
81− xPos += m_smallDelegateSize.width() + columnSpacing();
82− } else if (moduleIndex == 3) {
83− xPos += m_bigDelegateSize.width() + columnSpacing();
84− } else if (moduleIndex == 4) {
85− xPos += (m_smallDelegateSize.width() + columnSpacing()) * 2;
86− } else if (moduleIndex == 5) {
87− xPos += m_bigDelegateSize.width() + m_smallDelegateSize.width() + columnSpacing() * 2;
88− }
89−
90− return QPointF(xPos, yPos);
91−}
92−
93−QSizeF OrganicGrid::sizeForIndex(int modelIndex) const
94−{
95− const int moduleIndex = modelIndex % 6;
96− if (moduleIndex == 0 || moduleIndex == 1 || moduleIndex == 3 || moduleIndex == 5) {
97− return m_smallDelegateSize;
98− } else {
99− return m_bigDelegateSize;
100− }
101−}
102−
103−void OrganicGrid::findBottomModelIndexToAdd(int *modelIndex, qreal *yPos)
104−{
105− if (m_visibleItems.isEmpty()) {
106− *modelIndex = 0;
107− *yPos = 0;
108− } else {
109− *modelIndex = m_firstVisibleIndex + m_visibleItems.count();
110− // We create stuff in a 6-module basis, so always return back
111− // the y position of the first item
112− const int firstModuleIndex = ((*modelIndex) / 6) * 6;
113− *yPos = positionForIndex(firstModuleIndex).y();
114− }
115−}
116−
117−void OrganicGrid::findTopModelIndexToAdd(int *modelIndex, qreal *yPos)
118−{
119− if (m_visibleItems.isEmpty()) {
120− *modelIndex = 0;
121− *yPos = 0;
122− } else {
123− *modelIndex = m_firstVisibleIndex - 1;
124− // We create stuff in a 6-module basis, so always return back
125− // the y position of the last item bottom
126− const int lastModuleIndex = ((*modelIndex) / 6) * 6 + 5;
127− *yPos = positionForIndex(lastModuleIndex).y();
128− *yPos += sizeForIndex(lastModuleIndex).height();
129− }
130−}
131−
132−void OrganicGrid::addItemToView(int modelIndex, QQuickItem *item)
133−{
134− // modelIndex has to be either m_firstVisibleIndex - 1 or m_firstVisibleIndex + m_visibleItems.count() or the first
135− if (modelIndex == m_firstVisibleIndex + m_visibleItems.count()) {
136− m_visibleItems << item;
137− } else if (modelIndex == m_firstVisibleIndex - 1) {
138− m_firstVisibleIndex = modelIndex;
139− m_visibleItems.prepend(item);
140− } else if (modelIndex == 0) {
141− m_firstVisibleIndex = 0;
142− m_visibleItems << item;
143− } else {
144− qWarning() << "OrganicGrid::addItemToView - Got unexpected modelIndex"
145− << modelIndex << m_firstVisibleIndex << m_visibleItems.count();
146− return;
147− }
148−
149− const QPointF pos = positionForIndex(modelIndex);
150− item->setPosition(pos);
151−
152− item->setSize(sizeForIndex(modelIndex));
153−}
154−
155−bool OrganicGrid::removeNonVisibleItems(qreal bufferFromY, qreal bufferToY)
156−{
157− bool changed = false;
158−
159− // As adding, we also remove in a 6-module basis
160− int lastModuleIndex = (m_firstVisibleIndex / 6) * 6 + 5;
161− bool removeIndex = positionForIndex(lastModuleIndex).y() + sizeForIndex(lastModuleIndex).height() < bufferFromY;
162− while (removeIndex && !m_visibleItems.isEmpty()) {
163− releaseItem(m_visibleItems.takeFirst());
164− changed = true;
165− m_firstVisibleIndex++;
166−
167− lastModuleIndex = (m_firstVisibleIndex / 6) * 6 + 5;
168− removeIndex = positionForIndex(lastModuleIndex).y() + sizeForIndex(lastModuleIndex).height() < bufferFromY;
169− }
170−
171− int firstModuleIndex = ((m_firstVisibleIndex + m_visibleItems.count() - 1) / 6) * 6;
172− removeIndex = positionForIndex(firstModuleIndex).y() > bufferToY;
173− while (removeIndex && !m_visibleItems.isEmpty()) {
174− releaseItem(m_visibleItems.takeLast());
175− changed = true;
176−
177− firstModuleIndex = ((m_firstVisibleIndex + m_visibleItems.count() - 1) / 6) * 6;
178− removeIndex = positionForIndex(firstModuleIndex).y() > bufferToY;
179− }
180−
181− if (m_visibleItems.isEmpty()) {
182− m_firstVisibleIndex = -1;
183− }
184−
185− return changed;
186−}
187−
188−void OrganicGrid::cleanupExistingItems()
189−{
190− Q_FOREACH(QQuickItem *item, m_visibleItems)
191− releaseItem(item);
192− m_visibleItems.clear();
193− m_firstVisibleIndex = -1;
194− setImplicitHeightDirty();
195−}
196−
197−void OrganicGrid::doRelayout()
198−{
199− const qreal moduleWidth = m_smallDelegateSize.width() * 2 + columnSpacing() * 2 + m_bigDelegateSize.width();
200− m_numberOfModulesPerRow = floor((width() + columnSpacing()) / (moduleWidth + columnSpacing()));
201− m_numberOfModulesPerRow = qMax(1, m_numberOfModulesPerRow);
202−
203− int i = m_firstVisibleIndex;
204− const QList<QQuickItem*> allItems = m_visibleItems;
205− m_visibleItems.clear();
206− Q_FOREACH(QQuickItem *item, allItems) {
207− addItemToView(i, item);
208− ++i;
209− }
210−}
211−
212−void OrganicGrid::updateItemCulling(qreal visibleFromY, qreal visibleToY)
213−{
214− Q_FOREACH(QQuickItem *item, m_visibleItems) {
215− QQuickItemPrivate::get(item)->setCulled(item->y() + item->height() <= visibleFromY || item->y() >= visibleToY);
216− }
217−}
218−
219−void OrganicGrid::calculateImplicitHeight()
220−{
221− const qreal moduleHeight = m_smallDelegateSize.height() + rowSpacing() + m_bigDelegateSize.height();
222− const int itemCount = !model() ? 0 : model()->rowCount();
223− const int itemsPerRow = m_numberOfModulesPerRow * 6;
224− const int fullRows = floor(itemCount / itemsPerRow);
225− const qreal fullRowsHeight = fullRows == 0 ? 0 : fullRows * moduleHeight + rowSpacing() * (fullRows - 1);
226−
227− const int remainingItems = itemCount - fullRows * itemsPerRow;
228− if (remainingItems == 0) {
229− setImplicitHeight(fullRowsHeight);
230− } else if (remainingItems <= 2) {
231− setImplicitHeight(fullRowsHeight + m_smallDelegateSize.height() + rowSpacing());
232− } else {
233− setImplicitHeight(fullRowsHeight + rowSpacing() + moduleHeight);
234− }
235−}
236−
237−void OrganicGrid::processModelRemoves(const QVector<QQmlChangeSet::Change> &removes)
238−{
239− Q_FOREACH(const QQmlChangeSet::Change remove, removes) {
240− for (int i = remove.count - 1; i >= 0; --i) {
241− const int indexToRemove = remove.index + i;
242− // We only support removing from the end
243− const int lastIndex = m_firstVisibleIndex + m_visibleItems.count() - 1;
244− if (indexToRemove == lastIndex) {
245− releaseItem(m_visibleItems.takeLast());
246− } else {
247− if (indexToRemove < lastIndex) {
248− qDebug() << "OrganicGrid only supports removal from the end of the model, resetting instead";
249− cleanupExistingItems();
250− break;
251− }
252− }
253− }
254− }
255− if (m_visibleItems.isEmpty()) {
256− m_firstVisibleIndex = -1;
257− }
258− setImplicitHeightDirty();
259−}
plugins/Dash/organicgrid.hdeleted−91
@@ -1,91 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef ORGANICGRID_H
18−#define ORGANICGRID_H
19−
20−#include "abstractdashview.h"
21−
22− /** An Organic Grid is is a view that creates delegates
23− * based on a model and layouts them in groups of six items (called module).
24− *
25− * In each module there are 4 items that are forced to the small delegate size
26− * and two that are forced to the big delegate size.
27− *
28− * Example:
29− *
30− * +---+ +---+ +-----+
31− * | 1 | | 2 | | |
32− * +---+ +---+ | 5 |
33− * +-----+ | |
34− * | | +-----+
35− * | 3 | +---+ +---+
36− * | | | 4 | | 6 |
37− * +-----+ +---+ +---+
38− *
39− * Modules are positioned one after the other in a grid like fashion, i.e.
40− *
41− * +---+ +---+
42− * | 1 | | 2 |
43− * +---+ +---+
44− * +---+ +---+
45− * | 3 | | 4 |
46− * +---+ +---+
47− */
48−
49−class OrganicGrid : public AbstractDashView
50−{
51− Q_OBJECT
52−
53− Q_PROPERTY(QSizeF smallDelegateSize READ smallDelegateSize WRITE setSmallDelegateSize NOTIFY smallDelegateSizeChanged)
54− Q_PROPERTY(QSizeF bigDelegateSize READ bigDelegateSize WRITE setBigDelegateSize NOTIFY bigDelegateSizeChanged)
55−
56−friend class OrganicGridTest;
57−
58−public:
59− OrganicGrid();
60−
61− QSizeF smallDelegateSize() const;
62− void setSmallDelegateSize(const QSizeF size);
63−
64− QSizeF bigDelegateSize() const;
65− void setBigDelegateSize(const QSizeF size);
66−
67−Q_SIGNALS:
68− void smallDelegateSizeChanged();
69− void bigDelegateSizeChanged();
70−private:
71− QPointF positionForIndex(int modelIndex) const;
72− QSizeF sizeForIndex(int modelIndex) const;
73−
74− void findBottomModelIndexToAdd(int *modelIndex, qreal *yPos) override;
75− void findTopModelIndexToAdd(int *modelIndex, qreal *yPos) override;
76− void addItemToView(int modelIndex, QQuickItem *item) override;
77− bool removeNonVisibleItems(qreal bufferFromY, qreal bufferToY) override;
78− void cleanupExistingItems() override;
79− void doRelayout() override;
80− void updateItemCulling(qreal visibleFromY, qreal visibleToY) override;
81− void calculateImplicitHeight() override;
82− void processModelRemoves(const QVector<QQmlChangeSet::Change> &removes) override;
83−
84− QSizeF m_smallDelegateSize;
85− QSizeF m_bigDelegateSize;
86− int m_firstVisibleIndex;
87− int m_numberOfModulesPerRow;
88− QList<QQuickItem*> m_visibleItems;
89−};
90−
91−#endif
plugins/Dash/plugin.cppdeleted−70
@@ -1,70 +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−
18−#include "plugin.h"
19−
20−#include "horizontaljournal.h"
21−#include "listviewwithpageheader.h"
22−#include "organicgrid.h"
23−#include "verticaljournal.h"
24−
25−#include <QAbstractItemModel>
26−#include <QUrlQuery>
27−
28−static QUrl oauthCleanedUrl(QUrl u)
29−{
30− QUrlQuery q(u);
31− q.removeQueryItem(QStringLiteral("oauth_nonce"));
32− q.removeQueryItem(QStringLiteral("oauth_timestamp"));
33− q.removeQueryItem(QStringLiteral("oauth_consumer_key"));
34− q.removeQueryItem(QStringLiteral("oauth_signature_method"));
35− q.removeQueryItem(QStringLiteral("oauth_version"));
36− q.removeQueryItem(QStringLiteral("oauth_signature"));
37− u.setQuery(q);
38− return u;
39−}
40−
41−class AudioComparer : public QObject
42−{
43− Q_OBJECT
44−public:
45− Q_INVOKABLE bool compare(const QUrl &url1, const QUrl &url2)
46− {
47− return oauthCleanedUrl(url1) == oauthCleanedUrl(url2);
48− }
49−};
50−
51−static QObject *audio_comparer_singleton_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
52−{
53− Q_UNUSED(engine)
54− Q_UNUSED(scriptEngine)
55−
56− return new AudioComparer();
57−}
58−
59−void DashPlugin::registerTypes(const char *uri)
60−{
61− Q_ASSERT(uri == QLatin1String("Dash"));
62− qmlRegisterType<QAbstractItemModel>();
63− qmlRegisterType<HorizontalJournal>(uri, 0, 1, "HorizontalJournal");
64− qmlRegisterType<ListViewWithPageHeader>(uri, 0, 1, "ListViewWithPageHeader");
65− qmlRegisterType<OrganicGrid>(uri, 0, 1, "OrganicGrid");
66− qmlRegisterType<VerticalJournal>(uri, 0, 1, "VerticalJournal");
67− qmlRegisterSingletonType<AudioComparer>(uri, 0, 1, "AudioUrlComparer", audio_comparer_singleton_provider);
68−}
69−
70−#include "plugin.moc"
plugins/Dash/plugin.hdeleted−33
@@ -1,33 +0,0 @@
1−/*
2− * Copyright (C) 2012 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− */
17−
18−#ifndef DASH_PLUGIN_H
19−#define DASH_PLUGIN_H
20−
21−#include <QtQml/QQmlEngine>
22−#include <QtQml/QQmlExtensionPlugin>
23−
24−class DashPlugin : public QQmlExtensionPlugin
25−{
26− Q_OBJECT
27− Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28−
29−public:
30− void registerTypes(const char *uri) override;
31−};
32−
33−#endif
plugins/Dash/qmldirdeleted−11
@@ -1,11 +0,0 @@
1−module Dash
2−plugin Dash-qml
3−typeinfo Dash.qmltypes
4−singleton CardCreatorCache 0.1 CardCreatorCache.qml
5−singleton DashAudioPlayer 0.1 DashAudioPlayer.qml
6−ScopeStyle 0.1 ScopeStyle.qml
7−CardAttributes 0.1 CardAttributes.qml
8−CardSocialActions 0.1 CardSocialActions.qml
9−CroppedImageMinimumSourceSize 0.1 CroppedImageMinimumSourceSize.qml
10−AudioProgressBar 0.1 AudioProgressBar.qml
11−CardAudioProgress 0.1 CardAudioProgress.qml
plugins/Dash/verticaljournal.cppdeleted−281
@@ -1,281 +0,0 @@
1−/*
2− * Copyright (C) 2013, 2016 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−#include <math.h>
31−
32−#include <private/qquickitem_p.h>
33−
34−VerticalJournal::VerticalJournal()
35− : m_columnWidth(0)
36−{
37−}
38−
39−qreal VerticalJournal::columnWidth() const
40−{
41− return m_columnWidth;
42−}
43−
44−void VerticalJournal::setColumnWidth(qreal columnWidth)
45−{
46− if (columnWidth != m_columnWidth) {
47− m_columnWidth = columnWidth;
48− Q_EMIT columnWidthChanged();
49−
50− if (isComponentComplete()) {
51− Q_FOREACH(const auto &column, m_columnVisibleItems) {
52− Q_FOREACH(const ViewItem item, column) {
53− item.m_item->setWidth(columnWidth);
54− }
55− }
56− relayout();
57− }
58− }
59−}
60−
61−void VerticalJournal::findBottomModelIndexToAdd(int *modelIndex, qreal *yPos)
62−{
63− *modelIndex = 0;
64− *yPos = std::numeric_limits<qreal>::max();
65−
66− Q_FOREACH(const auto &column, m_columnVisibleItems) {
67− if (!column.isEmpty()) {
68− const ViewItem &item = column.last();
69− *yPos = qMin(*yPos, item.y() + item.height() + rowSpacing());
70− *modelIndex = qMax(*modelIndex, item.m_modelIndex + 1);
71− } else {
72− *yPos = 0;
73− }
74− }
75−}
76−
77−void VerticalJournal::findTopModelIndexToAdd(int *modelIndex, qreal *yPos)
78−{
79− *modelIndex = 0;
80− *yPos = std::numeric_limits<qreal>::lowest();
81− int columnToAddTo = -1;
82−
83− // Find the topmost free column
84− for (int i = 0; i < m_columnVisibleItems.count(); ++i) {
85− const auto &column = m_columnVisibleItems[i];
86− if (!column.isEmpty()) {
87− const ViewItem &item = column.first();
88− const auto itemTopPos = item.y() - rowSpacing();
89− if (itemTopPos > *yPos) {
90− *yPos = itemTopPos;
91− *modelIndex = item.m_modelIndex - 1;
92− columnToAddTo = i;
93− }
94− }
95− }
96−
97− if (*modelIndex > 0) {
98− Q_ASSERT(m_indexColumnMap.contains(*modelIndex));
99− while (*modelIndex > 0 && m_indexColumnMap[*modelIndex] != columnToAddTo) {
100− // We found out that we have to add to columnToAddTo
101− // and thought that we had to add *modelIndex, but history tells
102− // it is not correct, so find up from *modelIndex until we found the index
103− // that has to end up in columnToAddTo
104− *modelIndex = *modelIndex - 1;
105− Q_ASSERT(m_indexColumnMap.contains(*modelIndex));
106− }
107− }
108−}
109−
110−bool VerticalJournal::removeNonVisibleItems(qreal bufferFromY, qreal bufferToY)
111−{
112− bool changed = false;
113−
114− for (int i = 0; i < m_columnVisibleItems.count(); ++i) {
115− QList<ViewItem> &column = m_columnVisibleItems[i];
116− while (!column.isEmpty() && column.first().y() + column.first().height() < bufferFromY) {
117− releaseItem(column.takeFirst().m_item);
118− changed = true;
119− }
120−
121− while (!column.isEmpty() && column.last().y() > bufferToY) {
122− releaseItem(column.takeLast().m_item);
123− changed = true;
124− }
125− }
126−
127− return changed;
128−}
129−
130−void VerticalJournal::addItemToView(int modelIndex, QQuickItem *item)
131−{
132− if (item->width() != m_columnWidth) {
133− qWarning() << "Item" << modelIndex << "width is not the one that the columnWidth mandates, resetting it";
134− item->setWidth(m_columnWidth);
135− }
136−
137− // Check if we add it to the bottom of existing column items
138− const QList<ViewItem> &firstColumn = m_columnVisibleItems[0];
139− qreal columnToAddY = !firstColumn.isEmpty() ? firstColumn.last().y() + firstColumn.last().height() : -rowSpacing();
140− int columnToAddTo = 0;
141− for (int i = 1; i < m_columnVisibleItems.count(); ++i) {
142− const QList<ViewItem> &column = m_columnVisibleItems[i];
143− const qreal iY = !column.isEmpty() ? column.last().y() + column.last().height() : -rowSpacing();
144− if (iY < columnToAddY) {
145− columnToAddTo = i;
146− columnToAddY = iY;
147− }
148− }
149−
150− const QList<ViewItem> &columnToAdd = m_columnVisibleItems[columnToAddTo];
151− if (columnToAdd.isEmpty() || columnToAdd.last().m_modelIndex < modelIndex) {
152− item->setX(columnToAddTo * (m_columnWidth + columnSpacing()));
153− item->setY(columnToAddY + rowSpacing());
154−
155− m_columnVisibleItems[columnToAddTo] << ViewItem(item, modelIndex);
156− m_indexColumnMap[modelIndex] = columnToAddTo;
157− } else {
158− Q_ASSERT(m_indexColumnMap.contains(modelIndex));
159− columnToAddTo = m_indexColumnMap[modelIndex];
160− columnToAddY = m_columnVisibleItems[columnToAddTo].first().y();
161−
162− item->setX(columnToAddTo * (m_columnWidth + columnSpacing()));
163− item->setY(columnToAddY - rowSpacing() - item->height());
164−
165− m_columnVisibleItems[columnToAddTo].prepend(ViewItem(item, modelIndex));
166− }
167−}
168−
169−void VerticalJournal::cleanupExistingItems()
170−{
171− // Cleanup the existing items
172− for (int i = 0; i < m_columnVisibleItems.count(); ++i) {
173− QList<ViewItem> &column = m_columnVisibleItems[i];
174− Q_FOREACH(const ViewItem item, column)
175− releaseItem(item.m_item);
176− column.clear();
177− }
178− m_indexColumnMap.clear();
179− setImplicitHeightDirty();
180−}
181−
182−void VerticalJournal::calculateImplicitHeight()
183−{
184− int lastModelIndex = -1;
185− qreal bottomMostY = 0;
186− Q_FOREACH(const auto &column, m_columnVisibleItems) {
187− if (!column.isEmpty()) {
188− const ViewItem &item = column.last();
189− lastModelIndex = qMax(lastModelIndex, item.m_modelIndex);
190− bottomMostY = qMax(bottomMostY, item.y() + item.height());
191− }
192− }
193− if (lastModelIndex >= 0) {
194− const double averageHeight = bottomMostY / (lastModelIndex + 1);
195− setImplicitHeight(bottomMostY + averageHeight * (model()->rowCount() - lastModelIndex - 1));
196− } else {
197− setImplicitHeight(0);
198− }
199−}
200−
201−void VerticalJournal::doRelayout()
202−{
203− QList<ViewItem> allItems;
204− Q_FOREACH(const auto &column, m_columnVisibleItems)
205− allItems << column;
206−
207− qSort(allItems);
208−
209− const int nColumns = qMax(1., floor((double)(width() + columnSpacing()) / (m_columnWidth + columnSpacing())));
210− m_columnVisibleItems.resize(nColumns);
211− m_indexColumnMap.clear();
212− for (int i = 0; i < nColumns; ++i)
213− m_columnVisibleItems[i].clear();
214−
215− // If the first of allItems doesn't contain index 0 we need to drop them
216− // all since we can't consistently relayout without the first item being there
217−
218− if (!allItems.isEmpty()) {
219− if (allItems.first().m_modelIndex == 0) {
220− Q_FOREACH(const ViewItem item, allItems)
221− addItemToView(item.m_modelIndex, item.m_item);
222− } else {
223− Q_FOREACH(const ViewItem item, allItems)
224− releaseItem(item.m_item);
225− }
226− }
227−}
228−
229−void VerticalJournal::updateItemCulling(qreal visibleFromY, qreal visibleToY)
230−{
231− Q_FOREACH(const auto &column, m_columnVisibleItems) {
232− Q_FOREACH(const ViewItem item, column) {
233− const bool cull = item.y() + item.height() <= visibleFromY || item.y() >= visibleToY;
234− QQuickItemPrivate::get(item.m_item)->setCulled(cull);
235− }
236− }
237−}
238−
239−void VerticalJournal::processModelRemoves(const QVector<QQmlChangeSet::Change> &removes)
240−{
241− Q_FOREACH(const QQmlChangeSet::Change remove, removes) {
242− for (int i = remove.count - 1; i >= 0; --i) {
243− const int indexToRemove = remove.index + i;
244− // Since we only support removing from the end, indexToRemove
245− // must refer to the last item of one of the columns or
246− // be bigger than them (because it's not in the viewport and
247− // thus we have not created a delegate for it)
248− bool found = false;
249− int lastCreatedIndex = INT_MIN;
250− for (int i = 0; !found && i < m_columnVisibleItems.count(); ++i) {
251− QList<ViewItem> &column = m_columnVisibleItems[i];
252− if (!column.isEmpty()) {
253− const int lastColumnIndex = column.last().m_modelIndex;
254− if (lastColumnIndex == indexToRemove) {
255− releaseItem(column.takeLast().m_item);
256− found = true;
257− }
258− lastCreatedIndex = qMax(lastCreatedIndex, lastColumnIndex);
259− }
260− }
261− if (!found) {
262− if (indexToRemove < lastCreatedIndex) {
263− qDebug() << "VerticalJournal only supports removal from the end of the model, resetting instead";
264− cleanupExistingItems();
265− break;
266− } else {
267− setImplicitHeightDirty();
268− }
269− }
270− }
271− }
272−}
273−
274−
275−//void VerticalJournal::itemGeometryChanged(QQuickItem * /*item*/, const QRectF &newGeometry, const QRectF &oldGeometry)
276−//{
277−// const qreal heightDiff = newGeometry.height() - oldGeometry.height();
278−// if (heightDiff != 0) {
279−// relayout();
280−// }
281−//}
plugins/Dash/verticaljournal.hdeleted−103
@@ -1,103 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef VERTICALJOURNAL_H
18−#define VERTICALJOURNAL_H
19−
20−#include "abstractdashview.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 AbstractDashView
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−protected:
69−// void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) override;
70−
71−Q_SIGNALS:
72− void columnWidthChanged();
73−
74−private:
75− class ViewItem
76− {
77− public:
78− ViewItem(QQuickItem *item, int modelIndex) : m_item(item), m_modelIndex(modelIndex) {}
79− qreal x() const { return m_item->x(); }
80− qreal y() const { return m_item->y(); }
81− qreal height() const { return m_item->height(); }
82− bool operator<(const ViewItem v) const { return m_modelIndex < v.m_modelIndex; }
83−
84− QQuickItem *m_item;
85− int m_modelIndex;
86− };
87−
88− void findBottomModelIndexToAdd(int *modelIndex, qreal *yPos) override;
89− void findTopModelIndexToAdd(int *modelIndex, qreal *yPos) override;
90− bool removeNonVisibleItems(qreal bufferFromY, qreal bufferToY) override;
91− void addItemToView(int modelIndex, QQuickItem *item) override;
92− void cleanupExistingItems() override;
93− void calculateImplicitHeight() override;
94− void doRelayout() override;
95− void updateItemCulling(qreal visibleFromY, qreal visibleToY) override;
96− void processModelRemoves(const QVector<QQmlChangeSet::Change> &removes) override;
97−
98− QVector<QList<ViewItem>> m_columnVisibleItems;
99− QHash<int, int> m_indexColumnMap;
100− int m_columnWidth;
101−};
102−
103−#endif
plugins/GlobalShortcut/globalshortcut.cpp+3
@@ -58,6 +58,9 @@ void GlobalShortcut::setActive(bool active)
5858
5959void GlobalShortcut::componentComplete()
6060{
61+ if (this->window()) {
62+ QMetaObject::invokeMethod(this, "setupFilterOnWindow", Q_ARG(QQuickWindow*, this->window()));
63+ }
6164 connect(this, &QQuickItem::windowChanged, this, &GlobalShortcut::setupFilterOnWindow);
6265}
6366
plugins/ImageCache/CMakeLists.txtdeleted−8
@@ -1,8 +0,0 @@
1−add_library(ImageCache-qml MODULE
2− ImageCache.cpp
3− plugin.cpp
4− )
5−
6−target_link_libraries(ImageCache-qml Qt5::Gui Qt5::Qml Qt5::Quick)
7−
8−add_unity8_plugin(ImageCache 0.1 ImageCache TARGETS ImageCache-qml)
plugins/ImageCache/ImageCache.cppdeleted−135
@@ -1,135 +0,0 @@
1−/*
2− * Copyright (C) 2016 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 <QDateTime>
18−#include <QDebug>
19−#include <QDir>
20−#include <QUrl>
21−#include <QUrlQuery>
22−
23−#include "ImageCache.h"
24−
25−ImageCache::ImageCache()
26− : QQuickImageProvider(QQmlImageProviderBase::Image,
27− QQmlImageProviderBase::ForceAsynchronousImageLoading)
28−{
29−}
30−
31−QString ImageCache::imageCacheRoot()
32−{
33− QString xdgCache(qgetenv("XDG_CACHE_HOME"));
34− if (xdgCache.isEmpty()) {
35− xdgCache = QDir::homePath() + QStringLiteral("/.cache");
36− }
37−
38− return QDir::cleanPath(xdgCache) + QStringLiteral("/unity8/imagecache");
39−}
40−
41−QFileInfo ImageCache::imagePath(const QUrl &image)
42−{
43− QUrlQuery query(image);
44−
45− auto name = query.queryItemValue(QStringLiteral("name"));
46− if (name.isEmpty()) {
47− name = QStringLiteral("/paths") + image.toLocalFile();
48− } else {
49− name = QStringLiteral("/names/") + name;
50− }
51−
52− return QFileInfo(imageCacheRoot() + name);
53−}
54−
55−bool ImageCache::needsUpdate(const QUrl &image, const QFileInfo &cachePath, const QSize &imageSize, const QSize &requestedSize, QSize &finalSize)
56−{
57− if (!cachePath.exists())
58− return true;
59−
60− QFileInfo imageInfo(image.toLocalFile());
61− if (imageInfo.lastModified() > cachePath.lastModified())
62− return true;
63−
64− QSize cacheSize(QImageReader(cachePath.filePath()).size());
65− finalSize = calculateSize(imageSize, requestedSize);
66− if (finalSize.isValid() && cacheSize != finalSize)
67− return true;
68−
69− return false;
70−}
71−
72−QSize ImageCache::calculateSize(const QSize &imageSize, const QSize &requestedSize)
73−{
74− QSize finalSize(requestedSize);
75−
76− if (finalSize.width() == 0) {
77− finalSize.setWidth(imageSize.width() * (((double)finalSize.height()) / imageSize.height()));
78− } else if (finalSize.height() == 0) {
79− finalSize.setHeight(imageSize.height() * (((double)finalSize.width()) / imageSize.width()));
80− }
81−
82− return finalSize;
83−}
84−
85−QImage ImageCache::loadAndCacheImage(QImageReader &reader, const QFileInfo &cachePath, const QSize &finalSize)
86−{
87− reader.setQuality(100);
88− reader.setScaledSize(finalSize);
89− auto format = reader.format(); // can't get this after reading
90−
91− QImage loadedImage(reader.read());
92− if (loadedImage.isNull()) {
93− qWarning() << "ImageCache could not read image" << reader.fileName() << ":" << reader.errorString();
94− return QImage();
95− }
96−
97− cachePath.dir().mkpath(QStringLiteral("."));
98− loadedImage.save(cachePath.filePath(), format, 100);
99−
100− return loadedImage;
101−}
102−
103−QImage ImageCache::requestImage(const QString &id, QSize *size, const QSize &requestedSize)
104−{
105− QUrl image(id);
106− QImageReader imageReader(image.toLocalFile());
107− QSize imageSize(imageReader.size());
108− QImage result;
109−
110− // Early exit here, with no sourceSize, scaled-up sourceSize, or bad source image
111− if ((requestedSize.width() <= 0 && requestedSize.height() <= 0) ||
112− imageSize.isEmpty() ||
113− requestedSize.height() >= imageSize.height() ||
114− requestedSize.width() >= imageSize.width()) {
115− // We're only interested in scaling down, not up.
116− result = imageReader.read();
117− *size = result.size();
118− return result;
119− }
120−
121− auto cachePath = imagePath(image);
122− QSize finalSize;
123−
124− if (needsUpdate(image, cachePath, imageSize, requestedSize, finalSize)) {
125− if (finalSize.isEmpty()) {
126− finalSize = calculateSize(imageSize, requestedSize);
127− }
128− result = loadAndCacheImage(imageReader, cachePath, finalSize);
129− } else {
130− result = QImage(cachePath.filePath());
131− }
132−
133− *size = result.size();
134− return result;
135−}
plugins/ImageCache/ImageCache.hdeleted−53
@@ -1,53 +0,0 @@
1−/*
2− * Copyright (C) 2016 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 once
18−
19−#include <QFileInfo>
20−#include <QImageReader>
21−#include <QQuickImageProvider>
22−#include <QSize>
23−
24−/**
25− * This class accepts an id formulated like a URL. So you'd use something like:
26− *
27− * Image {
28− * source: "image://unity8imagecache/file:///usr/share/..."
29− * }
30− *
31− * Right now, we only support file:/// URLs. We do accept some flags though:
32− *
33− * ?name=NAME
34− * - This will use NAME as the cache lookup key instead of the provided URL.
35− *
36− * We don't do any cleaning of old cached files yet. So you may want to always
37− * provide a name to avoid leaving lots of files around.
38− */
39−
40−class ImageCache: public QQuickImageProvider
41−{
42−public:
43− ImageCache();
44−
45− QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize) override;
46−
47−private:
48− static QString imageCacheRoot();
49− static QFileInfo imagePath(const QUrl &image);
50− static bool needsUpdate(const QUrl &image, const QFileInfo &cachePath, const QSize &imageSize, const QSize &requestedSize, QSize &finalSize);
51− static QSize calculateSize(const QSize &imageSize, const QSize &requestedSize);
52− static QImage loadAndCacheImage(QImageReader &reader, const QFileInfo &cachePath, const QSize &finalSize);
53−};
plugins/ImageCache/plugin.cppdeleted−39
@@ -1,39 +0,0 @@
1−/*
2− * Copyright (C) 2016 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 <QQmlEngine>
18−
19−#include "ImageCache.h"
20−#include "plugin.h"
21−
22−#include <QtQml>
23−
24−void ImageCachePlugin::registerTypes(const char *uri)
25−{
26− Q_ASSERT(uri == QLatin1String("ImageCache"));
27−
28− qmlRegisterTypeNotAvailable(uri, 0, 1, "__ImageCacheIgnoreMe",
29− QStringLiteral("Ignore this: QML plugins must contain at least one type"));
30−}
31−
32−void ImageCachePlugin::initializeEngine(QQmlEngine* engine, const char* uri)
33−{
34− Q_ASSERT(uri == QLatin1String("ImageCache"));
35−
36− QQmlExtensionPlugin::initializeEngine(engine, uri);
37−
38− engine->addImageProvider("unity8imagecache", new ImageCache);
39−}
plugins/ImageCache/plugin.hdeleted−31
@@ -1,31 +0,0 @@
1−/*
2− * Copyright (C) 2016 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 once
18−
19−#include <QQmlExtensionPlugin>
20−
21−class QQmlEngine;
22−
23−class ImageCachePlugin : public QQmlExtensionPlugin
24−{
25− Q_OBJECT
26− Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
27−
28−public:
29− void registerTypes(const char* uri) override;
30− void initializeEngine(QQmlEngine* engine, const char* uri) override;
31−};
plugins/ImageCache/qmldirdeleted−2
@@ -1,2 +0,0 @@
1−module ImageCache
2−plugin ImageCache-qml
plugins/LightDM/DBusGreeterList.cpp+3−3
@@ -25,7 +25,7 @@ DBusGreeterList::DBusGreeterList(Greeter *greeter, const QString &path)
2525 m_greeter(greeter)
2626{
2727 connect(m_greeter, &Greeter::authenticationUserChanged, this, &DBusGreeterList::authenticationUserChangedHandler);
28− connect(m_greeter, &Greeter::isAuthenticatedChanged, this, &DBusGreeterList::authenticatedChangedHandler);
28+ connect(m_greeter, &Greeter::promptlessChanged, this, &DBusGreeterList::promptlessChangedHandler);
2929}
3030
3131QString DBusGreeterList::GetActiveEntry() const
@@ -40,7 +40,7 @@ void DBusGreeterList::SetActiveEntry(const QString &entry)
4040
4141bool DBusGreeterList::entryIsLocked() const
4242{
43− return !m_greeter->isAuthenticated();
43+ return !m_greeter->promptless();
4444}
4545
4646void DBusGreeterList::authenticationUserChangedHandler()
@@ -49,7 +49,7 @@ void DBusGreeterList::authenticationUserChangedHandler()
4949 Q_EMIT EntrySelected(m_greeter->authenticationUser());
5050}
5151
52−void DBusGreeterList::authenticatedChangedHandler()
52+void DBusGreeterList::promptlessChangedHandler()
5353{
5454 notifyPropertyChanged(QStringLiteral("EntryIsLocked"), entryIsLocked());
5555 Q_EMIT entryIsLockedChanged();
plugins/LightDM/DBusGreeterList.h+1−1
@@ -48,7 +48,7 @@ Q_SIGNALS:
4848
4949private Q_SLOTS:
5050 void authenticationUserChangedHandler();
51− void authenticatedChangedHandler();
51+ void promptlessChangedHandler();
5252
5353private:
5454 Greeter *m_greeter;
plugins/LightDM/Greeter.cpp+16
@@ -27,6 +27,7 @@ GreeterPrivate::GreeterPrivate(Greeter* parent)
2727 m_active(false),
2828 responded(false),
2929 everResponded(false),
30+ promptless(false),
3031 q_ptr(parent)
3132{
3233}
@@ -112,6 +113,12 @@ QString Greeter::defaultSessionHint() const
112113 return d->m_greeter->defaultSessionHint();
113114}
114115
116+bool Greeter::promptless() const
117+{
118+ Q_D(const Greeter);
119+ return d->promptless;
120+}
121+
115122QString Greeter::selectUser() const
116123{
117124 Q_D(const Greeter);
@@ -146,6 +153,10 @@ void Greeter::authenticate(const QString &username)
146153 d->prompts.clear();
147154 d->responded = false;
148155 d->everResponded = false;
156+ if (d->promptless) {
157+ d->promptless = false;
158+ Q_EMIT promptlessChanged();
159+ }
149160
150161 if (authenticationUser() == username) {
151162 d->prompts = d->leftovers;
@@ -235,6 +246,11 @@ void Greeter::authenticationCompleteFilter()
235246 bool automatic = !d->everResponded;
236247 bool pamHasLeftoverMessages = !d->prompts.hasPrompt() && d->prompts.rowCount() > 0;
237248
249+ if (isAuthenticated() && automatic) {
250+ d->promptless = true;
251+ Q_EMIT promptlessChanged();
252+ }
253+
238254 if (!isAuthenticated()) {
239255 if (pamHasLeftoverMessages) {
240256 d->leftovers = d->prompts; // Prefer PAM's messages
plugins/LightDM/Greeter.h+3
@@ -37,6 +37,7 @@ class Greeter : public QObject
3737 Q_PROPERTY(bool authenticated READ isAuthenticated NOTIFY isAuthenticatedChanged)
3838 Q_PROPERTY(QString authenticationUser READ authenticationUser NOTIFY authenticationUserChanged)
3939 Q_PROPERTY(QString defaultSession READ defaultSessionHint CONSTANT)
40+ Q_PROPERTY(bool promptless READ promptless NOTIFY promptlessChanged)
4041 Q_PROPERTY(QString selectUser READ selectUser CONSTANT)
4142
4243public:
@@ -47,6 +48,7 @@ public:
4748 bool isAuthenticated() const;
4849 QString authenticationUser() const;
4950 QString defaultSessionHint() const;
51+ bool promptless() const;
5052 QString selectUser() const;
5153 bool hasGuestAccount() const;
5254 bool showManualLoginHint() const;
@@ -64,6 +66,7 @@ Q_SIGNALS:
6466 void authenticationUserChanged();
6567 void isActiveChanged();
6668 void isAuthenticatedChanged();
69+ void promptlessChanged();
6770 void showGreeter();
6871 void hideGreeter();
6972 void loginError(bool automatic);
plugins/LightDM/GreeterPrivate.h+1
@@ -34,6 +34,7 @@ public:
3434 PromptsModel leftovers; // prompts to show during next auth for same user
3535 bool responded;
3636 bool everResponded;
37+ bool promptless;
3738 QString cachedAuthUser;
3839
3940protected:
plugins/Lights/CMakeLists.txt+5−1
@@ -1,5 +1,6 @@
11pkg_check_modules(ANDROID_HEADERS REQUIRED android-headers)
22pkg_check_modules(ANDROID_HARDWARE REQUIRED libhardware)
3+pkg_check_modules(ANDROID_PROPERTIES REQUIRED libandroid-properties)
34
45include_directories(
56 SYSTEM
@@ -9,11 +10,14 @@ include_directories(
910add_library(Lights-qml MODULE
1011 plugin.cpp
1112 Lights.cpp
13+ LegacyLights.cpp
14+ HfdLights.cpp
1215 )
1316
1417target_link_libraries(Lights-qml
15− Qt5::Qml Qt5::Gui
18+ Qt5::Qml Qt5::Gui Qt5::DBus
1619 ${ANDROID_HARDWARE_LIBRARIES}
20+ ${ANDROID_PROPERTIES_LIBRARIES}
1721 )
1822
1923add_unity8_plugin(Lights 0.1 Lights TARGETS Lights-qml)
plugins/Lights/HfdLights.cppnew file+62
@@ -0,0 +1,62 @@
1+/*
2+ * Copyright (C) 2021 UBports Foundation.
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: Florian Leeber <florian@ubports.com>
17+ */
18+
19+#include "HfdLights.h"
20+#include <QtCore/QDebug>
21+#include <QDBusArgument>
22+#include <QDBusConnection>
23+#include <iostream>
24+
25+#define HFD_SERVICE_NAME "com.lomiri.hfd"
26+#define HFD_SERVICE_PATH "/com/lomiri/hfd"
27+#define HFD_SERVICE_INTERFACE "com.lomiri.hfd.Leds"
28+
29+HfdLights::HfdLights(QObject* parent)
30+ : Lights(parent)
31+{
32+ m_hfdInterface = new QDBusInterface(
33+ QStringLiteral(HFD_SERVICE_NAME),
34+ QStringLiteral(HFD_SERVICE_PATH),
35+ QStringLiteral(HFD_SERVICE_INTERFACE),
36+ QDBusConnection::systemBus(),
37+ this
38+ );
39+}
40+
41+bool HfdLights::init()
42+{
43+ // hfd does not need any initalization to be used
44+ return true;
45+}
46+
47+void HfdLights::turnOn()
48+{
49+ m_hfdInterface->call(QStringLiteral("setState"), 0);
50+ m_hfdInterface->call(QStringLiteral("setColor"), (quint32)m_color.rgba());
51+ m_hfdInterface->call(QStringLiteral("setOnMs"), m_onMs);
52+ m_hfdInterface->call(QStringLiteral("setOffMs"), m_offMs);
53+ m_hfdInterface->call(QStringLiteral("setState"), 1);
54+}
55+
56+void HfdLights::turnOff()
57+{
58+ m_hfdInterface->call(QStringLiteral("setState"), 0);
59+ m_hfdInterface->call(QStringLiteral("setColor"), (quint32)0);
60+ m_hfdInterface->call(QStringLiteral("setOnMs"), 0);
61+ m_hfdInterface->call(QStringLiteral("setOffMs"), 0);
62+}
tests/mocks/Unity/fake_unity_plugin.h → plugins/Lights/HfdLights.hrenamed+17−9
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2021 UBports Foundation.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -13,22 +13,30 @@
1313 * 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/>.
1515 *
16− * Author: Nick Dedekind <nick.dedekind@canonical.com>
16+ * Author: Florian Leeber <florian@ubports.com>
1717 */
1818
19−#ifndef FAKE_UNITY_PLUGIN_H
20−#define FAKE_UNITY_PLUGIN_H
19+#ifndef UNITY_HFDLIGHTS_H
20+#define UNITY_HFDLIGHTS_H
2121
22−// Qt
23−#include <QtQml/QQmlExtensionPlugin>
22+#include <QtCore/QObject>
23+#include <QDBusInterface>
24+#include "Lights.h"
2425
25−class FakeUnityPlugin : public QQmlExtensionPlugin
26+class HfdLights: public Lights
2627{
2728 Q_OBJECT
28− Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
2929
3030public:
31− void registerTypes(const char *uri) override;
31+ explicit HfdLights(QObject *parent = 0);
32+
33+protected:
34+ bool init() override;
35+ void turnOff() override;
36+ void turnOn() override;
37+
38+private:
39+ QDBusInterface* m_hfdInterface;
3240};
3341
3442#endif
plugins/Lights/LegacyLights.cppnew file+91
@@ -0,0 +1,91 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ * Copyright (C) 2021 UBports Foundation.
4+ *
5+ * This program is free software; you can redistribute it and/or modify
6+ * it under the terms of the GNU General Public License as published by
7+ * the Free Software Foundation; version 3.
8+ *
9+ * This program is distributed in the hope that it will be useful,
10+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+ * GNU General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU General Public License
15+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
16+ *
17+ * Author: Renato Araujo Oliveira Filho <renato.filho@canonical.com>
18+ */
19+
20+#include "LegacyLights.h"
21+#include <QtCore/QDebug>
22+
23+extern "C" {
24+#include "android-hardware.h"
25+#include <string.h>
26+}
27+
28+LegacyLights::~LegacyLights()
29+{
30+ if (m_lightDevice) {
31+ hw_device_t* device = (hw_device_t*) m_lightDevice;
32+ device->close(device);
33+ }
34+}
35+
36+bool LegacyLights::init()
37+{
38+ if (m_lightDevice) {
39+ return true;
40+ }
41+
42+ int err;
43+ hw_module_t* module;
44+
45+ err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID, (hw_module_t const**)&module);
46+ if (err == 0) {
47+ hw_device_t* device;
48+ err = module->methods->open(module, LIGHT_ID_NOTIFICATIONS, &device);
49+ if (err == 0) {
50+ m_lightDevice = (light_device_t*)device;
51+ turnOff();
52+ return true;
53+ } else {
54+ qWarning() << "Failed to access notification lights";
55+ }
56+ } else {
57+ qWarning() << "Failed to initialize lights hardware.";
58+ }
59+ return false;
60+}
61+
62+void LegacyLights::turnOn()
63+{
64+ // pulse
65+ light_state_t state;
66+ memset(&state, 0, sizeof(light_state_t));
67+ state.color = m_color.rgba();
68+ state.flashMode = LIGHT_FLASH_TIMED;
69+ state.flashOnMS = m_onMs;
70+ state.flashOffMS = m_offMs;
71+ state.brightnessMode = BRIGHTNESS_MODE_USER;
72+
73+ if (m_lightDevice->set_light(m_lightDevice, &state) != 0) {
74+ qWarning() << "Failed to turn the light off";
75+ }
76+}
77+
78+void LegacyLights::turnOff()
79+{
80+ light_state_t state;
81+ memset(&state, 0, sizeof(light_state_t));
82+ state.color = 0x00000000;
83+ state.flashMode = LIGHT_FLASH_NONE;
84+ state.flashOnMS = 0;
85+ state.flashOffMS = 0;
86+ state.brightnessMode = 0;
87+
88+ if (m_lightDevice->set_light(m_lightDevice, &state) != 0) {
89+ qWarning() << "Failed to turn the light off";
90+ }
91+}
tests/mocks/Unity/DashCommunicator/plugin.h → plugins/Lights/LegacyLights.hrenamed+19−8
@@ -1,5 +1,6 @@
11/*
22 * Copyright (C) 2014 Canonical, Ltd.
3+ * Copyright (C) 2021 UBports Foundation.
34 *
45 * This program is free software; you can redistribute it and/or modify
56 * it under the terms of the GNU General Public License as published by
@@ -13,22 +14,32 @@
1314 * You should have received a copy of the GNU General Public License
1415 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1516 *
16− * Authors: Michael Zanetti <michael.zanetti@canonical.com>
17+ * Author: Renato Araujo Oliveira Filho <renato.filho@canonical.com>
1718 */
1819
19−#ifndef DASHCOMMUNICATOR_PLUGIN_H
20−#define DASHCOMMUNICATOR_PLUGIN_H
20+#ifndef UNITY_LEGACYLIGHTS_H
21+#define UNITY_LEGACYLIGHTS_H
2122
22−#include <QtQml/QQmlEngine>
23−#include <QtQml/QQmlExtensionPlugin>
23+#include <QtCore/QObject>
24+#include "Lights.h"
2425
25−class DashCommunicatorPlugin : public QQmlExtensionPlugin
26+struct light_device_t;
27+
28+class LegacyLights: public Lights
2629{
2730 Q_OBJECT
28− Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
2931
3032public:
31− void registerTypes(const char *uri) override;
33+ ~LegacyLights();
34+
35+protected:
36+ bool init() override;
37+ void turnOff() override;
38+ void turnOn() override;
39+
40+private:
41+ light_device_t* m_lightDevice;
42+
3243};
3344
3445#endif
plugins/Lights/Lights.cpp−65
@@ -26,20 +26,12 @@ extern "C" {
2626
2727Lights::Lights(QObject* parent)
2828 : QObject(parent),
29− m_lightDevice(0),
3029 m_color("blue"),
3130 m_state(Lights::Off),
3231 m_onMs(1000),
3332 m_offMs(3000)
3433{
35−}
3634
37−Lights::~Lights()
38−{
39− if (m_lightDevice) {
40− hw_device_t* device = (hw_device_t*) m_lightDevice;
41− device->close(device);
42− }
4335}
4436
4537void Lights::setState(Lights::State newState)
@@ -107,60 +99,3 @@ void Lights::setOffMillisec(int offMs)
10799 // FIXME: update the property if the light is already on
108100 }
109101}
110−
111−bool Lights::init()
112−{
113− if (m_lightDevice) {
114− return true;
115− }
116−
117− int err;
118− hw_module_t* module;
119−
120− err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID, (hw_module_t const**)&module);
121− if (err == 0) {
122− hw_device_t* device;
123− err = module->methods->open(module, LIGHT_ID_NOTIFICATIONS, &device);
124− if (err == 0) {
125− m_lightDevice = (light_device_t*)device;
126− turnOff();
127− return true;
128− } else {
129− qWarning() << "Failed to access notification lights";
130− }
131− } else {
132− qWarning() << "Failed to initialize lights hardware.";
133− }
134− return false;
135−}
136−
137−void Lights::turnOn()
138−{
139− // pulse
140− light_state_t state;
141− memset(&state, 0, sizeof(light_state_t));
142− state.color = m_color.rgba();
143− state.flashMode = LIGHT_FLASH_TIMED;
144− state.flashOnMS = m_onMs;
145− state.flashOffMS = m_offMs;
146− state.brightnessMode = BRIGHTNESS_MODE_USER;
147−
148− if (m_lightDevice->set_light(m_lightDevice, &state) != 0) {
149− qWarning() << "Failed to turn the light off";
150− }
151−}
152−
153−void Lights::turnOff()
154−{
155− light_state_t state;
156− memset(&state, 0, sizeof(light_state_t));
157− state.color = 0x00000000;
158− state.flashMode = LIGHT_FLASH_NONE;
159− state.flashOnMS = 0;
160− state.flashOffMS = 0;
161− state.brightnessMode = 0;
162−
163− if (m_lightDevice->set_light(m_lightDevice, &state) != 0) {
164− qWarning() << "Failed to turn the light off";
165− }
166−}
plugins/Lights/Lights.h+4−8
@@ -22,8 +22,6 @@
2222#include <QtCore/QObject>
2323#include <QtGui/QColor>
2424
25−struct light_device_t;
26−
2725class Lights: public QObject
2826{
2927 Q_OBJECT
@@ -40,7 +38,6 @@ public:
4038 Q_ENUM(State)
4139
4240 explicit Lights(QObject *parent = 0);
43− ~Lights();
4441
4542 void setState(State newState);
4643 State state() const;
@@ -60,16 +57,15 @@ Q_SIGNALS:
6057 void onMillisecChanged(int onMs);
6158 void offMillisecChanged(int offMs);
6259
63−private:
64− light_device_t* m_lightDevice;
60+protected:
6561 QColor m_color;
6662 State m_state;
6763 int m_onMs;
6864 int m_offMs;
6965
70− bool init();
71− void turnOff();
72− void turnOn();
66+ virtual bool init() = 0;
67+ virtual void turnOff() = 0;
68+ virtual void turnOn() = 0;
7369};
7470
7571#endif
plugins/Lights/plugin.cpp+20−1
@@ -18,6 +18,11 @@
1818
1919#include "plugin.h"
2020#include "Lights.h"
21+#include "HfdLights.h"
22+#include "LegacyLights.h"
23+
24+// libandroid-properties
25+#include <hybris/properties/properties.h>
2126
2227#include <QtQml/qqml.h>
2328
@@ -25,7 +30,21 @@ static QObject *lights_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
2530{
2631 Q_UNUSED(engine)
2732 Q_UNUSED(scriptEngine)
28− return new Lights();
33+
34+ bool use_hfd = false;
35+ char buffer[PROP_VALUE_MAX];
36+ auto result = property_get("ro.build.version.sdk", buffer, "0");
37+ if (result) {
38+ auto sdkVersion = QString(buffer).toInt();
39+ if (sdkVersion >= 27 || sdkVersion == 0) {
40+ use_hfd = true;
41+ }
42+ }
43+ if (use_hfd) {
44+ return new HfdLights();
45+ } else {
46+ return new LegacyLights();
47+ }
2948}
3049
3150void LightsPlugin::registerTypes(const char *uri)
plugins/Ubuntu/Gestures/TouchGestureArea.cpp+6
@@ -328,6 +328,12 @@ void TouchGestureArea::touchEvent_rejected(QTouchEvent *event)
328328 }
329329 }
330330 }
331+
332+ // If this event is a new touch, ignore it and let the item below have it.
333+ // We won't recognize any new touch until the whole current gesture is done
334+ // i.e. we're in WaitingForTouch state.
335+ // And even if it isn't, just ignore it anyway; we don't care about it.
336+ event->ignore();
331337}
332338
333339void TouchGestureArea::unownedTouchEvent(QTouchEvent *unownedTouchEvent)
plugins/Unity/CMakeLists.txt−1
@@ -3,6 +3,5 @@ add_subdirectory(Connectivity)
33add_subdirectory(Indicators)
44add_subdirectory(Launcher)
55add_subdirectory(Session)
6−add_subdirectory(DashCommunicator)
76add_subdirectory(InputInfo)
87add_subdirectory(Platform)
plugins/Unity/DashCommunicator/CMakeLists.txtdeleted−25
@@ -1,25 +0,0 @@
1−include_directories(
2− ${CMAKE_CURRENT_SOURCE_DIR}
3− ${CMAKE_CURRENT_BINARY_DIR}
4− ${libunity8-private_SOURCE_DIR}
5−)
6−
7−set(QMLDASHCOMMUNICATORPLUGIN_SRC
8− plugin.cpp
9− dbusdashcommunicatorservice.cpp
10− dashcommunicatorservice.cpp
11− dashcommunicator.cpp
12− dashconnection.cpp
13−)
14−
15−add_library(DashCommunicator-qml MODULE
16− ${QMLDASHCOMMUNICATORPLUGIN_SRC}
17−)
18−
19−target_link_libraries(DashCommunicator-qml
20− Qt5::DBus Qt5::Qml
21− unity8-private
22−)
23−
24−# export the qmldir and qmltypes files
25−add_unity8_plugin(Unity.DashCommunicator 0.1 Unity/DashCommunicator TARGETS DashCommunicator-qml)
plugins/Unity/DashCommunicator/dashcommunicator.cppdeleted−58
@@ -1,58 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software: you can redistribute it and/or modify it under
5− * the terms of the GNU Lesser General Public License version 3, as published by
6− * the Free Software Foundation.
7− *
8− * This program is distributed in the hope that it will be useful, but WITHOUT
9− * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10− * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11− * Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "dashcommunicator.h"
18−#include "dashconnection.h"
19−
20−#include <QObject>
21−
22−DashCommunicator::DashCommunicator(QObject *parent):
23− QThread(parent),
24− m_dashConnection(nullptr),
25− m_created(false)
26−{
27− start();
28−}
29−
30−DashCommunicator::~DashCommunicator()
31−{
32− quit();
33− wait();
34−}
35−
36−void DashCommunicator::setCurrentScope(int index, bool animate, bool isSwipe)
37−{
38− m_mutex.lock();
39− if (m_created) {
40− QMetaObject::invokeMethod(m_dashConnection, "setCurrentScope",
41− Q_ARG(int, index),
42− Q_ARG(bool, animate),
43− Q_ARG(bool, isSwipe));
44− }
45− m_mutex.unlock();
46−}
47−
48−void DashCommunicator::run()
49−{
50− m_dashConnection = new DashConnection(QStringLiteral("com.canonical.UnityDash"),
51− QStringLiteral("/com/canonical/UnityDash"),
52− QLatin1String(""), this);
53− m_mutex.lock();
54− m_created = true;
55− m_mutex.unlock();
56−
57− exec();
58−}
plugins/Unity/DashCommunicator/dashcommunicator.hdeleted−45
@@ -1,45 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software: you can redistribute it and/or modify it under
5− * the terms of the GNU Lesser General Public License version 3, as published by
6− * the Free Software Foundation.
7− *
8− * This program is distributed in the hope that it will be useful, but WITHOUT
9− * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10− * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11− * Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef DASHCOMMUNICATOR_H
18−#define DASHCOMMUNICATOR_H
19−
20−// Qt
21−#include <QThread>
22−#include <QMutex>
23−
24−class DashConnection;
25−
26−class DashCommunicator: public QThread
27−{
28− Q_OBJECT
29−public:
30− explicit DashCommunicator(QObject *parent = 0);
31− ~DashCommunicator();
32−
33−public Q_SLOTS:
34− void setCurrentScope(int index, bool animate, bool isSwipe);
35−
36−protected:
37− void run() override;
38−
39−private:
40− DashConnection *m_dashConnection;
41− bool m_created;
42− QMutex m_mutex;
43−};
44−
45−#endif
plugins/Unity/DashCommunicator/dashcommunicatorservice.cppdeleted−30
@@ -1,30 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software: you can redistribute it and/or modify it under
5− * the terms of the GNU Lesser General Public License version 3, as published by
6− * the Free Software Foundation.
7− *
8− * This program is distributed in the hope that it will be useful, but WITHOUT
9− * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10− * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11− * Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "dashcommunicatorservice.h"
18−
19−DashCommunicatorService::DashCommunicatorService(QObject *parent):
20− QObject(parent),
21− m_dbusService(new DBusDashCommunicatorService(this))
22−{
23− connect(m_dbusService, &DBusDashCommunicatorService::setCurrentScopeRequested, this, &DashCommunicatorService::setCurrentScopeRequested);
24−}
25−
26−
27−DashCommunicatorService::~DashCommunicatorService()
28−{
29−
30−}
plugins/Unity/DashCommunicator/dashcommunicatorservice.hdeleted−38
@@ -1,38 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software: you can redistribute it and/or modify it under
5− * the terms of the GNU Lesser General Public License version 3, as published by
6− * the Free Software Foundation.
7− *
8− * This program is distributed in the hope that it will be useful, but WITHOUT
9− * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10− * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11− * Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef DASHCOMMUNICATORSERVICE_H
18−#define DASHCOMMUNICATORSERVICE_H
19−
20−#include "dbusdashcommunicatorservice.h"
21−
22−#include <QObject>
23−
24−class DashCommunicatorService: public QObject
25−{
26− Q_OBJECT
27−public:
28− DashCommunicatorService(QObject *parent = 0);
29− ~DashCommunicatorService();
30−
31−Q_SIGNALS:
32− void setCurrentScopeRequested(int index, bool animate, bool isSwipe);
33−
34−private:
35− DBusDashCommunicatorService *m_dbusService;
36−};
37−
38−#endif // DBUSUNITYSESSIONSERVICE_H
plugins/Unity/DashCommunicator/dashconnection.cppdeleted−66
@@ -1,66 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software: you can redistribute it and/or modify it under
5− * the terms of the GNU Lesser General Public License version 3, as published by
6− * the Free Software Foundation.
7− *
8− * This program is distributed in the hope that it will be useful, but WITHOUT
9− * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10− * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11− * Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "dashconnection.h"
18−
19−#include <QDBusInterface>
20−#include <QDBusPendingCall>
21−
22−/* The default implementation of AbstractDBusServiceMonitor creates a QDBusInterface when the service
23− * appears on the bus.
24− *
25− * On construction QDBusInterface synchronously introspects the service, which will block the GUI
26− * thread of this process if the service is busy. QDBusAbstractInterface does not perform this
27− * introspection, so let's subclass that and avoid the blocking scenario.
28− *
29− * However we lose Qt's wrapping of the DBus service with a MetaObject, with the result that we
30− * cannot easily connect to DBus signals with the usual connect() calls. So this approach only
31− * suited to push communication with the DBus service.
32− */
33−class AsyncDBusInterface : public QDBusAbstractInterface
34−{
35− Q_OBJECT
36−public:
37− AsyncDBusInterface(const QString &service, const QString &path,
38− const QString &interface, const QDBusConnection &connection,
39− QObject *parent = 0)
40− : QDBusAbstractInterface(service, path, interface.toLatin1().data(), connection, parent)
41− {}
42− ~AsyncDBusInterface() = default;
43−};
44−
45−
46−DashConnection::DashConnection(const QString &service, const QString &path, const QString &interface, QObject *parent):
47− AbstractDBusServiceMonitor(service, path, interface, SessionBus, parent)
48−{
49−
50−}
51−
52−/* Override the default implementation to create a non-blocking DBus interface (see note above). */
53−QDBusAbstractInterface* DashConnection::createInterface(const QString &service, const QString &path,
54− const QString &interface, const QDBusConnection &connection)
55−{
56− return new AsyncDBusInterface(service, path, interface, connection);
57−}
58−
59−void DashConnection::setCurrentScope(int index, bool animate, bool isSwipe)
60−{
61− if (dbusInterface()) {
62− dbusInterface()->asyncCall(QStringLiteral("SetCurrentScope"), index, animate, isSwipe);
63− }
64−}
65−
66−#include "dashconnection.moc"
plugins/Unity/DashCommunicator/dashconnection.hdeleted−37
@@ -1,37 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software: you can redistribute it and/or modify it under
5− * the terms of the GNU Lesser General Public License version 3, as published by
6− * the Free Software Foundation.
7− *
8− * This program is distributed in the hope that it will be useful, but WITHOUT
9− * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10− * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11− * Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef THREADEDDASHCONNECTION_H
18−#define THREADEDDASHCONNECTION_H
19−
20−// local
21−#include "abstractdbusservicemonitor.h"
22−
23−class DashConnection: public AbstractDBusServiceMonitor
24−{
25− Q_OBJECT
26−public:
27− DashConnection(const QString &service, const QString &path, const QString &interface, QObject *parent = 0);
28−
29−public Q_SLOTS:
30− void setCurrentScope(int index, bool animate, bool isSwipe);
31−
32−private:
33− QDBusAbstractInterface* createInterface(const QString &service, const QString &path,
34− const QString &interface, const QDBusConnection &connection) override;
35−};
36−
37−#endif
plugins/Unity/DashCommunicator/dbusdashcommunicatorservice.cppdeleted−35
@@ -1,35 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software: you can redistribute it and/or modify it under
5− * the terms of the GNU Lesser General Public License version 3, as published by
6− * the Free Software Foundation.
7− *
8− * This program is distributed in the hope that it will be useful, but WITHOUT
9− * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10− * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11− * Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "dbusdashcommunicatorservice.h"
18−
19−#include <QDBusConnection>
20−#include <QDBusInterface>
21−#include <QDebug>
22−
23−DBusDashCommunicatorService::DBusDashCommunicatorService(QObject *parent):
24− UnityDBusObject(QStringLiteral("/com/canonical/UnityDash"), QStringLiteral("com.canonical.UnityDash"), false, parent)
25−{
26−}
27−
28−DBusDashCommunicatorService::~DBusDashCommunicatorService()
29−{
30−}
31−
32−void DBusDashCommunicatorService::SetCurrentScope(int index, bool animate, bool isSwipe)
33−{
34− Q_EMIT setCurrentScopeRequested(index, animate, isSwipe);
35−}
plugins/Unity/DashCommunicator/dbusdashcommunicatorservice.hdeleted−39
@@ -1,39 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software: you can redistribute it and/or modify it under
5− * the terms of the GNU Lesser General Public License version 3, as published by
6− * the Free Software Foundation.
7− *
8− * This program is distributed in the hope that it will be useful, but WITHOUT
9− * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10− * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11− * Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef DBUSDASHCOMMUNICATORSERVICE_H
18−#define DBUSDASHCOMMUNICATORSERVICE_H
19−
20−#include "unitydbusobject.h"
21−
22−class DBusDashCommunicatorService: public UnityDBusObject
23−{
24− Q_OBJECT
25− Q_CLASSINFO("D-Bus Interface", "com.canonical.Unity.DashCommunicator")
26−
27−public:
28− DBusDashCommunicatorService(QObject *parent = 0);
29− ~DBusDashCommunicatorService();
30−
31−Q_SIGNALS:
32− void setCurrentScopeRequested(int index, bool animate, bool isSwipe);
33−
34−public Q_SLOTS:
35− Q_SCRIPTABLE void SetCurrentScope(int index, bool animate, bool isSwipe);
36−
37−};
38−
39−#endif // DBUSDASHCOMMUNICATORSERVICE_H
plugins/Unity/DashCommunicator/plugin.cppdeleted−32
@@ -1,32 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors: Michael Zanetti <michael.zanetti@canonical.com>
17− */
18−
19−#include "plugin.h"
20−#include "dashcommunicator.h"
21−#include "dashcommunicatorservice.h"
22−
23−#include <QDBusConnection>
24−#include <QtQml/qqml.h>
25−
26−void DashCommunicatorPlugin::registerTypes(const char *uri)
27−{
28− // @uri Unity.DashCommunicator
29− Q_ASSERT(uri == QStringLiteral("Unity.DashCommunicator"));
30− qmlRegisterType<DashCommunicatorService>(uri, 0, 1, "DashCommunicatorService");
31− qmlRegisterType<DashCommunicator>(uri, 0, 1, "DashCommunicator");
32−}
plugins/Unity/DashCommunicator/plugin.hdeleted−34
@@ -1,34 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors: Michael Zanetti <michael.zanetti@canonical.com>
17− */
18−
19−#ifndef DASHCOMMUNICATOR_PLUGIN_H
20−#define DASHCOMMUNICATOR_PLUGIN_H
21−
22−#include <QtQml/QQmlEngine>
23−#include <QtQml/QQmlExtensionPlugin>
24−
25−class DashCommunicatorPlugin : 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) override;
32−};
33−
34−#endif
plugins/Unity/DashCommunicator/qmldirdeleted−3
@@ -1,3 +0,0 @@
1−module Unity.DashCommunicator
2−plugin DashCommunicator-qml
3−typeinfo DashCommunicator.qmltypes
plugins/Unity/Indicators/indicatorsmodel.cpp+13
@@ -103,6 +103,19 @@ void IndicatorsModel::setProfile(const QString &profile)
103103 m_manager->setProfile(profile);
104104}
105105
106+bool IndicatorsModel::light() const
107+{
108+ return m_light;
109+}
110+
111+void IndicatorsModel::setLight(const bool &light)
112+{
113+ if (m_light != light) {
114+ m_light = light;
115+ Q_EMIT lightChanged();
116+ }
117+}
118+
106119/*!
107120 \qmlmethod IndicatorsModel::unload()
108121
plugins/Unity/Indicators/indicatorsmodel.h+9
@@ -35,6 +35,9 @@ class UNITYINDICATORS_EXPORT IndicatorsModel : public QAbstractListModel
3535 Q_PROPERTY(int count READ count NOTIFY countChanged)
3636 Q_PROPERTY(QString profile READ profile WRITE setProfile NOTIFY profileChanged)
3737
38+ // Used for tests
39+ Q_PROPERTY(bool light READ light WRITE setLight NOTIFY lightChanged)
40+
3841public:
3942
4043 IndicatorsModel(QObject *parent=nullptr);
@@ -48,6 +51,9 @@ public:
4851 QString profile() const;
4952 void setProfile(const QString& profile);
5053
54+ bool light() const;
55+ void setLight(const bool &light);
56+
5157 /* QAbstractItemModel */
5258 QHash<int, QByteArray> roleNames() const override;
5359 int columnCount(const QModelIndex &parent = QModelIndex()) const override;
@@ -60,6 +66,7 @@ Q_SIGNALS:
6066 void countChanged();
6167 void profileChanged();
6268 void indicatorDataChanged(const QVariant& data);
69+ void lightChanged();
6370
6471private Q_SLOTS:
6572 void onIdentifierChanged();
@@ -74,6 +81,8 @@ private:
7481
7582 void notifyDataChanged(QObject *sender, int role);
7683 int count() const;
84+
85+ bool m_light;
7786};
7887
7988#endif // INDICATORSMODEL_H
plugins/Unity/Launcher/CMakeLists.txt+2−1
@@ -26,6 +26,7 @@ set(QMLLAUNCHERPLUGIN_SRC
2626 asadapter.cpp
2727 appdrawermodel.cpp
2828 ualwrapper.cpp
29+ xdgwatcher.cpp
2930 ${CMAKE_SOURCE_DIR}/plugins/AccountsService/AccountsServiceDBusAdaptor.cpp
3031 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
3132 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
@@ -47,7 +48,7 @@ target_link_libraries(UnityLauncher-qml
4748 ${GSETTINGS_QT_LDFLAGS}
4849 ${GLIB_LIBRARIES}
4950 ${UAL_LIBRARIES}
50− Qt5::DBus Qt5::Qml Qt5::Gui
51+ Qt5::DBus Qt5::Qml Qt5::Gui Qt5::Concurrent
5152 )
5253
5354add_unity8_plugin(Unity.Launcher 0.1 Unity/Launcher TARGETS UnityLauncher-qml)
plugins/Unity/Launcher/appdrawermodel.cpp+88−19
@@ -1,5 +1,6 @@
11/*
22 * Copyright (C) 2016 Canonical, Ltd.
3+ * Copyright (C) 2020 UBports Foundation.
34 *
45 * This program is free software; you can redistribute it and/or modify
56 * it under the terms of the GNU General Public License as published by
@@ -16,30 +17,35 @@
1617
1718#include "appdrawermodel.h"
1819#include "ualwrapper.h"
20+#include "xdgwatcher.h"
1921
2022#include <QDebug>
2123#include <QDateTime>
24+#include <QtConcurrentRun>
25+
26+static std::shared_ptr<LauncherItem> makeSharedLauncherItem(
27+ const QString &appId, const QString &name, const QString &icon, QObject * parent)
28+{
29+ return std::shared_ptr<LauncherItem>(
30+ new LauncherItem(appId, name, icon, parent),
31+ [] (LauncherItem *item) { item->deleteLater(); });
32+}
2233
2334AppDrawerModel::AppDrawerModel(QObject *parent):
2435 AppDrawerModelInterface(parent),
25− m_ual(new UalWrapper(this))
36+ m_ual(new UalWrapper(this)),
37+ m_xdgWatcher(new XdgWatcher(this)),
38+ m_refreshing(false)
2639{
27− Q_FOREACH (const QString &appId, UalWrapper::installedApps()) {
28− UalWrapper::AppInfo info = UalWrapper::getApplicationInfo(appId);
29− if (!info.valid) {
30− qWarning() << "Failed to get app info for app" << appId;
31− continue;
32− }
33− LauncherItem* item = new LauncherItem(appId, info.name, info.icon, this);
34− item->setKeywords(info.keywords);
35− item->setPopularity(info.popularity);
36− m_list.append(item);
37− }
40+ connect(&m_refreshFutureWatcher, &QFutureWatcher<ItemList>::finished,
41+ this, &AppDrawerModel::onRefreshFinished);
3842
3943 // keep this a queued connection as it's coming from another thread.
40− connect(m_ual, &UalWrapper::appAdded, this, &AppDrawerModel::appAdded, Qt::QueuedConnection);
41− connect(m_ual, &UalWrapper::appRemoved, this, &AppDrawerModel::appRemoved, Qt::QueuedConnection);
42− connect(m_ual, &UalWrapper::appInfoChanged, this, &AppDrawerModel::appInfoChanged, Qt::QueuedConnection);
44+ connect(m_xdgWatcher, &XdgWatcher::appAdded, this, &AppDrawerModel::appAdded, Qt::QueuedConnection);
45+ connect(m_xdgWatcher, &XdgWatcher::appRemoved, this, &AppDrawerModel::appRemoved, Qt::QueuedConnection);
46+ connect(m_xdgWatcher, &XdgWatcher::appInfoChanged, this, &AppDrawerModel::appInfoChanged, Qt::QueuedConnection);
47+
48+ refresh();
4349}
4450
4551int AppDrawerModel::rowCount(const QModelIndex &parent) const
@@ -68,6 +74,10 @@ QVariant AppDrawerModel::data(const QModelIndex &index, int role) const
6874
6975void AppDrawerModel::appAdded(const QString &appId)
7076{
77+ if (m_refreshing)
78+ // Will be replaced by the refresh result anyway.
79+ return;
80+
7181 UalWrapper::AppInfo info = UalWrapper::getApplicationInfo(appId);
7282 if (!info.valid) {
7383 qWarning() << "App added signal received but failed to get app info for app" << appId;
@@ -75,15 +85,19 @@ void AppDrawerModel::appAdded(const QString &appId)
7585 }
7686
7787 beginInsertRows(QModelIndex(), m_list.count(), m_list.count());
78− LauncherItem* item = new LauncherItem(appId, info.name, info.icon, this);
88+ auto item = makeSharedLauncherItem(appId, info.name, info.icon, /* parent */ nullptr);
7989 item->setKeywords(info.keywords);
8090 item->setPopularity(info.popularity);
81− m_list.append(item);
91+ m_list.append(std::move(item));
8292 endInsertRows();
8393}
8494
8595void AppDrawerModel::appRemoved(const QString &appId)
8696{
97+ if (m_refreshing)
98+ // Will be replaced by the refresh result anyway.
99+ return;
100+
87101 int idx = -1;
88102 for (int i = 0; i < m_list.count(); i++) {
89103 if (m_list.at(i)->appId() == appId) {
@@ -96,13 +110,17 @@ void AppDrawerModel::appRemoved(const QString &appId)
96110 return;
97111 }
98112 beginRemoveRows(QModelIndex(), idx, idx);
99− m_list.takeAt(idx)->deleteLater();
113+ m_list.removeAt(idx);
100114 endRemoveRows();
101115}
102116
103117void AppDrawerModel::appInfoChanged(const QString &appId)
104118{
105− LauncherItem *item = nullptr;
119+ if (m_refreshing)
120+ // Will be replaced by the refresh result anyway.
121+ return;
122+
123+ std::shared_ptr<LauncherItem> item;
106124 int idx = -1;
107125
108126 for(int i = 0; i < m_list.count(); i++) {
@@ -121,3 +139,54 @@ void AppDrawerModel::appInfoChanged(const QString &appId)
121139 item->setPopularity(info.popularity);
122140 Q_EMIT dataChanged(index(idx), index(idx), {AppDrawerModelInterface::RoleUsage});
123141}
142+
143+bool AppDrawerModel::refreshing() {
144+ return m_refreshing;
145+}
146+
147+void AppDrawerModel::refresh() {
148+ if (m_refreshing)
149+ return;
150+
151+ m_refreshFutureWatcher.setFuture(QtConcurrent::run([](QThread *thread) {
152+ ItemList list;
153+
154+ Q_FOREACH (const QString &appId, UalWrapper::installedApps()) {
155+ UalWrapper::AppInfo info = UalWrapper::getApplicationInfo(appId);
156+ if (!info.valid) {
157+ qWarning() << "Failed to get app info for app" << appId;
158+ continue;
159+ }
160+ // We don't pass parent in because this may run after the model is destroyed.
161+ // (And, in fact, we can't, because the model is in a diferent thread.)
162+ auto item = makeSharedLauncherItem(appId, info.name, info.icon, /* parent */ nullptr);
163+ item->setKeywords(info.keywords);
164+ item->setPopularity(info.popularity);
165+ item->moveToThread(thread);
166+ list.append(std::move(item));
167+ }
168+
169+ return list;
170+ }, this->thread()));
171+
172+ m_refreshing = true;
173+ Q_EMIT refreshingChanged();
174+}
175+
176+void AppDrawerModel::onRefreshFinished() {
177+ if (m_refreshFutureWatcher.isCanceled())
178+ // This is the result of setting canceled future below.
179+ return;
180+
181+ beginResetModel();
182+
183+ m_list = m_refreshFutureWatcher.result();
184+ // Remove the future & its result, so that future modifications won't
185+ // create a copy.
186+ m_refreshFutureWatcher.setFuture(QFuture<ItemList>());
187+
188+ endResetModel();
189+
190+ m_refreshing = false;
191+ Q_EMIT refreshingChanged();
192+}
plugins/Unity/Launcher/appdrawermodel.h+25−2
@@ -1,5 +1,6 @@
11/*
22 * Copyright (C) 2016 Canonical, Ltd.
3+ * Copyright (C) 2020 UBports Foundation.
34 *
45 * This program is free software; you can redistribute it and/or modify
56 * it under the terms of the GNU General Public License as published by
@@ -14,28 +15,50 @@
1415 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1516 */
1617
17−
18+#include <memory>
19+#include <QFutureWatcher>
1820#include <unity/shell/launcher/AppDrawerModelInterface.h>
1921
2022#include "launcheritem.h"
2123
2224class UalWrapper;
25+class XdgWatcher;
2326
2427class AppDrawerModel: public AppDrawerModelInterface
2528{
2629 Q_OBJECT
30+ // TODO: Add this to AppDrawerModelInterface in unity-api.
31+ // Or, better yet, remove AppDrawerModelInterface from unity-api.
32+ Q_PROPERTY(bool refreshing READ refreshing NOTIFY refreshingChanged)
2733public:
2834 AppDrawerModel(QObject* parent = nullptr);
2935
3036 int rowCount(const QModelIndex &parent) const override;
3137 QVariant data(const QModelIndex &index, int role) const override;
3238
39+ // TODO: add these to AppDrawerModelInterface too.
40+ bool refreshing();
41+ Q_INVOKABLE void refresh();
42+
43+Q_SIGNALS:
44+ void refreshingChanged();
45+
3346private Q_SLOTS:
3447 void appAdded(const QString &appId);
3548 void appRemoved(const QString &appId);
3649 void appInfoChanged(const QString &appId);
3750
51+ void onRefreshFinished();
52+
3853private:
39− QList<LauncherItem*> m_list;
54+ // Using shared_ptr is unavoidable in order to share the refresh result
55+ // from the worker thread safely without a memory leak, in case the model
56+ // is destructed before the worker finishes.
57+ typedef QList<std::shared_ptr<LauncherItem>> ItemList;
58+
59+ ItemList m_list;
4060 UalWrapper *m_ual;
61+ XdgWatcher *m_xdgWatcher;
62+ QFutureWatcher<ItemList> m_refreshFutureWatcher;
63+ bool m_refreshing;
4164};
plugins/Unity/Launcher/dbusinterface.cpp−2
@@ -39,8 +39,6 @@ QString DBusInterface::introspect(const QString &path) const
3939 QString nodes;
4040
4141 // Add Refresh to introspect
42− // TODO: Confirm this is still used anywhere and remove if not.
43− // It used to be used in an upstart job when desktop fles changed.
4442 nodes = QStringLiteral("<interface name=\"com.canonical.Unity.Launcher\">"
4543 "<method name=\"Refresh\"/>"
4644 "</interface>");
plugins/Unity/Launcher/launcheritem.cpp−1
@@ -37,7 +37,6 @@ LauncherItem::LauncherItem(const QString &appId, const QString &name, const QStr
3737 m_alerting(false),
3838 m_quickList(new QuickListModel(this))
3939{
40− Q_ASSERT(parent != nullptr);
4140 QuickListEntry nameAction;
4241 nameAction.setActionId(QStringLiteral("launch_item"));
4342 nameAction.setText(m_name);
plugins/Unity/Launcher/launchermodel.cpp−5
@@ -521,11 +521,6 @@ void LauncherModel::applicationAdded(const QModelIndex &parent, int row)
521521 return;
522522 }
523523
524− if (app->appId() == QLatin1String("unity8-dash")) {
525− // Not adding the dash app
526− return;
527− }
528−
529524 const int itemIndex = findApplication(app->appId());
530525 if (itemIndex != -1) {
531526 LauncherItem *item = m_list.at(itemIndex);
plugins/Unity/Launcher/ualwrapper.cpp+1−10
@@ -24,15 +24,6 @@ using namespace ubuntu::app_launch;
2424UalWrapper::UalWrapper(QObject *parent):
2525 QObject(parent)
2626{
27− Registry::appAdded().connect([this](const std::shared_ptr<Application>&app) {
28− Q_EMIT appAdded(QString::fromStdString(app->appId()));
29− });
30− Registry::appRemoved().connect([this](const AppID &appId) {
31− Q_EMIT appRemoved(QString::fromStdString(appId));
32− });
33− Registry::appInfoUpdated().connect([this](const std::shared_ptr<Application>&app){
34− Q_EMIT appInfoChanged(QString::fromStdString(app->appId()));
35− });
3627}
3728
3829QStringList UalWrapper::installedApps()
@@ -73,7 +64,7 @@ UalWrapper::AppInfo UalWrapper::getApplicationInfo(const QString &appId)
7364 for (const std::string &keyword : ualApp->info()->keywords().value()) {
7465 info.keywords << QString::fromStdString(keyword);
7566 }
76− info.popularity = ualApp->info()->popularity();
67+ //info.popularity = ualApp->info()->popularity();
7768 info.valid = true;
7869 } catch (const std::runtime_error &e) {
7970 qWarning() << "ubuntu-app-launch threw an exception getting app info for appId:" << appId << ":" << e.what();
plugins/Unity/Launcher/ualwrapper.h−5
@@ -33,9 +33,4 @@ public:
3333
3434 static QStringList installedApps();
3535 static AppInfo getApplicationInfo(const QString &appId);
36−
37−Q_SIGNALS:
38− void appAdded(const QString &appId);
39− void appRemoved(const QString &appId);
40− void appInfoChanged(const QString &appId);
4136};
plugins/Unity/Launcher/xdgwatcher.cppnew file+129
@@ -0,0 +1,129 @@
1+/*
2+ * Copyright (C) 2019 UBports Foundation
3+ * Author(s): Marius Gripsgard <marius@ubports.com>
4+ *
5+ * This program is free software; you can redistribute it and/or modify
6+ * it under the terms of the GNU General Public License as published by
7+ * the Free Software Foundation; version 3.
8+ *
9+ * This program is distributed in the hope that it will be useful,
10+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+ * GNU General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU General Public License
15+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
16+ */
17+
18+#include "xdgwatcher.h"
19+
20+#include <QDebug>
21+#include <QDir>
22+#include <QFile>
23+#include <QStandardPaths>
24+#include <QTextStream>
25+
26+XdgWatcher::XdgWatcher(QObject* parent)
27+ : QObject(parent),
28+ m_watcher(new QFileSystemWatcher(this))
29+{
30+ connect(m_watcher, &QFileSystemWatcher::directoryChanged, this, &XdgWatcher::onDirectoryChanged);
31+ connect(m_watcher, &QFileSystemWatcher::fileChanged, this, &XdgWatcher::onFileChanged);
32+
33+ const auto paths = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation);
34+ for (const auto &path: paths) {
35+ const auto qdir = QDir(path);
36+ if (!qdir.exists()) {
37+ continue;
38+ }
39+
40+ // Add the path itself to watch for newly added apps
41+ m_watcher->addPath(path);
42+
43+ // Add watcher for eatch app to watch for changes
44+ const auto files = qdir.entryInfoList(QDir::Files);
45+ for (const auto &file: files) {
46+ if (file.suffix() == "desktop") {
47+ const auto path = file.absoluteFilePath();
48+ m_watcher->addPath(path);
49+ m_registry.insert(path, getAppId(file));
50+ }
51+ }
52+ }
53+}
54+
55+// "Ubuntu style" appID is filename without versionNumber after last "_"
56+const QString XdgWatcher::stripAppIdVersion(const QString rawAppID) const {
57+ auto appIdComponents = rawAppID.split("_");
58+ appIdComponents.removeLast();
59+ return appIdComponents.join("_");
60+}
61+
62+// Standard appID see:
63+// https://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#desktop-file-id
64+const QString XdgWatcher::toStandardAppId(const QFileInfo fileInfo) const {
65+ const auto paths = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation);
66+ for (const auto &path: paths) {
67+ if (fileInfo.absolutePath() == path) {
68+ break;
69+ }
70+ if (fileInfo.absolutePath().contains(path)) {
71+ auto fileStr = fileInfo.absoluteFilePath();
72+ fileStr.replace(path, "");
73+ fileStr.replace("/", "-");
74+ fileStr.replace(".desktop", "");
75+ return fileStr;
76+ }
77+ }
78+ return fileInfo.completeBaseName();
79+}
80+
81+const QString XdgWatcher::getAppId(const QFileInfo fileInfo) const {
82+ // We need to open the file to check if its and Ual application
83+ // as we cant just rely on the app name as "normal" apps can also
84+ // contain 3 _ causing us to belive its an ubuntu app
85+ // Example kde_org_kate would become kde_org
86+ QFile qFile(fileInfo.absoluteFilePath());
87+ qFile.open(QIODevice::ReadOnly);
88+ QTextStream fileStream(&qFile);
89+ QString line;
90+ while (fileStream.readLineInto(&line)) {
91+ if (line.startsWith("X-Ubuntu-Application-ID=")) {
92+ auto rawAppID = line.replace("X-Ubuntu-Application-ID=", "");
93+ qFile.close();
94+ return stripAppIdVersion(rawAppID);
95+ }
96+ }
97+ qFile.close();
98+
99+ // If it's not an "Ubuntu" appID, we follow freedesktop standard
100+ return toStandardAppId(fileInfo);
101+}
102+
103+// Watch for newly added apps
104+void XdgWatcher::onDirectoryChanged(const QString &path) {
105+ const auto files = QDir(path).entryInfoList(QDir::Files);
106+ const auto watchedFiles = m_watcher->files();
107+ for (const auto &file: files) {
108+ const auto appPath = file.absoluteFilePath();
109+ if (file.suffix() == "desktop" && !watchedFiles.contains(appPath)) {
110+ m_watcher->addPath(appPath);
111+
112+ const auto appId = getAppId(file);
113+ m_registry.insert(appPath, appId);
114+ Q_EMIT appAdded(appId);
115+ }
116+ }
117+}
118+
119+void XdgWatcher::onFileChanged(const QString &path) {
120+ QFileInfo file(path);
121+ if (file.exists()) {
122+ // The file exists, this must be an modify event
123+ Q_EMIT appInfoChanged(m_registry.value(path));
124+ } else {
125+ // File does not exist, assume this is an remove event.
126+ // onDirectoryChanged will handle rename event
127+ Q_EMIT appRemoved(m_registry.take(path));
128+ }
129+}
plugins/Unity/Launcher/xdgwatcher.hnew file+46
@@ -0,0 +1,46 @@
1+/*
2+ * Copyright (C) 2019 UBports Foundation
3+ * Author(s): Marius Gripsgard <marius@ubports.com>
4+ *
5+ * This program is free software; you can redistribute it and/or modify
6+ * it under the terms of the GNU General Public License as published by
7+ * the Free Software Foundation; version 3.
8+ *
9+ * This program is distributed in the hope that it will be useful,
10+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+ * GNU General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU General Public License
15+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
16+ */
17+
18+#include <QFileSystemWatcher>
19+#include <QHash>
20+#include <QFileInfo>
21+
22+class QFileInfo;
23+
24+class XdgWatcher: public QObject
25+{
26+ Q_OBJECT
27+public:
28+ XdgWatcher(QObject* parent = nullptr);
29+
30+Q_SIGNALS:
31+ void appAdded(const QString &appId);
32+ void appRemoved(const QString &appId);
33+ void appInfoChanged(const QString &appId);
34+
35+private Q_SLOTS:
36+ void onDirectoryChanged(const QString &path);
37+ void onFileChanged(const QString &path);
38+
39+private:
40+ const QString toStandardAppId(const QFileInfo fileInfo) const;
41+ const QString getAppId(const QFileInfo file) const;
42+ const QString stripAppIdVersion(const QString rawAppID) const;
43+
44+ QFileSystemWatcher* m_watcher;
45+ QHash<const QString, QString> m_registry;
46+};
plugins/Unity/Session/dbusunitysessionservice.cpp+11−5
@@ -36,7 +36,6 @@
3636
3737#define LOGIN1_SERVICE QStringLiteral("org.freedesktop.login1")
3838#define LOGIN1_PATH QStringLiteral("/org/freedesktop/login1")
39−#define LOGIN1_SESSION_ROOT QStringLiteral("/org/freedesktop/login1/session/")
4039#define LOGIN1_IFACE QStringLiteral("org.freedesktop.login1.Manager")
4140#define LOGIN1_SESSION_IFACE QStringLiteral("org.freedesktop.login1.Session")
4241
@@ -59,9 +58,16 @@ public:
5958
6059 void init()
6160 {
62− QString sessionID = QString::fromLocal8Bit(qgetenv("XDG_SESSION_ID"));
63− if (!sessionID.isEmpty()) {
64− logindSessionPath = LOGIN1_SESSION_ROOT + sessionID;
61+ // get our logind session path
62+ QDBusMessage msg = QDBusMessage::createMethodCall(LOGIN1_SERVICE,
63+ LOGIN1_PATH,
64+ LOGIN1_IFACE,
65+ QStringLiteral("GetSessionByPID"));
66+ msg << (quint32) getpid();
67+
68+ QDBusReply<QDBusObjectPath> reply = QDBusConnection::SM_BUSNAME().call(msg);
69+ if (reply.isValid()) {
70+ logindSessionPath = reply.value().path();
6571
6672 // start watching the Active property
6773 QDBusConnection::SM_BUSNAME().connect(LOGIN1_SERVICE, logindSessionPath, QStringLiteral("org.freedesktop.DBus.Properties"), QStringLiteral("PropertiesChanged"),
@@ -73,7 +79,7 @@ public:
7379 QDBusConnection::SM_BUSNAME().connect(LOGIN1_SERVICE, LOGIN1_PATH, LOGIN1_IFACE, QStringLiteral("PrepareForSleep"),
7480 this, SLOT(onResuming(bool)));
7581 } else {
76− qWarning() << "Failed to get logind session: XDG_SESSION_ID is not set";
82+ qWarning() << "Failed to get logind session path" << reply.error().message();
7783 }
7884 }
7985
plugins/Utils/CMakeLists.txt−2
@@ -7,7 +7,6 @@ include_directories(
77 SYSTEM
88 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
99 ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
10− ${GIO_INCLUDE_DIRS}
1110)
1211
1312set(QMLPLUGIN_SRC
@@ -45,7 +44,6 @@ add_library(Utils-qml SHARED
4544 )
4645
4746target_link_libraries(Utils-qml
48− ${GIO_LDFLAGS}
4947 Qt5::Qml Qt5::Quick Qt5::DBus Qt5::Network Qt5::Gui Qt5::Sql Qt5::Concurrent
5048 )
5149
plugins/Utils/appdrawerproxymodel.cpp+1−1
@@ -158,7 +158,7 @@ bool AppDrawerProxyModel::filterAcceptsRow(int source_row, const QModelIndex &so
158158 allWords.prepend(m_source->data(m_source->index(source_row, 0), AppDrawerModelInterface::RoleName).toString());
159159 bool found = false;
160160 Q_FOREACH (const QString &currentWord, allWords) {
161− if (currentWord.startsWith(m_filterString, Qt::CaseInsensitive)) {
161+ if (currentWord.contains(m_filterString, Qt::CaseInsensitive)) {
162162 found = true;
163163 break;
164164 }
plugins/Utils/deviceconfigparser.cpp+18
@@ -116,6 +116,24 @@ QString DeviceConfigParser::category() const
116116 return value;
117117}
118118
119+bool DeviceConfigParser::supportsMultiColorLed() const
120+{
121+ return readBoolFromConfig("SupportsMultiColorLed", true);
122+}
123+
124+bool DeviceConfigParser::readBoolFromConfig(const QString &key, bool defaultValue) const
125+{
126+ m_config->beginGroup(m_name);
127+
128+ bool ret = defaultValue;
129+ if (m_config->contains(key)) {
130+ ret = m_config->value(key).toBool();
131+ }
132+
133+ m_config->endGroup();
134+ return ret;
135+}
136+
119137QStringList DeviceConfigParser::readOrientationsFromConfig(const QString &key) const
120138{
121139 m_config->beginGroup(m_name);
plugins/Utils/deviceconfigparser.h+3
@@ -33,6 +33,7 @@ class DeviceConfigParser: public QObject
3333 Q_PROPERTY(Qt::ScreenOrientation portraitOrientation READ portraitOrientation NOTIFY changed)
3434 Q_PROPERTY(Qt::ScreenOrientation invertedPortraitOrientation READ invertedPortraitOrientation NOTIFY changed)
3535 Q_PROPERTY(QString category READ category NOTIFY changed)
36+ Q_PROPERTY(bool supportsMultiColorLed READ supportsMultiColorLed NOTIFY changed)
3637
3738public:
3839 DeviceConfigParser(QObject *parent = nullptr);
@@ -47,6 +48,7 @@ public:
4748 Qt::ScreenOrientation portraitOrientation() const;
4849 Qt::ScreenOrientation invertedPortraitOrientation() const;
4950 QString category() const;
51+ bool supportsMultiColorLed() const;
5052
5153Q_SIGNALS:
5254 void changed();
@@ -58,6 +60,7 @@ private:
5860 QStringList readOrientationsFromConfig(const QString &key) const;
5961 QString readOrientationFromConfig(const QString &key) const;
6062 Qt::ScreenOrientation stringToOrientation(const QString &orientationString, Qt::ScreenOrientation defaultValue) const;
63+ bool readBoolFromConfig(const QString &key, bool defaultValue) const;
6164};
6265
6366#endif
plugins/Utils/windowstatestorage.cpp+293−131
@@ -1,5 +1,6 @@
11/*
22 * Copyright 2015-2016 Canonical Ltd.
3+ * Copyright 2021 UBports Foundation
34 *
45 * This program is free software; you can redistribute it and/or modify
56 * it under the terms of the GNU Lesser General Public License as published by
@@ -16,185 +17,344 @@
1617
1718#include "windowstatestorage.h"
1819
19−#include <QtConcurrent>
2020#include <QDebug>
21−#include <QFutureSynchronizer>
21+#include <QDir>
22+#include <QMetaObject>
23+#include <QObject>
2224#include <QSqlQuery>
2325#include <QSqlError>
2426#include <QSqlResult>
27+#include <QStandardPaths>
2528#include <QRect>
2629#include <unity/shell/application/ApplicationInfoInterface.h>
2730
28−QMutex WindowStateStorage::s_mutex;
2931
30−inline QString sanitiseString(QString string) {
31− return string.remove(QLatin1Char('\"'))
32− .remove(QLatin1Char('\''))
33− .remove(QLatin1Char('\\'));
34−}
35−
36−WindowStateStorage::WindowStateStorage(QObject *parent):
37− QObject(parent)
32+class AsyncQuery: public QObject
3833{
39− const QString dbPath = QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation) + QStringLiteral("/unity8/");
40− m_db = QSqlDatabase::addDatabase(QStringLiteral("QSQLITE"));
41− QDir dir;
42− dir.mkpath(dbPath);
43− m_db.setDatabaseName(dbPath + "windowstatestorage.sqlite");
44− initdb();
45−}
34+ Q_OBJECT
4635
47−WindowStateStorage::~WindowStateStorage()
48−{
49− QFutureSynchronizer<void> futureSync;
50− for (int i = 0; i < m_asyncQueries.count(); ++i) {
51− futureSync.addFuture(m_asyncQueries[i]);
36+public:
37+ AsyncQuery(const QString &dbName):
38+ m_dbName(dbName)
39+ {
5240 }
53− futureSync.waitForFinished();
54− m_db.close();
55−}
5641
57−void WindowStateStorage::saveState(const QString &windowId, WindowStateStorage::WindowState state)
58−{
59− const QString queryString = QStringLiteral("INSERT OR REPLACE INTO state (windowId, state) values ('%1', '%2');")
60− .arg(sanitiseString(windowId))
61− .arg((int)state);
42+ ~AsyncQuery()
43+ {
44+ QSqlDatabase::removeDatabase(m_connectionName);
45+ }
6246
63− saveValue(queryString);
64−}
47+ Q_INVOKABLE const QString getDbName()
48+ {
49+ if (!m_ok) {
50+ return "ERROR";
51+ }
52+ QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
53+ return connection.databaseName();
54+ }
6555
66−WindowStateStorage::WindowState WindowStateStorage::getState(const QString &windowId, WindowStateStorage::WindowState defaultValue) const
67−{
68− const QString queryString = QStringLiteral("SELECT state FROM state WHERE windowId = '%1';")
69− .arg(sanitiseString(windowId));
56+ Q_INVOKABLE bool initdb()
57+ {
58+ if (m_ok) {
59+ return true;
60+ }
61+ QSqlDatabase connection = QSqlDatabase::addDatabase(QStringLiteral("QSQLITE"), m_connectionName);
62+ connection.setDatabaseName(m_dbName);
63+ connection.setConnectOptions(QStringLiteral("QSQLITE_BUSY_TIMEOUT=1000"));
64+ if (!connection.open()) {
65+ qWarning() << "AsyncQuery::initdb: Error opening state database. Window positions will not be saved or restored." << m_dbName << connection.lastError().driverText() << connection.lastError().databaseText();
66+ return false;
67+ }
68+ QSqlQuery query(connection);
69+
70+ if (!connection.tables().contains(QStringLiteral("geometry"))) {
71+ QString geometryQuery = QStringLiteral("CREATE TABLE geometry(windowId TEXT UNIQUE, x INTEGER, y INTEGER, width INTEGER, height INTEGER);");
72+ if (!query.exec(geometryQuery)) {
73+ logSqlError(query);
74+ return false;
75+ }
76+ }
77+
78+ if (!connection.tables().contains(QStringLiteral("state"))) {
79+ QString stateQuery = QStringLiteral("CREATE TABLE state(windowId TEXT UNIQUE, state INTEGER);");
80+ if (!query.exec(stateQuery)) {
81+ logSqlError(query);
82+ return false;
83+ }
84+ }
85+
86+ if (!connection.tables().contains(QStringLiteral("stage"))) {
87+ QString stageQuery = QStringLiteral("CREATE TABLE stage(appId TEXT UNIQUE, stage INTEGER);");
88+ if (!query.exec(stageQuery)) {
89+ logSqlError(query);
90+ return false;
91+ }
92+ }
93+ m_ok = true;
94+ return true;
95+ }
7096
71− QSqlQuery query = getValue(queryString);
97+ Q_INVOKABLE int getState(const QString &windowId) const
98+ {
99+ if (!m_ok) {
100+ return -1;
101+ }
102+ QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
103+ QSqlQuery query(connection);
104+ query.prepare(m_getStateQuery);
105+ query.bindValue(":windowId", windowId);
106+ query.exec();
107+ if (!query.isActive() || !query.isSelect()) {
108+ logSqlError(query);
109+ return -1;
110+ }
111+ if (!query.first()) {
112+ return -1;
113+ }
114+ bool converted = false;
115+ QVariant resultStr = query.value(0);
116+ int result = resultStr.toInt(&converted);
117+ if (converted) {
118+ return result;
119+ } else {
120+ qWarning() << "getState result expected integer, got " << resultStr;
121+ return -1;
122+ }
123+ }
124+
125+ Q_INVOKABLE QRect getGeometry(const QString &windowId) const
126+ {
127+ if (!m_ok) {
128+ return QRect();
129+ }
130+ QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
131+ QSqlQuery query(connection);
132+ query.prepare(m_getGeometryQuery);
133+ query.bindValue(":windowId", windowId);
134+ query.exec();
135+ if (!query.isActive() || !query.isSelect()) {
136+ logSqlError(query);
137+ return QRect();
138+ }
139+
140+ if (!query.first()) {
141+ return QRect();
142+ }
143+
144+ bool xConverted, yConverted, widthConverted, heightConverted = false;
145+ int x, y, width, height;
146+ QVariant xResultStr = query.value(QStringLiteral("x"));
147+ QVariant yResultStr = query.value(QStringLiteral("y"));
148+ QVariant widthResultStr = query.value(QStringLiteral("width"));
149+ QVariant heightResultStr = query.value(QStringLiteral("height"));
150+ x = xResultStr.toInt(&xConverted);
151+ y = yResultStr.toInt(&yConverted);
152+ width = widthResultStr.toInt(&widthConverted);
153+ height = heightResultStr.toInt(&heightConverted);
154+
155+ if (xConverted && yConverted && widthConverted && heightConverted) {
156+ return QRect(x, y, width, height);
157+ } else {
158+ qWarning() << "getGeometry result expected integers, got x:"
159+ << xResultStr << "y:" << yResultStr << "width" << widthResultStr
160+ << "height:" << heightResultStr;
161+ return QRect();
162+ }
72163
73− if (!query.first()) {
74− return defaultValue;
75164 }
76− return (WindowState)query.value(QStringLiteral("state")).toInt();
77−}
78165
79−void WindowStateStorage::saveGeometry(const QString &windowId, const QRect &rect)
80−{
81− const QString queryString = QStringLiteral("INSERT OR REPLACE INTO geometry (windowId, x, y, width, height) values ('%1', '%2', '%3', '%4', '%5');")
82− .arg(sanitiseString(windowId))
83− .arg(rect.x())
84− .arg(rect.y())
85− .arg(rect.width())
86− .arg(rect.height());
87−
88− saveValue(queryString);
89−}
166+ Q_INVOKABLE int getStage(const QString &appId) const
167+ {
168+ if (!m_ok) {
169+ return -1;
170+ }
171+ QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
172+ QSqlQuery query(connection);
173+ query.prepare(m_getStageQuery);
174+ query.bindValue(":appId", appId);
175+ query.exec();
176+ if (!query.isActive() || !query.isSelect()) {
177+ logSqlError(query);
178+ return -1;
179+ }
180+ if (!query.first()) {
181+ return -1;
182+ }
183+ bool converted = false;
184+ QVariant resultStr = query.value(0);
185+ int result = resultStr.toInt(&converted);
186+ if (converted) {
187+ return result;
188+ } else {
189+ qWarning() << "getStage result expected integer, got " << resultStr;
190+ return -1;
191+ }
192+ }
90193
91−void WindowStateStorage::saveStage(const QString &appId, int stage)
92−{
93− const QString queryString = QStringLiteral("INSERT OR REPLACE INTO stage (appId, stage) values ('%1', '%2');")
94− .arg(sanitiseString(appId))
95− .arg(stage);
194+public Q_SLOTS:
195+
196+ void saveState(const QString &windowId, WindowStateStorage::WindowState state)
197+ {
198+ if (!m_ok) {
199+ return;
200+ }
201+ QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
202+ QSqlQuery query(connection);
203+ query.prepare(m_saveStateQuery);
204+ query.bindValue(":windowId", windowId);
205+ query.bindValue(":state", (int)state);
206+ if (!query.exec()) {
207+ logSqlError(query);
208+ }
209+ }
96210
97− saveValue(queryString);
98−}
211+ void saveGeometry(const QString &windowId, const QRect &rect)
212+ {
213+ if (!m_ok) {
214+ return;
215+ }
216+ QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
217+ QSqlQuery query(connection);
218+ query.prepare(m_saveGeometryQuery);
219+ query.bindValue(":windowId", windowId);
220+ query.bindValue(":x", rect.x());
221+ query.bindValue(":y", rect.y());
222+ query.bindValue(":width", rect.width());
223+ query.bindValue(":height", rect.height());
224+ if (!query.exec()) {
225+ logSqlError(query);
226+ }
227+ }
99228
100−int WindowStateStorage::getStage(const QString &appId, int defaultValue) const
101−{
102− const QString queryString = QStringLiteral("SELECT stage FROM stage WHERE appId = '%1';")
103− .arg(sanitiseString(appId));
229+ void saveStage(const QString &appId, int stage)
230+ {
231+ if (!m_ok) {
232+ return;
233+ }
234+ QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
235+ QSqlQuery query(connection);
236+ query.prepare(m_saveStageQuery);
237+ query.bindValue(":appId", appId);
238+ query.bindValue(":stage", stage);
239+ if (!query.exec()) {
240+ logSqlError(query);
241+ }
242+ }
104243
105− QSqlQuery query = getValue(queryString);
244+private:
245+ static const QString m_connectionName;
246+ static const QString m_getStateQuery;
247+ static const QString m_saveStateQuery;
248+ static const QString m_getGeometryQuery;
249+ static const QString m_saveGeometryQuery;
250+ static const QString m_getStageQuery;
251+ static const QString m_saveStageQuery;
252+
253+ static void logSqlError(const QSqlQuery query)
254+ {
255+ qWarning() << "Error executing query" << query.lastQuery()
256+ << "Driver error:" << query.lastError().driverText()
257+ << "Database error:" << query.lastError().databaseText();
258+ }
106259
107− if (!query.first()) {
108− return defaultValue;
260+ QString m_dbName;
261+ bool m_ok = false;
262+};
263+
264+const QString AsyncQuery::m_connectionName = QStringLiteral("WindowStateStorage");
265+const QString AsyncQuery::m_getStateQuery = QStringLiteral("SELECT state FROM state WHERE windowId = :windowId");
266+const QString AsyncQuery::m_saveStateQuery = QStringLiteral("INSERT OR REPLACE INTO state (windowId, state) values (:windowId, :state)");
267+const QString AsyncQuery::m_getGeometryQuery = QStringLiteral("SELECT * FROM geometry WHERE windowId = :windowId");
268+const QString AsyncQuery::m_saveGeometryQuery = QStringLiteral("INSERT OR REPLACE INTO geometry (windowId, x, y, width, height) values (:windowId, :x, :y, :width, :height)");
269+const QString AsyncQuery::m_getStageQuery = QStringLiteral("SELECT stage FROM stage WHERE appId = :appId");
270+const QString AsyncQuery::m_saveStageQuery = QStringLiteral("INSERT OR REPLACE INTO stage (appId, stage) values (:appId, :stage)");
271+
272+WindowStateStorage::WindowStateStorage(const QString &dbName, QObject *parent):
273+ QObject(parent),
274+ m_thread()
275+{
276+ qRegisterMetaType<WindowStateStorage::WindowState>("WindowStateStorage::WindowState");
277+ QString dbFile;
278+ if (dbName.isEmpty()) {
279+ const QString dbPath = QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation) + QStringLiteral("/unity8/");
280+ QDir dir;
281+ dir.mkpath(dbPath);
282+ dbFile = QString(dbPath) + QStringLiteral("windowstatestorage.sqlite");
283+ } else {
284+ dbFile = dbName;
109285 }
110− return query.value("stage").toInt();
286+ m_asyncQuery = new AsyncQuery(dbFile);
287+ m_asyncQuery->moveToThread(&m_thread);
288+ connect(&m_thread, &QThread::finished, m_asyncQuery, &QObject::deleteLater);
289+ m_thread.start();
290+ // Note that we're relying on initdb being called before any other methods
291+ // on AsyncQuery. Given the current behavior of QueuedConnection (slots
292+ // invoked in the order they are received), this is fine.
293+ QMetaObject::invokeMethod(m_asyncQuery, "initdb",
294+ Qt::QueuedConnection);
295+ connect(this, &WindowStateStorage::saveState, m_asyncQuery, &AsyncQuery::saveState);
296+ connect(this, &WindowStateStorage::saveGeometry, m_asyncQuery, &AsyncQuery::saveGeometry);
297+ connect(this, &WindowStateStorage::saveStage, m_asyncQuery, &AsyncQuery::saveStage);
111298}
112299
113−void WindowStateStorage::executeAsyncQuery(const QString &queryString)
300+WindowStateStorage::~WindowStateStorage()
114301{
115− QMutexLocker l(&s_mutex);
116− QSqlQuery query;
117−
118− bool ok = query.exec(queryString);
119− if (!ok) {
120− qWarning() << "Error executing query" << queryString
121− << "Driver error:" << query.lastError().driverText()
122− << "Database error:" << query.lastError().databaseText();
123− }
302+ m_thread.quit();
303+ m_thread.wait();
124304}
125305
126−QRect WindowStateStorage::getGeometry(const QString &windowId, const QRect &defaultValue) const
306+WindowStateStorage::WindowState WindowStateStorage::getState(const QString &windowId, WindowStateStorage::WindowState defaultValue) const
127307{
128− QString queryString = QStringLiteral("SELECT * FROM geometry WHERE windowId = '%1';")
129− .arg(sanitiseString(windowId));
308+ int state;
130309
131− QSqlQuery query = getValue(queryString);
310+ QMetaObject::invokeMethod(m_asyncQuery, "getState", Qt::BlockingQueuedConnection,
311+ Q_RETURN_ARG(int, state),
312+ Q_ARG(const QString&, windowId)
313+ );
132314
133− if (!query.first()) {
315+ if (state == -1) {
134316 return defaultValue;
135317 }
136318
137− const QRect result(query.value(QStringLiteral("x")).toInt(), query.value(QStringLiteral("y")).toInt(),
138− query.value(QStringLiteral("width")).toInt(), query.value(QStringLiteral("height")).toInt());
139−
140− if (result.isValid()) {
141− return result;
142− }
143−
144− return defaultValue;
319+ return (WindowState)state;
145320}
146321
147−void WindowStateStorage::initdb()
322+int WindowStateStorage::getStage(const QString &appId, int defaultValue) const
148323{
149− m_db.open();
150− if (!m_db.open()) {
151− qWarning() << "Error opening state database:" << m_db.lastError().driverText() << m_db.lastError().databaseText();
152− return;
153− }
324+ int stage;
154325
155− if (!m_db.tables().contains(QStringLiteral("geometry"))) {
156− QSqlQuery query;
157− query.exec(QStringLiteral("CREATE TABLE geometry(windowId TEXT UNIQUE, x INTEGER, y INTEGER, width INTEGER, height INTEGER);"));
158− }
326+ QMetaObject::invokeMethod(m_asyncQuery, "getStage", Qt::BlockingQueuedConnection,
327+ Q_RETURN_ARG(int, stage),
328+ Q_ARG(const QString&, appId)
329+ );
159330
160− if (!m_db.tables().contains(QStringLiteral("state"))) {
161− QSqlQuery query;
162− query.exec(QStringLiteral("CREATE TABLE state(windowId TEXT UNIQUE, state INTEGER);"));
331+ if (stage == -1) {
332+ return defaultValue;
163333 }
164334
165− if (!m_db.tables().contains(QStringLiteral("stage"))) {
166− QSqlQuery query;
167− query.exec(QStringLiteral("CREATE TABLE stage(appId TEXT UNIQUE, stage INTEGER);"));
168− }
335+ return stage;
169336}
170337
171−void WindowStateStorage::saveValue(const QString &queryString)
338+QRect WindowStateStorage::getGeometry(const QString &windowId, const QRect &defaultValue) const
172339{
173− QMutexLocker mutexLocker(&s_mutex);
174−
175− QFuture<void> future = QtConcurrent::run(&m_threadPool, executeAsyncQuery, queryString);
176− m_asyncQueries.append(future);
177−
178− QFutureWatcher<void> *futureWatcher = new QFutureWatcher<void>();
179− futureWatcher->setFuture(future);
180− connect(futureWatcher, &QFutureWatcher<void>::finished,
181− this,
182− [=](){ m_asyncQueries.removeAll(futureWatcher->future());
183− futureWatcher->deleteLater(); });
340+ QRect geometry;
341+ QMetaObject::invokeMethod(m_asyncQuery, "getGeometry", Qt::BlockingQueuedConnection,
342+ Q_RETURN_ARG(QRect, geometry),
343+ Q_ARG(const QString&, windowId)
344+ );
345+ if (geometry.isNull() || !geometry.isValid()) {
346+ return defaultValue;
347+ }
348+ return geometry;
184349}
185350
186−QSqlQuery WindowStateStorage::getValue(const QString &queryString) const
351+const QString WindowStateStorage::getDbName()
187352{
188− QMutexLocker l(&s_mutex);
189− QSqlQuery query;
190−
191− bool ok = query.exec(queryString);
192− if (!ok) {
193− qWarning() << "Error retrieving database query:" << queryString
194− << "Driver error:" << query.lastError().driverText()
195− << "Database error:" << query.lastError().databaseText();
196− }
197− return query;
353+ QString dbName;
354+ QMetaObject::invokeMethod(m_asyncQuery, "getDbName", Qt::BlockingQueuedConnection,
355+ Q_RETURN_ARG(QString, dbName)
356+ );
357+ return QString(dbName);
198358}
199359
200360Mir::State WindowStateStorage::toMirState(WindowState state) const
@@ -219,3 +379,5 @@ Mir::State WindowStateStorage::toMirState(WindowState state) const
219379 return Mir::RestoredState;
220380 }
221381}
382+
383+#include "windowstatestorage.moc"
plugins/Utils/windowstatestorage.h+14−17
@@ -1,5 +1,6 @@
11/*
22 * Copyright 2015-2016 Canonical Ltd.
3+ * Copyright 2021 UBports Foundation
34 *
45 * This program is free software; you can redistribute it and/or modify
56 * it under the terms of the GNU Lesser General Public License as published by
@@ -16,13 +17,16 @@
1617
1718#include <QObject>
1819#include <QSqlDatabase>
20+#include <QSqlQuery>
1921#include <QMutex>
2022#include <QFuture>
21−#include <QThreadPool>
23+#include <QThread>
2224
2325// unity-api
2426#include <unity/shell/application/Mir.h>
2527
28+class AsyncQuery;
29+
2630class WindowStateStorage: public QObject
2731{
2832 Q_OBJECT
@@ -46,32 +50,25 @@ public:
4650 Q_DECLARE_FLAGS(WindowStates, WindowState)
4751 Q_FLAG(WindowStates)
4852
49− WindowStateStorage(QObject *parent = nullptr);
53+ WindowStateStorage(const QString &dbName = QString(), QObject *parent = nullptr);
5054 virtual ~WindowStateStorage();
5155
52− Q_INVOKABLE void saveState(const QString &windowId, WindowState state);
5356 Q_INVOKABLE WindowState getState(const QString &windowId, WindowState defaultValue) const;
5457
55− Q_INVOKABLE void saveGeometry(const QString &windowId, const QRect &rect);
5658 Q_INVOKABLE QRect getGeometry(const QString &windowId, const QRect &defaultValue) const;
5759
58− Q_INVOKABLE void saveStage(const QString &appId, int stage);
5960 Q_INVOKABLE int getStage(const QString &appId, int defaultValue) const;
6061
6162 Q_INVOKABLE Mir::State toMirState(WindowState state) const;
6263
63−private:
64− void initdb();
65−
66− void saveValue(const QString &queryString);
67− QSqlQuery getValue(const QString &queryString) const;
64+ const QString getDbName();
6865
69− static void executeAsyncQuery(const QString &queryString);
70− static QMutex s_mutex;
66+Q_SIGNALS:
67+ void saveStage(const QString &appId, int stage);
68+ void saveGeometry(const QString &windowId, const QRect &rect);
69+ void saveState(const QString &windowId, WindowStateStorage::WindowState state);
7170
72− // NB: This is accessed from threads. Make sure to mutex it.
73− QSqlDatabase m_db;
74−
75− QList<QFuture<void>> m_asyncQueries;
76− QThreadPool m_threadPool;
71+private:
72+ QThread m_thread;
73+ AsyncQuery *m_asyncQuery;
7774};
plugins/WindowManager/CMakeLists.txt+1
@@ -4,6 +4,7 @@ set(WINDOWMANAGER_SRC
44 Window.cpp
55 WindowManagerPlugin.cpp
66 WindowMargins.cpp
7+ InputMethodManager.cpp
78 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
89 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/Mir.h
910 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceInterface.h
plugins/WindowManager/InputMethodManager.cppnew file+56
@@ -0,0 +1,56 @@
1+/*
2+ * Copyright (C) 2019 UBports Foundation.
3+ * Author(s) Marius Gripsgard <marius@ubports.com>
4+ *
5+ * This program is free software: you can redistribute it and/or modify it under
6+ * the terms of the GNU Lesser General Public License version 3, as published by
7+ * the Free Software Foundation.
8+ *
9+ * This program is distributed in the hope that it will be useful, but WITHOUT
10+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
11+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12+ * Lesser General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU Lesser General Public License
15+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
16+ */
17+
18+#include "InputMethodManager.h"
19+#include <QDebug>
20+
21+#include <unity/shell/application/MirSurfaceInterface.h>
22+
23+// local
24+#include "Window.h"
25+
26+Q_LOGGING_CATEGORY(INPUTMETHODMANAGER, "InputMethodManager", QtInfoMsg)
27+#define DEBUG_MSG qCDebug(INPUTMETHODMANAGER).nospace().noquote() << __func__
28+
29+namespace unityapi = unity::shell::application;
30+
31+InputMethodManager *InputMethodManager::instance()
32+{
33+ static InputMethodManager* inputMethod(new InputMethodManager());
34+ return inputMethod;
35+}
36+
37+InputMethodManager::InputMethodManager()
38+{
39+}
40+
41+void InputMethodManager::setWindow(Window* window)
42+{
43+ if (window == m_inputMethodWindow) {
44+ return;
45+ }
46+
47+ DEBUG_MSG << "(" << window << ")";
48+
49+ m_inputMethodWindow = window;
50+ Q_EMIT surfaceChanged(surface());
51+}
52+
53+unityapi::MirSurfaceInterface* InputMethodManager::surface() const
54+{
55+ return m_inputMethodWindow ? m_inputMethodWindow->surface() : nullptr;
56+}
plugins/WindowManager/InputMethodManager.hnew file+55
@@ -0,0 +1,55 @@
1+/*
2+ * Copyright (C) 2019 UBports Foundation.
3+ * Author(s) Marius Gripsgard <marius@ubports.com>
4+ *
5+ * This program is free software: you can redistribute it and/or modify it under
6+ * the terms of the GNU Lesser General Public License version 3, as published by
7+ * the Free Software Foundation.
8+ *
9+ * This program is distributed in the hope that it will be useful, but WITHOUT
10+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
11+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12+ * Lesser General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU Lesser General Public License
15+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
16+ */
17+
18+#pragma once
19+
20+#include <QLoggingCategory>
21+#include <QObject>
22+
23+#include "WindowManagerGlobal.h"
24+
25+Q_DECLARE_LOGGING_CATEGORY(INPUTMETHODMANAGER)
26+
27+class Window;
28+
29+namespace unity {
30+ namespace shell {
31+ namespace application {
32+ class MirSurfaceInterface;
33+ }
34+ }
35+}
36+
37+class WINDOWMANAGERQML_EXPORT InputMethodManager : public QObject
38+{
39+ Q_OBJECT
40+ Q_PROPERTY(unity::shell::application::MirSurfaceInterface* surface READ surface NOTIFY surfaceChanged)
41+
42+public:
43+ InputMethodManager();
44+ static InputMethodManager* instance();
45+
46+ void setWindow(Window* window);
47+
48+Q_SIGNALS:
49+ void surfaceChanged(unity::shell::application::MirSurfaceInterface* inputMethodSurface);
50+
51+private:
52+ unity::shell::application::MirSurfaceInterface* surface() const;
53+
54+ Window* m_inputMethodWindow{nullptr};
55+};
plugins/WindowManager/TopLevelWindowModel.cpp+103−42
@@ -1,5 +1,6 @@
11/*
22 * Copyright (C) 2016-2017 Canonical, Ltd.
3+ * Copyright 2019 UBports Foundation
34 *
45 * This program is free software: you can redistribute it and/or modify it under
56 * the terms of the GNU Lesser General Public License version 3, as published by
@@ -29,6 +30,7 @@
2930
3031// local
3132#include "Window.h"
33+#include "InputMethodManager.h"
3234
3335Q_LOGGING_CATEGORY(TOPLEVELWINDOWMODEL, "toplevelwindowmodel", QtInfoMsg)
3436
@@ -38,7 +40,12 @@ Q_LOGGING_CATEGORY(TOPLEVELWINDOWMODEL, "toplevelwindowmodel", QtInfoMsg)
3840namespace unityapi = unity::shell::application;
3941
4042TopLevelWindowModel::TopLevelWindowModel()
43+ : m_nullWindow(createNullWindow()),
44+ m_surfaceManagerBusy(false)
4145{
46+ connect(m_nullWindow, &Window::focusedChanged, this, [this] {
47+ Q_EMIT rootFocusChanged();
48+ });
4249}
4350
4451void TopLevelWindowModel::setApplicationManager(unityapi::ApplicationManagerInterface* value)
@@ -188,9 +195,8 @@ void TopLevelWindowModel::prependSurfaceHelper(unityapi::MirSurfaceInterface *su
188195
189196 prependWindow(window, application);
190197
191− if (!surface) {
192− activateEmptyWindow(window);
193− }
198+ // Activate the newly-prepended window.
199+ window->activate();
194200
195201 INFO_MSG << " after " << toString();
196202}
@@ -311,10 +317,11 @@ void TopLevelWindowModel::onSurfaceDied(unityapi::MirSurfaceInterface *surface)
311317
312318 auto application = m_windowModel[i].application;
313319
314− // can't be starting if it already has a surface
315− Q_ASSERT(application->state() != unityapi::ApplicationInfoInterface::Starting);
320+ DEBUG_MSG << " application->name()=" << application->name()
321+ << " application->state()=" << application->state();
316322
317− if (application->state() == unityapi::ApplicationInfoInterface::Running) {
323+ if (application->state() == unityapi::ApplicationInfoInterface::Running
324+ || application->state() == unityapi::ApplicationInfoInterface::Starting) {
318325 m_windowModel[i].removeOnceSurfaceDestroyed = true;
319326 } else {
320327 // assume it got killed by the out-of-memory daemon.
@@ -344,7 +351,17 @@ void TopLevelWindowModel::onSurfaceDestroyed(unityapi::MirSurfaceInterface *surf
344351
345352Window *TopLevelWindowModel::createWindow(unityapi::MirSurfaceInterface *surface)
346353{
347− int id = generateId();
354+ int id = m_nextId.fetchAndAddAcquire(1);
355+ return createWindowWithId(surface, id);
356+}
357+
358+Window *TopLevelWindowModel::createNullWindow()
359+{
360+ return createWindowWithId(nullptr, 0);
361+}
362+
363+Window *TopLevelWindowModel::createWindowWithId(unityapi::MirSurfaceInterface *surface, int id)
364+{
348365 Window *qmlWindow = new Window(id, this);
349366 connectWindow(qmlWindow);
350367 if (surface) {
@@ -435,7 +452,17 @@ void TopLevelWindowModel::removeAt(int index)
435452 setFocusedWindow(nullptr);
436453 }
437454
438− INFO_MSG << " after " << toString();
455+ if (m_previousWindow == window) {
456+ m_previousWindow = nullptr;
457+ }
458+
459+ if (m_closingAllApps) {
460+ if (m_windowModel.isEmpty()) {
461+ Q_EMIT closedAllWindows();
462+ }
463+ }
464+
465+ INFO_MSG << " after " << toString() << " apps left " << m_windowModel.count();
439466}
440467
441468void TopLevelWindowModel::setInputMethodWindow(Window *window)
@@ -446,6 +473,7 @@ void TopLevelWindowModel::setInputMethodWindow(Window *window)
446473 }
447474 m_inputMethodWindow = window;
448475 Q_EMIT inputMethodSurfaceChanged(m_inputMethodWindow->surface());
476+ InputMethodManager::instance()->setWindow(window);
449477}
450478
451479void TopLevelWindowModel::removeInputMethodWindow()
@@ -454,6 +482,7 @@ void TopLevelWindowModel::removeInputMethodWindow()
454482 delete m_inputMethodWindow;
455483 m_inputMethodWindow = nullptr;
456484 Q_EMIT inputMethodSurfaceChanged(nullptr);
485+ InputMethodManager::instance()->setWindow(nullptr);
457486 }
458487}
459488
@@ -499,37 +528,6 @@ int TopLevelWindowModel::findIndexOf(const unityapi::MirSurfaceInterface *surfac
499528 return -1;
500529}
501530
502−int TopLevelWindowModel::generateId()
503−{
504− int id = m_nextId;
505− m_nextId = nextFreeId(nextId(id), id);
506− return id;
507−}
508−
509−int TopLevelWindowModel::nextId(int id) const
510−{
511− if (id == m_maxId) {
512− return id = 1;
513− } else {
514− return id + 1;
515− }
516−}
517−
518−int TopLevelWindowModel::nextFreeId(int candidateId, const int latestId)
519−{
520− int firstCandidateId = candidateId;
521−
522− while (indexForId(candidateId) != -1 || candidateId == latestId) {
523− candidateId = nextId(candidateId);
524−
525− if (candidateId == firstCandidateId) {
526− qFatal("TopLevelWindowModel: run out of window ids.");
527− }
528− }
529−
530− return candidateId;
531−}
532−
533531QString TopLevelWindowModel::toString()
534532{
535533 QString str;
@@ -643,16 +641,19 @@ void TopLevelWindowModel::setFocusedWindow(Window *window)
643641 if (window != m_focusedWindow) {
644642 INFO_MSG << "(" << window << ")";
645643
646− Window* previousWindow = m_focusedWindow;
644+ m_previousWindow = m_focusedWindow;
647645
648646 m_focusedWindow = window;
649647 Q_EMIT focusedWindowChanged(m_focusedWindow);
650648
651− if (previousWindow && previousWindow->focused() && !previousWindow->surface()) {
649+ if (m_previousWindow && m_previousWindow->focused() && !m_previousWindow->surface()) {
652650 // do it ourselves. miral doesn't know about this window
653− previousWindow->setFocused(false);
651+ m_previousWindow->setFocused(false);
654652 }
655653 }
654+
655+ // Reset
656+ m_pendingActivation = false;
656657}
657658
658659unityapi::MirSurfaceInterface* TopLevelWindowModel::inputMethodSurface() const
@@ -696,6 +697,7 @@ void TopLevelWindowModel::move(int from, int to)
696697}
697698void TopLevelWindowModel::onModificationsStarted()
698699{
700+ m_surfaceManagerBusy = true;
699701}
700702
701703void TopLevelWindowModel::onModificationsEnded()
@@ -706,6 +708,7 @@ void TopLevelWindowModel::onModificationsEnded()
706708 // reset
707709 m_focusedWindowChanged = false;
708710 m_newlyFocusedWindow = nullptr;
711+ m_surfaceManagerBusy = false;
709712}
710713
711714void TopLevelWindowModel::activateTopMostWindowWithoutId(int forbiddenId)
@@ -716,6 +719,64 @@ void TopLevelWindowModel::activateTopMostWindowWithoutId(int forbiddenId)
716719 Window *window = m_windowModel[i].window;
717720 if (window->id() != forbiddenId) {
718721 window->activate();
722+ break;
719723 }
720724 }
721725}
726+
727+void TopLevelWindowModel::closeAllWindows()
728+{
729+ m_closingAllApps = true;
730+ for (auto win : m_windowModel) {
731+ win.window->close();
732+ }
733+
734+ // This is done after the for loop in the unlikely event that
735+ // an app starts in between this
736+ if (m_windowModel.isEmpty()) {
737+ Q_EMIT closedAllWindows();
738+ }
739+}
740+
741+bool TopLevelWindowModel::rootFocus()
742+{
743+ return !m_nullWindow->focused();
744+}
745+
746+void TopLevelWindowModel::setRootFocus(bool focus)
747+{
748+ INFO_MSG << "(" << focus << "), surfaceManagerBusy is " << m_surfaceManagerBusy;
749+
750+ if (m_surfaceManagerBusy) {
751+ // Something else is probably being focused already, let's not add to
752+ // the noise.
753+ return;
754+ }
755+
756+ if (focus) {
757+ // Give focus back to previous focused window, only if null window is focused.
758+ // If null window is not focused, a different app had taken the focus and we
759+ // should repect that, or if a pendingActivation is going on.
760+ if (m_previousWindow && !m_previousWindow->focused() && !m_pendingActivation &&
761+ m_nullWindow == m_focusedWindow && m_previousWindow != m_nullWindow) {
762+ m_previousWindow->activate();
763+ } else if (!m_pendingActivation) {
764+ // The previous window does not exist any more, focus top window.
765+ activateTopMostWindowWithoutId(-1);
766+ }
767+ } else {
768+ if (!m_nullWindow->focused()) {
769+ m_nullWindow->activate();
770+ }
771+ }
772+}
773+
774+// Pending Activation will block refocus of previous focused window
775+// this is needed since surface activation with miral is async,
776+// and activation of placeholder is sync. This causes a race condition
777+// between placeholder and prev window. This results in prev window
778+// gets focused, as it will always be later than the placeholder.
779+void TopLevelWindowModel::pendingActivation()
780+{
781+ m_pendingActivation = true;
782+}
plugins/WindowManager/TopLevelWindowModel.h+50−8
@@ -1,5 +1,6 @@
11/*
22 * Copyright (C) 2016-2017 Canonical, Ltd.
3+ * Copyright 2019 UBports Foundation
34 *
45 * This program is free software: you can redistribute it and/or modify it under
56 * the terms of the GNU Lesser General Public License version 3, as published by
@@ -18,6 +19,7 @@
1819#define TOPLEVELWINDOWMODEL_H
1920
2021#include <QAbstractListModel>
22+#include <QAtomicInteger>
2123#include <QLoggingCategory>
2224
2325#include "WindowManagerGlobal.h"
@@ -86,7 +88,28 @@ class WINDOWMANAGERQML_EXPORT TopLevelWindowModel : public QAbstractListModel
8688 The id to be used on the next entry created
8789 Useful for tests
8890 */
89− Q_PROPERTY(int nextId READ nextId NOTIFY nextIdChanged)
91+ Q_PROPERTY(int nextId READ nextId)
92+
93+
94+ /**
95+ * @brief Sets whether a user Window or "nothing" should be focused
96+ *
97+ * This implementation of TLWM must have something focused. However, the
98+ * user may wish to have nothing in some cases - for example, when they
99+ * minimize all their windows on the desktop or unfocus the app they're
100+ * using by clicking the background or indicators.
101+ *
102+ * Unsetting rootFocus effectively focuses "nothing" by setting up a Window
103+ * that has no displayable Surfaces and bringing it into focus.
104+ *
105+ * Setting rootFocus attempts to focus the Window which was focused last -
106+ * unless another app is attempting to gain focus (as determined by
107+ * pendingActivation) and that's why we got rootFocus.
108+ *
109+ * If the previously-focused Window was closed before rootFocus was set,
110+ * the next available window will be focused.
111+ */
112+ Q_PROPERTY(bool rootFocus READ rootFocus WRITE setRootFocus NOTIFY rootFocusChanged)
90113
91114public:
92115 /**
@@ -122,7 +145,7 @@ public:
122145 unity::shell::application::SurfaceManagerInterface *surfaceManager() const { return m_surfaceManager; }
123146 void setSurfaceManager(unity::shell::application::SurfaceManagerInterface*);
124147
125− int nextId() const { return m_nextId; }
148+ int nextId() const { return m_nextId.load(); }
126149
127150public:
128151 /**
@@ -164,6 +187,19 @@ public:
164187 */
165188 Q_INVOKABLE void raiseId(int id);
166189
190+ /**
191+ * @brief Closes all windows, emits closedAllWindows when done
192+ */
193+ Q_INVOKABLE void closeAllWindows();
194+
195+ /**
196+ * @brief Sets pending activation flag
197+ */
198+ Q_INVOKABLE void pendingActivation();
199+
200+ void setRootFocus(bool focus);
201+ bool rootFocus();
202+
167203Q_SIGNALS:
168204 void countChanged();
169205 void inputMethodSurfaceChanged(unity::shell::application::MirSurfaceInterface* inputMethodSurface);
@@ -178,7 +214,9 @@ Q_SIGNALS:
178214 */
179215 void listChanged();
180216
181− void nextIdChanged();
217+ void closedAllWindows();
218+
219+ void rootFocusChanged();
182220
183221private Q_SLOTS:
184222 void onSurfaceCreated(unity::shell::application::MirSurfaceInterface *surface);
@@ -225,6 +263,8 @@ private:
225263 void activateTopMostWindowWithoutId(int forbiddenId);
226264
227265 Window *createWindow(unity::shell::application::MirSurfaceInterface *surface);
266+ Window *createWindowWithId(unity::shell::application::MirSurfaceInterface *surface, int id);
267+ Window *createNullWindow();
228268
229269 struct ModelEntry {
230270 ModelEntry() {}
@@ -239,15 +279,15 @@ private:
239279 QVector<ModelEntry> m_windowModel;
240280 Window* m_inputMethodWindow{nullptr};
241281 Window* m_focusedWindow{nullptr};
282+ Window* m_nullWindow;
283+ Window* m_previousWindow{nullptr};
284+ bool m_pendingActivation;
242285
243− int m_nextId{1};
244− // Just something big enough that we don't risk running out of unused id numbers.
245− // Not sure if QML int type supports something close to std::numeric_limits<int>::max() and
246− // there's no reason to try out its limits.
247− static const int m_maxId{1000000};
286+ QAtomicInteger<int> m_nextId{1};
248287
249288 unity::shell::application::ApplicationManagerInterface* m_applicationManager{nullptr};
250289 unity::shell::application::SurfaceManagerInterface *m_surfaceManager{nullptr};
290+ bool m_surfaceManagerBusy;
251291
252292 enum ModelState {
253293 IdleState,
@@ -261,6 +301,8 @@ private:
261301 // Valid between modificationsStarted and modificationsEnded
262302 bool m_focusedWindowChanged{false};
263303 Window *m_newlyFocusedWindow{nullptr};
304+
305+ bool m_closingAllApps{false};
264306};
265307
266308#endif // TOPLEVELWINDOWMODEL_H
plugins/WindowManager/Window.cpp+9
@@ -27,6 +27,7 @@ namespace unityapi = unity::shell::application;
2727Q_LOGGING_CATEGORY(UNITY_WINDOW, "unity.window", QtWarningMsg)
2828
2929#define DEBUG_MSG qCDebug(UNITY_WINDOW).nospace() << qPrintable(toString()) << "::" << __func__
30+#define WARNING_MSG qCWarning(UNITY_WINDOW).nospace() << qPrintable(toString()) << "::" << __func__
3031
3132Window::Window(int id, QObject *parent)
3233 : QObject(parent)
@@ -184,7 +185,15 @@ void Window::setSurface(unityapi::MirSurfaceInterface *surface)
184185 setSurface(nullptr);
185186 });
186187
188+ // Surface should never be focused at this point!
189+ if (m_surface->focused()) {
190+ WARNING_MSG << "Inital surface is focused!";
191+ }
192+
187193 // bring it up to speed
194+ if (m_focused) {
195+ m_surface->activate();
196+ }
188197 if (m_positionRequested) {
189198 m_surface->setRequestedPosition(m_requestedPosition);
190199 }
plugins/WindowManager/WindowManagerPlugin.cpp+9
@@ -20,14 +20,23 @@
2020#include "TopLevelWindowModel.h"
2121#include "Window.h"
2222#include "WindowMargins.h"
23+#include "InputMethodManager.h"
2324
2425#include <QtQml>
2526
27+QObject *inputMethodManager(QQmlEngine *engine, QJSEngine *scriptEngine)
28+{
29+ Q_UNUSED(engine)
30+ Q_UNUSED(scriptEngine)
31+ return InputMethodManager::instance();
32+}
33+
2634void WindowManagerPlugin::registerTypes(const char *uri)
2735{
2836 qmlRegisterType<AvailableDesktopArea>(uri, 1, 0, "AvailableDesktopArea");
2937 qmlRegisterType<TopLevelWindowModel>(uri, 1, 0, "TopLevelWindowModel");
3038 qmlRegisterType<WindowMargins>(uri, 1, 0, "WindowMargins");
39+ qmlRegisterSingletonType<InputMethodManager>(uri, 1, 0, "InputMethodManager", inputMethodManager);
3140
3241 qRegisterMetaType<Window*>("Window*");
3342
plugins/Wizard/CMakeLists.txt+1
@@ -10,6 +10,7 @@ add_library(Wizard-qml MODULE
1010 timezonemodel.cpp
1111 Status.cpp
1212 keyboardLayoutsModel.cpp
13+ Changelog.cpp
1314)
1415
1516target_link_libraries(Wizard-qml
plugins/Wizard/Changelog.cppnew file+58
@@ -0,0 +1,58 @@
1+/*
2+ * Copyright (C) 2018 The UBports project
3+ * Written by: Marius Gripsgard <marius@ubports.com>
4+ *
5+ * This program is free software: you can redistribute it and/or modify it
6+ * under the terms of the GNU General Public License version 3, as published
7+ * by the Free Software Foundation.
8+ *
9+ * This program is distributed in the hope that it will be useful, but
10+ * WITHOUT ANY WARRANTY; without even the implied warranties of
11+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
12+ * PURPOSE. See the GNU General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU General Public License along
15+ * with this program. If not, see <http://www.gnu.org/licenses/>.
16+ */
17+
18+#include "Changelog.h"
19+
20+#include <QDir>
21+#include <QFile>
22+#include <QTextStream>
23+
24+Changelog::Changelog()
25+ : QObject()
26+{
27+ readChangelog();
28+ if(QFile::exists(changelogPath()))
29+ m_fsWatcher.addPath(changelogPath());
30+ connect(&m_fsWatcher, &QFileSystemWatcher::fileChanged, this, &Changelog::watcherFileChanged);
31+}
32+
33+QString Changelog::changelogPath()
34+{
35+ return "/usr/share/ubports/changelogs/current";
36+}
37+
38+QString Changelog::text() const
39+{
40+ return m_text;
41+}
42+
43+void Changelog::readChangelog()
44+{
45+ if(!QFile::exists(changelogPath()))
46+ return;
47+ QFile f(changelogPath());
48+ if (!f.open(QFile::ReadOnly | QFile::Text)) return;
49+ QTextStream in(&f);
50+ m_text = in.readAll();
51+ Q_EMIT textChanged();
52+}
53+
54+void Changelog::watcherFileChanged()
55+{
56+ readChangelog();
57+ m_fsWatcher.removePath(changelogPath());
58+}
plugins/Wizard/Changelog.hnew file+52
@@ -0,0 +1,52 @@
1+/*
2+ * Copyright (C) 2018 The UBports project
3+ * Written by: Marius Gripsgard <marius@ubports.com>
4+ *
5+ * This program is free software: you can redistribute it and/or modify it
6+ * under the terms of the GNU General Public License version 3, as published
7+ * by the Free Software Foundation.
8+ *
9+ * This program is distributed in the hope that it will be useful, but
10+ * WITHOUT ANY WARRANTY; without even the implied warranties of
11+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
12+ * PURPOSE. See the GNU General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU General Public License along
15+ * with this program. If not, see <http://www.gnu.org/licenses/>.
16+ */
17+
18+#ifndef WIZARD_CHANGELOG_H
19+#define WIZARD_CHANGELOG_H
20+
21+#include <QFileSystemWatcher>
22+#include <QObject>
23+#include <QString>
24+
25+class Changelog : public QObject
26+{
27+ Q_OBJECT
28+ Q_PROPERTY(QString text READ text NOTIFY textChanged)
29+
30+public:
31+ Changelog();
32+ ~Changelog() = default;
33+
34+ QString text() const;
35+
36+Q_SIGNALS:
37+ void textChanged();
38+
39+private Q_SLOTS:
40+ void watcherFileChanged();
41+
42+private:
43+ Q_DISABLE_COPY(Changelog)
44+
45+ static QString changelogPath();
46+ void readChangelog();
47+
48+ QFileSystemWatcher m_fsWatcher;
49+ QString m_text;
50+};
51+
52+#endif
plugins/Wizard/PageList.cpp+6−5
@@ -46,9 +46,7 @@ PageList::PageList(QObject *parent)
4646 QSet<QString> disabledPages;
4747 QStringList dataDirs;
4848
49− if (getenv("WIZARD_TESTING") != nullptr) {
50− dataDirs = QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation);
51− } else if (!isRunningInstalled()) {
49+ if (!isRunningInstalled() && getenv("WIZARD_TESTING") == nullptr) {
5250 dataDirs << qmlDirectory();
5351 } else {
5452 dataDirs = shellDataDirs();
@@ -73,8 +71,11 @@ PageList::PageList(QObject *parent)
7371 // If there was a system update installed, skip until the last page to just greet the user
7472 QSettings settings;
7573 if (settings.value(QStringLiteral("Wizard/SkipUntilFinishedPage")).toBool()) {
76− while (m_pages.count() > 1) {
77− m_pages.erase(m_pages.begin());
74+ const QString lastPage = m_pages.lastKey();
75+ Q_FOREACH(const QString &page, m_pages.keys()) {
76+ if (Q_UNLIKELY(page != lastPage)) {
77+ m_pages.remove(page);
78+ }
7879 }
7980
8081 // ... and reset it again for the next run
plugins/Wizard/System.cpp+69−7
@@ -1,4 +1,5 @@
11/*
2+ * Copyright (C) 2018 The UBports project
23 * Copyright (C) 2014-2016 Canonical Ltd.
34 *
45 * This program is free software: you can redistribute it and/or modify it
@@ -46,29 +47,93 @@ QString System::wizardEnabledPath()
4647 return QDir::home().filePath(QStringLiteral(".config/ubuntu-system-settings/wizard-has-run"));
4748}
4849
50+QString System::currentFrameworkPath()
51+{
52+ QFileInfo f("/usr/share/click/frameworks/current");
53+ return f.canonicalFilePath();
54+}
55+
56+/*
57+wizardEnabled and isUpdate logic
58+
59+if wizard-has-run does NOT exist == is new install
60+if wizard-has-run exists but does NOT match current framework == is update
61+if wizard-has-run exists but does match current framework == show no wizard
62+*/
63+
64+bool System::wizardPathExists() {
65+ return QFile::exists(wizardEnabledPath());
66+}
67+
4968bool System::wizardEnabled() const
5069{
51− return !QFile::exists(wizardEnabledPath());
70+ if (!wizardPathExists()) {
71+ return true;
72+ }
73+ return isUpdate();
74+}
75+
76+QString System::readCurrentFramework()
77+{
78+ QFile f(currentFrameworkPath());
79+ if (!f.open(QFile::ReadOnly | QFile::Text)) return "";
80+ QTextStream in(&f);
81+ return in.readAll();
82+}
83+
84+QString System::readWizardEnabled()
85+{
86+ QFile f(wizardEnabledPath());
87+ if (!f.open(QFile::ReadOnly | QFile::Text)) return "";
88+ QTextStream in(&f);
89+ return in.readAll();
90+}
91+
92+QString System::version() const
93+{
94+ return readCurrentFramework();
95+}
96+
97+bool System::isUpdate() const
98+{
99+ if (!wizardPathExists()) {
100+ return false;
101+ }
102+
103+ return readCurrentFramework() != readWizardEnabled();
52104}
53105
54106void System::setWizardEnabled(bool enabled)
55107{
56− if (wizardEnabled() == enabled)
108+ if (wizardEnabled() == enabled && !isUpdate())
57109 return;
58110
59111 if (enabled) {
60112 QFile::remove(wizardEnabledPath());
61113 } else {
62114 QDir(wizardEnabledPath()).mkpath(QStringLiteral(".."));
63− QFile(wizardEnabledPath()).open(QIODevice::WriteOnly);
115+ if (QFile::exists(wizardEnabledPath())) {
116+ QFile::remove(wizardEnabledPath());
117+ }
118+ // For special cases check if wizardEnabledPath is a folder
119+ if (QDir(wizardEnabledPath()).exists()) {
120+ QDir(wizardEnabledPath()).removeRecursively();
121+ }
122+ if (!QFile::copy(currentFrameworkPath(), wizardEnabledPath())) {
123+ // Make en empty file if framework does not exist
124+ QFile f(wizardEnabledPath());
125+ f.open(QFile::WriteOnly);
126+ }
64127 m_fsWatcher.addPath(wizardEnabledPath());
65128 Q_EMIT wizardEnabledChanged();
129+ Q_EMIT isUpdateChanged();
66130 }
67131}
68132
69133void System::watcherFileChanged()
70134{
71135 Q_EMIT wizardEnabledChanged();
136+ Q_EMIT isUpdateChanged();
72137 m_fsWatcher.removePath(wizardEnabledPath());
73138}
74139
@@ -103,13 +168,10 @@ void System::updateSessionLocale(const QString &locale)
103168
104169 // Restart bits of the session to pick up new language.
105170 QProcess::startDetached(QStringLiteral("sh -c \"initctl emit indicator-services-end; \
106− initctl stop scope-registry; \
107− initctl stop smart-scopes-proxy; \
108171 initctl emit --no-wait indicator-services-start; \
109172 initctl restart --no-wait ubuntu-location-service-trust-stored; \
110173 initctl restart --no-wait maliit-server; \
111− initctl restart --no-wait indicator-messages; \
112− initctl restart --no-wait unity8-dash\""));
174+ initctl restart --no-wait indicator-messages"));
113175}
114176
115177void System::skipUntilFinishedPage()
plugins/Wizard/System.h+17
@@ -1,4 +1,5 @@
11/*
2+ * Copyright (C) 2018 The UBports project
23 * Copyright (C) 2014-2016 Canonical Ltd.
34 *
45 * This program is free software: you can redistribute it and/or modify it
@@ -18,6 +19,7 @@
1819#define WIZARD_SYSTEM_H
1920
2021#include <QFileSystemWatcher>
22+#include <QVersionNumber>
2123#include <QObject>
2224#include <QString>
2325
@@ -25,12 +27,21 @@ class System : public QObject
2527{
2628 Q_OBJECT
2729 Q_PROPERTY(bool wizardEnabled READ wizardEnabled WRITE setWizardEnabled NOTIFY wizardEnabledChanged)
30+ Q_PROPERTY(QString version READ version NOTIFY versionChanged)
31+ Q_PROPERTY(bool isUpdate READ isUpdate NOTIFY isUpdateChanged)
2832
2933public:
3034 System();
3135 ~System() = default;
3236
37+ /**
38+ * Checks whether the wizard is enabled for first-run or otherwise.
39+ */
3340 bool wizardEnabled() const;
41+
42+ QString version() const;
43+ bool isUpdate() const;
44+
3445 void setWizardEnabled(bool enabled);
3546
3647public Q_SLOTS:
@@ -42,6 +53,8 @@ public Q_SLOTS:
4253
4354Q_SIGNALS:
4455 void wizardEnabledChanged();
56+ void versionChanged();
57+ void isUpdateChanged();
4558
4659private Q_SLOTS:
4760 void watcherFileChanged();
@@ -50,7 +63,11 @@ private:
5063 Q_DISABLE_COPY(System)
5164
5265 static QString wizardEnabledPath();
66+ static QString currentFrameworkPath();
5367 static void setSessionVariable(const QString &variable, const QString &value);
68+ static QString readCurrentFramework();
69+ static QString readWizardEnabled();
70+ static bool wizardPathExists();
5471
5572 QFileSystemWatcher m_fsWatcher;
5673};
plugins/Wizard/plugin.cpp+2
@@ -20,6 +20,7 @@
2020#include "timezonemodel.h"
2121#include "LocalePlugin.h"
2222#include "Status.h"
23+#include "Changelog.h"
2324#include "keyboardLayoutsModel.h"
2425
2526#include <QtQml/qqml.h>
@@ -30,6 +31,7 @@ void WizardPlugin::registerTypes(const char *uri)
3031 qmlRegisterType<PageList>(uri, 0, 1, "PageList");
3132 qmlRegisterSingletonType<System>(uri, 0, 1, "System", [](QQmlEngine*, QJSEngine*) -> QObject* { return new System; });
3233 qmlRegisterSingletonType<Status>(uri, 0, 1, "Status", [](QQmlEngine*, QJSEngine*) -> QObject* { return new Status; });
34+ qmlRegisterSingletonType<Changelog>(uri, 0, 1, "Changelog", [](QQmlEngine*, QJSEngine*) -> QObject* { return new Changelog; });
3335 qmlRegisterType<TimeZoneLocationModel>(uri, 0, 1, "TimeZoneModel");
3436 qmlRegisterType<KeyboardLayoutsModel>(uri, 0, 1, "KeyboardLayoutsModel");
3537 qmlRegisterType<LocalePlugin>(uri, 0, 1, "LocalePlugin");
plugins/Wizard/test.shdeleted−18
@@ -1,18 +0,0 @@
1−#!/bin/sh
2−
3−TOPDIR=$(readlink -e "$(dirname ${0})/..")
4−
5−LOCAL_PRIVATE_DIR=$(ls -d ${TOPDIR}/debian/tmp/usr/lib/*/ubuntu-system-settings/private)
6−if [ -n ${LOCAL_PRIVATE_DIR} ]; then
7− echo "Testing against locally built version"
8− export UBUNTU_SYSTEM_SETTINGS_WIZARD_ROOT="${TOPDIR}/debian/tmp/usr/share"
9− export UBUNTU_SYSTEM_SETTINGS_WIZARD_MODULES="${LOCAL_PRIVATE_DIR}"
10− export QML2_IMPORT_PATH=${LOCAL_PRIVATE_DIR}:${QML2_IMPORT_PATH}
11− export PATH=${TOPDIR}/debian/tmp/usr/bin:${PATH}
12−else
13− echo "Testing against system version"
14−fi
15−
16−export QML2_IMPORT_PATH=${TOPDIR}/tests/mocks:${QML2_IMPORT_PATH}
17−
18−exec system-settings-wizard
plugins/Wizard/timezonemodel.h+1−1
@@ -27,6 +27,7 @@ class TimeZoneLocationModel: public QAbstractListModel
2727 Q_PROPERTY(bool listUpdating READ listUpdating NOTIFY listUpdatingChanged)
2828 Q_PROPERTY(QString filter READ filter WRITE setFilter NOTIFY filterChanged)
2929 Q_PROPERTY(QString country READ country WRITE setCountry NOTIFY countryChanged)
30+ Q_ENUMS(Roles)
3031
3132public:
3233 explicit TimeZoneLocationModel(QObject *parent = nullptr);
@@ -41,7 +42,6 @@ public:
4142 LatitudeRole,
4243 LongitudeRole
4344 };
44− Q_ENUM(Roles)
4545
4646 int rowCount(const QModelIndex &parent = QModelIndex()) const override;
4747 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
po/aa.po+154−257
@@ -6,39 +6,41 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2017-04-04 22:56+0000\n"
11−"PO-Revision-Date: 2016-02-12 10:18+0000\n"
12−"Last-Translator: Charif AYFARAH <ayfarah@ymail.com>\n"
13−"Language-Team: Afar <aa@li.org>\n"
9+"Report-Msgid-Bugs-To: \n"
10+"POT-Creation-Date: 2021-01-29 11:42-0600\n"
11+"PO-Revision-Date: 2021-03-08 10:42+0000\n"
12+"Last-Translator: TigranKhachatryan0 <tigrank2008@gmail.com>\n"
13+"Language-Team: Afar <https://translate.ubports.com/projects/ubports/lomiri/"
14+"aa/>\n"
15+"Language: aa\n"
1416"MIME-Version: 1.0\n"
1517"Content-Type: text/plain; charset=UTF-8\n"
1618"Content-Transfer-Encoding: 8bit\n"
1719"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
19−"X-Generator: Launchpad (build 18343)\n"
20+"X-Generator: Weblate 3.11.3\n"
21+"X-Launchpad-Export-Date: 2016-11-23 06:34+0000\n"
2022
21−#: plugins/LightDM/Greeter.cpp:188
23+#: plugins/LightDM/Greeter.cpp:199
2224msgid "Password: "
23−msgstr "Cuumita "
25+msgstr ""
2426
25−#: plugins/LightDM/Greeter.cpp:203
27+#: plugins/LightDM/Greeter.cpp:214
2628msgid "Username"
2729msgstr ""
2830
29−#: plugins/LightDM/Greeter.cpp:242
31+#: plugins/LightDM/Greeter.cpp:258
3032msgid "Failed to authenticate"
3133msgstr ""
3234
33−#: plugins/LightDM/Greeter.cpp:244
35+#: plugins/LightDM/Greeter.cpp:260
3436msgid "Invalid password, please try again"
3537msgstr ""
3638
37−#: plugins/LightDM/Greeter.cpp:254
39+#: plugins/LightDM/Greeter.cpp:270
3840msgid "Log In"
3941msgstr ""
4042
41−#: plugins/LightDM/Greeter.cpp:254
43+#: plugins/LightDM/Greeter.cpp:270
4244msgid "Retry"
4345msgstr "Qagis"
4446
@@ -50,16 +52,16 @@ msgstr ""
5052msgid "Guest Session"
5153msgstr ""
5254
53−#: plugins/Unity/Launcher/launcheritem.cpp:49
54−#: plugins/Unity/Launcher/launcheritem.cpp:123
55+#: plugins/Unity/Launcher/launcheritem.cpp:48
56+#: plugins/Unity/Launcher/launcheritem.cpp:122
5557msgid "Pin shortcut"
5658msgstr ""
5759
58−#: plugins/Unity/Launcher/launcheritem.cpp:55
60+#: plugins/Unity/Launcher/launcheritem.cpp:54
5961msgid "Quit"
6062msgstr "Kat"
6163
62−#: plugins/Unity/Launcher/launcheritem.cpp:123
64+#: plugins/Unity/Launcher/launcheritem.cpp:122
6365msgid "Unpin shortcut"
6466msgstr ""
6567
@@ -82,9 +84,8 @@ msgctxt "Button: Log out from the system"
8284msgid "Log Out"
8385msgstr "Eweq"
8486
85−#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
87−#: qml/Wizard/Pages/passcode-confirm.qml:32
87+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:284
88+#: qml/Greeter/NarrowView.qml:215 qml/Wizard/Pages/passcode-confirm.qml:32
8889#: qml/Wizard/Pages/passcode-set.qml:32
8990msgid "Cancel"
9091msgstr "Bayis"
@@ -106,33 +107,37 @@ msgstr "Maleey"
106107msgid "Yes"
107108msgstr "Yeey"
108109
109−#: qml/Components/Dialogs.qml:239
110+#: qml/Components/Dialogs.qml:243
110111msgctxt "Title: Power off/Restart dialog"
111112msgid "Power"
112113msgstr "Cayla"
113114
114−#: qml/Components/Dialogs.qml:240
115+#: qml/Components/Dialogs.qml:244
115116msgid ""
116117"Are you sure you would like\n"
117118"to power off?"
118119msgstr "Timmi haytuh digga maay litoo?"
119120
120−#: qml/Components/Dialogs.qml:244
121+#: qml/Components/Dialogs.qml:248
121122msgctxt "Button: Power off the system"
122123msgid "Power off"
123124msgstr "Timmi hayis"
124125
125−#: qml/Components/Dialogs.qml:255
126+#: qml/Components/Dialogs.qml:263
126127msgctxt "Button: Restart the system"
127128msgid "Restart"
128129msgstr "Wadir-qimbis"
129130
131+#: qml/Components/Dialogs.qml:276
132+msgid "Screenshot"
133+msgstr ""
134+
130135#: qml/Components/KeyboardShortcutsOverlay.qml:41
131136msgid "Keyboard Shortcuts"
132137msgstr ""
133138
134139#: qml/Components/KeyboardShortcutsOverlay.qml:55
135−msgid "Unity 8"
140+msgid "Lomiri"
136141msgstr ""
137142
138143#: qml/Components/KeyboardShortcutsOverlay.qml:62
@@ -219,18 +224,6 @@ msgstr ""
219224msgid "Opens the Application Drawer."
220225msgstr ""
221226
222−#: qml/Components/KeyboardShortcutsOverlay.qml:207
223−msgid "Scopes"
224−msgstr ""
225−
226−#: qml/Components/KeyboardShortcutsOverlay.qml:214
227−msgid "Super (Tap)"
228−msgstr ""
229−
230−#: qml/Components/KeyboardShortcutsOverlay.qml:219
231−msgid "Opens the Scopes home."
232−msgstr ""
233−
234227#: qml/Components/KeyboardShortcutsOverlay.qml:235
235228msgid "Switching"
236229msgstr ""
@@ -303,7 +296,7 @@ msgstr ""
303296msgid "Closes the current window."
304297msgstr ""
305298
306−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
299+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:235
307300msgid "Return to Call"
308301msgstr "Seecol gacis"
309302
@@ -377,103 +370,6 @@ msgstr ""
377370msgid "Find more settings in the system settings."
378371msgstr ""
379372
380−#: qml/Dash/DashPageHeader.qml:361
381−msgctxt "Button: Open the Ubuntu Store"
382−msgid "Store"
383−msgstr ""
384−
385−#: qml/Dash/DashPageHeader.qml:368
386−msgctxt "Button: Start a search in the current dash scope"
387−msgid "Search"
388−msgstr "Goranto"
389−
390−#: qml/Dash/DashPageHeader.qml:378
391−msgctxt "Button: Show the current dash scope settings"
392−msgid "Settings"
393−msgstr "Massosu"
394−
395−#: qml/Dash/DashPageHeader.qml:385
396−msgid "Remove from Favorites"
397−msgstr ""
398−
399−#: qml/Dash/DashPageHeader.qml:385
400−msgid "Add to Favorites"
401−msgstr ""
402−
403−#: qml/Dash/FiltersPopover.qml:61
404−msgid "Refine your results"
405−msgstr ""
406−
407−#: qml/Dash/FiltersPopover.qml:70
408−msgid "Reset"
409−msgstr ""
410−
411−#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
412−msgid "Show less"
413−msgstr ""
414−
415−#: qml/Dash/GenericScopeView.qml:547
416−msgid "Show all"
417−msgstr ""
418−
419−#: qml/Dash/GenericScopeView.qml:578
420−msgctxt "Label: Hint for dash search line edit"
421−msgid "Search"
422−msgstr "Goranto"
423−
424−#: qml/Dash/PageHeaderExtraPanel.qml:67
425−msgid "Recent Searches"
426−msgstr ""
427−
428−#: qml/Dash/PageHeaderExtraPanel.qml:78
429−msgid "Clear All"
430−msgstr ""
431−
432−#: qml/Dash/Previews/PreviewActionCombo.qml:36
433−msgid "More..."
434−msgstr ""
435−
436−#: qml/Dash/Previews/PreviewActionCombo.qml:36
437−msgid "Less..."
438−msgstr ""
439−
440−#: qml/Dash/Previews/PreviewCommentInput.qml:83
441−#: qml/Dash/Previews/PreviewRatingInput.qml:202
442−msgid "Send"
443−msgstr "Rub"
444−
445−#: qml/Dash/Previews/PreviewRatingInput.qml:109
446−msgid "Rate this"
447−msgstr ""
448−
449−#: qml/Dash/Previews/PreviewRatingInput.qml:184
450−msgid "Add a review"
451−msgstr ""
452−
453−#: qml/Dash/PullToRefreshScopeStyle.qml:56
454−msgid "Pull to refresh…"
455−msgstr ""
456−
457−#: qml/Dash/PullToRefreshScopeStyle.qml:61
458−msgid "Release to refresh…"
459−msgstr ""
460−
461−#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
462−msgid "Enable location data"
463−msgstr ""
464−
465−#: qml/Dash/ScopesList.qml:146
466−msgid "Manage"
467−msgstr ""
468−
469−#: qml/Dash/ScopesList.qml:187
470−msgid "Home"
471−msgstr "Dabqi"
472−
473−#: qml/Dash/ScopesList.qml:188
474−msgid "Also installed"
475−msgstr ""
476−
477373#: qml/Greeter/CoverPage.qml:127
478374msgid "Unlock"
479375msgstr ""
@@ -502,14 +398,18 @@ msgid "Try again"
502398msgstr ""
503399
504400#: qml/Greeter/Greeter.qml:551
401+#, fuzzy
402+#| msgid "Enter passphrase"
505403msgid "Enter passphrase to unlock"
506−msgstr ""
404+msgstr "Tatur-maxco culus"
507405
508406#: qml/Greeter/Greeter.qml:552
407+#, fuzzy
408+#| msgid "Enter passcode"
509409msgid "Enter passcode to unlock"
510−msgstr ""
410+msgstr "Tatur-mudenta culus"
511411
512−#: qml/Greeter/NarrowView.qml:228
412+#: qml/Greeter/NarrowView.qml:235
513413msgid "Emergency"
514414msgstr ""
515415
@@ -525,17 +425,19 @@ msgstr ""
525425msgid "Select desktop environment"
526426msgstr ""
527427
528−#: qml/Launcher/Drawer.qml:94
428+#: qml/Launcher/Drawer.qml:250
429+#, fuzzy
430+#| msgctxt "Button: Start a search in the current dash scope"
431+#| msgid "Search"
529432msgid "Search…"
530−msgstr ""
433+msgstr "Goranto"
531434
532−#: qml/Launcher/Drawer.qml:129
533−msgctxt "Apps sorted alphabetically"
534−msgid "A-Z"
435+#: qml/Launcher/PullToRefreshScopeStyle.qml:56
436+msgid "Pull to refresh…"
535437msgstr ""
536438
537−#: qml/Launcher/MoreAppsHeader.qml:55
538−msgid "More apps in the store"
439+#: qml/Launcher/PullToRefreshScopeStyle.qml:61
440+msgid "Release to refresh…"
539441msgstr ""
540442
541443#: qml/Notifications/NotificationMenuItemFactory.qml:124
@@ -626,13 +528,20 @@ msgid "Call back"
626528msgstr ""
627529
628530#: qml/Panel/PanelMenuPage.qml:92
531+#, fuzzy
532+#| msgctxt "Button: Go back one page in the Wizard"
533+#| msgid "Back"
629534msgid "Back"
630−msgstr ""
535+msgstr "Derre"
631536
632537#: qml/Stage/SideStage.qml:76
633538msgid "Drag using 3 fingers any application from one window to the other"
634539msgstr ""
635540
541+#: qml/Stage/Stage.qml:671
542+msgid "No running apps"
543+msgstr ""
544+
636545#: qml/Tutorial/TutorialLeftLong.qml:49
637546msgid "Long swipe from the left edge to open the Application Drawer"
638547msgstr ""
@@ -641,11 +550,11 @@ msgstr ""
641550msgid "Short swipe from the left edge to open the launcher"
642551msgstr ""
643552
644−#: qml/Tutorial/TutorialRight.qml:55
553+#: qml/Tutorial/TutorialRight.qml:54
645554msgid "Push your mouse against the right edge to view your open apps"
646555msgstr ""
647556
648−#: qml/Tutorial/TutorialRight.qml:56
557+#: qml/Tutorial/TutorialRight.qml:55
649558msgid "Swipe from the right edge to view your open apps"
650559msgstr ""
651560
@@ -653,25 +562,41 @@ msgstr ""
653562msgid "Swipe from the top edge to access notifications and quick settings"
654563msgstr ""
655564
656−#: qml/Wizard/Page.qml:54
565+#: qml/Wizard/Page.qml:59
657566msgctxt "Button: Go back one page in the Wizard"
658567msgid "Back"
659568msgstr "Derre"
660569
661−#: qml/Wizard/Pages/10-welcome.qml:28
570+#: qml/Wizard/Pages/10-welcome.qml:29
662571msgid "Language"
663572msgstr ""
664573
665−#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
666−#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
667−#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
668−#: qml/Wizard/Pages/70-passwd-type.qml:145
669−#: qml/Wizard/Pages/75-report-check.qml:84
670−#: qml/Wizard/Pages/passcode-desktop.qml:142
671−#: qml/Wizard/Pages/password-set.qml:142
574+#: qml/Wizard/Pages/10-welcome.qml:176
575+#: qml/Wizard/Pages/10-welcome-update.qml:126
576+#: qml/Wizard/Pages/11-changelog.qml:74 qml/Wizard/Pages/20-keyboard.qml:152
577+#: qml/Wizard/Pages/30-wifi.qml:214 qml/Wizard/Pages/50-timezone.qml:272
578+#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/70-passwd-type.qml:146
579+#: qml/Wizard/Pages/passcode-desktop.qml:154
580+#: qml/Wizard/Pages/password-set.qml:153
672581msgid "Next"
673582msgstr ""
674583
584+#: qml/Wizard/Pages/10-welcome-update.qml:91
585+msgid "Welcome to "
586+msgstr ""
587+
588+#: qml/Wizard/Pages/10-welcome-update.qml:106
589+msgid "We will make sure your device is ready to use "
590+msgstr ""
591+
592+#: qml/Wizard/Pages/11-changelog.qml:28
593+msgid "What's new"
594+msgstr ""
595+
596+#: qml/Wizard/Pages/11-changelog.qml:74
597+msgid "Loading..."
598+msgstr ""
599+
675600#: qml/Wizard/Pages/20-keyboard.qml:31
676601msgid "Select Keyboard"
677602msgstr ""
@@ -684,64 +609,33 @@ msgstr ""
684609msgid "Keyboard layout"
685610msgstr ""
686611
687−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
688−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
612+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:214
613+#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/79-system-update.qml:144
614+#: qml/Wizard/Pages/sim.qml:101
689615msgid "Skip"
690616msgstr "Kaqit"
691617
692−#: qml/Wizard/Pages/30-wifi.qml:30
618+#: qml/Wizard/Pages/30-wifi.qml:31
693619msgid "Connect to Wi‑Fi"
694620msgstr ""
695621
696−#: qml/Wizard/Pages/30-wifi.qml:131
622+#: qml/Wizard/Pages/30-wifi.qml:139
697623msgid "Connected"
698624msgstr ""
699625
700−#: qml/Wizard/Pages/30-wifi.qml:164
626+#: qml/Wizard/Pages/30-wifi.qml:172
701627msgid "Available Wi-Fi networks"
702628msgstr ""
703629
704−#: qml/Wizard/Pages/30-wifi.qml:165
630+#: qml/Wizard/Pages/30-wifi.qml:173
705631msgid "No available Wi-Fi networks"
706632msgstr ""
707633
708−#: qml/Wizard/Pages/40-location.qml:27
709−msgid "Location Services"
710−msgstr ""
711−
712−#: qml/Wizard/Pages/40-location.qml:83
713−msgid ""
714−"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
715−"(recommended)"
716−msgstr ""
717−
718−#: qml/Wizard/Pages/40-location.qml:105
719−#, qt-format
720−msgid "By selecting this option you agree to the Nokia HERE %1."
721−msgstr ""
722−
723−#: qml/Wizard/Pages/40-location.qml:106
724−msgctxt "part of: Nokia HERE terms and conditions"
725−msgid "terms and conditions"
726−msgstr ""
727−
728−#: qml/Wizard/Pages/40-location.qml:160
729−msgid "GPS only"
730−msgstr ""
731−
732−#: qml/Wizard/Pages/40-location.qml:214
733−msgid "Don't use my location"
734−msgstr ""
735−
736−#: qml/Wizard/Pages/40-location.qml:260
737−msgid "You can change it later in System Settings."
738−msgstr ""
739−
740634#: qml/Wizard/Pages/50-timezone.qml:30
741635msgid "Time Zone"
742636msgstr ""
743637
744−#: qml/Wizard/Pages/50-timezone.qml:182
638+#: qml/Wizard/Pages/50-timezone.qml:183
745639msgid "Enter your city"
746640msgstr ""
747641
@@ -749,7 +643,7 @@ msgstr ""
749643msgid "Personalize Your Device"
750644msgstr ""
751645
752−#: qml/Wizard/Pages/60-account.qml:48
646+#: qml/Wizard/Pages/60-account.qml:54
753647msgid "Preferred Name"
754648msgstr ""
755649
@@ -757,81 +651,72 @@ msgstr ""
757651msgid "Lock Screen"
758652msgstr ""
759653
760−#: qml/Wizard/Pages/70-passwd-type.qml:102
654+#: qml/Wizard/Pages/70-passwd-type.qml:103
761655msgctxt "Label: Type of security method"
762656msgid "Create new password"
763657msgstr ""
764658
765−#: qml/Wizard/Pages/70-passwd-type.qml:104
659+#: qml/Wizard/Pages/70-passwd-type.qml:105
766660msgctxt "Label: Type of security method"
767661msgid "Create passcode (numbers only)"
768662msgstr ""
769663
770−#: qml/Wizard/Pages/70-passwd-type.qml:106
664+#: qml/Wizard/Pages/70-passwd-type.qml:107
771665msgctxt "Label: Type of security method"
772666msgid "No lock code"
773667msgstr ""
774668
775−#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
776−msgid "Privacy Policy"
777−msgstr ""
778−
779−#: qml/Wizard/Pages/75-report-check.qml:26
780−msgid "Help Us Improve"
781−msgstr ""
782−
783−#: qml/Wizard/Pages/75-report-check.qml:59
784−msgid "Improve system performance by sending us crashes and error reports."
669+#: qml/Wizard/Pages/79-system-update.qml:28
670+msgid "Update Device"
785671msgstr ""
786672
787−#: qml/Wizard/Pages/75-report-check.qml:60
788−msgid "Privacy policy"
673+#: qml/Wizard/Pages/79-system-update.qml:55
674+msgid ""
675+"There is a system update available and ready to install. Afterwards, the "
676+"device will automatically restart."
789677msgstr ""
790678
791−#: qml/Wizard/Pages/80-finished.qml:89
792−msgid "Welcome to Ubuntu"
679+#: qml/Wizard/Pages/79-system-update.qml:76
680+msgctxt "string identifying name of the update"
681+msgid "Ubuntu Touch system"
793682msgstr ""
794683
795−#: qml/Wizard/Pages/80-finished.qml:104
796−msgid "You are ready to use your device now"
684+#: qml/Wizard/Pages/79-system-update.qml:83
685+#, qt-format
686+msgctxt "version of the system update"
687+msgid "Version %1"
797688msgstr ""
798689
799−#: qml/Wizard/Pages/80-finished.qml:124
800−msgid "Get Started"
690+#: qml/Wizard/Pages/79-system-update.qml:95
691+msgid "This could take a few minutes..."
801692msgstr ""
802693
803−#: qml/Wizard/Pages/here-terms.qml:25
804−msgid "Terms & Conditions"
694+#: qml/Wizard/Pages/79-system-update.qml:109
695+msgid "Install and restart now"
805696msgstr ""
806697
807−#: qml/Wizard/Pages/here-terms.qml:69
808−msgid "Your device uses positioning technologies provided by HERE."
698+#: qml/Wizard/Pages/80-finished.qml:91
699+msgid "Welcome Back"
809700msgstr ""
810701
811−#: qml/Wizard/Pages/here-terms.qml:81
812−msgid ""
813−"To provide you with positioning services and to improve their quality, HERE "
814−"collects information about nearby cell towers and Wi-Fi hotspots around your "
815−"current location whenever your position is being found."
702+#: qml/Wizard/Pages/80-finished.qml:91
703+msgid "Welcome to Ubuntu"
816704msgstr ""
817705
818−#: qml/Wizard/Pages/here-terms.qml:93
819−msgid ""
820−"The information collected is used to analyze the service and to improve the "
821−"use of service, but not to identify you personally."
706+#: qml/Wizard/Pages/80-finished.qml:106
707+msgid "You are ready to use your device now"
822708msgstr ""
823709
824−#: qml/Wizard/Pages/here-terms.qml:106
825−#, qt-format
826−msgid "By continuing, you agree to the HERE platform %1 and %2."
827−msgstr ""
710+#: qml/Wizard/Pages/80-finished.qml:126
711+msgid "Continue"
712+msgstr "Tatur"
828713
829−#: qml/Wizard/Pages/here-terms.qml:107
830−msgid "Service Terms"
714+#: qml/Wizard/Pages/80-finished.qml:126
715+msgid "Get Started"
831716msgstr ""
832717
833718#: qml/Wizard/Pages/passcode-confirm.qml:43
834−#: qml/Wizard/Pages/passcode-desktop.qml:97
719+#: qml/Wizard/Pages/passcode-desktop.qml:104
835720msgid "Confirm passcode"
836721msgstr ""
837722
@@ -848,24 +733,24 @@ msgstr ""
848733msgid "Lock Screen Passcode"
849734msgstr ""
850735
851−#: qml/Wizard/Pages/passcode-desktop.qml:61
736+#: qml/Wizard/Pages/passcode-desktop.qml:68
852737msgid "Enter 4 numbers to setup your passcode"
853738msgstr ""
854739
855−#: qml/Wizard/Pages/passcode-desktop.qml:77
740+#: qml/Wizard/Pages/passcode-desktop.qml:84
856741#: qml/Wizard/Pages/passcode-set.qml:54
857742msgid "Choose passcode"
858743msgstr ""
859744
860−#: qml/Wizard/Pages/passcode-desktop.qml:127
745+#: qml/Wizard/Pages/passcode-desktop.qml:139
861746msgid "Passcode too short"
862747msgstr ""
863748
864−#: qml/Wizard/Pages/passcode-desktop.qml:129
749+#: qml/Wizard/Pages/passcode-desktop.qml:141
865750msgid "Passcodes match"
866751msgstr ""
867752
868−#: qml/Wizard/Pages/passcode-desktop.qml:131
753+#: qml/Wizard/Pages/passcode-desktop.qml:143
869754msgid "Passcodes do not match"
870755msgstr ""
871756
@@ -877,15 +762,15 @@ msgstr ""
877762msgid "Lock Screen Password"
878763msgstr ""
879764
880−#: qml/Wizard/Pages/password-set.qml:62
765+#: qml/Wizard/Pages/password-set.qml:68
881766msgid "Enter at least 8 characters"
882767msgstr ""
883768
884−#: qml/Wizard/Pages/password-set.qml:74
769+#: qml/Wizard/Pages/password-set.qml:80
885770msgid "Choose password"
886771msgstr ""
887772
888−#: qml/Wizard/Pages/password-set.qml:104
773+#: qml/Wizard/Pages/password-set.qml:110
889774msgid "Confirm password"
890775msgstr ""
891776
@@ -941,6 +826,28 @@ msgstr ""
941826msgid "Very weak password"
942827msgstr ""
943828
829+#~ msgctxt "Button: Show the current dash scope settings"
830+#~ msgid "Settings"
831+#~ msgstr "Massosu"
832+
833+#~ msgctxt "Label: Hint for dash search line edit"
834+#~ msgid "Search"
835+#~ msgstr "Goranto"
836+
837+#~ msgid "Send"
838+#~ msgstr "Rub"
839+
840+#~ msgid "Home"
841+#~ msgstr "Dabqi"
842+
843+#, fuzzy
844+#~ msgid "Download"
845+#~ msgstr "Qulluumah"
846+
847+#, fuzzy
848+#~ msgid "Downloaded"
849+#~ msgstr "Qulluumah"
850+
944851#~ msgctxt "Title: Reboot/Shut down dialog"
945852#~ msgid "Shut down"
946853#~ msgstr "Bargus"
@@ -956,16 +863,9 @@ msgstr ""
956863#~ msgid "Reboot"
957864#~ msgstr "Wadir-ugus"
958865
959−#, qt-format
960866#~ msgid "Enter %1"
961867#~ msgstr "%1 culus"
962868
963−#~ msgid "Enter passphrase"
964−#~ msgstr "Tatur-maxco culus"
965−
966−#~ msgid "Enter passcode"
967−#~ msgstr "Tatur-mudenta culus"
968−
969869#~ msgctxt "Label: Type of security method"
970870#~ msgid "Swipe"
971871#~ msgstr "Uysuttuc"
@@ -978,6 +878,3 @@ msgstr ""
978878
979879#~ msgid "Let’s get started."
980880#~ msgstr "Hayya qimbisnay."
981−
982−#~ msgid "Continue"
983−#~ msgstr "Tatur"
po/am.po+368−334
@@ -6,39 +6,41 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2017-04-04 22:56+0000\n"
11−"PO-Revision-Date: 2017-01-26 15:04+0000\n"
12−"Last-Translator: samson <Unknown>\n"
13−"Language-Team: Amharic <am@li.org>\n"
9+"Report-Msgid-Bugs-To: \n"
10+"POT-Creation-Date: 2021-01-29 11:42-0600\n"
11+"PO-Revision-Date: 2021-08-29 20:18+0000\n"
12+"Last-Translator: Samson <sambelet@yahoo.com>\n"
13+"Language-Team: Amharic <https://translate.ubports.com/projects/ubports/"
14+"lomiri/am/>\n"
15+"Language: am\n"
1416"MIME-Version: 1.0\n"
1517"Content-Type: text/plain; charset=UTF-8\n"
1618"Content-Transfer-Encoding: 8bit\n"
1719"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
19−"X-Generator: Launchpad (build 18343)\n"
20+"X-Generator: Weblate 3.11.3\n"
21+"X-Launchpad-Export-Date: 2016-11-23 06:34+0000\n"
2022
21−#: plugins/LightDM/Greeter.cpp:188
23+#: plugins/LightDM/Greeter.cpp:199
2224msgid "Password: "
2325msgstr "የ መግቢያ ቃል: "
2426
25−#: plugins/LightDM/Greeter.cpp:203
27+#: plugins/LightDM/Greeter.cpp:214
2628msgid "Username"
2729msgstr "የ ተጠቃሚ ስም"
2830
29−#: plugins/LightDM/Greeter.cpp:242
31+#: plugins/LightDM/Greeter.cpp:258
3032msgid "Failed to authenticate"
3133msgstr "ማረጋገጥ አልተቻለም"
3234
33−#: plugins/LightDM/Greeter.cpp:244
35+#: plugins/LightDM/Greeter.cpp:260
3436msgid "Invalid password, please try again"
35−msgstr "እባክዎን እንደገና ይሞክሩ ዋጋ የሌለው የመግቢያ ቃል"
37+msgstr "ዋጋ የሌለው የ መግቢያ ቃል: እባክዎን እንደገና ይሞክሩ"
3638
37−#: plugins/LightDM/Greeter.cpp:254
39+#: plugins/LightDM/Greeter.cpp:270
3840msgid "Log In"
3941msgstr "መግቢያ"
4042
41−#: plugins/LightDM/Greeter.cpp:254
43+#: plugins/LightDM/Greeter.cpp:270
4244msgid "Retry"
4345msgstr "እንደገና ይሞክሩ"
4446
@@ -50,16 +52,16 @@ msgstr "መግቢያ"
5052msgid "Guest Session"
5153msgstr "የ እንግዳ ክፍለ ጊዜ"
5254
53−#: plugins/Unity/Launcher/launcheritem.cpp:49
54−#: plugins/Unity/Launcher/launcheritem.cpp:123
55+#: plugins/Unity/Launcher/launcheritem.cpp:48
56+#: plugins/Unity/Launcher/launcheritem.cpp:122
5557msgid "Pin shortcut"
5658msgstr "አቋራጭ ማጣበቂያ"
5759
58−#: plugins/Unity/Launcher/launcheritem.cpp:55
60+#: plugins/Unity/Launcher/launcheritem.cpp:54
5961msgid "Quit"
6062msgstr "ማጥፊያ"
6163
62−#: plugins/Unity/Launcher/launcheritem.cpp:123
64+#: plugins/Unity/Launcher/launcheritem.cpp:122
6365msgid "Unpin shortcut"
6466msgstr "አቋራጭ መለያያ"
6567
@@ -82,9 +84,8 @@ msgctxt "Button: Log out from the system"
8284msgid "Log Out"
8385msgstr "መውጫ"
8486
85−#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
87−#: qml/Wizard/Pages/passcode-confirm.qml:32
87+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:284
88+#: qml/Greeter/NarrowView.qml:215 qml/Wizard/Pages/passcode-confirm.qml:32
8889#: qml/Wizard/Pages/passcode-set.qml:32
8990msgid "Cancel"
9091msgstr "መሰረዣ"
@@ -106,12 +107,12 @@ msgstr "አይ"
106107msgid "Yes"
107108msgstr "አዎ"
108109
109−#: qml/Components/Dialogs.qml:239
110+#: qml/Components/Dialogs.qml:243
110111msgctxt "Title: Power off/Restart dialog"
111112msgid "Power"
112113msgstr "ሐይል"
113114
114−#: qml/Components/Dialogs.qml:240
115+#: qml/Components/Dialogs.qml:244
115116msgid ""
116117"Are you sure you would like\n"
117118"to power off?"
@@ -119,23 +120,27 @@ msgstr ""
119120"በእርግጥ ሐይሉን ማጥፋት\n"
120121"ይፈልጋሉ?"
121122
122−#: qml/Components/Dialogs.qml:244
123+#: qml/Components/Dialogs.qml:248
123124msgctxt "Button: Power off the system"
124125msgid "Power off"
125126msgstr "ሐይል ማጥፊያ"
126127
127−#: qml/Components/Dialogs.qml:255
128+#: qml/Components/Dialogs.qml:263
128129msgctxt "Button: Restart the system"
129130msgid "Restart"
130131msgstr "እንደገና ማስጀመሪያ"
131132
133+#: qml/Components/Dialogs.qml:276
134+msgid "Screenshot"
135+msgstr "መመልከቻ ፎቶ ማንሻ"
136+
132137#: qml/Components/KeyboardShortcutsOverlay.qml:41
133138msgid "Keyboard Shortcuts"
134139msgstr "የ ፊደል ገበታ አቋራጮች"
135140
136141#: qml/Components/KeyboardShortcutsOverlay.qml:55
137−msgid "Unity 8"
138−msgstr "Unity 8"
142+msgid "Lomiri"
143+msgstr "Lomiri"
139144
140145#: qml/Components/KeyboardShortcutsOverlay.qml:62
141146msgid "PrtScr"
@@ -151,7 +156,7 @@ msgstr "Alt + PrtScr"
151156
152157#: qml/Components/KeyboardShortcutsOverlay.qml:80
153158msgid "Takes a screenshot of the current window."
154−msgstr "የ አሁኑን መስኮት ፎቶ ማንሻ"
159+msgstr "የ አሁኑን መስኮት መመልከቻ ፎቶ ማንሻ"
155160
156161#: qml/Components/KeyboardShortcutsOverlay.qml:88
157162msgid "Super + Space"
@@ -207,7 +212,7 @@ msgstr "መተግበሪያዎችን በ ማስጀመሪያ መቀየሪያ"
207212
208213#: qml/Components/KeyboardShortcutsOverlay.qml:177
209214msgid "Super + 1 to 0"
210−msgstr "Super + 1 ወደ 0"
215+msgstr "Super + 0 እስከ 9"
211216
212217#: qml/Components/KeyboardShortcutsOverlay.qml:182
213218msgid "Same as clicking on a launcher icon."
@@ -219,19 +224,7 @@ msgstr "Super + A"
219224
220225#: qml/Components/KeyboardShortcutsOverlay.qml:195
221226msgid "Opens the Application Drawer."
222−msgstr "መተግበሪያ መክፈቻ"
223−
224−#: qml/Components/KeyboardShortcutsOverlay.qml:207
225−msgid "Scopes"
226−msgstr "ክልል"
227−
228−#: qml/Components/KeyboardShortcutsOverlay.qml:214
229−msgid "Super (Tap)"
230−msgstr "Super (Tap)"
231−
232−#: qml/Components/KeyboardShortcutsOverlay.qml:219
233−msgid "Opens the Scopes home."
234−msgstr "የ ክልል ቤት መክፈቻ"
227+msgstr "የ መሳያ መተግበሪያ ማስጀመሪያ"
235228
236229#: qml/Components/KeyboardShortcutsOverlay.qml:235
237230msgid "Switching"
@@ -305,7 +298,7 @@ msgstr "Alt + F4"
305298msgid "Closes the current window."
306299msgstr "የ አሁኑን መስኮት መዝጊያ"
307300
308−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
301+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:235
309302msgid "Return to Call"
310303msgstr "ወደ ጥሪ መመለሻ"
311304
@@ -365,116 +358,19 @@ msgstr "የ እርስዎ አካል አሁን ከ ውጪ ማሳያ ጋር ተገ
365358
366359#: qml/Components/VirtualTouchPad.qml:327
367360msgid "Tap left button to click."
368−msgstr "መታ ያድርጉ በ ግራ ቁልፍ ላይ ለ መጫን"
361+msgstr "የ ግራ ቁልፍ መታ ያድርጉ ለ መጫን"
369362
370363#: qml/Components/VirtualTouchPad.qml:339
371364msgid "Tap right button to right click."
372−msgstr "መታ ያድርጉ በ ቀኝ ቁልፍ ላይ ለ መጫን"
365+msgstr "የ ቀኝ ቁልፍ መታ ያድርጉ በ ቀኝ ለ መጫን"
373366
374367#: qml/Components/VirtualTouchPad.qml:351
375368msgid "Swipe with two fingers to scroll."
376−msgstr "ለ መሽብለል በ ሁለት ጣት ይጥረጉ"
369+msgstr "ለ መሸብለል በ ሁለት ጣቶች ይጥረጉ"
377370
378371#: qml/Components/VirtualTouchPad.qml:396
379372msgid "Find more settings in the system settings."
380−msgstr "ተጨማሪ ማሰናጃዎችን ያግኙ በ ስርአት ማሰናጃ ውስጥ"
381−
382−#: qml/Dash/DashPageHeader.qml:361
383−msgctxt "Button: Open the Ubuntu Store"
384−msgid "Store"
385−msgstr "ማስቀመጫ"
386−
387−#: qml/Dash/DashPageHeader.qml:368
388−msgctxt "Button: Start a search in the current dash scope"
389−msgid "Search"
390−msgstr "መፈለጊያ"
391−
392−#: qml/Dash/DashPageHeader.qml:378
393−msgctxt "Button: Show the current dash scope settings"
394−msgid "Settings"
395−msgstr "ማሰናጃዎች"
396−
397−#: qml/Dash/DashPageHeader.qml:385
398−msgid "Remove from Favorites"
399−msgstr "ከምወዳቸው ማስወገጃ"
400−
401−#: qml/Dash/DashPageHeader.qml:385
402−msgid "Add to Favorites"
403−msgstr "ወደምወዳቸው መጨመሪያ"
404−
405−#: qml/Dash/FiltersPopover.qml:61
406−msgid "Refine your results"
407−msgstr "የ እርስዎን ውጤቶች እንደገና ማጣሪያ"
408−
409−#: qml/Dash/FiltersPopover.qml:70
410−msgid "Reset"
411−msgstr "እንደ ነበረ መመለሻ"
412−
413−#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
414−msgid "Show less"
415−msgstr "ትንሽ ማሳያ"
416−
417−#: qml/Dash/GenericScopeView.qml:547
418−msgid "Show all"
419−msgstr "ሁሉንም ማሳያ"
420−
421−#: qml/Dash/GenericScopeView.qml:578
422−msgctxt "Label: Hint for dash search line edit"
423−msgid "Search"
424−msgstr "መፈለጊያ"
425−
426−#: qml/Dash/PageHeaderExtraPanel.qml:67
427−msgid "Recent Searches"
428−msgstr "የ ቅርብ ጊዜ ፍለጋዎች"
429−
430−#: qml/Dash/PageHeaderExtraPanel.qml:78
431−msgid "Clear All"
432−msgstr "ሁሉንም ማጽጃ"
433−
434−#: qml/Dash/Previews/PreviewActionCombo.qml:36
435−msgid "More..."
436−msgstr "ተጨማሪ..."
437−
438−#: qml/Dash/Previews/PreviewActionCombo.qml:36
439−msgid "Less..."
440−msgstr "አነስተኛ..."
441−
442−#: qml/Dash/Previews/PreviewCommentInput.qml:83
443−#: qml/Dash/Previews/PreviewRatingInput.qml:202
444−msgid "Send"
445−msgstr "መላኪያ"
446−
447−#: qml/Dash/Previews/PreviewRatingInput.qml:109
448−msgid "Rate this"
449−msgstr "ለዚህ ደረጃ ይስጡ"
450−
451−#: qml/Dash/Previews/PreviewRatingInput.qml:184
452−msgid "Add a review"
453−msgstr "ግምገማ መጨመሪያ"
454−
455−#: qml/Dash/PullToRefreshScopeStyle.qml:56
456−msgid "Pull to refresh…"
457−msgstr "ይሳቡ ለማነቃቃት…"
458−
459−#: qml/Dash/PullToRefreshScopeStyle.qml:61
460−msgid "Release to refresh…"
461−msgstr "ይልቀቁ ለማነቃቃት…"
462−
463−#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
464−msgid "Enable location data"
465−msgstr "የአካባቢ ዳታ ማስቻያ"
466−
467−#: qml/Dash/ScopesList.qml:146
468−msgid "Manage"
469−msgstr "አስተዳዳሪ"
470−
471−#: qml/Dash/ScopesList.qml:187
472−msgid "Home"
473−msgstr "ቤት"
474−
475−#: qml/Dash/ScopesList.qml:188
476−msgid "Also installed"
477−msgstr "እንዲሁም የተገጠሙ"
373+msgstr "ተጨማሪ ማሰናጃ በ ስርአት ማሰናጃ ውስጥ መፈለጊያ"
478374
479375#: qml/Greeter/CoverPage.qml:127
480376msgid "Unlock"
@@ -505,13 +401,13 @@ msgstr "እንደገና ይሞክሩ"
505401
506402#: qml/Greeter/Greeter.qml:551
507403msgid "Enter passphrase to unlock"
508−msgstr "የ ማለፊያ ሀረግ ያስገቡ ለ መክፈት"
404+msgstr "የ ማለፊያ ሀረግ ያስገቡ"
509405
510406#: qml/Greeter/Greeter.qml:552
511407msgid "Enter passcode to unlock"
512408msgstr "የ ማለፊያ ኮድ ያስገቡ ለ መክፈት"
513409
514−#: qml/Greeter/NarrowView.qml:228
410+#: qml/Greeter/NarrowView.qml:235
515411msgid "Emergency"
516412msgstr "ድንገተኛ"
517413
@@ -527,18 +423,17 @@ msgstr "ማለፊያ ኮድ"
527423msgid "Select desktop environment"
528424msgstr "የ ዴስክቶፕ አይነት ይምረጡ"
529425
530−#: qml/Launcher/Drawer.qml:94
426+#: qml/Launcher/Drawer.qml:250
531427msgid "Search…"
532−msgstr "መፈለጊያ..."
428+msgstr "መፈለጊያ…"
533429
534−#: qml/Launcher/Drawer.qml:129
535−msgctxt "Apps sorted alphabetically"
536−msgid "A-Z"
537−msgstr "A-Z"
430+#: qml/Launcher/PullToRefreshScopeStyle.qml:56
431+msgid "Pull to refresh…"
432+msgstr "ይሳቡ ለማነቃቃት…"
538433
539−#: qml/Launcher/MoreAppsHeader.qml:55
540−msgid "More apps in the store"
541−msgstr "ተጨማሪ መተግበሪያ በ ሱቅ ውስጥ"
434+#: qml/Launcher/PullToRefreshScopeStyle.qml:61
435+msgid "Release to refresh…"
436+msgstr "ይልቀቁ ለማነቃቃት…"
542437
543438#: qml/Notifications/NotificationMenuItemFactory.qml:124
544439msgid "Show password"
@@ -635,19 +530,25 @@ msgstr "ወደ ኋላ"
635530msgid "Drag using 3 fingers any application from one window to the other"
636531msgstr "መጎተቻ 3 ጣቶች በ መጠቀም ማንኛውንም መተግበሪያ ከ አንድ መስኮት ወደ ሌላ"
637532
533+#: qml/Stage/Stage.qml:671
534+msgid "No running apps"
535+msgstr ""
536+
638537#: qml/Tutorial/TutorialLeftLong.qml:49
538+#, fuzzy
539+#| msgid "Long swipe from the left edge to open the Today scope"
639540msgid "Long swipe from the left edge to open the Application Drawer"
640−msgstr "በረጅሙ ይጥረጉ ከ ግራ ጠርዝ በኩል መተግበሪያ ለ መክፈት ከ መሳቢያ ውስጥ"
541+msgstr "በ ረጅሙ ከ ግራ ጠርዝ በኩል ይጥረጉ የ ዛሬን ክልል ለ መክፈት"
641542
642543#: qml/Tutorial/TutorialLeft.qml:47
643544msgid "Short swipe from the left edge to open the launcher"
644545msgstr "በ አጭሩ ይጥረጉ ከ ግራ ጠርዝ በኩል ማስጀመሪያውን ለ መክፈት"
645546
646−#: qml/Tutorial/TutorialRight.qml:55
547+#: qml/Tutorial/TutorialRight.qml:54
647548msgid "Push your mouse against the right edge to view your open apps"
648549msgstr "የ እርስዎን አይጥ መጠቆሚያ ወደ ቀኝ ጠርዝ በኩል ያስጠጉ የ ተከፈቱ መተግበሪያዎችን ለ መመልከት"
649550
650−#: qml/Tutorial/TutorialRight.qml:56
551+#: qml/Tutorial/TutorialRight.qml:55
651552msgid "Swipe from the right edge to view your open apps"
652553msgstr "ከ ቀኝ በኩል ይጥረጉ የ ተከፈቱ መተግበሪያዎችን ለ መመልከት"
653554
@@ -655,28 +556,44 @@ msgstr "ከ ቀኝ በኩል ይጥረጉ የ ተከፈቱ መተግበሪያዎ
655556msgid "Swipe from the top edge to access notifications and quick settings"
656557msgstr "ከ ላይ ጠረዝ በኩል ይጥረጉ ማስታወቂያዎች እና በፍጥነት ማሰናጃዎች ጋር ለ መድረስ"
657558
658−#: qml/Wizard/Page.qml:54
559+#: qml/Wizard/Page.qml:59
659560msgctxt "Button: Go back one page in the Wizard"
660561msgid "Back"
661562msgstr "ወደ ኋላ"
662563
663−#: qml/Wizard/Pages/10-welcome.qml:28
564+#: qml/Wizard/Pages/10-welcome.qml:29
664565msgid "Language"
665566msgstr "ቋንቋ"
666567
667−#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
668−#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
669−#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
670−#: qml/Wizard/Pages/70-passwd-type.qml:145
671−#: qml/Wizard/Pages/75-report-check.qml:84
672−#: qml/Wizard/Pages/passcode-desktop.qml:142
673−#: qml/Wizard/Pages/password-set.qml:142
568+#: qml/Wizard/Pages/10-welcome.qml:176
569+#: qml/Wizard/Pages/10-welcome-update.qml:126
570+#: qml/Wizard/Pages/11-changelog.qml:74 qml/Wizard/Pages/20-keyboard.qml:152
571+#: qml/Wizard/Pages/30-wifi.qml:214 qml/Wizard/Pages/50-timezone.qml:272
572+#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/70-passwd-type.qml:146
573+#: qml/Wizard/Pages/passcode-desktop.qml:154
574+#: qml/Wizard/Pages/password-set.qml:153
674575msgid "Next"
675576msgstr "ይቀጥሉ"
676577
578+#: qml/Wizard/Pages/10-welcome-update.qml:91
579+msgid "Welcome to "
580+msgstr "እንኳን ደህና መጡ ወደ: "
581+
582+#: qml/Wizard/Pages/10-welcome-update.qml:106
583+msgid "We will make sure your device is ready to use "
584+msgstr "የ እርስዎ አካል ለ መጠቀም ዝግጁ ነው: "
585+
586+#: qml/Wizard/Pages/11-changelog.qml:28
587+msgid "What's new"
588+msgstr "ምን አዲስ ነገር አለ"
589+
590+#: qml/Wizard/Pages/11-changelog.qml:74
591+msgid "Loading..."
592+msgstr "በ መጫን ላይ..."
593+
677594#: qml/Wizard/Pages/20-keyboard.qml:31
678595msgid "Select Keyboard"
679−msgstr "ቋንቋ ይምረጡ"
596+msgstr "የ ፊደል ገበታ ይምረጡ"
680597
681598#: qml/Wizard/Pages/20-keyboard.qml:71
682599msgid "Keyboard language"
@@ -686,64 +603,33 @@ msgstr "የ ፊደል ገበታ ቋንቋ"
686603msgid "Keyboard layout"
687604msgstr "የ ፊደል ገበታ አቀራረብ"
688605
689−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
690−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
606+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:214
607+#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/79-system-update.qml:144
608+#: qml/Wizard/Pages/sim.qml:101
691609msgid "Skip"
692610msgstr "መዝለያ"
693611
694−#: qml/Wizard/Pages/30-wifi.qml:30
612+#: qml/Wizard/Pages/30-wifi.qml:31
695613msgid "Connect to Wi‑Fi"
696614msgstr "ወደ ዋይ‑ፋይ መገናኛ"
697615
698−#: qml/Wizard/Pages/30-wifi.qml:131
616+#: qml/Wizard/Pages/30-wifi.qml:139
699617msgid "Connected"
700618msgstr "ተገናኝቷል"
701619
702−#: qml/Wizard/Pages/30-wifi.qml:164
620+#: qml/Wizard/Pages/30-wifi.qml:172
703621msgid "Available Wi-Fi networks"
704622msgstr "ዝግጁ የ ዋይ-ፋይ ኔትዎርኮች"
705623
706−#: qml/Wizard/Pages/30-wifi.qml:165
624+#: qml/Wizard/Pages/30-wifi.qml:173
707625msgid "No available Wi-Fi networks"
708626msgstr "ምንም ዝግጁ ዋይ-ፋይ ኔትዎርኮች አልተገኙም"
709627
710−#: qml/Wizard/Pages/40-location.qml:27
711−msgid "Location Services"
712−msgstr "የ አካባቢ ግልጋሎት"
713−
714−#: qml/Wizard/Pages/40-location.qml:83
715−msgid ""
716−"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
717−"(recommended)"
718−msgstr "ይጠቀሙ ጂፒኤስ: ዋይ-ፋይ: hotspots እና ተንቀሳቃሽ ኔትዎርክ ሳይታወቁ አካባቢ ለማግኘት (ይመከራሉ)"
719−
720−#: qml/Wizard/Pages/40-location.qml:105
721−#, qt-format
722−msgid "By selecting this option you agree to the Nokia HERE %1."
723−msgstr "ይህን ምርጫ በ መምረጥ እርስዎ ተስማምተዋል ከ Nokia HERE %1."
724−
725−#: qml/Wizard/Pages/40-location.qml:106
726−msgctxt "part of: Nokia HERE terms and conditions"
727−msgid "terms and conditions"
728−msgstr "ስምምነት እና ሁኔታዎች"
729−
730−#: qml/Wizard/Pages/40-location.qml:160
731−msgid "GPS only"
732−msgstr "ጂፒኤስ ብቻ"
733−
734−#: qml/Wizard/Pages/40-location.qml:214
735−msgid "Don't use my location"
736−msgstr "የ እኔን አካባቢ አትጠቀም"
737−
738−#: qml/Wizard/Pages/40-location.qml:260
739−msgid "You can change it later in System Settings."
740−msgstr "እርስዎ በኋላ በ ስርአት ማሰናጃ ውስጥ መቀየር ይችላሉ"
741−
742628#: qml/Wizard/Pages/50-timezone.qml:30
743629msgid "Time Zone"
744630msgstr "የ ሰአት ክልል"
745631
746−#: qml/Wizard/Pages/50-timezone.qml:182
632+#: qml/Wizard/Pages/50-timezone.qml:183
747633msgid "Enter your city"
748634msgstr "የ እርስዎን ከተማ ያስገቡ"
749635
@@ -751,7 +637,7 @@ msgstr "የ እርስዎን ከተማ ያስገቡ"
751637msgid "Personalize Your Device"
752638msgstr "የ እርስዎን አካል የ ግልዎ ያድርጉ"
753639
754−#: qml/Wizard/Pages/60-account.qml:48
640+#: qml/Wizard/Pages/60-account.qml:54
755641msgid "Preferred Name"
756642msgstr "የመረጡት ስም"
757643
@@ -759,83 +645,75 @@ msgstr "የመረጡት ስም"
759645msgid "Lock Screen"
760646msgstr "መመልከቻውን መቆለፊያ"
761647
762−#: qml/Wizard/Pages/70-passwd-type.qml:102
648+#: qml/Wizard/Pages/70-passwd-type.qml:103
763649msgctxt "Label: Type of security method"
764650msgid "Create new password"
765651msgstr "አዲስ የ መግቢያ ቃል መፍጠሪያ"
766652
767−#: qml/Wizard/Pages/70-passwd-type.qml:104
653+#: qml/Wizard/Pages/70-passwd-type.qml:105
768654msgctxt "Label: Type of security method"
769655msgid "Create passcode (numbers only)"
770656msgstr "አዲስ የ ማለፊያ ኮድ መፍጠሪያ (ቁጥር ብቻ)"
771657
772−#: qml/Wizard/Pages/70-passwd-type.qml:106
658+#: qml/Wizard/Pages/70-passwd-type.qml:107
773659msgctxt "Label: Type of security method"
774660msgid "No lock code"
775661msgstr "ምንም መቆለፊያ ኮድ አልተገኘም"
776662
777−#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
778−msgid "Privacy Policy"
779−msgstr "የ ግላዊነት መመሪያ"
663+#: qml/Wizard/Pages/79-system-update.qml:28
664+msgid "Update Device"
665+msgstr "አካሉን ማሻሻያ"
780666
781−#: qml/Wizard/Pages/75-report-check.qml:26
782−msgid "Help Us Improve"
783−msgstr "እንድንሻሻል ይርዱን"
667+#: qml/Wizard/Pages/79-system-update.qml:55
668+msgid ""
669+"There is a system update available and ready to install. Afterwards, the "
670+"device will automatically restart."
671+msgstr "የ ስርአት ማሻሻያ ዝግጁ ነው ለ መግጠም: ከዚያ በኋላ አካሉ ራሱ በራሱ እንደገና ይጀምራል"
672+
673+#: qml/Wizard/Pages/79-system-update.qml:76
674+#, fuzzy
675+#| msgctxt "string identifying name of the update"
676+#| msgid "Ubuntu system"
677+msgctxt "string identifying name of the update"
678+msgid "Ubuntu Touch system"
679+msgstr "የ ኡቡቱ ስርአት"
680+
681+#: qml/Wizard/Pages/79-system-update.qml:83
682+#, qt-format
683+msgctxt "version of the system update"
684+msgid "Version %1"
685+msgstr "እትም %1"
784686
785−#: qml/Wizard/Pages/75-report-check.qml:59
786−msgid "Improve system performance by sending us crashes and error reports."
787−msgstr "የ ስርአቱን አፈጻጸም ለማሻሻል የ ግጭት እና የ ስህተት መልእክቶች ይላኩልን"
687+#: qml/Wizard/Pages/79-system-update.qml:95
688+msgid "This could take a few minutes..."
689+msgstr "ይህ ትንሽ ደቂቃዎች ይወስዳል..."
788690
789−#: qml/Wizard/Pages/75-report-check.qml:60
790−msgid "Privacy policy"
791−msgstr "የ ግላዊነት መመሪያ"
691+#: qml/Wizard/Pages/79-system-update.qml:109
692+msgid "Install and restart now"
693+msgstr "መግጠሚያ እና እንደገና ማስጀመሪያ"
792694
793−#: qml/Wizard/Pages/80-finished.qml:89
695+#: qml/Wizard/Pages/80-finished.qml:91
696+msgid "Welcome Back"
697+msgstr "እንኳን ደህና መጡ:"
698+
699+#: qml/Wizard/Pages/80-finished.qml:91
794700msgid "Welcome to Ubuntu"
795701msgstr "እንኳን ደህና መጡ ወደ ኡቡንቱ"
796702
797−#: qml/Wizard/Pages/80-finished.qml:104
703+#: qml/Wizard/Pages/80-finished.qml:106
798704msgid "You are ready to use your device now"
799705msgstr "የ እርስዎን አካል ለ መጠቀም አሁን ዝግጁ ነው"
800706
801−#: qml/Wizard/Pages/80-finished.qml:124
707+#: qml/Wizard/Pages/80-finished.qml:126
708+msgid "Continue"
709+msgstr "ይቀጥሉ"
710+
711+#: qml/Wizard/Pages/80-finished.qml:126
802712msgid "Get Started"
803713msgstr "እንጀምር"
804714
805−#: qml/Wizard/Pages/here-terms.qml:25
806−msgid "Terms & Conditions"
807−msgstr "ውሎች & ሁኔታዎች"
808−
809−#: qml/Wizard/Pages/here-terms.qml:69
810−msgid "Your device uses positioning technologies provided by HERE."
811−msgstr "የ እርስዎ አካል ይጠቀማል ያሉበትን አካባቢ ቴክኖሎጂ የቀረበውን በ HERE."
812−
813−#: qml/Wizard/Pages/here-terms.qml:81
814−msgid ""
815−"To provide you with positioning services and to improve their quality, HERE "
816−"collects information about nearby cell towers and Wi-Fi hotspots around your "
817−"current location whenever your position is being found."
818−msgstr ""
819−"እርስዎ ያሉበትን አካባቢ ግልጋሎት ለ መስጠት እና ለማሻሻል: HERE መረጃ ይሰበስባል በቅርብ ያሉ የ ሴል ምሶሶዎች እና "
820−"ዋይ-ፋይ hotspots እርስዎ አሁን ያሉበትን አካባቢ ሲታወቅ"
821−
822−#: qml/Wizard/Pages/here-terms.qml:93
823−msgid ""
824−"The information collected is used to analyze the service and to improve the "
825−"use of service, but not to identify you personally."
826−msgstr "የ ተሰበሰበው መረጃ የሚጠቅመው ግልጋሎት ለማሻሻል ነው: ነገር ግን እርስዎን በ ግል ለ መለየት አይደለም"
827−
828−#: qml/Wizard/Pages/here-terms.qml:106
829−#, qt-format
830−msgid "By continuing, you agree to the HERE platform %1 and %2."
831−msgstr "በ መቀጠል እርስዎ ተስማምተዋል ከ HERE platform %1 እና %2."
832−
833−#: qml/Wizard/Pages/here-terms.qml:107
834−msgid "Service Terms"
835−msgstr "የ ግልጋሎት ስምምነቶች"
836−
837715#: qml/Wizard/Pages/passcode-confirm.qml:43
838−#: qml/Wizard/Pages/passcode-desktop.qml:97
716+#: qml/Wizard/Pages/passcode-desktop.qml:104
839717msgid "Confirm passcode"
840718msgstr "የማለፊያ ኮድ ማረጋገጫ"
841719
@@ -852,24 +730,24 @@ msgstr "እባክዎን እንደገና-ያስገቡ"
852730msgid "Lock Screen Passcode"
853731msgstr "የ መመልከቻው መቆለፊያ የ ማለፊያ ኮድ"
854732
855−#: qml/Wizard/Pages/passcode-desktop.qml:61
733+#: qml/Wizard/Pages/passcode-desktop.qml:68
856734msgid "Enter 4 numbers to setup your passcode"
857735msgstr "ያስገቡ 4 ቁጥሮች የ እርስዎን የ ማለፊያ ኮድ ለማሰናዳት"
858736
859−#: qml/Wizard/Pages/passcode-desktop.qml:77
737+#: qml/Wizard/Pages/passcode-desktop.qml:84
860738#: qml/Wizard/Pages/passcode-set.qml:54
861739msgid "Choose passcode"
862740msgstr "የ ማለፊያ ኮድ ይምረጡ"
863741
864−#: qml/Wizard/Pages/passcode-desktop.qml:127
742+#: qml/Wizard/Pages/passcode-desktop.qml:139
865743msgid "Passcode too short"
866744msgstr "የ ማለፊያ ኮዱ በጣም አጭር ነው"
867745
868−#: qml/Wizard/Pages/passcode-desktop.qml:129
746+#: qml/Wizard/Pages/passcode-desktop.qml:141
869747msgid "Passcodes match"
870748msgstr "የ ማለፊያ ኮዶቹ ተመሳሳይ ናቸው"
871749
872−#: qml/Wizard/Pages/passcode-desktop.qml:131
750+#: qml/Wizard/Pages/passcode-desktop.qml:143
873751msgid "Passcodes do not match"
874752msgstr "የ ማለፊያ ኮዶቹ አይመሳሰሉም"
875753
@@ -881,15 +759,15 @@ msgstr "የ ማለፊያ ኮድ 4 ባህሪዎች መሆን አለበት"
881759msgid "Lock Screen Password"
882760msgstr "የ መመልከቻ መቆለፊያ የ መግቢያ ቃል"
883761
884−#: qml/Wizard/Pages/password-set.qml:62
762+#: qml/Wizard/Pages/password-set.qml:68
885763msgid "Enter at least 8 characters"
886764msgstr "ያስገቡ ቢያንስ 8 ባህሪዎች"
887765
888−#: qml/Wizard/Pages/password-set.qml:74
766+#: qml/Wizard/Pages/password-set.qml:80
889767msgid "Choose password"
890768msgstr "የ መግቢያ ቃል ይምረጡ"
891769
892−#: qml/Wizard/Pages/password-set.qml:104
770+#: qml/Wizard/Pages/password-set.qml:110
893771msgid "Confirm password"
894772msgstr "የ መግቢያ ቃሉን ያረጋግጡ"
895773
@@ -945,6 +823,217 @@ msgstr "ደካማ የ መግቢያ ቃል"
945823msgid "Very weak password"
946824msgstr "በጣም ደካማ የ መግቢያ ቃል"
947825
826+#~ msgid "Unity 8"
827+#~ msgstr "Unity 8"
828+
829+#~ msgid "Scopes"
830+#~ msgstr "ክልል"
831+
832+#~ msgid "Super (Tap)"
833+#~ msgstr "Super (Tap)"
834+
835+#~ msgid "Opens the Scopes home."
836+#~ msgstr "የ ክልል ቤት መክፈቻ"
837+
838+#~ msgctxt "Button: Open the Ubuntu Store"
839+#~ msgid "Store"
840+#~ msgstr "ማስቀመጫ"
841+
842+#~ msgctxt "Button: Start a search in the current dash scope"
843+#~ msgid "Search"
844+#~ msgstr "መፈለጊያ"
845+
846+#~ msgctxt "Button: Show the current dash scope settings"
847+#~ msgid "Settings"
848+#~ msgstr "ማሰናጃዎች"
849+
850+#~ msgid "Remove from Favorites"
851+#~ msgstr "ከምወዳቸው ማስወገጃ"
852+
853+#~ msgid "Add to Favorites"
854+#~ msgstr "ወደምወዳቸው መጨመሪያ"
855+
856+#~ msgid "Refine your results"
857+#~ msgstr "የ እርስዎን ውጤቶች እንደገና ማጣሪያ"
858+
859+#~ msgid "Reset"
860+#~ msgstr "እንደ ነበረ መመለሻ"
861+
862+#~ msgid "Show less"
863+#~ msgstr "ትንሽ ማሳያ"
864+
865+#~ msgid "Show all"
866+#~ msgstr "ሁሉንም ማሳያ"
867+
868+#~ msgctxt "Label: Hint for dash search line edit"
869+#~ msgid "Search"
870+#~ msgstr "መፈለጊያ"
871+
872+#~ msgid "Recent Searches"
873+#~ msgstr "የ ቅርብ ጊዜ ፍለጋዎች"
874+
875+#~ msgid "Clear All"
876+#~ msgstr "ሁሉንም ማጽጃ"
877+
878+#~ msgid "More..."
879+#~ msgstr "ተጨማሪ..."
880+
881+#~ msgid "Less..."
882+#~ msgstr "አነስተኛ..."
883+
884+#~ msgid "Send"
885+#~ msgstr "መላኪያ"
886+
887+#~ msgid "Rate this"
888+#~ msgstr "ለዚህ ደረጃ ይስጡ"
889+
890+#~ msgid "Add a review"
891+#~ msgstr "ግምገማ መጨመሪያ"
892+
893+#~ msgid "Enable location data"
894+#~ msgstr "የአካባቢ ዳታ ማስቻያ"
895+
896+#~ msgid "Manage"
897+#~ msgstr "አስተዳዳሪ"
898+
899+#~ msgid "Home"
900+#~ msgstr "ቤት"
901+
902+#~ msgid "Also installed"
903+#~ msgstr "እንዲሁም የተገጠሙ"
904+
905+#~ msgid "Privacy Policy"
906+#~ msgstr "የ ግላዊነት መመሪያ"
907+
908+#~ msgid "Help Us Improve"
909+#~ msgstr "እንድንሻሻል ይርዱን"
910+
911+#~ msgid "Improve system performance by sending us crashes and error reports."
912+#~ msgstr "የ ስርአቱን አፈጻጸም ለማሻሻል የ ግጭት እና የ ስህተት መልእክቶች ይላኩልን"
913+
914+#~ msgid "Privacy policy"
915+#~ msgstr "የ ግላዊነት መመሪያ"
916+
917+#~ msgid "Update Apps"
918+#~ msgstr "መተግበሪያ ማሻሻያ"
919+
920+#~ msgid "This device is not connected to the internet."
921+#~ msgstr "ይህ አካል ከ ኢንተርኔት ጋር አልተገናኘም:"
922+
923+#~ msgid "Software is up to date"
924+#~ msgstr "ሶፍትዌሩ ዘመናዊ ነው:"
925+
926+#~ msgid "The update server is not responding."
927+#~ msgstr "የ ማሻሻያ ሰርቨር አይመልስም:"
928+
929+#~ msgid "Please wait..."
930+#~ msgstr "እባክዎን ይቆዩ..."
931+
932+#~ msgid "Installation failed"
933+#~ msgstr "መግጠሙ አልተሳካም:"
934+
935+#~ msgid "Checking for updates…"
936+#~ msgstr "ማሻሻያ በ መፈለግ ላይ…"
937+
938+#~ msgid "%1 update available"
939+#~ msgid_plural "%1 updates available"
940+#~ msgstr[0] "%1 ማሻሻያ ዝግጁ ነው:"
941+#~ msgstr[1] "%1 ማሻሻያዎች ዝግጁ ናቸው:"
942+
943+#~ msgid "Update all…"
944+#~ msgstr "ሁሉንም ማሻሻያ…"
945+
946+#~ msgid "Update all"
947+#~ msgstr "ሁሉንም ማሻሻያ"
948+
949+#~ msgid "Update"
950+#~ msgstr "ማሻሻያ"
951+
952+#~ msgid "Download"
953+#~ msgstr "የ ወረደ"
954+
955+#~ msgid "Resume"
956+#~ msgstr "ይቀጥሉ"
957+
958+#~ msgid "Install…"
959+#~ msgstr "መግጠሚያ…"
960+
961+#~ msgid "Install"
962+#~ msgstr "መግጠሚያ"
963+
964+#~ msgid "Open"
965+#~ msgstr "መክፈቻ"
966+
967+#~ msgid "Installing"
968+#~ msgstr "በ መግጠም ላይ"
969+
970+#~ msgid "Waiting to download"
971+#~ msgstr "ለ ማውረድ በ መጠበቅ ላይ"
972+
973+#~ msgid "%1 of %2"
974+#~ msgstr "%1 ከ %2"
975+
976+#~ msgid "Downloaded"
977+#~ msgstr "የ ወረደ"
978+
979+#~ msgid "Installed"
980+#~ msgstr "ተገጥሟል:"
981+
982+#~ msgid "Updated %1"
983+#~ msgstr "ተሻሽሏል %1"
984+
985+#~ msgid "Update failed"
986+#~ msgstr "ማሻሻል አልተቻለም:"
987+
988+#~ msgid "Location Services"
989+#~ msgstr "የ አካባቢ ግልጋሎት"
990+
991+#~ msgid ""
992+#~ "Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
993+#~ "(recommended)"
994+#~ msgstr "ይጠቀሙ ጂፒኤስ: ዋይ-ፋይ: hotspots እና ተንቀሳቃሽ ኔትዎርክ ሳይታወቁ አካባቢ ለማግኘት (ይመከራሉ)"
995+
996+#~ msgid "By selecting this option you agree to the Nokia HERE %1."
997+#~ msgstr "ይህን ምርጫ በ መምረጥ እርስዎ ተስማምተዋል ከ Nokia HERE %1."
998+
999+#~ msgctxt "part of: Nokia HERE terms and conditions"
1000+#~ msgid "terms and conditions"
1001+#~ msgstr "ስምምነት እና ሁኔታዎች"
1002+
1003+#~ msgid "GPS only"
1004+#~ msgstr "ጂፒኤስ ብቻ"
1005+
1006+#~ msgid "Don't use my location"
1007+#~ msgstr "የ እኔን አካባቢ አትጠቀም"
1008+
1009+#~ msgid "You can change it later in System Settings."
1010+#~ msgstr "እርስዎ በኋላ በ ስርአት ማሰናጃ ውስጥ መቀየር ይችላሉ"
1011+
1012+#~ msgid "Terms & Conditions"
1013+#~ msgstr "ውሎች & ሁኔታዎች"
1014+
1015+#~ msgid "Your device uses positioning technologies provided by HERE."
1016+#~ msgstr "የ እርስዎ አካል ይጠቀማል ያሉበትን አካባቢ ቴክኖሎጂ የቀረበውን በ HERE."
1017+
1018+#~ msgid ""
1019+#~ "To provide you with positioning services and to improve their quality, "
1020+#~ "HERE collects information about nearby cell towers and Wi-Fi hotspots "
1021+#~ "around your current location whenever your position is being found."
1022+#~ msgstr ""
1023+#~ "እርስዎ ያሉበትን አካባቢ ግልጋሎት ለ መስጠት እና ለማሻሻል: HERE መረጃ ይሰበስባል በቅርብ ያሉ የ ሴል ምሶሶዎች "
1024+#~ "እና ዋይ-ፋይ hotspots እርስዎ አሁን ያሉበትን አካባቢ ሲታወቅ"
1025+
1026+#~ msgid ""
1027+#~ "The information collected is used to analyze the service and to improve "
1028+#~ "the use of service, but not to identify you personally."
1029+#~ msgstr "የ ተሰበሰበው መረጃ የሚጠቅመው ግልጋሎት ለማሻሻል ነው: ነገር ግን እርስዎን በ ግል ለ መለየት አይደለም"
1030+
1031+#~ msgid "By continuing, you agree to the HERE platform %1 and %2."
1032+#~ msgstr "በ መቀጠል እርስዎ ተስማምተዋል ከ HERE platform %1 እና %2."
1033+
1034+#~ msgid "Service Terms"
1035+#~ msgstr "የ ግልጋሎት ስምምነቶች"
1036+
9481037#~ msgid "Top edge"
9491038#~ msgstr "የላይ ጠርዝ"
9501039
@@ -960,21 +1049,12 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
9601049#~ msgid "Type or say a command"
9611050#~ msgstr "ትእዛዝ ይናገሩ ወይንም ይጻፉ"
9621051
963−#~ msgid "Loading. Please Wait..."
964−#~ msgstr "እባክዎን ይቆዩ በመጫን ላይ..."
965−
966−#~ msgid "Speaking..."
967−#~ msgstr "በመናገር ላይ..."
968−
9691052#~ msgid "Speak Now..."
9701053#~ msgstr "አሁን ይናገሩ..."
9711054
9721055#~ msgid "Confirm"
9731056#~ msgstr "ማረጋገጫ"
9741057
975−#~ msgid "Search"
976−#~ msgstr "መፈለጊያ"
977−
9781058#~ msgid "See less"
9791059#~ msgstr "አነስተኛ መመልከቻ"
9801060
@@ -1017,7 +1097,6 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
10171097#~ msgid "This will be your last attempt."
10181098#~ msgstr "ይህ የመጨረሻ ሙከራዎ ነው"
10191099
1020−#, qt-format
10211100#~ msgid "Sorry, incorrect %1"
10221101#~ msgstr "አዝናለሁ: የተሳሳተ%1"
10231102
@@ -1058,11 +1137,12 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
10581137#~ "You have now mastered the edge gestures and can start using the "
10591138#~ "phone<br><br>Tap on the screen to start"
10601139#~ msgstr ""
1061−#~ "አሁን የ ጠርዝ እንቅስቃሴን አውቀዋል እና መጀመር ይችላሉ ስልኩን መጠቀም <br><br>መመልከቻውን መታ ያድርጉ ለመጀመር"
1140+#~ "አሁን የ ጠርዝ እንቅስቃሴን አውቀዋል እና መጀመር ይችላሉ ስልኩን መጠቀም <br><br>መመልከቻውን መታ ያድርጉ "
1141+#~ "ለመጀመር"
10621142
10631143#~ msgid ""
1064−#~ "If passcode is entered incorrectly, your phone will conduct a factory reset "
1065−#~ "and all personal data will be deleted."
1144+#~ "If passcode is entered incorrectly, your phone will conduct a factory "
1145+#~ "reset and all personal data will be deleted."
10661146#~ msgstr ""
10671147#~ "የተሳሳተ የማለፊያ ኮድ ካስገቡ የ እርስዎ ስልክ ወደ ነበረበት ወደ ፋክቶሪው ዘዴ ይመለሳል: እና የ ግል ዳታ በሙሉ "
10681148#~ "ይጠፋል"
@@ -1071,8 +1151,8 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
10711151#~ "If passphrase is entered incorrectly, your phone will conduct a factory "
10721152#~ "reset and all personal data will be deleted."
10731153#~ msgstr ""
1074−#~ "የተሳሳተ የማለፊያ ሐረግ ካስገቡ የ እርስዎ ስልክ ወደ ነበረበት ወደ ፋክቶሪው ዘዴ ይመለሳል: እና የ ግል ዳታ በሙሉ "
1075−#~ "ይጠፋል"
1154+#~ "የተሳሳተ የማለፊያ ሐረግ ካስገቡ የ እርስዎ ስልክ ወደ ነበረበት ወደ ፋክቶሪው ዘዴ ይመለሳል: እና የ ግል ዳታ "
1155+#~ "በሙሉ ይጠፋል"
10761156
10771157#~ msgid "Roaming"
10781158#~ msgstr "ማዘዋወሪያ"
@@ -1080,19 +1160,12 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
10801160#~ msgid "Manage Scopes"
10811161#~ msgstr "የ ክልል አስተዳዳሪ"
10821162
1083−#, qt-format
10841163#~ msgid "Enter %1"
10851164#~ msgstr "ማስገቢያ %1"
10861165
10871166#~ msgid "Please re-enter"
10881167#~ msgstr "እባክዎን እንደገና-ያስገቡ"
10891168
1090−#~ msgid "Enter passphrase"
1091−#~ msgstr "የ ማለፊያ ሀረግ ያስገቡ"
1092−
1093−#~ msgid "Enter passcode"
1094−#~ msgstr "የ ማለፊያ ኮድ ያስገቡ"
1095−
10961169#~ msgid "Lock security"
10971170#~ msgstr "ደህንነት መቆለፊያ"
10981171
@@ -1115,7 +1188,8 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
11151188#~ "This can be disabled in <b>System Settings</b> under <b>Security &amp; "
11161189#~ "Privacy</b>"
11171190#~ msgstr ""
1118−#~ "ይህን ግልጋሎት ማሰናከል ይችላሉ ከ <b>ስርአት ማሰናጃዎች</b> under <b>Security &amp; Privacy</b>"
1191+#~ "ይህን ግልጋሎት ማሰናከል ይችላሉ ከ <b>ስርአት ማሰናጃዎች</b> under <b>Security &amp; "
1192+#~ "Privacy</b>"
11191193
11201194#~ msgid "Nice work!"
11211195#~ msgstr "ጥሩ ሰርተዋል!"
@@ -1150,9 +1224,6 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
11501224#~ msgid "Let’s get started."
11511225#~ msgstr "ስራ እንጀምር"
11521226
1153−#~ msgid "Continue"
1154−#~ msgstr "ይቀጥሉ"
1155−
11561227#~ msgid "Passphrase must be 4 characters long"
11571228#~ msgstr "የ ማለፊያ ሀረግ ቢያንስ 4 ባህሪዎች መሆን አለበት"
11581229
@@ -1162,11 +1233,9 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
11621233#~ msgid "Let the phone detect your location:"
11631234#~ msgstr "እባክዎን እርስዎ ያሉበትን አካባቢ ስልኩ እራሱ ይፈልግ:"
11641235
1165−#, qt-format
11661236#~ msgid "〈 %1"
11671237#~ msgstr "〈 %1"
11681238
1169−#, qt-format
11701239#~ msgid "%1 〉"
11711240#~ msgstr "%1 〉"
11721241
@@ -1183,12 +1252,12 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
11831252#~ "Your phone is set up to automatically report errors to Canonical and its "
11841253#~ "partners, the makers of the operating system."
11851254#~ msgstr ""
1186−#~ "የ እርስዎ ስልክ ራሱ በራሱ የ ስህተት መግለጫዎች ወደ Canonical and its partners, የ መስሪያ ስርአት "
1187−#~ "አምራቾች"
1255+#~ "የ እርስዎ ስልክ ራሱ በራሱ የ ስህተት መግለጫዎች ወደ Canonical and its partners, የ መስሪያ "
1256+#~ "ስርአት አምራቾች"
11881257
11891258#~ msgid ""
1190−#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
1191−#~ "conditions</a>."
1259+#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms "
1260+#~ "and conditions</a>."
11921261#~ msgstr "ይህን ምርጫ በመምረጥ ተስማምቻለሁ ከ Nokia HERE <a href='#'>ውሎች እና ሁኔታዎች ጋር</a>."
11931262
11941263#~ msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
@@ -1203,9 +1272,6 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
12031272#~ msgid "Short swipe from the left edge."
12041273#~ msgstr "ከ ግራ ጠርዝ በኩል በትንሹ ይጥረጉ"
12051274
1206−#~ msgid "Open the launcher"
1207−#~ msgstr "ማስጀመሪያውን መክፈቻ"
1208−
12091275#~ msgid "Tap here to continue."
12101276#~ msgstr "እዚህ መታ ይድርጉ ለመቀጠል"
12111277
@@ -1333,40 +1399,8 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
13331399#~ msgid "Short or long swipe from the right edge to view your open apps"
13341400#~ msgstr "በ አጭሩ ወይንም በ ረጅሙ ይጥረጉ ከ ቀኝ ጠረዝ በኩል የ ተከፈቱ መተግበሪያዎችን ለማየት"
13351401
1336−#~ msgid "Long swipe from the left edge to open the Today scope"
1337−#~ msgstr "በ ረጅሙ ከ ግራ ጠርዝ በኩል ይጥረጉ የ ዛሬን ክልል ለ መክፈት"
1338−
13391402#~ msgid "Swipe from the left edge to open the launcher"
13401403#~ msgstr "ከ ግራ ጠርዝ በኩል ይጥረጉ ማስጀመሪያውን ለ መክፈት"
13411404
13421405#~ msgid "Hover your mouse on the right edge to view your open apps"
13431406#~ msgstr "የ እርስዎን አይጥ ወደ ቀኝ ጠርዝ በኩል ሲያደርጉ የ ተከፈቱ መተግበሪያዎች መመልከቻ"
1344−
1345−#~ msgid "Takes a screenshot of a window."
1346−#~ msgstr "የ መስኮት መመልከቻ ፎቶ ማንሻ"
1347−
1348−#~ msgid "Super + 0 to 9"
1349−#~ msgstr "Super + 0 እስከ 9"
1350−
1351−#~ msgid "Install and restart now"
1352−#~ msgstr "መግጠሚያ እና እንደገና ማስጀመሪያ"
1353−
1354−#~ msgid "This could take a few minutes..."
1355−#~ msgstr "ይህ ትንሽ ደቂቆች ይወስዳል"
1356−
1357−#, qt-format
1358−#~ msgctxt "version of the system update"
1359−#~ msgid "Version %1"
1360−#~ msgstr "እትም %1"
1361−
1362−#~ msgctxt "string identifying name of the update"
1363−#~ msgid "Ubuntu system"
1364−#~ msgstr "የ ኡቡቱ ስርአት"
1365−
1366−#~ msgid "Update Device"
1367−#~ msgstr "አካሉን ማሻሻያ"
1368−
1369−#~ msgid ""
1370−#~ "There is a system update available and ready to install. Afterwards, the "
1371−#~ "device will automatically restart."
1372−#~ msgstr "የ ስርአት ማሻሻያ ዝግጁ ነው ለ መግጠም: ከዚያ በኋላ አካሉ ራሱ በራሱ እንደገና ይጀምራል"
po/ar.po+405−431
@@ -6,72 +6,74 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2017-04-04 22:56+0000\n"
11−"PO-Revision-Date: 2017-01-14 05:20+0000\n"
12−"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
13−"Language-Team: Arabic <ar@li.org>\n"
9+"Report-Msgid-Bugs-To: \n"
10+"POT-Creation-Date: 2021-01-29 11:42-0600\n"
11+"PO-Revision-Date: 2021-10-12 07:49+0000\n"
12+"Last-Translator: HEROBRINE7GAMER <tapermeerkat77@gmail.com>\n"
13+"Language-Team: Arabic <https://translate.ubports.com/projects/ubports/lomiri/"
14+"ar/>\n"
15+"Language: ar\n"
1416"MIME-Version: 1.0\n"
1517"Content-Type: text/plain; charset=UTF-8\n"
1618"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
18−"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
19−"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
20−"X-Generator: Launchpad (build 18343)\n"
19+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
20+"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
21+"X-Generator: Weblate 3.11.3\n"
22+"X-Launchpad-Export-Date: 2016-11-23 06:34+0000\n"
2123
22−#: plugins/LightDM/Greeter.cpp:188
24+#: plugins/LightDM/Greeter.cpp:199
2325msgid "Password: "
2426msgstr "كلمة السر: "
2527
26−#: plugins/LightDM/Greeter.cpp:203
28+#: plugins/LightDM/Greeter.cpp:214
2729msgid "Username"
28−msgstr ""
30+msgstr "اسم المستخدم"
2931
30−#: plugins/LightDM/Greeter.cpp:242
32+#: plugins/LightDM/Greeter.cpp:258
3133msgid "Failed to authenticate"
32−msgstr ""
34+msgstr "فشل التحقق"
3335
34−#: plugins/LightDM/Greeter.cpp:244
36+#: plugins/LightDM/Greeter.cpp:260
3537msgid "Invalid password, please try again"
36−msgstr ""
38+msgstr "كلمة المرور غير صحيحة، الرجاء المحاولة مرة أخرى"
3739
38−#: plugins/LightDM/Greeter.cpp:254
40+#: plugins/LightDM/Greeter.cpp:270
3941msgid "Log In"
40−msgstr ""
42+msgstr "سجل الدخول"
4143
42−#: plugins/LightDM/Greeter.cpp:254
44+#: plugins/LightDM/Greeter.cpp:270
4345msgid "Retry"
44−msgstr "إعادة المحاولة"
46+msgstr "حاول مجدداً"
4547
4648#: plugins/LightDM/UsersModel.cpp:157
4749msgid "Login"
48−msgstr ""
50+msgstr "سجل الدخول"
4951
5052#: plugins/LightDM/UsersModel.cpp:165
5153msgid "Guest Session"
52−msgstr ""
54+msgstr "جلسة ضيف"
5355
54−#: plugins/Unity/Launcher/launcheritem.cpp:49
55−#: plugins/Unity/Launcher/launcheritem.cpp:123
56+#: plugins/Unity/Launcher/launcheritem.cpp:48
57+#: plugins/Unity/Launcher/launcheritem.cpp:122
5658msgid "Pin shortcut"
57−msgstr "تثبيت الاختصار"
59+msgstr "ثبت اختصارًا"
5860
59−#: plugins/Unity/Launcher/launcheritem.cpp:55
61+#: plugins/Unity/Launcher/launcheritem.cpp:54
6062msgid "Quit"
6163msgstr "خروج"
6264
63−#: plugins/Unity/Launcher/launcheritem.cpp:123
65+#: plugins/Unity/Launcher/launcheritem.cpp:122
6466msgid "Unpin shortcut"
65−msgstr "إزالة تثبيت الاختصار"
67+msgstr "ألغ تثبيت الاختصار"
6668
6769#: qml/Components/Dialogs.qml:176
6870msgctxt "Title: Lock/Log out dialog"
6971msgid "Log out"
70−msgstr "خروج"
72+msgstr "اخرج"
7173
7274#: qml/Components/Dialogs.qml:177
7375msgid "Are you sure you want to log out?"
74−msgstr "هل أنت متأكد من رغبتك في تسجيل الخروج؟"
76+msgstr "أمتأكد أنك تريد تسجيل الخروج ؟"
7577
7678#: qml/Components/Dialogs.qml:180
7779msgctxt "Button: Lock the system"
@@ -81,23 +83,22 @@ msgstr "أوصِد"
8183#: qml/Components/Dialogs.qml:191
8284msgctxt "Button: Log out from the system"
8385msgid "Log Out"
84−msgstr "خروج"
86+msgstr "اخرج"
8587
86−#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
87−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
88−#: qml/Wizard/Pages/passcode-confirm.qml:32
88+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:284
89+#: qml/Greeter/NarrowView.qml:215 qml/Wizard/Pages/passcode-confirm.qml:32
8990#: qml/Wizard/Pages/passcode-set.qml:32
9091msgid "Cancel"
91−msgstr "إلغاء"
92+msgstr "ألغ"
9293
9394#: qml/Components/Dialogs.qml:211
9495msgctxt "Title: Reboot dialog"
9596msgid "Reboot"
96−msgstr "إعادة التشغيل"
97+msgstr "أعد التشغيل"
9798
9899#: qml/Components/Dialogs.qml:212
99100msgid "Are you sure you want to reboot?"
100−msgstr "هل أنت متأكد من رغبتك في إعادة تشغيل الجهاز؟"
101+msgstr "أمتأكد أنك تريد إعادة التشغيل؟"
101102
102103#: qml/Components/Dialogs.qml:215
103104msgid "No"
@@ -107,12 +108,12 @@ msgstr "لا"
107108msgid "Yes"
108109msgstr "نعم"
109110
110−#: qml/Components/Dialogs.qml:239
111+#: qml/Components/Dialogs.qml:243
111112msgctxt "Title: Power off/Restart dialog"
112113msgid "Power"
113114msgstr "الطاقة"
114115
115−#: qml/Components/Dialogs.qml:240
116+#: qml/Components/Dialogs.qml:244
116117msgid ""
117118"Are you sure you would like\n"
118119"to power off?"
@@ -120,23 +121,27 @@ msgstr ""
120121"هل أنت متأكد من رغبتك\n"
121122"في إيقاف التشغيل؟"
122123
123−#: qml/Components/Dialogs.qml:244
124+#: qml/Components/Dialogs.qml:248
124125msgctxt "Button: Power off the system"
125126msgid "Power off"
126−msgstr "إيقاف التشغيل"
127+msgstr "أوقف التشغيل"
127128
128−#: qml/Components/Dialogs.qml:255
129+#: qml/Components/Dialogs.qml:263
129130msgctxt "Button: Restart the system"
130131msgid "Restart"
131−msgstr "إعادة التشغيل"
132+msgstr "أعد التشغيل"
133+
134+#: qml/Components/Dialogs.qml:276
135+msgid "Screenshot"
136+msgstr "لقطة شاشة"
132137
133138#: qml/Components/KeyboardShortcutsOverlay.qml:41
134139msgid "Keyboard Shortcuts"
135140msgstr "اختصارات لوحة المفاتيح"
136141
137142#: qml/Components/KeyboardShortcutsOverlay.qml:55
138−msgid "Unity 8"
139−msgstr "يونتي 8"
143+msgid "Lomiri"
144+msgstr "لوميري"
140145
141146#: qml/Components/KeyboardShortcutsOverlay.qml:62
142147msgid "PrtScr"
@@ -144,7 +149,7 @@ msgstr "PrtScr"
144149
145150#: qml/Components/KeyboardShortcutsOverlay.qml:67
146151msgid "Takes a screenshot."
147−msgstr "أخذ لقطة للشاشة"
152+msgstr "خُذ لقطة للشاشة."
148153
149154#: qml/Components/KeyboardShortcutsOverlay.qml:75
150155msgid "Alt + PrtScr"
@@ -152,7 +157,7 @@ msgstr "Alt + PrtScr"
152157
153158#: qml/Components/KeyboardShortcutsOverlay.qml:80
154159msgid "Takes a screenshot of the current window."
155−msgstr ""
160+msgstr "خُذ لقطة شاشة للنافذة الحالية."
156161
157162#: qml/Components/KeyboardShortcutsOverlay.qml:88
158163msgid "Super + Space"
@@ -160,7 +165,7 @@ msgstr "Super + Space"
160165
161166#: qml/Components/KeyboardShortcutsOverlay.qml:93
162167msgid "Switches to next keyboard layout."
163−msgstr "للتحويل إلى مخطط لوحة المفاتيح التالي."
168+msgstr "بدل إلى تخطيط لوحة المفاتيح التالي."
164169
165170#: qml/Components/KeyboardShortcutsOverlay.qml:101
166171msgid "Super + Shift + Space"
@@ -168,27 +173,27 @@ msgstr "Super + Shift + Space"
168173
169174#: qml/Components/KeyboardShortcutsOverlay.qml:106
170175msgid "Switches to previous keyboard layout."
171−msgstr "للتحويل إلى مخطط لوحة المفاتيح السابق."
176+msgstr "بدل إلى تخطيط لوحة المفاتيح السابق."
172177
173178#: qml/Components/KeyboardShortcutsOverlay.qml:114
174179msgid "Ctrl + Alt + T"
175−msgstr ""
180+msgstr "Ctrl + Alt + T"
176181
177182#: qml/Components/KeyboardShortcutsOverlay.qml:119
178183msgid "Starts the Terminal application."
179−msgstr ""
184+msgstr "شغِل الطرفية."
180185
181186#: qml/Components/KeyboardShortcutsOverlay.qml:131
182187msgid "Launcher"
183−msgstr "شريط بدء التطبيقات"
188+msgstr "مطلق"
184189
185190#: qml/Components/KeyboardShortcutsOverlay.qml:138
186191msgid "Super (Hold)"
187−msgstr "Super (Hold)"
192+msgstr "Super (ضغط مع التعليق)"
188193
189194#: qml/Components/KeyboardShortcutsOverlay.qml:143
190195msgid "Opens the launcher, displays shortcuts."
191−msgstr "لفتح شريط بدء التطبيقات، وإظهار الاختصارات."
196+msgstr "يشغل المطلق، ويعرض الاختصارات."
192197
193198#: qml/Components/KeyboardShortcutsOverlay.qml:151
194199msgid "Alt + F1"
@@ -196,7 +201,7 @@ msgstr "Alt + F1"
196201
197202#: qml/Components/KeyboardShortcutsOverlay.qml:156
198203msgid "Opens launcher keyboard navigation mode."
199−msgstr ""
204+msgstr "فتح وضع التنقل بلوحة المفاتيح المشغلة."
200205
201206#: qml/Components/KeyboardShortcutsOverlay.qml:164
202207msgid "Super + Tab"
@@ -204,15 +209,15 @@ msgstr "Super + Tab"
204209
205210#: qml/Components/KeyboardShortcutsOverlay.qml:169
206211msgid "Switches applications via the launcher."
207−msgstr "للتحويل بين التطبيقات عبر شريط بدء التطبيقات."
212+msgstr "انتقل بين التطبيقات عبر المُطلق."
208213
209214#: qml/Components/KeyboardShortcutsOverlay.qml:177
210215msgid "Super + 1 to 0"
211−msgstr ""
216+msgstr "Super + 1 to 0"
212217
213218#: qml/Components/KeyboardShortcutsOverlay.qml:182
214219msgid "Same as clicking on a launcher icon."
215−msgstr "نفس إجراء الضغط على أيقونة في الشريط."
220+msgstr "نفس تأثير النقر على أيقونة المطلق."
216221
217222#: qml/Components/KeyboardShortcutsOverlay.qml:190
218223msgid "Super + A"
@@ -220,23 +225,11 @@ msgstr "Super + A"
220225
221226#: qml/Components/KeyboardShortcutsOverlay.qml:195
222227msgid "Opens the Application Drawer."
223−msgstr ""
224−
225−#: qml/Components/KeyboardShortcutsOverlay.qml:207
226−msgid "Scopes"
227−msgstr ""
228−
229−#: qml/Components/KeyboardShortcutsOverlay.qml:214
230−msgid "Super (Tap)"
231−msgstr ""
232−
233−#: qml/Components/KeyboardShortcutsOverlay.qml:219
234−msgid "Opens the Scopes home."
235−msgstr ""
228+msgstr "يفتح درج التطبيقات."
236229
237230#: qml/Components/KeyboardShortcutsOverlay.qml:235
238231msgid "Switching"
239−msgstr "التبديل"
232+msgstr "يبدل"
240233
241234#: qml/Components/KeyboardShortcutsOverlay.qml:242
242235msgid "Alt + Tab"
@@ -244,27 +237,27 @@ msgstr "Alt + Tab"
244237
245238#: qml/Components/KeyboardShortcutsOverlay.qml:247
246239msgid "Switches between applications."
247−msgstr "للتبديل بين التطبيقات المفتوحة."
240+msgstr "يبدل بين التطبيقات."
248241
249242#: qml/Components/KeyboardShortcutsOverlay.qml:255
250243msgid "Super + W"
251−msgstr ""
244+msgstr "Super + W"
252245
253246#: qml/Components/KeyboardShortcutsOverlay.qml:260
254247msgid "Opens the desktop spread."
255−msgstr ""
248+msgstr "يفتح وضع سطح المكتب."
256249
257250#: qml/Components/KeyboardShortcutsOverlay.qml:268
258251msgid "Cursor Left or Right"
259−msgstr ""
252+msgstr "اتجاه المؤشر لليمين أو اليسار"
260253
261254#: qml/Components/KeyboardShortcutsOverlay.qml:273
262255msgid "Moves the focus."
263−msgstr "لنقل التركيز."
256+msgstr "بدّل التركيز."
264257
265258#: qml/Components/KeyboardShortcutsOverlay.qml:285
266259msgid "Windows"
267−msgstr "النوافذ"
260+msgstr "نوافذ"
268261
269262#: qml/Components/KeyboardShortcutsOverlay.qml:292
270263msgid "Ctrl + Super + D"
@@ -272,7 +265,7 @@ msgstr "Ctrl + Super + D"
272265
273266#: qml/Components/KeyboardShortcutsOverlay.qml:297
274267msgid "Minimizes all windows."
275−msgstr "لتصغير جميع النوافذ."
268+msgstr "يصغر كل النوافذ."
276269
277270#: qml/Components/KeyboardShortcutsOverlay.qml:305
278271msgid "Ctrl + Super + Up"
@@ -280,7 +273,7 @@ msgstr "Ctrl + Super + Up"
280273
281274#: qml/Components/KeyboardShortcutsOverlay.qml:310
282275msgid "Maximizes the current window."
283−msgstr "لتكبير النافذة الحالية."
276+msgstr "يكبر النافذة الحالية."
284277
285278#: qml/Components/KeyboardShortcutsOverlay.qml:318
286279msgid "Ctrl + Super + Down"
@@ -288,27 +281,27 @@ msgstr "Ctrl + Super + Down"
288281
289282#: qml/Components/KeyboardShortcutsOverlay.qml:323
290283msgid "Minimizes or restores the current window."
291−msgstr "لتصغير او استعادة النافذة الحالية."
284+msgstr "يصغر أو يستعيد النافذة الحالية."
292285
293286#: qml/Components/KeyboardShortcutsOverlay.qml:331
294287msgid "Ctrl + Super + Left or Right"
295−msgstr ""
288+msgstr "Ctrl + Super + Left or Right"
296289
297290#: qml/Components/KeyboardShortcutsOverlay.qml:336
298291msgid "Semi-maximizes the current window."
299−msgstr ""
292+msgstr "كبر النافذة الحالة جزئيا."
300293
301294#: qml/Components/KeyboardShortcutsOverlay.qml:344
302295msgid "Alt + F4"
303−msgstr ""
296+msgstr "Alt + F4"
304297
305298#: qml/Components/KeyboardShortcutsOverlay.qml:349
306299msgid "Closes the current window."
307−msgstr ""
300+msgstr "يغلق النافذة الحالية."
308301
309−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
302+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:235
310303msgid "Return to Call"
311−msgstr "العودة إلى المكالمة"
304+msgstr "عُد للمكالمة"
312305
313306#: qml/Components/Lockscreen.qml:212
314307msgid "Emergency Call"
@@ -321,48 +314,48 @@ msgstr "موافق"
321314#: qml/Components/MediaServices/VideoPlayerControls.qml:44
322315#, qt-format
323316msgid "%1:%2:%3"
324−msgstr ""
317+msgstr "%1:%2:%3"
325318
326319#: qml/Components/MediaServices/VideoPlayerControls.qml:49
327320#, qt-format
328321msgid "%1:%2"
329−msgstr ""
322+msgstr "%1:%2"
330323
331324#: qml/Components/ModeSwitchWarningDialog.qml:33
332325msgid "Apps may have unsaved data:"
333−msgstr ""
326+msgstr "ربما لم تَحفظ بيانات هذه التطبيقات:"
334327
335328#: qml/Components/ModeSwitchWarningDialog.qml:60
336329msgctxt ""
337330"Re-dock means connect the device again to an external screen/mouse/keyboard"
338331msgid "Re-dock, save your work and close these apps to continue."
339−msgstr ""
332+msgstr "أعد الوصل، احفظ عملك على هذه التطبيقات ثم أغلقها للمتابعة."
340333
341334#: qml/Components/ModeSwitchWarningDialog.qml:67
342335msgid "Or force close now (unsaved data will be lost)."
343−msgstr "أو أغلق إجباريا الآن (ستفقد أي بيانات غير محفوظة)."
336+msgstr "أو أغلقها قسريا (ستفقد البيانات غير المحفوظة)."
344337
345338#: qml/Components/ModeSwitchWarningDialog.qml:80
346339msgid "OK, I will reconnect"
347−msgstr ""
340+msgstr "موافق، سؤعيد الاتصال"
348341
349342#: qml/Components/ModeSwitchWarningDialog.qml:81
350343msgid "Reconnect now!"
351−msgstr ""
344+msgstr "أعد الاتصال الآن!"
352345
353346#: qml/Components/ModeSwitchWarningDialog.qml:94
354347msgid "Close all"
355−msgstr ""
348+msgstr "أغلق الكل"
356349
357350#: qml/Components/SharingPicker.qml:54
358351msgid "Preview Share Item"
359−msgstr ""
352+msgstr "معاينة الملف المشارك"
360353
361354#: qml/Components/VirtualTouchPad.qml:317
362355msgid ""
363356"Your device is now connected to an external display. Use this screen as a "
364357"touch pad to interact with the pointer."
365−msgstr ""
358+msgstr "جهازك متصل بجهاز عرض خارجي. استخدم جهازك كلوحة لمس لتحكم بالمؤشر."
366359
367360#: qml/Components/VirtualTouchPad.qml:327
368361msgid "Tap left button to click."
@@ -370,116 +363,19 @@ msgstr "اضغط الزر الأيسر للنقر."
370363
371364#: qml/Components/VirtualTouchPad.qml:339
372365msgid "Tap right button to right click."
373−msgstr "اضغط الزر الأيمن للنقر الأيمن."
366+msgstr "اضغط على الزر الأيمن للنقر."
374367
375368#: qml/Components/VirtualTouchPad.qml:351
376369msgid "Swipe with two fingers to scroll."
377−msgstr ""
370+msgstr "اسحب بإصبعين للتمرير."
378371
379372#: qml/Components/VirtualTouchPad.qml:396
380373msgid "Find more settings in the system settings."
381−msgstr "اعثر على مزيد من الإعدادات في إعدادات النظام."
382−
383−#: qml/Dash/DashPageHeader.qml:361
384−msgctxt "Button: Open the Ubuntu Store"
385−msgid "Store"
386−msgstr "المتجر"
387−
388−#: qml/Dash/DashPageHeader.qml:368
389−msgctxt "Button: Start a search in the current dash scope"
390−msgid "Search"
391−msgstr "بحث"
392−
393−#: qml/Dash/DashPageHeader.qml:378
394−msgctxt "Button: Show the current dash scope settings"
395−msgid "Settings"
396−msgstr "الإعدادات"
397−
398−#: qml/Dash/DashPageHeader.qml:385
399−msgid "Remove from Favorites"
400−msgstr "حذف من المفضلات"
401−
402−#: qml/Dash/DashPageHeader.qml:385
403−msgid "Add to Favorites"
404−msgstr "إضافة إلى المفضلات"
405−
406−#: qml/Dash/FiltersPopover.qml:61
407−msgid "Refine your results"
408−msgstr ""
409−
410−#: qml/Dash/FiltersPopover.qml:70
411−msgid "Reset"
412−msgstr ""
413−
414−#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
415−msgid "Show less"
416−msgstr "عرض أقل"
417−
418−#: qml/Dash/GenericScopeView.qml:547
419−msgid "Show all"
420−msgstr "عرض الكل"
421−
422−#: qml/Dash/GenericScopeView.qml:578
423−msgctxt "Label: Hint for dash search line edit"
424−msgid "Search"
425−msgstr "بحث"
426−
427−#: qml/Dash/PageHeaderExtraPanel.qml:67
428−msgid "Recent Searches"
429−msgstr ""
430−
431−#: qml/Dash/PageHeaderExtraPanel.qml:78
432−msgid "Clear All"
433−msgstr ""
434−
435−#: qml/Dash/Previews/PreviewActionCombo.qml:36
436−msgid "More..."
437−msgstr "المزيد..."
438−
439−#: qml/Dash/Previews/PreviewActionCombo.qml:36
440−msgid "Less..."
441−msgstr "أقل..."
442−
443−#: qml/Dash/Previews/PreviewCommentInput.qml:83
444−#: qml/Dash/Previews/PreviewRatingInput.qml:202
445−msgid "Send"
446−msgstr "أرسل"
447−
448−#: qml/Dash/Previews/PreviewRatingInput.qml:109
449−msgid "Rate this"
450−msgstr "قيّم ذلك"
451−
452−#: qml/Dash/Previews/PreviewRatingInput.qml:184
453−msgid "Add a review"
454−msgstr "أضف تعليق"
455−
456−#: qml/Dash/PullToRefreshScopeStyle.qml:56
457−msgid "Pull to refresh…"
458−msgstr "اسحب للتحديث..."
459−
460−#: qml/Dash/PullToRefreshScopeStyle.qml:61
461−msgid "Release to refresh…"
462−msgstr "حرّر للتحديث..."
463−
464−#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
465−msgid "Enable location data"
466−msgstr "تفعيل بيانات الموقع"
467−
468−#: qml/Dash/ScopesList.qml:146
469−msgid "Manage"
470−msgstr "إدارة"
471−
472−#: qml/Dash/ScopesList.qml:187
473−msgid "Home"
474−msgstr "الرئيسية"
475−
476−#: qml/Dash/ScopesList.qml:188
477−msgid "Also installed"
478−msgstr "أيضا تم تثبيت"
374+msgstr "جد إعدادات إضافية في إعدادات النظام."
479375
480376#: qml/Greeter/CoverPage.qml:127
481377msgid "Unlock"
482−msgstr "فك القفل"
378+msgstr "فك الإيصاد"
483379
484380#: qml/Greeter/DelayedLockscreen.qml:43
485381msgid "Device Locked"
@@ -499,57 +395,56 @@ msgstr ""
499395#, qt-format
500396msgid "Please wait %1 minute and then try again…"
501397msgid_plural "Please wait %1 minutes and then try again…"
502−msgstr[0] "برجاء الانتظار %1 دقيقة ثم المحاولة مجددًا..."
503−msgstr[1] "برجاء الانتظار دقيقة واحدة (%1) ثم المحاولة مجددًا..."
504−msgstr[2] "برجاء الانتظار دقيقتين (%1) ثم المحاولة مجددًا..."
505−msgstr[3] "برجاء الانتظار %1 دقائق ثم المحاولة مجددًا..."
506−msgstr[4] "برجاء الانتظار %1 دقيقة ثم المحاولة مجددًا..."
507−msgstr[5] "برجاء الانتظار %1 دقيقة ثم المحاولة مجددًا..."
398+msgstr[0] "برجاء الانتظار %1 دقيقة ثم المحاولة مجددًا…"
399+msgstr[1] "برجاء الانتظار دقيقة واحدة (%1) ثم المحاولة مجددًا…"
400+msgstr[2] "برجاء الانتظار دقيقتين (%1) ثم المحاولة مجددًا…"
401+msgstr[3] "برجاء الانتظار %1 دقائق ثم المحاولة مجددًا…"
402+msgstr[4] "برجاء الانتظار %1 دقيقة ثم المحاولة مجددًا…"
403+msgstr[5] "برجاء الانتظار %1 دقيقة ثم المحاولة مجددًا…"
508404
509405#: qml/Greeter/Greeter.qml:550
510406msgid "Try again"
511−msgstr ""
407+msgstr "حاول مجددا"
512408
513409#: qml/Greeter/Greeter.qml:551
514410msgid "Enter passphrase to unlock"
515−msgstr ""
411+msgstr "أدخِل العبارة السرية لفك الإيصاد"
516412
517413#: qml/Greeter/Greeter.qml:552
518414msgid "Enter passcode to unlock"
519−msgstr ""
415+msgstr "أدخِل الرمز السرّي لفك الإيصاد"
520416
521−#: qml/Greeter/NarrowView.qml:228
417+#: qml/Greeter/NarrowView.qml:235
522418msgid "Emergency"
523−msgstr ""
419+msgstr "طوارئ"
524420
525421#: qml/Greeter/PromptList.qml:126
526422msgid "Passphrase"
527−msgstr ""
423+msgstr "كلمة السر"
528424
529425#: qml/Greeter/PromptList.qml:126
530426msgid "Passcode"
531−msgstr ""
427+msgstr "الرمز السري"
532428
533429#: qml/Greeter/SessionsList.qml:124
534430msgid "Select desktop environment"
535−msgstr ""
431+msgstr "اختر بيئة سطح المكتب"
536432
537−#: qml/Launcher/Drawer.qml:94
433+#: qml/Launcher/Drawer.qml:250
538434msgid "Search…"
539−msgstr ""
435+msgstr "ابحث…"
540436
541−#: qml/Launcher/Drawer.qml:129
542−msgctxt "Apps sorted alphabetically"
543−msgid "A-Z"
544−msgstr ""
437+#: qml/Launcher/PullToRefreshScopeStyle.qml:56
438+msgid "Pull to refresh…"
439+msgstr "اسحب للتحديث…"
545440
546−#: qml/Launcher/MoreAppsHeader.qml:55
547−msgid "More apps in the store"
548−msgstr ""
441+#: qml/Launcher/PullToRefreshScopeStyle.qml:61
442+msgid "Release to refresh…"
443+msgstr "حرّر للتحديث…"
549444
550445#: qml/Notifications/NotificationMenuItemFactory.qml:124
551446msgid "Show password"
552−msgstr "عرض كلمة السر"
447+msgstr "اعرض كلمة السر"
553448
554449#: qml/Panel/ActiveCallHint.qml:79
555450msgid "Tap to return to call..."
@@ -578,9 +473,9 @@ msgstr[5] "%1 ساعة"
578473#, qt-format
579474msgid "%1 minute"
580475msgid_plural "%1 minutes"
581−msgstr[0] "أقل من دقيقة (%1)"
582−msgstr[1] "دقيقة واحدة (%1)"
583−msgstr[2] "دقيقتان (%1)"
476+msgstr[0] "%1 دقيقة"
477+msgstr[1] "دقيقة واحدة"
478+msgstr[2] "دقيقتان"
584479msgstr[3] "%1 دقائق"
585480msgstr[4] "%1 دقيقة"
586481msgstr[5] "%1 دقيقة"
@@ -608,11 +503,11 @@ msgstr "باق %1"
608503
609504#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
610505msgid "In queue…"
611−msgstr "في الانتظار..."
506+msgstr "في الانتظار…"
612507
613508#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
614509msgid "Downloading"
615−msgstr "التنزيل"
510+msgstr "ينزل"
616511
617512#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
618513msgid "Paused, tap to resume"
@@ -620,7 +515,7 @@ msgstr "مُلبث، انقر للاستئناف"
620515
621516#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
622517msgid "Canceled"
623−msgstr "تم إلغائه"
518+msgstr "أُلغي"
624519
625520#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
626521msgid "Finished"
@@ -628,13 +523,13 @@ msgstr "انتهى"
628523
629524#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
630525msgid "Failed, tap to retry"
631−msgstr "فشل، انقل لإعادة المحاولة"
526+msgstr "فشل، انقر لإعادة المحاولة"
632527
633528#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
634529#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
635530msgctxt "Button: Send a reply message"
636531msgid "Send"
637−msgstr ""
532+msgstr "أرسل"
638533
639534#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
640535msgctxt "Label: Hint in message indicator line edit"
@@ -644,323 +539,431 @@ msgstr "رد"
644539#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
645540msgctxt "Button: Call back on phone"
646541msgid "Call back"
647−msgstr ""
542+msgstr "عاود الاتصال"
648543
649544#: qml/Panel/PanelMenuPage.qml:92
650545msgid "Back"
651−msgstr ""
546+msgstr "للخلف"
652547
653548#: qml/Stage/SideStage.qml:76
654549msgid "Drag using 3 fingers any application from one window to the other"
655−msgstr ""
550+msgstr "اسحب أي تطبيق بثلاث أصابع من نافذة لأخرى"
551+
552+#: qml/Stage/Stage.qml:671
553+msgid "No running apps"
554+msgstr "لا توجد تطبيقات مشغلة"
656555
657556#: qml/Tutorial/TutorialLeftLong.qml:49
658557msgid "Long swipe from the left edge to open the Application Drawer"
659−msgstr ""
558+msgstr "اسحب اصبعك مطولا بدءً من الحافة اليسرى لفتح درج التطبيقات"
660559
661560#: qml/Tutorial/TutorialLeft.qml:47
662561msgid "Short swipe from the left edge to open the launcher"
663−msgstr ""
562+msgstr "اسحب اصبعك سحبا قصيرا بدءً من الحافة اليسرى لفتح المُطلِق"
664563
665−#: qml/Tutorial/TutorialRight.qml:55
564+#: qml/Tutorial/TutorialRight.qml:54
666565msgid "Push your mouse against the right edge to view your open apps"
667−msgstr ""
566+msgstr "حرك المؤشر للحافة اليمنى لعرض التطبيقات المفتوحة"
668567
669−#: qml/Tutorial/TutorialRight.qml:56
568+#: qml/Tutorial/TutorialRight.qml:55
670569msgid "Swipe from the right edge to view your open apps"
671−msgstr ""
570+msgstr "اسحب اصبعك بدءً من الحافة اليمنى لعرض التطبيقات المفتوحة"
672571
673572#: qml/Tutorial/TutorialTop.qml:53
674573msgid "Swipe from the top edge to access notifications and quick settings"
675574msgstr ""
575+"اسحب اصبعك بدءً من الحافة العلوية للوصول الى التنبيهات والإعدادات السريعة"
676576
677−#: qml/Wizard/Page.qml:54
577+#: qml/Wizard/Page.qml:59
678578msgctxt "Button: Go back one page in the Wizard"
679579msgid "Back"
680−msgstr "عودة"
580+msgstr "للخلف"
681581
682−#: qml/Wizard/Pages/10-welcome.qml:28
582+#: qml/Wizard/Pages/10-welcome.qml:29
683583msgid "Language"
684−msgstr ""
685−
686−#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
687−#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
688−#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
689−#: qml/Wizard/Pages/70-passwd-type.qml:145
690−#: qml/Wizard/Pages/75-report-check.qml:84
691−#: qml/Wizard/Pages/passcode-desktop.qml:142
692−#: qml/Wizard/Pages/password-set.qml:142
584+msgstr "اللغة"
585+
586+#: qml/Wizard/Pages/10-welcome.qml:176
587+#: qml/Wizard/Pages/10-welcome-update.qml:126
588+#: qml/Wizard/Pages/11-changelog.qml:74 qml/Wizard/Pages/20-keyboard.qml:152
589+#: qml/Wizard/Pages/30-wifi.qml:214 qml/Wizard/Pages/50-timezone.qml:272
590+#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/70-passwd-type.qml:146
591+#: qml/Wizard/Pages/passcode-desktop.qml:154
592+#: qml/Wizard/Pages/password-set.qml:153
693593msgid "Next"
694−msgstr ""
594+msgstr "التالي"
595+
596+#: qml/Wizard/Pages/10-welcome-update.qml:91
597+msgid "Welcome to "
598+msgstr "مرحبا بك في "
599+
600+#: qml/Wizard/Pages/10-welcome-update.qml:106
601+msgid "We will make sure your device is ready to use "
602+msgstr "سوف نتأكد أن جهازك معد للاستخدام "
603+
604+#: qml/Wizard/Pages/11-changelog.qml:28
605+msgid "What's new"
606+msgstr "ما الجديد"
607+
608+#: qml/Wizard/Pages/11-changelog.qml:74
609+msgid "Loading..."
610+msgstr "يحمل..."
695611
696612#: qml/Wizard/Pages/20-keyboard.qml:31
697613msgid "Select Keyboard"
698−msgstr ""
614+msgstr "اختر لوحة المفاتيح"
699615
700616#: qml/Wizard/Pages/20-keyboard.qml:71
701617msgid "Keyboard language"
702−msgstr ""
618+msgstr "لغة لوحة المفاتيح"
703619
704620#: qml/Wizard/Pages/20-keyboard.qml:93
705621msgid "Keyboard layout"
706−msgstr ""
622+msgstr "تخطيط لوحة المفاتيح"
707623
708−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
709−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
624+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:214
625+#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/79-system-update.qml:144
626+#: qml/Wizard/Pages/sim.qml:101
710627msgid "Skip"
711−msgstr "تخطي"
628+msgstr "تخط"
712629
713−#: qml/Wizard/Pages/30-wifi.qml:30
630+#: qml/Wizard/Pages/30-wifi.qml:31
714631msgid "Connect to Wi‑Fi"
715−msgstr "اتصل بالواي فاي"
632+msgstr "اتصل بالإنترنت"
716633
717−#: qml/Wizard/Pages/30-wifi.qml:131
634+#: qml/Wizard/Pages/30-wifi.qml:139
718635msgid "Connected"
719−msgstr ""
636+msgstr "متصل"
720637
721−#: qml/Wizard/Pages/30-wifi.qml:164
638+#: qml/Wizard/Pages/30-wifi.qml:172
722639msgid "Available Wi-Fi networks"
723−msgstr ""
640+msgstr "شبكات الواي فاي المتاحة"
724641
725−#: qml/Wizard/Pages/30-wifi.qml:165
642+#: qml/Wizard/Pages/30-wifi.qml:173
726643msgid "No available Wi-Fi networks"
727−msgstr ""
728−
729−#: qml/Wizard/Pages/40-location.qml:27
730−msgid "Location Services"
731−msgstr ""
732−
733−#: qml/Wizard/Pages/40-location.qml:83
734−msgid ""
735−"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
736−"(recommended)"
737−msgstr ""
738−
739−#: qml/Wizard/Pages/40-location.qml:105
740−#, qt-format
741−msgid "By selecting this option you agree to the Nokia HERE %1."
742−msgstr ""
743−
744−#: qml/Wizard/Pages/40-location.qml:106
745−msgctxt "part of: Nokia HERE terms and conditions"
746−msgid "terms and conditions"
747−msgstr ""
748−
749−#: qml/Wizard/Pages/40-location.qml:160
750−msgid "GPS only"
751−msgstr ""
752−
753−#: qml/Wizard/Pages/40-location.qml:214
754−msgid "Don't use my location"
755−msgstr ""
756−
757−#: qml/Wizard/Pages/40-location.qml:260
758−msgid "You can change it later in System Settings."
759−msgstr ""
644+msgstr "لا توجد شبكات واي فاي"
760645
761646#: qml/Wizard/Pages/50-timezone.qml:30
762647msgid "Time Zone"
763−msgstr ""
648+msgstr "المنطقة الزمنية"
764649
765−#: qml/Wizard/Pages/50-timezone.qml:182
650+#: qml/Wizard/Pages/50-timezone.qml:183
766651msgid "Enter your city"
767−msgstr ""
652+msgstr "أدخل مدينتك"
768653
769654#: qml/Wizard/Pages/60-account.qml:24
770655msgid "Personalize Your Device"
771−msgstr ""
656+msgstr "خصص جهازك"
772657
773−#: qml/Wizard/Pages/60-account.qml:48
658+#: qml/Wizard/Pages/60-account.qml:54
774659msgid "Preferred Name"
775−msgstr ""
660+msgstr "اسم مستحسن"
776661
777662#: qml/Wizard/Pages/70-passwd-type.qml:40
778663msgid "Lock Screen"
779−msgstr ""
664+msgstr "قفل الشاشة"
780665
781−#: qml/Wizard/Pages/70-passwd-type.qml:102
666+#: qml/Wizard/Pages/70-passwd-type.qml:103
782667msgctxt "Label: Type of security method"
783668msgid "Create new password"
784−msgstr ""
669+msgstr "أنشئ كلمة سر جديدة"
785670
786−#: qml/Wizard/Pages/70-passwd-type.qml:104
671+#: qml/Wizard/Pages/70-passwd-type.qml:105
787672msgctxt "Label: Type of security method"
788673msgid "Create passcode (numbers only)"
789−msgstr ""
674+msgstr "أنشئ رمز مرور (أرقام فقط)"
790675
791−#: qml/Wizard/Pages/70-passwd-type.qml:106
676+#: qml/Wizard/Pages/70-passwd-type.qml:107
792677msgctxt "Label: Type of security method"
793678msgid "No lock code"
794−msgstr ""
795−
796−#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
797−msgid "Privacy Policy"
798−msgstr ""
799−
800−#: qml/Wizard/Pages/75-report-check.qml:26
801−msgid "Help Us Improve"
802−msgstr ""
679+msgstr "لا يوجد رمز إيصاد"
803680
804−#: qml/Wizard/Pages/75-report-check.qml:59
805−msgid "Improve system performance by sending us crashes and error reports."
806−msgstr ""
681+#: qml/Wizard/Pages/79-system-update.qml:28
682+msgid "Update Device"
683+msgstr "حدث الجهاز"
807684
808−#: qml/Wizard/Pages/75-report-check.qml:60
809−msgid "Privacy policy"
810−msgstr ""
685+#: qml/Wizard/Pages/79-system-update.qml:55
686+msgid ""
687+"There is a system update available and ready to install. Afterwards, the "
688+"device will automatically restart."
689+msgstr "يتوفر تحديث للنظام وهو جاهز للتثبيت، سيُعاد تشغيل الجهاز تلقائيا."
811690
812−#: qml/Wizard/Pages/80-finished.qml:89
813−msgid "Welcome to Ubuntu"
814−msgstr ""
691+#: qml/Wizard/Pages/79-system-update.qml:76
692+msgctxt "string identifying name of the update"
693+msgid "Ubuntu Touch system"
694+msgstr "نظام أبونتو تاتش"
815695
816−#: qml/Wizard/Pages/80-finished.qml:104
817−msgid "You are ready to use your device now"
818−msgstr ""
696+#: qml/Wizard/Pages/79-system-update.qml:83
697+#, qt-format
698+msgctxt "version of the system update"
699+msgid "Version %1"
700+msgstr "الإصدار %1"
819701
820−#: qml/Wizard/Pages/80-finished.qml:124
821−msgid "Get Started"
822−msgstr ""
702+#: qml/Wizard/Pages/79-system-update.qml:95
703+msgid "This could take a few minutes..."
704+msgstr "قد يحتاج بضع دقائق..."
823705
824−#: qml/Wizard/Pages/here-terms.qml:25
825−msgid "Terms & Conditions"
826−msgstr "الشروط والأحكام"
706+#: qml/Wizard/Pages/79-system-update.qml:109
707+msgid "Install and restart now"
708+msgstr "ثبت وأعد التشغيل الآن"
827709
828−#: qml/Wizard/Pages/here-terms.qml:69
829−msgid "Your device uses positioning technologies provided by HERE."
830−msgstr ""
710+#: qml/Wizard/Pages/80-finished.qml:91
711+msgid "Welcome Back"
712+msgstr "مرحبا بعودتك"
831713
832−#: qml/Wizard/Pages/here-terms.qml:81
833−msgid ""
834−"To provide you with positioning services and to improve their quality, HERE "
835−"collects information about nearby cell towers and Wi-Fi hotspots around your "
836−"current location whenever your position is being found."
837−msgstr ""
714+#: qml/Wizard/Pages/80-finished.qml:91
715+msgid "Welcome to Ubuntu"
716+msgstr "مرحبا بك في أبونتو"
838717
839−#: qml/Wizard/Pages/here-terms.qml:93
840−msgid ""
841−"The information collected is used to analyze the service and to improve the "
842−"use of service, but not to identify you personally."
843−msgstr ""
718+#: qml/Wizard/Pages/80-finished.qml:106
719+msgid "You are ready to use your device now"
720+msgstr "أنت مستعد لاستخدام جهازك"
844721
845−#: qml/Wizard/Pages/here-terms.qml:106
846−#, qt-format
847−msgid "By continuing, you agree to the HERE platform %1 and %2."
848−msgstr ""
722+#: qml/Wizard/Pages/80-finished.qml:126
723+msgid "Continue"
724+msgstr "تابع"
849725
850−#: qml/Wizard/Pages/here-terms.qml:107
851−msgid "Service Terms"
852−msgstr ""
726+#: qml/Wizard/Pages/80-finished.qml:126
727+msgid "Get Started"
728+msgstr "ابدأ"
853729
854730#: qml/Wizard/Pages/passcode-confirm.qml:43
855−#: qml/Wizard/Pages/passcode-desktop.qml:97
731+#: qml/Wizard/Pages/passcode-desktop.qml:104
856732msgid "Confirm passcode"
857−msgstr "تأكيد الرمز السري"
733+msgstr "تأكيد كلمة السر"
858734
859735#: qml/Wizard/Pages/passcode-confirm.qml:45
860736msgid "Incorrect passcode."
861−msgstr ""
737+msgstr "الرمز السري غير صحيح."
862738
863739#: qml/Wizard/Pages/passcode-confirm.qml:45
864740msgctxt "Enter the passcode again"
865741msgid "Please re-enter."
866−msgstr ""
742+msgstr "رجاء أعد الإدخال."
867743
868744#: qml/Wizard/Pages/passcode-desktop.qml:31
869745msgid "Lock Screen Passcode"
870−msgstr ""
746+msgstr "الرمز السري لقفل الشاشة"
871747
872−#: qml/Wizard/Pages/passcode-desktop.qml:61
748+#: qml/Wizard/Pages/passcode-desktop.qml:68
873749msgid "Enter 4 numbers to setup your passcode"
874−msgstr ""
750+msgstr "أدخل 4 أرقام لإعداد الرمز السري"
875751
876−#: qml/Wizard/Pages/passcode-desktop.qml:77
752+#: qml/Wizard/Pages/passcode-desktop.qml:84
877753#: qml/Wizard/Pages/passcode-set.qml:54
878754msgid "Choose passcode"
879−msgstr ""
755+msgstr "اختر كلمة السر"
880756
881−#: qml/Wizard/Pages/passcode-desktop.qml:127
757+#: qml/Wizard/Pages/passcode-desktop.qml:139
882758msgid "Passcode too short"
883−msgstr ""
759+msgstr "الرمز السري قصير جدا"
884760
885−#: qml/Wizard/Pages/passcode-desktop.qml:129
761+#: qml/Wizard/Pages/passcode-desktop.qml:141
886762msgid "Passcodes match"
887−msgstr ""
763+msgstr "الرمزان السريان متطابقة"
888764
889−#: qml/Wizard/Pages/passcode-desktop.qml:131
765+#: qml/Wizard/Pages/passcode-desktop.qml:143
890766msgid "Passcodes do not match"
891−msgstr ""
767+msgstr "الرمزان السريان لا يتطبقان"
892768
893769#: qml/Wizard/Pages/passcode-set.qml:62
894770msgid "Passcode must be 4 characters long"
895−msgstr ""
771+msgstr "يجب أن يكون الرمز السري 4 محارف"
896772
897773#: qml/Wizard/Pages/password-set.qml:31
898774msgid "Lock Screen Password"
899−msgstr ""
775+msgstr "كلمة سر قفل الشاشة"
900776
901−#: qml/Wizard/Pages/password-set.qml:62
777+#: qml/Wizard/Pages/password-set.qml:68
902778msgid "Enter at least 8 characters"
903−msgstr ""
779+msgstr "أدخل 8 محارف على الأقل"
904780
905−#: qml/Wizard/Pages/password-set.qml:74
781+#: qml/Wizard/Pages/password-set.qml:80
906782msgid "Choose password"
907−msgstr ""
783+msgstr "اختر كلمة السر"
908784
909−#: qml/Wizard/Pages/password-set.qml:104
785+#: qml/Wizard/Pages/password-set.qml:110
910786msgid "Confirm password"
911−msgstr ""
787+msgstr "أكد كلمة السر"
912788
913789#: qml/Wizard/Pages/sim.qml:27
914790msgid "No SIM card installed"
915−msgstr ""
791+msgstr "لم تدخل بطاقة SIM"
916792
917793#: qml/Wizard/Pages/sim.qml:54
918794msgid "SIM card added"
919−msgstr ""
795+msgstr "أُدخلت بطاقة SIM"
920796
921797#: qml/Wizard/Pages/sim.qml:55
922798msgid "You must restart the device to access the mobile network."
923−msgstr ""
799+msgstr "يجب عليك إعادة تشغيل الجهاز لتتمكن من دخول شبكة الجوال."
924800
925801#: qml/Wizard/Pages/sim.qml:59
926802msgid "Restart"
927−msgstr ""
803+msgstr "أعد التشغيل"
928804
929805#: qml/Wizard/Pages/sim.qml:78
930806msgid "You won’t be able to make calls or use text messaging without a SIM."
931−msgstr ""
807+msgstr "لن تتمكن من إجراء المكالمات أو إرسال الرسائل القصيرة بدون بطاقة SIM."
932808
933809#: qml/Wizard/Pages/sim.qml:90
934810msgid "To proceed with no SIM tap Skip."
935−msgstr ""
811+msgstr "للاستمرار بدون بطاقة SIM اضغط تخطى."
936812
937813#: qml/Wizard/PasswordMeter.qml:87
938814msgid "Password too short"
939−msgstr ""
815+msgstr "كلمة السر قصيرة جداً"
940816
941817#: qml/Wizard/PasswordMeter.qml:89
942818msgid "Passwords match"
943−msgstr ""
819+msgstr "كلمتا المرور متطابقتان"
944820
945821#: qml/Wizard/PasswordMeter.qml:91
946822msgid "Passwords do not match"
947−msgstr ""
823+msgstr "كلمتا المرور غير متطابقتين"
948824
949825#: qml/Wizard/PasswordMeter.qml:95
950826msgid "Strong password"
951−msgstr ""
827+msgstr "كلمة سر قوية"
952828
953829#: qml/Wizard/PasswordMeter.qml:97
954830msgid "Fair password"
955−msgstr ""
831+msgstr "كلمة سر متوسطة"
956832
957833#: qml/Wizard/PasswordMeter.qml:99
958834msgid "Weak password"
959−msgstr ""
835+msgstr "كلمة سر ضعيفة"
960836
961837#: qml/Wizard/PasswordMeter.qml:101
962838msgid "Very weak password"
963−msgstr ""
839+msgstr "كلمة السر ضعيفة جداً"
840+
841+#~ msgid "Unity 8"
842+#~ msgstr "يونتي 8"
843+
844+#~ msgid "Super (Tap)"
845+#~ msgstr "Super (نقر)"
846+
847+#~ msgctxt "Button: Open the Ubuntu Store"
848+#~ msgid "Store"
849+#~ msgstr "المتجر"
850+
851+#~ msgctxt "Button: Start a search in the current dash scope"
852+#~ msgid "Search"
853+#~ msgstr "بحث"
854+
855+#~ msgctxt "Button: Show the current dash scope settings"
856+#~ msgid "Settings"
857+#~ msgstr "الإعدادات"
858+
859+#~ msgid "Remove from Favorites"
860+#~ msgstr "حذف من المفضلات"
861+
862+#~ msgid "Add to Favorites"
863+#~ msgstr "إضافة إلى المفضلات"
864+
865+#~ msgctxt "Label: Hint for dash search line edit"
866+#~ msgid "Search"
867+#~ msgstr "بحث"
868+
869+#~ msgid "More..."
870+#~ msgstr "المزيد..."
871+
872+#~ msgid "Less..."
873+#~ msgstr "أقل..."
874+
875+#~ msgid "Send"
876+#~ msgstr "أرسل"
877+
878+#~ msgid "Rate this"
879+#~ msgstr "قيّم ذلك"
880+
881+#~ msgid "Add a review"
882+#~ msgstr "أضف تعليق"
883+
884+#~ msgid "Enable location data"
885+#~ msgstr "تفعيل بيانات الموقع"
886+
887+#~ msgid "Manage"
888+#~ msgstr "إدارة"
889+
890+#~ msgid "Home"
891+#~ msgstr "الرئيسية"
892+
893+#~ msgid "Also installed"
894+#~ msgstr "أيضا تم تثبيت"
895+
896+#~ msgid "Privacy Policy"
897+#~ msgstr "سياسة الخصوصية"
898+
899+#~ msgid "Help Us Improve"
900+#~ msgstr "ساعدنا على التحسن"
901+
902+#~ msgid "Improve system performance by sending us crashes and error reports."
903+#~ msgstr "تحسين أداء النظام عير إرسال تقارير التوقف والأخطاء"
904+
905+#~ msgid "Privacy policy"
906+#~ msgstr "سياسة الخصوصية"
907+
908+#~ msgid "Update Apps"
909+#~ msgstr "تحديث التطبيقات"
910+
911+#~ msgid "This device is not connected to the internet."
912+#~ msgstr "الجهاز غير متصل باﻹنترنت"
913+
914+#, fuzzy
915+#~ msgid "Please wait..."
916+#~ msgstr "يجري التحميل. برجاء الانتظار..."
917+
918+#~ msgid "Update"
919+#~ msgstr "تحديث"
920+
921+#~ msgid "Download"
922+#~ msgstr "تنزيل"
923+
924+#~ msgid "Resume"
925+#~ msgstr "استئناف"
926+
927+#~ msgid "Pause"
928+#~ msgstr "إيقاف"
929+
930+#~ msgid "Install…"
931+#~ msgstr "تثبيت …"
932+
933+#~ msgid "Install"
934+#~ msgstr "تثبيت"
935+
936+#~ msgid "Open"
937+#~ msgstr "فتح"
938+
939+#~ msgid "Installing"
940+#~ msgstr "جاري التثبيت"
941+
942+#~ msgid "Paused"
943+#~ msgstr "تم اﻹيقاف"
944+
945+#~ msgid "Waiting to download"
946+#~ msgstr "انتظار التنزيل"
947+
948+#~ msgid "%1 of %2"
949+#~ msgstr "%1 من 2%"
950+
951+#, fuzzy
952+#~ msgid "Downloaded"
953+#~ msgstr "التنزيل"
954+
955+#, fuzzy
956+#~ msgid "Installed"
957+#~ msgstr "أيضا تم تثبيت"
958+
959+#~ msgid "Updated %1"
960+#~ msgstr "تحديث 1%"
961+
962+#~ msgid "Update failed"
963+#~ msgstr "فشل التحديث"
964+
965+#~ msgid "Terms & Conditions"
966+#~ msgstr "الشروط والأحكام"
964967
965968#~ msgid "Confirm"
966969#~ msgstr "التأكيد"
@@ -968,21 +971,9 @@ msgstr ""
968971#~ msgid "Type or say a command"
969972#~ msgstr "اكتب أو قُل أمرا"
970973
971−#~ msgid "Loading. Please Wait..."
972−#~ msgstr "يجري التحميل. برجاء الانتظار..."
973−
974974#~ msgid "Speak Now..."
975975#~ msgstr "تكلم الآن..."
976976
977−#~ msgid "Speaking..."
978−#~ msgstr "تتكلم الآن..."
979−
980−#~ msgid "Search"
981−#~ msgstr "ابحث"
982−
983−#~ msgid "Try swiping from the top edge to access the indicators"
984−#~ msgstr "اسحب اصبعك من الحافة العلوية للوصول إلى المؤشرات"
985−
986977#~ msgid "Top edge"
987978#~ msgstr "الحافة العلوية"
988979
@@ -1018,8 +1009,8 @@ msgstr ""
10181009#~ "You have now mastered the edge gestures and can start using the "
10191010#~ "phone<br><br>Tap on the screen to start"
10201011#~ msgstr ""
1021−#~ "أنت الآن بارع في إيماءات الحواف ويمكنك البدء باستخدام هاتفك<br><br>انقر على "
1022−#~ "الشاشة للبدء"
1012+#~ "أنت الآن بارع في إيماءات الحواف ويمكنك البدء باستخدام هاتفك<br><br>انقر "
1013+#~ "على الشاشة للبدء"
10231014
10241015#~ msgid "%a %l:%M %p"
10251016#~ msgstr "%a %l:%M %p"
@@ -1072,26 +1063,18 @@ msgstr ""
10721063#~ msgid "Tap to unlock"
10731064#~ msgstr "انقر لفك القفل"
10741065
1075−#, qt-format
10761066#~ msgid "Enter %1"
10771067#~ msgstr "أدخِل %1"
10781068
10791069#~ msgid "Sorry, incorrect passcode."
10801070#~ msgstr "عذرًا، رمز سرّي خاطيء."
10811071
1082−#~ msgid "Enter passphrase"
1083−#~ msgstr "أدخِل العبارة السرية"
1084−
1085−#~ msgid "Enter passcode"
1086−#~ msgstr "أدخِل الرمز السرّي"
1087−
10881072#~ msgid "Sorry, incorrect passphrase."
10891073#~ msgstr "عذرًا، عبارة سرّية خاطئة."
10901074
10911075#~ msgid "This will be your last attempt."
10921076#~ msgstr "هذه ستكون المحاولة الأخيرة لك."
10931077
1094−#, qt-format
10951078#~ msgid "Sorry, incorrect %1"
10961079#~ msgstr "نأسف، %1 غير صحيحية"
10971080
@@ -1162,9 +1145,6 @@ msgstr ""
11621145#~ msgid "Let’s get started."
11631146#~ msgstr "هيا بنا نبدأ."
11641147
1165−#~ msgid "Continue"
1166−#~ msgstr "متابعة"
1167−
11681148#~ msgid "Choose your passcode"
11691149#~ msgstr "اختر الرمز السري خاصتك"
11701150
@@ -1261,15 +1241,15 @@ msgstr ""
12611241#~ msgstr "فتح قفل بطاقة SIM"
12621242
12631243#~ msgid ""
1264−#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
1265−#~ "conditions</a>."
1244+#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms "
1245+#~ "and conditions</a>."
12661246#~ msgstr ""
1267−#~ "باختيارك لهذا الخيار فإنك توافق على <a href='#'>الشروط والأحكام</a> الخاصة "
1268−#~ "بـ Nokia HERE."
1247+#~ "باختيارك لهذا الخيار فإنك توافق على <a href='#'>الشروط والأحكام</a> "
1248+#~ "الخاصة بـ Nokia HERE."
12691249
12701250#~ msgid ""
1271−#~ "If passcode is entered incorrectly, your phone will conduct a factory reset "
1272−#~ "and all personal data will be deleted."
1251+#~ "If passcode is entered incorrectly, your phone will conduct a factory "
1252+#~ "reset and all personal data will be deleted."
12731253#~ msgstr ""
12741254#~ "إذا تم إدخال العبارة السرية بشكل خاطئ، فسوف يتم إعادة الهاتف لحالة ضبط "
12751255#~ "المصنع وسيتم حذف كافة البيانات الشخصية."
@@ -1280,9 +1260,3 @@ msgstr ""
12801260#~ msgstr ""
12811261#~ "إذا تم إدخال العبارة السرية بشكل خاطئ، فسوف يتم إعادة الهاتف لحالة ضبط "
12821262#~ "المصنع وسيتم حذف كافة البيانات الشخصية."
1283−
1284−#~ msgid "Takes a screenshot of a window."
1285−#~ msgstr "أخذ لقطة شاشة للنافذة"
1286−
1287−#~ msgid "Super + 0 to 9"
1288−#~ msgstr "Super + 0 to 9"
po/ast.po+469−453
@@ -6,41 +6,43 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2017-04-04 22:56+0000\n"
11−"PO-Revision-Date: 2016-12-16 02:13+0000\n"
9+"Report-Msgid-Bugs-To: \n"
10+"POT-Creation-Date: 2021-01-29 11:42-0600\n"
11+"PO-Revision-Date: 2019-10-30 03:35+0000\n"
1212"Last-Translator: enolp <enolp@softastur.org>\n"
13−"Language-Team: Asturian <ast@li.org>\n"
13+"Language-Team: Asturian <https://translate.ubports.com/projects/unity8/"
14+"unity8/ast/>\n"
15+"Language: ast\n"
1416"MIME-Version: 1.0\n"
1517"Content-Type: text/plain; charset=UTF-8\n"
1618"Content-Transfer-Encoding: 8bit\n"
1719"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
19−"X-Generator: Launchpad (build 18343)\n"
20+"X-Generator: Weblate 3.8\n"
21+"X-Launchpad-Export-Date: 2016-11-23 06:34+0000\n"
2022
21−#: plugins/LightDM/Greeter.cpp:188
23+#: plugins/LightDM/Greeter.cpp:199
2224msgid "Password: "
2325msgstr "Contraseña: "
2426
25−#: plugins/LightDM/Greeter.cpp:203
27+#: plugins/LightDM/Greeter.cpp:214
2628msgid "Username"
2729msgstr ""
2830
29−#: plugins/LightDM/Greeter.cpp:242
31+#: plugins/LightDM/Greeter.cpp:258
3032msgid "Failed to authenticate"
3133msgstr ""
3234
33−#: plugins/LightDM/Greeter.cpp:244
35+#: plugins/LightDM/Greeter.cpp:260
3436msgid "Invalid password, please try again"
3537msgstr ""
3638
37−#: plugins/LightDM/Greeter.cpp:254
39+#: plugins/LightDM/Greeter.cpp:270
3840msgid "Log In"
39−msgstr "Aniciar sesión"
41+msgstr ""
4042
41−#: plugins/LightDM/Greeter.cpp:254
43+#: plugins/LightDM/Greeter.cpp:270
4244msgid "Retry"
43−msgstr "Reintentar"
45+msgstr ""
4446
4547#: plugins/LightDM/UsersModel.cpp:157
4648msgid "Login"
@@ -50,23 +52,23 @@ msgstr ""
5052msgid "Guest Session"
5153msgstr ""
5254
53−#: plugins/Unity/Launcher/launcheritem.cpp:49
54−#: plugins/Unity/Launcher/launcheritem.cpp:123
55+#: plugins/Unity/Launcher/launcheritem.cpp:48
56+#: plugins/Unity/Launcher/launcheritem.cpp:122
5557msgid "Pin shortcut"
56−msgstr "Anclar atayu"
58+msgstr "Fixar l'atayu"
5759
58−#: plugins/Unity/Launcher/launcheritem.cpp:55
60+#: plugins/Unity/Launcher/launcheritem.cpp:54
5961msgid "Quit"
6062msgstr "Colar"
6163
62−#: plugins/Unity/Launcher/launcheritem.cpp:123
64+#: plugins/Unity/Launcher/launcheritem.cpp:122
6365msgid "Unpin shortcut"
64−msgstr "Desanclar atayu"
66+msgstr "Quitar l'atayu"
6567
6668#: qml/Components/Dialogs.qml:176
6769msgctxt "Title: Lock/Log out dialog"
6870msgid "Log out"
69−msgstr "Zarrar sesión"
71+msgstr "Zarru de la sesión"
7072
7173#: qml/Components/Dialogs.qml:177
7274msgid "Are you sure you want to log out?"
@@ -82,9 +84,8 @@ msgctxt "Button: Log out from the system"
8284msgid "Log Out"
8385msgstr "Zarrar sesión"
8486
85−#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
87−#: qml/Wizard/Pages/passcode-confirm.qml:32
87+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:284
88+#: qml/Greeter/NarrowView.qml:215 qml/Wizard/Pages/passcode-confirm.qml:32
8889#: qml/Wizard/Pages/passcode-set.qml:32
8990msgid "Cancel"
9091msgstr "Encaboxar"
@@ -106,36 +107,42 @@ msgstr "Non"
106107msgid "Yes"
107108msgstr "Sí"
108109
109−#: qml/Components/Dialogs.qml:239
110+#: qml/Components/Dialogs.qml:243
110111msgctxt "Title: Power off/Restart dialog"
111112msgid "Power"
112−msgstr "Apagáu"
113+msgstr "Enerxía"
113114
114−#: qml/Components/Dialogs.qml:240
115+#: qml/Components/Dialogs.qml:244
115116msgid ""
116117"Are you sure you would like\n"
117118"to power off?"
118119msgstr ""
119−"¿De xuru que te prestaría\n"
120+"¿De xuru que quies\n"
120121"apagar?"
121122
122−#: qml/Components/Dialogs.qml:244
123+#: qml/Components/Dialogs.qml:248
123124msgctxt "Button: Power off the system"
124125msgid "Power off"
125126msgstr "Apagar"
126127
127−#: qml/Components/Dialogs.qml:255
128+#: qml/Components/Dialogs.qml:263
128129msgctxt "Button: Restart the system"
129130msgid "Restart"
130131msgstr "Reaniciar"
131132
133+#: qml/Components/Dialogs.qml:276
134+#, fuzzy
135+#| msgid "Takes a screenshot."
136+msgid "Screenshot"
137+msgstr "Fai una captura de pantalla."
138+
132139#: qml/Components/KeyboardShortcutsOverlay.qml:41
133140msgid "Keyboard Shortcuts"
134−msgstr "Atayos de tecláu"
141+msgstr "Atayos del tecláu"
135142
136143#: qml/Components/KeyboardShortcutsOverlay.qml:55
137−msgid "Unity 8"
138−msgstr "Unity 8"
144+msgid "Lomiri"
145+msgstr ""
139146
140147#: qml/Components/KeyboardShortcutsOverlay.qml:62
141148msgid "PrtScr"
@@ -143,35 +150,39 @@ msgstr "ImprPant"
143150
144151#: qml/Components/KeyboardShortcutsOverlay.qml:67
145152msgid "Takes a screenshot."
146−msgstr "Saca una imaxe de la pantalla."
153+msgstr "Fai una captura de pantalla."
147154
148155#: qml/Components/KeyboardShortcutsOverlay.qml:75
149156msgid "Alt + PrtScr"
150157msgstr "Alt + ImprPant"
151158
152159#: qml/Components/KeyboardShortcutsOverlay.qml:80
160+#, fuzzy
161+#| msgid "Takes a screenshot of a window."
153162msgid "Takes a screenshot of the current window."
154−msgstr ""
163+msgstr "Fai una captura d'una ventana."
155164
156165#: qml/Components/KeyboardShortcutsOverlay.qml:88
157166msgid "Super + Space"
158−msgstr "Super + Espaciu"
167+msgstr "Súper + Espaciu"
159168
160169#: qml/Components/KeyboardShortcutsOverlay.qml:93
161170msgid "Switches to next keyboard layout."
162−msgstr "Salta al siguiente diseñu de tecláu."
171+msgstr "Cambia a la distribución siguiente del tecláu."
163172
164173#: qml/Components/KeyboardShortcutsOverlay.qml:101
165174msgid "Super + Shift + Space"
166−msgstr "Super +Mayús + Espaciu"
175+msgstr "Súper + Mayús + Espaciu"
167176
168177#: qml/Components/KeyboardShortcutsOverlay.qml:106
169178msgid "Switches to previous keyboard layout."
170−msgstr "Salta al diseñu de tecláu anterior."
179+msgstr "Cambia a la distribución anterior del tecláu."
171180
172181#: qml/Components/KeyboardShortcutsOverlay.qml:114
182+#, fuzzy
183+#| msgid "Ctrl + Super + D"
173184msgid "Ctrl + Alt + T"
174−msgstr ""
185+msgstr "Ctrl + Súper + D"
175186
176187#: qml/Components/KeyboardShortcutsOverlay.qml:119
177188msgid "Starts the Terminal application."
@@ -183,11 +194,11 @@ msgstr "Llanzador"
183194
184195#: qml/Components/KeyboardShortcutsOverlay.qml:138
185196msgid "Super (Hold)"
186−msgstr "Super (Caltener)"
197+msgstr ""
187198
188199#: qml/Components/KeyboardShortcutsOverlay.qml:143
189200msgid "Opens the launcher, displays shortcuts."
190−msgstr "Abre'l llanzador, amuesa atayos."
201+msgstr "Abre'l llanzador, amuesa los atayos."
191202
192203#: qml/Components/KeyboardShortcutsOverlay.qml:151
193204msgid "Alt + F1"
@@ -195,87 +206,81 @@ msgstr "Alt + F1"
195206
196207#: qml/Components/KeyboardShortcutsOverlay.qml:156
197208msgid "Opens launcher keyboard navigation mode."
198−msgstr "Abre'l mou de navegación con tecláu del llanzador."
209+msgstr ""
199210
200211#: qml/Components/KeyboardShortcutsOverlay.qml:164
201212msgid "Super + Tab"
202−msgstr "Super + Tab"
213+msgstr "Súper + Tabulador"
203214
204215#: qml/Components/KeyboardShortcutsOverlay.qml:169
205216msgid "Switches applications via the launcher."
206−msgstr "Cambia d'aplicaciones col llanzador."
217+msgstr ""
207218
208219#: qml/Components/KeyboardShortcutsOverlay.qml:177
220+#, fuzzy
221+#| msgid "Super + 0 to 9"
209222msgid "Super + 1 to 0"
210−msgstr ""
223+msgstr "Súper + 0 a 9"
211224
212225#: qml/Components/KeyboardShortcutsOverlay.qml:182
213226msgid "Same as clicking on a launcher icon."
214−msgstr "Igual que facer click nel iconu del llanzador."
227+msgstr "Igual que calcar nun iconu del llanzador."
215228
216229#: qml/Components/KeyboardShortcutsOverlay.qml:190
230+#, fuzzy
231+#| msgid "Super + W"
217232msgid "Super + A"
218−msgstr ""
233+msgstr "Súper + W"
219234
220235#: qml/Components/KeyboardShortcutsOverlay.qml:195
236+#, fuzzy
237+#| msgid "Open the launcher"
221238msgid "Opens the Application Drawer."
222−msgstr "Abre'l caxón d'aplicaciones."
223−
224−#: qml/Components/KeyboardShortcutsOverlay.qml:207
225−msgid "Scopes"
226−msgstr "Ámbitos"
227−
228−#: qml/Components/KeyboardShortcutsOverlay.qml:214
229−msgid "Super (Tap)"
230−msgstr "Super (Tocar)"
231−
232−#: qml/Components/KeyboardShortcutsOverlay.qml:219
233−msgid "Opens the Scopes home."
234−msgstr "Abre'l principiu d'Ámbitos"
239+msgstr "Abrir el llanzador"
235240
236241#: qml/Components/KeyboardShortcutsOverlay.qml:235
237242msgid "Switching"
238−msgstr "Conmutación"
243+msgstr "Cambéu"
239244
240245#: qml/Components/KeyboardShortcutsOverlay.qml:242
241246msgid "Alt + Tab"
242−msgstr "Alt + Tab"
247+msgstr "Alt + Tabulador"
243248
244249#: qml/Components/KeyboardShortcutsOverlay.qml:247
245250msgid "Switches between applications."
246−msgstr "Conmuta ente aplicaciones."
251+msgstr ""
247252
248253#: qml/Components/KeyboardShortcutsOverlay.qml:255
249254msgid "Super + W"
250−msgstr "Super + W"
255+msgstr "Súper + W"
251256
252257#: qml/Components/KeyboardShortcutsOverlay.qml:260
253258msgid "Opens the desktop spread."
254−msgstr "Abre esparder l'escritoriu."
259+msgstr ""
255260
256261#: qml/Components/KeyboardShortcutsOverlay.qml:268
257262msgid "Cursor Left or Right"
258−msgstr "Flecha izq. o dre."
263+msgstr ""
259264
260265#: qml/Components/KeyboardShortcutsOverlay.qml:273
261266msgid "Moves the focus."
262−msgstr "Mueve'l focu"
267+msgstr "Mueve'l focu."
263268
264269#: qml/Components/KeyboardShortcutsOverlay.qml:285
265270msgid "Windows"
266−msgstr "Ventanes"
271+msgstr ""
267272
268273#: qml/Components/KeyboardShortcutsOverlay.qml:292
269274msgid "Ctrl + Super + D"
270−msgstr "Ctrl + Super + D"
275+msgstr "Ctrl + Súper + D"
271276
272277#: qml/Components/KeyboardShortcutsOverlay.qml:297
273278msgid "Minimizes all windows."
274−msgstr "Amenorga toles ventanes."
279+msgstr "Minimiza toles ventanes."
275280
276281#: qml/Components/KeyboardShortcutsOverlay.qml:305
277282msgid "Ctrl + Super + Up"
278−msgstr "Ctrl + Super + Arriba"
283+msgstr "Ctrl + Súper + Arriba"
279284
280285#: qml/Components/KeyboardShortcutsOverlay.qml:310
281286msgid "Maximizes the current window."
@@ -283,19 +288,19 @@ msgstr "Maximiza la ventana actual."
283288
284289#: qml/Components/KeyboardShortcutsOverlay.qml:318
285290msgid "Ctrl + Super + Down"
286−msgstr "Ctrl + Super + Abaxo"
291+msgstr "Ctrl + Súper + Abaxo"
287292
288293#: qml/Components/KeyboardShortcutsOverlay.qml:323
289294msgid "Minimizes or restores the current window."
290−msgstr "Amenorga o restaura la ventana actual."
295+msgstr "Minimiza o restaura la ventana actual."
291296
292297#: qml/Components/KeyboardShortcutsOverlay.qml:331
293298msgid "Ctrl + Super + Left or Right"
294−msgstr "Ctrl + Super + Izquierda o Drecha"
299+msgstr "Ctrl + Súper + Esquierda o Drecha"
295300
296301#: qml/Components/KeyboardShortcutsOverlay.qml:336
297302msgid "Semi-maximizes the current window."
298−msgstr "Semi-maximiza la ventana actual."
303+msgstr ""
299304
300305#: qml/Components/KeyboardShortcutsOverlay.qml:344
301306msgid "Alt + F4"
@@ -303,11 +308,11 @@ msgstr "Alt + F4"
303308
304309#: qml/Components/KeyboardShortcutsOverlay.qml:349
305310msgid "Closes the current window."
306−msgstr "Zarra la ventana actual."
311+msgstr "Zarra toles ventanes actuales."
307312
308−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
313+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:235
309314msgid "Return to Call"
310−msgstr "Tornar a la llamada"
315+msgstr ""
311316
312317#: qml/Components/Lockscreen.qml:212
313318msgid "Emergency Call"
@@ -315,7 +320,7 @@ msgstr "Llamada d'emerxencia"
315320
316321#: qml/Components/Lockscreen.qml:245
317322msgid "OK"
318−msgstr "Aceutar"
323+msgstr ""
319324
320325#: qml/Components/MediaServices/VideoPlayerControls.qml:44
321326#, qt-format
@@ -329,25 +334,25 @@ msgstr "%1:%2"
329334
330335#: qml/Components/ModeSwitchWarningDialog.qml:33
331336msgid "Apps may have unsaved data:"
332−msgstr "Apps que pueden tener datos sin guardar:"
337+msgstr "Aplicaciones con datos ensin guardar:"
333338
334339#: qml/Components/ModeSwitchWarningDialog.qml:60
335340msgctxt ""
336341"Re-dock means connect the device again to an external screen/mouse/keyboard"
337342msgid "Re-dock, save your work and close these apps to continue."
338−msgstr "Reconeuta, guarda'l trabayu y zarra eses apps pa siguir."
343+msgstr ""
339344
340345#: qml/Components/ModeSwitchWarningDialog.qml:67
341346msgid "Or force close now (unsaved data will be lost)."
342−msgstr "O fuerza salir agora (perderás tolos datos sin guardar)."
347+msgstr ""
343348
344349#: qml/Components/ModeSwitchWarningDialog.qml:80
345350msgid "OK, I will reconnect"
346−msgstr "D'alcuerdu, reconeutaré"
351+msgstr ""
347352
348353#: qml/Components/ModeSwitchWarningDialog.qml:81
349354msgid "Reconnect now!"
350−msgstr "Reconeutar agora."
355+msgstr ""
351356
352357#: qml/Components/ModeSwitchWarningDialog.qml:94
353358msgid "Close all"
@@ -355,128 +360,33 @@ msgstr "Zarrar too"
355360
356361#: qml/Components/SharingPicker.qml:54
357362msgid "Preview Share Item"
358−msgstr "Entever l'elementu compartíu"
363+msgstr ""
359364
360365#: qml/Components/VirtualTouchPad.qml:317
361366msgid ""
362367"Your device is now connected to an external display. Use this screen as a "
363368"touch pad to interact with the pointer."
364369msgstr ""
365−"El preséu agora ta coneutáu con una pantalla esterna. Usa esta pantalla como "
366−"touch pad pa interactuar col punteru."
370+"Agora'l preséu ta coneutáu a una pantalla esterna. Usa esta pantalla como "
371+"panel táutil pa interactuar col punteru."
367372
368373#: qml/Components/VirtualTouchPad.qml:327
374+#, fuzzy
375+#| msgid "Tap to return to call..."
369376msgid "Tap left button to click."
370−msgstr "Calca nel botón esquierdu pa facer clic."
377+msgstr "Toca pa volver a la llamada…"
371378
372379#: qml/Components/VirtualTouchPad.qml:339
373380msgid "Tap right button to right click."
374−msgstr "Calca nel botón drechu pa facer clic."
381+msgstr ""
375382
376383#: qml/Components/VirtualTouchPad.qml:351
377384msgid "Swipe with two fingers to scroll."
378−msgstr "Esliza con dos deos pa desplazate."
385+msgstr ""
379386
380387#: qml/Components/VirtualTouchPad.qml:396
381388msgid "Find more settings in the system settings."
382−msgstr "Alcuentra más axustes nos Axustes del Sistema."
383−
384−#: qml/Dash/DashPageHeader.qml:361
385−msgctxt "Button: Open the Ubuntu Store"
386−msgid "Store"
387−msgstr "Tienda"
388−
389−#: qml/Dash/DashPageHeader.qml:368
390−msgctxt "Button: Start a search in the current dash scope"
391−msgid "Search"
392−msgstr "Guetar"
393−
394−#: qml/Dash/DashPageHeader.qml:378
395−msgctxt "Button: Show the current dash scope settings"
396−msgid "Settings"
397−msgstr "Axustes"
398−
399−#: qml/Dash/DashPageHeader.qml:385
400−msgid "Remove from Favorites"
401−msgstr "Desaniciar de favoritos"
402−
403−#: qml/Dash/DashPageHeader.qml:385
404−msgid "Add to Favorites"
405−msgstr "Amestar a favoritos"
406−
407−#: qml/Dash/FiltersPopover.qml:61
408−msgid "Refine your results"
409−msgstr "Refina los resultaos"
410−
411−#: qml/Dash/FiltersPopover.qml:70
412−msgid "Reset"
413−msgstr "Reafitar"
414−
415−#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
416−msgid "Show less"
417−msgstr "Ver menos"
418−
419−#: qml/Dash/GenericScopeView.qml:547
420−msgid "Show all"
421−msgstr "Ver too"
422−
423−#: qml/Dash/GenericScopeView.qml:578
424−msgctxt "Label: Hint for dash search line edit"
425−msgid "Search"
426−msgstr "Guetar"
427−
428−#: qml/Dash/PageHeaderExtraPanel.qml:67
429−msgid "Recent Searches"
430−msgstr "Guetes recién"
431−
432−#: qml/Dash/PageHeaderExtraPanel.qml:78
433−msgid "Clear All"
434−msgstr "Llimpiar too"
435−
436−#: qml/Dash/Previews/PreviewActionCombo.qml:36
437−msgid "More..."
438−msgstr "Más…"
439−
440−#: qml/Dash/Previews/PreviewActionCombo.qml:36
441−msgid "Less..."
442−msgstr "Menos…"
443−
444−#: qml/Dash/Previews/PreviewCommentInput.qml:83
445−#: qml/Dash/Previews/PreviewRatingInput.qml:202
446−msgid "Send"
447−msgstr "Unviar"
448−
449−#: qml/Dash/Previews/PreviewRatingInput.qml:109
450−msgid "Rate this"
451−msgstr "Valorar esto"
452−
453−#: qml/Dash/Previews/PreviewRatingInput.qml:184
454−msgid "Add a review"
455−msgstr "Amestar una reseña"
456−
457−#: qml/Dash/PullToRefreshScopeStyle.qml:56
458−msgid "Pull to refresh…"
459−msgstr "Tira p'anovar..."
460−
461−#: qml/Dash/PullToRefreshScopeStyle.qml:61
462−msgid "Release to refresh…"
463−msgstr "Sueltar p'anovar..."
464−
465−#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
466−msgid "Enable location data"
467−msgstr "Habilitar datos d'allugamientu"
468−
469−#: qml/Dash/ScopesList.qml:146
470−msgid "Manage"
471−msgstr "Xestionar"
472−
473−#: qml/Dash/ScopesList.qml:187
474−msgid "Home"
475−msgstr "Aniciu"
476−
477−#: qml/Dash/ScopesList.qml:188
478−msgid "Also installed"
479−msgstr "Tamién instalaos"
389+msgstr ""
480390
481391#: qml/Greeter/CoverPage.qml:127
482392msgid "Unlock"
@@ -488,33 +398,39 @@ msgstr "Preséu bloquiáu"
488398
489399#: qml/Greeter/DelayedLockscreen.qml:58
490400msgid "You have been locked out due to too many failed passphrase attempts."
491−msgstr "Quedasti bloquiáu polos escesivos intentos fallíos de fras de pasu."
401+msgstr ""
402+"Bloquióse'l preséu dempués d'introducir mal el códigu numbéricu milenta "
403+"vegaes."
492404
493405#: qml/Greeter/DelayedLockscreen.qml:59
494406msgid "You have been locked out due to too many failed passcode attempts."
495407msgstr ""
496−"Quedasti bloquiáu polos escesivos intentos fallíos de códigu de pasu."
408+"Bloquióse'l preséu dempués d'introducir mal la contraseña milenta vegaes."
497409
498410#: qml/Greeter/DelayedLockscreen.qml:68
499411#, qt-format
500412msgid "Please wait %1 minute and then try again…"
501413msgid_plural "Please wait %1 minutes and then try again…"
502−msgstr[0] "Por favor, espera %1 minutu y vuelvi a intentalo…"
503−msgstr[1] "Por favor, espera %1 minutos y vuelvi a intentalo…"
414+msgstr[0] "Espera %1 minutu y volvi tentalo darréu…"
415+msgstr[1] "Espera %1 minutos y volvi tentalo darréu…"
504416
505417#: qml/Greeter/Greeter.qml:550
506418msgid "Try again"
507−msgstr "Tentar otra vuelta"
419+msgstr ""
508420
509421#: qml/Greeter/Greeter.qml:551
422+#, fuzzy
423+#| msgid "Enter passphrase"
510424msgid "Enter passphrase to unlock"
511−msgstr ""
425+msgstr "Introduz la fras de pasu"
512426
513427#: qml/Greeter/Greeter.qml:552
428+#, fuzzy
429+#| msgid "Enter passcode"
514430msgid "Enter passcode to unlock"
515−msgstr ""
431+msgstr "Introduz el códigu de pasu"
516432
517−#: qml/Greeter/NarrowView.qml:228
433+#: qml/Greeter/NarrowView.qml:235
518434msgid "Emergency"
519435msgstr "Emerxencia"
520436
@@ -524,32 +440,33 @@ msgstr "Fras de pasu"
524440
525441#: qml/Greeter/PromptList.qml:126
526442msgid "Passcode"
527−msgstr "Códigu de pasu"
443+msgstr "Códigu numbéricu"
528444
529445#: qml/Greeter/SessionsList.qml:124
530446msgid "Select desktop environment"
531−msgstr "Esbillar entornu d'escritoriu"
447+msgstr ""
532448
533−#: qml/Launcher/Drawer.qml:94
449+#: qml/Launcher/Drawer.qml:250
450+#, fuzzy
451+#| msgid "Search"
534452msgid "Search…"
535−msgstr "Guetar..."
453+msgstr "Guetar"
536454
537−#: qml/Launcher/Drawer.qml:129
538−msgctxt "Apps sorted alphabetically"
539−msgid "A-Z"
540−msgstr "A-Z"
455+#: qml/Launcher/PullToRefreshScopeStyle.qml:56
456+msgid "Pull to refresh…"
457+msgstr "Tira pa refrescar…"
541458
542−#: qml/Launcher/MoreAppsHeader.qml:55
543−msgid "More apps in the store"
544−msgstr "Más aplicaciones na tienda"
459+#: qml/Launcher/PullToRefreshScopeStyle.qml:61
460+msgid "Release to refresh…"
461+msgstr "Suelta pa refrescar…"
545462
546463#: qml/Notifications/NotificationMenuItemFactory.qml:124
547464msgid "Show password"
548−msgstr "Amosar contraseña"
465+msgstr "Amosar la contraseña"
549466
550467#: qml/Panel/ActiveCallHint.qml:79
551468msgid "Tap to return to call..."
552−msgstr "Toca pa tornar a la llamada..."
469+msgstr "Toca pa volver a la llamada…"
553470
554471#: qml/Panel/ActiveCallHint.qml:92
555472msgid "Conference"
@@ -557,7 +474,7 @@ msgstr "Conferencia"
557474
558475#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
559476msgid "Nothing is playing"
560−msgstr "Nun ta reproduciéndose nada"
477+msgstr "Nada en reproducción"
561478
562479#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
563480#, qt-format
@@ -588,11 +505,11 @@ msgstr "0 segundos"
588505#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
589506#, qt-format
590507msgid "%1 remaining"
591−msgstr "Queden %1"
508+msgstr "%1 restante(s)"
592509
593510#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
594511msgid "In queue…"
595−msgstr "Na cola..."
512+msgstr "Na cola…"
596513
597514#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
598515msgid "Downloading"
@@ -600,11 +517,11 @@ msgstr "Baxando"
600517
601518#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
602519msgid "Paused, tap to resume"
603−msgstr "Posáu, toca pa reanudar"
520+msgstr "Posóse, toca pa siguir"
604521
605522#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
606523msgid "Canceled"
607−msgstr "Encaboxáu"
524+msgstr "Encaboxóse"
608525
609526#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
610527msgid "Finished"
@@ -612,7 +529,7 @@ msgstr "Finó"
612529
613530#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
614531msgid "Failed, tap to retry"
615−msgstr "Falló, toca pa reintentar"
532+msgstr "Falló, toca pa retentar"
616533
617534#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
618535#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
@@ -623,65 +540,88 @@ msgstr "Unviar"
623540#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
624541msgctxt "Label: Hint in message indicator line edit"
625542msgid "Reply"
626−msgstr "Responder"
543+msgstr ""
627544
628545#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
629546msgctxt "Button: Call back on phone"
630547msgid "Call back"
631−msgstr "Devolver llamada"
548+msgstr "Rellamar"
632549
633550#: qml/Panel/PanelMenuPage.qml:92
551+#, fuzzy
552+#| msgctxt "Button: Go back one page in the Wizard"
553+#| msgid "Back"
634554msgid "Back"
635−msgstr ""
555+msgstr "Atrás"
636556
637557#: qml/Stage/SideStage.qml:76
638558msgid "Drag using 3 fingers any application from one window to the other"
639−msgstr "Abasnar cualquier aplicación d'una ventana a otra usando 3 deos"
559+msgstr "Arrastra con tres deos cualquier aplicación dende una ventana a otra"
560+
561+#: qml/Stage/Stage.qml:671
562+msgid "No running apps"
563+msgstr ""
640564
641565#: qml/Tutorial/TutorialLeftLong.qml:49
566+#, fuzzy
567+#| msgid "Long swipe from the left edge to open the Today scope"
642568msgid "Long swipe from the left edge to open the Application Drawer"
643−msgstr ""
569+msgstr "Eslizamientu llargu dende'l berbesu esquierdu p'abrir l'ámbitu Güei"
644570
645571#: qml/Tutorial/TutorialLeft.qml:47
646572msgid "Short swipe from the left edge to open the launcher"
647−msgstr "Barríu curtiu dende'l berbesu izquierdu p'abrir el llanzador"
573+msgstr "Esliza dende'l berbesu esquierdu p'abrir el llanzador"
648574
649−#: qml/Tutorial/TutorialRight.qml:55
575+#: qml/Tutorial/TutorialRight.qml:54
650576msgid "Push your mouse against the right edge to view your open apps"
651−msgstr "Emburria'l mur escontra'l berbesu drechu pa ver les apps abiertes"
577+msgstr "Lleva'l mur al berbesu drechu pa ver les aplicaciones abiertes"
652578
653−#: qml/Tutorial/TutorialRight.qml:56
579+#: qml/Tutorial/TutorialRight.qml:55
654580msgid "Swipe from the right edge to view your open apps"
655−msgstr "Barríu dende'l berbesu drechu pa ver les apps abiertes"
581+msgstr "Esliza dende'l berbesu drechu pa ver les aplicaciones abiertes"
656582
657583#: qml/Tutorial/TutorialTop.qml:53
658584msgid "Swipe from the top edge to access notifications and quick settings"
659−msgstr ""
660−"Barríu dende'l berbesu superior pa tener accesu a los avisos y configuración "
661−"nel intre"
585+msgstr "Esliza dende'l berbesu cimeru p'acceder a los avisos y axustes rápidos"
662586
663−#: qml/Wizard/Page.qml:54
587+#: qml/Wizard/Page.qml:59
664588msgctxt "Button: Go back one page in the Wizard"
665589msgid "Back"
666−msgstr "Atrás"
590+msgstr "Atrás"
667591
668−#: qml/Wizard/Pages/10-welcome.qml:28
592+#: qml/Wizard/Pages/10-welcome.qml:29
669593msgid "Language"
670594msgstr "Llingua"
671595
672−#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
673−#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
674−#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
675−#: qml/Wizard/Pages/70-passwd-type.qml:145
676−#: qml/Wizard/Pages/75-report-check.qml:84
677−#: qml/Wizard/Pages/passcode-desktop.qml:142
678−#: qml/Wizard/Pages/password-set.qml:142
596+#: qml/Wizard/Pages/10-welcome.qml:176
597+#: qml/Wizard/Pages/10-welcome-update.qml:126
598+#: qml/Wizard/Pages/11-changelog.qml:74 qml/Wizard/Pages/20-keyboard.qml:152
599+#: qml/Wizard/Pages/30-wifi.qml:214 qml/Wizard/Pages/50-timezone.qml:272
600+#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/70-passwd-type.qml:146
601+#: qml/Wizard/Pages/passcode-desktop.qml:154
602+#: qml/Wizard/Pages/password-set.qml:153
679603msgid "Next"
680604msgstr "Siguiente"
681605
606+#: qml/Wizard/Pages/10-welcome-update.qml:91
607+msgid "Welcome to "
608+msgstr ""
609+
610+#: qml/Wizard/Pages/10-welcome-update.qml:106
611+msgid "We will make sure your device is ready to use "
612+msgstr "Vamos aseguranos de que'l preséu ta preparáu pa usase "
613+
614+#: qml/Wizard/Pages/11-changelog.qml:28
615+msgid "What's new"
616+msgstr "Qué hai nuevo"
617+
618+#: qml/Wizard/Pages/11-changelog.qml:74
619+msgid "Loading..."
620+msgstr "Cargando…"
621+
682622#: qml/Wizard/Pages/20-keyboard.qml:31
683623msgid "Select Keyboard"
684−msgstr "Escoyer tecláu"
624+msgstr ""
685625
686626#: qml/Wizard/Pages/20-keyboard.qml:71
687627msgid "Keyboard language"
@@ -691,247 +631,203 @@ msgstr "Llingua del tecláu"
691631msgid "Keyboard layout"
692632msgstr "Distribución del tecláu"
693633
694−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
695−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
634+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:214
635+#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/79-system-update.qml:144
636+#: qml/Wizard/Pages/sim.qml:101
696637msgid "Skip"
697638msgstr "Saltar"
698639
699−#: qml/Wizard/Pages/30-wifi.qml:30
640+#: qml/Wizard/Pages/30-wifi.qml:31
700641msgid "Connect to Wi‑Fi"
701−msgstr "Coneutase al WiFi"
642+msgstr "Conexón a una Wi-Fi"
702643
703−#: qml/Wizard/Pages/30-wifi.qml:131
644+#: qml/Wizard/Pages/30-wifi.qml:139
704645msgid "Connected"
705−msgstr "Coneutáu"
646+msgstr "Coneutóse"
706647
707−#: qml/Wizard/Pages/30-wifi.qml:164
648+#: qml/Wizard/Pages/30-wifi.qml:172
708649msgid "Available Wi-Fi networks"
709650msgstr "Redes Wi-Fi disponibles"
710651
711−#: qml/Wizard/Pages/30-wifi.qml:165
652+#: qml/Wizard/Pages/30-wifi.qml:173
712653msgid "No available Wi-Fi networks"
713654msgstr "Nun hai redes Wi-Fi disponibles"
714655
715−#: qml/Wizard/Pages/40-location.qml:27
716−msgid "Location Services"
717−msgstr "Servicios d'allugamientu"
718−
719−#: qml/Wizard/Pages/40-location.qml:83
720−msgid ""
721−"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
722−"(recommended)"
723−msgstr ""
724−"Usar GPS, puntos Wi-Fi y redes móviles de mou anónimu pa detectar "
725−"l'allugamientu (recomendao)"
726−
727−#: qml/Wizard/Pages/40-location.qml:105
728−#, qt-format
729−msgid "By selecting this option you agree to the Nokia HERE %1."
730−msgstr "Seleicionando esta opción aceutes los %1 de Nokia HERE."
731−
732−#: qml/Wizard/Pages/40-location.qml:106
733−msgctxt "part of: Nokia HERE terms and conditions"
734−msgid "terms and conditions"
735−msgstr "términos y condiciones"
736−
737−#: qml/Wizard/Pages/40-location.qml:160
738−msgid "GPS only"
739−msgstr "Sólo GPS"
740−
741−#: qml/Wizard/Pages/40-location.qml:214
742−msgid "Don't use my location"
743−msgstr "Nun usar l'allugamientu"
744−
745−#: qml/Wizard/Pages/40-location.qml:260
746−msgid "You can change it later in System Settings."
747−msgstr "Pues camudalo sero na Configuración del Sistema."
748−
749656#: qml/Wizard/Pages/50-timezone.qml:30
750657msgid "Time Zone"
751−msgstr "Estaya horaria"
658+msgstr "Fusu horariu"
752659
753−#: qml/Wizard/Pages/50-timezone.qml:182
660+#: qml/Wizard/Pages/50-timezone.qml:183
754661msgid "Enter your city"
755−msgstr "Escribe la ciudá"
662+msgstr "Introduz la to ciudá"
756663
757664#: qml/Wizard/Pages/60-account.qml:24
758665msgid "Personalize Your Device"
759−msgstr "Personaliza'l preséu"
666+msgstr "Personalización del preséu"
760667
761−#: qml/Wizard/Pages/60-account.qml:48
668+#: qml/Wizard/Pages/60-account.qml:54
762669msgid "Preferred Name"
763670msgstr "Nome preferíu"
764671
765672#: qml/Wizard/Pages/70-passwd-type.qml:40
766673msgid "Lock Screen"
767−msgstr "Bloquiar pantalla"
674+msgstr "Pantalla de bloquéu"
768675
769−#: qml/Wizard/Pages/70-passwd-type.qml:102
676+#: qml/Wizard/Pages/70-passwd-type.qml:103
770677msgctxt "Label: Type of security method"
771678msgid "Create new password"
772−msgstr "Crear contraseña nueva"
679+msgstr "Crear una contraseña"
773680
774−#: qml/Wizard/Pages/70-passwd-type.qml:104
681+#: qml/Wizard/Pages/70-passwd-type.qml:105
775682msgctxt "Label: Type of security method"
776683msgid "Create passcode (numbers only)"
777−msgstr "Crear códigu d'accesu (sólo númberos)"
684+msgstr "Crear un códigu numbéricu"
778685
779−#: qml/Wizard/Pages/70-passwd-type.qml:106
686+#: qml/Wizard/Pages/70-passwd-type.qml:107
780687msgctxt "Label: Type of security method"
781688msgid "No lock code"
782−msgstr "Ensin códigu de bloquéu"
689+msgstr "Nada"
690+
691+#: qml/Wizard/Pages/79-system-update.qml:28
692+msgid "Update Device"
693+msgstr ""
783694
784−#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
785−msgid "Privacy Policy"
786−msgstr "Política d'intimidá"
695+#: qml/Wizard/Pages/79-system-update.qml:55
696+msgid ""
697+"There is a system update available and ready to install. Afterwards, the "
698+"device will automatically restart."
699+msgstr ""
700+"Hai un anovamientu del sistema disponible y preparáu pa instalase. Dempués, "
701+"el preséu va reaniciase automáticamente."
702+
703+#: qml/Wizard/Pages/79-system-update.qml:76
704+#, fuzzy
705+#| msgctxt "string identifying name of the update"
706+#| msgid "Ubuntu system"
707+msgctxt "string identifying name of the update"
708+msgid "Ubuntu Touch system"
709+msgstr "Sistema Ubuntu"
710+
711+#: qml/Wizard/Pages/79-system-update.qml:83
712+#, qt-format
713+msgctxt "version of the system update"
714+msgid "Version %1"
715+msgstr "Versión %1"
787716
788−#: qml/Wizard/Pages/75-report-check.qml:26
789−msgid "Help Us Improve"
790−msgstr "Ayúdanos a meyorar"
717+#: qml/Wizard/Pages/79-system-update.qml:95
718+msgid "This could take a few minutes..."
719+msgstr "Esto podría tardar unos minutos…"
791720
792−#: qml/Wizard/Pages/75-report-check.qml:59
793−msgid "Improve system performance by sending us crashes and error reports."
721+#: qml/Wizard/Pages/79-system-update.qml:109
722+msgid "Install and restart now"
794723msgstr ""
795−"Ameyora'l rindimientu del sistema unviándonos los informes d'errores y "
796−"cuelgues."
797724
798−#: qml/Wizard/Pages/75-report-check.qml:60
799−msgid "Privacy policy"
800−msgstr "Política d'intimidá"
725+#: qml/Wizard/Pages/80-finished.qml:91
726+msgid "Welcome Back"
727+msgstr "Volvi afayate"
801728
802−#: qml/Wizard/Pages/80-finished.qml:89
729+#: qml/Wizard/Pages/80-finished.qml:91
803730msgid "Welcome to Ubuntu"
804−msgstr "Bienveníu/a a Ubuntu"
731+msgstr "Afáyate n'Ubuntu"
805732
806−#: qml/Wizard/Pages/80-finished.qml:104
733+#: qml/Wizard/Pages/80-finished.qml:106
807734msgid "You are ready to use your device now"
808−msgstr "Ya tas preparáu pa usar el preséu"
809−
810−#: qml/Wizard/Pages/80-finished.qml:124
811−msgid "Get Started"
812−msgstr "Primeros pasos"
813−
814−#: qml/Wizard/Pages/here-terms.qml:25
815−msgid "Terms & Conditions"
816−msgstr "Términos y condiciones"
817−
818−#: qml/Wizard/Pages/here-terms.qml:69
819−msgid "Your device uses positioning technologies provided by HERE."
820−msgstr "El preséu usa teunoloxíes de posición qu'ufre HERE."
821−
822−#: qml/Wizard/Pages/here-terms.qml:81
823−msgid ""
824−"To provide you with positioning services and to improve their quality, HERE "
825−"collects information about nearby cell towers and Wi-Fi hotspots around your "
826−"current location whenever your position is being found."
827−msgstr ""
828−"Pa ufrir los servicios de posición y ameyorar la so calidá, HERE collecha "
829−"información de les antenes celulares y puntos d'accesu Wi-Fi cercanos al to "
830−"allugamientu actual siempre que se conoza la to posición."
735+msgstr "Agora tas preparáu pa usar el preséu"
831736
832−#: qml/Wizard/Pages/here-terms.qml:93
833−msgid ""
834−"The information collected is used to analyze the service and to improve the "
835−"use of service, but not to identify you personally."
836−msgstr ""
837−"La información collechada úsase p'analizar el serviciu y ameyorar l'usu del "
838−"serviciu, non pa identificate personalmente."
737+#: qml/Wizard/Pages/80-finished.qml:126
738+msgid "Continue"
739+msgstr "Siguir"
839740
840−#: qml/Wizard/Pages/here-terms.qml:106
841−#, qt-format
842−msgid "By continuing, you agree to the HERE platform %1 and %2."
843−msgstr "Al siguir, aceutes %1 y %2 de la plataforma HERE."
844−
845−#: qml/Wizard/Pages/here-terms.qml:107
846−msgid "Service Terms"
847−msgstr "Términos del serviciu"
741+#: qml/Wizard/Pages/80-finished.qml:126
742+msgid "Get Started"
743+msgstr "Entamar"
848744
849745#: qml/Wizard/Pages/passcode-confirm.qml:43
850−#: qml/Wizard/Pages/passcode-desktop.qml:97
746+#: qml/Wizard/Pages/passcode-desktop.qml:104
851747msgid "Confirm passcode"
852−msgstr "Confirmar códigu de pasu"
748+msgstr "Confirmación"
853749
854750#: qml/Wizard/Pages/passcode-confirm.qml:45
855751msgid "Incorrect passcode."
856−msgstr "Códigu de pasu incorreutu."
752+msgstr "El códigu numbéricu ye incorreutu."
857753
858754#: qml/Wizard/Pages/passcode-confirm.qml:45
859755msgctxt "Enter the passcode again"
860756msgid "Please re-enter."
861−msgstr "Vuelve a escribilu."
757+msgstr "Volvi introducilu."
862758
863759#: qml/Wizard/Pages/passcode-desktop.qml:31
864760msgid "Lock Screen Passcode"
865−msgstr "Códigu de pasu de bloquéu de pantalla"
761+msgstr "Códigu numbéricu de la pantalla de bloquéu"
866762
867−#: qml/Wizard/Pages/passcode-desktop.qml:61
763+#: qml/Wizard/Pages/passcode-desktop.qml:68
868764msgid "Enter 4 numbers to setup your passcode"
869−msgstr "Escribi 4 númberos pa configurar el códigu de pasu"
765+msgstr "Introduz 4 númberos pa configurar el códigu numbéricu"
870766
871−#: qml/Wizard/Pages/passcode-desktop.qml:77
767+#: qml/Wizard/Pages/passcode-desktop.qml:84
872768#: qml/Wizard/Pages/passcode-set.qml:54
873769msgid "Choose passcode"
874−msgstr "Escueyi'l códigu de pasu"
770+msgstr "Códigu numbéricu"
875771
876−#: qml/Wizard/Pages/passcode-desktop.qml:127
772+#: qml/Wizard/Pages/passcode-desktop.qml:139
877773msgid "Passcode too short"
878−msgstr "Códigu de pasu curtiu enforma"
774+msgstr "El códigu numbéricu ye percurtiu"
879775
880−#: qml/Wizard/Pages/passcode-desktop.qml:129
776+#: qml/Wizard/Pages/passcode-desktop.qml:141
881777msgid "Passcodes match"
882−msgstr "Los códigos de pasu casen"
778+msgstr "Los códigos numbéricos concasen"
883779
884−#: qml/Wizard/Pages/passcode-desktop.qml:131
780+#: qml/Wizard/Pages/passcode-desktop.qml:143
885781msgid "Passcodes do not match"
886−msgstr "Los códigos de pasu nun casen"
782+msgstr "Los códigos numbéricos nun concasen"
887783
888784#: qml/Wizard/Pages/passcode-set.qml:62
889785msgid "Passcode must be 4 characters long"
890−msgstr "El códigu de pasu tien de tener 4 caráuteres de llargo"
786+msgstr "El códigu numbéricu a ser de 4 caráuteres"
891787
892788#: qml/Wizard/Pages/password-set.qml:31
893789msgid "Lock Screen Password"
894−msgstr "Contraseña del Bloquéu de pantalla"
790+msgstr "Contraseña de la pantalla de bloquéu"
895791
896−#: qml/Wizard/Pages/password-set.qml:62
792+#: qml/Wizard/Pages/password-set.qml:68
897793msgid "Enter at least 8 characters"
898−msgstr "Escribe polo menos 8 caráuteres"
794+msgstr "Introduz 8 caráuteres polo menos"
899795
900−#: qml/Wizard/Pages/password-set.qml:74
796+#: qml/Wizard/Pages/password-set.qml:80
901797msgid "Choose password"
902−msgstr "Escueye la contraseña"
798+msgstr "Contraseña"
903799
904−#: qml/Wizard/Pages/password-set.qml:104
800+#: qml/Wizard/Pages/password-set.qml:110
905801msgid "Confirm password"
906−msgstr "Confirmar contraseña"
802+msgstr "Confirmación"
907803
908804#: qml/Wizard/Pages/sim.qml:27
909805msgid "No SIM card installed"
910−msgstr "Nun ta instalada nenguna tarxeta SIM"
806+msgstr "Nun s'instaló denguna tarxeta SIM"
911807
912808#: qml/Wizard/Pages/sim.qml:54
913809msgid "SIM card added"
914−msgstr "Amestóse tarxeta SIM"
810+msgstr ""
915811
916812#: qml/Wizard/Pages/sim.qml:55
917813msgid "You must restart the device to access the mobile network."
918−msgstr "Tienes de reaniciar el preséu pa tener accesu a la rede móvil."
814+msgstr "Has reaniciar el preséu p'acceder a la rede móvil."
919815
920816#: qml/Wizard/Pages/sim.qml:59
921817msgid "Restart"
922−msgstr "Reaniciar"
818+msgstr ""
923819
924820#: qml/Wizard/Pages/sim.qml:78
925821msgid "You won’t be able to make calls or use text messaging without a SIM."
926−msgstr "Nun podrás facer llamaes nin usar mensaxería de testu sin una SIM."
822+msgstr "Nun vas ser a facer llamaes o unviar SMS ensin una SIM."
927823
928824#: qml/Wizard/Pages/sim.qml:90
929825msgid "To proceed with no SIM tap Skip."
930−msgstr "Pa siguir ensin SIM toca Saltar."
826+msgstr "Pa siguir ensin una tarxeta SIM toca Saltar."
931827
932828#: qml/Wizard/PasswordMeter.qml:87
933829msgid "Password too short"
934−msgstr "Contraseña curtia enforma"
830+msgstr "La contraseña ye percurtia"
935831
936832#: qml/Wizard/PasswordMeter.qml:89
937833msgid "Passwords match"
@@ -943,11 +839,11 @@ msgstr "Les contraseñes nun concasen"
943839
944840#: qml/Wizard/PasswordMeter.qml:95
945841msgid "Strong password"
946−msgstr "Contraseña fuerte"
842+msgstr "Contraseña perbona"
947843
948844#: qml/Wizard/PasswordMeter.qml:97
949845msgid "Fair password"
950−msgstr "Contraseña aceutable"
846+msgstr "Contraseña bona"
951847
952848#: qml/Wizard/PasswordMeter.qml:99
953849msgid "Weak password"
@@ -955,7 +851,185 @@ msgstr "Contraseña feble"
955851
956852#: qml/Wizard/PasswordMeter.qml:101
957853msgid "Very weak password"
958−msgstr "Contraseña feble enforma"
854+msgstr "Contraseña perfeble"
855+
856+#~ msgid "Unity 8"
857+#~ msgstr "Unity 8"
858+
859+#~ msgid "Scopes"
860+#~ msgstr "Ámbitos"
861+
862+#~ msgid "Super (Tap)"
863+#~ msgstr "Súper (Toque)"
864+
865+#~ msgid "Opens the Scopes home."
866+#~ msgstr "Abre l'aniciu d'Ámbitos."
867+
868+#~ msgctxt "Button: Open the Ubuntu Store"
869+#~ msgid "Store"
870+#~ msgstr "Tienda"
871+
872+#~ msgctxt "Button: Start a search in the current dash scope"
873+#~ msgid "Search"
874+#~ msgstr "Guetar"
875+
876+#~ msgctxt "Button: Show the current dash scope settings"
877+#~ msgid "Settings"
878+#~ msgstr "Axustes"
879+
880+#~ msgid "Show less"
881+#~ msgstr "Amosar menos"
882+
883+#~ msgid "Show all"
884+#~ msgstr "Amosar too"
885+
886+#~ msgid "Recent Searches"
887+#~ msgstr "Guetes d'apocayá"
888+
889+#~ msgid "Clear All"
890+#~ msgstr "Llimpiar too"
891+
892+#~ msgid "More..."
893+#~ msgstr "Más…"
894+
895+#~ msgid "Less..."
896+#~ msgstr "Menos…"
897+
898+#~ msgid "Manage"
899+#~ msgstr "Xestión"
900+
901+#~ msgid "Home"
902+#~ msgstr "Aniciu"
903+
904+#~ msgid "Also installed"
905+#~ msgstr "Tamién s'instaló"
906+
907+#~ msgid "Privacy Policy"
908+#~ msgstr "Política de privacidá"
909+
910+#~ msgid "Help Us Improve"
911+#~ msgstr "Ayúdanos a ameyorar"
912+
913+#~ msgid "Improve system performance by sending us crashes and error reports."
914+#~ msgstr ""
915+#~ "Ameyora'l rindimientu del sistema unviándonos informes de casques y "
916+#~ "fallos."
917+
918+#~ msgid "Privacy policy"
919+#~ msgstr "Política de privacidá"
920+
921+#~ msgid "This device is not connected to the internet."
922+#~ msgstr "El preséu nun ta coneutáu a internet."
923+
924+#~ msgid "Software is up to date"
925+#~ msgstr "El software ta anováu"
926+
927+#~ msgid "The update server is not responding."
928+#~ msgstr "El sirvidor d'anovamientos nun ta respondiendo."
929+
930+#~ msgid "Please wait..."
931+#~ msgstr "Espera…"
932+
933+#~ msgid "Installation failed"
934+#~ msgstr "Falló la instalación"
935+
936+#~ msgid "Checking for updates…"
937+#~ msgstr "Comprobando anovamientos…"
938+
939+#~ msgid "%1 update available"
940+#~ msgid_plural "%1 updates available"
941+#~ msgstr[0] "%1 anovamientu disponible"
942+#~ msgstr[1] "%1 anovamientos disponibles"
943+
944+#~ msgid "Update all…"
945+#~ msgstr "Anovar too…"
946+
947+#~ msgid "Update all"
948+#~ msgstr "Anovar too"
949+
950+#~ msgid "Resume"
951+#~ msgstr "Siguir"
952+
953+#~ msgid "Install…"
954+#~ msgstr "Instalar…"
955+
956+#~ msgid "Open"
957+#~ msgstr "Abrir"
958+
959+#~ msgid "Installing"
960+#~ msgstr "Instalando"
961+
962+#~ msgid "Paused"
963+#~ msgstr "Posóse"
964+
965+#~ msgid "Waiting to download"
966+#~ msgstr "Esperando pola descarga"
967+
968+#~ msgid "%1 of %2"
969+#~ msgstr "%1 de %2"
970+
971+#~ msgid "Downloaded"
972+#~ msgstr "Baxó"
973+
974+#~ msgid "Installed"
975+#~ msgstr "Instalóse"
976+
977+#~ msgid "Updated %1"
978+#~ msgstr "Anovóse %1"
979+
980+#~ msgid "Location Services"
981+#~ msgstr "Servicios d'allugamientu"
982+
983+#~ msgid ""
984+#~ "Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
985+#~ "(recommended)"
986+#~ msgstr ""
987+#~ "Usar GPS, puntos Wi-Fi y redes móviles de mou anónimu pa detectar "
988+#~ "l'allugamientu (recomendao)"
989+
990+#~ msgid "By selecting this option you agree to the Nokia HERE %1."
991+#~ msgstr "Seleicionando esta opción aceutes los %1 de Nokia HERE."
992+
993+#~ msgctxt "part of: Nokia HERE terms and conditions"
994+#~ msgid "terms and conditions"
995+#~ msgstr "términos y condiciones"
996+
997+#~ msgid "GPS only"
998+#~ msgstr "Sólo GPS"
999+
1000+#~ msgid "Don't use my location"
1001+#~ msgstr "Nun usar l'allugamientu"
1002+
1003+#~ msgid "You can change it later in System Settings."
1004+#~ msgstr "Pues camudalo sero na Configuración del Sistema."
1005+
1006+#~ msgid "Terms & Conditions"
1007+#~ msgstr "Términos y condiciones"
1008+
1009+#~ msgid "Your device uses positioning technologies provided by HERE."
1010+#~ msgstr "El preséu usa teunoloxíes de posición qu'ufre HERE."
1011+
1012+#~ msgid ""
1013+#~ "To provide you with positioning services and to improve their quality, "
1014+#~ "HERE collects information about nearby cell towers and Wi-Fi hotspots "
1015+#~ "around your current location whenever your position is being found."
1016+#~ msgstr ""
1017+#~ "Pa ufrir los servicios de posición y ameyorar la so calidá, HERE collecha "
1018+#~ "información de les antenes celulares y puntos d'accesu Wi-Fi cercanos al "
1019+#~ "to allugamientu actual siempre que se conoza la to posición."
1020+
1021+#~ msgid ""
1022+#~ "The information collected is used to analyze the service and to improve "
1023+#~ "the use of service, but not to identify you personally."
1024+#~ msgstr ""
1025+#~ "La información collechada úsase p'analizar el serviciu y ameyorar l'usu "
1026+#~ "del serviciu, non pa identificate personalmente."
1027+
1028+#~ msgid "By continuing, you agree to the HERE platform %1 and %2."
1029+#~ msgstr "Al siguir, aceutes %1 y %2 de la plataforma HERE."
1030+
1031+#~ msgid "Service Terms"
1032+#~ msgstr "Términos del serviciu"
9591033
9601034#~ msgid "Skip intro"
9611035#~ msgstr "Omitir la intro"
@@ -983,8 +1057,8 @@ msgstr "Contraseña feble enforma"
9831057
9841058#~ msgid "Swipe from the left to reveal the launcher for quick access to apps"
9851059#~ msgstr ""
986−#~ "Esliza'l deu dende la esquierda p'amosar el llanzador y acceder rápidamente "
987−#~ "a les aplicaciones"
1060+#~ "Esliza'l deu dende la esquierda p'amosar el llanzador y acceder "
1061+#~ "rápidamente a les aplicaciones"
9881062
9891063#~ msgid "Well done"
9901064#~ msgstr "Bien fecho"
@@ -992,21 +1066,12 @@ msgstr "Contraseña feble enforma"
9921066#~ msgid "Confirm"
9931067#~ msgstr "Confirmar"
9941068
995−#~ msgid "Speaking..."
996−#~ msgstr "Falando…"
997−
998−#~ msgid "Loading. Please Wait..."
999−#~ msgstr "Cargando, espera…"
1000−
10011069#~ msgid "Type or say a command"
10021070#~ msgstr "Escribi o di una orde"
10031071
10041072#~ msgid "Speak Now..."
10051073#~ msgstr "Fala agora…"
10061074
1007−#~ msgid "Search"
1008−#~ msgstr "Guetar"
1009−
10101075#~ msgid "See less"
10111076#~ msgstr "Ver menos"
10121077
@@ -1053,7 +1118,6 @@ msgstr "Contraseña feble enforma"
10531118#~ msgid "Store"
10541119#~ msgstr "Tienda"
10551120
1056−#, qt-format
10571121#~ msgid "Sorry, incorrect %1"
10581122#~ msgstr "Sentímoslo, %1 incorreutu"
10591123
@@ -1069,9 +1133,6 @@ msgstr "Contraseña feble enforma"
10691133#~ msgid "Manage Scopes"
10701134#~ msgstr "Xestionar ámbitos"
10711135
1072−#~ msgid "Continue"
1073−#~ msgstr "Siguir"
1074−
10751136#~ msgid "Without it, you won’t be able to make calls or use text messaging."
10761137#~ msgstr "Ensin ella, nun vas poder facer llamaes nin unviar mensaxes."
10771138
@@ -1103,17 +1164,12 @@ msgstr "Contraseña feble enforma"
11031164#~ msgid "Not at all"
11041165#~ msgstr "De nengún mou"
11051166
1106−#, qt-format
11071167#~ msgid "〈 %1"
11081168#~ msgstr "〈 %1"
11091169
1110−#, qt-format
11111170#~ msgid "%1 〉"
11121171#~ msgstr "%1 〉"
11131172
1114−#~ msgid "Open the launcher"
1115−#~ msgstr "Abrir el llanzador"
1116−
11171173#~ msgid "Tap here to continue."
11181174#~ msgstr "Toca equí pa siguir."
11191175
@@ -1154,35 +1210,28 @@ msgstr "Contraseña feble enforma"
11541210#~ msgid "Sorry, incorrect passphrase."
11551211#~ msgstr "Perdón, fras de pasu incorreuta"
11561212
1157−#, qt-format
11581213#~ msgid "Enter %1"
11591214#~ msgstr "Introduz %1"
11601215
11611216#~ msgid "Sorry, incorrect passcode."
11621217#~ msgstr "Perdón, códigu de pasu incorreutu."
11631218
1164−#~ msgid "Enter passcode"
1165−#~ msgstr "Introduz el códigu de pasu"
1166−
1167−#~ msgid "Enter passphrase"
1168−#~ msgstr "Introduz la fras de pasu"
1169−
11701219#~ msgid "Please re-enter"
11711220#~ msgstr "Por favor, reintroduzla"
11721221
11731222#~ msgid ""
1174−#~ "If passcode is entered incorrectly, your phone will conduct a factory reset "
1175−#~ "and all personal data will be deleted."
1223+#~ "If passcode is entered incorrectly, your phone will conduct a factory "
1224+#~ "reset and all personal data will be deleted."
11761225#~ msgstr ""
1177−#~ "Si s'inxerta'l códigu de pasu incorreutamente, el to teléfonu va reafitase y "
1178−#~ "van desaniciase tolos datos personales."
1226+#~ "Si s'inxerta'l códigu de pasu incorreutamente, el to teléfonu va "
1227+#~ "reafitase y van desaniciase tolos datos personales."
11791228
11801229#~ msgid ""
11811230#~ "If passphrase is entered incorrectly, your phone will conduct a factory "
11821231#~ "reset and all personal data will be deleted."
11831232#~ msgstr ""
1184−#~ "Si s'inxerta la fras de pasu incorreutamente, el to teléfonu va reafitase y "
1185−#~ "van desaniciase tolos datos personales."
1233+#~ "Si s'inxerta la fras de pasu incorreutamente, el to teléfonu va reafitase "
1234+#~ "y van desaniciase tolos datos personales."
11861235
11871236#~ msgid "This will be your last attempt."
11881237#~ msgstr "Esti sedra'l to caberu intentu"
@@ -1266,11 +1315,11 @@ msgstr "Contraseña feble enforma"
12661315#~ msgstr "¡Bon trabayu!"
12671316
12681317#~ msgid ""
1269−#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
1270−#~ "conditions</a>."
1318+#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms "
1319+#~ "and conditions</a>."
12711320#~ msgstr ""
1272−#~ "Esbillando esta opción aceutes los <a href='#'>términos y condiciones</a> de "
1273−#~ "Nokia HERE."
1321+#~ "Esbillando esta opción aceutes los <a href='#'>términos y condiciones</a> "
1322+#~ "de Nokia HERE."
12741323
12751324#~ msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
12761325#~ msgstr ""
@@ -1349,44 +1398,11 @@ msgstr "Contraseña feble enforma"
13491398
13501399#~ msgid "Short or long swipe from the right edge to view your open apps"
13511400#~ msgstr ""
1352−#~ "Eslizamientu curtiu o llargu dende'l berbesu drechu pa ver les apps abiertes"
1401+#~ "Eslizamientu curtiu o llargu dende'l berbesu drechu pa ver les apps "
1402+#~ "abiertes"
13531403
13541404#~ msgid "Swipe up to manage the app"
13551405#~ msgstr "Eslizar p'alministrar la app"
13561406
13571407#~ msgid "Swipe up to create a message"
13581408#~ msgstr "Eslizar pa crear un mensaxe"
1359−
1360−#~ msgid "Long swipe from the left edge to open the Today scope"
1361−#~ msgstr "Eslizamientu llargu dende'l berbesu izquierdu pa ver el scope Güei"
1362−
1363−#~ msgid "Takes a screenshot of a window."
1364−#~ msgstr "Saca una imaxe d'una ventana."
1365−
1366−#~ msgid "Super + 0 to 9"
1367−#~ msgstr "Super + 0 a 9"
1368−
1369−#~ msgid "Install and restart now"
1370−#~ msgstr "Instalar y reaniciar agora"
1371−
1372−#~ msgid "This could take a few minutes..."
1373−#~ msgstr "Esto podría tardar dellos minutos..."
1374−
1375−#, qt-format
1376−#~ msgctxt "version of the system update"
1377−#~ msgid "Version %1"
1378−#~ msgstr "Versión %1"
1379−
1380−#~ msgctxt "string identifying name of the update"
1381−#~ msgid "Ubuntu system"
1382−#~ msgstr "Sistema Ubuntu"
1383−
1384−#~ msgid "Update Device"
1385−#~ msgstr "Anovar preséu"
1386−
1387−#~ msgid ""
1388−#~ "There is a system update available and ready to install. Afterwards, the "
1389−#~ "device will automatically restart."
1390−#~ msgstr ""
1391−#~ "Hai un anovamientu del sistema disponible y preparáu pa instalar. Darréu, el "
1392−#~ "preséu reaniciará de mou automáticu."
po/az.po+161−260
@@ -6,39 +6,40 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2017-04-04 22:56+0000\n"
9+"Report-Msgid-Bugs-To: \n"
10+"POT-Creation-Date: 2021-01-29 11:42-0600\n"
1111"PO-Revision-Date: 2014-09-03 16:39+0000\n"
1212"Last-Translator: Nicat Məmmədov <n1c4t97@gmail.com>\n"
1313"Language-Team: Azerbaijani <az@li.org>\n"
14+"Language: az\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
1718"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
19−"X-Generator: Launchpad (build 18343)\n"
19+"X-Launchpad-Export-Date: 2016-11-23 06:34+0000\n"
20+"X-Generator: Launchpad (build 18269)\n"
2021
21−#: plugins/LightDM/Greeter.cpp:188
22+#: plugins/LightDM/Greeter.cpp:199
2223msgid "Password: "
2324msgstr "Şifrә: "
2425
25−#: plugins/LightDM/Greeter.cpp:203
26+#: plugins/LightDM/Greeter.cpp:214
2627msgid "Username"
2728msgstr ""
2829
29−#: plugins/LightDM/Greeter.cpp:242
30+#: plugins/LightDM/Greeter.cpp:258
3031msgid "Failed to authenticate"
3132msgstr ""
3233
33−#: plugins/LightDM/Greeter.cpp:244
34+#: plugins/LightDM/Greeter.cpp:260
3435msgid "Invalid password, please try again"
3536msgstr ""
3637
37−#: plugins/LightDM/Greeter.cpp:254
38+#: plugins/LightDM/Greeter.cpp:270
3839msgid "Log In"
3940msgstr ""
4041
41−#: plugins/LightDM/Greeter.cpp:254
42+#: plugins/LightDM/Greeter.cpp:270
4243msgid "Retry"
4344msgstr ""
4445
@@ -50,16 +51,16 @@ msgstr ""
5051msgid "Guest Session"
5152msgstr ""
5253
53−#: plugins/Unity/Launcher/launcheritem.cpp:49
54−#: plugins/Unity/Launcher/launcheritem.cpp:123
54+#: plugins/Unity/Launcher/launcheritem.cpp:48
55+#: plugins/Unity/Launcher/launcheritem.cpp:122
5556msgid "Pin shortcut"
5657msgstr "Pin qısayolu"
5758
58−#: plugins/Unity/Launcher/launcheritem.cpp:55
59+#: plugins/Unity/Launcher/launcheritem.cpp:54
5960msgid "Quit"
6061msgstr ""
6162
62−#: plugins/Unity/Launcher/launcheritem.cpp:123
63+#: plugins/Unity/Launcher/launcheritem.cpp:122
6364msgid "Unpin shortcut"
6465msgstr "Açma qısayolu"
6566
@@ -82,9 +83,8 @@ msgctxt "Button: Log out from the system"
8283msgid "Log Out"
8384msgstr ""
8485
85−#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
87−#: qml/Wizard/Pages/passcode-confirm.qml:32
86+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:284
87+#: qml/Greeter/NarrowView.qml:215 qml/Wizard/Pages/passcode-confirm.qml:32
8888#: qml/Wizard/Pages/passcode-set.qml:32
8989msgid "Cancel"
9090msgstr "İmtina"
@@ -106,33 +106,37 @@ msgstr "Yox"
106106msgid "Yes"
107107msgstr "Hə"
108108
109−#: qml/Components/Dialogs.qml:239
109+#: qml/Components/Dialogs.qml:243
110110msgctxt "Title: Power off/Restart dialog"
111111msgid "Power"
112112msgstr ""
113113
114−#: qml/Components/Dialogs.qml:240
114+#: qml/Components/Dialogs.qml:244
115115msgid ""
116116"Are you sure you would like\n"
117117"to power off?"
118118msgstr ""
119119
120−#: qml/Components/Dialogs.qml:244
120+#: qml/Components/Dialogs.qml:248
121121msgctxt "Button: Power off the system"
122122msgid "Power off"
123123msgstr ""
124124
125−#: qml/Components/Dialogs.qml:255
125+#: qml/Components/Dialogs.qml:263
126126msgctxt "Button: Restart the system"
127127msgid "Restart"
128128msgstr ""
129129
130+#: qml/Components/Dialogs.qml:276
131+msgid "Screenshot"
132+msgstr ""
133+
130134#: qml/Components/KeyboardShortcutsOverlay.qml:41
131135msgid "Keyboard Shortcuts"
132136msgstr ""
133137
134138#: qml/Components/KeyboardShortcutsOverlay.qml:55
135−msgid "Unity 8"
139+msgid "Lomiri"
136140msgstr ""
137141
138142#: qml/Components/KeyboardShortcutsOverlay.qml:62
@@ -219,18 +223,6 @@ msgstr ""
219223msgid "Opens the Application Drawer."
220224msgstr ""
221225
222−#: qml/Components/KeyboardShortcutsOverlay.qml:207
223−msgid "Scopes"
224−msgstr ""
225−
226−#: qml/Components/KeyboardShortcutsOverlay.qml:214
227−msgid "Super (Tap)"
228−msgstr ""
229−
230−#: qml/Components/KeyboardShortcutsOverlay.qml:219
231−msgid "Opens the Scopes home."
232−msgstr ""
233−
234226#: qml/Components/KeyboardShortcutsOverlay.qml:235
235227msgid "Switching"
236228msgstr ""
@@ -303,7 +295,7 @@ msgstr ""
303295msgid "Closes the current window."
304296msgstr ""
305297
306−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
298+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:235
307299msgid "Return to Call"
308300msgstr ""
309301
@@ -362,8 +354,10 @@ msgid ""
362354msgstr ""
363355
364356#: qml/Components/VirtualTouchPad.qml:327
357+#, fuzzy
358+#| msgid "Tap to return to call..."
365359msgid "Tap left button to click."
366−msgstr ""
360+msgstr "Zəngə qayıtmaq üçün toxunun..."
367361
368362#: qml/Components/VirtualTouchPad.qml:339
369363msgid "Tap right button to right click."
@@ -377,103 +371,6 @@ msgstr ""
377371msgid "Find more settings in the system settings."
378372msgstr ""
379373
380−#: qml/Dash/DashPageHeader.qml:361
381−msgctxt "Button: Open the Ubuntu Store"
382−msgid "Store"
383−msgstr ""
384−
385−#: qml/Dash/DashPageHeader.qml:368
386−msgctxt "Button: Start a search in the current dash scope"
387−msgid "Search"
388−msgstr ""
389−
390−#: qml/Dash/DashPageHeader.qml:378
391−msgctxt "Button: Show the current dash scope settings"
392−msgid "Settings"
393−msgstr ""
394−
395−#: qml/Dash/DashPageHeader.qml:385
396−msgid "Remove from Favorites"
397−msgstr "Seçilmişlәrdәn çıxart"
398−
399−#: qml/Dash/DashPageHeader.qml:385
400−msgid "Add to Favorites"
401−msgstr "Seçilmişlәrә әlavә et"
402−
403−#: qml/Dash/FiltersPopover.qml:61
404−msgid "Refine your results"
405−msgstr ""
406−
407−#: qml/Dash/FiltersPopover.qml:70
408−msgid "Reset"
409−msgstr ""
410−
411−#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
412−msgid "Show less"
413−msgstr ""
414−
415−#: qml/Dash/GenericScopeView.qml:547
416−msgid "Show all"
417−msgstr ""
418−
419−#: qml/Dash/GenericScopeView.qml:578
420−msgctxt "Label: Hint for dash search line edit"
421−msgid "Search"
422−msgstr ""
423−
424−#: qml/Dash/PageHeaderExtraPanel.qml:67
425−msgid "Recent Searches"
426−msgstr ""
427−
428−#: qml/Dash/PageHeaderExtraPanel.qml:78
429−msgid "Clear All"
430−msgstr ""
431−
432−#: qml/Dash/Previews/PreviewActionCombo.qml:36
433−msgid "More..."
434−msgstr "Daha çox..."
435−
436−#: qml/Dash/Previews/PreviewActionCombo.qml:36
437−msgid "Less..."
438−msgstr "Az..."
439−
440−#: qml/Dash/Previews/PreviewCommentInput.qml:83
441−#: qml/Dash/Previews/PreviewRatingInput.qml:202
442−msgid "Send"
443−msgstr "Göndər"
444−
445−#: qml/Dash/Previews/PreviewRatingInput.qml:109
446−msgid "Rate this"
447−msgstr "Qiymәtlәndir"
448−
449−#: qml/Dash/Previews/PreviewRatingInput.qml:184
450−msgid "Add a review"
451−msgstr "Rəy yaz"
452−
453−#: qml/Dash/PullToRefreshScopeStyle.qml:56
454−msgid "Pull to refresh…"
455−msgstr ""
456−
457−#: qml/Dash/PullToRefreshScopeStyle.qml:61
458−msgid "Release to refresh…"
459−msgstr ""
460−
461−#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
462−msgid "Enable location data"
463−msgstr ""
464−
465−#: qml/Dash/ScopesList.qml:146
466−msgid "Manage"
467−msgstr ""
468−
469−#: qml/Dash/ScopesList.qml:187
470−msgid "Home"
471−msgstr ""
472−
473−#: qml/Dash/ScopesList.qml:188
474−msgid "Also installed"
475−msgstr ""
476−
477374#: qml/Greeter/CoverPage.qml:127
478375msgid "Unlock"
479376msgstr ""
@@ -509,7 +406,7 @@ msgstr ""
509406msgid "Enter passcode to unlock"
510407msgstr ""
511408
512−#: qml/Greeter/NarrowView.qml:228
409+#: qml/Greeter/NarrowView.qml:235
513410msgid "Emergency"
514411msgstr ""
515412
@@ -525,17 +422,18 @@ msgstr ""
525422msgid "Select desktop environment"
526423msgstr ""
527424
528−#: qml/Launcher/Drawer.qml:94
425+#: qml/Launcher/Drawer.qml:250
426+#, fuzzy
427+#| msgid "Search"
529428msgid "Search…"
530−msgstr ""
429+msgstr "Axtar"
531430
532−#: qml/Launcher/Drawer.qml:129
533−msgctxt "Apps sorted alphabetically"
534−msgid "A-Z"
431+#: qml/Launcher/PullToRefreshScopeStyle.qml:56
432+msgid "Pull to refresh…"
535433msgstr ""
536434
537−#: qml/Launcher/MoreAppsHeader.qml:55
538−msgid "More apps in the store"
435+#: qml/Launcher/PullToRefreshScopeStyle.qml:61
436+msgid "Release to refresh…"
539437msgstr ""
540438
541439#: qml/Notifications/NotificationMenuItemFactory.qml:124
@@ -633,19 +531,25 @@ msgstr ""
633531msgid "Drag using 3 fingers any application from one window to the other"
634532msgstr ""
635533
534+#: qml/Stage/Stage.qml:671
535+msgid "No running apps"
536+msgstr ""
537+
636538#: qml/Tutorial/TutorialLeftLong.qml:49
539+#, fuzzy
540+#| msgid "Try swiping from the top edge to access the indicators"
637541msgid "Long swipe from the left edge to open the Application Drawer"
638−msgstr ""
542+msgstr "Göstəriciləri görmәk üçün yuxarı küncdən sürüşdürün"
639543
640544#: qml/Tutorial/TutorialLeft.qml:47
641545msgid "Short swipe from the left edge to open the launcher"
642546msgstr ""
643547
644−#: qml/Tutorial/TutorialRight.qml:55
548+#: qml/Tutorial/TutorialRight.qml:54
645549msgid "Push your mouse against the right edge to view your open apps"
646550msgstr ""
647551
648−#: qml/Tutorial/TutorialRight.qml:56
552+#: qml/Tutorial/TutorialRight.qml:55
649553msgid "Swipe from the right edge to view your open apps"
650554msgstr ""
651555
@@ -653,25 +557,42 @@ msgstr ""
653557msgid "Swipe from the top edge to access notifications and quick settings"
654558msgstr ""
655559
656−#: qml/Wizard/Page.qml:54
560+#: qml/Wizard/Page.qml:59
657561msgctxt "Button: Go back one page in the Wizard"
658562msgid "Back"
659563msgstr ""
660564
661−#: qml/Wizard/Pages/10-welcome.qml:28
565+#: qml/Wizard/Pages/10-welcome.qml:29
662566msgid "Language"
663567msgstr ""
664568
665−#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
666−#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
667−#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
668−#: qml/Wizard/Pages/70-passwd-type.qml:145
669−#: qml/Wizard/Pages/75-report-check.qml:84
670−#: qml/Wizard/Pages/passcode-desktop.qml:142
671−#: qml/Wizard/Pages/password-set.qml:142
569+#: qml/Wizard/Pages/10-welcome.qml:176
570+#: qml/Wizard/Pages/10-welcome-update.qml:126
571+#: qml/Wizard/Pages/11-changelog.qml:74 qml/Wizard/Pages/20-keyboard.qml:152
572+#: qml/Wizard/Pages/30-wifi.qml:214 qml/Wizard/Pages/50-timezone.qml:272
573+#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/70-passwd-type.qml:146
574+#: qml/Wizard/Pages/passcode-desktop.qml:154
575+#: qml/Wizard/Pages/password-set.qml:153
672576msgid "Next"
673577msgstr ""
674578
579+#: qml/Wizard/Pages/10-welcome-update.qml:91
580+msgid "Welcome to "
581+msgstr ""
582+
583+#: qml/Wizard/Pages/10-welcome-update.qml:106
584+msgid "We will make sure your device is ready to use "
585+msgstr ""
586+
587+#: qml/Wizard/Pages/11-changelog.qml:28
588+msgid "What's new"
589+msgstr ""
590+
591+#: qml/Wizard/Pages/11-changelog.qml:74
592+#, fuzzy
593+msgid "Loading..."
594+msgstr "Danışır..."
595+
675596#: qml/Wizard/Pages/20-keyboard.qml:31
676597msgid "Select Keyboard"
677598msgstr ""
@@ -684,64 +605,33 @@ msgstr ""
684605msgid "Keyboard layout"
685606msgstr ""
686607
687−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
688−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
608+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:214
609+#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/79-system-update.qml:144
610+#: qml/Wizard/Pages/sim.qml:101
689611msgid "Skip"
690612msgstr ""
691613
692−#: qml/Wizard/Pages/30-wifi.qml:30
614+#: qml/Wizard/Pages/30-wifi.qml:31
693615msgid "Connect to Wi‑Fi"
694616msgstr ""
695617
696−#: qml/Wizard/Pages/30-wifi.qml:131
618+#: qml/Wizard/Pages/30-wifi.qml:139
697619msgid "Connected"
698620msgstr ""
699621
700−#: qml/Wizard/Pages/30-wifi.qml:164
622+#: qml/Wizard/Pages/30-wifi.qml:172
701623msgid "Available Wi-Fi networks"
702624msgstr ""
703625
704−#: qml/Wizard/Pages/30-wifi.qml:165
626+#: qml/Wizard/Pages/30-wifi.qml:173
705627msgid "No available Wi-Fi networks"
706628msgstr ""
707629
708−#: qml/Wizard/Pages/40-location.qml:27
709−msgid "Location Services"
710−msgstr ""
711−
712−#: qml/Wizard/Pages/40-location.qml:83
713−msgid ""
714−"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
715−"(recommended)"
716−msgstr ""
717−
718−#: qml/Wizard/Pages/40-location.qml:105
719−#, qt-format
720−msgid "By selecting this option you agree to the Nokia HERE %1."
721−msgstr ""
722−
723−#: qml/Wizard/Pages/40-location.qml:106
724−msgctxt "part of: Nokia HERE terms and conditions"
725−msgid "terms and conditions"
726−msgstr ""
727−
728−#: qml/Wizard/Pages/40-location.qml:160
729−msgid "GPS only"
730−msgstr ""
731−
732−#: qml/Wizard/Pages/40-location.qml:214
733−msgid "Don't use my location"
734−msgstr ""
735−
736−#: qml/Wizard/Pages/40-location.qml:260
737−msgid "You can change it later in System Settings."
738−msgstr ""
739−
740630#: qml/Wizard/Pages/50-timezone.qml:30
741631msgid "Time Zone"
742632msgstr ""
743633
744−#: qml/Wizard/Pages/50-timezone.qml:182
634+#: qml/Wizard/Pages/50-timezone.qml:183
745635msgid "Enter your city"
746636msgstr ""
747637
@@ -749,7 +639,7 @@ msgstr ""
749639msgid "Personalize Your Device"
750640msgstr ""
751641
752−#: qml/Wizard/Pages/60-account.qml:48
642+#: qml/Wizard/Pages/60-account.qml:54
753643msgid "Preferred Name"
754644msgstr ""
755645
@@ -757,81 +647,72 @@ msgstr ""
757647msgid "Lock Screen"
758648msgstr ""
759649
760−#: qml/Wizard/Pages/70-passwd-type.qml:102
650+#: qml/Wizard/Pages/70-passwd-type.qml:103
761651msgctxt "Label: Type of security method"
762652msgid "Create new password"
763653msgstr ""
764654
765−#: qml/Wizard/Pages/70-passwd-type.qml:104
655+#: qml/Wizard/Pages/70-passwd-type.qml:105
766656msgctxt "Label: Type of security method"
767657msgid "Create passcode (numbers only)"
768658msgstr ""
769659
770−#: qml/Wizard/Pages/70-passwd-type.qml:106
660+#: qml/Wizard/Pages/70-passwd-type.qml:107
771661msgctxt "Label: Type of security method"
772662msgid "No lock code"
773663msgstr ""
774664
775−#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
776−msgid "Privacy Policy"
777−msgstr ""
778−
779−#: qml/Wizard/Pages/75-report-check.qml:26
780−msgid "Help Us Improve"
781−msgstr ""
782−
783−#: qml/Wizard/Pages/75-report-check.qml:59
784−msgid "Improve system performance by sending us crashes and error reports."
665+#: qml/Wizard/Pages/79-system-update.qml:28
666+msgid "Update Device"
785667msgstr ""
786668
787−#: qml/Wizard/Pages/75-report-check.qml:60
788−msgid "Privacy policy"
669+#: qml/Wizard/Pages/79-system-update.qml:55
670+msgid ""
671+"There is a system update available and ready to install. Afterwards, the "
672+"device will automatically restart."
789673msgstr ""
790674
791−#: qml/Wizard/Pages/80-finished.qml:89
792−msgid "Welcome to Ubuntu"
675+#: qml/Wizard/Pages/79-system-update.qml:76
676+msgctxt "string identifying name of the update"
677+msgid "Ubuntu Touch system"
793678msgstr ""
794679
795−#: qml/Wizard/Pages/80-finished.qml:104
796−msgid "You are ready to use your device now"
680+#: qml/Wizard/Pages/79-system-update.qml:83
681+#, qt-format
682+msgctxt "version of the system update"
683+msgid "Version %1"
797684msgstr ""
798685
799−#: qml/Wizard/Pages/80-finished.qml:124
800−msgid "Get Started"
686+#: qml/Wizard/Pages/79-system-update.qml:95
687+msgid "This could take a few minutes..."
801688msgstr ""
802689
803−#: qml/Wizard/Pages/here-terms.qml:25
804−msgid "Terms & Conditions"
690+#: qml/Wizard/Pages/79-system-update.qml:109
691+msgid "Install and restart now"
805692msgstr ""
806693
807−#: qml/Wizard/Pages/here-terms.qml:69
808−msgid "Your device uses positioning technologies provided by HERE."
694+#: qml/Wizard/Pages/80-finished.qml:91
695+msgid "Welcome Back"
809696msgstr ""
810697
811−#: qml/Wizard/Pages/here-terms.qml:81
812−msgid ""
813−"To provide you with positioning services and to improve their quality, HERE "
814−"collects information about nearby cell towers and Wi-Fi hotspots around your "
815−"current location whenever your position is being found."
698+#: qml/Wizard/Pages/80-finished.qml:91
699+msgid "Welcome to Ubuntu"
816700msgstr ""
817701
818−#: qml/Wizard/Pages/here-terms.qml:93
819−msgid ""
820−"The information collected is used to analyze the service and to improve the "
821−"use of service, but not to identify you personally."
702+#: qml/Wizard/Pages/80-finished.qml:106
703+msgid "You are ready to use your device now"
822704msgstr ""
823705
824−#: qml/Wizard/Pages/here-terms.qml:106
825−#, qt-format
826−msgid "By continuing, you agree to the HERE platform %1 and %2."
706+#: qml/Wizard/Pages/80-finished.qml:126
707+msgid "Continue"
827708msgstr ""
828709
829−#: qml/Wizard/Pages/here-terms.qml:107
830−msgid "Service Terms"
710+#: qml/Wizard/Pages/80-finished.qml:126
711+msgid "Get Started"
831712msgstr ""
832713
833714#: qml/Wizard/Pages/passcode-confirm.qml:43
834−#: qml/Wizard/Pages/passcode-desktop.qml:97
715+#: qml/Wizard/Pages/passcode-desktop.qml:104
835716msgid "Confirm passcode"
836717msgstr ""
837718
@@ -848,24 +729,24 @@ msgstr ""
848729msgid "Lock Screen Passcode"
849730msgstr ""
850731
851−#: qml/Wizard/Pages/passcode-desktop.qml:61
732+#: qml/Wizard/Pages/passcode-desktop.qml:68
852733msgid "Enter 4 numbers to setup your passcode"
853734msgstr ""
854735
855−#: qml/Wizard/Pages/passcode-desktop.qml:77
736+#: qml/Wizard/Pages/passcode-desktop.qml:84
856737#: qml/Wizard/Pages/passcode-set.qml:54
857738msgid "Choose passcode"
858739msgstr ""
859740
860−#: qml/Wizard/Pages/passcode-desktop.qml:127
741+#: qml/Wizard/Pages/passcode-desktop.qml:139
861742msgid "Passcode too short"
862743msgstr ""
863744
864−#: qml/Wizard/Pages/passcode-desktop.qml:129
745+#: qml/Wizard/Pages/passcode-desktop.qml:141
865746msgid "Passcodes match"
866747msgstr ""
867748
868−#: qml/Wizard/Pages/passcode-desktop.qml:131
749+#: qml/Wizard/Pages/passcode-desktop.qml:143
869750msgid "Passcodes do not match"
870751msgstr ""
871752
@@ -877,15 +758,15 @@ msgstr ""
877758msgid "Lock Screen Password"
878759msgstr ""
879760
880−#: qml/Wizard/Pages/password-set.qml:62
761+#: qml/Wizard/Pages/password-set.qml:68
881762msgid "Enter at least 8 characters"
882763msgstr ""
883764
884−#: qml/Wizard/Pages/password-set.qml:74
765+#: qml/Wizard/Pages/password-set.qml:80
885766msgid "Choose password"
886767msgstr ""
887768
888−#: qml/Wizard/Pages/password-set.qml:104
769+#: qml/Wizard/Pages/password-set.qml:110
889770msgid "Confirm password"
890771msgstr ""
891772
@@ -941,12 +822,42 @@ msgstr ""
941822msgid "Very weak password"
942823msgstr ""
943824
825+#~ msgid "Remove from Favorites"
826+#~ msgstr "Seçilmişlәrdәn çıxart"
827+
828+#~ msgid "Add to Favorites"
829+#~ msgstr "Seçilmişlәrә әlavә et"
830+
831+#~ msgid "More..."
832+#~ msgstr "Daha çox..."
833+
834+#~ msgid "Less..."
835+#~ msgstr "Az..."
836+
837+#~ msgid "Send"
838+#~ msgstr "Göndər"
839+
840+#~ msgid "Rate this"
841+#~ msgstr "Qiymәtlәndir"
842+
843+#~ msgid "Add a review"
844+#~ msgstr "Rəy yaz"
845+
846+#, fuzzy
847+#~ msgid "Please wait..."
848+#~ msgstr "Yüklənir. Zəhmət olmasa, gözləyin..."
849+
850+#, fuzzy
851+#~ msgid "Download"
852+#~ msgstr "Endirilir"
853+
854+#, fuzzy
855+#~ msgid "Downloaded"
856+#~ msgstr "Endirilir"
857+
944858#~ msgid "Confirm"
945859#~ msgstr "Təsdiqlə"
946860
947−#~ msgid "Search"
948−#~ msgstr "Axtar"
949−
950861#~ msgid "Top edge"
951862#~ msgstr "Yuxarı künc"
952863
@@ -962,12 +873,6 @@ msgstr ""
962873#~ msgid "Right edge"
963874#~ msgstr "Sağ Künc"
964875
965−#~ msgid "Speaking..."
966−#~ msgstr "Danışır..."
967−
968−#~ msgid "Loading. Please Wait..."
969−#~ msgstr "Yüklənir. Zəhmət olmasa, gözləyin..."
970−
971876#~ msgid "Speak Now..."
972877#~ msgstr "Danışın..."
973878
@@ -1003,18 +908,18 @@ msgstr ""
1003908#~ msgstr "Bu sizin son cəhdiniz olacaq."
1004909
1005910#~ msgid ""
1006−#~ "If passcode is entered incorrectly, your phone will conduct a factory reset "
1007−#~ "and all personal data will be deleted."
911+#~ "If passcode is entered incorrectly, your phone will conduct a factory "
912+#~ "reset and all personal data will be deleted."
1008913#~ msgstr ""
1009−#~ "Əgər açar kod yanlış daxil edilibsə, onda telefonunuz fabrika parametrlərinə "
1010−#~ "geri qayıdacaq və bütün şəxsi məlumatlarınız silinəcək."
914+#~ "Əgər açar kod yanlış daxil edilibsə, onda telefonunuz fabrika "
915+#~ "parametrlərinə geri qayıdacaq və bütün şəxsi məlumatlarınız silinəcək."
1011916
1012917#~ msgid ""
1013918#~ "If passphrase is entered incorrectly, your phone will conduct a factory "
1014919#~ "reset and all personal data will be deleted."
1015920#~ msgstr ""
1016−#~ "Əgər açar söz yanlış daxil edilibsə, onda telefonunuz fabrika parametrlərinə "
1017−#~ "geri qayıdacaq və bütün şəxsi məlumatlarınız silinəcək."
921+#~ "Əgər açar söz yanlış daxil edilibsə, onda telefonunuz fabrika "
922+#~ "parametrlərinə geri qayıdacaq və bütün şəxsi məlumatlarınız silinəcək."
1018923
1019924#~ msgid "Log out"
1020925#~ msgstr "Çıxış"
@@ -1028,9 +933,6 @@ msgstr ""
1028933#~ msgid "Reboot"
1029934#~ msgstr "Yenidən yüklə"
1030935
1031−#~ msgid "Try swiping from the top edge to access the indicators"
1032−#~ msgstr "Göstəriciləri görmәk üçün yuxarı küncdən sürüşdürün"
1033−
1034936#~ msgid "Skip intro"
1035937#~ msgstr "Tәqdimatı keç"
1036938
@@ -1059,7 +961,6 @@ msgstr ""
1059961#~ msgid "Sorry, incorrect passphrase"
1060962#~ msgstr "Bağışlayın, açar söz yanlışdır"
1061963
1062−#, qt-format
1063964#~ msgid "Sorry, incorrect %1"
1064965#~ msgstr "Bağışlayın, %1 yanlışdır"
1065966
po/be.po+374−433
@@ -6,72 +6,74 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2017-04-04 22:56+0000\n"
11−"PO-Revision-Date: 2015-12-13 13:12+0000\n"
12−"Last-Translator: Mikhail_SaTuRn <mikhail_saturn@tut.by>\n"
13−"Language-Team: Belarusian <be@li.org>\n"
9+"Report-Msgid-Bugs-To: \n"
10+"POT-Creation-Date: 2021-01-29 11:42-0600\n"
11+"PO-Revision-Date: 2021-03-07 20:28+0000\n"
12+"Last-Translator: Zmicer <nashtlumach@gmail.com>\n"
13+"Language-Team: Belarusian <https://translate.ubports.com/projects/ubports/"
14+"lomiri/be/>\n"
15+"Language: be\n"
1416"MIME-Version: 1.0\n"
1517"Content-Type: text/plain; charset=UTF-8\n"
1618"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18−"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
19−"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
20−"X-Generator: Launchpad (build 18343)\n"
19+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
20+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
21+"X-Generator: Weblate 3.11.3\n"
22+"X-Launchpad-Export-Date: 2016-11-23 06:34+0000\n"
2123
22−#: plugins/LightDM/Greeter.cpp:188
24+#: plugins/LightDM/Greeter.cpp:199
2325msgid "Password: "
2426msgstr "Пароль: "
2527
26−#: plugins/LightDM/Greeter.cpp:203
28+#: plugins/LightDM/Greeter.cpp:214
2729msgid "Username"
28−msgstr ""
30+msgstr "Імя карыстальніка"
2931
30−#: plugins/LightDM/Greeter.cpp:242
32+#: plugins/LightDM/Greeter.cpp:258
3133msgid "Failed to authenticate"
32−msgstr ""
34+msgstr "Не атрымалася выканаць аўтэнтыфікацыю"
3335
34−#: plugins/LightDM/Greeter.cpp:244
36+#: plugins/LightDM/Greeter.cpp:260
3537msgid "Invalid password, please try again"
36−msgstr ""
38+msgstr "Хібны пароль, паспрабуйце яшчэ раз"
3739
38−#: plugins/LightDM/Greeter.cpp:254
40+#: plugins/LightDM/Greeter.cpp:270
3941msgid "Log In"
40−msgstr ""
42+msgstr "Увайсці"
4143
42−#: plugins/LightDM/Greeter.cpp:254
44+#: plugins/LightDM/Greeter.cpp:270
4345msgid "Retry"
4446msgstr "Паспрабаваць зноў"
4547
4648#: plugins/LightDM/UsersModel.cpp:157
4749msgid "Login"
48−msgstr ""
50+msgstr "Увайсці"
4951
5052#: plugins/LightDM/UsersModel.cpp:165
5153msgid "Guest Session"
52−msgstr ""
54+msgstr "Гасцявы сеанс"
5355
54−#: plugins/Unity/Launcher/launcheritem.cpp:49
55−#: plugins/Unity/Launcher/launcheritem.cpp:123
56+#: plugins/Unity/Launcher/launcheritem.cpp:48
57+#: plugins/Unity/Launcher/launcheritem.cpp:122
5658msgid "Pin shortcut"
57−msgstr "Замацаваць кнопку"
59+msgstr "Замацаваць цэтлік"
5860
59−#: plugins/Unity/Launcher/launcheritem.cpp:55
61+#: plugins/Unity/Launcher/launcheritem.cpp:54
6062msgid "Quit"
6163msgstr "Выйсці"
6264
63−#: plugins/Unity/Launcher/launcheritem.cpp:123
65+#: plugins/Unity/Launcher/launcheritem.cpp:122
6466msgid "Unpin shortcut"
65−msgstr "Адмацаваць кнопку"
67+msgstr "Адмацаваць цэтлік"
6668
6769#: qml/Components/Dialogs.qml:176
6870msgctxt "Title: Lock/Log out dialog"
6971msgid "Log out"
70−msgstr "Выйсці"
72+msgstr "Завяршыць сеанс"
7173
7274#: qml/Components/Dialogs.qml:177
7375msgid "Are you sure you want to log out?"
74−msgstr "Вы ўпэўненыя, што хочаце выйсці?"
76+msgstr "Сапраўды завяршыць сеанс?"
7577
7678#: qml/Components/Dialogs.qml:180
7779msgctxt "Button: Lock the system"
@@ -83,9 +85,8 @@ msgctxt "Button: Log out from the system"
8385msgid "Log Out"
8486msgstr "Выйсці"
8587
86−#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
87−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
88−#: qml/Wizard/Pages/passcode-confirm.qml:32
88+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:284
89+#: qml/Greeter/NarrowView.qml:215 qml/Wizard/Pages/passcode-confirm.qml:32
8990#: qml/Wizard/Pages/passcode-set.qml:32
9091msgid "Cancel"
9192msgstr "Скасаваць"
@@ -97,7 +98,7 @@ msgstr "Перазагрузіць"
9798
9899#: qml/Components/Dialogs.qml:212
99100msgid "Are you sure you want to reboot?"
100−msgstr "Вы ўпэўнены, што жадаеце перазагрузіць?"
101+msgstr "Сапраўды хочаце перазагрузіць сістэму?"
101102
102103#: qml/Components/Dialogs.qml:215
103104msgid "No"
@@ -107,212 +108,206 @@ msgstr "Не"
107108msgid "Yes"
108109msgstr "Так"
109110
110−#: qml/Components/Dialogs.qml:239
111+#: qml/Components/Dialogs.qml:243
111112msgctxt "Title: Power off/Restart dialog"
112113msgid "Power"
113114msgstr "Сілкаванне"
114115
115−#: qml/Components/Dialogs.qml:240
116+#: qml/Components/Dialogs.qml:244
116117msgid ""
117118"Are you sure you would like\n"
118119"to power off?"
119120msgstr ""
120−"Вы ўпэўнены, што хочаце\n"
121−"выключыць камп'ютэр?"
121+"Сапраўды хочаце\n"
122+"выключыць?"
122123
123−#: qml/Components/Dialogs.qml:244
124+#: qml/Components/Dialogs.qml:248
124125msgctxt "Button: Power off the system"
125126msgid "Power off"
126127msgstr "Выключыць"
127128
128−#: qml/Components/Dialogs.qml:255
129+#: qml/Components/Dialogs.qml:263
129130msgctxt "Button: Restart the system"
130131msgid "Restart"
131−msgstr "Перазапуск"
132+msgstr "Перазапусціць"
133+
134+#: qml/Components/Dialogs.qml:276
135+#, fuzzy
136+#| msgid "Takes a screenshot."
137+msgid "Screenshot"
138+msgstr "Здымак экрана."
132139
133140#: qml/Components/KeyboardShortcutsOverlay.qml:41
134141msgid "Keyboard Shortcuts"
135−msgstr ""
142+msgstr "Спалучэнні клавіш"
136143
137144#: qml/Components/KeyboardShortcutsOverlay.qml:55
138−msgid "Unity 8"
145+msgid "Lomiri"
139146msgstr ""
140147
141148#: qml/Components/KeyboardShortcutsOverlay.qml:62
142149msgid "PrtScr"
143−msgstr ""
150+msgstr "PrtScr"
144151
145152#: qml/Components/KeyboardShortcutsOverlay.qml:67
146153msgid "Takes a screenshot."
147−msgstr ""
154+msgstr "Здымак экрана."
148155
149156#: qml/Components/KeyboardShortcutsOverlay.qml:75
150157msgid "Alt + PrtScr"
151−msgstr ""
158+msgstr "Alt + PrtScr"
152159
153160#: qml/Components/KeyboardShortcutsOverlay.qml:80
154161msgid "Takes a screenshot of the current window."
155−msgstr ""
162+msgstr "Робіць здымак экрана бягучага акна."
156163
157164#: qml/Components/KeyboardShortcutsOverlay.qml:88
158165msgid "Super + Space"
159−msgstr ""
166+msgstr "Super + Прагал"
160167
161168#: qml/Components/KeyboardShortcutsOverlay.qml:93
162169msgid "Switches to next keyboard layout."
163−msgstr ""
170+msgstr "Пераключыцца на наступную раскладку клавіятуры."
164171
165172#: qml/Components/KeyboardShortcutsOverlay.qml:101
166173msgid "Super + Shift + Space"
167−msgstr ""
174+msgstr "Super + Shift + Прагал"
168175
169176#: qml/Components/KeyboardShortcutsOverlay.qml:106
170177msgid "Switches to previous keyboard layout."
171−msgstr ""
178+msgstr "Пераключыцца на папярэднюю раскладку клавіятуры."
172179
173180#: qml/Components/KeyboardShortcutsOverlay.qml:114
174181msgid "Ctrl + Alt + T"
175−msgstr ""
182+msgstr "Ctrl + Alt + T"
176183
177184#: qml/Components/KeyboardShortcutsOverlay.qml:119
178185msgid "Starts the Terminal application."
179−msgstr ""
186+msgstr "Запускае тэрмінал."
180187
181188#: qml/Components/KeyboardShortcutsOverlay.qml:131
182189msgid "Launcher"
183−msgstr ""
190+msgstr "Панэль запуску"
184191
185192#: qml/Components/KeyboardShortcutsOverlay.qml:138
186193msgid "Super (Hold)"
187−msgstr ""
194+msgstr "Super (утрыманне)"
188195
189196#: qml/Components/KeyboardShortcutsOverlay.qml:143
190197msgid "Opens the launcher, displays shortcuts."
191−msgstr ""
198+msgstr "Адкрывае панэль запуску, паказвае спалучэнні клавіш."
192199
193200#: qml/Components/KeyboardShortcutsOverlay.qml:151
194201msgid "Alt + F1"
195−msgstr ""
202+msgstr "Alt + F1"
196203
197204#: qml/Components/KeyboardShortcutsOverlay.qml:156
198205msgid "Opens launcher keyboard navigation mode."
199−msgstr ""
206+msgstr "Актывуе рэжым навігацыі па панэлі запуску з клавіятуры."
200207
201208#: qml/Components/KeyboardShortcutsOverlay.qml:164
202209msgid "Super + Tab"
203−msgstr ""
210+msgstr "Super + Tab"
204211
205212#: qml/Components/KeyboardShortcutsOverlay.qml:169
206213msgid "Switches applications via the launcher."
207−msgstr ""
214+msgstr "Пераключае праграмы праз панэль запуску."
208215
209216#: qml/Components/KeyboardShortcutsOverlay.qml:177
210217msgid "Super + 1 to 0"
211−msgstr ""
218+msgstr "Super + лічба ад 1 да 0"
212219
213220#: qml/Components/KeyboardShortcutsOverlay.qml:182
214221msgid "Same as clicking on a launcher icon."
215−msgstr ""
222+msgstr "Адпаведнік націскання на значок запуску."
216223
217224#: qml/Components/KeyboardShortcutsOverlay.qml:190
218225msgid "Super + A"
219−msgstr ""
226+msgstr "Super + A"
220227
221228#: qml/Components/KeyboardShortcutsOverlay.qml:195
222229msgid "Opens the Application Drawer."
223−msgstr ""
224−
225−#: qml/Components/KeyboardShortcutsOverlay.qml:207
226−msgid "Scopes"
227−msgstr ""
228−
229−#: qml/Components/KeyboardShortcutsOverlay.qml:214
230−msgid "Super (Tap)"
231−msgstr ""
232−
233−#: qml/Components/KeyboardShortcutsOverlay.qml:219
234−msgid "Opens the Scopes home."
235−msgstr ""
230+msgstr "Адкрывае спіс усталяваных праграм."
236231
237232#: qml/Components/KeyboardShortcutsOverlay.qml:235
238233msgid "Switching"
239−msgstr ""
234+msgstr "Пераключэнне"
240235
241236#: qml/Components/KeyboardShortcutsOverlay.qml:242
242237msgid "Alt + Tab"
243−msgstr ""
238+msgstr "Alt + Tab"
244239
245240#: qml/Components/KeyboardShortcutsOverlay.qml:247
246241msgid "Switches between applications."
247−msgstr ""
242+msgstr "Пераключэнне паміж праграмамі."
248243
249244#: qml/Components/KeyboardShortcutsOverlay.qml:255
250245msgid "Super + W"
251−msgstr ""
246+msgstr "Super + W"
252247
253248#: qml/Components/KeyboardShortcutsOverlay.qml:260
254249msgid "Opens the desktop spread."
255−msgstr ""
250+msgstr "Адкрывае працоўны стол."
256251
257252#: qml/Components/KeyboardShortcutsOverlay.qml:268
258253msgid "Cursor Left or Right"
259−msgstr ""
254+msgstr "Улева ці ўправа"
260255
261256#: qml/Components/KeyboardShortcutsOverlay.qml:273
262257msgid "Moves the focus."
263−msgstr ""
258+msgstr "Перамяшчае фокус."
264259
265260#: qml/Components/KeyboardShortcutsOverlay.qml:285
266261msgid "Windows"
267−msgstr ""
262+msgstr "Вокны"
268263
269264#: qml/Components/KeyboardShortcutsOverlay.qml:292
270265msgid "Ctrl + Super + D"
271−msgstr ""
266+msgstr "Ctrl + Super + D"
272267
273268#: qml/Components/KeyboardShortcutsOverlay.qml:297
274269msgid "Minimizes all windows."
275−msgstr ""
270+msgstr "Згарнуць усе вокны."
276271
277272#: qml/Components/KeyboardShortcutsOverlay.qml:305
278273msgid "Ctrl + Super + Up"
279−msgstr ""
274+msgstr "Ctrl + Super + уверх"
280275
281276#: qml/Components/KeyboardShortcutsOverlay.qml:310
282277msgid "Maximizes the current window."
283−msgstr ""
278+msgstr "Разгарнуць бягучае акно."
284279
285280#: qml/Components/KeyboardShortcutsOverlay.qml:318
286281msgid "Ctrl + Super + Down"
287−msgstr ""
282+msgstr "Ctrl + Super + уніз"
288283
289284#: qml/Components/KeyboardShortcutsOverlay.qml:323
290285msgid "Minimizes or restores the current window."
291−msgstr ""
286+msgstr "Згарнуць альбо аднавіць бягучае акно."
292287
293288#: qml/Components/KeyboardShortcutsOverlay.qml:331
294289msgid "Ctrl + Super + Left or Right"
295−msgstr ""
290+msgstr "Ctrl + Super + улева ці ўправа"
296291
297292#: qml/Components/KeyboardShortcutsOverlay.qml:336
298293msgid "Semi-maximizes the current window."
299−msgstr ""
294+msgstr "Разгортвае бягучае акно напалову."
300295
301296#: qml/Components/KeyboardShortcutsOverlay.qml:344
302297msgid "Alt + F4"
303−msgstr ""
298+msgstr "Alt + F4"
304299
305300#: qml/Components/KeyboardShortcutsOverlay.qml:349
306301msgid "Closes the current window."
307−msgstr ""
302+msgstr "Закрывае бягучае акно."
308303
309−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
304+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:235
310305msgid "Return to Call"
311306msgstr "Вярнуцца да выкліку"
312307
313308#: qml/Components/Lockscreen.qml:212
314309msgid "Emergency Call"
315−msgstr "Терміновы выклік"
310+msgstr "Экстраны выклік"
316311
317312#: qml/Components/Lockscreen.qml:245
318313msgid "OK"
@@ -321,26 +316,28 @@ msgstr "Добра"
321316#: qml/Components/MediaServices/VideoPlayerControls.qml:44
322317#, qt-format
323318msgid "%1:%2:%3"
324−msgstr ""
319+msgstr "%1:%2:%3"
325320
326321#: qml/Components/MediaServices/VideoPlayerControls.qml:49
327322#, qt-format
328323msgid "%1:%2"
329−msgstr ""
324+msgstr "%1:%2"
330325
331326#: qml/Components/ModeSwitchWarningDialog.qml:33
332327msgid "Apps may have unsaved data:"
333−msgstr "Прылады могуць мець незахованыя дадзеныя:"
328+msgstr "У праграм могуць быць незахаваныя даныя:"
334329
335330#: qml/Components/ModeSwitchWarningDialog.qml:60
336331msgctxt ""
337332"Re-dock means connect the device again to an external screen/mouse/keyboard"
338333msgid "Re-dock, save your work and close these apps to continue."
339334msgstr ""
335+"Перападлучыцеся, захавайце вынікі працы і закрыйце вокны праграм, каб "
336+"працягнуць."
340337
341338#: qml/Components/ModeSwitchWarningDialog.qml:67
342339msgid "Or force close now (unsaved data will be lost)."
343−msgstr "Прымусіць зачыніць (незахаваныя дадзеныя будуць страчаны)."
340+msgstr "Альбо закрыйце прымусова (незахаваныя даныя страцяцца)."
344341
345342#: qml/Components/ModeSwitchWarningDialog.qml:80
346343msgid "OK, I will reconnect"
@@ -352,130 +349,35 @@ msgstr "Перападлучыцца зараз!"
352349
353350#: qml/Components/ModeSwitchWarningDialog.qml:94
354351msgid "Close all"
355−msgstr "Зачыніць усё"
352+msgstr "Закрыць усе"
356353
357354#: qml/Components/SharingPicker.qml:54
358355msgid "Preview Share Item"
359−msgstr "Праглядзець элемент"
356+msgstr "Папярэдні прагляд"
360357
361358#: qml/Components/VirtualTouchPad.qml:317
362359msgid ""
363360"Your device is now connected to an external display. Use this screen as a "
364361"touch pad to interact with the pointer."
365362msgstr ""
363+"Ваша прылада падлучаная да вонкавага дысплея. Выкарыстоўвайце гэты экран як "
364+"сэнсарную панэль для кіравання курсорам."
366365
367366#: qml/Components/VirtualTouchPad.qml:327
368367msgid "Tap left button to click."
369−msgstr ""
368+msgstr "Націсніце левую кнопку, каб пстрыкнуць."
370369
371370#: qml/Components/VirtualTouchPad.qml:339
372371msgid "Tap right button to right click."
373−msgstr ""
372+msgstr "Націсніце правую кнопку, каб пстрыкнуць правай клавішай мышы."
374373
375374#: qml/Components/VirtualTouchPad.qml:351
376375msgid "Swipe with two fingers to scroll."
377−msgstr ""
376+msgstr "Правядзіце двума пальцамі, каб пракруціць."
378377
379378#: qml/Components/VirtualTouchPad.qml:396
380379msgid "Find more settings in the system settings."
381−msgstr ""
382−
383−#: qml/Dash/DashPageHeader.qml:361
384−msgctxt "Button: Open the Ubuntu Store"
385−msgid "Store"
386−msgstr "Крама"
387−
388−#: qml/Dash/DashPageHeader.qml:368
389−msgctxt "Button: Start a search in the current dash scope"
390−msgid "Search"
391−msgstr "Пошук"
392−
393−#: qml/Dash/DashPageHeader.qml:378
394−msgctxt "Button: Show the current dash scope settings"
395−msgid "Settings"
396−msgstr "Налады"
397−
398−#: qml/Dash/DashPageHeader.qml:385
399−msgid "Remove from Favorites"
400−msgstr "Выдаліць з абранага"
401−
402−#: qml/Dash/DashPageHeader.qml:385
403−msgid "Add to Favorites"
404−msgstr "Дадаць да абранага"
405−
406−#: qml/Dash/FiltersPopover.qml:61
407−msgid "Refine your results"
408−msgstr ""
409−
410−#: qml/Dash/FiltersPopover.qml:70
411−msgid "Reset"
412−msgstr ""
413−
414−#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
415−msgid "Show less"
416−msgstr ""
417−
418−#: qml/Dash/GenericScopeView.qml:547
419−msgid "Show all"
420−msgstr ""
421−
422−#: qml/Dash/GenericScopeView.qml:578
423−msgctxt "Label: Hint for dash search line edit"
424−msgid "Search"
425−msgstr "Пошук"
426−
427−#: qml/Dash/PageHeaderExtraPanel.qml:67
428−msgid "Recent Searches"
429−msgstr ""
430−
431−#: qml/Dash/PageHeaderExtraPanel.qml:78
432−msgid "Clear All"
433−msgstr ""
434−
435−#: qml/Dash/Previews/PreviewActionCombo.qml:36
436−msgid "More..."
437−msgstr "Болей…"
438−
439−#: qml/Dash/Previews/PreviewActionCombo.qml:36
440−msgid "Less..."
441−msgstr "Менш..."
442−
443−#: qml/Dash/Previews/PreviewCommentInput.qml:83
444−#: qml/Dash/Previews/PreviewRatingInput.qml:202
445−msgid "Send"
446−msgstr "Адправіць"
447−
448−#: qml/Dash/Previews/PreviewRatingInput.qml:109
449−msgid "Rate this"
450−msgstr "Ацаніць"
451−
452−#: qml/Dash/Previews/PreviewRatingInput.qml:184
453−msgid "Add a review"
454−msgstr "Дадаць рэцэнзію"
455−
456−#: qml/Dash/PullToRefreshScopeStyle.qml:56
457−msgid "Pull to refresh…"
458−msgstr "Пацягніце для абнаўлення..."
459−
460−#: qml/Dash/PullToRefreshScopeStyle.qml:61
461−msgid "Release to refresh…"
462−msgstr "Адпусціце для абнаўлення..."
463−
464−#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
465−msgid "Enable location data"
466−msgstr "Уключыць дадзеныя аб месцазнаходжанні"
467−
468−#: qml/Dash/ScopesList.qml:146
469−msgid "Manage"
470−msgstr "Кіраванне"
471−
472−#: qml/Dash/ScopesList.qml:187
473−msgid "Home"
474−msgstr "Хатняя папка"
475−
476−#: qml/Dash/ScopesList.qml:188
477−msgid "Also installed"
478−msgstr "Таксама ўсталявана"
380+msgstr "Больш налад можна знайсці ў сістэмных наладах."
479381
480382#: qml/Greeter/CoverPage.qml:127
481383msgid "Unlock"
@@ -488,12 +390,13 @@ msgstr "Прылада заблакаваная"
488390#: qml/Greeter/DelayedLockscreen.qml:58
489391msgid "You have been locked out due to too many failed passphrase attempts."
490392msgstr ""
491−"Вы былі заблакаваныя з-за занадта вялікай колькасці няўдалых спробаў."
393+"Вы былі заблакаваныя праз занадта вялікую колькасць няўдалых спробаў уводу "
394+"пароля."
492395
493396#: qml/Greeter/DelayedLockscreen.qml:59
494397msgid "You have been locked out due to too many failed passcode attempts."
495398msgstr ""
496−"Вы былі заблакаваныя з-за занадта вялікай колькасці няўдалых спробаў уводу "
399+"Вы былі заблакаваныя праз занадта вялікую колькасць няўдалых спробаў уводу "
497400"кода доступу."
498401
499402#: qml/Greeter/DelayedLockscreen.qml:68
@@ -506,44 +409,43 @@ msgstr[2] "Пачакайце %1 хвілін і паўтарыце спробу
506409
507410#: qml/Greeter/Greeter.qml:550
508411msgid "Try again"
509−msgstr ""
412+msgstr "Паспрабаваць зноў"
510413
511414#: qml/Greeter/Greeter.qml:551
512415msgid "Enter passphrase to unlock"
513−msgstr ""
416+msgstr "Увядзіце парольную фразу, каб разблакаваць"
514417
515418#: qml/Greeter/Greeter.qml:552
516419msgid "Enter passcode to unlock"
517−msgstr ""
420+msgstr "Увядзіце код доступу, каб разблакаваць"
518421
519−#: qml/Greeter/NarrowView.qml:228
422+#: qml/Greeter/NarrowView.qml:235
520423msgid "Emergency"
521−msgstr ""
424+msgstr "Экстраны выклік"
522425
523426#: qml/Greeter/PromptList.qml:126
524427msgid "Passphrase"
525−msgstr ""
428+msgstr "Парольная фраза"
526429
527430#: qml/Greeter/PromptList.qml:126
528431msgid "Passcode"
529−msgstr ""
432+msgstr "Код доступу"
530433
531434#: qml/Greeter/SessionsList.qml:124
532435msgid "Select desktop environment"
533−msgstr ""
436+msgstr "Абраць працоўнае асяроддзе"
534437
535−#: qml/Launcher/Drawer.qml:94
438+#: qml/Launcher/Drawer.qml:250
536439msgid "Search…"
537−msgstr ""
440+msgstr "Пошук…"
538441
539−#: qml/Launcher/Drawer.qml:129
540−msgctxt "Apps sorted alphabetically"
541−msgid "A-Z"
542−msgstr ""
442+#: qml/Launcher/PullToRefreshScopeStyle.qml:56
443+msgid "Pull to refresh…"
444+msgstr "Пацягніце для абнаўлення..."
543445
544−#: qml/Launcher/MoreAppsHeader.qml:55
545−msgid "More apps in the store"
546−msgstr ""
446+#: qml/Launcher/PullToRefreshScopeStyle.qml:61
447+msgid "Release to refresh…"
448+msgstr "Адпусціце для абнаўлення..."
547449
548450#: qml/Notifications/NotificationMenuItemFactory.qml:124
549451msgid "Show password"
@@ -559,7 +461,7 @@ msgstr "Канферэнцыя"
559461
560462#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
561463msgid "Nothing is playing"
562−msgstr "Нічога не грае"
464+msgstr "Нічога не прайграецца"
563465
564466#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
565467#, qt-format
@@ -567,7 +469,7 @@ msgid "%1 hour"
567469msgid_plural "%1 hours"
568470msgstr[0] "%1 гадзіна"
569471msgstr[1] "%1 гадзіны"
570−msgstr[2] "%1 гадзінаў"
472+msgstr[2] "%1 гадзін"
571473
572474#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
573475#, qt-format
@@ -575,7 +477,7 @@ msgid "%1 minute"
575477msgid_plural "%1 minutes"
576478msgstr[0] "%1 хвіліна"
577479msgstr[1] "%1 хвіліны"
578−msgstr[2] "%1 хвілінаў"
480+msgstr[2] "%1 хвілін"
579481
580482#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
581483#, qt-format
@@ -583,7 +485,7 @@ msgid "%1 second"
583485msgid_plural "%1 seconds"
584486msgstr[0] "%1 секунда"
585487msgstr[1] "%1 секунды"
586−msgstr[2] "%1 секундаў"
488+msgstr[2] "%1 секунд"
587489
588490#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
589491msgid "0 seconds"
@@ -593,15 +495,15 @@ msgstr "0 секунд"
593495#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
594496#, qt-format
595497msgid "%1 remaining"
596−msgstr "%1 засталося"
498+msgstr "Засталося %1"
597499
598500#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
599501msgid "In queue…"
600−msgstr "У чарзе..."
502+msgstr "У чарзе…"
601503
602504#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
603505msgid "Downloading"
604−msgstr "Запампоўка"
506+msgstr "Запампоўванне"
605507
606508#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
607509msgid "Paused, tap to resume"
@@ -613,7 +515,7 @@ msgstr "Скасавана"
613515
614516#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
615517msgid "Finished"
616−msgstr "Скончана"
518+msgstr "Завершана"
617519
618520#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
619521msgid "Failed, tap to retry"
@@ -623,7 +525,7 @@ msgstr "Не атрымалася, націсніце, каб паўтарыць
623525#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
624526msgctxt "Button: Send a reply message"
625527msgid "Send"
626−msgstr "Даслаць"
528+msgstr "Адправіць"
627529
628530#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
629531msgctxt "Label: Hint in message indicator line edit"
@@ -637,279 +539,265 @@ msgstr "Патэлефанаваць"
637539
638540#: qml/Panel/PanelMenuPage.qml:92
639541msgid "Back"
640−msgstr ""
542+msgstr "Назад"
641543
642544#: qml/Stage/SideStage.qml:76
643545msgid "Drag using 3 fingers any application from one window to the other"
644−msgstr ""
546+msgstr "Перацягвайце любую праграму пры дапамозе трох пальцаў"
547+
548+#: qml/Stage/Stage.qml:671
549+msgid "No running apps"
550+msgstr "Няма запушчаных праграм"
645551
646552#: qml/Tutorial/TutorialLeftLong.qml:49
647553msgid "Long swipe from the left edge to open the Application Drawer"
648−msgstr ""
554+msgstr "Правядзіце ад левага краю, каб адкрыць панэль праграм"
649555
650556#: qml/Tutorial/TutorialLeft.qml:47
651557msgid "Short swipe from the left edge to open the launcher"
652−msgstr ""
558+msgstr "Коратка правядзіце ад левага краю, каб адкрыць панэль запуску"
653559
654−#: qml/Tutorial/TutorialRight.qml:55
560+#: qml/Tutorial/TutorialRight.qml:54
655561msgid "Push your mouse against the right edge to view your open apps"
656562msgstr ""
563+"Навядзіце курсор мышы на правы край экрана, каб праглядзець спіс адкрытых "
564+"акон праграм"
657565
658−#: qml/Tutorial/TutorialRight.qml:56
566+#: qml/Tutorial/TutorialRight.qml:55
659567msgid "Swipe from the right edge to view your open apps"
660−msgstr ""
568+msgstr "Правядзіце ад правага краю, каб праглядзець спіс адкрытых акон праграм"
661569
662570#: qml/Tutorial/TutorialTop.qml:53
663571msgid "Swipe from the top edge to access notifications and quick settings"
664572msgstr ""
573+"Правядзіце ад верхняга краю, каб атрымаць доступ да апавяшчэнняў і хуткіх "
574+"налад"
665575
666−#: qml/Wizard/Page.qml:54
576+#: qml/Wizard/Page.qml:59
667577msgctxt "Button: Go back one page in the Wizard"
668578msgid "Back"
669−msgstr "Вярнуцца"
579+msgstr "Назад"
670580
671−#: qml/Wizard/Pages/10-welcome.qml:28
581+#: qml/Wizard/Pages/10-welcome.qml:29
672582msgid "Language"
673−msgstr ""
674−
675−#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
676−#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
677−#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
678−#: qml/Wizard/Pages/70-passwd-type.qml:145
679−#: qml/Wizard/Pages/75-report-check.qml:84
680−#: qml/Wizard/Pages/passcode-desktop.qml:142
681−#: qml/Wizard/Pages/password-set.qml:142
583+msgstr "Мова"
584+
585+#: qml/Wizard/Pages/10-welcome.qml:176
586+#: qml/Wizard/Pages/10-welcome-update.qml:126
587+#: qml/Wizard/Pages/11-changelog.qml:74 qml/Wizard/Pages/20-keyboard.qml:152
588+#: qml/Wizard/Pages/30-wifi.qml:214 qml/Wizard/Pages/50-timezone.qml:272
589+#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/70-passwd-type.qml:146
590+#: qml/Wizard/Pages/passcode-desktop.qml:154
591+#: qml/Wizard/Pages/password-set.qml:153
682592msgid "Next"
683−msgstr ""
593+msgstr "Далей"
594+
595+#: qml/Wizard/Pages/10-welcome-update.qml:91
596+msgid "Welcome to "
597+msgstr "Вітаем у "
598+
599+#: qml/Wizard/Pages/10-welcome-update.qml:106
600+msgid "We will make sure your device is ready to use "
601+msgstr "Мы праверым, ці гатовая да выкарыстання вашая прылада "
602+
603+#: qml/Wizard/Pages/11-changelog.qml:28
604+msgid "What's new"
605+msgstr "Што новага"
606+
607+#: qml/Wizard/Pages/11-changelog.qml:74
608+msgid "Loading..."
609+msgstr "Загрузка..."
684610
685611#: qml/Wizard/Pages/20-keyboard.qml:31
686612msgid "Select Keyboard"
687−msgstr ""
613+msgstr "Абярыце клавіятуру"
688614
689615#: qml/Wizard/Pages/20-keyboard.qml:71
690616msgid "Keyboard language"
691−msgstr ""
617+msgstr "Мова клавіятуры"
692618
693619#: qml/Wizard/Pages/20-keyboard.qml:93
694620msgid "Keyboard layout"
695−msgstr ""
621+msgstr "Раскладка клавіятуры"
696622
697−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
698−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
623+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:214
624+#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/79-system-update.qml:144
625+#: qml/Wizard/Pages/sim.qml:101
699626msgid "Skip"
700−msgstr "Прапусціць"
627+msgstr "Мінуць"
701628
702−#: qml/Wizard/Pages/30-wifi.qml:30
629+#: qml/Wizard/Pages/30-wifi.qml:31
703630msgid "Connect to Wi‑Fi"
704−msgstr "Злучыцца з Wi-Fi"
631+msgstr "Злучэнне з Wi-Fi"
705632
706−#: qml/Wizard/Pages/30-wifi.qml:131
633+#: qml/Wizard/Pages/30-wifi.qml:139
707634msgid "Connected"
708−msgstr ""
635+msgstr "Падлучана"
709636
710−#: qml/Wizard/Pages/30-wifi.qml:164
637+#: qml/Wizard/Pages/30-wifi.qml:172
711638msgid "Available Wi-Fi networks"
712−msgstr ""
639+msgstr "Даступныя сеткі Wi-Fi"
713640
714−#: qml/Wizard/Pages/30-wifi.qml:165
641+#: qml/Wizard/Pages/30-wifi.qml:173
715642msgid "No available Wi-Fi networks"
716−msgstr ""
717−
718−#: qml/Wizard/Pages/40-location.qml:27
719−msgid "Location Services"
720−msgstr ""
721−
722−#: qml/Wizard/Pages/40-location.qml:83
723−msgid ""
724−"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
725−"(recommended)"
726−msgstr ""
727−
728−#: qml/Wizard/Pages/40-location.qml:105
729−#, qt-format
730−msgid "By selecting this option you agree to the Nokia HERE %1."
731−msgstr ""
732−
733−#: qml/Wizard/Pages/40-location.qml:106
734−msgctxt "part of: Nokia HERE terms and conditions"
735−msgid "terms and conditions"
736−msgstr ""
737−
738−#: qml/Wizard/Pages/40-location.qml:160
739−msgid "GPS only"
740−msgstr ""
741−
742−#: qml/Wizard/Pages/40-location.qml:214
743−msgid "Don't use my location"
744−msgstr ""
745−
746−#: qml/Wizard/Pages/40-location.qml:260
747−msgid "You can change it later in System Settings."
748−msgstr ""
643+msgstr "Няма даступных сетак Wi-Fi"
749644
750645#: qml/Wizard/Pages/50-timezone.qml:30
751646msgid "Time Zone"
752−msgstr ""
647+msgstr "Часавы пояс"
753648
754−#: qml/Wizard/Pages/50-timezone.qml:182
649+#: qml/Wizard/Pages/50-timezone.qml:183
755650msgid "Enter your city"
756−msgstr ""
651+msgstr "Увядзіце ваш горад"
757652
758653#: qml/Wizard/Pages/60-account.qml:24
759654msgid "Personalize Your Device"
760−msgstr ""
655+msgstr "Персаналізацыя прылады"
761656
762−#: qml/Wizard/Pages/60-account.qml:48
657+#: qml/Wizard/Pages/60-account.qml:54
763658msgid "Preferred Name"
764−msgstr ""
659+msgstr "Пераважнае імя"
765660
766661#: qml/Wizard/Pages/70-passwd-type.qml:40
767662msgid "Lock Screen"
768−msgstr ""
663+msgstr "Заблакаваць экран"
769664
770−#: qml/Wizard/Pages/70-passwd-type.qml:102
665+#: qml/Wizard/Pages/70-passwd-type.qml:103
771666msgctxt "Label: Type of security method"
772667msgid "Create new password"
773−msgstr ""
668+msgstr "Стварыць новы пароль"
774669
775−#: qml/Wizard/Pages/70-passwd-type.qml:104
670+#: qml/Wizard/Pages/70-passwd-type.qml:105
776671msgctxt "Label: Type of security method"
777672msgid "Create passcode (numbers only)"
778−msgstr ""
673+msgstr "Стварыць код доступу (толькі лічбы)"
779674
780−#: qml/Wizard/Pages/70-passwd-type.qml:106
675+#: qml/Wizard/Pages/70-passwd-type.qml:107
781676msgctxt "Label: Type of security method"
782677msgid "No lock code"
783−msgstr ""
784−
785−#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
786−msgid "Privacy Policy"
787−msgstr ""
678+msgstr "Без кода блакавання"
788679
789−#: qml/Wizard/Pages/75-report-check.qml:26
790−msgid "Help Us Improve"
791−msgstr ""
792−
793−#: qml/Wizard/Pages/75-report-check.qml:59
794−msgid "Improve system performance by sending us crashes and error reports."
795−msgstr ""
680+#: qml/Wizard/Pages/79-system-update.qml:28
681+msgid "Update Device"
682+msgstr "Абнавіць прыладу"
796683
797−#: qml/Wizard/Pages/75-report-check.qml:60
798−msgid "Privacy policy"
684+#: qml/Wizard/Pages/79-system-update.qml:55
685+msgid ""
686+"There is a system update available and ready to install. Afterwards, the "
687+"device will automatically restart."
799688msgstr ""
689+"Ёсць даступнае абнаўленне сістэмы, якое можна ўсталяваць. Пасля ўсталёўкі "
690+"сістэма аўтаматычна перазапусціцца."
800691
801−#: qml/Wizard/Pages/80-finished.qml:89
802−msgid "Welcome to Ubuntu"
803−msgstr ""
692+#: qml/Wizard/Pages/79-system-update.qml:76
693+msgctxt "string identifying name of the update"
694+msgid "Ubuntu Touch system"
695+msgstr "Сістэма Ubuntu Touch"
804696
805−#: qml/Wizard/Pages/80-finished.qml:104
806−msgid "You are ready to use your device now"
807−msgstr ""
697+#: qml/Wizard/Pages/79-system-update.qml:83
698+#, qt-format
699+msgctxt "version of the system update"
700+msgid "Version %1"
701+msgstr "Версія %1"
808702
809−#: qml/Wizard/Pages/80-finished.qml:124
810−msgid "Get Started"
811−msgstr ""
703+#: qml/Wizard/Pages/79-system-update.qml:95
704+msgid "This could take a few minutes..."
705+msgstr "Аперацыя можа заняць некалькі хвілін…"
812706
813−#: qml/Wizard/Pages/here-terms.qml:25
814−msgid "Terms & Conditions"
815−msgstr "Умовы карыстання"
707+#: qml/Wizard/Pages/79-system-update.qml:109
708+msgid "Install and restart now"
709+msgstr "Усталяваць і перазапусціць"
816710
817−#: qml/Wizard/Pages/here-terms.qml:69
818−msgid "Your device uses positioning technologies provided by HERE."
819−msgstr ""
711+#: qml/Wizard/Pages/80-finished.qml:91
712+msgid "Welcome Back"
713+msgstr "Сардэчна запрашаем назад"
820714
821−#: qml/Wizard/Pages/here-terms.qml:81
822−msgid ""
823−"To provide you with positioning services and to improve their quality, HERE "
824−"collects information about nearby cell towers and Wi-Fi hotspots around your "
825−"current location whenever your position is being found."
826−msgstr ""
715+#: qml/Wizard/Pages/80-finished.qml:91
716+msgid "Welcome to Ubuntu"
717+msgstr "Вітаем ва Ubuntu"
827718
828−#: qml/Wizard/Pages/here-terms.qml:93
829−msgid ""
830−"The information collected is used to analyze the service and to improve the "
831−"use of service, but not to identify you personally."
832−msgstr ""
719+#: qml/Wizard/Pages/80-finished.qml:106
720+msgid "You are ready to use your device now"
721+msgstr "Цяпер прылада гатовая да выкарыстання"
833722
834−#: qml/Wizard/Pages/here-terms.qml:106
835−#, qt-format
836−msgid "By continuing, you agree to the HERE platform %1 and %2."
837−msgstr ""
723+#: qml/Wizard/Pages/80-finished.qml:126
724+msgid "Continue"
725+msgstr "Працягнуць"
838726
839−#: qml/Wizard/Pages/here-terms.qml:107
840−msgid "Service Terms"
841−msgstr ""
727+#: qml/Wizard/Pages/80-finished.qml:126
728+msgid "Get Started"
729+msgstr "Пачаць"
842730
843731#: qml/Wizard/Pages/passcode-confirm.qml:43
844−#: qml/Wizard/Pages/passcode-desktop.qml:97
732+#: qml/Wizard/Pages/passcode-desktop.qml:104
845733msgid "Confirm passcode"
846−msgstr "Пацвердзіце код-пароль"
734+msgstr "Пацвердзіце код доступу"
847735
848736#: qml/Wizard/Pages/passcode-confirm.qml:45
849737msgid "Incorrect passcode."
850−msgstr ""
738+msgstr "Няправільны код доступу."
851739
852740#: qml/Wizard/Pages/passcode-confirm.qml:45
853741msgctxt "Enter the passcode again"
854742msgid "Please re-enter."
855−msgstr ""
743+msgstr "Увядзіце нанова."
856744
857745#: qml/Wizard/Pages/passcode-desktop.qml:31
858746msgid "Lock Screen Passcode"
859−msgstr ""
747+msgstr "Код блакавання экрана"
860748
861−#: qml/Wizard/Pages/passcode-desktop.qml:61
749+#: qml/Wizard/Pages/passcode-desktop.qml:68
862750msgid "Enter 4 numbers to setup your passcode"
863−msgstr ""
751+msgstr "Увядзіце код блакавання з чаторых лічбаў"
864752
865−#: qml/Wizard/Pages/passcode-desktop.qml:77
753+#: qml/Wizard/Pages/passcode-desktop.qml:84
866754#: qml/Wizard/Pages/passcode-set.qml:54
867755msgid "Choose passcode"
868−msgstr ""
756+msgstr "Абраць код доступу"
869757
870−#: qml/Wizard/Pages/passcode-desktop.qml:127
758+#: qml/Wizard/Pages/passcode-desktop.qml:139
871759msgid "Passcode too short"
872−msgstr ""
760+msgstr "Код доступу занадта кароткі"
873761
874−#: qml/Wizard/Pages/passcode-desktop.qml:129
762+#: qml/Wizard/Pages/passcode-desktop.qml:141
875763msgid "Passcodes match"
876−msgstr ""
764+msgstr "Коды доступу супадаюць"
877765
878−#: qml/Wizard/Pages/passcode-desktop.qml:131
766+#: qml/Wizard/Pages/passcode-desktop.qml:143
879767msgid "Passcodes do not match"
880−msgstr ""
768+msgstr "Коды доступу не супадаюць"
881769
882770#: qml/Wizard/Pages/passcode-set.qml:62
883771msgid "Passcode must be 4 characters long"
884−msgstr ""
772+msgstr "Код доступу павінен складацца з чатырох лічбаў"
885773
886774#: qml/Wizard/Pages/password-set.qml:31
887775msgid "Lock Screen Password"
888−msgstr ""
776+msgstr "Пароль блакавання экрана"
889777
890−#: qml/Wizard/Pages/password-set.qml:62
778+#: qml/Wizard/Pages/password-set.qml:68
891779msgid "Enter at least 8 characters"
892−msgstr ""
780+msgstr "Увядзіце прынамсі 8 сімвалаў"
893781
894−#: qml/Wizard/Pages/password-set.qml:74
782+#: qml/Wizard/Pages/password-set.qml:80
895783msgid "Choose password"
896−msgstr ""
784+msgstr "Абярыце пароль"
897785
898−#: qml/Wizard/Pages/password-set.qml:104
786+#: qml/Wizard/Pages/password-set.qml:110
899787msgid "Confirm password"
900−msgstr ""
788+msgstr "Пацвердзіце пароль"
901789
902790#: qml/Wizard/Pages/sim.qml:27
903791msgid "No SIM card installed"
904−msgstr ""
792+msgstr "SIM-картка не ўстаўленая"
905793
906794#: qml/Wizard/Pages/sim.qml:54
907795msgid "SIM card added"
908−msgstr ""
796+msgstr "Дададзена SIM-картка"
909797
910798#: qml/Wizard/Pages/sim.qml:55
911799msgid "You must restart the device to access the mobile network."
912−msgstr ""
800+msgstr "Для доступу да мабільнай сеткі неабходна перазапусціць прыладу."
913801
914802#: qml/Wizard/Pages/sim.qml:59
915803msgid "Restart"
@@ -917,39 +805,123 @@ msgstr "Перазапусціць"
917805
918806#: qml/Wizard/Pages/sim.qml:78
919807msgid "You won’t be able to make calls or use text messaging without a SIM."
920−msgstr ""
808+msgstr "Без SIM-карткі немагчыма тэлефанаваць і адпраўляць SMS."
921809
922810#: qml/Wizard/Pages/sim.qml:90
923811msgid "To proceed with no SIM tap Skip."
924−msgstr ""
812+msgstr "Каб працягнуць працу без SIM-карткі, націсніце \"Прамінуць\"."
925813
926814#: qml/Wizard/PasswordMeter.qml:87
927815msgid "Password too short"
928−msgstr ""
816+msgstr "Пароль занадта кароткі"
929817
930818#: qml/Wizard/PasswordMeter.qml:89
931819msgid "Passwords match"
932−msgstr ""
820+msgstr "Паролі супадаюць"
933821
934822#: qml/Wizard/PasswordMeter.qml:91
935823msgid "Passwords do not match"
936−msgstr ""
824+msgstr "Паролі не супадаюць"
937825
938826#: qml/Wizard/PasswordMeter.qml:95
939827msgid "Strong password"
940−msgstr ""
828+msgstr "Надзейны пароль"
941829
942830#: qml/Wizard/PasswordMeter.qml:97
943831msgid "Fair password"
944−msgstr ""
832+msgstr "Неблагі пароль"
945833
946834#: qml/Wizard/PasswordMeter.qml:99
947835msgid "Weak password"
948−msgstr ""
836+msgstr "Слабы пароль"
949837
950838#: qml/Wizard/PasswordMeter.qml:101
951839msgid "Very weak password"
952−msgstr ""
840+msgstr "Вельмы слабы пароль"
841+
842+#~ msgid "Unity 8"
843+#~ msgstr "Unity 8"
844+
845+#~ msgid "Scopes"
846+#~ msgstr "Лінзы"
847+
848+#~ msgid "Super (Tap)"
849+#~ msgstr "Super (націск)"
850+
851+#~ msgid "Opens the Scopes home."
852+#~ msgstr "Адкрывае старонку лінзаў."
853+
854+#~ msgctxt "Button: Open the Ubuntu Store"
855+#~ msgid "Store"
856+#~ msgstr "Крама"
857+
858+#~ msgctxt "Button: Start a search in the current dash scope"
859+#~ msgid "Search"
860+#~ msgstr "Пошук"
861+
862+#~ msgctxt "Button: Show the current dash scope settings"
863+#~ msgid "Settings"
864+#~ msgstr "Налады"
865+
866+#~ msgid "Remove from Favorites"
867+#~ msgstr "Выдаліць з абранага"
868+
869+#~ msgid "Add to Favorites"
870+#~ msgstr "Дадаць да абранага"
871+
872+#~ msgctxt "Label: Hint for dash search line edit"
873+#~ msgid "Search"
874+#~ msgstr "Пошук"
875+
876+#~ msgid "More..."
877+#~ msgstr "Болей…"
878+
879+#~ msgid "Less..."
880+#~ msgstr "Менш..."
881+
882+#~ msgid "Send"
883+#~ msgstr "Адправіць"
884+
885+#~ msgid "Rate this"
886+#~ msgstr "Ацаніць"
887+
888+#~ msgid "Add a review"
889+#~ msgstr "Дадаць рэцэнзію"
890+
891+#~ msgid "Enable location data"
892+#~ msgstr "Уключыць дадзеныя аб месцазнаходжанні"
893+
894+#~ msgid "Manage"
895+#~ msgstr "Кіраванне"
896+
897+#~ msgid "Home"
898+#~ msgstr "Хатняя папка"
899+
900+#~ msgid "Also installed"
901+#~ msgstr "Таксама ўсталявана"
902+
903+#, fuzzy
904+#~ msgid "Please wait..."
905+#~ msgstr "Загрузка. Чакайце..."
906+
907+#, fuzzy
908+#~ msgid "Update all"
909+#~ msgstr "Не дазваляць"
910+
911+#, fuzzy
912+#~ msgid "Download"
913+#~ msgstr "Запампоўка"
914+
915+#, fuzzy
916+#~ msgid "Downloaded"
917+#~ msgstr "Запампоўка"
918+
919+#, fuzzy
920+#~ msgid "Installed"
921+#~ msgstr "Таксама ўсталявана"
922+
923+#~ msgid "Terms & Conditions"
924+#~ msgstr "Умовы карыстання"
953925
954926#~ msgid "Reboot"
955927#~ msgstr "Перазагрузіць"
@@ -966,9 +938,6 @@ msgstr ""
966938#~ msgid "Left edge"
967939#~ msgstr "Левы край"
968940
969−#~ msgid "Search"
970−#~ msgstr "Пошук"
971−
972941#~ msgid "Confirm"
973942#~ msgstr "Пацвердзіць"
974943
@@ -981,29 +950,18 @@ msgstr ""
981950#~ msgid "Try swiping from the right edge to unlock the phone"
982951#~ msgstr "Правядзіце пальцам з правага краю, каб разблакаваць тэлефон"
983952
984−#~ msgid "Loading. Please Wait..."
985−#~ msgstr "Загрузка. Чакайце..."
986−
987−#~ msgid "Speaking..."
988−#~ msgstr "Кажа..."
989−
990953#~ msgid "Speak Now..."
991954#~ msgstr "Кажыце..."
992955
993956#~ msgid "Type or say a command"
994957#~ msgstr "Напішыце або вымавіце каманду"
995958
996−#, qt-format
997959#~ msgid "Enter %1"
998960#~ msgstr "Увядзіце %1"
999961
1000−#, qt-format
1001962#~ msgid "Sorry, incorrect %1"
1002963#~ msgstr "Даруйце, некарэктны %1"
1003964
1004−#~ msgid "Enter passcode"
1005−#~ msgstr "Увядзіце код"
1006−
1007965#~ msgid "This will be your last attempt."
1008966#~ msgstr "Апошняя спроба."
1009967
@@ -1027,8 +985,8 @@ msgstr ""
1027985
1028986#~ msgid "Swipe from the left to reveal the launcher for quick access to apps"
1029987#~ msgstr ""
1030−#~ "Правядзіце пальцам ад левага краю, каб адкрыць панэль запуску для паскарэння "
1031−#~ "доступу да праграм"
988+#~ "Правядзіце пальцам ад левага краю, каб адкрыць панэль запуску для "
989+#~ "паскарэння доступу да праграм"
1032990
1033991#~ msgid "Skip intro"
1034992#~ msgstr "Прапусціць уводзіны"
@@ -1054,9 +1012,6 @@ msgstr ""
10541012#~ msgid "Let’s get started."
10551013#~ msgstr "Пачнем."
10561014
1057−#~ msgid "Continue"
1058−#~ msgstr "Працягнуць"
1059−
10601015#~ msgid "Please select how you’d like to unlock your phone."
10611016#~ msgstr "Калі ласка, абярыце спосаб разблакавання тэлефона."
10621017
@@ -1077,7 +1032,8 @@ msgstr ""
10771032
10781033#~ msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
10791034#~ msgstr ""
1080−#~ "На аснове GPS, ананімізаванага Wi-Fi і дадзеных сотавай сеткі (рэкамендуецца)"
1035+#~ "На аснове GPS, ананімізаванага Wi-Fi і дадзеных сотавай сеткі "
1036+#~ "(рэкамендуецца)"
10811037
10821038#~ msgid "Improving your experience"
10831039#~ msgstr "Спрашчэнне вашай працы"
@@ -1102,23 +1058,18 @@ msgstr ""
11021058#~ msgstr "Цяпер Вашым тэлефонам можна карыстацца."
11031059
11041060#~ msgid ""
1105−#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
1106−#~ "conditions</a>."
1061+#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms "
1062+#~ "and conditions</a>."
11071063#~ msgstr ""
11081064#~ "Выбарам гэтага варыянту дзеянняў вы згаджаецеся з <a href='#'> умовамі "
11091065#~ "прадстаўлення паслуг Nokia HERE</a>."
11101066
1111−#~ msgid "Not at all"
1112−#~ msgstr "Не дазваляць"
1113−
1114−#, qt-format
11151067#~ msgid "〈 %1"
11161068#~ msgstr "〈 %1"
11171069
11181070#~ msgid "Confirm passphrase"
11191071#~ msgstr "Пацвердзіце пароль"
11201072
1121−#, qt-format
11221073#~ msgid "%1 〉"
11231074#~ msgstr "%1 〉"
11241075
@@ -1128,10 +1079,6 @@ msgstr ""
11281079#~ msgid "Close"
11291080#~ msgstr "Закрыць"
11301081
1131−#~ msgid "Try swiping from the top edge to access the indicators"
1132−#~ msgstr ""
1133−#~ "Паспрабуйце правесці пальцам ад верхняга краю для доступу да індыкатараў"
1134−
11351082#~ msgid "Settings"
11361083#~ msgstr "Наладкі"
11371084
@@ -1142,9 +1089,6 @@ msgstr ""
11421089#~ "Вы толькі што асвоілі асноўная жэсты і можаце пачаць выкарыстоўваць "
11431090#~ "тэлефон<br><br>Дакраніцеся да экрана, каб пачаць"
11441091
1145−#~ msgid "Enter passphrase"
1146−#~ msgstr "Увядзіце пароль"
1147−
11481092#~ msgid "Sorry, incorrect passcode."
11491093#~ msgstr "Даруйце, няслушны код."
11501094
@@ -1212,9 +1156,6 @@ msgstr ""
12121156#~ msgid "Try again."
12131157#~ msgstr "Паспрабуйце яшчэ."
12141158
1215−#~ msgid "Open the launcher"
1216−#~ msgstr "Адкрыць панэль запуску"
1217−
12181159#~ msgid "Tap here to continue."
12191160#~ msgstr "Націсніце тут, каб працягнуць."
12201161
@@ -1298,15 +1239,15 @@ msgstr ""
12981239#~ msgstr "Даруйце, некарэктны код"
12991240
13001241#~ msgid ""
1301−#~ "If passcode is entered incorrectly, your phone will conduct a factory reset "
1302−#~ "and all personal data will be deleted."
1242+#~ "If passcode is entered incorrectly, your phone will conduct a factory "
1243+#~ "reset and all personal data will be deleted."
13031244#~ msgstr ""
1304−#~ "Калі ўведзены код неправільны, Ваш тэлефон зробіць агульны скід налад і ўсе "
1305−#~ "асабістыя дадзеныя будуць выдалены."
1245+#~ "Калі ўведзены код неправільны, Ваш тэлефон зробіць агульны скід налад і "
1246+#~ "ўсе асабістыя дадзеныя будуць выдалены."
13061247
13071248#~ msgid ""
13081249#~ "If passphrase is entered incorrectly, your phone will conduct a factory "
13091250#~ "reset and all personal data will be deleted."
13101251#~ msgstr ""
1311−#~ "Калі ўведзены пароль неправільны, Ваш тэлефон зробіць агульны скід налад і "
1312−#~ "ўсе асабістыя дадзеныя будуць выдалены."
1252+#~ "Калі ўведзены пароль неправільны, Ваш тэлефон зробіць агульны скід налад "
1253+#~ "і ўсе асабістыя дадзеныя будуць выдалены."
po/bg.po+138−255
@@ -6,39 +6,40 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2017-04-04 22:56+0000\n"
9+"Report-Msgid-Bugs-To: \n"
10+"POT-Creation-Date: 2021-01-29 11:42-0600\n"
1111"PO-Revision-Date: 2015-04-12 14:43+0000\n"
1212"Last-Translator: George Karavasilev <kokoto-java@ubuntu.com>\n"
1313"Language-Team: Bulgarian <bg@li.org>\n"
14+"Language: bg\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
1718"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
19−"X-Generator: Launchpad (build 18343)\n"
19+"X-Launchpad-Export-Date: 2016-11-23 06:34+0000\n"
20+"X-Generator: Launchpad (build 18269)\n"
2021
21−#: plugins/LightDM/Greeter.cpp:188
22+#: plugins/LightDM/Greeter.cpp:199
2223msgid "Password: "
2324msgstr ""
2425
25−#: plugins/LightDM/Greeter.cpp:203
26+#: plugins/LightDM/Greeter.cpp:214
2627msgid "Username"
2728msgstr ""
2829
29−#: plugins/LightDM/Greeter.cpp:242
30+#: plugins/LightDM/Greeter.cpp:258
3031msgid "Failed to authenticate"
3132msgstr ""
3233
33−#: plugins/LightDM/Greeter.cpp:244
34+#: plugins/LightDM/Greeter.cpp:260
3435msgid "Invalid password, please try again"
3536msgstr ""
3637
37−#: plugins/LightDM/Greeter.cpp:254
38+#: plugins/LightDM/Greeter.cpp:270
3839msgid "Log In"
3940msgstr ""
4041
41−#: plugins/LightDM/Greeter.cpp:254
42+#: plugins/LightDM/Greeter.cpp:270
4243msgid "Retry"
4344msgstr ""
4445
@@ -50,16 +51,16 @@ msgstr ""
5051msgid "Guest Session"
5152msgstr ""
5253
53−#: plugins/Unity/Launcher/launcheritem.cpp:49
54−#: plugins/Unity/Launcher/launcheritem.cpp:123
54+#: plugins/Unity/Launcher/launcheritem.cpp:48
55+#: plugins/Unity/Launcher/launcheritem.cpp:122
5556msgid "Pin shortcut"
5657msgstr ""
5758
58−#: plugins/Unity/Launcher/launcheritem.cpp:55
59+#: plugins/Unity/Launcher/launcheritem.cpp:54
5960msgid "Quit"
6061msgstr ""
6162
62−#: plugins/Unity/Launcher/launcheritem.cpp:123
63+#: plugins/Unity/Launcher/launcheritem.cpp:122
6364msgid "Unpin shortcut"
6465msgstr ""
6566
@@ -82,9 +83,8 @@ msgctxt "Button: Log out from the system"
8283msgid "Log Out"
8384msgstr ""
8485
85−#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
87−#: qml/Wizard/Pages/passcode-confirm.qml:32
86+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:284
87+#: qml/Greeter/NarrowView.qml:215 qml/Wizard/Pages/passcode-confirm.qml:32
8888#: qml/Wizard/Pages/passcode-set.qml:32
8989msgid "Cancel"
9090msgstr ""
@@ -106,12 +106,12 @@ msgstr ""
106106msgid "Yes"
107107msgstr ""
108108
109−#: qml/Components/Dialogs.qml:239
109+#: qml/Components/Dialogs.qml:243
110110msgctxt "Title: Power off/Restart dialog"
111111msgid "Power"
112112msgstr ""
113113
114−#: qml/Components/Dialogs.qml:240
114+#: qml/Components/Dialogs.qml:244
115115msgid ""
116116"Are you sure you would like\n"
117117"to power off?"
@@ -119,22 +119,26 @@ msgstr ""
119119"Искате ли да \n"
120120"изключите захранването на устройството?"
121121
122−#: qml/Components/Dialogs.qml:244
122+#: qml/Components/Dialogs.qml:248
123123msgctxt "Button: Power off the system"
124124msgid "Power off"
125125msgstr ""
126126
127−#: qml/Components/Dialogs.qml:255
127+#: qml/Components/Dialogs.qml:263
128128msgctxt "Button: Restart the system"
129129msgid "Restart"
130130msgstr ""
131131
132+#: qml/Components/Dialogs.qml:276
133+msgid "Screenshot"
134+msgstr ""
135+
132136#: qml/Components/KeyboardShortcutsOverlay.qml:41
133137msgid "Keyboard Shortcuts"
134138msgstr ""
135139
136140#: qml/Components/KeyboardShortcutsOverlay.qml:55
137−msgid "Unity 8"
141+msgid "Lomiri"
138142msgstr ""
139143
140144#: qml/Components/KeyboardShortcutsOverlay.qml:62
@@ -221,18 +225,6 @@ msgstr ""
221225msgid "Opens the Application Drawer."
222226msgstr ""
223227
224−#: qml/Components/KeyboardShortcutsOverlay.qml:207
225−msgid "Scopes"
226−msgstr ""
227−
228−#: qml/Components/KeyboardShortcutsOverlay.qml:214
229−msgid "Super (Tap)"
230−msgstr ""
231−
232−#: qml/Components/KeyboardShortcutsOverlay.qml:219
233−msgid "Opens the Scopes home."
234−msgstr ""
235−
236228#: qml/Components/KeyboardShortcutsOverlay.qml:235
237229msgid "Switching"
238230msgstr ""
@@ -305,7 +297,7 @@ msgstr ""
305297msgid "Closes the current window."
306298msgstr ""
307299
308−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
300+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:235
309301msgid "Return to Call"
310302msgstr ""
311303
@@ -379,103 +371,6 @@ msgstr ""
379371msgid "Find more settings in the system settings."
380372msgstr ""
381373
382−#: qml/Dash/DashPageHeader.qml:361
383−msgctxt "Button: Open the Ubuntu Store"
384−msgid "Store"
385−msgstr ""
386−
387−#: qml/Dash/DashPageHeader.qml:368
388−msgctxt "Button: Start a search in the current dash scope"
389−msgid "Search"
390−msgstr ""
391−
392−#: qml/Dash/DashPageHeader.qml:378
393−msgctxt "Button: Show the current dash scope settings"
394−msgid "Settings"
395−msgstr ""
396−
397−#: qml/Dash/DashPageHeader.qml:385
398−msgid "Remove from Favorites"
399−msgstr ""
400−
401−#: qml/Dash/DashPageHeader.qml:385
402−msgid "Add to Favorites"
403−msgstr ""
404−
405−#: qml/Dash/FiltersPopover.qml:61
406−msgid "Refine your results"
407−msgstr ""
408−
409−#: qml/Dash/FiltersPopover.qml:70
410−msgid "Reset"
411−msgstr ""
412−
413−#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
414−msgid "Show less"
415−msgstr ""
416−
417−#: qml/Dash/GenericScopeView.qml:547
418−msgid "Show all"
419−msgstr ""
420−
421−#: qml/Dash/GenericScopeView.qml:578
422−msgctxt "Label: Hint for dash search line edit"
423−msgid "Search"
424−msgstr ""
425−
426−#: qml/Dash/PageHeaderExtraPanel.qml:67
427−msgid "Recent Searches"
428−msgstr ""
429−
430−#: qml/Dash/PageHeaderExtraPanel.qml:78
431−msgid "Clear All"
432−msgstr ""
433−
434−#: qml/Dash/Previews/PreviewActionCombo.qml:36
435−msgid "More..."
436−msgstr ""
437−
438−#: qml/Dash/Previews/PreviewActionCombo.qml:36
439−msgid "Less..."
440−msgstr "По-малко..."
441−
442−#: qml/Dash/Previews/PreviewCommentInput.qml:83
443−#: qml/Dash/Previews/PreviewRatingInput.qml:202
444−msgid "Send"
445−msgstr "Изпрати"
446−
447−#: qml/Dash/Previews/PreviewRatingInput.qml:109
448−msgid "Rate this"
449−msgstr "Оценете това"
450−
451−#: qml/Dash/Previews/PreviewRatingInput.qml:184
452−msgid "Add a review"
453−msgstr "Добави отзив"
454−
455−#: qml/Dash/PullToRefreshScopeStyle.qml:56
456−msgid "Pull to refresh…"
457−msgstr ""
458−
459−#: qml/Dash/PullToRefreshScopeStyle.qml:61
460−msgid "Release to refresh…"
461−msgstr ""
462−
463−#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
464−msgid "Enable location data"
465−msgstr ""
466−
467−#: qml/Dash/ScopesList.qml:146
468−msgid "Manage"
469−msgstr ""
470−
471−#: qml/Dash/ScopesList.qml:187
472−msgid "Home"
473−msgstr ""
474−
475−#: qml/Dash/ScopesList.qml:188
476−msgid "Also installed"
477−msgstr ""
478−
479374#: qml/Greeter/CoverPage.qml:127
480375msgid "Unlock"
481376msgstr ""
@@ -511,7 +406,7 @@ msgstr ""
511406msgid "Enter passcode to unlock"
512407msgstr ""
513408
514−#: qml/Greeter/NarrowView.qml:228
409+#: qml/Greeter/NarrowView.qml:235
515410msgid "Emergency"
516411msgstr ""
517412
@@ -527,17 +422,18 @@ msgstr ""
527422msgid "Select desktop environment"
528423msgstr ""
529424
530−#: qml/Launcher/Drawer.qml:94
425+#: qml/Launcher/Drawer.qml:250
426+#, fuzzy
427+#| msgid "Search"
531428msgid "Search…"
532−msgstr ""
429+msgstr "Търсене"
533430
534−#: qml/Launcher/Drawer.qml:129
535−msgctxt "Apps sorted alphabetically"
536−msgid "A-Z"
431+#: qml/Launcher/PullToRefreshScopeStyle.qml:56
432+msgid "Pull to refresh…"
537433msgstr ""
538434
539−#: qml/Launcher/MoreAppsHeader.qml:55
540−msgid "More apps in the store"
435+#: qml/Launcher/PullToRefreshScopeStyle.qml:61
436+msgid "Release to refresh…"
541437msgstr ""
542438
543439#: qml/Notifications/NotificationMenuItemFactory.qml:124
@@ -635,19 +531,27 @@ msgstr ""
635531msgid "Drag using 3 fingers any application from one window to the other"
636532msgstr ""
637533
534+#: qml/Stage/Stage.qml:671
535+msgid "No running apps"
536+msgstr ""
537+
638538#: qml/Tutorial/TutorialLeftLong.qml:49
539+#, fuzzy
540+#| msgid "Try swiping from the top edge to access the indicators"
639541msgid "Long swipe from the left edge to open the Application Drawer"
640542msgstr ""
543+"Опитайте се да приплъзнете пръста си от горния край към долния, за да "
544+"получите достъп до индикаторите"
641545
642546#: qml/Tutorial/TutorialLeft.qml:47
643547msgid "Short swipe from the left edge to open the launcher"
644548msgstr ""
645549
646−#: qml/Tutorial/TutorialRight.qml:55
550+#: qml/Tutorial/TutorialRight.qml:54
647551msgid "Push your mouse against the right edge to view your open apps"
648552msgstr ""
649553
650−#: qml/Tutorial/TutorialRight.qml:56
554+#: qml/Tutorial/TutorialRight.qml:55
651555msgid "Swipe from the right edge to view your open apps"
652556msgstr ""
653557
@@ -655,25 +559,42 @@ msgstr ""
655559msgid "Swipe from the top edge to access notifications and quick settings"
656560msgstr ""
657561
658−#: qml/Wizard/Page.qml:54
562+#: qml/Wizard/Page.qml:59
659563msgctxt "Button: Go back one page in the Wizard"
660564msgid "Back"
661565msgstr ""
662566
663−#: qml/Wizard/Pages/10-welcome.qml:28
567+#: qml/Wizard/Pages/10-welcome.qml:29
664568msgid "Language"
665569msgstr ""
666570
667−#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
668−#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
669−#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
670−#: qml/Wizard/Pages/70-passwd-type.qml:145
671−#: qml/Wizard/Pages/75-report-check.qml:84
672−#: qml/Wizard/Pages/passcode-desktop.qml:142
673−#: qml/Wizard/Pages/password-set.qml:142
571+#: qml/Wizard/Pages/10-welcome.qml:176
572+#: qml/Wizard/Pages/10-welcome-update.qml:126
573+#: qml/Wizard/Pages/11-changelog.qml:74 qml/Wizard/Pages/20-keyboard.qml:152
574+#: qml/Wizard/Pages/30-wifi.qml:214 qml/Wizard/Pages/50-timezone.qml:272
575+#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/70-passwd-type.qml:146
576+#: qml/Wizard/Pages/passcode-desktop.qml:154
577+#: qml/Wizard/Pages/password-set.qml:153
674578msgid "Next"
675579msgstr ""
676580
581+#: qml/Wizard/Pages/10-welcome-update.qml:91
582+msgid "Welcome to "
583+msgstr ""
584+
585+#: qml/Wizard/Pages/10-welcome-update.qml:106
586+msgid "We will make sure your device is ready to use "
587+msgstr ""
588+
589+#: qml/Wizard/Pages/11-changelog.qml:28
590+msgid "What's new"
591+msgstr ""
592+
593+#: qml/Wizard/Pages/11-changelog.qml:74
594+#, fuzzy
595+msgid "Loading..."
596+msgstr "Говорете..."
597+
677598#: qml/Wizard/Pages/20-keyboard.qml:31
678599msgid "Select Keyboard"
679600msgstr ""
@@ -686,64 +607,33 @@ msgstr ""
686607msgid "Keyboard layout"
687608msgstr ""
688609
689−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
690−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
610+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:214
611+#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/79-system-update.qml:144
612+#: qml/Wizard/Pages/sim.qml:101
691613msgid "Skip"
692614msgstr ""
693615
694−#: qml/Wizard/Pages/30-wifi.qml:30
616+#: qml/Wizard/Pages/30-wifi.qml:31
695617msgid "Connect to Wi‑Fi"
696618msgstr ""
697619
698−#: qml/Wizard/Pages/30-wifi.qml:131
620+#: qml/Wizard/Pages/30-wifi.qml:139
699621msgid "Connected"
700622msgstr ""
701623
702−#: qml/Wizard/Pages/30-wifi.qml:164
624+#: qml/Wizard/Pages/30-wifi.qml:172
703625msgid "Available Wi-Fi networks"
704626msgstr ""
705627
706−#: qml/Wizard/Pages/30-wifi.qml:165
628+#: qml/Wizard/Pages/30-wifi.qml:173
707629msgid "No available Wi-Fi networks"
708630msgstr ""
709631
710−#: qml/Wizard/Pages/40-location.qml:27
711−msgid "Location Services"
712−msgstr ""
713−
714−#: qml/Wizard/Pages/40-location.qml:83
715−msgid ""
716−"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
717−"(recommended)"
718−msgstr ""
719−
720−#: qml/Wizard/Pages/40-location.qml:105
721−#, qt-format
722−msgid "By selecting this option you agree to the Nokia HERE %1."
723−msgstr ""
724−
725−#: qml/Wizard/Pages/40-location.qml:106
726−msgctxt "part of: Nokia HERE terms and conditions"
727−msgid "terms and conditions"
728−msgstr ""
729−
730−#: qml/Wizard/Pages/40-location.qml:160
731−msgid "GPS only"
732−msgstr ""
733−
734−#: qml/Wizard/Pages/40-location.qml:214
735−msgid "Don't use my location"
736−msgstr ""
737−
738−#: qml/Wizard/Pages/40-location.qml:260
739−msgid "You can change it later in System Settings."
740−msgstr ""
741−
742632#: qml/Wizard/Pages/50-timezone.qml:30
743633msgid "Time Zone"
744634msgstr ""
745635
746−#: qml/Wizard/Pages/50-timezone.qml:182
636+#: qml/Wizard/Pages/50-timezone.qml:183
747637msgid "Enter your city"
748638msgstr ""
749639
@@ -751,7 +641,7 @@ msgstr ""
751641msgid "Personalize Your Device"
752642msgstr ""
753643
754−#: qml/Wizard/Pages/60-account.qml:48
644+#: qml/Wizard/Pages/60-account.qml:54
755645msgid "Preferred Name"
756646msgstr ""
757647
@@ -759,81 +649,72 @@ msgstr ""
759649msgid "Lock Screen"
760650msgstr ""
761651
762−#: qml/Wizard/Pages/70-passwd-type.qml:102
652+#: qml/Wizard/Pages/70-passwd-type.qml:103
763653msgctxt "Label: Type of security method"
764654msgid "Create new password"
765655msgstr ""
766656
767−#: qml/Wizard/Pages/70-passwd-type.qml:104
657+#: qml/Wizard/Pages/70-passwd-type.qml:105
768658msgctxt "Label: Type of security method"
769659msgid "Create passcode (numbers only)"
770660msgstr ""
771661
772−#: qml/Wizard/Pages/70-passwd-type.qml:106
662+#: qml/Wizard/Pages/70-passwd-type.qml:107
773663msgctxt "Label: Type of security method"
774664msgid "No lock code"
775665msgstr ""
776666
777−#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
778−msgid "Privacy Policy"
779−msgstr ""
780−
781−#: qml/Wizard/Pages/75-report-check.qml:26
782−msgid "Help Us Improve"
667+#: qml/Wizard/Pages/79-system-update.qml:28
668+msgid "Update Device"
783669msgstr ""
784670
785−#: qml/Wizard/Pages/75-report-check.qml:59
786−msgid "Improve system performance by sending us crashes and error reports."
787−msgstr ""
788−
789−#: qml/Wizard/Pages/75-report-check.qml:60
790−msgid "Privacy policy"
671+#: qml/Wizard/Pages/79-system-update.qml:55
672+msgid ""
673+"There is a system update available and ready to install. Afterwards, the "
674+"device will automatically restart."
791675msgstr ""
792676
793−#: qml/Wizard/Pages/80-finished.qml:89
794−msgid "Welcome to Ubuntu"
677+#: qml/Wizard/Pages/79-system-update.qml:76
678+msgctxt "string identifying name of the update"
679+msgid "Ubuntu Touch system"
795680msgstr ""
796681
797−#: qml/Wizard/Pages/80-finished.qml:104
798−msgid "You are ready to use your device now"
682+#: qml/Wizard/Pages/79-system-update.qml:83
683+#, qt-format
684+msgctxt "version of the system update"
685+msgid "Version %1"
799686msgstr ""
800687
801−#: qml/Wizard/Pages/80-finished.qml:124
802−msgid "Get Started"
688+#: qml/Wizard/Pages/79-system-update.qml:95
689+msgid "This could take a few minutes..."
803690msgstr ""
804691
805−#: qml/Wizard/Pages/here-terms.qml:25
806−msgid "Terms & Conditions"
692+#: qml/Wizard/Pages/79-system-update.qml:109
693+msgid "Install and restart now"
807694msgstr ""
808695
809−#: qml/Wizard/Pages/here-terms.qml:69
810−msgid "Your device uses positioning technologies provided by HERE."
696+#: qml/Wizard/Pages/80-finished.qml:91
697+msgid "Welcome Back"
811698msgstr ""
812699
813−#: qml/Wizard/Pages/here-terms.qml:81
814−msgid ""
815−"To provide you with positioning services and to improve their quality, HERE "
816−"collects information about nearby cell towers and Wi-Fi hotspots around your "
817−"current location whenever your position is being found."
700+#: qml/Wizard/Pages/80-finished.qml:91
701+msgid "Welcome to Ubuntu"
818702msgstr ""
819703
820−#: qml/Wizard/Pages/here-terms.qml:93
821−msgid ""
822−"The information collected is used to analyze the service and to improve the "
823−"use of service, but not to identify you personally."
704+#: qml/Wizard/Pages/80-finished.qml:106
705+msgid "You are ready to use your device now"
824706msgstr ""
825707
826−#: qml/Wizard/Pages/here-terms.qml:106
827−#, qt-format
828−msgid "By continuing, you agree to the HERE platform %1 and %2."
708+#: qml/Wizard/Pages/80-finished.qml:126
709+msgid "Continue"
829710msgstr ""
830711
831−#: qml/Wizard/Pages/here-terms.qml:107
832−msgid "Service Terms"
712+#: qml/Wizard/Pages/80-finished.qml:126
713+msgid "Get Started"
833714msgstr ""
834715
835716#: qml/Wizard/Pages/passcode-confirm.qml:43
836−#: qml/Wizard/Pages/passcode-desktop.qml:97
717+#: qml/Wizard/Pages/passcode-desktop.qml:104
837718msgid "Confirm passcode"
838719msgstr ""
839720
@@ -850,24 +731,24 @@ msgstr ""
850731msgid "Lock Screen Passcode"
851732msgstr ""
852733
853−#: qml/Wizard/Pages/passcode-desktop.qml:61
734+#: qml/Wizard/Pages/passcode-desktop.qml:68
854735msgid "Enter 4 numbers to setup your passcode"
855736msgstr ""
856737
857−#: qml/Wizard/Pages/passcode-desktop.qml:77
738+#: qml/Wizard/Pages/passcode-desktop.qml:84
858739#: qml/Wizard/Pages/passcode-set.qml:54
859740msgid "Choose passcode"
860741msgstr ""
861742
862−#: qml/Wizard/Pages/passcode-desktop.qml:127
743+#: qml/Wizard/Pages/passcode-desktop.qml:139
863744msgid "Passcode too short"
864745msgstr ""
865746
866−#: qml/Wizard/Pages/passcode-desktop.qml:129
747+#: qml/Wizard/Pages/passcode-desktop.qml:141
867748msgid "Passcodes match"
868749msgstr ""
869750
870−#: qml/Wizard/Pages/passcode-desktop.qml:131
751+#: qml/Wizard/Pages/passcode-desktop.qml:143
871752msgid "Passcodes do not match"
872753msgstr ""
873754
@@ -879,15 +760,15 @@ msgstr ""
879760msgid "Lock Screen Password"
880761msgstr ""
881762
882−#: qml/Wizard/Pages/password-set.qml:62
763+#: qml/Wizard/Pages/password-set.qml:68
883764msgid "Enter at least 8 characters"
884765msgstr ""
885766
886−#: qml/Wizard/Pages/password-set.qml:74
767+#: qml/Wizard/Pages/password-set.qml:80
887768msgid "Choose password"
888769msgstr ""
889770
890−#: qml/Wizard/Pages/password-set.qml:104
771+#: qml/Wizard/Pages/password-set.qml:110
891772msgid "Confirm password"
892773msgstr ""
893774
@@ -943,12 +824,25 @@ msgstr ""
943824msgid "Very weak password"
944825msgstr ""
945826
827+#~ msgid "Less..."
828+#~ msgstr "По-малко..."
829+
830+#~ msgid "Send"
831+#~ msgstr "Изпрати"
832+
833+#~ msgid "Rate this"
834+#~ msgstr "Оценете това"
835+
836+#~ msgid "Add a review"
837+#~ msgstr "Добави отзив"
838+
839+#, fuzzy
840+#~ msgid "Please wait..."
841+#~ msgstr "Зарежда се. Моля, почакайте..."
842+
946843#~ msgid "Confirm"
947844#~ msgstr "Потвърди"
948845
949−#~ msgid "Search"
950−#~ msgstr "Търсене"
951−
952846#~ msgid "Top edge"
953847#~ msgstr "Горен край"
954848
@@ -964,9 +858,6 @@ msgstr ""
964858#~ msgid "Type or say a command"
965859#~ msgstr "Въведете или кажете команда"
966860
967−#~ msgid "Speaking..."
968−#~ msgstr "Говорете..."
969−
970861#~ msgid "Speak Now..."
971862#~ msgstr "Говорете сега..."
972863
@@ -976,22 +867,14 @@ msgstr ""
976867#~ msgid "Skip intro"
977868#~ msgstr "Пропусни интрото"
978869
979−#~ msgid "Loading. Please Wait..."
980−#~ msgstr "Зарежда се. Моля, почакайте..."
981−
982−#~ msgid "Try swiping from the top edge to access the indicators"
983−#~ msgstr ""
984−#~ "Опитайте се да приплъзнете пръста си от горния край към долния, за да "
985−#~ "получите достъп до индикаторите"
986−
987870#~ msgid "Swipe up again to close the settings screen"
988871#~ msgstr ""
989872#~ "Отново приплъзнете пръста си нагоре за да затворите екрана с настройките"
990873
991874#~ msgid "Swipe from the left to reveal the launcher for quick access to apps"
992875#~ msgstr ""
993−#~ "Приплъзнете пръста си от левия край към десния, за да отворите стартера за "
994−#~ "бърз достъп до приложенията"
876+#~ "Приплъзнете пръста си от левия край към десния, за да отворите стартера "
877+#~ "за бърз достъп до приложенията"
995878
996879#~ msgid "Try swiping from the right edge to unlock the phone"
997880#~ msgstr ""
po/bn.po+350−420
@@ -6,67 +6,69 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2017-04-04 22:56+0000\n"
11−"PO-Revision-Date: 2015-11-27 19:38+0000\n"
12−"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13−"Language-Team: Bengali <bn@li.org>\n"
9+"Report-Msgid-Bugs-To: \n"
10+"POT-Creation-Date: 2021-01-29 11:42-0600\n"
11+"PO-Revision-Date: 2021-02-01 21:06+0000\n"
12+"Last-Translator: imrufbd <imrufbd@gmail.com>\n"
13+"Language-Team: Bengali <https://translate.ubports.com/projects/ubports/"
14+"lomiri/bn/>\n"
15+"Language: bn\n"
1416"MIME-Version: 1.0\n"
1517"Content-Type: text/plain; charset=UTF-8\n"
1618"Content-Transfer-Encoding: 8bit\n"
1719"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
19−"X-Generator: Launchpad (build 18343)\n"
20+"X-Generator: Weblate 3.11.3\n"
21+"X-Launchpad-Export-Date: 2016-11-23 06:34+0000\n"
2022
21−#: plugins/LightDM/Greeter.cpp:188
23+#: plugins/LightDM/Greeter.cpp:199
2224msgid "Password: "
2325msgstr "পাসওয়ার্ড: "
2426
25−#: plugins/LightDM/Greeter.cpp:203
27+#: plugins/LightDM/Greeter.cpp:214
2628msgid "Username"
27−msgstr ""
29+msgstr "ইউজারনেম"
2830
29−#: plugins/LightDM/Greeter.cpp:242
31+#: plugins/LightDM/Greeter.cpp:258
3032msgid "Failed to authenticate"
31−msgstr ""
33+msgstr "যাচাই করা যায়নি"
3234
33−#: plugins/LightDM/Greeter.cpp:244
35+#: plugins/LightDM/Greeter.cpp:260
3436msgid "Invalid password, please try again"
35−msgstr ""
37+msgstr "ভুল পাসওয়ার্ড, আবার চেষ্টা করুন"
3638
37−#: plugins/LightDM/Greeter.cpp:254
39+#: plugins/LightDM/Greeter.cpp:270
3840msgid "Log In"
39−msgstr ""
41+msgstr "লগইন করুন"
4042
41−#: plugins/LightDM/Greeter.cpp:254
43+#: plugins/LightDM/Greeter.cpp:270
4244msgid "Retry"
43−msgstr ""
45+msgstr "আবার চেষ্টা করুন"
4446
4547#: plugins/LightDM/UsersModel.cpp:157
4648msgid "Login"
47−msgstr ""
49+msgstr "লগইন করুন"
4850
4951#: plugins/LightDM/UsersModel.cpp:165
5052msgid "Guest Session"
51−msgstr ""
53+msgstr "গেস্ট সেশন"
5254
53−#: plugins/Unity/Launcher/launcheritem.cpp:49
54−#: plugins/Unity/Launcher/launcheritem.cpp:123
55+#: plugins/Unity/Launcher/launcheritem.cpp:48
56+#: plugins/Unity/Launcher/launcheritem.cpp:122
5557msgid "Pin shortcut"
56−msgstr "পিন"
58+msgstr "শর্টকাট যোগ করুন"
5759
58−#: plugins/Unity/Launcher/launcheritem.cpp:55
60+#: plugins/Unity/Launcher/launcheritem.cpp:54
5961msgid "Quit"
60−msgstr ""
62+msgstr "বাহির"
6163
62−#: plugins/Unity/Launcher/launcheritem.cpp:123
64+#: plugins/Unity/Launcher/launcheritem.cpp:122
6365msgid "Unpin shortcut"
64−msgstr "আনপিন"
66+msgstr "শর্টকাট সরান"
6567
6668#: qml/Components/Dialogs.qml:176
6769msgctxt "Title: Lock/Log out dialog"
6870msgid "Log out"
69−msgstr ""
71+msgstr "লগআউট করুন"
7072
7173#: qml/Components/Dialogs.qml:177
7274msgid "Are you sure you want to log out?"
@@ -80,11 +82,10 @@ msgstr "লক করুন"
8082#: qml/Components/Dialogs.qml:191
8183msgctxt "Button: Log out from the system"
8284msgid "Log Out"
83−msgstr ""
85+msgstr "লগআউট করুন"
8486
85−#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
87−#: qml/Wizard/Pages/passcode-confirm.qml:32
87+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:284
88+#: qml/Greeter/NarrowView.qml:215 qml/Wizard/Pages/passcode-confirm.qml:32
8889#: qml/Wizard/Pages/passcode-set.qml:32
8990msgid "Cancel"
9091msgstr "বাতিল"
@@ -106,12 +107,12 @@ msgstr "না"
106107msgid "Yes"
107108msgstr "হ্যাঁ"
108109
109−#: qml/Components/Dialogs.qml:239
110+#: qml/Components/Dialogs.qml:243
110111msgctxt "Title: Power off/Restart dialog"
111112msgid "Power"
112−msgstr ""
113+msgstr "বন্ধ/চালু"
113114
114−#: qml/Components/Dialogs.qml:240
115+#: qml/Components/Dialogs.qml:244
115116msgid ""
116117"Are you sure you would like\n"
117118"to power off?"
@@ -119,193 +120,187 @@ msgstr ""
119120"আপনি নিশ্চিত যে আপনি\n"
120121"বন্ধ করতে চান?"
121122
122−#: qml/Components/Dialogs.qml:244
123+#: qml/Components/Dialogs.qml:248
123124msgctxt "Button: Power off the system"
124125msgid "Power off"
125126msgstr "বন্ধ করুন"
126127
127−#: qml/Components/Dialogs.qml:255
128+#: qml/Components/Dialogs.qml:263
128129msgctxt "Button: Restart the system"
129130msgid "Restart"
130131msgstr "পুনরায় চালু"
131132
133+#: qml/Components/Dialogs.qml:276
134+#, fuzzy
135+#| msgid "Takes a screenshot."
136+msgid "Screenshot"
137+msgstr "স্ক্রীনশট নেওয়া।"
138+
132139#: qml/Components/KeyboardShortcutsOverlay.qml:41
133140msgid "Keyboard Shortcuts"
134−msgstr ""
141+msgstr "কিবোর্ড শর্টকাট"
135142
136143#: qml/Components/KeyboardShortcutsOverlay.qml:55
137−msgid "Unity 8"
144+msgid "Lomiri"
138145msgstr ""
139146
140147#: qml/Components/KeyboardShortcutsOverlay.qml:62
141148msgid "PrtScr"
142−msgstr ""
149+msgstr "প্রিন্টস্ক্রিন"
143150
144151#: qml/Components/KeyboardShortcutsOverlay.qml:67
145152msgid "Takes a screenshot."
146−msgstr ""
153+msgstr "স্ক্রীনশট নেওয়া।"
147154
148155#: qml/Components/KeyboardShortcutsOverlay.qml:75
149156msgid "Alt + PrtScr"
150−msgstr ""
157+msgstr "অল্টার কী + প্রিন্টস্ক্রীন কী"
151158
152159#: qml/Components/KeyboardShortcutsOverlay.qml:80
153160msgid "Takes a screenshot of the current window."
154−msgstr ""
161+msgstr "দৃশ্যমান উইন্ডো এর স্ক্রীনশট।"
155162
156163#: qml/Components/KeyboardShortcutsOverlay.qml:88
157164msgid "Super + Space"
158−msgstr ""
165+msgstr "সুপার কী + স্পেস কী"
159166
160167#: qml/Components/KeyboardShortcutsOverlay.qml:93
161168msgid "Switches to next keyboard layout."
162−msgstr ""
169+msgstr "পরবর্তী কিবোর্ড নকশা নির্বাচন।"
163170
164171#: qml/Components/KeyboardShortcutsOverlay.qml:101
165172msgid "Super + Shift + Space"
166−msgstr ""
173+msgstr "সুপার কী + শিফট্ কী + স্পেস কী"
167174
168175#: qml/Components/KeyboardShortcutsOverlay.qml:106
169176msgid "Switches to previous keyboard layout."
170−msgstr ""
177+msgstr "পূর্ববর্তী কিবোর্ড নকশা নির্বাচন।"
171178
172179#: qml/Components/KeyboardShortcutsOverlay.qml:114
173180msgid "Ctrl + Alt + T"
174−msgstr ""
181+msgstr "কন্ট্রোল কী + অল্টার কী + T"
175182
176183#: qml/Components/KeyboardShortcutsOverlay.qml:119
177184msgid "Starts the Terminal application."
178−msgstr ""
185+msgstr "টার্মিনাল এপ্লিকেশন চালু।"
179186
180187#: qml/Components/KeyboardShortcutsOverlay.qml:131
181188msgid "Launcher"
182−msgstr ""
189+msgstr "লঞ্চার"
183190
184191#: qml/Components/KeyboardShortcutsOverlay.qml:138
185192msgid "Super (Hold)"
186−msgstr ""
193+msgstr "সুপার কী (কিছুক্ষণ চেপে ধরে রাখুন)"
187194
188195#: qml/Components/KeyboardShortcutsOverlay.qml:143
189196msgid "Opens the launcher, displays shortcuts."
190−msgstr ""
197+msgstr "লঞ্চারে প্রবেশ, শর্টকাট প্রদর্শন।"
191198
192199#: qml/Components/KeyboardShortcutsOverlay.qml:151
193200msgid "Alt + F1"
194−msgstr ""
201+msgstr "অল্টার কী + F1 কী"
195202
196203#: qml/Components/KeyboardShortcutsOverlay.qml:156
197204msgid "Opens launcher keyboard navigation mode."
198−msgstr ""
205+msgstr "লঞ্চার কিবোর্ড নেভিগেশন মোড চালু ।"
199206
200207#: qml/Components/KeyboardShortcutsOverlay.qml:164
201208msgid "Super + Tab"
202−msgstr ""
209+msgstr "সুপার কী + ট্যাব কী"
203210
204211#: qml/Components/KeyboardShortcutsOverlay.qml:169
205212msgid "Switches applications via the launcher."
206−msgstr ""
213+msgstr "লঞ্চারের মাধ্যমে এপ্লিকেশন পরিবর্তন।"
207214
208215#: qml/Components/KeyboardShortcutsOverlay.qml:177
209216msgid "Super + 1 to 0"
210−msgstr ""
217+msgstr "সুপার কী + ১ থেকে ০"
211218
212219#: qml/Components/KeyboardShortcutsOverlay.qml:182
213220msgid "Same as clicking on a launcher icon."
214−msgstr ""
221+msgstr "লঞ্চার আইকনে ক্লিক করার মতই কাজ করে।"
215222
216223#: qml/Components/KeyboardShortcutsOverlay.qml:190
217224msgid "Super + A"
218−msgstr ""
225+msgstr "সুপার কী + A"
219226
220227#: qml/Components/KeyboardShortcutsOverlay.qml:195
221228msgid "Opens the Application Drawer."
222−msgstr ""
223−
224−#: qml/Components/KeyboardShortcutsOverlay.qml:207
225−msgid "Scopes"
226−msgstr ""
227−
228−#: qml/Components/KeyboardShortcutsOverlay.qml:214
229−msgid "Super (Tap)"
230−msgstr ""
231−
232−#: qml/Components/KeyboardShortcutsOverlay.qml:219
233−msgid "Opens the Scopes home."
234−msgstr ""
229+msgstr "এপ্লিকেশন ড্রয়ারে প্রবেশ।"
235230
236231#: qml/Components/KeyboardShortcutsOverlay.qml:235
237232msgid "Switching"
238−msgstr ""
233+msgstr "পরিবর্তন"
239234
240235#: qml/Components/KeyboardShortcutsOverlay.qml:242
241236msgid "Alt + Tab"
242−msgstr ""
237+msgstr "অল্টার কী + ট্যাব কী"
243238
244239#: qml/Components/KeyboardShortcutsOverlay.qml:247
245240msgid "Switches between applications."
246−msgstr ""
241+msgstr "একাধিক চালু এপ্লিকেশনের মধ্যে একটি নির্বাচন করে।"
247242
248243#: qml/Components/KeyboardShortcutsOverlay.qml:255
249244msgid "Super + W"
250−msgstr ""
245+msgstr "সুপার কী + W"
251246
252247#: qml/Components/KeyboardShortcutsOverlay.qml:260
253248msgid "Opens the desktop spread."
254−msgstr ""
249+msgstr "ডেস্কটপের প্রসারণে প্রবেশ।"
255250
256251#: qml/Components/KeyboardShortcutsOverlay.qml:268
257252msgid "Cursor Left or Right"
258−msgstr ""
253+msgstr "কার্সর বাম থেকে ডানে"
259254
260255#: qml/Components/KeyboardShortcutsOverlay.qml:273
261256msgid "Moves the focus."
262−msgstr ""
257+msgstr "ফোকাস সরায়।"
263258
264259#: qml/Components/KeyboardShortcutsOverlay.qml:285
265260msgid "Windows"
266−msgstr ""
261+msgstr "উইন্ডো সমূহ"
267262
268263#: qml/Components/KeyboardShortcutsOverlay.qml:292
269264msgid "Ctrl + Super + D"
270−msgstr ""
265+msgstr "কন্ট্রোল কী + সুপার কী + D"
271266
272267#: qml/Components/KeyboardShortcutsOverlay.qml:297
273268msgid "Minimizes all windows."
274−msgstr ""
269+msgstr "সব উইন্ডোকে লঘু করে।"
275270
276271#: qml/Components/KeyboardShortcutsOverlay.qml:305
277272msgid "Ctrl + Super + Up"
278−msgstr ""
273+msgstr "কন্ট্রোল কী + সুপার কী + আপ এ্যরো কী"
279274
280275#: qml/Components/KeyboardShortcutsOverlay.qml:310
281276msgid "Maximizes the current window."
282−msgstr ""
277+msgstr "দৃশ্যমান উইন্ডোটিকে বর্ধিত করে।"
283278
284279#: qml/Components/KeyboardShortcutsOverlay.qml:318
285280msgid "Ctrl + Super + Down"
286−msgstr ""
281+msgstr "কন্ট্রোল কী + সুপার কী + ডাউন এ্যরো কী"
287282
288283#: qml/Components/KeyboardShortcutsOverlay.qml:323
289284msgid "Minimizes or restores the current window."
290−msgstr ""
285+msgstr "বর্তমান উইন্ডোটিকে লঘু করে অথবা পূ্র্বাবস্থায় ফিরিয়ে নিয়ে যায়।"
291286
292287#: qml/Components/KeyboardShortcutsOverlay.qml:331
293288msgid "Ctrl + Super + Left or Right"
294−msgstr ""
289+msgstr "কন্ট্রোল কী + সুপার কী + বাম এ্যরো কী"
295290
296291#: qml/Components/KeyboardShortcutsOverlay.qml:336
297292msgid "Semi-maximizes the current window."
298−msgstr ""
293+msgstr "বর্তমান উইন্ডোটিকে অর্ধ-বর্ধিত করে।"
299294
300295#: qml/Components/KeyboardShortcutsOverlay.qml:344
301296msgid "Alt + F4"
302−msgstr ""
297+msgstr "অল্টার কী + F4 কী"
303298
304299#: qml/Components/KeyboardShortcutsOverlay.qml:349
305300msgid "Closes the current window."
306−msgstr ""
301+msgstr "বর্তমান উইন্ডোটি বন্ধ করে।"
307302
308−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
303+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:235
309304msgid "Return to Call"
310305msgstr "কল এ ফিরে যান"
311306
@@ -320,225 +315,130 @@ msgstr "ঠিক আছে"
320315#: qml/Components/MediaServices/VideoPlayerControls.qml:44
321316#, qt-format
322317msgid "%1:%2:%3"
323−msgstr ""
318+msgstr "%1:%2:%3"
324319
325320#: qml/Components/MediaServices/VideoPlayerControls.qml:49
326321#, qt-format
327322msgid "%1:%2"
328−msgstr ""
323+msgstr "%1:%2"
329324
330325#: qml/Components/ModeSwitchWarningDialog.qml:33
331326msgid "Apps may have unsaved data:"
332−msgstr ""
327+msgstr "এ্যাপ সমূহে কিছু অসংরক্ষিত ডেটা থাকতে পারে:"
333328
334329#: qml/Components/ModeSwitchWarningDialog.qml:60
335330msgctxt ""
336331"Re-dock means connect the device again to an external screen/mouse/keyboard"
337332msgid "Re-dock, save your work and close these apps to continue."
338333msgstr ""
334+"পূনসংযুক্ত করুন, প্রক্রিয়া চলমান রাখার জন্য কাজগুলি সংরক্ষণ করে অ্যাপগুলি বন্ধ করুন।"
339335
340336#: qml/Components/ModeSwitchWarningDialog.qml:67
341337msgid "Or force close now (unsaved data will be lost)."
342−msgstr ""
338+msgstr "অথবা জোরপূর্বক এখনি বন্ধ করুন (আপনার অসংরক্ষিত তথ্য হারিয়ে যাবে)।"
343339
344340#: qml/Components/ModeSwitchWarningDialog.qml:80
345341msgid "OK, I will reconnect"
346−msgstr ""
342+msgstr "ঠিক আছে, আমি পূনঃসংযুক্ত করব"
347343
348344#: qml/Components/ModeSwitchWarningDialog.qml:81
349345msgid "Reconnect now!"
350−msgstr ""
346+msgstr "এখনি পূনসংযুক্ত করুন!"
351347
352348#: qml/Components/ModeSwitchWarningDialog.qml:94
353349msgid "Close all"
354−msgstr ""
350+msgstr "সবগুলো বন্ধ করুন"
355351
356352#: qml/Components/SharingPicker.qml:54
357353msgid "Preview Share Item"
358−msgstr ""
354+msgstr "বিনিময় তালিকা অবলোকন"
359355
360356#: qml/Components/VirtualTouchPad.qml:317
361357msgid ""
362358"Your device is now connected to an external display. Use this screen as a "
363359"touch pad to interact with the pointer."
364360msgstr ""
361+"আপনার ডিভাইস অন্য পর্দার সাথে সংযুক্ত হয়েছে। মাউসের জন্য এই পর্দাটি টাচপ্যাড হিসেবে "
362+"ব্যবহার করুন।"
365363
366364#: qml/Components/VirtualTouchPad.qml:327
367365msgid "Tap left button to click."
368−msgstr ""
366+msgstr "ক্লিক করার জন্য বাম বোতাম চাপুন..."
369367
370368#: qml/Components/VirtualTouchPad.qml:339
371369msgid "Tap right button to right click."
372−msgstr ""
370+msgstr "ডান ক্লিকের জন্য ডান বোতাম চাপুন।"
373371
374372#: qml/Components/VirtualTouchPad.qml:351
375373msgid "Swipe with two fingers to scroll."
376−msgstr ""
374+msgstr "স্ক্রলের জন্য আঙুল চালান।"
377375
378376#: qml/Components/VirtualTouchPad.qml:396
379377msgid "Find more settings in the system settings."
380−msgstr ""
381−
382−#: qml/Dash/DashPageHeader.qml:361
383−msgctxt "Button: Open the Ubuntu Store"
384−msgid "Store"
385−msgstr "স্টোর"
386−
387−#: qml/Dash/DashPageHeader.qml:368
388−msgctxt "Button: Start a search in the current dash scope"
389−msgid "Search"
390−msgstr "খুঁজুন"
391−
392−#: qml/Dash/DashPageHeader.qml:378
393−msgctxt "Button: Show the current dash scope settings"
394−msgid "Settings"
395−msgstr "সেটিংস"
396−
397−#: qml/Dash/DashPageHeader.qml:385
398−msgid "Remove from Favorites"
399−msgstr "পছন্দ থেকে মুছে ফেলুন"
400−
401−#: qml/Dash/DashPageHeader.qml:385
402−msgid "Add to Favorites"
403−msgstr "পছন্দতে যোগ করুন"
404−
405−#: qml/Dash/FiltersPopover.qml:61
406−msgid "Refine your results"
407−msgstr ""
408−
409−#: qml/Dash/FiltersPopover.qml:70
410−msgid "Reset"
411−msgstr ""
412−
413−#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
414−msgid "Show less"
415−msgstr ""
416−
417−#: qml/Dash/GenericScopeView.qml:547
418−msgid "Show all"
419−msgstr ""
420−
421−#: qml/Dash/GenericScopeView.qml:578
422−msgctxt "Label: Hint for dash search line edit"
423−msgid "Search"
424−msgstr "খুঁজুন"
425−
426−#: qml/Dash/PageHeaderExtraPanel.qml:67
427−msgid "Recent Searches"
428−msgstr ""
429−
430−#: qml/Dash/PageHeaderExtraPanel.qml:78
431−msgid "Clear All"
432−msgstr ""
433−
434−#: qml/Dash/Previews/PreviewActionCombo.qml:36
435−msgid "More..."
436−msgstr "আরো..."
437−
438−#: qml/Dash/Previews/PreviewActionCombo.qml:36
439−msgid "Less..."
440−msgstr "কম..."
441−
442−#: qml/Dash/Previews/PreviewCommentInput.qml:83
443−#: qml/Dash/Previews/PreviewRatingInput.qml:202
444−msgid "Send"
445−msgstr "পাঠান"
446−
447−#: qml/Dash/Previews/PreviewRatingInput.qml:109
448−msgid "Rate this"
449−msgstr "রেটিং দিন"
450−
451−#: qml/Dash/Previews/PreviewRatingInput.qml:184
452−msgid "Add a review"
453−msgstr "আপনার মতামত দিন"
454−
455−#: qml/Dash/PullToRefreshScopeStyle.qml:56
456−msgid "Pull to refresh…"
457−msgstr "রিফ্রেশ করার জন্য টানুন"
458−
459−#: qml/Dash/PullToRefreshScopeStyle.qml:61
460−msgid "Release to refresh…"
461−msgstr "রিফ্রেশ করার জন্য ছেড়ে দিন"
462−
463−#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
464−msgid "Enable location data"
465−msgstr "অবস্থান নির্ণয় চালু করুন"
466−
467−#: qml/Dash/ScopesList.qml:146
468−msgid "Manage"
469−msgstr "ব্যবস্থাপনা"
470−
471−#: qml/Dash/ScopesList.qml:187
472−msgid "Home"
473−msgstr ""
474−
475−#: qml/Dash/ScopesList.qml:188
476−msgid "Also installed"
477−msgstr "আরও ইন্সটল করা রয়েছে..."
378+msgstr "সিস্টেম সেটিংসে আরও সেটিংস খুজুন।"
478379
479380#: qml/Greeter/CoverPage.qml:127
480381msgid "Unlock"
481−msgstr "লক খুলুন"
382+msgstr "তালা খুলুন"
482383
483384#: qml/Greeter/DelayedLockscreen.qml:43
484385msgid "Device Locked"
485−msgstr "ডিভাইসটি লক করা"
386+msgstr "ডিভাইসটি তালা দেওয়া"
486387
487388#: qml/Greeter/DelayedLockscreen.qml:58
488389msgid "You have been locked out due to too many failed passphrase attempts."
489−msgstr "অধিকবার পাসফ্রেজ ভুল দেওয়ার কারনে আপনার আইডি লক করা হয়েছে"
390+msgstr "অনেকবেশিবার ভুল পাসফ্রেজ চেষ্টা করায় আপনাকে প্রবেশ হতে বিরত রাখা হল।"
490391
491392#: qml/Greeter/DelayedLockscreen.qml:59
492393msgid "You have been locked out due to too many failed passcode attempts."
493−msgstr "অধিকবার পাসকোড ভুল করার কারনে আপনার আইডি লক করা হয়েছে"
394+msgstr "অনেকবেশিবার ভুল পাসকোড চেষ্টা করায় আপনাকে প্রবেশ হতে বিরত রাখা হল।"
494395
495396#: qml/Greeter/DelayedLockscreen.qml:68
496397#, qt-format
497398msgid "Please wait %1 minute and then try again…"
498399msgid_plural "Please wait %1 minutes and then try again…"
499−msgstr[0] "অনুগ্রহ করে %1 মিনিট অপেক্ষা করুন এবং পরবর্তীতে চেষ্টা করুন..."
500−msgstr[1] "অনুগ্রহ করে %1 মিনিট অপেক্ষা করুন এবং পরবর্তীতে চেষ্টা করুন..."
400+msgstr[0] "অনুগ্রহ করে %1 মিনিট অপেক্ষা করুন এবং পরবর্তীতে আবার চেষ্টা করুন …"
401+msgstr[1] "অনুগ্রহ করে %1 মিনিটের মত অপেক্ষা করুন এবং পরবর্তীতে চেষ্টা করুন …"
501402
502403#: qml/Greeter/Greeter.qml:550
503404msgid "Try again"
504−msgstr ""
405+msgstr "আবার চেষ্টা করুন"
505406
506407#: qml/Greeter/Greeter.qml:551
507408msgid "Enter passphrase to unlock"
508−msgstr ""
409+msgstr "তালা খোলার জন্য পাসফ্রেজ লিখুন"
509410
510411#: qml/Greeter/Greeter.qml:552
511412msgid "Enter passcode to unlock"
512−msgstr ""
413+msgstr "তালা খোলার জন্য পাসকোড লিখুন"
513414
514−#: qml/Greeter/NarrowView.qml:228
415+#: qml/Greeter/NarrowView.qml:235
515416msgid "Emergency"
516−msgstr ""
417+msgstr "জরুরী"
517418
518419#: qml/Greeter/PromptList.qml:126
519420msgid "Passphrase"
520−msgstr ""
421+msgstr "পাসফ্রেজ"
521422
522423#: qml/Greeter/PromptList.qml:126
523424msgid "Passcode"
524−msgstr ""
425+msgstr "পাসকোড"
525426
526427#: qml/Greeter/SessionsList.qml:124
527428msgid "Select desktop environment"
528−msgstr ""
429+msgstr "ডেস্কটপ বাতাবরণ নির্বাচন করুন"
529430
530−#: qml/Launcher/Drawer.qml:94
431+#: qml/Launcher/Drawer.qml:250
531432msgid "Search…"
532−msgstr ""
433+msgstr "অনুসন্ধান …"
533434
534−#: qml/Launcher/Drawer.qml:129
535−msgctxt "Apps sorted alphabetically"
536−msgid "A-Z"
537−msgstr ""
435+#: qml/Launcher/PullToRefreshScopeStyle.qml:56
436+msgid "Pull to refresh…"
437+msgstr "রিফ্রেশ করার জন্য টানুন"
538438
539−#: qml/Launcher/MoreAppsHeader.qml:55
540−msgid "More apps in the store"
541−msgstr ""
439+#: qml/Launcher/PullToRefreshScopeStyle.qml:61
440+msgid "Release to refresh…"
441+msgstr "রিফ্রেশ করার জন্য ছেড়ে দিন"
542442
543443#: qml/Notifications/NotificationMenuItemFactory.qml:124
544444msgid "Show password"
@@ -554,28 +454,28 @@ msgstr "কনফারেন্স"
554454
555455#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
556456msgid "Nothing is playing"
557−msgstr "কোন কিছু বাজছে না।"
457+msgstr "কোনকিছু প্লে হচ্ছেনা"
558458
559459#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
560460#, qt-format
561461msgid "%1 hour"
562462msgid_plural "%1 hours"
563−msgstr[0] "%1 ঘণ্টা"
564−msgstr[1] "%1 ঘণ্টা"
463+msgstr[0] "%1 ঘন্টা"
464+msgstr[1] "%1 ঘন্টায়"
565465
566466#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
567467#, qt-format
568468msgid "%1 minute"
569469msgid_plural "%1 minutes"
570470msgstr[0] "%1 মিনিট"
571−msgstr[1] "%1 মিনিট"
471+msgstr[1] "%1 মিনিটে"
572472
573473#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
574474#, qt-format
575475msgid "%1 second"
576476msgid_plural "%1 seconds"
577477msgstr[0] "%1 সেকেন্ড"
578−msgstr[1] "%1 সেকেন্ড"
478+msgstr[1] "%1 সেকেন্ডে"
579479
580480#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
581481msgid "0 seconds"
@@ -589,7 +489,7 @@ msgstr "%1 বাকি"
589489
590490#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
591491msgid "In queue…"
592−msgstr "অপেক্ষায় রয়েছে..."
492+msgstr "অপেক্ষমান…"
593493
594494#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
595495msgid "Downloading"
@@ -597,7 +497,7 @@ msgstr "ডাউনলোড হচ্ছে"
597497
598498#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
599499msgid "Paused, tap to resume"
600−msgstr "থামানো, শুরু করতে চাপ দিন"
500+msgstr "থেমে আছে, শুরু করতে চাপ দিন"
601501
602502#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
603503msgid "Canceled"
@@ -615,7 +515,7 @@ msgstr "ব্যার্থ হয়েছে, পুনরায় চেষ্
615515#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
616516msgctxt "Button: Send a reply message"
617517msgid "Send"
618−msgstr ""
518+msgstr "পাঠান"
619519
620520#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
621521msgctxt "Label: Hint in message indicator line edit"
@@ -629,279 +529,261 @@ msgstr "কল ব্যাক"
629529
630530#: qml/Panel/PanelMenuPage.qml:92
631531msgid "Back"
632−msgstr ""
532+msgstr "পূর্বপাতা"
633533
634534#: qml/Stage/SideStage.qml:76
635535msgid "Drag using 3 fingers any application from one window to the other"
636−msgstr ""
536+msgstr "তিন আঙুল দিয়ে ধরে যেকোন অ্যাপ্লিকেেশন এক উইন্ডো থেকে অন্যটিতে নিয়ে আসুন"
537+
538+#: qml/Stage/Stage.qml:671
539+msgid "No running apps"
540+msgstr "কোন অ্যাপ চলমান নেই"
637541
638542#: qml/Tutorial/TutorialLeftLong.qml:49
639543msgid "Long swipe from the left edge to open the Application Drawer"
640−msgstr ""
544+msgstr "অ্যাপ্লিকেশন দেরাজ খুলতে বামদিক হতে সজোরে আঙুল চালান"
641545
642546#: qml/Tutorial/TutorialLeft.qml:47
643547msgid "Short swipe from the left edge to open the launcher"
644−msgstr ""
548+msgstr "লঞ্চার খুলতে বামদিক হতে আঙুল চালান"
645549
646−#: qml/Tutorial/TutorialRight.qml:55
550+#: qml/Tutorial/TutorialRight.qml:54
647551msgid "Push your mouse against the right edge to view your open apps"
648−msgstr ""
552+msgstr "চলমান অ্যাপগুলি দেখতে ডানপান্তের দিকে মাউস চাপুন"
649553
650−#: qml/Tutorial/TutorialRight.qml:56
554+#: qml/Tutorial/TutorialRight.qml:55
651555msgid "Swipe from the right edge to view your open apps"
652−msgstr ""
556+msgstr "চলমান অ্যাপগুলি দেখতে ডানপ্রান্ত হতে আঙুল চালান"
653557
654558#: qml/Tutorial/TutorialTop.qml:53
655559msgid "Swipe from the top edge to access notifications and quick settings"
656−msgstr ""
560+msgstr "বার্তাসমূহ এবং তড়িৎ সেটিংস দেখতে উপরের প্রান্ত হতে আঙুল চালান"
657561
658−#: qml/Wizard/Page.qml:54
562+#: qml/Wizard/Page.qml:59
659563msgctxt "Button: Go back one page in the Wizard"
660564msgid "Back"
661−msgstr ""
565+msgstr "পূর্বপাতা"
662566
663−#: qml/Wizard/Pages/10-welcome.qml:28
567+#: qml/Wizard/Pages/10-welcome.qml:29
664568msgid "Language"
665−msgstr ""
666−
667−#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
668−#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
669−#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
670−#: qml/Wizard/Pages/70-passwd-type.qml:145
671−#: qml/Wizard/Pages/75-report-check.qml:84
672−#: qml/Wizard/Pages/passcode-desktop.qml:142
673−#: qml/Wizard/Pages/password-set.qml:142
569+msgstr "ভাষা"
570+
571+#: qml/Wizard/Pages/10-welcome.qml:176
572+#: qml/Wizard/Pages/10-welcome-update.qml:126
573+#: qml/Wizard/Pages/11-changelog.qml:74 qml/Wizard/Pages/20-keyboard.qml:152
574+#: qml/Wizard/Pages/30-wifi.qml:214 qml/Wizard/Pages/50-timezone.qml:272
575+#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/70-passwd-type.qml:146
576+#: qml/Wizard/Pages/passcode-desktop.qml:154
577+#: qml/Wizard/Pages/password-set.qml:153
674578msgid "Next"
675−msgstr ""
579+msgstr "পরবর্তী"
580+
581+#: qml/Wizard/Pages/10-welcome-update.qml:91
582+msgid "Welcome to "
583+msgstr "স্বাগতম "
584+
585+#: qml/Wizard/Pages/10-welcome-update.qml:106
586+msgid "We will make sure your device is ready to use "
587+msgstr "আপনার ডিভাইসটির ব্যবহার উপযোগিতা আমরা নিশ্চিত করব "
588+
589+#: qml/Wizard/Pages/11-changelog.qml:28
590+msgid "What's new"
591+msgstr "যা কিছু নতুন"
592+
593+#: qml/Wizard/Pages/11-changelog.qml:74
594+msgid "Loading..."
595+msgstr "লোড হচ্ছে..."
676596
677597#: qml/Wizard/Pages/20-keyboard.qml:31
678598msgid "Select Keyboard"
679−msgstr ""
599+msgstr "কিবোর্ড নির্বাচন করুন"
680600
681601#: qml/Wizard/Pages/20-keyboard.qml:71
682602msgid "Keyboard language"
683−msgstr ""
603+msgstr "কিবোর্ডের ভাষা"
684604
685605#: qml/Wizard/Pages/20-keyboard.qml:93
686606msgid "Keyboard layout"
687−msgstr ""
607+msgstr "কিবোর্ডের নকশা"
688608
689−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
690−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
609+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:214
610+#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/79-system-update.qml:144
611+#: qml/Wizard/Pages/sim.qml:101
691612msgid "Skip"
692613msgstr "এড়িয়ে যান"
693614
694−#: qml/Wizard/Pages/30-wifi.qml:30
615+#: qml/Wizard/Pages/30-wifi.qml:31
695616msgid "Connect to Wi‑Fi"
696−msgstr ""
617+msgstr "ওযাই-ফাইতে সংযুক্ত হোন"
697618
698−#: qml/Wizard/Pages/30-wifi.qml:131
619+#: qml/Wizard/Pages/30-wifi.qml:139
699620msgid "Connected"
700−msgstr ""
621+msgstr "সংযুক্ত"
701622
702−#: qml/Wizard/Pages/30-wifi.qml:164
623+#: qml/Wizard/Pages/30-wifi.qml:172
703624msgid "Available Wi-Fi networks"
704−msgstr ""
625+msgstr "লব্দ ওয়াই-ফাই নেটওয়ার্ক"
705626
706−#: qml/Wizard/Pages/30-wifi.qml:165
627+#: qml/Wizard/Pages/30-wifi.qml:173
707628msgid "No available Wi-Fi networks"
708−msgstr ""
709−
710−#: qml/Wizard/Pages/40-location.qml:27
711−msgid "Location Services"
712−msgstr ""
713−
714−#: qml/Wizard/Pages/40-location.qml:83
715−msgid ""
716−"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
717−"(recommended)"
718−msgstr ""
719−
720−#: qml/Wizard/Pages/40-location.qml:105
721−#, qt-format
722−msgid "By selecting this option you agree to the Nokia HERE %1."
723−msgstr ""
724−
725−#: qml/Wizard/Pages/40-location.qml:106
726−msgctxt "part of: Nokia HERE terms and conditions"
727−msgid "terms and conditions"
728−msgstr ""
729−
730−#: qml/Wizard/Pages/40-location.qml:160
731−msgid "GPS only"
732−msgstr ""
733−
734−#: qml/Wizard/Pages/40-location.qml:214
735−msgid "Don't use my location"
736−msgstr ""
737−
738−#: qml/Wizard/Pages/40-location.qml:260
739−msgid "You can change it later in System Settings."
740−msgstr ""
629+msgstr "কোন ওয়াই-ফাই নেটওয়ার্ক পাওয়া যায়নি"
741630
742631#: qml/Wizard/Pages/50-timezone.qml:30
743632msgid "Time Zone"
744−msgstr ""
633+msgstr "সময় অঞ্চল"
745634
746−#: qml/Wizard/Pages/50-timezone.qml:182
635+#: qml/Wizard/Pages/50-timezone.qml:183
747636msgid "Enter your city"
748−msgstr ""
637+msgstr "আপনার শহরের নাম লিখুন"
749638
750639#: qml/Wizard/Pages/60-account.qml:24
751640msgid "Personalize Your Device"
752−msgstr ""
641+msgstr "আপনার ডিভাইসে নিজস্বতা আনুন"
753642
754−#: qml/Wizard/Pages/60-account.qml:48
643+#: qml/Wizard/Pages/60-account.qml:54
755644msgid "Preferred Name"
756−msgstr ""
645+msgstr "পছন্দসই নাম"
757646
758647#: qml/Wizard/Pages/70-passwd-type.qml:40
759648msgid "Lock Screen"
760−msgstr ""
649+msgstr "তালাপর্দা"
761650
762−#: qml/Wizard/Pages/70-passwd-type.qml:102
651+#: qml/Wizard/Pages/70-passwd-type.qml:103
763652msgctxt "Label: Type of security method"
764653msgid "Create new password"
765−msgstr ""
654+msgstr "নতুন পাসওয়ার্ড"
766655
767−#: qml/Wizard/Pages/70-passwd-type.qml:104
656+#: qml/Wizard/Pages/70-passwd-type.qml:105
768657msgctxt "Label: Type of security method"
769658msgid "Create passcode (numbers only)"
770−msgstr ""
659+msgstr "নতুন পাসকোড (শুধুমাত্র সংখ্যা)"
771660
772−#: qml/Wizard/Pages/70-passwd-type.qml:106
661+#: qml/Wizard/Pages/70-passwd-type.qml:107
773662msgctxt "Label: Type of security method"
774663msgid "No lock code"
775−msgstr ""
664+msgstr "কোডবিহীন তালা"
776665
777−#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
778−msgid "Privacy Policy"
779−msgstr ""
666+#: qml/Wizard/Pages/79-system-update.qml:28
667+msgid "Update Device"
668+msgstr "ডিভাইসের আধুনিকায়ন"
780669
781−#: qml/Wizard/Pages/75-report-check.qml:26
782−msgid "Help Us Improve"
783−msgstr ""
784−
785−#: qml/Wizard/Pages/75-report-check.qml:59
786−msgid "Improve system performance by sending us crashes and error reports."
670+#: qml/Wizard/Pages/79-system-update.qml:55
671+msgid ""
672+"There is a system update available and ready to install. Afterwards, the "
673+"device will automatically restart."
787674msgstr ""
675+"একটি সিস্টেম সংযোজন ইন্সটলের জন্য প্রস্তুত। ইন্সটল শেষে ডিভাইসটি নিজেই পুনরায় চালু "
676+"হবে।"
788677
789−#: qml/Wizard/Pages/75-report-check.qml:60
790−msgid "Privacy policy"
791−msgstr ""
678+#: qml/Wizard/Pages/79-system-update.qml:76
679+msgctxt "string identifying name of the update"
680+msgid "Ubuntu Touch system"
681+msgstr "উবুন্টু টাচ সিস্টেম"
792682
793−#: qml/Wizard/Pages/80-finished.qml:89
794−msgid "Welcome to Ubuntu"
795−msgstr ""
683+#: qml/Wizard/Pages/79-system-update.qml:83
684+#, qt-format
685+msgctxt "version of the system update"
686+msgid "Version %1"
687+msgstr "সংস্করণ %1"
796688
797−#: qml/Wizard/Pages/80-finished.qml:104
798−msgid "You are ready to use your device now"
799−msgstr ""
689+#: qml/Wizard/Pages/79-system-update.qml:95
690+msgid "This could take a few minutes..."
691+msgstr "সম্পন্ন হতে কিছু সময় লাগতে পারে ..."
800692
801−#: qml/Wizard/Pages/80-finished.qml:124
802−msgid "Get Started"
803−msgstr ""
693+#: qml/Wizard/Pages/79-system-update.qml:109
694+msgid "Install and restart now"
695+msgstr "এখনি ইন্সটল এবং পুনরায় চালু করুন"
804696
805−#: qml/Wizard/Pages/here-terms.qml:25
806−msgid "Terms & Conditions"
807−msgstr ""
697+#: qml/Wizard/Pages/80-finished.qml:91
698+msgid "Welcome Back"
699+msgstr "ফিরে আসায় স্বাগতম"
808700
809−#: qml/Wizard/Pages/here-terms.qml:69
810−msgid "Your device uses positioning technologies provided by HERE."
811−msgstr ""
812−
813−#: qml/Wizard/Pages/here-terms.qml:81
814−msgid ""
815−"To provide you with positioning services and to improve their quality, HERE "
816−"collects information about nearby cell towers and Wi-Fi hotspots around your "
817−"current location whenever your position is being found."
818−msgstr ""
701+#: qml/Wizard/Pages/80-finished.qml:91
702+msgid "Welcome to Ubuntu"
703+msgstr "উবুন্টুতে স্বাগতম"
819704
820−#: qml/Wizard/Pages/here-terms.qml:93
821−msgid ""
822−"The information collected is used to analyze the service and to improve the "
823−"use of service, but not to identify you personally."
824−msgstr ""
705+#: qml/Wizard/Pages/80-finished.qml:106
706+msgid "You are ready to use your device now"
707+msgstr "আপনার ডিভাইসটি এখন ব্যবহারের জন্য প্রস্তুত"
825708
826−#: qml/Wizard/Pages/here-terms.qml:106
827−#, qt-format
828−msgid "By continuing, you agree to the HERE platform %1 and %2."
829−msgstr ""
709+#: qml/Wizard/Pages/80-finished.qml:126
710+msgid "Continue"
711+msgstr "এগিয়ে যান"
830712
831−#: qml/Wizard/Pages/here-terms.qml:107
832−msgid "Service Terms"
833−msgstr ""
713+#: qml/Wizard/Pages/80-finished.qml:126
714+msgid "Get Started"
715+msgstr "চলুন শুরু করি"
834716
835717#: qml/Wizard/Pages/passcode-confirm.qml:43
836−#: qml/Wizard/Pages/passcode-desktop.qml:97
718+#: qml/Wizard/Pages/passcode-desktop.qml:104
837719msgid "Confirm passcode"
838−msgstr ""
720+msgstr "পাসকোড নিশ্চিত করুন"
839721
840722#: qml/Wizard/Pages/passcode-confirm.qml:45
841723msgid "Incorrect passcode."
842−msgstr ""
724+msgstr "ভুল পাসকোড।"
843725
844726#: qml/Wizard/Pages/passcode-confirm.qml:45
845727msgctxt "Enter the passcode again"
846728msgid "Please re-enter."
847−msgstr ""
729+msgstr "পুনরায় লিখুন।"
848730
849731#: qml/Wizard/Pages/passcode-desktop.qml:31
850732msgid "Lock Screen Passcode"
851−msgstr ""
733+msgstr "তালাপর্দার পাসকোড"
852734
853−#: qml/Wizard/Pages/passcode-desktop.qml:61
735+#: qml/Wizard/Pages/passcode-desktop.qml:68
854736msgid "Enter 4 numbers to setup your passcode"
855−msgstr ""
737+msgstr "পাসকোডের জন্য ৪ টি সংখ্যা লিখুন"
856738
857−#: qml/Wizard/Pages/passcode-desktop.qml:77
739+#: qml/Wizard/Pages/passcode-desktop.qml:84
858740#: qml/Wizard/Pages/passcode-set.qml:54
859741msgid "Choose passcode"
860−msgstr ""
742+msgstr "পাসকোড নির্বাচন করুন"
861743
862−#: qml/Wizard/Pages/passcode-desktop.qml:127
744+#: qml/Wizard/Pages/passcode-desktop.qml:139
863745msgid "Passcode too short"
864−msgstr ""
746+msgstr "পাসকোড নির্ধারিত সংখ্যার চেয়ে কম"
865747
866−#: qml/Wizard/Pages/passcode-desktop.qml:129
748+#: qml/Wizard/Pages/passcode-desktop.qml:141
867749msgid "Passcodes match"
868−msgstr ""
750+msgstr "অনুরূপ পাসকোড"
869751
870−#: qml/Wizard/Pages/passcode-desktop.qml:131
752+#: qml/Wizard/Pages/passcode-desktop.qml:143
871753msgid "Passcodes do not match"
872−msgstr ""
754+msgstr "পাসকোড মিলেনি"
873755
874756#: qml/Wizard/Pages/passcode-set.qml:62
875757msgid "Passcode must be 4 characters long"
876−msgstr ""
758+msgstr "পাসকোড কমপক্ষে ৪ সংখ্যার হতে হবে"
877759
878760#: qml/Wizard/Pages/password-set.qml:31
879761msgid "Lock Screen Password"
880−msgstr ""
762+msgstr "তালাপর্দার পাসওয়ার্ড"
881763
882−#: qml/Wizard/Pages/password-set.qml:62
764+#: qml/Wizard/Pages/password-set.qml:68
883765msgid "Enter at least 8 characters"
884−msgstr ""
766+msgstr "কমপক্ষে ৮ টি বর্ণ লিখুন"
885767
886−#: qml/Wizard/Pages/password-set.qml:74
768+#: qml/Wizard/Pages/password-set.qml:80
887769msgid "Choose password"
888−msgstr ""
770+msgstr "পাসওয়ার্ড নির্বাচন করুন"
889771
890−#: qml/Wizard/Pages/password-set.qml:104
772+#: qml/Wizard/Pages/password-set.qml:110
891773msgid "Confirm password"
892−msgstr ""
774+msgstr "পাসওয়ার্ড নিশ্চিত করুন"
893775
894776#: qml/Wizard/Pages/sim.qml:27
895777msgid "No SIM card installed"
896−msgstr ""
778+msgstr "কোন সিমকার্ড প্রবেশ করানো হয়নি"
897779
898780#: qml/Wizard/Pages/sim.qml:54
899781msgid "SIM card added"
900−msgstr ""
782+msgstr "সিমকার্ড যুক্ত করা হয়েছে"
901783
902784#: qml/Wizard/Pages/sim.qml:55
903785msgid "You must restart the device to access the mobile network."
904−msgstr ""
786+msgstr "মোবাইল নেটওয়ার্কে সংযুক্তির জন্য ডিভাইসটি পুনারায় চালু করুন।"
905787
906788#: qml/Wizard/Pages/sim.qml:59
907789msgid "Restart"
@@ -909,39 +791,113 @@ msgstr "পুনরায় চালু"
909791
910792#: qml/Wizard/Pages/sim.qml:78
911793msgid "You won’t be able to make calls or use text messaging without a SIM."
912−msgstr ""
794+msgstr "সিম কার্ড ছাড়া আপনি কল করা বা টেক্সট মেসেজ পাঠাতে পারবেন না।"
913795
914796#: qml/Wizard/Pages/sim.qml:90
915797msgid "To proceed with no SIM tap Skip."
916−msgstr ""
798+msgstr "সিমবিহীন ব্যবহারের জন্য এড়িয়ে যান চাপুন।"
917799
918800#: qml/Wizard/PasswordMeter.qml:87
919801msgid "Password too short"
920−msgstr ""
802+msgstr "পাসওয়ার্ড নির্ধারিত বর্ণসংখ্যার চেয়ে কম"
921803
922804#: qml/Wizard/PasswordMeter.qml:89
923805msgid "Passwords match"
924−msgstr ""
806+msgstr "অনুরূপ পাসওয়ার্ড"
925807
926808#: qml/Wizard/PasswordMeter.qml:91
927809msgid "Passwords do not match"
928−msgstr ""
810+msgstr "পাসওয়ার্ড মিলেনি"
929811
930812#: qml/Wizard/PasswordMeter.qml:95
931813msgid "Strong password"
932−msgstr ""
814+msgstr "জটিল পাসওয়ার্ড"
933815
934816#: qml/Wizard/PasswordMeter.qml:97
935817msgid "Fair password"
936−msgstr ""
818+msgstr "মাঝারি পাসওয়ার্ড"
937819
938820#: qml/Wizard/PasswordMeter.qml:99
939821msgid "Weak password"
940−msgstr ""
822+msgstr "দুর্বল পাসওয়ার্ড"
941823
942824#: qml/Wizard/PasswordMeter.qml:101
943825msgid "Very weak password"
944−msgstr ""
826+msgstr "অত্যন্ত দুর্বল পাসওয়ার্ড"
827+
828+#~ msgid "Unity 8"
829+#~ msgstr "ইউনিটি ৮"
830+
831+#~ msgid "Scopes"
832+#~ msgstr "প্রাচুর্য"
833+
834+#~ msgid "Super (Tap)"
835+#~ msgstr "সুপার কী (ট্যাপ করুন)"
836+
837+#~ msgid "Opens the Scopes home."
838+#~ msgstr "প্রাচুর্য নীড়পাতায় প্রবেশ।"
839+
840+#~ msgctxt "Button: Open the Ubuntu Store"
841+#~ msgid "Store"
842+#~ msgstr "স্টোর"
843+
844+#~ msgctxt "Button: Start a search in the current dash scope"
845+#~ msgid "Search"
846+#~ msgstr "খুঁজুন"
847+
848+#~ msgctxt "Button: Show the current dash scope settings"
849+#~ msgid "Settings"
850+#~ msgstr "সেটিংস"
851+
852+#~ msgid "Remove from Favorites"
853+#~ msgstr "পছন্দ থেকে মুছে ফেলুন"
854+
855+#~ msgid "Add to Favorites"
856+#~ msgstr "পছন্দতে যোগ করুন"
857+
858+#~ msgctxt "Label: Hint for dash search line edit"
859+#~ msgid "Search"
860+#~ msgstr "খুঁজুন"
861+
862+#~ msgid "More..."
863+#~ msgstr "আরো..."
864+
865+#~ msgid "Less..."
866+#~ msgstr "কম..."
867+
868+#~ msgid "Send"
869+#~ msgstr "পাঠান"
870+
871+#~ msgid "Rate this"
872+#~ msgstr "রেটিং দিন"
873+
874+#~ msgid "Add a review"
875+#~ msgstr "আপনার মতামত দিন"
876+
877+#~ msgid "Enable location data"
878+#~ msgstr "অবস্থান নির্ণয় চালু করুন"
879+
880+#~ msgid "Manage"
881+#~ msgstr "ব্যবস্থাপনা"
882+
883+#~ msgid "Also installed"
884+#~ msgstr "আরও ইন্সটল করা রয়েছে..."
885+
886+#, fuzzy
887+#~ msgid "Please wait..."
888+#~ msgstr "অপেক্ষা করুন..."
889+
890+#, fuzzy
891+#~ msgid "Download"
892+#~ msgstr "ডাউনলোড হচ্ছে"
893+
894+#, fuzzy
895+#~ msgid "Downloaded"
896+#~ msgstr "ডাউনলোড হচ্ছে"
897+
898+#, fuzzy
899+#~ msgid "Installed"
900+#~ msgstr "আরও ইন্সটল করা রয়েছে..."
945901
946902#~ msgctxt "Button: Reboot the system"
947903#~ msgid "Reboot"
@@ -959,7 +915,6 @@ msgstr ""
959915#~ msgid "This will be your last attempt."
960916#~ msgstr "এটিই আপনার সর্বশেষ সুযোগ।"
961917
962−#, qt-format
963918#~ msgid "Sorry, incorrect %1"
964919#~ msgstr "দুঃখিত, %1 ভুল হয়েছে"
965920
@@ -981,9 +936,6 @@ msgstr ""
981936#~ msgid "You almost got it!"
982937#~ msgstr "আপনি প্রায় পেরে গেছেন!"
983938
984−#~ msgid "Open the launcher"
985−#~ msgstr "লঞ্চার খুলুন"
986−
987939#~ msgctxt "Label: Type of security method"
988940#~ msgid "Passcode"
989941#~ msgstr "পাসকোড"
@@ -1034,9 +986,6 @@ msgstr ""
1034986#~ msgid "Well done"
1035987#~ msgstr "অস্থির!"
1036988
1037−#~ msgid "Try swiping from the right edge to unlock the phone"
1038−#~ msgstr "ফোনটির লক খুলতে ডান প্রান্ত থেকে সোয়াইপ করুন"
1039−
1040989#~ msgid "Right edge"
1041990#~ msgstr "ডান প্রান্ত"
1042991
@@ -1046,18 +995,9 @@ msgstr ""
1046995#~ msgid "Store"
1047996#~ msgstr "স্টোর"
1048997
1049−#~ msgid "Search"
1050−#~ msgstr "খুঁজুন"
1051−
1052998#~ msgid "Type or say a command"
1053999#~ msgstr "কমান্ড লিখুন বা বলুন"
10541000
1055−#~ msgid "Loading. Please Wait..."
1056−#~ msgstr "অপেক্ষা করুন..."
1057−
1058−#~ msgid "Speaking..."
1059−#~ msgstr "বলা হচ্ছে..."
1060−
10611001#~ msgid "Speak Now..."
10621002#~ msgstr "এখন বলুন..."
10631003
@@ -1067,13 +1007,9 @@ msgstr ""
10671007#~ msgid "Roaming"
10681008#~ msgstr "রোমিং"
10691009
1070−#~ msgid "Enter passphrase"
1071−#~ msgstr "পাসওয়ার্ড লিখুন"
1072−
10731010#~ msgid "Sorry, incorrect passphrase"
10741011#~ msgstr "দুঃখিত, পাসওয়ার্ড ভুল হয়েছে"
10751012
1076−#, qt-format
10771013#~ msgid "Enter %1"
10781014#~ msgstr "%1 লিখুন"
10791015
@@ -1083,12 +1019,9 @@ msgstr ""
10831019#~ msgid "Please re-enter"
10841020#~ msgstr "অনুগ্রহ করে আবার লিখুন"
10851021
1086−#~ msgid "Enter passcode"
1087−#~ msgstr "পাসকোড লিখুন"
1088−
10891022#~ msgid ""
1090−#~ "If passcode is entered incorrectly, your phone will conduct a factory reset "
1091−#~ "and all personal data will be deleted."
1023+#~ "If passcode is entered incorrectly, your phone will conduct a factory "
1024+#~ "reset and all personal data will be deleted."
10921025#~ msgstr "ভুল পাসকোড প্রদান করলে, আপনার ফোনটির সকল ব্যক্তিগত তথ্য মুছে যাবে।"
10931026
10941027#~ msgid ""
@@ -1127,6 +1060,3 @@ msgstr ""
11271060#~ msgctxt "Label: Description of security method"
11281061#~ msgid "4 digits only"
11291062#~ msgstr "কেবল মাত্র ৪টি সংখ্যা"
1130−
1131−#~ msgid "Continue"
1132−#~ msgstr "পরবর্তী"
po/br.po+327−349
@@ -6,39 +6,40 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2017-04-04 22:56+0000\n"
9+"Report-Msgid-Bugs-To: \n"
10+"POT-Creation-Date: 2021-01-29 11:42-0600\n"
1111"PO-Revision-Date: 2016-08-29 11:37+0000\n"
1212"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
1313"Language-Team: Breton <br@li.org>\n"
14+"Language: br\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
1718"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
19−"X-Generator: Launchpad (build 18343)\n"
19+"X-Launchpad-Export-Date: 2016-11-23 06:34+0000\n"
20+"X-Generator: Launchpad (build 18269)\n"
2021
21−#: plugins/LightDM/Greeter.cpp:188
22+#: plugins/LightDM/Greeter.cpp:199
2223msgid "Password: "
2324msgstr "Ger-tremen : "
2425
25−#: plugins/LightDM/Greeter.cpp:203
26+#: plugins/LightDM/Greeter.cpp:214
2627msgid "Username"
2728msgstr ""
2829
29−#: plugins/LightDM/Greeter.cpp:242
30+#: plugins/LightDM/Greeter.cpp:258
3031msgid "Failed to authenticate"
3132msgstr ""
3233
33−#: plugins/LightDM/Greeter.cpp:244
34+#: plugins/LightDM/Greeter.cpp:260
3435msgid "Invalid password, please try again"
3536msgstr ""
3637
37−#: plugins/LightDM/Greeter.cpp:254
38+#: plugins/LightDM/Greeter.cpp:270
3839msgid "Log In"
3940msgstr "Kevreañ"
4041
41−#: plugins/LightDM/Greeter.cpp:254
42+#: plugins/LightDM/Greeter.cpp:270
4243msgid "Retry"
4344msgstr "Esaeañ en-dro"
4445
@@ -50,16 +51,16 @@ msgstr ""
5051msgid "Guest Session"
5152msgstr ""
5253
53−#: plugins/Unity/Launcher/launcheritem.cpp:49
54−#: plugins/Unity/Launcher/launcheritem.cpp:123
54+#: plugins/Unity/Launcher/launcheritem.cpp:48
55+#: plugins/Unity/Launcher/launcheritem.cpp:122
5556msgid "Pin shortcut"
5657msgstr "Spilhennañ ar verradenn"
5758
58−#: plugins/Unity/Launcher/launcheritem.cpp:55
59+#: plugins/Unity/Launcher/launcheritem.cpp:54
5960msgid "Quit"
6061msgstr "Mont kuit"
6162
62−#: plugins/Unity/Launcher/launcheritem.cpp:123
63+#: plugins/Unity/Launcher/launcheritem.cpp:122
6364msgid "Unpin shortcut"
6465msgstr "Dispilhennañ ar verradenn"
6566
@@ -82,9 +83,8 @@ msgctxt "Button: Log out from the system"
8283msgid "Log Out"
8384msgstr "Digevreañ"
8485
85−#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
87−#: qml/Wizard/Pages/passcode-confirm.qml:32
86+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:284
87+#: qml/Greeter/NarrowView.qml:215 qml/Wizard/Pages/passcode-confirm.qml:32
8888#: qml/Wizard/Pages/passcode-set.qml:32
8989msgid "Cancel"
9090msgstr "Nullañ"
@@ -106,12 +106,12 @@ msgstr "N'on ket"
106106msgid "Yes"
107107msgstr "Ya"
108108
109−#: qml/Components/Dialogs.qml:239
109+#: qml/Components/Dialogs.qml:243
110110msgctxt "Title: Power off/Restart dialog"
111111msgid "Power"
112112msgstr "Enaouiñ"
113113
114−#: qml/Components/Dialogs.qml:240
114+#: qml/Components/Dialogs.qml:244
115115msgid ""
116116"Are you sure you would like\n"
117117"to power off?"
@@ -119,23 +119,29 @@ msgstr ""
119119"Ha sur oc'h e fell deoc'h\n"
120120"troc'hañ an tredan ?"
121121
122−#: qml/Components/Dialogs.qml:244
122+#: qml/Components/Dialogs.qml:248
123123msgctxt "Button: Power off the system"
124124msgid "Power off"
125125msgstr "Lazhañ"
126126
127−#: qml/Components/Dialogs.qml:255
127+#: qml/Components/Dialogs.qml:263
128128msgctxt "Button: Restart the system"
129129msgid "Restart"
130130msgstr "Adloc'hañ"
131131
132+#: qml/Components/Dialogs.qml:276
133+#, fuzzy
134+#| msgid "Takes a screenshot."
135+msgid "Screenshot"
136+msgstr "Tapout ur skeudenn eus ar skramm"
137+
132138#: qml/Components/KeyboardShortcutsOverlay.qml:41
133139msgid "Keyboard Shortcuts"
134140msgstr "Berradennoù klavier"
135141
136142#: qml/Components/KeyboardShortcutsOverlay.qml:55
137−msgid "Unity 8"
138−msgstr "Unity 8"
143+msgid "Lomiri"
144+msgstr ""
139145
140146#: qml/Components/KeyboardShortcutsOverlay.qml:62
141147msgid "PrtScr"
@@ -150,8 +156,10 @@ msgid "Alt + PrtScr"
150156msgstr ""
151157
152158#: qml/Components/KeyboardShortcutsOverlay.qml:80
159+#, fuzzy
160+#| msgid "Takes a screenshot of a window."
153161msgid "Takes a screenshot of the current window."
154−msgstr ""
162+msgstr "Tapout ur skeudenn eus ur prenestr"
155163
156164#: qml/Components/KeyboardShortcutsOverlay.qml:88
157165msgid "Super + Space"
@@ -159,7 +167,7 @@ msgstr ""
159167
160168#: qml/Components/KeyboardShortcutsOverlay.qml:93
161169msgid "Switches to next keyboard layout."
162−msgstr "Mont d'ar fichadur klavir war-lerc'h"
170+msgstr ""
163171
164172#: qml/Components/KeyboardShortcutsOverlay.qml:101
165173msgid "Super + Shift + Space"
@@ -167,11 +175,13 @@ msgstr ""
167175
168176#: qml/Components/KeyboardShortcutsOverlay.qml:106
169177msgid "Switches to previous keyboard layout."
170−msgstr "Mont d'ar fichadur klavier kent"
178+msgstr ""
171179
172180#: qml/Components/KeyboardShortcutsOverlay.qml:114
181+#, fuzzy
182+#| msgid "Alt + Tab"
173183msgid "Ctrl + Alt + T"
174−msgstr ""
184+msgstr "Erl + Taolenn"
175185
176186#: qml/Components/KeyboardShortcutsOverlay.qml:119
177187msgid "Starts the Terminal application."
@@ -195,7 +205,7 @@ msgstr "Erl + F1"
195205
196206#: qml/Components/KeyboardShortcutsOverlay.qml:156
197207msgid "Opens launcher keyboard navigation mode."
198−msgstr "Digeriñ ar mod merdeiñ gant lañser ar c'hlavier"
208+msgstr ""
199209
200210#: qml/Components/KeyboardShortcutsOverlay.qml:164
201211msgid "Super + Tab"
@@ -203,7 +213,7 @@ msgstr ""
203213
204214#: qml/Components/KeyboardShortcutsOverlay.qml:169
205215msgid "Switches applications via the launcher."
206−msgstr "Mont d'un arload all dre al lañser."
216+msgstr ""
207217
208218#: qml/Components/KeyboardShortcutsOverlay.qml:177
209219msgid "Super + 1 to 0"
@@ -218,20 +228,10 @@ msgid "Super + A"
218228msgstr ""
219229
220230#: qml/Components/KeyboardShortcutsOverlay.qml:195
231+#, fuzzy
232+#| msgid "Open the launcher"
221233msgid "Opens the Application Drawer."
222−msgstr ""
223−
224−#: qml/Components/KeyboardShortcutsOverlay.qml:207
225−msgid "Scopes"
226−msgstr "Kefluskerioù enklask"
227−
228−#: qml/Components/KeyboardShortcutsOverlay.qml:214
229−msgid "Super (Tap)"
230−msgstr ""
231−
232−#: qml/Components/KeyboardShortcutsOverlay.qml:219
233−msgid "Opens the Scopes home."
234−msgstr "Digeriñ pajenn degemer ar c'hefluskerioù enklask."
234+msgstr "Digeriñ al lañser"
235235
236236#: qml/Components/KeyboardShortcutsOverlay.qml:235
237237msgid "Switching"
@@ -243,7 +243,7 @@ msgstr "Erl + Taolenn"
243243
244244#: qml/Components/KeyboardShortcutsOverlay.qml:247
245245msgid "Switches between applications."
246−msgstr "Mont da arloadoù all."
246+msgstr ""
247247
248248#: qml/Components/KeyboardShortcutsOverlay.qml:255
249249msgid "Super + W"
@@ -251,15 +251,15 @@ msgstr ""
251251
252252#: qml/Components/KeyboardShortcutsOverlay.qml:260
253253msgid "Opens the desktop spread."
254−msgstr "Digeriñ ar burev astennet"
254+msgstr ""
255255
256256#: qml/Components/KeyboardShortcutsOverlay.qml:268
257257msgid "Cursor Left or Right"
258−msgstr "Reti kleiz pe dehoù"
258+msgstr ""
259259
260260#: qml/Components/KeyboardShortcutsOverlay.qml:273
261261msgid "Moves the focus."
262−msgstr "Cheñch an dibab."
262+msgstr ""
263263
264264#: qml/Components/KeyboardShortcutsOverlay.qml:285
265265msgid "Windows"
@@ -303,9 +303,9 @@ msgstr "Erl + F4"
303303
304304#: qml/Components/KeyboardShortcutsOverlay.qml:349
305305msgid "Closes the current window."
306−msgstr "Serriñ ar prenestr a vremañ"
306+msgstr ""
307307
308−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
308+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:235
309309msgid "Return to Call"
310310msgstr "Distreiñ d'ar bellgomzadenn"
311311
@@ -365,12 +365,12 @@ msgid ""
365365"Your device is now connected to an external display. Use this screen as a "
366366"touch pad to interact with the pointer."
367367msgstr ""
368−"Kevreet eo ho penveg ouzh ur skramm diavaez bremañ. Implijit ar skramm-mañ "
369−"da bavez-touch evit ober gant ar reti."
370368
371369#: qml/Components/VirtualTouchPad.qml:327
370+#, fuzzy
371+#| msgid "Tap to return to call..."
372372msgid "Tap left button to click."
373−msgstr ""
373+msgstr "Touchit evit distreiñ d'ar bellgomzadenn..."
374374
375375#: qml/Components/VirtualTouchPad.qml:339
376376msgid "Tap right button to right click."
@@ -384,103 +384,6 @@ msgstr ""
384384msgid "Find more settings in the system settings."
385385msgstr ""
386386
387−#: qml/Dash/DashPageHeader.qml:361
388−msgctxt "Button: Open the Ubuntu Store"
389−msgid "Store"
390−msgstr "Stal"
391−
392−#: qml/Dash/DashPageHeader.qml:368
393−msgctxt "Button: Start a search in the current dash scope"
394−msgid "Search"
395−msgstr "Klask"
396−
397−#: qml/Dash/DashPageHeader.qml:378
398−msgctxt "Button: Show the current dash scope settings"
399−msgid "Settings"
400−msgstr "Arventennoù"
401−
402−#: qml/Dash/DashPageHeader.qml:385
403−msgid "Remove from Favorites"
404−msgstr "Lemel eus ar sinedoù"
405−
406−#: qml/Dash/DashPageHeader.qml:385
407−msgid "Add to Favorites"
408−msgstr "Ouzhpennañ d'ar sinedoù"
409−
410−#: qml/Dash/FiltersPopover.qml:61
411−msgid "Refine your results"
412−msgstr "Purañ ho tisoc'hoù"
413−
414−#: qml/Dash/FiltersPopover.qml:70
415−msgid "Reset"
416−msgstr "Adderaouekaat"
417−
418−#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
419−msgid "Show less"
420−msgstr "Diskouez nebeutoc'h"
421−
422−#: qml/Dash/GenericScopeView.qml:547
423−msgid "Show all"
424−msgstr "Diskouez pep tra"
425−
426−#: qml/Dash/GenericScopeView.qml:578
427−msgctxt "Label: Hint for dash search line edit"
428−msgid "Search"
429−msgstr "Klask"
430−
431−#: qml/Dash/PageHeaderExtraPanel.qml:67
432−msgid "Recent Searches"
433−msgstr "Enklaskoù graet nevez zo"
434−
435−#: qml/Dash/PageHeaderExtraPanel.qml:78
436−msgid "Clear All"
437−msgstr "Diverkañ pep tra"
438−
439−#: qml/Dash/Previews/PreviewActionCombo.qml:36
440−msgid "More..."
441−msgstr "Muioc'h..."
442−
443−#: qml/Dash/Previews/PreviewActionCombo.qml:36
444−msgid "Less..."
445−msgstr "Nebeutoc'h..."
446−
447−#: qml/Dash/Previews/PreviewCommentInput.qml:83
448−#: qml/Dash/Previews/PreviewRatingInput.qml:202
449−msgid "Send"
450−msgstr "Kas"
451−
452−#: qml/Dash/Previews/PreviewRatingInput.qml:109
453−msgid "Rate this"
454−msgstr "Priziit an dra-mañ"
455−
456−#: qml/Dash/Previews/PreviewRatingInput.qml:184
457−msgid "Add a review"
458−msgstr "Ouzhpennañ un ali"
459−
460−#: qml/Dash/PullToRefreshScopeStyle.qml:56
461−msgid "Pull to refresh…"
462−msgstr "Tennañ evit freskaat..."
463−
464−#: qml/Dash/PullToRefreshScopeStyle.qml:61
465−msgid "Release to refresh…"
466−msgstr "Lezel da vont evit freskaat..."
467−
468−#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
469−msgid "Enable location data"
470−msgstr "Gweredekaat ar roadennoù lec'hiañ"
471−
472−#: qml/Dash/ScopesList.qml:146
473−msgid "Manage"
474−msgstr "Merañ"
475−
476−#: qml/Dash/ScopesList.qml:187
477−msgid "Home"
478−msgstr "Er gêr"
479−
480−#: qml/Dash/ScopesList.qml:188
481−msgid "Also installed"
482−msgstr "Staliet ivez"
483−
484387#: qml/Greeter/CoverPage.qml:127
485388msgid "Unlock"
486389msgstr "Dibrennañ"
@@ -513,16 +416,20 @@ msgid "Try again"
513416msgstr "Esaeañ adarre"
514417
515418#: qml/Greeter/Greeter.qml:551
419+#, fuzzy
420+#| msgid "Enter passphrase"
516421msgid "Enter passphrase to unlock"
517−msgstr ""
422+msgstr "Merkañ ar frazenn-dremen"
518423
519424#: qml/Greeter/Greeter.qml:552
425+#, fuzzy
426+#| msgid "Enter passcode"
520427msgid "Enter passcode to unlock"
521−msgstr ""
428+msgstr "Merkañ ar c'hod-tremen"
522429
523−#: qml/Greeter/NarrowView.qml:228
430+#: qml/Greeter/NarrowView.qml:235
524431msgid "Emergency"
525−msgstr "Mall"
432+msgstr ""
526433
527434#: qml/Greeter/PromptList.qml:126
528435msgid "Passphrase"
@@ -534,20 +441,21 @@ msgstr "Kod-tremen"
534441
535442#: qml/Greeter/SessionsList.qml:124
536443msgid "Select desktop environment"
537−msgstr "Diuzañ endro ar burev"
444+msgstr ""
538445
539−#: qml/Launcher/Drawer.qml:94
446+#: qml/Launcher/Drawer.qml:250
447+#, fuzzy
448+#| msgid "Search"
540449msgid "Search…"
541−msgstr ""
450+msgstr "Klask"
542451
543−#: qml/Launcher/Drawer.qml:129
544−msgctxt "Apps sorted alphabetically"
545−msgid "A-Z"
546−msgstr ""
452+#: qml/Launcher/PullToRefreshScopeStyle.qml:56
453+msgid "Pull to refresh…"
454+msgstr "Tennañ evit freskaat..."
547455
548−#: qml/Launcher/MoreAppsHeader.qml:55
549−msgid "More apps in the store"
550−msgstr ""
456+#: qml/Launcher/PullToRefreshScopeStyle.qml:61
457+msgid "Release to refresh…"
458+msgstr "Lezel da vont evit freskaat..."
551459
552460#: qml/Notifications/NotificationMenuItemFactory.qml:124
553461msgid "Show password"
@@ -637,54 +545,81 @@ msgid "Call back"
637545msgstr "Gervel en-dro"
638546
639547#: qml/Panel/PanelMenuPage.qml:92
548+#, fuzzy
549+#| msgctxt "Button: Go back one page in the Wizard"
550+#| msgid "Back"
640551msgid "Back"
641−msgstr ""
552+msgstr "Distreiñ"
642553
643554#: qml/Stage/SideStage.qml:76
644555msgid "Drag using 3 fingers any application from one window to the other"
645−msgstr "Riklit forzh peseurt arload gant tri biz eus an eil prenestr d'egile"
556+msgstr ""
557+
558+#: qml/Stage/Stage.qml:671
559+msgid "No running apps"
560+msgstr ""
646561
647562#: qml/Tutorial/TutorialLeftLong.qml:49
563+#, fuzzy
564+#| msgid "Try swiping from the top edge to access the indicators"
648565msgid "Long swipe from the left edge to open the Application Drawer"
649566msgstr ""
567+"Lakait ho piz da riklañ adalek ar bord uhelañ da lakaat ar merkerioù war wel."
650568
651569#: qml/Tutorial/TutorialLeft.qml:47
652570msgid "Short swipe from the left edge to open the launcher"
653−msgstr "Rikladenn verr adalek ar bord kleiz evit digeriñ al lañser"
571+msgstr ""
654572
655−#: qml/Tutorial/TutorialRight.qml:55
573+#: qml/Tutorial/TutorialRight.qml:54
656574msgid "Push your mouse against the right edge to view your open apps"
657575msgstr ""
658576"Dilec'hiit ho logodenn betek ar bord dehoù evit gwelet hoc'h arloadoù digor"
659577
660−#: qml/Tutorial/TutorialRight.qml:56
578+#: qml/Tutorial/TutorialRight.qml:55
661579msgid "Swipe from the right edge to view your open apps"
662−msgstr "Riklañ adalek ar bord dehoù evit gwelet hoc'h arloadoù digor"
580+msgstr ""
663581
664582#: qml/Tutorial/TutorialTop.qml:53
665583msgid "Swipe from the top edge to access notifications and quick settings"
666584msgstr ""
667−"Riklañ adalek an nec'h evit gwelet ar c'hemennoù hag an arventennoù prim"
668585
669−#: qml/Wizard/Page.qml:54
586+#: qml/Wizard/Page.qml:59
670587msgctxt "Button: Go back one page in the Wizard"
671588msgid "Back"
672589msgstr "Distreiñ"
673590
674−#: qml/Wizard/Pages/10-welcome.qml:28
591+#: qml/Wizard/Pages/10-welcome.qml:29
675592msgid "Language"
676593msgstr "Yezh"
677594
678−#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
679−#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
680−#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
681−#: qml/Wizard/Pages/70-passwd-type.qml:145
682−#: qml/Wizard/Pages/75-report-check.qml:84
683−#: qml/Wizard/Pages/passcode-desktop.qml:142
684−#: qml/Wizard/Pages/password-set.qml:142
595+#: qml/Wizard/Pages/10-welcome.qml:176
596+#: qml/Wizard/Pages/10-welcome-update.qml:126
597+#: qml/Wizard/Pages/11-changelog.qml:74 qml/Wizard/Pages/20-keyboard.qml:152
598+#: qml/Wizard/Pages/30-wifi.qml:214 qml/Wizard/Pages/50-timezone.qml:272
599+#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/70-passwd-type.qml:146
600+#: qml/Wizard/Pages/passcode-desktop.qml:154
601+#: qml/Wizard/Pages/password-set.qml:153
685602msgid "Next"
686603msgstr "War-lerc'h"
687604
605+#: qml/Wizard/Pages/10-welcome-update.qml:91
606+#, fuzzy
607+msgid "Welcome to "
608+msgstr "Donemat en Ubuntu"
609+
610+#: qml/Wizard/Pages/10-welcome-update.qml:106
611+msgid "We will make sure your device is ready to use "
612+msgstr ""
613+
614+#: qml/Wizard/Pages/11-changelog.qml:28
615+msgid "What's new"
616+msgstr ""
617+
618+#: qml/Wizard/Pages/11-changelog.qml:74
619+#, fuzzy
620+msgid "Loading..."
621+msgstr "O komz..."
622+
688623#: qml/Wizard/Pages/20-keyboard.qml:31
689624msgid "Select Keyboard"
690625msgstr "Diuzañ ar c'hlavier"
@@ -697,64 +632,33 @@ msgstr "Yezh ar c'hlavier"
697632msgid "Keyboard layout"
698633msgstr "Aozadur ar c'hlavier"
699634
700−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
701−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
635+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:214
636+#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/79-system-update.qml:144
637+#: qml/Wizard/Pages/sim.qml:101
702638msgid "Skip"
703639msgstr "Tremen hebiou"
704640
705−#: qml/Wizard/Pages/30-wifi.qml:30
641+#: qml/Wizard/Pages/30-wifi.qml:31
706642msgid "Connect to Wi‑Fi"
707643msgstr "Kevreañ ouzh ar Wi-Fi"
708644
709−#: qml/Wizard/Pages/30-wifi.qml:131
645+#: qml/Wizard/Pages/30-wifi.qml:139
710646msgid "Connected"
711647msgstr "Kevreet"
712648
713−#: qml/Wizard/Pages/30-wifi.qml:164
649+#: qml/Wizard/Pages/30-wifi.qml:172
714650msgid "Available Wi-Fi networks"
715651msgstr "Rouedadoù Wi-Fi da gaout"
716652
717−#: qml/Wizard/Pages/30-wifi.qml:165
653+#: qml/Wizard/Pages/30-wifi.qml:173
718654msgid "No available Wi-Fi networks"
719655msgstr "N'eus ket rouedadoù Wi-Fi da gaout"
720656
721−#: qml/Wizard/Pages/40-location.qml:27
722−msgid "Location Services"
723−msgstr "Servijoù lec'hiañ"
724−
725−#: qml/Wizard/Pages/40-location.qml:83
726−msgid ""
727−"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
728−"(recommended)"
729−msgstr ""
730−
731−#: qml/Wizard/Pages/40-location.qml:105
732−#, qt-format
733−msgid "By selecting this option you agree to the Nokia HERE %1."
734−msgstr ""
735−
736−#: qml/Wizard/Pages/40-location.qml:106
737−msgctxt "part of: Nokia HERE terms and conditions"
738−msgid "terms and conditions"
739−msgstr "penndivizoù implij"
740−
741−#: qml/Wizard/Pages/40-location.qml:160
742−msgid "GPS only"
743−msgstr "GPS hepken"
744−
745−#: qml/Wizard/Pages/40-location.qml:214
746−msgid "Don't use my location"
747−msgstr "Arabat implijout ma lec'h"
748−
749−#: qml/Wizard/Pages/40-location.qml:260
750−msgid "You can change it later in System Settings."
751−msgstr "Gallout a rit cheñch se diwezhatoc'h en arventennoù ar reizhiad."
752−
753657#: qml/Wizard/Pages/50-timezone.qml:30
754658msgid "Time Zone"
755659msgstr "Gwerzhid-eur"
756660
757−#: qml/Wizard/Pages/50-timezone.qml:182
661+#: qml/Wizard/Pages/50-timezone.qml:183
758662msgid "Enter your city"
759663msgstr "Skrivit ho kêr"
760664
@@ -762,7 +666,7 @@ msgstr "Skrivit ho kêr"
762666msgid "Personalize Your Device"
763667msgstr "Personelaat ho penveg"
764668
765−#: qml/Wizard/Pages/60-account.qml:48
669+#: qml/Wizard/Pages/60-account.qml:54
766670msgid "Preferred Name"
767671msgstr ""
768672
@@ -770,83 +674,75 @@ msgstr ""
770674msgid "Lock Screen"
771675msgstr "Prennañ ar skramm"
772676
773−#: qml/Wizard/Pages/70-passwd-type.qml:102
677+#: qml/Wizard/Pages/70-passwd-type.qml:103
774678msgctxt "Label: Type of security method"
775679msgid "Create new password"
776680msgstr "Krouiñ ur ger-tremen nevez"
777681
778−#: qml/Wizard/Pages/70-passwd-type.qml:104
682+#: qml/Wizard/Pages/70-passwd-type.qml:105
779683msgctxt "Label: Type of security method"
780684msgid "Create passcode (numbers only)"
781685msgstr "Krouiñ ur c'hod (difroù hepken)"
782686
783−#: qml/Wizard/Pages/70-passwd-type.qml:106
687+#: qml/Wizard/Pages/70-passwd-type.qml:107
784688msgctxt "Label: Type of security method"
785689msgid "No lock code"
786690msgstr "N'eus kod prennañ ebet"
787691
788−#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
789−msgid "Privacy Policy"
790−msgstr "Reolennoù prevezded"
692+#: qml/Wizard/Pages/79-system-update.qml:28
693+msgid "Update Device"
694+msgstr "Hizivaat ar benveg"
695+
696+#: qml/Wizard/Pages/79-system-update.qml:55
697+msgid ""
698+"There is a system update available and ready to install. Afterwards, the "
699+"device will automatically restart."
700+msgstr ""
701+
702+#: qml/Wizard/Pages/79-system-update.qml:76
703+#, fuzzy
704+#| msgctxt "string identifying name of the update"
705+#| msgid "Ubuntu system"
706+msgctxt "string identifying name of the update"
707+msgid "Ubuntu Touch system"
708+msgstr "Reizhiad Ubuntu"
709+
710+#: qml/Wizard/Pages/79-system-update.qml:83
711+#, qt-format
712+msgctxt "version of the system update"
713+msgid "Version %1"
714+msgstr "Stumm %1"
791715
792−#: qml/Wizard/Pages/75-report-check.qml:26
793−msgid "Help Us Improve"
794−msgstr "Sikourit ac'hanomp da wellaat"
716+#: qml/Wizard/Pages/79-system-update.qml:95
717+msgid "This could take a few minutes..."
718+msgstr "Gallout a ra padout un nebeud munutennoù..."
795719
796−#: qml/Wizard/Pages/75-report-check.qml:59
797−msgid "Improve system performance by sending us crashes and error reports."
798−msgstr "Gwellait ar reizhiad en ur gas deomp an danevelloù fazi."
720+#: qml/Wizard/Pages/79-system-update.qml:109
721+msgid "Install and restart now"
722+msgstr "Staliañ hag adloc'hañ bremañ"
799723
800−#: qml/Wizard/Pages/75-report-check.qml:60
801−msgid "Privacy policy"
802−msgstr "Reolennoù buhez prevez"
724+#: qml/Wizard/Pages/80-finished.qml:91
725+msgid "Welcome Back"
726+msgstr ""
803727
804−#: qml/Wizard/Pages/80-finished.qml:89
728+#: qml/Wizard/Pages/80-finished.qml:91
805729msgid "Welcome to Ubuntu"
806730msgstr "Donemat en Ubuntu"
807731
808−#: qml/Wizard/Pages/80-finished.qml:104
732+#: qml/Wizard/Pages/80-finished.qml:106
809733msgid "You are ready to use your device now"
810734msgstr "Bremañ oc'h prest da implijout ho penveg"
811735
812−#: qml/Wizard/Pages/80-finished.qml:124
736+#: qml/Wizard/Pages/80-finished.qml:126
737+msgid "Continue"
738+msgstr "Kenderc'hel"
739+
740+#: qml/Wizard/Pages/80-finished.qml:126
813741msgid "Get Started"
814742msgstr "Kregiñ ganti"
815743
816−#: qml/Wizard/Pages/here-terms.qml:25
817−msgid "Terms & Conditions"
818−msgstr "Penndivizoù implij"
819−
820−#: qml/Wizard/Pages/here-terms.qml:69
821−msgid "Your device uses positioning technologies provided by HERE."
822−msgstr "Ho penveg a implij teknologiezhoù lec'hiañ pourchaset gant HERE."
823−
824−#: qml/Wizard/Pages/here-terms.qml:81
825−msgid ""
826−"To provide you with positioning services and to improve their quality, HERE "
827−"collects information about nearby cell towers and Wi-Fi hotspots around your "
828−"current location whenever your position is being found."
829−msgstr ""
830−
831−#: qml/Wizard/Pages/here-terms.qml:93
832−msgid ""
833−"The information collected is used to analyze the service and to improve the "
834−"use of service, but not to identify you personally."
835−msgstr ""
836−"Implijet e vez an titouroù dastumet evit dielfennañ ar servij ha gwellaat an "
837−"implij anezhañ, ha neket evit anavezout ac'hanoc'h."
838−
839−#: qml/Wizard/Pages/here-terms.qml:106
840−#, qt-format
841−msgid "By continuing, you agree to the HERE platform %1 and %2."
842−msgstr ""
843−
844−#: qml/Wizard/Pages/here-terms.qml:107
845−msgid "Service Terms"
846−msgstr "Divizoù servij"
847−
848744#: qml/Wizard/Pages/passcode-confirm.qml:43
849−#: qml/Wizard/Pages/passcode-desktop.qml:97
745+#: qml/Wizard/Pages/passcode-desktop.qml:104
850746msgid "Confirm passcode"
851747msgstr "Kadarnaat ar c'hod-tremen"
852748
@@ -863,24 +759,24 @@ msgstr "Skrivit adarre, mar plij."
863759msgid "Lock Screen Passcode"
864760msgstr "Kod da brennañ ar skramm"
865761
866−#: qml/Wizard/Pages/passcode-desktop.qml:61
762+#: qml/Wizard/Pages/passcode-desktop.qml:68
867763msgid "Enter 4 numbers to setup your passcode"
868764msgstr "Skrivit 4 sifr evit lakaat ho kod"
869765
870−#: qml/Wizard/Pages/passcode-desktop.qml:77
766+#: qml/Wizard/Pages/passcode-desktop.qml:84
871767#: qml/Wizard/Pages/passcode-set.qml:54
872768msgid "Choose passcode"
873769msgstr "Choaz ur c'hod"
874770
875−#: qml/Wizard/Pages/passcode-desktop.qml:127
771+#: qml/Wizard/Pages/passcode-desktop.qml:139
876772msgid "Passcode too short"
877773msgstr "Kod re verr"
878774
879−#: qml/Wizard/Pages/passcode-desktop.qml:129
775+#: qml/Wizard/Pages/passcode-desktop.qml:141
880776msgid "Passcodes match"
881777msgstr "klotañ a ra ar c'hodoù an eil gant egile"
882778
883−#: qml/Wizard/Pages/passcode-desktop.qml:131
779+#: qml/Wizard/Pages/passcode-desktop.qml:143
884780msgid "Passcodes do not match"
885781msgstr "Ne glot ket ar c'hodoù an eil gant egile"
886782
@@ -892,15 +788,15 @@ msgstr "4 arouezenn a rank bezañ ar c'hod"
892788msgid "Lock Screen Password"
893789msgstr "Ger-tremen da brennañ ar skramm"
894790
895−#: qml/Wizard/Pages/password-set.qml:62
791+#: qml/Wizard/Pages/password-set.qml:68
896792msgid "Enter at least 8 characters"
897793msgstr "Skrivit 8 arouezenn da vihanañ"
898794
899−#: qml/Wizard/Pages/password-set.qml:74
795+#: qml/Wizard/Pages/password-set.qml:80
900796msgid "Choose password"
901797msgstr "Choaz ur ger-tremen"
902798
903−#: qml/Wizard/Pages/password-set.qml:104
799+#: qml/Wizard/Pages/password-set.qml:110
904800msgid "Confirm password"
905801msgstr "Kadarnaat ar ger-tremen"
906802
@@ -956,6 +852,145 @@ msgstr "Ger-tremen diasur"
956852msgid "Very weak password"
957853msgstr "Ger-tremen diasur-kenañ"
958854
855+#~ msgid "Unity 8"
856+#~ msgstr "Unity 8"
857+
858+#~ msgid "Scopes"
859+#~ msgstr "Kefluskerioù enklask"
860+
861+#~ msgid "Opens the Scopes home."
862+#~ msgstr "Digeriñ pajenn degemer ar c'hefluskerioù enklask."
863+
864+#~ msgctxt "Button: Open the Ubuntu Store"
865+#~ msgid "Store"
866+#~ msgstr "Stal"
867+
868+#~ msgctxt "Button: Start a search in the current dash scope"
869+#~ msgid "Search"
870+#~ msgstr "Klask"
871+
872+#~ msgctxt "Button: Show the current dash scope settings"
873+#~ msgid "Settings"
874+#~ msgstr "Arventennoù"
875+
876+#~ msgid "Remove from Favorites"
877+#~ msgstr "Lemel eus ar sinedoù"
878+
879+#~ msgid "Add to Favorites"
880+#~ msgstr "Ouzhpennañ d'ar sinedoù"
881+
882+#~ msgid "Refine your results"
883+#~ msgstr "Purañ ho tisoc'hoù"
884+
885+#~ msgid "Reset"
886+#~ msgstr "Adderaouekaat"
887+
888+#~ msgid "Show less"
889+#~ msgstr "Diskouez nebeutoc'h"
890+
891+#~ msgid "Show all"
892+#~ msgstr "Diskouez pep tra"
893+
894+#~ msgctxt "Label: Hint for dash search line edit"
895+#~ msgid "Search"
896+#~ msgstr "Klask"
897+
898+#~ msgid "Recent Searches"
899+#~ msgstr "Enklaskoù graet nevez zo"
900+
901+#~ msgid "Clear All"
902+#~ msgstr "Diverkañ pep tra"
903+
904+#~ msgid "More..."
905+#~ msgstr "Muioc'h..."
906+
907+#~ msgid "Less..."
908+#~ msgstr "Nebeutoc'h..."
909+
910+#~ msgid "Send"
911+#~ msgstr "Kas"
912+
913+#~ msgid "Rate this"
914+#~ msgstr "Priziit an dra-mañ"
915+
916+#~ msgid "Add a review"
917+#~ msgstr "Ouzhpennañ un ali"
918+
919+#~ msgid "Enable location data"
920+#~ msgstr "Gweredekaat ar roadennoù lec'hiañ"
921+
922+#~ msgid "Manage"
923+#~ msgstr "Merañ"
924+
925+#~ msgid "Home"
926+#~ msgstr "Er gêr"
927+
928+#~ msgid "Also installed"
929+#~ msgstr "Staliet ivez"
930+
931+#~ msgid "Privacy Policy"
932+#~ msgstr "Reolennoù prevezded"
933+
934+#~ msgid "Help Us Improve"
935+#~ msgstr "Sikourit ac'hanomp da wellaat"
936+
937+#~ msgid "Privacy policy"
938+#~ msgstr "Reolennoù buhez prevez"
939+
940+#, fuzzy
941+#~ msgid "Please wait..."
942+#~ msgstr "O kargañ. Gortozit, mar plij..."
943+
944+#, fuzzy
945+#~ msgid "Update all"
946+#~ msgstr "Hizivaat ar benveg"
947+
948+#, fuzzy
949+#~ msgid "Update"
950+#~ msgstr "Hizivaat ar benveg"
951+
952+#, fuzzy
953+#~ msgid "Download"
954+#~ msgstr "O pellgargañ"
955+
956+#, fuzzy
957+#~ msgid "Downloaded"
958+#~ msgstr "O pellgargañ"
959+
960+#, fuzzy
961+#~ msgid "Installed"
962+#~ msgstr "Staliet ivez"
963+
964+#, fuzzy
965+#~ msgid "Updated %1"
966+#~ msgstr "Hizivaat ar benveg"
967+
968+#, fuzzy
969+#~ msgid "Update failed"
970+#~ msgstr "Hizivaat ar benveg"
971+
972+#~ msgid "Location Services"
973+#~ msgstr "Servijoù lec'hiañ"
974+
975+#~ msgctxt "part of: Nokia HERE terms and conditions"
976+#~ msgid "terms and conditions"
977+#~ msgstr "penndivizoù implij"
978+
979+#~ msgid "GPS only"
980+#~ msgstr "GPS hepken"
981+
982+#~ msgid "Don't use my location"
983+#~ msgstr "Arabat implijout ma lec'h"
984+
985+#~ msgid "You can change it later in System Settings."
986+#~ msgstr "Gallout a rit cheñch se diwezhatoc'h en arventennoù ar reizhiad."
987+
988+#~ msgid "Terms & Conditions"
989+#~ msgstr "Penndivizoù implij"
990+
991+#~ msgid "Service Terms"
992+#~ msgstr "Divizoù servij"
993+
959994#~ msgid "Close"
960995#~ msgstr "Serriñ"
961996
@@ -981,28 +1016,16 @@ msgstr "Ger-tremen diasur-kenañ"
9811016#~ "Mestroniañ a rit ar jestroù ha gallout a rit kregiñ da implijout ar "
9821017#~ "pellgomzer<br><br>Touchit d'ar skramm evit kregiñ ganti"
9831018
984−#~ msgid "Loading. Please Wait..."
985−#~ msgstr "O kargañ. Gortozit, mar plij..."
986−
987−#~ msgid "Speaking..."
988−#~ msgstr "O komz..."
989−
9901019#~ msgid "Speak Now..."
9911020#~ msgstr "Komzit bremañ..."
9921021
9931022#~ msgid "Confirm"
9941023#~ msgstr "Kadarnaat"
9951024
996−#~ msgid "Search"
997−#~ msgstr "Klask"
998−
999−#~ msgid "Try swiping from the top edge to access the indicators"
1000−#~ msgstr ""
1001−#~ "Lakait ho piz da riklañ adalek ar bord uhelañ da lakaat ar merkerioù war wel."
1002−
10031025#~ msgid "Swipe up again to close the settings screen"
10041026#~ msgstr ""
1005−#~ "Lakait ho piz da riklañ war-du ar bord uhelañ da serriñ skramm an arventennoù"
1027+#~ "Lakait ho piz da riklañ war-du ar bord uhelañ da serriñ skramm an "
1028+#~ "arventennoù"
10061029
10071030#~ msgid "Try swiping from the right edge to unlock the phone"
10081031#~ msgstr ""
@@ -1010,8 +1033,8 @@ msgstr "Ger-tremen diasur-kenañ"
10101033
10111034#~ msgid "Swipe from the left to reveal the launcher for quick access to apps"
10121035#~ msgstr ""
1013−#~ "Lakait ho piz da riklañ adalek ar bord kleiz da ziskouez al lañser arloadoù "
1014−#~ "prim."
1036+#~ "Lakait ho piz da riklañ adalek ar bord kleiz da ziskouez al lañser "
1037+#~ "arloadoù prim."
10151038
10161039#~ msgid "Well done"
10171040#~ msgstr "Gourc'hemennoù !"
@@ -1046,7 +1069,6 @@ msgstr "Ger-tremen diasur-kenañ"
10461069#~ msgid "Favorites"
10471070#~ msgstr "Gwellañ deuet"
10481071
1049−#, qt-format
10501072#~ msgid "Sorry, incorrect %1"
10511073#~ msgstr "Siwazh, %1 direizh"
10521074
@@ -1057,18 +1079,20 @@ msgstr "Ger-tremen diasur-kenañ"
10571079#~ msgstr "Siwazh, kod-tremen direizh"
10581080
10591081#~ msgid ""
1060−#~ "If passcode is entered incorrectly, your phone will conduct a factory reset "
1061−#~ "and all personal data will be deleted."
1082+#~ "If passcode is entered incorrectly, your phone will conduct a factory "
1083+#~ "reset and all personal data will be deleted."
10621084#~ msgstr ""
10631085#~ "Ma vez ebarzhet ur c'hod-tremen direizh, e vo adderaouekaet ho pellgomzer "
1064−#~ "gant arventennoù al labouradeg hag e vo diverket an holl roadennoù personel."
1086+#~ "gant arventennoù al labouradeg hag e vo diverket an holl roadennoù "
1087+#~ "personel."
10651088
10661089#~ msgid ""
10671090#~ "If passphrase is entered incorrectly, your phone will conduct a factory "
10681091#~ "reset and all personal data will be deleted."
10691092#~ msgstr ""
1070−#~ "Ma vez ebarzhet ur frazenn-dremen direizh, e vo adderaouekaet ho pellgomzer "
1071−#~ "gant arventennoù al labouradeg hag e vo diverket an holl roadennoù personel"
1093+#~ "Ma vez ebarzhet ur frazenn-dremen direizh, e vo adderaouekaet ho "
1094+#~ "pellgomzer gant arventennoù al labouradeg hag e vo diverket an holl "
1095+#~ "roadennoù personel"
10721096
10731097#~ msgid "This will be your last attempt."
10741098#~ msgstr "Ho taol-esae diwezhañ e vo."
@@ -1097,19 +1121,12 @@ msgstr "Ger-tremen diasur-kenañ"
10971121#~ msgid "Manage Scopes"
10981122#~ msgstr "Merañ ar c'hefluskerioù enklask"
10991123
1100−#, qt-format
11011124#~ msgid "Enter %1"
11021125#~ msgstr "Merkañ %1"
11031126
1104−#~ msgid "Enter passphrase"
1105−#~ msgstr "Merkañ ar frazenn-dremen"
1106−
11071127#~ msgid "Please re-enter"
11081128#~ msgstr "Adverkañ, mar plij"
11091129
1110−#~ msgid "Enter passcode"
1111−#~ msgstr "Merkañ ar c'hod-tremen"
1112−
11131130#~ msgid "Lock security"
11141131#~ msgstr "Surentez ar prennañ"
11151132
@@ -1129,9 +1146,6 @@ msgstr "Ger-tremen diasur-kenañ"
11291146#~ msgid "Let’s get started."
11301147#~ msgstr "Krogomp ganti."
11311148
1132−#~ msgid "Continue"
1133−#~ msgstr "Kenderc'hel"
1134−
11351149#~ msgid "Welcome to your Ubuntu phone."
11361150#~ msgstr "Deuet-mat oc'h en ho pellgomzer Ubuntu."
11371151
@@ -1169,10 +1183,11 @@ msgstr "Ger-tremen diasur-kenañ"
11691183#~ msgstr "Gwellaat ho skiant-prenet"
11701184
11711185#~ msgid ""
1172−#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
1173−#~ "conditions</a>."
1186+#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms "
1187+#~ "and conditions</a>."
11741188#~ msgstr ""
1175−#~ "Pa ziuzit an dibarzh-mañ ez asantit da <a href='#'>zivizoù implij</a> Nokia."
1189+#~ "Pa ziuzit an dibarzh-mañ ez asantit da <a href='#'>zivizoù implij</a> "
1190+#~ "Nokia."
11761191
11771192#~ msgid "Not at all"
11781193#~ msgstr "Tamm ebet"
@@ -1196,7 +1211,6 @@ msgstr "Ger-tremen diasur-kenañ"
11961211#~ msgid "Confirm passphrase"
11971212#~ msgstr "Kadarnaat ar frazenn-dremen"
11981213
1199−#, qt-format
12001214#~ msgid "〈 %1"
12011215#~ msgstr "〈 %1"
12021216
@@ -1212,7 +1226,6 @@ msgstr "Ger-tremen diasur-kenañ"
12121226#~ msgid "Your phone is now ready to use."
12131227#~ msgstr "Prest eo ho pellgomzer da vezañ implijet bremañ."
12141228
1215−#, qt-format
12161229#~ msgid "%1 〉"
12171230#~ msgstr "%1 〉"
12181231
@@ -1246,9 +1259,6 @@ msgstr "Ger-tremen diasur-kenañ"
12461259#~ msgid "Short swipe from the left edge."
12471260#~ msgstr "Riklik dousik adalek ar bord kleiz."
12481261
1249−#~ msgid "Open the launcher"
1250−#~ msgstr "Digeriñ al lañser"
1251−
12521262#~ msgid "Tap here to continue."
12531263#~ msgstr "Pouzañ amañ evit kenderc'hel"
12541264
@@ -1336,35 +1346,3 @@ msgstr "Ger-tremen diasur-kenañ"
13361346
13371347#~ msgid "Swipe up to create a message"
13381348#~ msgstr "Riklit d'an nec'h evit krouiñ ur gemennadenn"
1339−
1340−#~ msgid "Takes a screenshot of a window."
1341−#~ msgstr "Tapout ur skeudenn eus ur prenestr"
1342−
1343−#~ msgid "This could take a few minutes..."
1344−#~ msgstr "Gallout a ra padout un nebeud munutennoù..."
1345−
1346−#, qt-format
1347−#~ msgctxt "version of the system update"
1348−#~ msgid "Version %1"
1349−#~ msgstr "Stumm %1"
1350−
1351−#~ msgctxt "string identifying name of the update"
1352−#~ msgid "Ubuntu system"
1353−#~ msgstr "Reizhiad Ubuntu"
1354−
1355−#~ msgid "Update Device"
1356−#~ msgstr "Hizivaat ar benveg"
1357−
1358−#~ msgid "Install and restart now"
1359−#~ msgstr "Staliañ hag adloc'hañ bremañ"
1360−
1361−#~ msgid ""
1362−#~ "There is a system update available and ready to install. Afterwards, the "
1363−#~ "device will automatically restart."
1364−#~ msgstr ""
1365−#~ "Un hizivadenn eus ar reizhiad zo da gaout. Prest eo da vezañ staliet. Goude-"
1366−#~ "se e adloc'ho ho penveg e-unan."
1367−
1368−#~ msgid "Long swipe from the left edge to open the Today scope"
1369−#~ msgstr ""
1370−#~ "Rikladenn hir adalek ar bord kleiz evit digeriñ ar c'heflusker enklask Hiziv"
po/bs.po+211−277

This diff is too big to show here.

po/ca.po+397−358

This diff is too big to show here.

po/ca@valencia.po+195−282

This diff is too big to show here.

po/ce.po+112−238

This diff is too big to show here.

po/ckb.po+132−252

This diff is too big to show here.

po/co.po+286−279

This diff is too big to show here.

po/cs.po+469−435

This diff is too big to show here.

po/cy.po+211−276

This diff is too big to show here.

po/da.po+294−358

This diff is too big to show here.

po/de.po+404−364

This diff is too big to show here.

po/el.po+379−420

This diff is too big to show here.

po/en_AU.po+454−362

This diff is too big to show here.

po/en_GB.po+362−343

This diff is too big to show here.

po/en_US.ponew file+814

This diff is too big to show here.

po/eo.po+176−264

This diff is too big to show here.

po/es.po+403−366

This diff is too big to show here.

po/et.po+110−236

This diff is too big to show here.

po/eu.po+216−285

This diff is too big to show here.

po/fa.po+422−358

This diff is too big to show here.

po/fi.po+381−341

This diff is too big to show here.

po/fo.po+187−261

This diff is too big to show here.

po/fr.po+442−403

This diff is too big to show here.

po/ga.po+204−275

This diff is too big to show here.

po/gd.po+372−353

This diff is too big to show here.

po/gl.po+401−361

This diff is too big to show here.

po/gu.ponew file+814

This diff is too big to show here.

po/gv.po+152−252

This diff is too big to show here.

po/he.po+345−414

This diff is too big to show here.

po/hi.po+126−248

This diff is too big to show here.

po/hr.po+361−370

This diff is too big to show here.

po/hu.po+416−380

This diff is too big to show here.

po/hy.po+250−355

This diff is too big to show here.

po/ia.po+362−341

This diff is too big to show here.

po/id.po+202−288

This diff is too big to show here.

po/is.po+173−275

This diff is too big to show here.

po/it.po+410−372

This diff is too big to show here.

po/ja.po+253−338

This diff is too big to show here.

po/kk.ponew file+841

This diff is too big to show here.

po/km.po+212−283

This diff is too big to show here.

po/kn.po+120−248

This diff is too big to show here.

po/ko.po+358−408

This diff is too big to show here.

po/ku.po+187−285

This diff is too big to show here.

po/ky.po+120−248

This diff is too big to show here.

po/lo.po+119−245

This diff is too big to show here.

po/lt.po+404−364

This diff is too big to show here.

po/lv.po+224−292

This diff is too big to show here.

po/ml.po+133−254

This diff is too big to show here.

po/mr.po+135−243

This diff is too big to show here.

po/ms.po+372−399

This diff is too big to show here.

po/my.po+170−253

This diff is too big to show here.

po/nb.po+388−350

This diff is too big to show here.

po/ne.po+115−238

This diff is too big to show here.

po/nl.po+477−440

This diff is too big to show here.

po/nn.po+112−238

This diff is too big to show here.

po/oc.po+314−316

This diff is too big to show here.

po/or.po+112−238

This diff is too big to show here.

po/pa.po+220−288

This diff is too big to show here.

po/pl.po+420−381

This diff is too big to show here.

po/pt.po+400−362

This diff is too big to show here.

po/pt_BR.po+339−393

This diff is too big to show here.

po/ro.po+226−296

This diff is too big to show here.

po/ru.po+408−359

This diff is too big to show here.

po/sc.ponew file+904

This diff is too big to show here.

po/shn.po+112−238

This diff is too big to show here.

po/si.po+139−258

This diff is too big to show here.

po/sk.po+403−362

This diff is too big to show here.

po/sl.po+351−335

This diff is too big to show here.

po/sq.po+205−265

This diff is too big to show here.

po/sr.po+363−344

This diff is too big to show here.

po/sv.po+387−349

This diff is too big to show here.

po/sw.po+189−269

This diff is too big to show here.

po/ta.po+147−270

This diff is too big to show here.

po/te.po+140−252

This diff is too big to show here.

po/th.po+140−267

This diff is too big to show here.

po/tr.po+420−349

This diff is too big to show here.

po/ug.po+267−299

This diff is too big to show here.

po/uk.po+372−356

This diff is too big to show here.

po/unity8.pot+108−235

This diff is too big to show here.

po/ur.po+141−264

This diff is too big to show here.

po/uz.po+112−238

This diff is too big to show here.

po/vi.po+112−238

This diff is too big to show here.

po/wo.po+220−289

This diff is too big to show here.

po/xh.po+112−238

This diff is too big to show here.

po/zh_CN.po+397−334

This diff is too big to show here.

po/zh_HK.po+149−253

This diff is too big to show here.

po/zh_TW.po+400−381

This diff is too big to show here.

qml/ApplicationMenus/ApplicationMenuItemFactory.qml+7−7

This diff is too big to show here.

qml/ApplicationMenus/MenuItem.qml+3−3

This diff is too big to show here.

qml/ApplicationMenus/RegisteredApplicationMenuModel.qml+1−1

This diff is too big to show here.

qml/CMakeLists.txt−1

This diff is too big to show here.

qml/Components/Background.qml+1−1

This diff is too big to show here.

qml/Components/BaseCarouselDelegate.qmldeleted−42

This diff is too big to show here.

qml/Components/Carousel.qmldeleted−335

This diff is too big to show here.

qml/Components/Dialogs.qml+44−20

This diff is too big to show here.

qml/Panel/Handle.qml → qml/Components/Handle.qmlrenamed+1

This diff is too big to show here.

qml/Components/InputMethod.qml+2−1

This diff is too big to show here.

qml/Components/ItemGrabber.qml+1−1

This diff is too big to show here.

qml/Components/KeyboardShortcutsOverlay.qml+2−26

This diff is too big to show here.

qml/Components/Lockscreen.qml+2

This diff is too big to show here.

qml/Components/PhysicalKeysMapper.qml+4−4

This diff is too big to show here.

qml/Components/ResponsiveGridView.qmldeleted−98

This diff is too big to show here.

qml/Components/ResponsiveVerticalJournal.qmldeleted−81

This diff is too big to show here.

qml/Components/ShellDialog.qml+7−10

This diff is too big to show here.

qml/Components/Showable.qml+15−12

This diff is too big to show here.

qml/Components/Wallpaper.qml+68−16

This diff is too big to show here.

qml/Components/WallpaperResolver.qml+17−6

This diff is too big to show here.

qml/Dash/CardCarousel.qmldeleted−74

This diff is too big to show here.

qml/Dash/CardGrid.qmldeleted−83

This diff is too big to show here.

qml/Dash/CardHorizontalList.qmldeleted−66

This diff is too big to show here.

qml/Dash/CardTool.qmldeleted−274

This diff is too big to show here.

qml/Dash/CardVerticalJournal.qmldeleted−85

This diff is too big to show here.

qml/Dash/Dash.qmldeleted−381

This diff is too big to show here.

qml/Dash/DashApplication.qmldeleted−39

This diff is too big to show here.

qml/Dash/DashBackground.qmldeleted−36

This diff is too big to show here.

qml/Dash/DashCategoryBase.qmldeleted−54

This diff is too big to show here.

qml/Dash/DashContent.qmldeleted−211

This diff is too big to show here.

qml/Dash/DashContentTabBarStyle.qmldeleted−24

This diff is too big to show here.

qml/Dash/DashNavigation.qmldeleted−199

This diff is too big to show here.

qml/Dash/DashNavigationHeader.qmldeleted−73

This diff is too big to show here.

qml/Dash/DashNavigationList.qmldeleted−118

This diff is too big to show here.

qml/Dash/DashPageHeader.qmldeleted−448

This diff is too big to show here.

qml/Dash/DashRenderer.qmldeleted−66

This diff is too big to show here.

qml/Dash/DashSectionHeader.qmldeleted−64

This diff is too big to show here.

qml/Dash/Filters/FilterExpandableWidget.qmldeleted−97

This diff is too big to show here.

qml/Dash/Filters/FilterOptionSelector.qmldeleted−97

This diff is too big to show here.

qml/Dash/Filters/FilterRangeInput.qmldeleted−136

This diff is too big to show here.

qml/Dash/Filters/FilterValueSlider.qmldeleted−87

This diff is too big to show here.

qml/Dash/Filters/FilterWidgetFactory.qmldeleted−89

This diff is too big to show here.

qml/Dash/FiltersPopover.qmldeleted−106

This diff is too big to show here.

qml/Dash/GenericScopeView.qmldeleted−797

This diff is too big to show here.

qml/Dash/PageHeaderExtraPanel.qmldeleted−201

This diff is too big to show here.

qml/Dash/PreviewView.qmldeleted−76

This diff is too big to show here.

qml/Dash/Previews/Preview.qmldeleted−145

This diff is too big to show here.

qml/Dash/Previews/PreviewActionButton.qmldeleted−27

This diff is too big to show here.

qml/Dash/Previews/PreviewActionCombo.qmldeleted−79

This diff is too big to show here.

qml/Dash/Previews/PreviewActions.qmldeleted−73

This diff is too big to show here.

qml/Dash/Previews/PreviewAudioPlayback.qmldeleted−152

This diff is too big to show here.

qml/Dash/Previews/PreviewComment.qmldeleted−86

This diff is too big to show here.

qml/Dash/Previews/PreviewCommentInput.qmldeleted−88

This diff is too big to show here.

qml/Dash/Previews/PreviewExpandable.qmldeleted−104

This diff is too big to show here.

qml/Dash/Previews/PreviewHeader.qmldeleted−170

This diff is too big to show here.

qml/Dash/Previews/PreviewIconActions.qmldeleted−88

This diff is too big to show here.

qml/Dash/Previews/PreviewImageGallery.qmldeleted−150

This diff is too big to show here.

qml/Dash/Previews/PreviewInlineVideo.qmldeleted−112

This diff is too big to show here.

qml/Dash/Previews/PreviewMediaToolbar.qmldeleted−57

This diff is too big to show here.

qml/Dash/Previews/PreviewOverlay.qmldeleted−166

This diff is too big to show here.

qml/Dash/Previews/PreviewProgress.qmldeleted−74

This diff is too big to show here.

qml/Dash/Previews/PreviewRatingDisplay.qmldeleted−117

This diff is too big to show here.

qml/Dash/Previews/PreviewRatingEdit.qmldeleted−83

This diff is too big to show here.

qml/Dash/Previews/PreviewRatingInput.qmldeleted−207

This diff is too big to show here.

qml/Dash/Previews/PreviewRatingSingleDisplay.qmldeleted−73

This diff is too big to show here.

qml/Dash/Previews/PreviewSingleton/qmldirdeleted−1

This diff is too big to show here.

qml/Dash/Previews/PreviewTable.qmldeleted−91

This diff is too big to show here.

qml/Dash/Previews/PreviewTextSummary.qmldeleted−78

This diff is too big to show here.

qml/Dash/Previews/PreviewVideoPlayback.qmldeleted−87

This diff is too big to show here.

qml/Dash/Previews/PreviewWidget.qmldeleted−60

This diff is too big to show here.

qml/Dash/Previews/PreviewWidgetFactory.qmldeleted−101

This diff is too big to show here.

qml/Dash/Previews/PreviewZoomableImage.qmldeleted−103

This diff is too big to show here.

qml/Dash/ScopeListView.qmldeleted−28

This diff is too big to show here.

qml/Dash/ScopeSettings/ScopeSetting.qmldeleted−46

This diff is too big to show here.

qml/Dash/ScopeSettings/ScopeSettingBoolean.qmldeleted−63

This diff is too big to show here.

qml/Dash/ScopeSettings/ScopeSettingList.qmldeleted−50

This diff is too big to show here.

qml/Dash/ScopeSettings/ScopeSettingNumber.qmldeleted−21

This diff is too big to show here.

qml/Dash/ScopeSettings/ScopeSettingString.qmldeleted−89

This diff is too big to show here.

qml/Dash/ScopeSettings/ScopeSettingsWidgetFactory.qmldeleted−61

This diff is too big to show here.

qml/Dash/ScopeSettingsPage.qmldeleted−72

This diff is too big to show here.

qml/Dash/ScopesList.qmldeleted−206

This diff is too big to show here.

qml/Dash/ScopesListCategory.qmldeleted−184

This diff is too big to show here.

qml/Dash/ScopesListCategoryItem.qmldeleted−115

This diff is too big to show here.

qml/Dash/graphics/dark_background.jpgdeleted

Binary file not shown.

qml/Dash/graphics/header_handlearrow2@27.pngdeleted

Binary file not shown.

qml/Dash/graphics/header_handlearrow@27.pngdeleted

Binary file not shown.

qml/Dash/graphics/icon_clear@20.pngdeleted

Binary file not shown.

qml/Dash/graphics/icon_search_active@20.pngdeleted

Binary file not shown.

qml/Dash/graphics/icon_search_inactive@20.pngdeleted

Binary file not shown.

qml/Dash/graphics/overview_hint@30.pngdeleted

Binary file not shown.

qml/Dash/graphics/pixel.pngdeleted

Binary file not shown.

qml/Dash/graphics/play_button@18.pngdeleted

Binary file not shown.

qml/Dash/graphics/play_button_active@18.pngdeleted

Binary file not shown.

qml/Dash/graphics/play_button_active_big@20.pngdeleted

Binary file not shown.

qml/Dash/graphics/play_button_big@20.pngdeleted

Binary file not shown.

qml/Dash/graphics/rectangular_dropshadow@30.pngdeleted

Binary file not shown.

qml/Dash/graphics/rectangular_dropshadow@30.scideleted−5

This diff is too big to show here.

qml/Dash/graphics/tabbarchevron@27.pngdeleted

Binary file not shown.

qml/Dash/graphics/tablet/icon_close_preview@20.pngdeleted

Binary file not shown.

qml/Dash/graphics/tooltip_arrow@27.pngdeleted

Binary file not shown.

qml/DeviceConfiguration.qml+12

This diff is too big to show here.

qml/Greeter/ButtonPrompt.qmlnew file+51

This diff is too big to show here.

qml/Greeter/CoverPage.qml+32−11

This diff is too big to show here.

qml/Greeter/Greeter.qml+50−4

This diff is too big to show here.

qml/Greeter/GreeterPrompt.qml+64−185

This diff is too big to show here.

qml/Greeter/GreeterView.qmlnew file+534

This diff is too big to show here.

qml/Greeter/LoginAreaContainer.qml+3−3

This diff is too big to show here.

qml/Greeter/LoginList.qml+72−83

This diff is too big to show here.

qml/Greeter/NarrowView.qmldeleted−263

This diff is too big to show here.

qml/Greeter/PinPrompt.qmlnew file+184

This diff is too big to show here.

qml/Greeter/PromptList.qml+21−18

This diff is too big to show here.

qml/Greeter/SessionsList.qml+3−2

This diff is too big to show here.

qml/Greeter/ShimGreeter.qml+2

This diff is too big to show here.

qml/Greeter/TextPrompt.qmlnew file+198

This diff is too big to show here.

qml/Greeter/WideView.qmldeleted−207

This diff is too big to show here.

qml/Launcher/Drawer.qml+222−247

This diff is too big to show here.

qml/Launcher/DrawerGridView.qml+41−5

This diff is too big to show here.

qml/Launcher/DrawerListView.qmldeleted−38

This diff is too big to show here.

qml/Launcher/Launcher.qml+70−45

This diff is too big to show here.

qml/Launcher/LauncherDelegate.qml+1−3

This diff is too big to show here.

qml/Launcher/LauncherPanel.qml+15−11

This diff is too big to show here.

qml/Launcher/MoreAppsHeader.qmldeleted−69

This diff is too big to show here.

qml/Dash/PullToRefreshScopeStyle.qml → qml/Launcher/PullToRefreshScopeStyle.qmlrenamed

The content is the same.

qml/Notifications/Notification.qml+8−3

This diff is too big to show here.

qml/Notifications/NotificationButton.qml+2−1

This diff is too big to show here.

qml/Notifications/SwipeToAct.qml+4

This diff is too big to show here.

qml/OrientedShell.qml+11−1

This diff is too big to show here.

qml/Panel/ActiveCallHint.qml+3

This diff is too big to show here.

qml/Panel/Indicators/IndicatorItem.qml+14−2

This diff is too big to show here.

qml/Panel/Indicators/IndicatorMenuItemFactory.qml+3−3

This diff is too big to show here.

qml/Panel/Indicators/IndicatorsLight.qml+185−12

This diff is too big to show here.

qml/Panel/MenuContent.qml+4−1

This diff is too big to show here.

qml/Panel/Panel.qml+60−22

This diff is too big to show here.

qml/Panel/PanelBar.qml+10−8

This diff is too big to show here.

qml/Panel/PanelItemRow.qml+6−4

This diff is too big to show here.

qml/Panel/PanelMenu.qml+15−9

This diff is too big to show here.

qml/Panel/PanelMenuPage.qml+1−1

This diff is too big to show here.

qml/Rotation/RotationStates.qml−3

This diff is too big to show here.

qml/ScopeTool.qmldeleted−165

This diff is too big to show here.

qml/Shell.qml+119−65

This diff is too big to show here.

qml/Stage/AbstractStage.qmldeleted−93

This diff is too big to show here.

qml/Stage/ApplicationWindow.qml+15−4

This diff is too big to show here.

qml/Stage/DesktopSpread.qmldeleted−576

This diff is too big to show here.

qml/Stage/DesktopSpreadDelegate.qmldeleted−126

This diff is too big to show here.

qml/Stage/MoveHandler.qml+7−7

This diff is too big to show here.

qml/Stage/PhoneStage.qmldeleted−806

This diff is too big to show here.

qml/Stage/SideStage.qml+10−6

This diff is too big to show here.

qml/Stage/Splash.qml+4−4

This diff is too big to show here.

qml/Stage/SpreadDelegate.qmldeleted−424

This diff is too big to show here.

qml/Stage/SpreadMaths.qmldeleted−164

This diff is too big to show here.

qml/Stage/Stage.qml+152−33

This diff is too big to show here.

qml/Stage/StageMaths.qml+5−2

This diff is too big to show here.

qml/Stage/TabletStage.qmldeleted−1201

This diff is too big to show here.

qml/Stage/TransformedSpreadDelegate.qmldeleted−391

This diff is too big to show here.

qml/Stage/TransformedTabletSpreadDelegate.qmldeleted−437

This diff is too big to show here.

qml/Stage/WindowDecoration.qml+5−6

This diff is too big to show here.

qml/Stage/WindowedFullscreenPolicy.qml+1−1

This diff is too big to show here.

qml/Tutorial/Tutorial.qml+1

This diff is too big to show here.

qml/Tutorial/TutorialContent.qml+61−42

This diff is too big to show here.

qml/Tutorial/TutorialLeft.qml+1−1

This diff is too big to show here.

qml/Tutorial/TutorialLeftLong.qml+1−1

This diff is too big to show here.

qml/Tutorial/TutorialRight.qml+2−3

This diff is too big to show here.

qml/Tutorial/TutorialTop.qml+2−2

This diff is too big to show here.

qml/Wizard/Components/InputMethod.qml+9−9

This diff is too big to show here.

qml/Wizard/Page.qml+15

This diff is too big to show here.

qml/Wizard/Pages.qml+90−16

This diff is too big to show here.

qml/Wizard/Pages/10-welcome-update.qmlnew file+137

This diff is too big to show here.

qml/Wizard/Pages/10-welcome.qml+3

This diff is too big to show here.

qml/Wizard/Pages/11-changelog.qmlnew file+95

This diff is too big to show here.

qml/Wizard/Pages/30-wifi.qml+13−6

This diff is too big to show here.

qml/Wizard/Pages/40-location.qmldeleted−290

This diff is too big to show here.

qml/Wizard/Pages/50-timezone.qml+11−12

This diff is too big to show here.

qml/Wizard/Pages/60-account.qml+12−10

This diff is too big to show here.

qml/Wizard/Pages/70-passwd-type.qml+1

This diff is too big to show here.

qml/Wizard/Pages/75-report-check.qmldeleted−91

This diff is too big to show here.

qml/Wizard/Pages/78-firmware-update.qml.disablednew file+246

This diff is too big to show here.

qml/Wizard/Pages/79-system-update.qmlnew file+148

This diff is too big to show here.

qml/Wizard/Pages/80-finished.qml+4−2

This diff is too big to show here.

qml/Wizard/Pages/here-terms.qmldeleted−126

This diff is too big to show here.

qml/Wizard/Pages/passcode-desktop.qml+14−5

This diff is too big to show here.

qml/Wizard/Pages/password-set.qml+12−4

This diff is too big to show here.

qml/Wizard/Wizard.qml+5−2

This diff is too big to show here.

src/ApplicationArguments.h+5

This diff is too big to show here.

src/CMakeLists.txt−2

This diff is too big to show here.

src/Dash/CMakeLists.txtdeleted−30

This diff is too big to show here.

src/Dash/main.cppdeleted−146

This diff is too big to show here.

src/ShellApplication.cpp+14−4

This diff is too big to show here.

src/ShellApplication.h+1−3

This diff is too big to show here.

src/main.cpp+9−1

This diff is too big to show here.

tests/CMakeLists.txt+9−2

This diff is too big to show here.

tests/autopilot/unity8/dash.pydeleted−247

This diff is too big to show here.

tests/autopilot/unity8/shell/fixture_setup.py+1−27

This diff is too big to show here.

tests/autopilot/unity8/shell/tests/test_helpers.py−74

This diff is too big to show here.

tests/autopilot/unity8/shell/tests/test_rotation.py+3−3

This diff is too big to show here.

tests/copyright/check_copyright.sh+2

This diff is too big to show here.

tests/data/unity/backgrounds/20x30.pngnew file

Binary file not shown.

tests/data/unity/backgrounds/black.pngnew file

Binary file not shown.

tests/mocks/AccountsService/AccountsService.cpp−36

This diff is too big to show here.

tests/mocks/AccountsService/AccountsService.h−20

This diff is too big to show here.

tests/mocks/GSettings.1.0/fake_gsettings.cpp+19−35

This diff is too big to show here.

tests/mocks/GSettings.1.0/fake_gsettings.h+8−15

This diff is too big to show here.

tests/mocks/Ubuntu/Connectivity/networking-status.cpp+7−1

This diff is too big to show here.

tests/mocks/Ubuntu/Connectivity/networking-status.h+5−3

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/CMakeLists.txt+1

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/Update/CMakeLists.txtnew file+1

This diff is too big to show here.

qml/Dash/Previews/PreviewSingleton/PreviewSingleton.qml → tests/mocks/Ubuntu/SystemSettings/Update/MockSystemImage.qmlrenamed+13−5

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/Update/qmldirnew file+2

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationInfo.cpp+7−4

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationInfo.h+2−6

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationManager.cpp+14−1

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/Unity/ApplicationMenu/mockapplicationmenuregistry.cpp+2−2

This diff is too big to show here.

tests/mocks/Unity/ApplicationMenu/mockapplicationmenuregistry.h+1−1

This diff is too big to show here.

tests/mocks/Unity/CMakeLists.txt−72

This diff is too big to show here.

tests/mocks/Unity/DashCommunicator/CMakeLists.txtdeleted−18

This diff is too big to show here.

tests/mocks/Unity/DashCommunicator/dashcommunicator.cppdeleted−42

This diff is too big to show here.

tests/mocks/Unity/DashCommunicator/dashcommunicator.hdeleted−39

This diff is too big to show here.

tests/mocks/Unity/DashCommunicator/dashcommunicatorservice.cppdeleted−46

This diff is too big to show here.

tests/mocks/Unity/DashCommunicator/dashcommunicatorservice.hdeleted−41

This diff is too big to show here.

tests/mocks/Unity/DashCommunicator/plugin.cppdeleted−31

This diff is too big to show here.

tests/mocks/Unity/DashCommunicator/qmldirdeleted−3

This diff is too big to show here.

tests/mocks/Unity/Indicators/IndicatorsModel.qml+30−12

This diff is too big to show here.

tests/mocks/Unity/Indicators/fakeindicatorsmodeldata.js+6−5

This diff is too big to show here.

tests/mocks/Unity/Launcher/MockAppDrawerModel.cpp+26−2

This diff is too big to show here.

tests/mocks/Unity/Launcher/MockAppDrawerModel.h+11

This diff is too big to show here.

tests/mocks/Unity/Launcher/MockLauncherModel.cpp+1−1

This diff is too big to show here.

tests/mocks/Unity/fake_categories.cppdeleted−165

This diff is too big to show here.

tests/mocks/Unity/fake_categories.hdeleted−54

This diff is too big to show here.

tests/mocks/Unity/fake_expandablefilterwidget.cppdeleted−53

This diff is too big to show here.

tests/mocks/Unity/fake_expandablefilterwidget.hdeleted−48

This diff is too big to show here.

tests/mocks/Unity/fake_filters.cppdeleted−136

This diff is too big to show here.

tests/mocks/Unity/fake_filters.hdeleted−46

This diff is too big to show here.

tests/mocks/Unity/fake_navigation.cppdeleted−123

This diff is too big to show here.

tests/mocks/Unity/fake_navigation.hdeleted−61

This diff is too big to show here.

tests/mocks/Unity/fake_optionselectorfilter.cppdeleted−70

This diff is too big to show here.

tests/mocks/Unity/fake_optionselectorfilter.hdeleted−54

This diff is too big to show here.

tests/mocks/Unity/fake_optionselectoroptions.cppdeleted−90

This diff is too big to show here.

tests/mocks/Unity/fake_optionselectoroptions.hdeleted−49

This diff is too big to show here.

tests/mocks/Unity/fake_previewmodel.cppdeleted−103

This diff is too big to show here.

tests/mocks/Unity/fake_previewmodel.hdeleted−58

This diff is too big to show here.

tests/mocks/Unity/fake_previewwidgetmodel.cppdeleted−97

This diff is too big to show here.

tests/mocks/Unity/fake_previewwidgetmodel.hdeleted−47

This diff is too big to show here.

tests/mocks/Unity/fake_rangeinputfilter.cppdeleted−167

This diff is too big to show here.

tests/mocks/Unity/fake_rangeinputfilter.hdeleted−79

This diff is too big to show here.

tests/mocks/Unity/fake_resultsmodel.cppdeleted−92

This diff is too big to show here.

tests/mocks/Unity/fake_resultsmodel.hdeleted−52

This diff is too big to show here.

tests/mocks/Unity/fake_scope.cppdeleted−372

This diff is too big to show here.

tests/mocks/Unity/fake_scope.hdeleted−128

This diff is too big to show here.

tests/mocks/Unity/fake_scopes.cppdeleted−286

This diff is too big to show here.

tests/mocks/Unity/fake_scopes.hdeleted−83

This diff is too big to show here.

tests/mocks/Unity/fake_scopesoverview.cppdeleted−340

This diff is too big to show here.

tests/mocks/Unity/fake_scopesoverview.hdeleted−119

This diff is too big to show here.

tests/mocks/Unity/fake_settingsmodel.cppdeleted−95

This diff is too big to show here.

tests/mocks/Unity/fake_settingsmodel.hdeleted−54

This diff is too big to show here.

tests/mocks/Unity/fake_unity_plugin.cppdeleted−62

This diff is too big to show here.

tests/mocks/Unity/fake_valuesliderfilter.cppdeleted−84

This diff is too big to show here.

tests/mocks/Unity/fake_valuesliderfilter.hdeleted−55

This diff is too big to show here.

tests/mocks/Unity/fake_valueslidervalues.cppdeleted−51

This diff is too big to show here.

tests/mocks/Unity/qmldirdeleted−3

This diff is too big to show here.

tests/mocks/Wizard/CMakeLists.txt+1

This diff is too big to show here.

tests/mocks/Wizard/MockSystem.cpp+19−4

This diff is too big to show here.

tests/mocks/Wizard/MockSystem.h+11−1

This diff is too big to show here.

tests/mocks/Wizard/mockplugin.cpp+2

This diff is too big to show here.

tests/plugins/AccountsService/PropertiesServer.cpp+1−1

This diff is too big to show here.

tests/plugins/AccountsService/client.cpp+6−34

This diff is too big to show here.

tests/plugins/CMakeLists.txt+2−4

This diff is too big to show here.

tests/plugins/Dash/CMakeLists.txtdeleted−100

This diff is too big to show here.

tests/plugins/Dash/cardcreator/1.resdeleted−82

This diff is too big to show here.

tests/plugins/Dash/cardcreator/1.res.cardcreatordeleted−69

This diff is too big to show here.

tests/plugins/Dash/cardcreator/1.tstdeleted−4

This diff is too big to show here.

tests/plugins/Dash/cardcreator/10.resdeleted−129

This diff is too big to show here.

tests/plugins/Dash/cardcreator/10.res.cardcreatordeleted−127

This diff is too big to show here.

tests/plugins/Dash/cardcreator/10.tstdeleted−4

This diff is too big to show here.

tests/plugins/Dash/cardcreator/11.resdeleted−176

This diff is too big to show here.

tests/plugins/Dash/cardcreator/11.res.cardcreatordeleted−160

This diff is too big to show here.

tests/plugins/Dash/cardcreator/11.tstdeleted−4

This diff is too big to show here.

tests/plugins/Dash/cardcreator/12.resdeleted−108

This diff is too big to show here.

tests/plugins/Dash/cardcreator/12.res.cardcreatordeleted−95

This diff is too big to show here.

tests/plugins/Dash/cardcreator/12.tstdeleted−4

This diff is too big to show here.

tests/plugins/Dash/cardcreator/2.resdeleted−128

This diff is too big to show here.

tests/plugins/Dash/cardcreator/2.res.cardcreatordeleted−126

This diff is too big to show here.

tests/plugins/Dash/cardcreator/2.tstdeleted−4

This diff is too big to show here.

tests/plugins/Dash/cardcreator/3.resdeleted−90

This diff is too big to show here.

tests/plugins/Dash/cardcreator/3.res.cardcreatordeleted−86

This diff is too big to show here.

tests/plugins/Dash/cardcreator/3.tstdeleted−4

This diff is too big to show here.

tests/plugins/Dash/cardcreator/4.resdeleted−111

This diff is too big to show here.

tests/plugins/Dash/cardcreator/4.res.cardcreatordeleted−99

This diff is too big to show here.

tests/plugins/Dash/cardcreator/4.tstdeleted−4

This diff is too big to show here.

tests/plugins/Dash/cardcreator/5.resdeleted−102

This diff is too big to show here.

tests/plugins/Dash/cardcreator/5.res.cardcreatordeleted−99

This diff is too big to show here.

tests/plugins/Dash/cardcreator/5.tstdeleted−4

This diff is too big to show here.

tests/plugins/Dash/cardcreator/6.resdeleted−127

This diff is too big to show here.

tests/plugins/Dash/cardcreator/6.res.cardcreatordeleted−116

This diff is too big to show here.

tests/plugins/Dash/cardcreator/6.tstdeleted−4

This diff is too big to show here.

tests/plugins/Dash/cardcreator/7.resdeleted−141

This diff is too big to show here.

tests/plugins/Dash/cardcreator/7.res.cardcreatordeleted−139

This diff is too big to show here.

tests/plugins/Dash/cardcreator/7.tstdeleted−4

This diff is too big to show here.

tests/plugins/Dash/cardcreator/8.resdeleted−109

This diff is too big to show here.

tests/plugins/Dash/cardcreator/8.res.cardcreatordeleted−97

This diff is too big to show here.

tests/plugins/Dash/cardcreator/8.tstdeleted−4

This diff is too big to show here.

tests/plugins/Dash/cardcreator/9.resdeleted−120

This diff is too big to show here.

tests/plugins/Dash/cardcreator/9.res.cardcreatordeleted−109

This diff is too big to show here.

tests/plugins/Dash/cardcreator/9.tstdeleted−4

This diff is too big to show here.

tests/plugins/Dash/cardcreatortest.cppdeleted−126

This diff is too big to show here.

tests/plugins/Dash/cardcreatortest.qmldeleted−29

This diff is too big to show here.

tests/plugins/Dash/horizontaljournaltest.cppdeleted−490

This diff is too big to show here.

tests/plugins/Dash/horizontaljournaltest.qmldeleted−44

This diff is too big to show here.

tests/plugins/Dash/horizontaljournaltry.cppdeleted−91

This diff is too big to show here.

tests/plugins/Dash/horizontaljournaltry.qmldeleted−120

This diff is too big to show here.

tests/plugins/Dash/listviewwithpageheadersectionexternalmodeltest.cppdeleted−246

This diff is too big to show here.

tests/plugins/Dash/listviewwithpageheadersectiontest.cppdeleted−2212

This diff is too big to show here.

tests/plugins/Dash/listviewwithpageheadertest.cppdeleted−2038

This diff is too big to show here.

tests/plugins/Dash/listviewwithpageheadertest.qmldeleted−96

This diff is too big to show here.

tests/plugins/Dash/listviewwithpageheadertestsection.qmldeleted−119

This diff is too big to show here.

tests/plugins/Dash/listviewwithpageheadertestsectionexternalmodel.qmldeleted−76

This diff is too big to show here.

tests/plugins/Dash/organicgridtest.cppdeleted−533

This diff is too big to show here.

tests/plugins/Dash/organicgridtest.qmldeleted−44

This diff is too big to show here.

tests/plugins/Dash/organicgridtry.cppdeleted−99

This diff is too big to show here.

tests/plugins/Dash/organicgridtry.qmldeleted−114

This diff is too big to show here.

tests/plugins/Dash/tst_CardAttributes.qmldeleted−57

This diff is too big to show here.

tests/plugins/Dash/tst_CroppedImageMinimumSourceSize.qmldeleted−56

This diff is too big to show here.

tests/plugins/Dash/tst_ListViewWithPageHeaderQML.qmldeleted−140

This diff is too big to show here.

tests/plugins/Dash/tst_ScopeStyle.qmldeleted−188

This diff is too big to show here.

tests/plugins/Dash/verticaljournaltest.cppdeleted−564

This diff is too big to show here.

tests/plugins/Dash/verticaljournaltest.qmldeleted−45

This diff is too big to show here.

tests/plugins/Dash/verticaljournaltry.cppdeleted−91

This diff is too big to show here.

tests/plugins/Dash/verticaljournaltry.qmldeleted−121

This diff is too big to show here.

tests/plugins/ImageCache/CMakeLists.txtdeleted−30

This diff is too big to show here.

tests/plugins/ImageCache/graphics/wide.jpgdeleted

Binary file not shown.

tests/plugins/ImageCache/test.cppdeleted−216

This diff is too big to show here.

tests/plugins/ImageCache/test.qmldeleted−23

This diff is too big to show here.

tests/plugins/LightDM/IntegratedLightDM/dbus.cpp+18−5

This diff is too big to show here.

tests/plugins/LightDM/IntegratedLightDM/sessionsmodel.cpp+4

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_TouchGate.cpp+1−1

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_TouchGestureArea.cpp+30

This diff is too big to show here.

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

This diff is too big to show here.

tests/plugins/Unity/Launcher/appdrawermodeltest.cpp+15

This diff is too big to show here.

tests/plugins/Unity/Launcher/launchermodeltest.cpp+1

This diff is too big to show here.

tests/plugins/Unity/Launcher/ualwrapper.cpp−2

This diff is too big to show here.

qml/Dash/Filters/FilterWidget.qml → tests/plugins/Unity/Launcher/xdgwatcher.cpprenamed+24−11

This diff is too big to show here.

tests/mocks/Unity/fake_valueslidervalues.h → tests/plugins/Unity/Launcher/xdgwatcher.hrenamed+16−13

This diff is too big to show here.

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

This diff is too big to show here.

tests/plugins/Unity/Session/LogindServer.cpp+5

This diff is too big to show here.

tests/plugins/Unity/Session/LogindServer.h+1

This diff is too big to show here.

tests/plugins/Unity/Session/interfaces.xml+4

This diff is too big to show here.

tests/plugins/Unity/Session/server.cpp+1−1

This diff is too big to show here.

tests/plugins/Unity/Session/sessionbackendtest.cpp+3−5

This diff is too big to show here.

tests/plugins/Utils/DeviceConfigParserTest.cpp+3

This diff is too big to show here.

tests/plugins/Utils/ModelTest.cpp+2−1

This diff is too big to show here.

tests/plugins/Utils/WindowStateStorageTest.cpp+49−1

This diff is too big to show here.

tests/plugins/WindowManager/UnityApplicationMocks.h+1

This diff is too big to show here.

tests/plugins/WindowManager/tst_TopLevelWindowModel.cpp+63

This diff is too big to show here.

tests/qmltests/ApplicationMenuDataLoader.qml+1−1

This diff is too big to show here.

tests/qmltests/ApplicationMenus/tst_MenuBar.qml+46−18

This diff is too big to show here.

tests/qmltests/ApplicationMenus/tst_MenuPopup.qml+10−9

This diff is too big to show here.

tests/qmltests/CMakeLists.txt+4−50

This diff is too big to show here.

tests/qmltests/Components/tst_Carousel.qmldeleted−292

This diff is too big to show here.

tests/qmltests/Components/tst_Dialogs.qml−1

This diff is too big to show here.

tests/qmltests/Components/tst_DraggingArea.qml+6−6

This diff is too big to show here.

tests/qmltests/Components/tst_Lockscreen.qml+11−9

This diff is too big to show here.

tests/qmltests/Components/tst_MediaServices.qml+5−4

This diff is too big to show here.

tests/qmltests/Components/tst_PhysicalKeysMapper.qml+7−6

This diff is too big to show here.

tests/qmltests/Components/tst_Rating.qml+1−1

This diff is too big to show here.

tests/qmltests/Components/tst_ResponsiveGridView.qmldeleted−157

This diff is too big to show here.

tests/qmltests/Components/tst_ResponsiveVerticalJournal.qmldeleted−183

This diff is too big to show here.

tests/qmltests/Components/tst_SharingPicker.qml+3−3

This diff is too big to show here.

tests/qmltests/Components/tst_Showable.qml+13

This diff is too big to show here.

tests/qmltests/Components/tst_Wallpaper.qmlnew file+118

This diff is too big to show here.

tests/qmltests/Components/tst_WallpaperResolver.qml+104−18

This diff is too big to show here.

tests/qmltests/Dash/CardHelpers.jsdeleted−115

This diff is too big to show here.

tests/qmltests/Dash/Filters/tst_FilterExpandableWidget.qmldeleted−99

This diff is too big to show here.

tests/qmltests/Dash/Filters/tst_FilterOptionSelector.qmldeleted−96

This diff is too big to show here.

tests/qmltests/Dash/Filters/tst_FilterRangeInput.qmldeleted−247

This diff is too big to show here.

tests/qmltests/Dash/Filters/tst_FilterValueSlider.qmldeleted−101

This diff is too big to show here.

tests/qmltests/Dash/Filters/tst_FilterWidgetFactory.qmldeleted−59

This diff is too big to show here.

tests/qmltests/Dash/Previews/MockPreviewWidget.qmldeleted−27

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_Preview.qmldeleted−214

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewActions.qmldeleted−262

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewAudioPlayback.qmldeleted−182

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewComment.qmldeleted−84

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewCommentInput.qmldeleted−113

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewExpandable.qmldeleted−353

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewHeader.qmldeleted−183

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewIconActions.qmldeleted−136

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewImageGallery.qmldeleted−147

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewInlineVideo.qmldeleted−155

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewMediaToolbar.qmldeleted−69

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewProgress.qmldeleted−100

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewRatingDisplay.qmldeleted−123

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewRatingDisplayCreationRanges.qmldeleted−131

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewRatingEdit.qmldeleted−87

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewRatingInput.qmldeleted−246

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewTable.qmldeleted−147

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewTextSummary.qmldeleted−87

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewVideoPlayback.qmldeleted−61

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewWidgetFactory.qmldeleted−104

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qmldeleted−138

This diff is too big to show here.

tests/qmltests/Dash/ScopeSettings/tst_ScopeSettingBoolean.qmldeleted−62

This diff is too big to show here.

tests/qmltests/Dash/ScopeSettings/tst_ScopeSettingList.qmldeleted−84

This diff is too big to show here.

tests/qmltests/Dash/ScopeSettings/tst_ScopeSettingNumber.qmldeleted−98

This diff is too big to show here.

tests/qmltests/Dash/ScopeSettings/tst_ScopeSettingString.qmldeleted−88

This diff is too big to show here.

tests/qmltests/Dash/ScopeSettings/tst_ScopeSettingsWidgetFactory.qmldeleted−65

This diff is too big to show here.

tests/qmltests/Dash/artwork/avatar@12.pngdeleted

Binary file not shown.

tests/qmltests/Dash/artwork/background.pngdeleted

Binary file not shown.

tests/qmltests/Dash/artwork/checkers.pngdeleted

Binary file not shown.

tests/qmltests/Dash/artwork/emblem.pngdeleted

Binary file not shown.

tests/qmltests/Dash/artwork/music-player-design.pngdeleted

Binary file not shown.

tests/qmltests/Dash/tst_Card.qmldeleted−682

This diff is too big to show here.

tests/qmltests/Dash/tst_CardBenchmark.qmldeleted−95

This diff is too big to show here.

tests/qmltests/Dash/tst_CardCarousel.qmldeleted−111

This diff is too big to show here.

tests/qmltests/Dash/tst_CardTool.qmldeleted−379

This diff is too big to show here.

tests/qmltests/Dash/tst_Dash.qmldeleted−648

This diff is too big to show here.

tests/qmltests/Dash/tst_DashContent.qmldeleted−730

This diff is too big to show here.

tests/qmltests/Dash/tst_DashPageHeader.qmldeleted−357

This diff is too big to show here.

tests/qmltests/Dash/tst_DashShell.qmldeleted−84

This diff is too big to show here.

tests/qmltests/Dash/tst_GenericScopeView.qmldeleted−706

This diff is too big to show here.

tests/qmltests/Dash/tst_PageHeader/logo-ubuntu-orange.svgdeleted−60

This diff is too big to show here.

tests/qmltests/Dash/tst_PreviewView.qmldeleted−122

This diff is too big to show here.

tests/qmltests/Greeter/TestView.qml+9−1

This diff is too big to show here.

tests/qmltests/Greeter/tst_Greeter.qml+19−24

This diff is too big to show here.

tests/qmltests/Greeter/tst_GreeterView.qmlnew file+1366

This diff is too big to show here.

tests/qmltests/Greeter/tst_NarrowView.qmldeleted−566

This diff is too big to show here.

tests/qmltests/Greeter/tst_WideView.qmldeleted−780

This diff is too big to show here.

tests/qmltests/Launcher/tst_Drawer.qml+193−58

This diff is too big to show here.

tests/qmltests/Launcher/tst_Launcher.qml+155−83

This diff is too big to show here.

tests/qmltests/Notifications/tst_Notifications.qml+16−10

This diff is too big to show here.

tests/qmltests/Notifications/tst_OptionToggle.qml+12−6

This diff is too big to show here.

tests/qmltests/Notifications/tst_SwipeToAct.qml+10−3

This diff is too big to show here.

tests/qmltests/Notifications/tst_VisualSnapDecisionsQueue.qml+3−3

This diff is too big to show here.

tests/qmltests/Panel/Indicators/tst_IndicatorMenuItemFactory.qml+33−79

This diff is too big to show here.

tests/qmltests/Panel/Indicators/tst_IndicatorsLight.qml+168−8

This diff is too big to show here.

tests/qmltests/Panel/PanelUI.qmlnew file+286

This diff is too big to show here.

tests/qmltests/Panel/tst_ActiveCallHint.qml+14−9

This diff is too big to show here.

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

This diff is too big to show here.

tests/qmltests/Panel/tst_Panel.qml+58−240

This diff is too big to show here.

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

This diff is too big to show here.

tests/qmltests/Panel/tst_PanelMenu.qml+61−22

This diff is too big to show here.

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

This diff is too big to show here.

tests/qmltests/Panel/tst_PanelSmallScreen.qmlnew file+133

This diff is too big to show here.

tests/qmltests/Stage/ApplicationCheckBox.qml+6−6

This diff is too big to show here.

tests/qmltests/Stage/tst_ApplicationWindow.qml+3−2

This diff is too big to show here.

tests/qmltests/Stage/tst_DesktopStage.qml+22−4

This diff is too big to show here.

tests/qmltests/Stage/tst_PhoneStage.qml+87−60

This diff is too big to show here.

tests/qmltests/Stage/tst_QMLTopLevelWindowModel.qmlnew file+191

This diff is too big to show here.

tests/qmltests/Stage/tst_SpreadDelegate.qmldeleted−423

This diff is too big to show here.

tests/qmltests/Stage/tst_SurfaceContainer.qml+9−8

This diff is too big to show here.

tests/qmltests/Stage/tst_TabletStage.qml+112−151

This diff is too big to show here.

tests/qmltests/Stage/tst_WindowDecoration.qml+3−3

This diff is too big to show here.

tests/qmltests/Stage/tst_WindowResizeArea.qml+4−3

This diff is too big to show here.

tests/qmltests/Tutorial/tst_Tutorial.qml+187−189

This diff is too big to show here.

tests/qmltests/Wizard/tst_Wizard.qml+100−136

This diff is too big to show here.

tests/qmltests/tst_OrientedShell.qml+312−266

This diff is too big to show here.

tests/qmltests/tst_Shell.qml+610−550

This diff is too big to show here.

tests/qmltests/tst_ShellWithPin.qml+96−79

This diff is too big to show here.

tests/utils/modules/Unity/Test/MouseTouchEmulationCheckbox.qml+1−1

This diff is too big to show here.

tests/utils/modules/Unity/Test/StageTestCase.qml+14−18

This diff is too big to show here.

tests/utils/modules/Unity/Test/UnityTestCase.qml+2−2

This diff is too big to show here.

tools/CMakeLists.txt−1

This diff is too big to show here.

tools/scopetool/CMakeLists.txtdeleted−12

This diff is too big to show here.

tools/scopetool/registry-tracker.cppdeleted−146

This diff is too big to show here.

tools/scopetool/registry-tracker.hdeleted−49

This diff is too big to show here.

tools/scopetool/scopetool.cppdeleted−116

This diff is too big to show here.