on xenial help sign in
.bazaar/Makefiledeleted−6
since splitsnapshots
unifiedsplit
@@ -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 @@
2/builddir
2/builddir
3# QtCreator project files
3# QtCreator project files
4/*.user
4/*.user
5+*.qmlc
6+*.jsc
5# Eclipse project files
7# Eclipse project files
6/.project
8/.project
7/.cproject
9/.cproject
8/.settings
10/.settings
9/.pydevproject
11/.pydevproject
12+# KDevelop project Files
13+/.kdev4/
14+/build/
15+/*.kdev4
16+.clickable/
CMakeLists.txt+4−3
@@ -70,12 +70,15 @@ find_package(Qt5DBus 5.6 REQUIRED)
70find_package(Qt5Concurrent 5.6 REQUIRED)
70find_package(Qt5Concurrent 5.6 REQUIRED)
71find_package(Qt5Sql 5.6 REQUIRED)
71find_package(Qt5Sql 5.6 REQUIRED)
72find_package(Qt5Test 5.6 REQUIRED)
72find_package(Qt5Test 5.6 REQUIRED)
73+find_package(Qt5Svg 5.6 REQUIRED)
74+find_package(Qt5Network 5.6 REQUIRED)
75+find_package(Qt5Xml 5.6 REQUIRED)
73
76
74pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=27)
77pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=27)
75pkg_check_modules(GEONAMES REQUIRED geonames>=0.2)
78pkg_check_modules(GEONAMES REQUIRED geonames>=0.2)
76pkg_check_modules(GIO REQUIRED gio-2.0>=2.32)
79pkg_check_modules(GIO REQUIRED gio-2.0>=2.32)
77pkg_check_modules(GLIB REQUIRED glib-2.0>=2.32)
80pkg_check_modules(GLIB REQUIRED glib-2.0>=2.32)
78−pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=12)
81+pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=13)
79pkg_check_modules(QMENUMODEL REQUIRED qmenumodel)
82pkg_check_modules(QMENUMODEL REQUIRED qmenumodel)
80pkg_check_modules(GD3 REQUIRED gnome-desktop-3.0)
83pkg_check_modules(GD3 REQUIRED gnome-desktop-3.0)
81pkg_check_modules(UAL REQUIRED ubuntu-app-launch-2)
84pkg_check_modules(UAL REQUIRED ubuntu-app-launch-2)
@@ -145,8 +148,6 @@ include(autopilot)
145declare_autopilot_test(shell unity8.shell ${CMAKE_SOURCE_DIR}/tests/autopilot/)
148declare_autopilot_test(shell unity8.shell ${CMAKE_SOURCE_DIR}/tests/autopilot/)
146
149
147set(SHELL_APP unity8)
150set(SHELL_APP unity8)
148−set(DASH_APP unity8-dash)
149−set(SCOPE_TOOL unity-scope-tool)
150set(INDICATORS_CLIENT_APP indicators-client)
151set(INDICATORS_CLIENT_APP indicators-client)
151set(GREETER_APP unity8-greeter)
152set(GREETER_APP unity8-greeter)
152set(MOCK_INDICATOR_SERVICE_APP unity-mock-indicator-service)
153set(MOCK_INDICATOR_SERVICE_APP unity-mock-indicator-service)
Jenkinsfile+2−65
@@ -1,65 +1,2 @@
1−pipeline {
1+@Library('ubports-build-tools') _
2− agent any
2+buildAndProvideDebianPackage()
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− build-binary.sh'''
42− stash(includes: '*.gz,*.bz2,*.xz,*.deb,*.dsc,*.changes,*.buildinfo,lintian.txt', name: 'build-amd64')
43− cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
44− }
45− }
46− )
47− }
48− }
49− stage('Results') {
50− steps {
51− cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
52− unstash 'build-armhf'
53− unstash 'build-arm64'
54− unstash 'build-amd64'
55− archiveArtifacts(artifacts: '*.gz,*.bz2,*.xz,*.deb,*.dsc,*.changes,*.buildinfo', fingerprint: true, onlyIfSuccessful: true)
56− sh '''/usr/bin/build-repo.sh'''
57− }
58− }
59− stage('Cleanup') {
60− steps {
61− cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
62− }
63− }
64− }
65−}
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/QmlPlugins.cmakedeleted−148
@@ -1,148 +0,0 @@
1−# If you need to override the qmlplugindump binary, create the qmlplugin executable
2−# target before loading this plugin.
3−
4−if(NOT TARGET qmlplugindump)
5− find_program(qmlplugindump_exe qmlplugindump)
6−
7− if(NOT qmlplugindump_exe)
8− msg(FATAL_ERROR "Could not locate qmlplugindump.")
9− endif()
10−
11− add_executable(qmlplugindump IMPORTED)
12− set_target_properties(qmlplugindump PROPERTIES IMPORTED_LOCATION ${qmlplugindump_exe})
13−endif()
14−
15−#
16−# A custom target for building the qmltypes files manually.
17−#
18−if (NOT TARGET qmltypes)
19− add_custom_target(qmltypes)
20−endif()
21−
22−# Creates a target for copying resource files into build dir and optionally installing them.
23−#
24−# Files will be copied into ${BINARY_DIR}/${path} or ${CMAKE_CURRENT_BINARY_DIR} and installed
25−# into ${DESTINATION}/${path}.
26−#
27−# Resource file names are matched against {*.{qml,js,jpg,png,sci,svg},qmldir}.
28−#
29−# export_qmlfiles(plugin path
30−# [SEARCH_PATH path] # Path to search for resources in (defaults to ${CMAKE_CURRENT_SOURCE_DIR})
31−# [BINARY_DIR path]
32−# [DESTINATION path]
33−# [TARGET_PREFIX string] # Will be prefixed to the target name
34−# )
35−#
36−# Created target:
37−# - ${TARGET_PREFIX}${plugin}-qmlfiles - Copies resources into the binary dir.
38−
39−macro(export_qmlfiles PLUGIN PATH)
40− set(single SEARCH_PATH BINARY_DIR DESTINATION TARGET_PREFIX)
41− cmake_parse_arguments(QMLFILES "" "${single}" "" ${ARGN})
42−
43− if(NOT QMLFILES_SEARCH_PATH)
44− set(QMLFILES_SEARCH_PATH ${CMAKE_CURRENT_SOURCE_DIR})
45− endif()
46−
47− if(QMLFILES_BINARY_DIR)
48− set(qmlfiles_dir ${QMLFILES_BINARY_DIR}/${PATH})
49− else()
50− set(qmlfiles_dir ${CMAKE_CURRENT_BINARY_DIR})
51− endif()
52−
53− file(GLOB QMLFILES
54− ${QMLFILES_SEARCH_PATH}/*.qml
55− ${QMLFILES_SEARCH_PATH}/*.js
56− ${QMLFILES_SEARCH_PATH}/*.jpg
57− ${QMLFILES_SEARCH_PATH}/*.png
58− ${QMLFILES_SEARCH_PATH}/*.sci
59− ${QMLFILES_SEARCH_PATH}/*.svg
60− ${QMLFILES_SEARCH_PATH}/*.qmltypes
61− ${QMLFILES_SEARCH_PATH}/qmldir
62− )
63−
64− execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${qmlfiles_dir})
65−
66− # copy the files
67− add_custom_target(${QMLFILES_TARGET_PREFIX}${PLUGIN}-qmlfiles ALL
68− COMMAND cp ${QMLFILES} ${qmlfiles_dir}
69− DEPENDS ${QMLFILES}
70− SOURCES ${QMLFILES}
71− )
72−
73− if(QMLFILES_DESTINATION)
74− # install the qmlfiles file.
75− install(FILES ${QMLFILES}
76− DESTINATION ${QMLFILES_DESTINATION}/${PATH}
77− )
78− endif()
79−endmacro()
80−
81−
82−# Creates a target for generating the typeinfo file for a QML plugin and/or installs the plugin
83−# targets.
84−#
85−# Files will be copied into ${BINARY_DIR}/${path} or ${CMAKE_CURRENT_BINARY_DIR} and installed
86−# into ${DESTINATION}/${path}. If you don't pass BINARY_DIR, it's assumed that current source
87−# path ends with ${path}.
88−#
89−# The generated file will be named after the last segment of the plugin name, e.g. Foo.qmltypes.
90−#
91−# export_qmlplugin(plugin version path
92−# [BINARY_DIR path]
93−# [DESTINATION path]
94−# [TARGET_PREFIX string] # Will be prefixed to the target name
95−# [ENVIRONMENT string] # Will be added to qmlplugindump's env
96−# [TARGETS target1 [target2 ...]] # Targets to depend on and install (e.g. the plugin shared object)
97−# [NO_TYPES] # Do not create the qmltypes target
98−# )
99−#
100−# Created target:
101−# - ${TARGET_PREFIX}${plugin}-qmltypes - Generates the qmltypes file in the source dir.
102−# It will be made a dependency of the "qmltypes" target.
103−
104−macro(export_qmlplugin PLUGIN VERSION PATH)
105− set(options NO_TYPES)
106− set(single BINARY_DIR DESTINATION TARGET_PREFIX ENVIRONMENT)
107− set(multi TARGETS)
108− cmake_parse_arguments(QMLPLUGIN "${options}" "${single}" "${multi}" ${ARGN})
109−
110− if(QMLPLUGIN_BINARY_DIR)
111− set(qmlplugin_dir ${QMLPLUGIN_BINARY_DIR}/${PATH})
112− else()
113− # Find import path to point qmlplugindump at
114− string(REGEX REPLACE "/${PATH}$" "" QMLPLUGIN_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
115− set(qmlplugin_dir ${CMAKE_CURRENT_BINARY_DIR})
116− endif()
117−
118− if(NOT QMLPLUGIN_NO_TYPES)
119− # Relative path for the module
120− string(REPLACE "${CMAKE_BINARY_DIR}/" "" QMLPLUGIN_MODULE_DIR "${QMLPLUGIN_BINARY_DIR}")
121−
122− # Find the last segment of the plugin name to use as qmltypes basename
123− string(REGEX MATCH "[^.]+$" plugin_suffix ${PLUGIN})
124− set(target_prefix ${QMLPLUGIN_TARGET_PREFIX}${PLUGIN})
125− set(qmltypes_path ${CMAKE_CURRENT_SOURCE_DIR}/${plugin_suffix}.qmltypes)
126−
127− add_custom_target(${target_prefix}-qmltypes
128− COMMAND env ${QMLPLUGIN_ENVIRONMENT} $<TARGET_FILE:qmlplugindump> -notrelocatable
129− ${PLUGIN} ${VERSION} ${QMLPLUGIN_MODULE_DIR} > ${qmltypes_path}
130− WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
131− )
132− add_dependencies(${target_prefix}-qmltypes ${target_prefix}-qmlfiles ${QMLPLUGIN_TARGETS})
133− add_dependencies(qmltypes ${target_prefix}-qmltypes)
134− endif()
135−
136− set_target_properties(${QMLPLUGIN_TARGETS} PROPERTIES
137− ARCHIVE_OUTPUT_DIRECTORY ${qmlplugin_dir}
138− LIBRARY_OUTPUT_DIRECTORY ${qmlplugin_dir}
139− RUNTIME_OUTPUT_DIRECTORY ${qmlplugin_dir}
140− )
141−
142− if (QMLPLUGIN_DESTINATION)
143− # Install additional targets
144− install(TARGETS ${QMLPLUGIN_TARGETS}
145− DESTINATION ${QMLPLUGIN_DESTINATION}/${PATH}
146− )
147− endif()
148−endmacro()
cmake/modules/QmlTest.cmake+1−1
@@ -201,7 +201,7 @@ function(add_executable_test COMPONENT_NAME TARGET)
201 add_qmltest_target(xvfbtest${COMPONENT_NAME} ${TARGET}
201 add_qmltest_target(xvfbtest${COMPONENT_NAME} ${TARGET}
202 COMMAND $<TARGET_FILE:xvfb-run> --server-args "-screen 0 1024x768x24" --auto-servernum ${qmltest_command}
202 COMMAND $<TARGET_FILE:xvfb-run> --server-args "-screen 0 1024x768x24" --auto-servernum ${qmltest_command}
203 ${depends}
203 ${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}
205 TARGETS ${xvfb_targets}
205 TARGETS ${xvfb_targets}
206 )
206 )
207 endif()
207 endif()
data/CMakeLists.txt+1−9
@@ -1,13 +1,11 @@
1# generate desktop files
1# generate desktop files
2configure_file(${SHELL_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop @ONLY)
2configure_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)
4configure_file(${INDICATORS_CLIENT_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${INDICATORS_CLIENT_APP}.desktop @ONLY)
3configure_file(${INDICATORS_CLIENT_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${INDICATORS_CLIENT_APP}.desktop @ONLY)
5configure_file(${GREETER_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${GREETER_APP}.desktop @ONLY)
4configure_file(${GREETER_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${GREETER_APP}.desktop @ONLY)
6
5
7# install desktop files
6# install desktop files
8install(FILES
7install(FILES
9 ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop
8 ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop
10− ${CMAKE_CURRENT_BINARY_DIR}/${DASH_APP}.desktop
11 ${CMAKE_CURRENT_BINARY_DIR}/${INDICATORS_CLIENT_APP}.desktop
9 ${CMAKE_CURRENT_BINARY_DIR}/${INDICATORS_CLIENT_APP}.desktop
12 DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
10 DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
13 )
11 )
@@ -22,14 +20,8 @@ install(FILES
22 DESTINATION ${CMAKE_INSTALL_DATADIR}/lightdm/lightdm.conf.d
20 DESTINATION ${CMAKE_INSTALL_DATADIR}/lightdm/lightdm.conf.d
23 )
21 )
24
22
25−# install dash icon
26−install(FILES
27− ${CMAKE_CURRENT_SOURCE_DIR}/${DASH_APP}.png
28− DESTINATION ${SHELL_APP_DIR}/Dash/
29− )
30−
31add_custom_target(pkgversion ALL COMMAND dpkg-parsechangelog -l${CMAKE_SOURCE_DIR}/debian/changelog --show-field version > ${CMAKE_CURRENT_BINARY_DIR}/version)
23add_custom_target(pkgversion ALL COMMAND dpkg-parsechangelog -l${CMAKE_SOURCE_DIR}/debian/changelog --show-field version > ${CMAKE_CURRENT_BINARY_DIR}/version)
32
24
33install(FILES com.canonical.Unity8.gschema.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/glib-2.0/schemas)
25install(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)
35install(FILES ${CMAKE_CURRENT_BINARY_DIR}/version DESTINATION ${CMAKE_INSTALL_LOCALSTATEDIR}/lib/unity8)
27install(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 @@
11 <summary>The usage mode.</summary>
11 <summary>The usage mode.</summary>
12 <description>The usage mode chosen will affect the Window Management behaviour.</description>
12 <description>The usage mode chosen will affect the Window Management behaviour.</description>
13 </key>
13 </key>
14− <key type="y" name="edge-barrier-sensitivity">
14+ <key type="u" name="edge-barrier-sensitivity">
15 <default>50</default>
15 <default>50</default>
16 <range min="1" max="100"/>
16 <range min="1" max="100"/>
17 <summary>Sensitivity of screen edge barriers for the mouse pointer.</summary>
17 <summary>Sensitivity of screen edge barriers for the mouse pointer.</summary>
@@ -43,18 +43,13 @@
43 <summary>Width of the launcher in grid units.</summary>
43 <summary>Width of the launcher in grid units.</summary>
44 <description>Changes the width of the launcher in all usage modes.</description>
44 <description>Changes the width of the launcher in all usage modes.</description>
45 </key>
45 </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>
51 <key type="b" name="enable-indicator-menu">
46 <key type="b" name="enable-indicator-menu">
52 <default>true</default>
47 <default>true</default>
53 <summary>Enable or disable the indicator pull down menus</summary>
48 <summary>Enable or disable the indicator pull down menus</summary>
54 <description>Toggle the availability of the indicator pull down menus</description>
49 <description>Toggle the availability of the indicator pull down menus</description>
55 </key>
50 </key>
56 <key type="s" name="appstore-uri">
51 <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>
58 <summary>The uri to the app store</summary>
53 <summary>The uri to the app store</summary>
59 <description>This will be used whenever the user triggers an action to open the app store.</description>
54 <description>This will be used whenever the user triggers an action to open the app store.</description>
60 </key>
55 </key>
data/unity8-dash.confdeleted−26
@@ -1,26 +0,0 @@
1−description "Unity Shell v8 Dash"
2−author "Michael Zanetti <michael.zanetti@canonical.com>"
3−
4−emits scope-ui-starting
5−
6−start on started unity8
7−stop on stopping unity8
8−
9−kill timeout 120
10−
11−# Focused app is 100 so we want to be less likely to get
12−# killed than the focused app but more than Unity8
13−
14−## FIXME
15−#oom score 50
16−
17−respawn
18−respawn limit unlimited
19−
20−env APP_ID=unity8-dash
21−
22−pre-start script
23− initctl emit scope-ui-starting
24−end script
25−
26−exec ${BINARY:-unity8-dash} $ARGS --desktop_file_hint=unity8-dash.desktop
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.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.conf+6−2
@@ -2,6 +2,7 @@ description "Unity Shell v8"
2author "Ricardo Mendoza <ricmm@ubuntu.com>"
2author "Ricardo Mendoza <ricmm@ubuntu.com>"
3
3
4emits indicator-services-start
4emits indicator-services-start
5+emits indicator-services-end
5
6
6start on ((xsession SESSION=ubuntu-touch) or (xsession SESSION=unity8-mir) or (xsession SESSION=unity8)) and started dbus
7start on ((xsession SESSION=ubuntu-touch) or (xsession SESSION=unity8-mir) or (xsession SESSION=unity8)) and started dbus
7stop on desktop-end
8stop on desktop-end
@@ -78,8 +79,10 @@ pre-start script
78 fi
79 fi
79
80
80 # HACK! WORKAROUND FOR HALIUM MISSING UBUNTU_PLATFORM_API
81 # HACK! WORKAROUND FOR HALIUM MISSING UBUNTU_PLATFORM_API
82+ if [ ! -f /system/lib/libubuntu_application_api.so ]; then
81− initctl set-env --global UBUNTU_PLATFORM_API_BACKEND=test.so.3
83+ initctl set-env --global UBUNTU_PLATFORM_API_BACKEND=test.so.3
82− initctl set-env --global UBUNTU_PLATFORM_API_SENSOR_TEST=/etc/ubuntusensors/test.sensors
84+ initctl set-env --global UBUNTU_PLATFORM_API_SENSOR_TEST=/etc/ubuntusensors/test.sensors
85+ fi
83end script
86end script
84
87
85exec ${BINARY:-unity8} --mode=$MODE $ARGS
88exec ${BINARY:-unity8} --mode=$MODE $ARGS
@@ -92,4 +95,5 @@ post-stop script
92 initctl set-env --global MIR_SOCKET=$UNITY_MIR_SOCKET
95 initctl set-env --global MIR_SOCKET=$UNITY_MIR_SOCKET
93 initctl unset-env --global MIR_SERVER_PROMPT_FILE
96 initctl unset-env --global MIR_SERVER_PROMPT_FILE
94 initctl emit application-end
97 initctl emit application-end
98+ initctl emit indicator-services-end
95end script
99end script
debian/changelog+7−1
@@ -1,4 +1,10 @@
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+
1−unity8 (8.16.1+ubports) xenial; urgency=medium
7+unity8 (8.17+ubports3) xenial; urgency=medium
2
8
3 * Imported to UBports
9 * Imported to UBports
4
10
debian/control+215−198
@@ -2,225 +2,224 @@ Source: unity8
2Section: x11
2Section: x11
3Priority: optional
3Priority: optional
4Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
4Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
5−Build-Depends: cmake,
5+Build-Depends:
6+ android-headers,
7+ cmake,
8+ cmake-extras,
6− dbus-test-runner,
9+ dbus-test-runner,
7− debhelper (>= 9),
10+ debhelper (>= 9),
8− dh-apparmor,
11+ dh-apparmor,
9− doxyqml,
12+ doxyqml,
10−# To allow cross-compiling to work, we also must append :native
11−# to g++ so we don't try to run arm g++
12−# on an x86 CPU for example, when cross-compiling.
13− g++:native,
13+ g++:native,
14− gdb,
14+ gdb,
15− graphviz,
15+ graphviz,
16− gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
16+ gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
17− libandroid-properties-dev,
17+ libandroid-properties-dev,
18− libconnectivity-qt1-dev (>= 0.7.1),
18+ libconnectivity-qt1-dev (>= 0.7.1),
19− libevdev-dev,
19+ libevdev-dev,
20− libgeonames-dev (>= 0.2),
20+ libgeonames-dev (>= 0.2),
21− libgnome-desktop-3-dev,
22− libgl1-mesa-dev[!arm64 !armhf] | libgl-dev[!arm64 !armhf],
21+ libgl1-mesa-dev[!arm64 !armhf] | libgl-dev[!arm64 !armhf],
23− libgl1-mesa-dri,
22+ libgl1-mesa-dri,
24− libgles2-mesa-dev[arm64 armhf],
23+ libgles2-mesa-dev[arm64 armhf],
25− libglib2.0-dev,
24+ libglib2.0-dev,
25+ libgnome-desktop-3-dev,
26− libgsettings-qt-dev,
26+ libgsettings-qt-dev,
27− libhardware-dev,
27+ libhardware-dev,
28− liblightdm-qt5-3-dev,
28+ liblightdm-qt5-3-dev,
29− libpam0g-dev,
29+ libpam0g-dev,
30− libpulse-dev,
30+ libpulse-dev,
31− libqmenumodel-dev (>= 0.2.12),
31+ libqmenumodel-dev (>= 0.2.12),
32+ libqt5sql5-sqlite,
33+ libqt5svg5-dev,
34+ libqt5xmlpatterns5-dev,
32− libqtdbusmock1-dev (>= 0.7),
35+ libqtdbusmock1-dev (>= 0.7),
33− libqtdbustest1-dev,
36+ libqtdbustest1-dev,
34− libqt5svg5-dev,
35− libqt5xmlpatterns5-dev,
36− libsystemsettings-dev,
37+ libsystemsettings-dev,
37− libubuntu-app-launch2-dev,
38+ libubuntu-app-launch2-dev,
38− libubuntu-download-manager-common-dev,
39+ libubuntu-download-manager-common-dev,
39− libubuntugestures5-dev (>= 1.3.2030),
40+ libubuntugestures5-dev (>= 1.3.2030),
40− libubuntugestures5-private-dev (>= 1.3.2030),
41+ libubuntugestures5-private-dev (>= 1.3.2030),
41− libudev-dev,
42+ libudev-dev,
42− libudm-common-dev,
43+ libudm-common-dev,
43− libunity-api-dev (>= 8.6),
44+ libunity-api-dev (>= 8.7),
44− libusermetricsoutput1-dev,
45+ libusermetricsoutput1-dev,
45−# Need those X11 libs touch emulation from mouse events in manual QML tests on a X11 desktop
46− libx11-dev[!arm64 !armhf],
46+ libx11-dev[!arm64 !armhf],
47− libxcb1-dev[!arm64 !armhf],
47+ libxcb1-dev[!arm64 !armhf],
48− libxi-dev[!arm64 !armhf],
48+ libxi-dev[!arm64 !armhf],
49−# End of X11 libs
50− pkg-config,
49+ pkg-config,
51− python3-all:any,
50+ python3-all:any,
52− python3-setuptools,
51+ python3-setuptools,
53− qtdbustest-runner,
54− qml-module-qt-labs-folderlistmodel,
52+ qml-module-qt-labs-folderlistmodel,
55− qml-module-qt-labs-settings,
53+ qml-module-qt-labs-settings,
54+ qml-module-qtmultimedia (>= 5.6),
56− qml-module-qtqml-statemachine,
55+ qml-module-qtqml-statemachine,
57− qml-module-qtmultimedia (>= 5.6),
58− qml-module-qtquick-layouts,
56+ qml-module-qtquick-layouts,
59− qml-module-qtquick-xmllistmodel,
57+ qml-module-qtquick-xmllistmodel,
60− qml-module-qtquick2,
58+ qml-module-qtquick2,
61− qml-module-qtsysteminfo,
59+ qml-module-qtsysteminfo,
62− qml-module-qttest,
60+ qml-module-qttest,
63− qml-module-ubuntu-components (>= 1.3.2030) | qml-module-ubuntu-components-gles (>= 1.3.2030),
61+ qml-module-ubuntu-components (>= 1.3.2030) | qml-module-ubuntu-components-gles (>= 1.3.2030),
64− qml-module-ubuntu-web,
62+ qml-module-ubuntu-layouts,
65− qt5-default,
63+ qml-module-ubuntu-settings-components,
64+ qml-module-ubuntu-test,
66− qtbase5-dev (>= 5.6),
65+ qtbase5-dev (>= 5.6),
67− qtbase5-dev-tools,
66+ qtbase5-dev-tools,
68− qtbase5-private-dev (>= 5.6),
67+ qtbase5-private-dev (>= 5.6),
68+ qtdbustest-runner,
69− qtdeclarative5-dev (>= 5.6),
69+ qtdeclarative5-dev (>= 5.6),
70− qtdeclarative5-dev-tools,
70+ qtdeclarative5-dev-tools,
71− qtdeclarative5-private-dev (>= 5.6),
71+ qtdeclarative5-private-dev (>= 5.6),
72− qtdeclarative5-ubuntu-content1,
72+ qtdeclarative5-ubuntu-content1,
73− qtdeclarative5-ubuntu-settings-components (>= 0.11),
74− ttf-ubuntu-font-family,
73+ ttf-ubuntu-font-family,
74+ ubports-wallpapers,
75− xvfb,
75+ xvfb,
76Standards-Version: 3.9.4
76Standards-Version: 3.9.4
77−Homepage: http://launchpad.net/unity
77+Homepage: https://github.com/ubports/unity8
78−# If you aren't a member of ~unity-team but need to upload
78+Vcs-Git: https://github.com/ubports/unity8
79−# packaging changes, just go ahead. ~unity-team will notice
80−# and sync up the code again.
81−Vcs-Bzr: https://code.launchpad.net/unity8
82−Vcs-Browser: https://bazaar.launchpad.net/~unity-team/unity8/trunk
83XS-Testsuite: autopkgtest
79XS-Testsuite: autopkgtest
84X-Ubuntu-Use-Langpack: yes
80X-Ubuntu-Use-Langpack: yes
85
81
86Package: indicators-client
82Package: indicators-client
87Architecture: any
83Architecture: any
84+Depends:
88−Depends: qmenumodel-qml (>= 0.2.11),
85+ qmenumodel-qml (>= 0.2.11),
89− qml-module-ubuntu-components (>= 1.3.2030) | qml-module-ubuntu-components-gles (>= 1.3.2030),
86+ qml-module-ubuntu-components (>= 1.3.2030) | qml-module-ubuntu-components-gles (>= 1.3.2030),
90− unity8 (= ${binary:Version}),
87+ unity8 (= ${binary:Version}),
91− ${misc:Depends},
88+ ${misc:Depends},
92− ${shlibs:Depends},
89+ ${shlibs:Depends},
93Description: Indicators client test application
90Description: Indicators client test application
94 This package contains the client application for indicators used by autopilot
91 This package contains the client application for indicators used by autopilot
95
92
96Package: unity8-greeter
93Package: unity8-greeter
97Architecture: any
94Architecture: any
95+Depends:
96+ unity-system-compositor,
98−Depends: unity8 (= ${binary:Version}),
97+ unity8 (= ${binary:Version}),
99− unity-system-compositor,
100− ${misc:Depends},
98+ ${misc:Depends},
101− ${shlibs:Depends}
99+ ${shlibs:Depends},
102−Recommends: lightdm
100+Recommends:
101+ lightdm,
102+Provides:
103−Provides: lightdm-greeter
103+ lightdm-greeter,
104Description: The Unity8 Greeter
104Description: The Unity8 Greeter
105 The Unity 8 greeter is the primary login greeter for Ubuntu devices.
105 The Unity 8 greeter is the primary login greeter for Ubuntu devices.
106
106
107−Package: unity-scope-tool
108−Architecture: any
109−Depends: unity8-common (= ${source:Version}),
110− unity8-private (= ${binary:Version}),
111− ${misc:Depends},
112− ${shlibs:Depends},
113−# We do call pkg-config libunity-scopes from the code
114− pkg-config,
115− libunity-scopes-dev,
116−Description: Development tool for Unity scopes
117− This package contains the development tool for new generation Unity scopes, based
118− on Unity8.
119−
120Package: unity8
107Package: unity8
121Architecture: any
108Architecture: any
109+Provides:
122−Provides: indicator-renderer,
110+ indicator-renderer,
111+Depends:
123−Depends: dmz-cursor-theme,
112+ dmz-cursor-theme,
124− gsettings-desktop-schemas,
113+ gsettings-desktop-schemas,
125− libcap2-bin,
114+ libcap2-bin,
126− libglib2.0-bin,
115+ libglib2.0-bin,
127− qmenumodel-qml (>= 0.2.11),
116+ qmenumodel-qml (>= 0.2.11),
128− qml-module-biometryd,
117+ qml-module-biometryd,
129− qml-module-qt-labs-folderlistmodel,
118+ qml-module-qt-labs-folderlistmodel,
130− qml-module-qt-labs-settings,
119+ qml-module-qt-labs-settings,
131− qml-module-qtqml-statemachine,
120+ qml-module-qtqml-statemachine,
132− qml-module-qtquick-xmllistmodel,
121+ qml-module-qtquick-xmllistmodel,
133− qml-module-qtsysteminfo,
122+ qml-module-qtsysteminfo,
134− qml-module-ubuntu-web,
135− qtdeclarative5-qtmir-plugin (>= 0.4.8),
123+ qtdeclarative5-qtmir-plugin (>= 0.4.8),
136− qtdeclarative5-ubuntu-telephony0.1,
124+ qtdeclarative5-ubuntu-telephony0.1,
137− ubuntu-system-settings (>= 0.4),
125+ ubuntu-system-settings (>= 0.4),
138− unity-launcher-impl-12,
126+ unity-launcher-impl-13,
139− unity8-common (= ${source:Version}),
127+ unity8-common (= ${source:Version}),
140− unity8-private (= ${binary:Version}),
128+ unity8-private (= ${binary:Version}),
141− unity8-private | unity-launcher-impl,
129+ unity8-private | unity-launcher-impl,
142− ${misc:Depends},
130+ ${misc:Depends},
143− ${shlibs:Depends},
131+ ${shlibs:Depends},
132+Recommends:
144−Recommends: indicator-keyboard,
133+ indicator-keyboard,
145− indicator-session,
134+ indicator-session,
146− unity-greeter-session-broadcast,
135+ unity-greeter-session-broadcast,
147−Suggests: unity-scope-mediascanner2,
136+Breaks:
148−Breaks: indicator-network (<< 0.5.1+14.10.20141014),
137+ indicator-network (<< 0.5.1+14.10.20141014),
138+ ubuntu-keyboard (<< 0.100),
149− ubuntu-touch-session (<< 0.107),
139+ ubuntu-touch-session (<< 0.107),
140+ unity-scope-tool,
150− unity8-greeter (<< 7.89),
141+ unity8-greeter (<< 7.89),
151− ubuntu-keyboard (<< 0.100),
142+Replaces:
152−Replaces: ubuntu-touch-session (<< 0.82~),
143+ ubuntu-touch-session (<< 0.82~),
144+ unity-scope-tool,
153− unity8-greeter (<< 7.89),
145+ unity8-greeter (<< 7.89),
146+Conflicts:
154−Conflicts: ubuntu-system-settings-wizard,
147+ ubuntu-system-settings-wizard,
155Description: Unity 8 shell
148Description: Unity 8 shell
156 The Unity 8 shell is the primary user interface for Ubuntu devices.
149 The Unity 8 shell is the primary user interface for Ubuntu devices.
157
150
158Package: unity8-common
151Package: unity8-common
159Architecture: all
152Architecture: all
153+Depends:
160−Depends: qml-module-qtquick-layouts,
154+ qml-module-qtquick-layouts,
161− qml-module-ubuntu-components (>= 1.3.2030) | qml-module-ubuntu-components-gles (>= 1.3.2030),
155+ qml-module-ubuntu-components (>= 1.3.2030) | qml-module-ubuntu-components-gles (>= 1.3.2030),
156+ qml-module-ubuntu-settings-components,
162− qml-module-ubuntu-thumbnailer0.1 | ubuntu-thumbnailer-impl,
157+ qml-module-ubuntu-thumbnailer0.1 | ubuntu-thumbnailer-impl,
163− qtdeclarative5-ubuntu-settings-components (>= 0.11),
164− qtdeclarative5-unity-notifications-plugin (>= 0.1.2) | unity-notifications-impl,
158+ qtdeclarative5-unity-notifications-plugin (>= 0.1.2) | unity-notifications-impl,
165− qttranslations5-l10n,
159+ qttranslations5-l10n,
166− ubuntu-thumbnailer-impl-0,
160+ ubuntu-thumbnailer-impl-0,
167− ubuntu-wallpapers,
168− unity-application-impl-27,
161+ unity-application-impl-27,
169− unity-notifications-impl-3,
162+ unity-notifications-impl-3,
170− unity-plugin-scopes | unity-scopes-impl,
163+ unity8-schemas,
171− unity-scopes-impl-12,
172− unity8-tests | unity-application-impl,
164+ unity8-tests | unity-application-impl,
173− ${misc:Depends},
165+ ${misc:Depends},
166+Breaks:
174−Breaks: unity8 (<< 7.86),
167+ unity8 (<< 7.86),
168+Replaces:
175−Replaces: unity8 (<< 7.86),
169+ unity8 (<< 7.86),
176Description: Unity 8 shell (common files)
170Description: Unity 8 shell (common files)
177 The Unity 8 shell is the primary user interface for Ubuntu devices.
171 The Unity 8 shell is the primary user interface for Ubuntu devices.
178 .
172 .
179− This package contains the QML, graphics and locale files shared between
173+ This package contains the QML, graphics and locale files for unity8.
180− unity8 and unity-scope-tool.
181
174
182Package: unity8-autopilot
175Package: unity8-autopilot
183Architecture: all
176Architecture: all
177+Depends:
184−Depends: autopilot-qt5 (>= 1.4),
178+ autopilot-qt5 (>= 1.4),
185− gir1.2-glib-2.0,
179+ gir1.2-glib-2.0,
186− gir1.2-notify-0.7,
180+ gir1.2-notify-0.7,
187− libqt5test5,
181+ libqt5test5,
188− libqt5widgets5,
182+ libqt5widgets5,
189− ofono-phonesim,
183+ ofono-phonesim,
190− python3-autopilot,
184+ python3-autopilot,
191− python3-evdev,
185+ python3-evdev,
192− python3-fixtures,
186+ python3-fixtures,
193− python3-gi,
187+ python3-gi,
194− qttestability-autopilot (>= 1.4),
188+ qttestability-autopilot (>= 1.4),
195− ubuntu-ui-toolkit-autopilot (>= 1.3.2030),
189+ ubuntu-ui-toolkit-autopilot (>= 1.3.2030),
196− unity8 (= ${source:Version}),
190+ unity8 (= ${source:Version}),
197− unity8-tests (= ${source:Version}),
191+ unity8-tests (= ${source:Version}),
198− url-dispatcher-tools,
192+ url-dispatcher-tools,
199− xvfb,
193+ xvfb,
200− ${misc:Depends},
194+ ${misc:Depends},
201− ${python3:Depends},
195+ ${python3:Depends},
202Description: Test package for Unity 8 shell
196Description: Test package for Unity 8 shell
203 Autopilot tests for the unity8 package
197 Autopilot tests for the unity8 package
204
198
205Package: unity8-tests
199Package: unity8-tests
206Architecture: any
200Architecture: any
207Multi-Arch: same
201Multi-Arch: same
202+Pre-Depends:
208−Pre-Depends: ${misc:Pre-Depends},
203+ ${misc:Pre-Depends},
204+Depends:
209−Depends: dbus-test-runner,
205+ dbus-test-runner,
210− parallel,
206+ parallel,
211− qtdbustest-runner,
212− qt5-default,
207+ qt5-default,
208+ qtdbustest-runner,
213− qtdeclarative5-dev-tools,
209+ qtdeclarative5-dev-tools,
214− unity8 (= ${source:Version}),
210+ unity8 (= ${source:Version}),
215− xvfb,
211+ xvfb,
216− ${misc:Depends},
212+ ${misc:Depends},
217− ${shlibs:Depends},
213+ ${shlibs:Depends},
214+Provides:
218−Provides: unity-application-impl,
215+ unity-application-impl,
219− unity-application-impl-27,
216+ unity-application-impl-27,
220− unity8-fake-env,
217+ unity8-fake-env,
218+Replaces:
221−Replaces: unity8-autopilot (<< 8.02+15.04.20150422-0ubuntu1),
219+ unity8-autopilot (<< 8.02+15.04.20150422-0ubuntu1),
222− unity8-fake-env,
220+ unity8-fake-env,
221+Conflicts:
223−Conflicts: unity8-fake-env,
222+ unity8-fake-env,
224Description: Scripts and mocks for running Unity 8 shell tests
223Description: Scripts and mocks for running Unity 8 shell tests
225 Provides fake implementations of some QML modules used by Unity 8 shell
224 Provides fake implementations of some QML modules used by Unity 8 shell
226 (e.g Ubuntu.Application) so that you can run it in a sandboxed environment
225 (e.g Ubuntu.Application) so that you can run it in a sandboxed environment
@@ -229,27 +228,45 @@ Description: Scripts and mocks for running Unity 8 shell tests
229Package: unity8-private
228Package: unity8-private
230Architecture: any
229Architecture: any
231Multi-Arch: same
230Multi-Arch: same
231+Pre-Depends:
232−Pre-Depends: ${misc:Pre-Depends},
232+ ${misc:Pre-Depends},
233+Depends:
233−Depends: accountsservice-ubuntu-schemas (>= 0.0.7),
234+ accountsservice-ubuntu-schemas (>= 0.0.7),
234− gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
235+ gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
235− libhardware2,
236+ libhardware2,
236− unity-schemas (>= 7.3.1+14.10.20140915),
237− qtdeclarative5-gsettings1.0,
238− qml-module-qtmultimedia,
237+ qml-module-qtmultimedia,
238+ qtdeclarative5-gsettings1.0,
239+ unity8-schemas,
239− ${misc:Depends},
240+ ${misc:Depends},
240− ${shlibs:Depends},
241+ ${shlibs:Depends},
242+Provides:
241−Provides: unity-launcher-impl,
243+ unity-launcher-impl,
242− unity-launcher-impl-12,
244+ unity-launcher-impl-13,
243Description: Unity 8 private libs
245Description: Unity 8 private libs
244 The Unity 8 shell is the primary user interface for Ubuntu devices.
246 The Unity 8 shell is the primary user interface for Ubuntu devices.
245 .
247 .
246 This package contains the private libraries for QML and other components
248 This package contains the private libraries for QML and other components
247 only used by the shell.
249 only used by the shell.
248
250
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+
249Package: unity8-doc
265Package: unity8-doc
250Section: doc
266Section: doc
251Architecture: all
267Architecture: all
252Multi-Arch: foreign
268Multi-Arch: foreign
269+Depends:
253−Depends: ${misc:Depends},
270+ ${misc:Depends},
254Description: Documentation for Unity8
271Description: Documentation for Unity8
255 The Unity 8 shell is the primary user interface for Ubuntu devices. (documentation)
272 The Unity 8 shell is the primary user interface for Ubuntu devices. (documentation)
debian/rules+19−5
@@ -7,6 +7,12 @@ include /usr/share/dpkg/default.mk
7#export DH_VERBOSE=1
7#export DH_VERBOSE=1
8export DPKG_GENSYMBOLS_CHECK_LEVEL=4
8export DPKG_GENSYMBOLS_CHECK_LEVEL=4
9export NO_PNG_PKG_MANGLE=1
9export 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
10
16
11%:
17%:
12 dh $@ --parallel --fail-missing --with python3
18 dh $@ --parallel --fail-missing --with python3
@@ -18,7 +24,19 @@ override_dh_auto_configure:
18
24
19override_dh_auto_build:
25override_dh_auto_build:
20 # doc is not a default target
26 # 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
22
40
23override_dh_install:
41override_dh_install:
24 # install autopilot tests
42 # install autopilot tests
@@ -29,10 +47,6 @@ override_dh_install:
29 cd $(CURDIR)
47 cd $(CURDIR)
30 dh_install -X'*.pyc' --fail-missing
48 dh_install -X'*.pyc' --fail-missing
31
49
32−override_dh_installdeb:
33− dh_apparmor --profile-name=usr.bin.unity8-dash -punity8-dash
34− dh_installdeb
35−
36# use private lib directories
50# use private lib directories
37override_dh_makeshlibs:
51override_dh_makeshlibs:
38 dh_makeshlibs -Nunity8-private -Nunity8-tests
52 dh_makeshlibs -Nunity8-private -Nunity8-tests
debian/tests/control+5−3
@@ -1,9 +1,11 @@
1Tests: qmluitests.sh
1Tests: qmluitests.sh
2Restrictions: allow-stderr
2Restrictions: allow-stderr
3−Depends: dpkg-dev,
3+Depends:
4+ dpkg-dev,
4− unity8-tests,
5+ unity8-tests,
5
6
6Tests: autopilot.sh
7Tests: autopilot.sh
7Restrictions: allow-stderr,
8Restrictions: allow-stderr,
8 isolation-machine,
9 isolation-machine,
10+Depends:
9−Depends: unity8-autopilot,
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
2usr/share/locale
1usr/share/locale
3usr/share/unity8/Components
2usr/share/unity8/Components
4−usr/share/unity8/Dash
5usr/share/unity8/Notifications
3usr/share/unity8/Notifications
6usr/share/unity8/graphics
4usr/share/unity8/graphics
7var/lib/polkit-1/localauthority/10-vendor.d
5var/lib/polkit-1/localauthority/10-vendor.d
debian/unity8-greeter.install+1−1
@@ -1,5 +1,5 @@
1−data/unity8-greeter-wrapper usr/bin/
2data/unity8-greeter-init.conf usr/share/upstart/sessions/
1data/unity8-greeter-init.conf usr/share/upstart/sessions/
2+data/unity8-greeter-wrapper usr/bin/
3data/unity8-greeter.pkla /var/lib/polkit-1/localauthority/10-vendor.d/
3data/unity8-greeter.pkla /var/lib/polkit-1/localauthority/10-vendor.d/
4usr/share/lightdm/greeters/unity8-greeter.desktop
4usr/share/lightdm/greeters/unity8-greeter.desktop
5usr/share/lightdm/lightdm.conf.d/51-unity8-greeter.conf
5usr/share/lightdm/lightdm.conf.d/51-unity8-greeter.conf
debian/unity8-private.install+1−3
@@ -1,18 +1,16 @@
1usr/lib/*/libunity8-private.*
1usr/lib/*/libunity8-private.*
2usr/lib/*/unity8/qml/AccountsService
2usr/lib/*/unity8/qml/AccountsService
3usr/lib/*/unity8/qml/Cursor
3usr/lib/*/unity8/qml/Cursor
4−usr/lib/*/unity8/qml/Dash
5usr/lib/*/unity8/qml/GlobalShortcut
4usr/lib/*/unity8/qml/GlobalShortcut
6usr/lib/*/unity8/qml/Greeter
5usr/lib/*/unity8/qml/Greeter
7−usr/lib/*/unity8/qml/ImageCache
8usr/lib/*/unity8/qml/LightDM
6usr/lib/*/unity8/qml/LightDM
9usr/lib/*/unity8/qml/Lights
7usr/lib/*/unity8/qml/Lights
10usr/lib/*/unity8/qml/Powerd
8usr/lib/*/unity8/qml/Powerd
11usr/lib/*/unity8/qml/ScreenshotDirectory
9usr/lib/*/unity8/qml/ScreenshotDirectory
12usr/lib/*/unity8/qml/SessionBroadcast
10usr/lib/*/unity8/qml/SessionBroadcast
11+usr/lib/*/unity8/qml/UInput
13usr/lib/*/unity8/qml/Ubuntu
12usr/lib/*/unity8/qml/Ubuntu
14usr/lib/*/unity8/qml/Unity
13usr/lib/*/unity8/qml/Unity
15−usr/lib/*/unity8/qml/UInput
16usr/lib/*/unity8/qml/Utils
14usr/lib/*/unity8/qml/Utils
17usr/lib/*/unity8/qml/WindowManager
15usr/lib/*/unity8/qml/WindowManager
18usr/lib/*/unity8/qml/Wizard
16usr/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−1
@@ -2,7 +2,7 @@ data/unity-mock-indicator-service.conf usr/share/upstart/sessions/
2usr/bin/unity-mock-indicator-service
2usr/bin/unity-mock-indicator-service
3usr/lib/*/unity8/qml/mocks
3usr/lib/*/unity8/qml/mocks
4usr/lib/*/unity8/qml/nonmirplugins
4usr/lib/*/unity8/qml/nonmirplugins
5−usr/lib/*/unity8/qml/scopefakes
5+usr/lib/*/unity8/qml/utils
6usr/lib/*/unity8/tests
6usr/lib/*/unity8/tests
7usr/lib/*/unity8/uqmlscene
7usr/lib/*/unity8/uqmlscene
8usr/share/unity8/mocks
8usr/share/unity8/mocks
debian/unity8.install+6−10
@@ -1,23 +1,19 @@
1−debian/usr.bin.unity8-dash etc/apparmor.d
2−var/lib/unity8/version
3−data/unity8-filewatcher.conf usr/share/upstart/sessions/
4−data/unity8.conf usr/share/upstart/sessions/
5data/devices.conf etc/ubuntu/
1data/devices.conf etc/ubuntu/
6data/test.sensors etc/ubuntusensors/
2data/test.sensors etc/ubuntusensors/
3+data/unity8-filewatcher.conf usr/share/upstart/sessions/
4+data/unity8.conf usr/share/upstart/sessions/
7usr/bin/unity8
5usr/bin/unity8
8−usr/bin/unity8-dash
9−usr/share/applications/unity8-dash.desktop
10usr/share/applications/unity8.desktop
6usr/share/applications/unity8.desktop
11usr/share/unity8/ApplicationMenus
7usr/share/unity8/ApplicationMenus
8+usr/share/unity8/DeviceConfiguration.qml
9+usr/share/unity8/DisabledScreenNotice.qml
12usr/share/unity8/Greeter
10usr/share/unity8/Greeter
13usr/share/unity8/Launcher
11usr/share/unity8/Launcher
12+usr/share/unity8/OrientedShell.qml
14usr/share/unity8/Panel
13usr/share/unity8/Panel
15usr/share/unity8/Rotation
14usr/share/unity8/Rotation
16−usr/share/unity8/DeviceConfiguration.qml
17−usr/share/unity8/OrientedShell.qml
18−usr/share/unity8/DisabledScreenNotice.qml
19usr/share/unity8/Shell.qml
15usr/share/unity8/Shell.qml
20usr/share/unity8/Stage
16usr/share/unity8/Stage
21usr/share/unity8/Tutorial
17usr/share/unity8/Tutorial
22usr/share/unity8/Wizard
18usr/share/unity8/Wizard
23−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 @@
25#include <glib.h>
25#include <glib.h>
26
26
27#define IFACE_ACCOUNTS_USER QStringLiteral("org.freedesktop.Accounts.User")
27#define IFACE_ACCOUNTS_USER QStringLiteral("org.freedesktop.Accounts.User")
28−#define IFACE_LOCATION_HERE QStringLiteral("com.ubuntu.location.providers.here.AccountsService")
29#define IFACE_UBUNTU_INPUT QStringLiteral("com.ubuntu.AccountsService.Input")
28#define IFACE_UBUNTU_INPUT QStringLiteral("com.ubuntu.AccountsService.Input")
30#define IFACE_UBUNTU_SECURITY QStringLiteral("com.ubuntu.AccountsService.SecurityPrivacy")
29#define IFACE_UBUNTU_SECURITY QStringLiteral("com.ubuntu.AccountsService.SecurityPrivacy")
31#define IFACE_UBUNTU_SECURITY_OLD QStringLiteral("com.ubuntu.touch.AccountsService.SecurityPrivacy")
30#define IFACE_UBUNTU_SECURITY_OLD QStringLiteral("com.ubuntu.touch.AccountsService.SecurityPrivacy")
@@ -33,7 +32,7 @@
33#define IFACE_UNITY_PRIVATE QStringLiteral("com.canonical.unity.AccountsService.Private")
32#define IFACE_UNITY_PRIVATE QStringLiteral("com.canonical.unity.AccountsService.Private")
34
33
35#define PROP_BACKGROUND_FILE QStringLiteral("BackgroundFile")
34#define PROP_BACKGROUND_FILE QStringLiteral("BackgroundFile")
36−#define PROP_DEMO_EDGES QStringLiteral("demo-edges")
35+#define PROP_DEMO_EDGES QStringLiteral("DemoEdges2")
37#define PROP_DEMO_EDGES_COMPLETED QStringLiteral("DemoEdgesCompleted")
36#define PROP_DEMO_EDGES_COMPLETED QStringLiteral("DemoEdgesCompleted")
38#define PROP_EMAIL QStringLiteral("Email")
37#define PROP_EMAIL QStringLiteral("Email")
39#define PROP_ENABLE_FINGERPRINT_IDENTIFICATION QStringLiteral("EnableFingerprintIdentification")
38#define PROP_ENABLE_FINGERPRINT_IDENTIFICATION QStringLiteral("EnableFingerprintIdentification")
@@ -93,8 +92,6 @@ AccountsService::AccountsService(QObject* parent, const QString &user)
93 registerProperty(IFACE_ACCOUNTS_USER, PROP_EMAIL, QStringLiteral("emailChanged"));
92 registerProperty(IFACE_ACCOUNTS_USER, PROP_EMAIL, QStringLiteral("emailChanged"));
94 registerProperty(IFACE_ACCOUNTS_USER, PROP_REAL_NAME, QStringLiteral("realNameChanged"));
93 registerProperty(IFACE_ACCOUNTS_USER, PROP_REAL_NAME, QStringLiteral("realNameChanged"));
95 registerProperty(IFACE_ACCOUNTS_USER, PROP_INPUT_SOURCES, QStringLiteral("keymapsChanged"));
94 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"));
98 registerProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_FINGERPRINT_IDENTIFICATION, QStringLiteral("enableFingerprintIdentificationChanged"));
95 registerProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_FINGERPRINT_IDENTIFICATION, QStringLiteral("enableFingerprintIdentificationChanged"));
99 registerProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_LAUNCHER_WHILE_LOCKED, QStringLiteral("enableLauncherWhileLockedChanged"));
96 registerProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_LAUNCHER_WHILE_LOCKED, QStringLiteral("enableLauncherWhileLockedChanged"));
100 registerProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_INDICATORS_WHILE_LOCKED, QStringLiteral("enableIndicatorsWhileLockedChanged"));
97 registerProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_INDICATORS_WHILE_LOCKED, QStringLiteral("enableIndicatorsWhileLockedChanged"));
@@ -216,32 +213,6 @@ AccountsService::PasswordDisplayHint AccountsService::passwordDisplayHint() cons
216 return (PasswordDisplayHint)value.toInt();
213 return (PasswordDisplayHint)value.toInt();
217}
214}
218
215
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−
245QString AccountsService::realName() const
216QString AccountsService::realName() const
246{
217{
247 auto value = getProperty(IFACE_ACCOUNTS_USER, PROP_REAL_NAME);
218 auto value = getProperty(IFACE_ACCOUNTS_USER, PROP_REAL_NAME);
plugins/AccountsService/AccountsService.h−16
@@ -66,16 +66,6 @@ class AccountsService: public QObject
66 READ failedFingerprintLogins
66 READ failedFingerprintLogins
67 WRITE setFailedFingerprintLogins
67 WRITE setFailedFingerprintLogins
68 NOTIFY failedFingerprintLoginsChanged)
68 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)
79 Q_PROPERTY(QString realName READ realName WRITE setRealName NOTIFY realNameChanged)
69 Q_PROPERTY(QString realName READ realName WRITE setRealName NOTIFY realNameChanged)
80 Q_PROPERTY(QString email READ email WRITE setEmail NOTIFY emailChanged)
70 Q_PROPERTY(QString email READ email WRITE setEmail NOTIFY emailChanged)
81 Q_PROPERTY(QStringList keymaps READ keymaps WRITE setKeymaps NOTIFY keymapsChanged)
71 Q_PROPERTY(QStringList keymaps READ keymaps WRITE setKeymaps NOTIFY keymapsChanged)
@@ -106,10 +96,6 @@ public:
106 void setFailedLogins(uint failedLogins);
96 void setFailedLogins(uint failedLogins);
107 uint failedFingerprintLogins() const;
97 uint failedFingerprintLogins() const;
108 void setFailedFingerprintLogins(uint failedFingerprintLogins);
98 void setFailedFingerprintLogins(uint failedFingerprintLogins);
109− bool hereEnabled() const;
110− void setHereEnabled(bool enabled);
111− QString hereLicensePath() const;
112− bool hereLicensePathValid() const;
113 QString realName() const;
99 QString realName() const;
114 void setRealName(const QString &realName);
100 void setRealName(const QString &realName);
115 QString email() const;
101 QString email() const;
@@ -129,8 +115,6 @@ Q_SIGNALS:
129 void passwordDisplayHintChanged();
115 void passwordDisplayHintChanged();
130 void failedLoginsChanged();
116 void failedLoginsChanged();
131 void failedFingerprintLoginsChanged();
117 void failedFingerprintLoginsChanged();
132− void hereEnabledChanged();
133− void hereLicensePathChanged();
134 void realNameChanged();
118 void realNameChanged();
135 void emailChanged();
119 void emailChanged();
136 void keymapsChanged();
120 void keymapsChanged();
plugins/AccountsService/CMakeLists.txt+1−2
@@ -7,9 +7,8 @@ add_library(AccountsService-qml MODULE
7 plugin.cpp
7 plugin.cpp
8 )
8 )
9
9
10−qt5_use_modules(AccountsService-qml DBus Qml)
11−
12target_link_libraries(AccountsService-qml
10target_link_libraries(AccountsService-qml
11+ Qt5::DBus Qt5::Qml
13 ${GLIB_LIBRARIES}
12 ${GLIB_LIBRARIES}
14 )
13 )
15
14
plugins/AccountsService/com.canonical.unity.AccountsService.xml+6
@@ -9,11 +9,17 @@
9 <annotation name="org.freedesktop.Accounts.Authentication.ChangeAny"
9 <annotation name="org.freedesktop.Accounts.Authentication.ChangeAny"
10 value="com.ubuntu.AccountsService.GreeterChangeAny"/>
10 value="com.ubuntu.AccountsService.GreeterChangeAny"/>
11
11
12+ <!-- Marks that V1 (pre-8.21) edge demos have been run. Legacy value. -->
12 <!-- Should have been named DemoEdges, sorry folks. -mterry -->
13 <!-- Should have been named DemoEdges, sorry folks. -mterry -->
13 <property name="demo-edges" type="b" access="readwrite">
14 <property name="demo-edges" type="b" access="readwrite">
14 <annotation name="org.freedesktop.Accounts.DefaultValue" value="true"/>
15 <annotation name="org.freedesktop.Accounts.DefaultValue" value="true"/>
15 </property>
16 </property>
16
17
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+
17 <!-- List of tutorial pages that have been completed by the user -->
23 <!-- List of tutorial pages that have been completed by the user -->
18 <property name="DemoEdgesCompleted" type="as" access="readwrite">
24 <property name="DemoEdgesCompleted" type="as" access="readwrite">
19 <annotation name="org.freedesktop.Accounts.DefaultValue" value="[]"/>
25 <annotation name="org.freedesktop.Accounts.DefaultValue" value="[]"/>
plugins/CMakeLists.txt+1−3
@@ -1,4 +1,4 @@
1−include(QmlPlugins)
1+find_package(QmlPlugins)
2
2
3# Set up and install a plugin for unity8.
3# Set up and install a plugin for unity8.
4#
4#
@@ -15,10 +15,8 @@ add_subdirectory(AccountsService)
15add_subdirectory(Cursor)
15add_subdirectory(Cursor)
16add_subdirectory(GlobalShortcut)
16add_subdirectory(GlobalShortcut)
17add_subdirectory(Greeter)
17add_subdirectory(Greeter)
18−add_subdirectory(ImageCache)
19add_subdirectory(LightDM)
18add_subdirectory(LightDM)
20add_subdirectory(Lights)
19add_subdirectory(Lights)
21−add_subdirectory(Dash)
22add_subdirectory(Powerd)
20add_subdirectory(Powerd)
23add_subdirectory(ScreenshotDirectory)
21add_subdirectory(ScreenshotDirectory)
24add_subdirectory(SessionBroadcast)
22add_subdirectory(SessionBroadcast)
plugins/Cursor/CMakeLists.txt+1−2
@@ -26,8 +26,7 @@ add_library(Cursor-qml SHARED
26target_link_libraries(Cursor-qml
26target_link_libraries(Cursor-qml
27 xcursorloader-static
27 xcursorloader-static
28 ${QT5PLATFORM_SUPPORT_LDFLAGS}
28 ${QT5PLATFORM_SUPPORT_LDFLAGS}
29+ Qt5::Qml Qt5::Quick Qt5::Svg
29)
30)
30
31
31−qt5_use_modules(Cursor-qml Qml Quick Svg)
32−
33add_unity8_plugin(Cursor 1.1 Cursor TARGETS Cursor-qml)
32add_unity8_plugin(Cursor 1.1 Cursor TARGETS Cursor-qml)
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−47
@@ -1,47 +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− )
41−
42−qt5_use_modules(Dash-qml Qml Quick Concurrent)
43−
44−add_unity8_plugin(Dash 0.1 Dash TARGETS Dash-qml)
45−
46−install(FILES graphics/music_progress_bg.png DESTINATION ${SHELL_INSTALL_QML}/Dash/graphics/)
47−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);
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);
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/CMakeLists.txt+1−1
@@ -5,6 +5,6 @@ set(globalshortcutplugin_SRCS
5
5
6add_library(GlobalShortcut-qml SHARED ${globalshortcutplugin_SRCS})
6add_library(GlobalShortcut-qml SHARED ${globalshortcutplugin_SRCS})
7
7
8−qt5_use_modules(GlobalShortcut-qml Quick Gui)
8+target_link_libraries(GlobalShortcut-qml Qt5::Quick Qt5::Gui)
9
9
10add_unity8_plugin(GlobalShortcut 1.0 GlobalShortcut TARGETS GlobalShortcut-qml)
10add_unity8_plugin(GlobalShortcut 1.0 GlobalShortcut TARGETS GlobalShortcut-qml)
plugins/GlobalShortcut/globalshortcut.cpp+3
@@ -58,6 +58,9 @@ void GlobalShortcut::setActive(bool active)
58
58
59void GlobalShortcut::componentComplete()
59void GlobalShortcut::componentComplete()
60{
60{
61+ if (this->window()) {
62+ QMetaObject::invokeMethod(this, "setupFilterOnWindow", Q_ARG(QQuickWindow*, this->window()));
63+ }
61 connect(this, &QQuickItem::windowChanged, this, &GlobalShortcut::setupFilterOnWindow);
64 connect(this, &QQuickItem::windowChanged, this, &GlobalShortcut::setupFilterOnWindow);
62}
65}
63
66
plugins/Greeter/Unity/Launcher/CMakeLists.txt+1−2
@@ -29,8 +29,7 @@ add_library(UnityLauncherAS-qml MODULE
29target_link_libraries(UnityLauncherAS-qml
29target_link_libraries(UnityLauncherAS-qml
30 unity8-private
30 unity8-private
31 ${GSETTINGS_QT_LDFLAGS}
31 ${GSETTINGS_QT_LDFLAGS}
32+ Qt5::DBus Qt5::Qml Qt5::Gui
32 )
33 )
33
34
34−qt5_use_modules(UnityLauncherAS-qml DBus Qml Gui)
35−
36add_unity8_greeter_plugin(Unity.Launcher 0.1 Unity/Launcher TARGETS UnityLauncherAS-qml)
35add_unity8_greeter_plugin(Unity.Launcher 0.1 Unity/Launcher TARGETS UnityLauncherAS-qml)
plugins/Greeter/Unity/Launcher/launcheritem.cpp+6
@@ -89,6 +89,12 @@ void LauncherItem::setKeywords(const QStringList &keywords)
89 }
89 }
90}
90}
91
91
92+uint LauncherItem::popularity() const
93+{
94+ // Not exposing usage order in greeter session at this point.
95+ return 0;
96+}
97+
92bool LauncherItem::pinned() const
98bool LauncherItem::pinned() const
93{
99{
94 return m_pinned;
100 return m_pinned;
plugins/Greeter/Unity/Launcher/launcheritem.h+1
@@ -35,6 +35,7 @@ public:
35 QString name() const override;
35 QString name() const override;
36 QString icon() const override;
36 QString icon() const override;
37 QStringList keywords() const override;
37 QStringList keywords() const override;
38+ uint popularity() const override;
38 bool pinned() const override;
39 bool pinned() const override;
39 bool running() const override;
40 bool running() const override;
40 bool recent() const override;
41 bool recent() const override;
plugins/ImageCache/CMakeLists.txtdeleted−8
@@ -1,8 +0,0 @@
1−add_library(ImageCache-qml MODULE
2− ImageCache.cpp
3− plugin.cpp
4− )
5−
6−qt5_use_modules(ImageCache-qml Gui Qml 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)
25 m_greeter(greeter)
25 m_greeter(greeter)
26{
26{
27 connect(m_greeter, &Greeter::authenticationUserChanged, this, &DBusGreeterList::authenticationUserChangedHandler);
27 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);
29}
29}
30
30
31QString DBusGreeterList::GetActiveEntry() const
31QString DBusGreeterList::GetActiveEntry() const
@@ -40,7 +40,7 @@ void DBusGreeterList::SetActiveEntry(const QString &entry)
40
40
41bool DBusGreeterList::entryIsLocked() const
41bool DBusGreeterList::entryIsLocked() const
42{
42{
43− return !m_greeter->isAuthenticated();
43+ return !m_greeter->promptless();
44}
44}
45
45
46void DBusGreeterList::authenticationUserChangedHandler()
46void DBusGreeterList::authenticationUserChangedHandler()
@@ -49,7 +49,7 @@ void DBusGreeterList::authenticationUserChangedHandler()
49 Q_EMIT EntrySelected(m_greeter->authenticationUser());
49 Q_EMIT EntrySelected(m_greeter->authenticationUser());
50}
50}
51
51
52−void DBusGreeterList::authenticatedChangedHandler()
52+void DBusGreeterList::promptlessChangedHandler()
53{
53{
54 notifyPropertyChanged(QStringLiteral("EntryIsLocked"), entryIsLocked());
54 notifyPropertyChanged(QStringLiteral("EntryIsLocked"), entryIsLocked());
55 Q_EMIT entryIsLockedChanged();
55 Q_EMIT entryIsLockedChanged();
plugins/LightDM/DBusGreeterList.h+1−1
@@ -48,7 +48,7 @@ Q_SIGNALS:
48
48
49private Q_SLOTS:
49private Q_SLOTS:
50 void authenticationUserChangedHandler();
50 void authenticationUserChangedHandler();
51− void authenticatedChangedHandler();
51+ void promptlessChangedHandler();
52
52
53private:
53private:
54 Greeter *m_greeter;
54 Greeter *m_greeter;
plugins/LightDM/FullLightDM/CMakeLists.txt+1−1
@@ -26,7 +26,7 @@ target_link_libraries(FullLightDM-qml
26 unity8-private
26 unity8-private
27 ${LIBLIGHTDM_LDFLAGS}
27 ${LIBLIGHTDM_LDFLAGS}
28 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
28 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
29+ Qt5::DBus Qt5::Gui Qt5::Qml
29 )
30 )
30
31
31−qt5_use_modules(FullLightDM-qml DBus Gui Qml)
32add_unity8_plugin(FullLightDM 0.1 LightDM/FullLightDM TARGETS FullLightDM-qml)
32add_unity8_plugin(FullLightDM 0.1 LightDM/FullLightDM TARGETS FullLightDM-qml)
plugins/LightDM/Greeter.cpp+16
@@ -27,6 +27,7 @@ GreeterPrivate::GreeterPrivate(Greeter* parent)
27 m_active(false),
27 m_active(false),
28 responded(false),
28 responded(false),
29 everResponded(false),
29 everResponded(false),
30+ promptless(false),
30 q_ptr(parent)
31 q_ptr(parent)
31{
32{
32}
33}
@@ -112,6 +113,12 @@ QString Greeter::defaultSessionHint() const
112 return d->m_greeter->defaultSessionHint();
113 return d->m_greeter->defaultSessionHint();
113}
114}
114
115
116+bool Greeter::promptless() const
117+{
118+ Q_D(const Greeter);
119+ return d->promptless;
120+}
121+
115QString Greeter::selectUser() const
122QString Greeter::selectUser() const
116{
123{
117 Q_D(const Greeter);
124 Q_D(const Greeter);
@@ -146,6 +153,10 @@ void Greeter::authenticate(const QString &username)
146 d->prompts.clear();
153 d->prompts.clear();
147 d->responded = false;
154 d->responded = false;
148 d->everResponded = false;
155 d->everResponded = false;
156+ if (d->promptless) {
157+ d->promptless = false;
158+ Q_EMIT promptlessChanged();
159+ }
149
160
150 if (authenticationUser() == username) {
161 if (authenticationUser() == username) {
151 d->prompts = d->leftovers;
162 d->prompts = d->leftovers;
@@ -235,6 +246,11 @@ void Greeter::authenticationCompleteFilter()
235 bool automatic = !d->everResponded;
246 bool automatic = !d->everResponded;
236 bool pamHasLeftoverMessages = !d->prompts.hasPrompt() && d->prompts.rowCount() > 0;
247 bool pamHasLeftoverMessages = !d->prompts.hasPrompt() && d->prompts.rowCount() > 0;
237
248
249+ if (isAuthenticated() && automatic) {
250+ d->promptless = true;
251+ Q_EMIT promptlessChanged();
252+ }
253+
238 if (!isAuthenticated()) {
254 if (!isAuthenticated()) {
239 if (pamHasLeftoverMessages) {
255 if (pamHasLeftoverMessages) {
240 d->leftovers = d->prompts; // Prefer PAM's messages
256 d->leftovers = d->prompts; // Prefer PAM's messages
plugins/LightDM/Greeter.h+3
@@ -37,6 +37,7 @@ class Greeter : public QObject
37 Q_PROPERTY(bool authenticated READ isAuthenticated NOTIFY isAuthenticatedChanged)
37 Q_PROPERTY(bool authenticated READ isAuthenticated NOTIFY isAuthenticatedChanged)
38 Q_PROPERTY(QString authenticationUser READ authenticationUser NOTIFY authenticationUserChanged)
38 Q_PROPERTY(QString authenticationUser READ authenticationUser NOTIFY authenticationUserChanged)
39 Q_PROPERTY(QString defaultSession READ defaultSessionHint CONSTANT)
39 Q_PROPERTY(QString defaultSession READ defaultSessionHint CONSTANT)
40+ Q_PROPERTY(bool promptless READ promptless NOTIFY promptlessChanged)
40 Q_PROPERTY(QString selectUser READ selectUser CONSTANT)
41 Q_PROPERTY(QString selectUser READ selectUser CONSTANT)
41
42
42public:
43public:
@@ -47,6 +48,7 @@ public:
47 bool isAuthenticated() const;
48 bool isAuthenticated() const;
48 QString authenticationUser() const;
49 QString authenticationUser() const;
49 QString defaultSessionHint() const;
50 QString defaultSessionHint() const;
51+ bool promptless() const;
50 QString selectUser() const;
52 QString selectUser() const;
51 bool hasGuestAccount() const;
53 bool hasGuestAccount() const;
52 bool showManualLoginHint() const;
54 bool showManualLoginHint() const;
@@ -64,6 +66,7 @@ Q_SIGNALS:
64 void authenticationUserChanged();
66 void authenticationUserChanged();
65 void isActiveChanged();
67 void isActiveChanged();
66 void isAuthenticatedChanged();
68 void isAuthenticatedChanged();
69+ void promptlessChanged();
67 void showGreeter();
70 void showGreeter();
68 void hideGreeter();
71 void hideGreeter();
69 void loginError(bool automatic);
72 void loginError(bool automatic);
plugins/LightDM/GreeterPrivate.h+1
@@ -34,6 +34,7 @@ public:
34 PromptsModel leftovers; // prompts to show during next auth for same user
34 PromptsModel leftovers; // prompts to show during next auth for same user
35 bool responded;
35 bool responded;
36 bool everResponded;
36 bool everResponded;
37+ bool promptless;
37 QString cachedAuthUser;
38 QString cachedAuthUser;
38
39
39protected:
40protected:
plugins/LightDM/IntegratedLightDM/CMakeLists.txt+1−1
@@ -25,9 +25,9 @@ target_link_libraries(IntegratedLightDM-qml
25 integratedLightDM
25 integratedLightDM
26 unity8-private
26 unity8-private
27 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
27 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
28+ Qt5::DBus Qt5::Gui Qt5::Qml
28 )
29 )
29
30
30−qt5_use_modules(IntegratedLightDM-qml DBus Gui Qml)
31add_unity8_plugin(IntegratedLightDM 0.1 LightDM/IntegratedLightDM TARGETS IntegratedLightDM-qml)
31add_unity8_plugin(IntegratedLightDM 0.1 LightDM/IntegratedLightDM TARGETS IntegratedLightDM-qml)
32
32
33add_subdirectory(liblightdm)
33add_subdirectory(liblightdm)
plugins/LightDM/IntegratedLightDM/liblightdm/CMakeLists.txt+3−4
@@ -26,22 +26,21 @@ target_link_libraries(integratedLightDM
26 ${GLIB_LIBRARIES}
26 ${GLIB_LIBRARIES}
27 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
27 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
28 -lpam
28 -lpam
29+ Qt5::Concurrent Qt5::DBus Qt5::Gui
29)
30)
30target_link_libraries(integratedLightDMSession
31target_link_libraries(integratedLightDMSession
31 ${GLIB_LIBRARIES}
32 ${GLIB_LIBRARIES}
32 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
33 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
33 -lpam
34 -lpam
35+ Qt5::Concurrent Qt5::DBus Qt5::Gui
34)
36)
35target_link_libraries(MockLightDM-demo-shared
37target_link_libraries(MockLightDM-demo-shared
36 ${GLIB_LIBRARIES}
38 ${GLIB_LIBRARIES}
37 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
39 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
38 -lpam
40 -lpam
41+ Qt5::Concurrent Qt5::DBus Qt5::Gui
39)
42)
40
43
41−qt5_use_modules(integratedLightDM Concurrent DBus Gui)
42−qt5_use_modules(integratedLightDMSession Concurrent DBus Gui)
43−qt5_use_modules(MockLightDM-demo-shared Concurrent DBus Gui)
44−
45set_target_properties(integratedLightDM PROPERTIES
44set_target_properties(integratedLightDM PROPERTIES
46 COMPILE_FLAGS "-DSM_BUSNAME=systemBus -fPIC")
45 COMPILE_FLAGS "-DSM_BUSNAME=systemBus -fPIC")
47set_target_properties(integratedLightDMSession PROPERTIES
46set_target_properties(integratedLightDMSession PROPERTIES
plugins/Lights/CMakeLists.txt+8−2
@@ -1,5 +1,6 @@
1pkg_check_modules(ANDROID_HEADERS REQUIRED android-headers)
1pkg_check_modules(ANDROID_HEADERS REQUIRED android-headers)
2pkg_check_modules(ANDROID_HARDWARE REQUIRED libhardware)
2pkg_check_modules(ANDROID_HARDWARE REQUIRED libhardware)
3+pkg_check_modules(ANDROID_PROPERTIES REQUIRED libandroid-properties)
3
4
4include_directories(
5include_directories(
5 SYSTEM
6 SYSTEM
@@ -9,9 +10,14 @@ include_directories(
9add_library(Lights-qml MODULE
10add_library(Lights-qml MODULE
10 plugin.cpp
11 plugin.cpp
11 Lights.cpp
12 Lights.cpp
13+ LegacyLights.cpp
14+ HfdLights.cpp
12 )
15 )
13
16
14−qt5_use_modules(Lights-qml Qml Gui)
17+target_link_libraries(Lights-qml
18+ Qt5::Qml Qt5::Gui Qt5::DBus
15−target_link_libraries(Lights-qml ${ANDROID_HARDWARE_LIBRARIES})
19+ ${ANDROID_HARDWARE_LIBRARIES}
20+ ${ANDROID_PROPERTIES_LIBRARIES}
21+ )
16
22
17add_unity8_plugin(Lights 0.1 Lights TARGETS Lights-qml)
23add_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 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2021 UBports Foundation.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -13,22 +13,30 @@
13 * You should have received a copy of the GNU General Public License
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
15 *
16− * Author: Nick Dedekind <nick.dedekind@canonical.com>
16+ * Author: Florian Leeber <florian@ubports.com>
17 */
17 */
18
18
19−#ifndef FAKE_UNITY_PLUGIN_H
19+#ifndef UNITY_HFDLIGHTS_H
20−#define FAKE_UNITY_PLUGIN_H
20+#define UNITY_HFDLIGHTS_H
21
21
22−// Qt
22+#include <QtCore/QObject>
23−#include <QtQml/QQmlExtensionPlugin>
23+#include <QDBusInterface>
24+#include "Lights.h"
24
25
25−class FakeUnityPlugin : public QQmlExtensionPlugin
26+class HfdLights: public Lights
26{
27{
27 Q_OBJECT
28 Q_OBJECT
28− Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29
29
30public:
30public:
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;
32};
40};
33
41
34#endif
42#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 @@
1/*
1/*
2 * Copyright (C) 2014 Canonical, Ltd.
2 * Copyright (C) 2014 Canonical, Ltd.
3+ * Copyright (C) 2021 UBports Foundation.
3 *
4 *
4 * This program is free software; you can redistribute it and/or modify
5 * 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 * it under the terms of the GNU General Public License as published by
@@ -13,22 +14,32 @@
13 * You should have received a copy of the GNU General Public License
14 * 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 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 *
16− * Authors: Michael Zanetti <michael.zanetti@canonical.com>
17+ * Author: Renato Araujo Oliveira Filho <renato.filho@canonical.com>
17 */
18 */
18
19
19−#ifndef DASHCOMMUNICATOR_PLUGIN_H
20+#ifndef UNITY_LEGACYLIGHTS_H
20−#define DASHCOMMUNICATOR_PLUGIN_H
21+#define UNITY_LEGACYLIGHTS_H
21
22
22−#include <QtQml/QQmlEngine>
23+#include <QtCore/QObject>
23−#include <QtQml/QQmlExtensionPlugin>
24+#include "Lights.h"
24
25
25−class DashCommunicatorPlugin : public QQmlExtensionPlugin
26+struct light_device_t;
27+
28+class LegacyLights: public Lights
26{
29{
27 Q_OBJECT
30 Q_OBJECT
28− Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29
31
30public:
32public:
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+
32};
43};
33
44
34#endif
45#endif
plugins/Lights/Lights.cpp−65
@@ -26,20 +26,12 @@ extern "C" {
26
26
27Lights::Lights(QObject* parent)
27Lights::Lights(QObject* parent)
28 : QObject(parent),
28 : QObject(parent),
29− m_lightDevice(0),
30 m_color("blue"),
29 m_color("blue"),
31 m_state(Lights::Off),
30 m_state(Lights::Off),
32 m_onMs(1000),
31 m_onMs(1000),
33 m_offMs(3000)
32 m_offMs(3000)
34{
33{
35−}
36
34
37−Lights::~Lights()
38−{
39− if (m_lightDevice) {
40− hw_device_t* device = (hw_device_t*) m_lightDevice;
41− device->close(device);
42− }
43}
35}
44
36
45void Lights::setState(Lights::State newState)
37void Lights::setState(Lights::State newState)
@@ -107,60 +99,3 @@ void Lights::setOffMillisec(int offMs)
107 // FIXME: update the property if the light is already on
99 // FIXME: update the property if the light is already on
108 }
100 }
109}
101}
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 @@
22#include <QtCore/QObject>
22#include <QtCore/QObject>
23#include <QtGui/QColor>
23#include <QtGui/QColor>
24
24
25−struct light_device_t;
26−
27class Lights: public QObject
25class Lights: public QObject
28{
26{
29 Q_OBJECT
27 Q_OBJECT
@@ -40,7 +38,6 @@ public:
40 Q_ENUM(State)
38 Q_ENUM(State)
41
39
42 explicit Lights(QObject *parent = 0);
40 explicit Lights(QObject *parent = 0);
43− ~Lights();
44
41
45 void setState(State newState);
42 void setState(State newState);
46 State state() const;
43 State state() const;
@@ -60,16 +57,15 @@ Q_SIGNALS:
60 void onMillisecChanged(int onMs);
57 void onMillisecChanged(int onMs);
61 void offMillisecChanged(int offMs);
58 void offMillisecChanged(int offMs);
62
59
63−private:
60+protected:
64− light_device_t* m_lightDevice;
65 QColor m_color;
61 QColor m_color;
66 State m_state;
62 State m_state;
67 int m_onMs;
63 int m_onMs;
68 int m_offMs;
64 int m_offMs;
69
65
70− bool init();
66+ virtual bool init() = 0;
71− void turnOff();
67+ virtual void turnOff() = 0;
72− void turnOn();
68+ virtual void turnOn() = 0;
73};
69};
74
70
75#endif
71#endif
plugins/Lights/plugin.cpp+20−1
@@ -18,6 +18,11 @@
18
18
19#include "plugin.h"
19#include "plugin.h"
20#include "Lights.h"
20#include "Lights.h"
21+#include "HfdLights.h"
22+#include "LegacyLights.h"
23+
24+// libandroid-properties
25+#include <hybris/properties/properties.h>
21
26
22#include <QtQml/qqml.h>
27#include <QtQml/qqml.h>
23
28
@@ -25,7 +30,21 @@ static QObject *lights_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
25{
30{
26 Q_UNUSED(engine)
31 Q_UNUSED(engine)
27 Q_UNUSED(scriptEngine)
32 Q_UNUSED(scriptEngine)
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) {
28− return new Lights();
44+ return new HfdLights();
45+ } else {
46+ return new LegacyLights();
47+ }
29}
48}
30
49
31void LightsPlugin::registerTypes(const char *uri)
50void LightsPlugin::registerTypes(const char *uri)
plugins/Powerd/CMakeLists.txt+4−2
@@ -9,7 +9,9 @@ add_library(Powerd-qml MODULE
9 Powerd.cpp
9 Powerd.cpp
10 )
10 )
11
11
12−qt5_use_modules(Powerd-qml DBus Qml)
12+target_link_libraries(Powerd-qml
13+ Qt5::DBus Qt5::Qml
13−target_link_libraries(Powerd-qml ${GIO_LDFLAGS})
14+ ${GIO_LDFLAGS}
15+ )
14
16
15add_unity8_plugin(Powerd 0.1 Powerd TARGETS Powerd-qml)
17add_unity8_plugin(Powerd 0.1 Powerd TARGETS Powerd-qml)
plugins/ScreenshotDirectory/CMakeLists.txt+1−1
@@ -4,6 +4,6 @@ set(PLUGIN_SOURCES
4)
4)
5
5
6add_library(ScreenshotDirectory-qml MODULE ${PLUGIN_SOURCES})
6add_library(ScreenshotDirectory-qml MODULE ${PLUGIN_SOURCES})
7−qt5_use_modules(ScreenshotDirectory-qml Qml Gui Quick)
7+target_link_libraries(ScreenshotDirectory-qml Qt5::Qml Qt5::Gui Qt5::Quick)
8
8
9add_unity8_plugin(ScreenshotDirectory 0.1 ScreenshotDirectory TARGETS ScreenshotDirectory-qml)
9add_unity8_plugin(ScreenshotDirectory 0.1 ScreenshotDirectory TARGETS ScreenshotDirectory-qml)
plugins/SessionBroadcast/CMakeLists.txt+1−2
@@ -6,9 +6,8 @@ add_library(SessionBroadcast-qml MODULE
6 plugin.cpp
6 plugin.cpp
7 )
7 )
8
8
9−qt5_use_modules(SessionBroadcast-qml DBus Qml)
10−
11target_link_libraries(SessionBroadcast-qml
9target_link_libraries(SessionBroadcast-qml
10+ Qt5::DBus Qt5::Qml
12 ${GLIB_LIBRARIES}
11 ${GLIB_LIBRARIES}
13 )
12 )
14
13
plugins/UInput/CMakeLists.txt+1−1
@@ -3,5 +3,5 @@ add_library(UInput-qml MODULE
3 uinput.cpp
3 uinput.cpp
4)
4)
5
5
6−qt5_use_modules(UInput-qml Qml)
6+target_link_libraries(UInput-qml Qt5::Qml)
7add_unity8_plugin(UInput 0.1 UInput TARGETS UInput-qml)
7add_unity8_plugin(UInput 0.1 UInput TARGETS UInput-qml)
plugins/Ubuntu/DownloadDaemonListener/CMakeLists.txt+4−2
@@ -11,8 +11,10 @@ set(DOWNLOADDAEMONLISTENER_SOURCES
11
11
12add_library(DownloadDaemonListener MODULE ${DOWNLOADDAEMONLISTENER_SOURCES})
12add_library(DownloadDaemonListener MODULE ${DOWNLOADDAEMONLISTENER_SOURCES})
13
13
14−qt5_use_modules(DownloadDaemonListener Qml Quick DBus Core)
15pkg_check_modules(DDLADAPTER REQUIRED udm-common)
14pkg_check_modules(DDLADAPTER REQUIRED udm-common)
16add_definitions(${DDLADAPTER_CFLAGS} ${DDLADAPTER_CFLAGS_OTHER})
15add_definitions(${DDLADAPTER_CFLAGS} ${DDLADAPTER_CFLAGS_OTHER})
17−target_link_libraries(DownloadDaemonListener ${DDLADAPTER_LIBRARIES})
16+target_link_libraries(DownloadDaemonListener
17+ Qt5::Qml Qt5::Quick Qt5::DBus Qt5::Core
18+ ${DDLADAPTER_LIBRARIES}
19+ )
18add_unity8_plugin(Ubuntu.DownloadDaemonListener 0.1 Ubuntu/DownloadDaemonListener TARGETS DownloadDaemonListener)
20add_unity8_plugin(Ubuntu.DownloadDaemonListener 0.1 Ubuntu/DownloadDaemonListener TARGETS DownloadDaemonListener)
plugins/Ubuntu/Gestures/CMakeLists.txt+1−3
@@ -17,9 +17,7 @@ pkg_check_modules(UBUNTUGESTURES REQUIRED UbuntuGestures)
17add_definitions(-DUBUNTUGESTURESQML_LIBRARY)
17add_definitions(-DUBUNTUGESTURESQML_LIBRARY)
18
18
19add_library(UbuntuGesturesQml SHARED ${UbuntuGesturesQml_SOURCES})
19add_library(UbuntuGesturesQml SHARED ${UbuntuGesturesQml_SOURCES})
20−target_link_libraries(UbuntuGesturesQml ${UBUNTUGESTURES_LIBRARIES})
20+target_link_libraries(UbuntuGesturesQml ${UBUNTUGESTURES_LIBRARIES} Qt5::Core Qt5::Quick)
21−
22−qt5_use_modules(UbuntuGesturesQml Core Quick)
23
21
24# So that Foo.cpp can #include "Foo.moc"
22# So that Foo.cpp can #include "Foo.moc"
25include_directories(${CMAKE_CURRENT_BINARY_DIR})
23include_directories(${CMAKE_CURRENT_BINARY_DIR})
plugins/Ubuntu/Gestures/TouchGestureArea.cpp+6
@@ -328,6 +328,12 @@ void TouchGestureArea::touchEvent_rejected(QTouchEvent *event)
328 }
328 }
329 }
329 }
330 }
330 }
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();
331}
337}
332
338
333void TouchGestureArea::unownedTouchEvent(QTouchEvent *unownedTouchEvent)
339void TouchGestureArea::unownedTouchEvent(QTouchEvent *unownedTouchEvent)
plugins/Unity/ApplicationMenu/CMakeLists.txt+1−1
@@ -14,6 +14,6 @@ qt5_add_dbus_adaptor(applicationMenu_SRCS com.ubuntu.MenuRegistrar.xml dbusappli
14
14
15add_library(ApplicationMenu-qml MODULE ${applicationMenu_SRCS})
15add_library(ApplicationMenu-qml MODULE ${applicationMenu_SRCS})
16
16
17−qt5_use_modules(ApplicationMenu-qml DBus Qml)
17+target_link_libraries(ApplicationMenu-qml Qt5::DBus Qt5::Qml)
18
18
19add_unity8_plugin(Unity.ApplicationMenu 0.1 Unity/ApplicationMenu TARGETS ApplicationMenu-qml)
19add_unity8_plugin(Unity.ApplicationMenu 0.1 Unity/ApplicationMenu TARGETS ApplicationMenu-qml)
plugins/Unity/CMakeLists.txt−1
@@ -3,6 +3,5 @@ add_subdirectory(Connectivity)
3add_subdirectory(Indicators)
3add_subdirectory(Indicators)
4add_subdirectory(Launcher)
4add_subdirectory(Launcher)
5add_subdirectory(Session)
5add_subdirectory(Session)
6−add_subdirectory(DashCommunicator)
7add_subdirectory(InputInfo)
6add_subdirectory(InputInfo)
8add_subdirectory(Platform)
7add_subdirectory(Platform)
plugins/Unity/Connectivity/CMakeLists.txt+1−1
@@ -5,6 +5,6 @@ set(CONNECTIVITY_SOURCES
5
5
6add_library(Connectivity MODULE ${CONNECTIVITY_SOURCES})
6add_library(Connectivity MODULE ${CONNECTIVITY_SOURCES})
7
7
8−qt5_use_modules(Connectivity Qml DBus Core)
8+target_link_libraries(Connectivity Qt5::Qml Qt5::DBus Qt5::Core)
9
9
10add_unity8_plugin(Unity.Connectivity 0.1 Unity/Connectivity TARGETS Connectivity)
10add_unity8_plugin(Unity.Connectivity 0.1 Unity/Connectivity TARGETS Connectivity)
plugins/Unity/DashCommunicator/CMakeLists.txtdeleted−26
@@ -1,26 +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−qt5_use_modules(DashCommunicator-qml DBus Qml)
20−
21−target_link_libraries(DashCommunicator-qml
22− unity8-private
23−)
24−
25−# export the qmldir and qmltypes files
26−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/CMakeLists.txt+1−2
@@ -44,8 +44,7 @@ target_link_libraries(IndicatorsQml
44 ${GLIB_LIBRARIES}
44 ${GLIB_LIBRARIES}
45 ${GIO_LIBRARIES}
45 ${GIO_LIBRARIES}
46 ${QMENUMODEL_LDFLAGS}
46 ${QMENUMODEL_LDFLAGS}
47+ Qt5::Core Qt5::Qml Qt5::Quick Qt5::DBus
47)
48)
48
49
49−qt5_use_modules(IndicatorsQml Core Qml Quick DBus)
50−
51add_unity8_plugin(Unity.Indicators 0.1 Unity/Indicators TARGETS IndicatorsQml)
50add_unity8_plugin(Unity.Indicators 0.1 Unity/Indicators TARGETS IndicatorsQml)
plugins/Unity/Indicators/indicatorsmodel.cpp+13
@@ -103,6 +103,19 @@ void IndicatorsModel::setProfile(const QString &profile)
103 m_manager->setProfile(profile);
103 m_manager->setProfile(profile);
104}
104}
105
105
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+
106/*!
119/*!
107 \qmlmethod IndicatorsModel::unload()
120 \qmlmethod IndicatorsModel::unload()
108
121
plugins/Unity/Indicators/indicatorsmodel.h+9
@@ -35,6 +35,9 @@ class UNITYINDICATORS_EXPORT IndicatorsModel : public QAbstractListModel
35 Q_PROPERTY(int count READ count NOTIFY countChanged)
35 Q_PROPERTY(int count READ count NOTIFY countChanged)
36 Q_PROPERTY(QString profile READ profile WRITE setProfile NOTIFY profileChanged)
36 Q_PROPERTY(QString profile READ profile WRITE setProfile NOTIFY profileChanged)
37
37
38+ // Used for tests
39+ Q_PROPERTY(bool light READ light WRITE setLight NOTIFY lightChanged)
40+
38public:
41public:
39
42
40 IndicatorsModel(QObject *parent=nullptr);
43 IndicatorsModel(QObject *parent=nullptr);
@@ -48,6 +51,9 @@ public:
48 QString profile() const;
51 QString profile() const;
49 void setProfile(const QString& profile);
52 void setProfile(const QString& profile);
50
53
54+ bool light() const;
55+ void setLight(const bool &light);
56+
51 /* QAbstractItemModel */
57 /* QAbstractItemModel */
52 QHash<int, QByteArray> roleNames() const override;
58 QHash<int, QByteArray> roleNames() const override;
53 int columnCount(const QModelIndex &parent = QModelIndex()) const override;
59 int columnCount(const QModelIndex &parent = QModelIndex()) const override;
@@ -60,6 +66,7 @@ Q_SIGNALS:
60 void countChanged();
66 void countChanged();
61 void profileChanged();
67 void profileChanged();
62 void indicatorDataChanged(const QVariant& data);
68 void indicatorDataChanged(const QVariant& data);
69+ void lightChanged();
63
70
64private Q_SLOTS:
71private Q_SLOTS:
65 void onIdentifierChanged();
72 void onIdentifierChanged();
@@ -74,6 +81,8 @@ private:
74
81
75 void notifyDataChanged(QObject *sender, int role);
82 void notifyDataChanged(QObject *sender, int role);
76 int count() const;
83 int count() const;
84+
85+ bool m_light;
77};
86};
78
87
79#endif // INDICATORSMODEL_H
88#endif // INDICATORSMODEL_H
plugins/Unity/InputInfo/CMakeLists.txt+1−2
@@ -32,8 +32,7 @@ add_library(InputInfo SHARED
32target_link_libraries(InputInfo
32target_link_libraries(InputInfo
33 ${LIBUDEV_LDFLAGS}
33 ${LIBUDEV_LDFLAGS}
34 ${LIBEVDEV_LDFLAGS}
34 ${LIBEVDEV_LDFLAGS}
35+ Qt5::Core Qt5::Qml Qt5::Quick
35)
36)
36
37
37−qt5_use_modules(InputInfo Core Qml Quick)
38−
39add_unity8_plugin(Unity.InputInfo 0.1 Unity/InputInfo TARGETS InputInfo)
38add_unity8_plugin(Unity.InputInfo 0.1 Unity/InputInfo TARGETS InputInfo)
plugins/Unity/Launcher/CMakeLists.txt+2−2
@@ -26,6 +26,7 @@ set(QMLLAUNCHERPLUGIN_SRC
26 asadapter.cpp
26 asadapter.cpp
27 appdrawermodel.cpp
27 appdrawermodel.cpp
28 ualwrapper.cpp
28 ualwrapper.cpp
29+ xdgwatcher.cpp
29 ${CMAKE_SOURCE_DIR}/plugins/AccountsService/AccountsServiceDBusAdaptor.cpp
30 ${CMAKE_SOURCE_DIR}/plugins/AccountsService/AccountsServiceDBusAdaptor.cpp
30 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
31 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
31 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
32 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
@@ -47,8 +48,7 @@ target_link_libraries(UnityLauncher-qml
47 ${GSETTINGS_QT_LDFLAGS}
48 ${GSETTINGS_QT_LDFLAGS}
48 ${GLIB_LIBRARIES}
49 ${GLIB_LIBRARIES}
49 ${UAL_LIBRARIES}
50 ${UAL_LIBRARIES}
51+ Qt5::DBus Qt5::Qml Qt5::Gui Qt5::Concurrent
50 )
52 )
51
53
52−qt5_use_modules(UnityLauncher-qml DBus Qml Gui)
53−
54add_unity8_plugin(Unity.Launcher 0.1 Unity/Launcher TARGETS UnityLauncher-qml)
54add_unity8_plugin(Unity.Launcher 0.1 Unity/Launcher TARGETS UnityLauncher-qml)
plugins/Unity/Launcher/appdrawermodel.cpp+144−14
@@ -1,5 +1,6 @@
1/*
1/*
2 * Copyright (C) 2016 Canonical, Ltd.
2 * Copyright (C) 2016 Canonical, Ltd.
3+ * Copyright (C) 2020 UBports Foundation.
3 *
4 *
4 * This program is free software; you can redistribute it and/or modify
5 * 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 * it under the terms of the GNU General Public License as published by
@@ -16,23 +17,35 @@
16
17
17#include "appdrawermodel.h"
18#include "appdrawermodel.h"
18#include "ualwrapper.h"
19#include "ualwrapper.h"
20+#include "xdgwatcher.h"
19
21
20#include <QDebug>
22#include <QDebug>
21#include <QDateTime>
23#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+}
22
33
23AppDrawerModel::AppDrawerModel(QObject *parent):
34AppDrawerModel::AppDrawerModel(QObject *parent):
24− AppDrawerModelInterface(parent)
35+ AppDrawerModelInterface(parent),
36+ m_ual(new UalWrapper(this)),
37+ m_xdgWatcher(new XdgWatcher(this)),
38+ m_refreshing(false)
25{
39{
26− Q_FOREACH (const QString &appId, UalWrapper::installedApps()) {
40+ connect(&m_refreshFutureWatcher, &QFutureWatcher<ItemList>::finished,
27− UalWrapper::AppInfo info = UalWrapper::getApplicationInfo(appId);
41+ this, &AppDrawerModel::onRefreshFinished);
28− if (!info.valid) {
42+
29− qWarning() << "Failed to get app info for app" << appId;
43+ // keep this a queued connection as it's coming from another thread.
30− continue;
44+ connect(m_xdgWatcher, &XdgWatcher::appAdded, this, &AppDrawerModel::appAdded, Qt::QueuedConnection);
31− }
45+ connect(m_xdgWatcher, &XdgWatcher::appRemoved, this, &AppDrawerModel::appRemoved, Qt::QueuedConnection);
32− m_list.append(new LauncherItem(appId, info.name, info.icon, this));
46+ connect(m_xdgWatcher, &XdgWatcher::appInfoChanged, this, &AppDrawerModel::appInfoChanged, Qt::QueuedConnection);
33− m_list.last()->setKeywords(info.keywords);
47+
34− }
48+ refresh();
35− qsrand(QDateTime::currentMSecsSinceEpoch() / 100);
36}
49}
37
50
38int AppDrawerModel::rowCount(const QModelIndex &parent) const
51int AppDrawerModel::rowCount(const QModelIndex &parent) const
@@ -53,10 +66,127 @@ QVariant AppDrawerModel::data(const QModelIndex &index, int role) const
53 case RoleKeywords:
66 case RoleKeywords:
54 return m_list.at(index.row())->keywords();
67 return m_list.at(index.row())->keywords();
55 case RoleUsage:
68 case RoleUsage:
56− // FIXME: u-a-l needs to provide API for usage stats.
69+ return m_list.at(index.row())->popularity();
57− // don't forget to drop the qsrand() call in the ctor when dropping this.
58− return qrand();
59 }
70 }
60
71
61 return QVariant();
72 return QVariant();
62}
73}
74+
75+void AppDrawerModel::appAdded(const QString &appId)
76+{
77+ if (m_refreshing)
78+ // Will be replaced by the refresh result anyway.
79+ return;
80+
81+ UalWrapper::AppInfo info = UalWrapper::getApplicationInfo(appId);
82+ if (!info.valid) {
83+ qWarning() << "App added signal received but failed to get app info for app" << appId;
84+ return;
85+ }
86+
87+ beginInsertRows(QModelIndex(), m_list.count(), m_list.count());
88+ auto item = makeSharedLauncherItem(appId, info.name, info.icon, /* parent */ nullptr);
89+ item->setKeywords(info.keywords);
90+ item->setPopularity(info.popularity);
91+ m_list.append(std::move(item));
92+ endInsertRows();
93+}
94+
95+void AppDrawerModel::appRemoved(const QString &appId)
96+{
97+ if (m_refreshing)
98+ // Will be replaced by the refresh result anyway.
99+ return;
100+
101+ int idx = -1;
102+ for (int i = 0; i < m_list.count(); i++) {
103+ if (m_list.at(i)->appId() == appId) {
104+ idx = i;
105+ break;
106+ }
107+ }
108+ if (idx < 0) {
109+ qWarning() << "App removed signal received but app doesn't seem to be in the drawer model";
110+ return;
111+ }
112+ beginRemoveRows(QModelIndex(), idx, idx);
113+ m_list.removeAt(idx);
114+ endRemoveRows();
115+}
116+
117+void AppDrawerModel::appInfoChanged(const QString &appId)
118+{
119+ if (m_refreshing)
120+ // Will be replaced by the refresh result anyway.
121+ return;
122+
123+ std::shared_ptr<LauncherItem> item;
124+ int idx = -1;
125+
126+ for(int i = 0; i < m_list.count(); i++) {
127+ if (m_list.at(i)->appId() == appId) {
128+ item = m_list.at(i);
129+ idx = i;
130+ break;
131+ }
132+ }
133+
134+ if (!item) {
135+ return;
136+ }
137+
138+ UalWrapper::AppInfo info = m_ual->getApplicationInfo(appId);
139+ item->setPopularity(info.popularity);
140+ Q_EMIT dataChanged(index(idx), index(idx), {AppDrawerModelInterface::RoleUsage});
141+}
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+33−2
@@ -1,5 +1,6 @@
1/*
1/*
2 * Copyright (C) 2016 Canonical, Ltd.
2 * Copyright (C) 2016 Canonical, Ltd.
3+ * Copyright (C) 2020 UBports Foundation.
3 *
4 *
4 * This program is free software; you can redistribute it and/or modify
5 * 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 * it under the terms of the GNU General Public License as published by
@@ -14,20 +15,50 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16 */
16
17
17−
18+#include <memory>
19+#include <QFutureWatcher>
18#include <unity/shell/launcher/AppDrawerModelInterface.h>
20#include <unity/shell/launcher/AppDrawerModelInterface.h>
19
21
20#include "launcheritem.h"
22#include "launcheritem.h"
21
23
24+class UalWrapper;
25+class XdgWatcher;
26+
22class AppDrawerModel: public AppDrawerModelInterface
27class AppDrawerModel: public AppDrawerModelInterface
23{
28{
24 Q_OBJECT
29 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)
25public:
33public:
26 AppDrawerModel(QObject* parent = nullptr);
34 AppDrawerModel(QObject* parent = nullptr);
27
35
28 int rowCount(const QModelIndex &parent) const override;
36 int rowCount(const QModelIndex &parent) const override;
29 QVariant data(const QModelIndex &index, int role) const override;
37 QVariant data(const QModelIndex &index, int role) const override;
30
38
39+ // TODO: add these to AppDrawerModelInterface too.
40+ bool refreshing();
41+ Q_INVOKABLE void refresh();
42+
43+Q_SIGNALS:
44+ void refreshingChanged();
45+
46+private Q_SLOTS:
47+ void appAdded(const QString &appId);
48+ void appRemoved(const QString &appId);
49+ void appInfoChanged(const QString &appId);
50+
51+ void onRefreshFinished();
52+
31private:
53private:
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.
32− QList<LauncherItem*> m_list;
57+ typedef QList<std::shared_ptr<LauncherItem>> ItemList;
58+
59+ ItemList m_list;
60+ UalWrapper *m_ual;
61+ XdgWatcher *m_xdgWatcher;
62+ QFutureWatcher<ItemList> m_refreshFutureWatcher;
63+ bool m_refreshing;
33};
64};
plugins/Unity/Launcher/launcheritem.cpp+13−1
@@ -37,7 +37,6 @@ LauncherItem::LauncherItem(const QString &appId, const QString &name, const QStr
37 m_alerting(false),
37 m_alerting(false),
38 m_quickList(new QuickListModel(this))
38 m_quickList(new QuickListModel(this))
39{
39{
40− Q_ASSERT(parent != nullptr);
41 QuickListEntry nameAction;
40 QuickListEntry nameAction;
42 nameAction.setActionId(QStringLiteral("launch_item"));
41 nameAction.setActionId(QStringLiteral("launch_item"));
43 nameAction.setText(m_name);
42 nameAction.setText(m_name);
@@ -256,6 +255,19 @@ void LauncherItem::setSurfaces(const QList<QPair<QString, QString> > &surfaces)
256 }
255 }
257}
256}
258
257
258+uint LauncherItem::popularity() const
259+{
260+ return m_popularity;
261+}
262+
263+void LauncherItem::setPopularity(uint popularity)
264+{
265+ if (m_popularity != popularity) {
266+ m_popularity = popularity;
267+ Q_EMIT popularityChanged(popularity);
268+ }
269+}
270+
259unity::shell::launcher::QuickListModelInterface *LauncherItem::quickList() const
271unity::shell::launcher::QuickListModelInterface *LauncherItem::quickList() const
260{
272{
261 return m_quickList;
273 return m_quickList;
plugins/Unity/Launcher/launcheritem.h+3
@@ -39,6 +39,7 @@ public:
39 QString name() const override;
39 QString name() const override;
40 QString icon() const override;
40 QString icon() const override;
41 QStringList keywords() const override;
41 QStringList keywords() const override;
42+ uint popularity() const override;
42 bool pinned() const override;
43 bool pinned() const override;
43 bool running() const override;
44 bool running() const override;
44 bool recent() const override;
45 bool recent() const override;
@@ -55,6 +56,7 @@ private:
55 void setName(const QString &name);
56 void setName(const QString &name);
56 void setIcon(const QString &icon);
57 void setIcon(const QString &icon);
57 void setKeywords(const QStringList &keywords);
58 void setKeywords(const QStringList &keywords);
59+ void setPopularity(uint popularity);
58 void setPinned(bool pinned);
60 void setPinned(bool pinned);
59 void setRunning(bool running);
61 void setRunning(bool running);
60 void setRecent(bool recent);
62 void setRecent(bool recent);
@@ -70,6 +72,7 @@ private:
70 QString m_name;
72 QString m_name;
71 QString m_icon;
73 QString m_icon;
72 QStringList m_keywords;
74 QStringList m_keywords;
75+ uint m_popularity;
73 bool m_pinned;
76 bool m_pinned;
74 bool m_running;
77 bool m_running;
75 bool m_recent;
78 bool m_recent;
plugins/Unity/Launcher/launchermodel.cpp+1−5
@@ -167,6 +167,7 @@ void LauncherModel::pin(const QString &appId, int index)
167 appInfo.icon,
167 appInfo.icon,
168 this);
168 this);
169 item->setPinned(true);
169 item->setPinned(true);
170+ item->setPopularity(appInfo.popularity);
170 m_list.insert(index, item);
171 m_list.insert(index, item);
171 endInsertRows();
172 endInsertRows();
172 }
173 }
@@ -520,11 +521,6 @@ void LauncherModel::applicationAdded(const QModelIndex &parent, int row)
520 return;
521 return;
521 }
522 }
522
523
523− if (app->appId() == QLatin1String("unity8-dash")) {
524− // Not adding the dash app
525− return;
526− }
527−
528 const int itemIndex = findApplication(app->appId());
524 const int itemIndex = findApplication(app->appId());
529 if (itemIndex != -1) {
525 if (itemIndex != -1) {
530 LauncherItem *item = m_list.at(itemIndex);
526 LauncherItem *item = m_list.at(itemIndex);
plugins/Unity/Launcher/ualwrapper.cpp+3−2
@@ -24,7 +24,6 @@ using namespace ubuntu::app_launch;
24UalWrapper::UalWrapper(QObject *parent):
24UalWrapper::UalWrapper(QObject *parent):
25 QObject(parent)
25 QObject(parent)
26{
26{
27−
28}
27}
29
28
30QStringList UalWrapper::installedApps()
29QStringList UalWrapper::installedApps()
@@ -39,7 +38,7 @@ QStringList UalWrapper::installedApps()
39 }
38 }
40 }
39 }
41 } catch (const std::runtime_error &e) {
40 } catch (const std::runtime_error &e) {
42− qWarning() << "ubuntu-all-launch threw an exception listing apps:" << e.what();
41+ qWarning() << "ubuntu-app-launch threw an exception listing apps:" << e.what();
43 }
42 }
44
43
45 return appIds;
44 return appIds;
@@ -59,11 +58,13 @@ UalWrapper::AppInfo UalWrapper::getApplicationInfo(const QString &appId)
59 std::shared_ptr<Application> ualApp;
58 std::shared_ptr<Application> ualApp;
60 ualApp = Application::create(ualAppId, Registry::getDefault());
59 ualApp = Application::create(ualAppId, Registry::getDefault());
61
60
61+ info.appId = appId;
62 info.name = QString::fromStdString(ualApp->info()->name());
62 info.name = QString::fromStdString(ualApp->info()->name());
63 info.icon = QString::fromStdString(ualApp->info()->iconPath());
63 info.icon = QString::fromStdString(ualApp->info()->iconPath());
64 for (const std::string &keyword : ualApp->info()->keywords().value()) {
64 for (const std::string &keyword : ualApp->info()->keywords().value()) {
65 info.keywords << QString::fromStdString(keyword);
65 info.keywords << QString::fromStdString(keyword);
66 }
66 }
67+ //info.popularity = ualApp->info()->popularity();
67 info.valid = true;
68 info.valid = true;
68 } catch (const std::runtime_error &e) {
69 } catch (const std::runtime_error &e) {
69 qWarning() << "ubuntu-app-launch threw an exception getting app info for appId:" << appId << ":" << e.what();
70 qWarning() << "ubuntu-app-launch threw an exception getting app info for appId:" << appId << ":" << e.what();
plugins/Unity/Launcher/ualwrapper.h+2−1
@@ -21,15 +21,16 @@ class UalWrapper: public QObject
21 Q_OBJECT
21 Q_OBJECT
22public:
22public:
23 struct AppInfo {
23 struct AppInfo {
24+ QString appId;
24 bool valid = false;
25 bool valid = false;
25 QString name;
26 QString name;
26 QString icon;
27 QString icon;
27 QStringList keywords;
28 QStringList keywords;
29+ uint popularity = 0;
28 };
30 };
29
31
30 UalWrapper(QObject* parent = nullptr);
32 UalWrapper(QObject* parent = nullptr);
31
33
32 static QStringList installedApps();
34 static QStringList installedApps();
33 static AppInfo getApplicationInfo(const QString &appId);
35 static AppInfo getApplicationInfo(const QString &appId);
34−
35};
36};
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/Platform/CMakeLists.txt+1−1
@@ -6,6 +6,6 @@ set(platformplugin_SRCS
6
6
7add_library(Platform-qml SHARED ${platformplugin_SRCS})
7add_library(Platform-qml SHARED ${platformplugin_SRCS})
8
8
9−qt5_use_modules(Platform-qml DBus Qml)
9+target_link_libraries(Platform-qml Qt5::DBus Qt5::Qml)
10
10
11add_unity8_plugin(Unity.Platform 1.0 Unity/Platform TARGETS Platform-qml)
11add_unity8_plugin(Unity.Platform 1.0 Unity/Platform TARGETS Platform-qml)
plugins/Unity/Session/CMakeLists.txt+1−1
@@ -18,8 +18,8 @@ add_library(UnitySession-qml MODULE
18 ${QMLSESSIONPLUGIN_SRC}
18 ${QMLSESSIONPLUGIN_SRC}
19 )
19 )
20
20
21−qt5_use_modules(UnitySession-qml DBus Qml)
22target_link_libraries(UnitySession-qml
21target_link_libraries(UnitySession-qml
22+ Qt5::DBus Qt5::Qml
23 unity8-private
23 unity8-private
24 ${GIO_LDFLAGS}
24 ${GIO_LDFLAGS}
25 ${GLIB_LIBRARIES}
25 ${GLIB_LIBRARIES}
plugins/Utils/CMakeLists.txt+3−4
@@ -7,7 +7,6 @@ include_directories(
7 SYSTEM
7 SYSTEM
8 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
8 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
9 ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
9 ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
10− ${GIO_INCLUDE_DIRS}
11)
10)
12
11
13set(QMLPLUGIN_SRC
12set(QMLPLUGIN_SRC
@@ -44,7 +43,9 @@ add_library(Utils-qml SHARED
44 ${QMLPLUGIN_SRC}
43 ${QMLPLUGIN_SRC}
45 )
44 )
46
45
47−target_link_libraries(Utils-qml ${GIO_LDFLAGS})
46+target_link_libraries(Utils-qml
47+ Qt5::Qml Qt5::Quick Qt5::DBus Qt5::Network Qt5::Gui Qt5::Sql Qt5::Concurrent
48+ )
48
49
49# Because this is an internal support library, we want
50# Because this is an internal support library, we want
50# to expose all symbols in it. Consider changing this
51# to expose all symbols in it. Consider changing this
@@ -52,6 +53,4 @@ target_link_libraries(Utils-qml ${GIO_LDFLAGS})
52# files directly in targets.
53# files directly in targets.
53set_target_properties(Utils-qml PROPERTIES COMPILE_FLAGS -fvisibility=default)
54set_target_properties(Utils-qml PROPERTIES COMPILE_FLAGS -fvisibility=default)
54
55
55−qt5_use_modules(Utils-qml Qml Quick DBus Network Gui Sql Concurrent)
56−
57add_unity8_plugin(Utils 0.1 Utils TARGETS Utils-qml)
56add_unity8_plugin(Utils 0.1 Utils TARGETS Utils-qml)
plugins/Utils/appdrawerproxymodel.cpp+1−1
@@ -158,7 +158,7 @@ bool AppDrawerProxyModel::filterAcceptsRow(int source_row, const QModelIndex &so
158 allWords.prepend(m_source->data(m_source->index(source_row, 0), AppDrawerModelInterface::RoleName).toString());
158 allWords.prepend(m_source->data(m_source->index(source_row, 0), AppDrawerModelInterface::RoleName).toString());
159 bool found = false;
159 bool found = false;
160 Q_FOREACH (const QString &currentWord, allWords) {
160 Q_FOREACH (const QString &currentWord, allWords) {
161− if (currentWord.startsWith(m_filterString, Qt::CaseInsensitive)) {
161+ if (currentWord.contains(m_filterString, Qt::CaseInsensitive)) {
162 found = true;
162 found = true;
163 break;
163 break;
164 }
164 }
plugins/Utils/deviceconfigparser.cpp+18
@@ -116,6 +116,24 @@ QString DeviceConfigParser::category() const
116 return value;
116 return value;
117}
117}
118
118
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+
119QStringList DeviceConfigParser::readOrientationsFromConfig(const QString &key) const
137QStringList DeviceConfigParser::readOrientationsFromConfig(const QString &key) const
120{
138{
121 m_config->beginGroup(m_name);
139 m_config->beginGroup(m_name);
plugins/Utils/deviceconfigparser.h+3
@@ -33,6 +33,7 @@ class DeviceConfigParser: public QObject
33 Q_PROPERTY(Qt::ScreenOrientation portraitOrientation READ portraitOrientation NOTIFY changed)
33 Q_PROPERTY(Qt::ScreenOrientation portraitOrientation READ portraitOrientation NOTIFY changed)
34 Q_PROPERTY(Qt::ScreenOrientation invertedPortraitOrientation READ invertedPortraitOrientation NOTIFY changed)
34 Q_PROPERTY(Qt::ScreenOrientation invertedPortraitOrientation READ invertedPortraitOrientation NOTIFY changed)
35 Q_PROPERTY(QString category READ category NOTIFY changed)
35 Q_PROPERTY(QString category READ category NOTIFY changed)
36+ Q_PROPERTY(bool supportsMultiColorLed READ supportsMultiColorLed NOTIFY changed)
36
37
37public:
38public:
38 DeviceConfigParser(QObject *parent = nullptr);
39 DeviceConfigParser(QObject *parent = nullptr);
@@ -47,6 +48,7 @@ public:
47 Qt::ScreenOrientation portraitOrientation() const;
48 Qt::ScreenOrientation portraitOrientation() const;
48 Qt::ScreenOrientation invertedPortraitOrientation() const;
49 Qt::ScreenOrientation invertedPortraitOrientation() const;
49 QString category() const;
50 QString category() const;
51+ bool supportsMultiColorLed() const;
50
52
51Q_SIGNALS:
53Q_SIGNALS:
52 void changed();
54 void changed();
@@ -58,6 +60,7 @@ private:
58 QStringList readOrientationsFromConfig(const QString &key) const;
60 QStringList readOrientationsFromConfig(const QString &key) const;
59 QString readOrientationFromConfig(const QString &key) const;
61 QString readOrientationFromConfig(const QString &key) const;
60 Qt::ScreenOrientation stringToOrientation(const QString &orientationString, Qt::ScreenOrientation defaultValue) const;
62 Qt::ScreenOrientation stringToOrientation(const QString &orientationString, Qt::ScreenOrientation defaultValue) const;
63+ bool readBoolFromConfig(const QString &key, bool defaultValue) const;
61};
64};
62
65
63#endif
66#endif
plugins/Utils/windowstatestorage.cpp+293−131
@@ -1,5 +1,6 @@
1/*
1/*
2 * Copyright 2015-2016 Canonical Ltd.
2 * Copyright 2015-2016 Canonical Ltd.
3+ * Copyright 2021 UBports Foundation
3 *
4 *
4 * This program is free software; you can redistribute it and/or modify
5 * 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 * it under the terms of the GNU Lesser General Public License as published by
@@ -16,185 +17,344 @@
16
17
17#include "windowstatestorage.h"
18#include "windowstatestorage.h"
18
19
19−#include <QtConcurrent>
20#include <QDebug>
20#include <QDebug>
21−#include <QFutureSynchronizer>
21+#include <QDir>
22+#include <QMetaObject>
23+#include <QObject>
22#include <QSqlQuery>
24#include <QSqlQuery>
23#include <QSqlError>
25#include <QSqlError>
24#include <QSqlResult>
26#include <QSqlResult>
27+#include <QStandardPaths>
25#include <QRect>
28#include <QRect>
26#include <unity/shell/application/ApplicationInfoInterface.h>
29#include <unity/shell/application/ApplicationInfoInterface.h>
27
30
28−QMutex WindowStateStorage::s_mutex;
29
31
30−inline QString sanitiseString(QString string) {
32+class AsyncQuery: public QObject
31− return string.remove(QLatin1Char('\"'))
32− .remove(QLatin1Char('\''))
33− .remove(QLatin1Char('\\'));
34−}
35−
36−WindowStateStorage::WindowStateStorage(QObject *parent):
37− QObject(parent)
38{
33{
39− const QString dbPath = QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation) + QStringLiteral("/unity8/");
34+ Q_OBJECT
40− m_db = QSqlDatabase::addDatabase(QStringLiteral("QSQLITE"));
41− QDir dir;
42− dir.mkpath(dbPath);
43− m_db.setDatabaseName(dbPath + "windowstatestorage.sqlite");
44− initdb();
45−}
46
35
47−WindowStateStorage::~WindowStateStorage()
36+public:
48−{
37+ AsyncQuery(const QString &dbName):
49− QFutureSynchronizer<void> futureSync;
38+ m_dbName(dbName)
50− for (int i = 0; i < m_asyncQueries.count(); ++i) {
39+ {
51− futureSync.addFuture(m_asyncQueries[i]);
52 }
40 }
53− futureSync.waitForFinished();
54− m_db.close();
55−}
56
41
57−void WindowStateStorage::saveState(const QString &windowId, WindowStateStorage::WindowState state)
42+ ~AsyncQuery()
58−{
43+ {
59− const QString queryString = QStringLiteral("INSERT OR REPLACE INTO state (windowId, state) values ('%1', '%2');")
44+ QSqlDatabase::removeDatabase(m_connectionName);
60− .arg(sanitiseString(windowId))
45+ }
61− .arg((int)state);
62
46
63− saveValue(queryString);
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();
64−}
54+ }
65
55
66−WindowStateStorage::WindowState WindowStateStorage::getState(const QString &windowId, WindowStateStorage::WindowState defaultValue) const
56+ Q_INVOKABLE bool initdb()
67−{
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"))) {
68− const QString queryString = QStringLiteral("SELECT state FROM state WHERE windowId = '%1';")
79+ QString stateQuery = QStringLiteral("CREATE TABLE state(windowId TEXT UNIQUE, state INTEGER);");
69− .arg(sanitiseString(windowId));
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+ }
70
96
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);
71− QSqlQuery query = getValue(queryString);
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+ }
72
163
73− if (!query.first()) {
74− return defaultValue;
75 }
164 }
76− return (WindowState)query.value(QStringLiteral("state")).toInt();
77−}
78
165
79−void WindowStateStorage::saveGeometry(const QString &windowId, const QRect &rect)
166+ Q_INVOKABLE int getStage(const QString &appId) const
80−{
167+ {
81− const QString queryString = QStringLiteral("INSERT OR REPLACE INTO geometry (windowId, x, y, width, height) values ('%1', '%2', '%3', '%4', '%5');")
168+ if (!m_ok) {
82− .arg(sanitiseString(windowId))
169+ return -1;
83− .arg(rect.x())
170+ }
84− .arg(rect.y())
171+ QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
85− .arg(rect.width())
172+ QSqlQuery query(connection);
86− .arg(rect.height());
173+ query.prepare(m_getStageQuery);
87−
174+ query.bindValue(":appId", appId);
88− saveValue(queryString);
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+ }
89−}
192+ }
90
193
91−void WindowStateStorage::saveStage(const QString &appId, int stage)
194+public Q_SLOTS:
195+
196+ void saveState(const QString &windowId, WindowStateStorage::WindowState state)
92−{
197+ {
93− const QString queryString = QStringLiteral("INSERT OR REPLACE INTO stage (appId, stage) values ('%1', '%2');")
198+ if (!m_ok) {
94− .arg(sanitiseString(appId))
199+ return;
95− .arg(stage);
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+ }
96
210
97− saveValue(queryString);
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+ }
98−}
227+ }
99
228
100−int WindowStateStorage::getStage(const QString &appId, int defaultValue) const
229+ void saveStage(const QString &appId, int stage)
101−{
230+ {
102− const QString queryString = QStringLiteral("SELECT stage FROM stage WHERE appId = '%1';")
231+ if (!m_ok) {
103− .arg(sanitiseString(appId));
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+ }
104
243
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+ }
106
259
107− if (!query.first()) {
260+ QString m_dbName;
108− return defaultValue;
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;
109 }
285 }
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);
111}
298}
112
299
113−void WindowStateStorage::executeAsyncQuery(const QString &queryString)
300+WindowStateStorage::~WindowStateStorage()
114{
301{
115− QMutexLocker l(&s_mutex);
302+ m_thread.quit();
116− QSqlQuery query;
303+ m_thread.wait();
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− }
124}
304}
125
305
126−QRect WindowStateStorage::getGeometry(const QString &windowId, const QRect &defaultValue) const
306+WindowStateStorage::WindowState WindowStateStorage::getState(const QString &windowId, WindowStateStorage::WindowState defaultValue) const
127{
307{
128− QString queryString = QStringLiteral("SELECT * FROM geometry WHERE windowId = '%1';")
308+ int state;
129− .arg(sanitiseString(windowId));
130
309
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+ );
132
314
133− if (!query.first()) {
315+ if (state == -1) {
134 return defaultValue;
316 return defaultValue;
135 }
317 }
136
318
137− const QRect result(query.value(QStringLiteral("x")).toInt(), query.value(QStringLiteral("y")).toInt(),
319+ return (WindowState)state;
138− query.value(QStringLiteral("width")).toInt(), query.value(QStringLiteral("height")).toInt());
139−
140− if (result.isValid()) {
141− return result;
142− }
143−
144− return defaultValue;
145}
320}
146
321
147−void WindowStateStorage::initdb()
322+int WindowStateStorage::getStage(const QString &appId, int defaultValue) const
148{
323{
149− m_db.open();
324+ int stage;
150− if (!m_db.open()) {
151− qWarning() << "Error opening state database:" << m_db.lastError().driverText() << m_db.lastError().databaseText();
152− return;
153− }
154
325
155− if (!m_db.tables().contains(QStringLiteral("geometry"))) {
326+ QMetaObject::invokeMethod(m_asyncQuery, "getStage", Qt::BlockingQueuedConnection,
156− QSqlQuery query;
327+ Q_RETURN_ARG(int, stage),
157− query.exec(QStringLiteral("CREATE TABLE geometry(windowId TEXT UNIQUE, x INTEGER, y INTEGER, width INTEGER, height INTEGER);"));
328+ Q_ARG(const QString&, appId)
158− }
329+ );
159
330
160− if (!m_db.tables().contains(QStringLiteral("state"))) {
331+ if (stage == -1) {
161− QSqlQuery query;
332+ return defaultValue;
162− query.exec(QStringLiteral("CREATE TABLE state(windowId TEXT UNIQUE, state INTEGER);"));
163 }
333 }
164
334
165− if (!m_db.tables().contains(QStringLiteral("stage"))) {
335+ return stage;
166− QSqlQuery query;
167− query.exec(QStringLiteral("CREATE TABLE stage(appId TEXT UNIQUE, stage INTEGER);"));
168− }
169}
336}
170
337
171−void WindowStateStorage::saveValue(const QString &queryString)
338+QRect WindowStateStorage::getGeometry(const QString &windowId, const QRect &defaultValue) const
172{
339{
173− QMutexLocker mutexLocker(&s_mutex);
340+ QRect geometry;
174−
341+ QMetaObject::invokeMethod(m_asyncQuery, "getGeometry", Qt::BlockingQueuedConnection,
175− QFuture<void> future = QtConcurrent::run(&m_threadPool, executeAsyncQuery, queryString);
342+ Q_RETURN_ARG(QRect, geometry),
176− m_asyncQueries.append(future);
343+ Q_ARG(const QString&, windowId)
177−
344+ );
178− QFutureWatcher<void> *futureWatcher = new QFutureWatcher<void>();
345+ if (geometry.isNull() || !geometry.isValid()) {
179− futureWatcher->setFuture(future);
346+ return defaultValue;
180− connect(futureWatcher, &QFutureWatcher<void>::finished,
347+ }
181− this,
348+ return geometry;
182− [=](){ m_asyncQueries.removeAll(futureWatcher->future());
183− futureWatcher->deleteLater(); });
184}
349}
185
350
186−QSqlQuery WindowStateStorage::getValue(const QString &queryString) const
351+const QString WindowStateStorage::getDbName()
187{
352{
188− QMutexLocker l(&s_mutex);
353+ QString dbName;
189− QSqlQuery query;
354+ QMetaObject::invokeMethod(m_asyncQuery, "getDbName", Qt::BlockingQueuedConnection,
190−
355+ Q_RETURN_ARG(QString, dbName)
191− bool ok = query.exec(queryString);
356+ );
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;
357+ return QString(dbName);
198}
358}
199
359
200Mir::State WindowStateStorage::toMirState(WindowState state) const
360Mir::State WindowStateStorage::toMirState(WindowState state) const
@@ -219,3 +379,5 @@ Mir::State WindowStateStorage::toMirState(WindowState state) const
219 return Mir::RestoredState;
379 return Mir::RestoredState;
220 }
380 }
221}
381}
382+
383+#include "windowstatestorage.moc"
plugins/Utils/windowstatestorage.h+14−17
@@ -1,5 +1,6 @@
1/*
1/*
2 * Copyright 2015-2016 Canonical Ltd.
2 * Copyright 2015-2016 Canonical Ltd.
3+ * Copyright 2021 UBports Foundation
3 *
4 *
4 * This program is free software; you can redistribute it and/or modify
5 * 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 * it under the terms of the GNU Lesser General Public License as published by
@@ -16,13 +17,16 @@
16
17
17#include <QObject>
18#include <QObject>
18#include <QSqlDatabase>
19#include <QSqlDatabase>
20+#include <QSqlQuery>
19#include <QMutex>
21#include <QMutex>
20#include <QFuture>
22#include <QFuture>
21−#include <QThreadPool>
23+#include <QThread>
22
24
23// unity-api
25// unity-api
24#include <unity/shell/application/Mir.h>
26#include <unity/shell/application/Mir.h>
25
27
28+class AsyncQuery;
29+
26class WindowStateStorage: public QObject
30class WindowStateStorage: public QObject
27{
31{
28 Q_OBJECT
32 Q_OBJECT
@@ -46,32 +50,25 @@ public:
46 Q_DECLARE_FLAGS(WindowStates, WindowState)
50 Q_DECLARE_FLAGS(WindowStates, WindowState)
47 Q_FLAG(WindowStates)
51 Q_FLAG(WindowStates)
48
52
49− WindowStateStorage(QObject *parent = nullptr);
53+ WindowStateStorage(const QString &dbName = QString(), QObject *parent = nullptr);
50 virtual ~WindowStateStorage();
54 virtual ~WindowStateStorage();
51
55
52− Q_INVOKABLE void saveState(const QString &windowId, WindowState state);
53 Q_INVOKABLE WindowState getState(const QString &windowId, WindowState defaultValue) const;
56 Q_INVOKABLE WindowState getState(const QString &windowId, WindowState defaultValue) const;
54
57
55− Q_INVOKABLE void saveGeometry(const QString &windowId, const QRect &rect);
56 Q_INVOKABLE QRect getGeometry(const QString &windowId, const QRect &defaultValue) const;
58 Q_INVOKABLE QRect getGeometry(const QString &windowId, const QRect &defaultValue) const;
57
59
58− Q_INVOKABLE void saveStage(const QString &appId, int stage);
59 Q_INVOKABLE int getStage(const QString &appId, int defaultValue) const;
60 Q_INVOKABLE int getStage(const QString &appId, int defaultValue) const;
60
61
61 Q_INVOKABLE Mir::State toMirState(WindowState state) const;
62 Q_INVOKABLE Mir::State toMirState(WindowState state) const;
62
63
63−private:
64− void initdb();
65−
66− void saveValue(const QString &queryString);
64+ const QString getDbName();
67− QSqlQuery getValue(const QString &queryString) const;
68
65
69− static void executeAsyncQuery(const QString &queryString);
66+Q_SIGNALS:
70− static QMutex s_mutex;
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);
71
70
72− // NB: This is accessed from threads. Make sure to mutex it.
71+private:
73− QSqlDatabase m_db;
72+ QThread m_thread;
74−
73+ AsyncQuery *m_asyncQuery;
75− QList<QFuture<void>> m_asyncQueries;
76− QThreadPool m_threadPool;
77};
74};
plugins/WindowManager/CMakeLists.txt+2−1
@@ -4,6 +4,7 @@ set(WINDOWMANAGER_SRC
4 Window.cpp
4 Window.cpp
5 WindowManagerPlugin.cpp
5 WindowManagerPlugin.cpp
6 WindowMargins.cpp
6 WindowMargins.cpp
7+ InputMethodManager.cpp
7 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
8 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
8 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/Mir.h
9 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/Mir.h
9 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceInterface.h
10 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceInterface.h
@@ -20,6 +21,6 @@ include_directories(
20
21
21add_library(windowmanager-qml SHARED ${WINDOWMANAGER_SRC})
22add_library(windowmanager-qml SHARED ${WINDOWMANAGER_SRC})
22
23
23−qt5_use_modules(windowmanager-qml Qml Quick Gui)
24+target_link_libraries(windowmanager-qml Qt5::Qml Qt5::Quick Qt5::Gui)
24
25
25add_unity8_plugin(WindowManager 0.1 WindowManager TARGETS windowmanager-qml)
26add_unity8_plugin(WindowManager 0.1 WindowManager TARGETS windowmanager-qml)
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 @@
1/*
1/*
2 * Copyright (C) 2016-2017 Canonical, Ltd.
2 * Copyright (C) 2016-2017 Canonical, Ltd.
3+ * Copyright 2019 UBports Foundation
3 *
4 *
4 * This program is free software: you can redistribute it and/or modify it under
5 * 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 terms of the GNU Lesser General Public License version 3, as published by
@@ -29,6 +30,7 @@
29
30
30// local
31// local
31#include "Window.h"
32#include "Window.h"
33+#include "InputMethodManager.h"
32
34
33Q_LOGGING_CATEGORY(TOPLEVELWINDOWMODEL, "toplevelwindowmodel", QtInfoMsg)
35Q_LOGGING_CATEGORY(TOPLEVELWINDOWMODEL, "toplevelwindowmodel", QtInfoMsg)
34
36
@@ -38,7 +40,12 @@ Q_LOGGING_CATEGORY(TOPLEVELWINDOWMODEL, "toplevelwindowmodel", QtInfoMsg)
38namespace unityapi = unity::shell::application;
40namespace unityapi = unity::shell::application;
39
41
40TopLevelWindowModel::TopLevelWindowModel()
42TopLevelWindowModel::TopLevelWindowModel()
43+ : m_nullWindow(createNullWindow()),
44+ m_surfaceManagerBusy(false)
41{
45{
46+ connect(m_nullWindow, &Window::focusedChanged, this, [this] {
47+ Q_EMIT rootFocusChanged();
48+ });
42}
49}
43
50
44void TopLevelWindowModel::setApplicationManager(unityapi::ApplicationManagerInterface* value)
51void TopLevelWindowModel::setApplicationManager(unityapi::ApplicationManagerInterface* value)
@@ -188,9 +195,8 @@ void TopLevelWindowModel::prependSurfaceHelper(unityapi::MirSurfaceInterface *su
188
195
189 prependWindow(window, application);
196 prependWindow(window, application);
190
197
191− if (!surface) {
198+ // Activate the newly-prepended window.
192− activateEmptyWindow(window);
199+ window->activate();
193− }
194
200
195 INFO_MSG << " after " << toString();
201 INFO_MSG << " after " << toString();
196}
202}
@@ -311,10 +317,11 @@ void TopLevelWindowModel::onSurfaceDied(unityapi::MirSurfaceInterface *surface)
311
317
312 auto application = m_windowModel[i].application;
318 auto application = m_windowModel[i].application;
313
319
314− // can't be starting if it already has a surface
320+ DEBUG_MSG << " application->name()=" << application->name()
315− Q_ASSERT(application->state() != unityapi::ApplicationInfoInterface::Starting);
321+ << " application->state()=" << application->state();
316
322
317− if (application->state() == unityapi::ApplicationInfoInterface::Running) {
323+ if (application->state() == unityapi::ApplicationInfoInterface::Running
324+ || application->state() == unityapi::ApplicationInfoInterface::Starting) {
318 m_windowModel[i].removeOnceSurfaceDestroyed = true;
325 m_windowModel[i].removeOnceSurfaceDestroyed = true;
319 } else {
326 } else {
320 // assume it got killed by the out-of-memory daemon.
327 // assume it got killed by the out-of-memory daemon.
@@ -344,7 +351,17 @@ void TopLevelWindowModel::onSurfaceDestroyed(unityapi::MirSurfaceInterface *surf
344
351
345Window *TopLevelWindowModel::createWindow(unityapi::MirSurfaceInterface *surface)
352Window *TopLevelWindowModel::createWindow(unityapi::MirSurfaceInterface *surface)
346{
353{
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+{
348 Window *qmlWindow = new Window(id, this);
365 Window *qmlWindow = new Window(id, this);
349 connectWindow(qmlWindow);
366 connectWindow(qmlWindow);
350 if (surface) {
367 if (surface) {
@@ -435,7 +452,17 @@ void TopLevelWindowModel::removeAt(int index)
435 setFocusedWindow(nullptr);
452 setFocusedWindow(nullptr);
436 }
453 }
437
454
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+
438− INFO_MSG << " after " << toString();
465+ INFO_MSG << " after " << toString() << " apps left " << m_windowModel.count();
439}
466}
440
467
441void TopLevelWindowModel::setInputMethodWindow(Window *window)
468void TopLevelWindowModel::setInputMethodWindow(Window *window)
@@ -446,6 +473,7 @@ void TopLevelWindowModel::setInputMethodWindow(Window *window)
446 }
473 }
447 m_inputMethodWindow = window;
474 m_inputMethodWindow = window;
448 Q_EMIT inputMethodSurfaceChanged(m_inputMethodWindow->surface());
475 Q_EMIT inputMethodSurfaceChanged(m_inputMethodWindow->surface());
476+ InputMethodManager::instance()->setWindow(window);
449}
477}
450
478
451void TopLevelWindowModel::removeInputMethodWindow()
479void TopLevelWindowModel::removeInputMethodWindow()
@@ -454,6 +482,7 @@ void TopLevelWindowModel::removeInputMethodWindow()
454 delete m_inputMethodWindow;
482 delete m_inputMethodWindow;
455 m_inputMethodWindow = nullptr;
483 m_inputMethodWindow = nullptr;
456 Q_EMIT inputMethodSurfaceChanged(nullptr);
484 Q_EMIT inputMethodSurfaceChanged(nullptr);
485+ InputMethodManager::instance()->setWindow(nullptr);
457 }
486 }
458}
487}
459
488
@@ -499,37 +528,6 @@ int TopLevelWindowModel::findIndexOf(const unityapi::MirSurfaceInterface *surfac
499 return -1;
528 return -1;
500}
529}
501
530
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−
533QString TopLevelWindowModel::toString()
531QString TopLevelWindowModel::toString()
534{
532{
535 QString str;
533 QString str;
@@ -643,16 +641,19 @@ void TopLevelWindowModel::setFocusedWindow(Window *window)
643 if (window != m_focusedWindow) {
641 if (window != m_focusedWindow) {
644 INFO_MSG << "(" << window << ")";
642 INFO_MSG << "(" << window << ")";
645
643
646− Window* previousWindow = m_focusedWindow;
644+ m_previousWindow = m_focusedWindow;
647
645
648 m_focusedWindow = window;
646 m_focusedWindow = window;
649 Q_EMIT focusedWindowChanged(m_focusedWindow);
647 Q_EMIT focusedWindowChanged(m_focusedWindow);
650
648
651− if (previousWindow && previousWindow->focused() && !previousWindow->surface()) {
649+ if (m_previousWindow && m_previousWindow->focused() && !m_previousWindow->surface()) {
652 // do it ourselves. miral doesn't know about this window
650 // do it ourselves. miral doesn't know about this window
653− previousWindow->setFocused(false);
651+ m_previousWindow->setFocused(false);
654 }
652 }
655 }
653 }
654+
655+ // Reset
656+ m_pendingActivation = false;
656}
657}
657
658
658unityapi::MirSurfaceInterface* TopLevelWindowModel::inputMethodSurface() const
659unityapi::MirSurfaceInterface* TopLevelWindowModel::inputMethodSurface() const
@@ -696,6 +697,7 @@ void TopLevelWindowModel::move(int from, int to)
696}
697}
697void TopLevelWindowModel::onModificationsStarted()
698void TopLevelWindowModel::onModificationsStarted()
698{
699{
700+ m_surfaceManagerBusy = true;
699}
701}
700
702
701void TopLevelWindowModel::onModificationsEnded()
703void TopLevelWindowModel::onModificationsEnded()
@@ -706,6 +708,7 @@ void TopLevelWindowModel::onModificationsEnded()
706 // reset
708 // reset
707 m_focusedWindowChanged = false;
709 m_focusedWindowChanged = false;
708 m_newlyFocusedWindow = nullptr;
710 m_newlyFocusedWindow = nullptr;
711+ m_surfaceManagerBusy = false;
709}
712}
710
713
711void TopLevelWindowModel::activateTopMostWindowWithoutId(int forbiddenId)
714void TopLevelWindowModel::activateTopMostWindowWithoutId(int forbiddenId)
@@ -716,6 +719,64 @@ void TopLevelWindowModel::activateTopMostWindowWithoutId(int forbiddenId)
716 Window *window = m_windowModel[i].window;
719 Window *window = m_windowModel[i].window;
717 if (window->id() != forbiddenId) {
720 if (window->id() != forbiddenId) {
718 window->activate();
721 window->activate();
722+ break;
719 }
723 }
720 }
724 }
721}
725}
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 @@
1/*
1/*
2 * Copyright (C) 2016-2017 Canonical, Ltd.
2 * Copyright (C) 2016-2017 Canonical, Ltd.
3+ * Copyright 2019 UBports Foundation
3 *
4 *
4 * This program is free software: you can redistribute it and/or modify it under
5 * 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 terms of the GNU Lesser General Public License version 3, as published by
@@ -18,6 +19,7 @@
18#define TOPLEVELWINDOWMODEL_H
19#define TOPLEVELWINDOWMODEL_H
19
20
20#include <QAbstractListModel>
21#include <QAbstractListModel>
22+#include <QAtomicInteger>
21#include <QLoggingCategory>
23#include <QLoggingCategory>
22
24
23#include "WindowManagerGlobal.h"
25#include "WindowManagerGlobal.h"
@@ -86,7 +88,28 @@ class WINDOWMANAGERQML_EXPORT TopLevelWindowModel : public QAbstractListModel
86 The id to be used on the next entry created
88 The id to be used on the next entry created
87 Useful for tests
89 Useful for tests
88 */
90 */
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)
90
113
91public:
114public:
92 /**
115 /**
@@ -122,7 +145,7 @@ public:
122 unity::shell::application::SurfaceManagerInterface *surfaceManager() const { return m_surfaceManager; }
145 unity::shell::application::SurfaceManagerInterface *surfaceManager() const { return m_surfaceManager; }
123 void setSurfaceManager(unity::shell::application::SurfaceManagerInterface*);
146 void setSurfaceManager(unity::shell::application::SurfaceManagerInterface*);
124
147
125− int nextId() const { return m_nextId; }
148+ int nextId() const { return m_nextId.load(); }
126
149
127public:
150public:
128 /**
151 /**
@@ -164,6 +187,19 @@ public:
164 */
187 */
165 Q_INVOKABLE void raiseId(int id);
188 Q_INVOKABLE void raiseId(int id);
166
189
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+
167Q_SIGNALS:
203Q_SIGNALS:
168 void countChanged();
204 void countChanged();
169 void inputMethodSurfaceChanged(unity::shell::application::MirSurfaceInterface* inputMethodSurface);
205 void inputMethodSurfaceChanged(unity::shell::application::MirSurfaceInterface* inputMethodSurface);
@@ -178,7 +214,9 @@ Q_SIGNALS:
178 */
214 */
179 void listChanged();
215 void listChanged();
180
216
181− void nextIdChanged();
217+ void closedAllWindows();
218+
219+ void rootFocusChanged();
182
220
183private Q_SLOTS:
221private Q_SLOTS:
184 void onSurfaceCreated(unity::shell::application::MirSurfaceInterface *surface);
222 void onSurfaceCreated(unity::shell::application::MirSurfaceInterface *surface);
@@ -225,6 +263,8 @@ private:
225 void activateTopMostWindowWithoutId(int forbiddenId);
263 void activateTopMostWindowWithoutId(int forbiddenId);
226
264
227 Window *createWindow(unity::shell::application::MirSurfaceInterface *surface);
265 Window *createWindow(unity::shell::application::MirSurfaceInterface *surface);
266+ Window *createWindowWithId(unity::shell::application::MirSurfaceInterface *surface, int id);
267+ Window *createNullWindow();
228
268
229 struct ModelEntry {
269 struct ModelEntry {
230 ModelEntry() {}
270 ModelEntry() {}
@@ -239,15 +279,15 @@ private:
239 QVector<ModelEntry> m_windowModel;
279 QVector<ModelEntry> m_windowModel;
240 Window* m_inputMethodWindow{nullptr};
280 Window* m_inputMethodWindow{nullptr};
241 Window* m_focusedWindow{nullptr};
281 Window* m_focusedWindow{nullptr};
282+ Window* m_nullWindow;
283+ Window* m_previousWindow{nullptr};
284+ bool m_pendingActivation;
242
285
243− int m_nextId{1};
286+ QAtomicInteger<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};
248
287
249 unity::shell::application::ApplicationManagerInterface* m_applicationManager{nullptr};
288 unity::shell::application::ApplicationManagerInterface* m_applicationManager{nullptr};
250 unity::shell::application::SurfaceManagerInterface *m_surfaceManager{nullptr};
289 unity::shell::application::SurfaceManagerInterface *m_surfaceManager{nullptr};
290+ bool m_surfaceManagerBusy;
251
291
252 enum ModelState {
292 enum ModelState {
253 IdleState,
293 IdleState,
@@ -261,6 +301,8 @@ private:
261 // Valid between modificationsStarted and modificationsEnded
301 // Valid between modificationsStarted and modificationsEnded
262 bool m_focusedWindowChanged{false};
302 bool m_focusedWindowChanged{false};
263 Window *m_newlyFocusedWindow{nullptr};
303 Window *m_newlyFocusedWindow{nullptr};
304+
305+ bool m_closingAllApps{false};
264};
306};
265
307
266#endif // TOPLEVELWINDOWMODEL_H
308#endif // TOPLEVELWINDOWMODEL_H
plugins/WindowManager/Window.cpp+9
@@ -27,6 +27,7 @@ namespace unityapi = unity::shell::application;
27Q_LOGGING_CATEGORY(UNITY_WINDOW, "unity.window", QtWarningMsg)
27Q_LOGGING_CATEGORY(UNITY_WINDOW, "unity.window", QtWarningMsg)
28
28
29#define DEBUG_MSG qCDebug(UNITY_WINDOW).nospace() << qPrintable(toString()) << "::" << __func__
29#define DEBUG_MSG qCDebug(UNITY_WINDOW).nospace() << qPrintable(toString()) << "::" << __func__
30+#define WARNING_MSG qCWarning(UNITY_WINDOW).nospace() << qPrintable(toString()) << "::" << __func__
30
31
31Window::Window(int id, QObject *parent)
32Window::Window(int id, QObject *parent)
32 : QObject(parent)
33 : QObject(parent)
@@ -184,7 +185,15 @@ void Window::setSurface(unityapi::MirSurfaceInterface *surface)
184 setSurface(nullptr);
185 setSurface(nullptr);
185 });
186 });
186
187
188+ // Surface should never be focused at this point!
189+ if (m_surface->focused()) {
190+ WARNING_MSG << "Inital surface is focused!";
191+ }
192+
187 // bring it up to speed
193 // bring it up to speed
194+ if (m_focused) {
195+ m_surface->activate();
196+ }
188 if (m_positionRequested) {
197 if (m_positionRequested) {
189 m_surface->setRequestedPosition(m_requestedPosition);
198 m_surface->setRequestedPosition(m_requestedPosition);
190 }
199 }
plugins/WindowManager/WindowManagerPlugin.cpp+9
@@ -20,14 +20,23 @@
20#include "TopLevelWindowModel.h"
20#include "TopLevelWindowModel.h"
21#include "Window.h"
21#include "Window.h"
22#include "WindowMargins.h"
22#include "WindowMargins.h"
23+#include "InputMethodManager.h"
23
24
24#include <QtQml>
25#include <QtQml>
25
26
27+QObject *inputMethodManager(QQmlEngine *engine, QJSEngine *scriptEngine)
28+{
29+ Q_UNUSED(engine)
30+ Q_UNUSED(scriptEngine)
31+ return InputMethodManager::instance();
32+}
33+
26void WindowManagerPlugin::registerTypes(const char *uri)
34void WindowManagerPlugin::registerTypes(const char *uri)
27{
35{
28 qmlRegisterType<AvailableDesktopArea>(uri, 1, 0, "AvailableDesktopArea");
36 qmlRegisterType<AvailableDesktopArea>(uri, 1, 0, "AvailableDesktopArea");
29 qmlRegisterType<TopLevelWindowModel>(uri, 1, 0, "TopLevelWindowModel");
37 qmlRegisterType<TopLevelWindowModel>(uri, 1, 0, "TopLevelWindowModel");
30 qmlRegisterType<WindowMargins>(uri, 1, 0, "WindowMargins");
38 qmlRegisterType<WindowMargins>(uri, 1, 0, "WindowMargins");
39+ qmlRegisterSingletonType<InputMethodManager>(uri, 1, 0, "InputMethodManager", inputMethodManager);
31
40
32 qRegisterMetaType<Window*>("Window*");
41 qRegisterMetaType<Window*>("Window*");
33
42
plugins/Wizard/CMakeLists.txt+5−2
@@ -10,10 +10,13 @@ add_library(Wizard-qml MODULE
10 timezonemodel.cpp
10 timezonemodel.cpp
11 Status.cpp
11 Status.cpp
12 keyboardLayoutsModel.cpp
12 keyboardLayoutsModel.cpp
13+ Changelog.cpp
13)
14)
14
15
15−qt5_use_modules(Wizard-qml DBus Qml)
16+target_link_libraries(Wizard-qml
17+ Qt5::DBus Qt5::Qml
16−target_link_libraries(Wizard-qml ${GD3_LDFLAGS} ${GLIB_LDFLAGS} ${GEONAMES_LDFLAGS})
18+ ${GD3_LDFLAGS} ${GLIB_LDFLAGS} ${GEONAMES_LDFLAGS}
19+)
17add_unity8_plugin(Wizard 0.1 Wizard TARGETS Wizard-qml)
20add_unity8_plugin(Wizard 0.1 Wizard TARGETS Wizard-qml)
18
21
19set(POLKIT_LIB_DIR "${CMAKE_INSTALL_LOCALSTATEDIR}/lib/polkit-1")
22set(POLKIT_LIB_DIR "${CMAKE_INSTALL_LOCALSTATEDIR}/lib/polkit-1")
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)
46 QSet<QString> disabledPages;
46 QSet<QString> disabledPages;
47 QStringList dataDirs;
47 QStringList dataDirs;
48
48
49− if (getenv("WIZARD_TESTING") != nullptr) {
49+ if (!isRunningInstalled() && getenv("WIZARD_TESTING") == nullptr) {
50− dataDirs = QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation);
51− } else if (!isRunningInstalled()) {
52 dataDirs << qmlDirectory();
50 dataDirs << qmlDirectory();
53 } else {
51 } else {
54 dataDirs = shellDataDirs();
52 dataDirs = shellDataDirs();
@@ -73,8 +71,11 @@ PageList::PageList(QObject *parent)
73 // If there was a system update installed, skip until the last page to just greet the user
71 // If there was a system update installed, skip until the last page to just greet the user
74 QSettings settings;
72 QSettings settings;
75 if (settings.value(QStringLiteral("Wizard/SkipUntilFinishedPage")).toBool()) {
73 if (settings.value(QStringLiteral("Wizard/SkipUntilFinishedPage")).toBool()) {
76− while (m_pages.count() > 1) {
74+ const QString lastPage = m_pages.lastKey();
77− m_pages.erase(m_pages.begin());
75+ Q_FOREACH(const QString &page, m_pages.keys()) {
76+ if (Q_UNLIKELY(page != lastPage)) {
77+ m_pages.remove(page);
78+ }
78 }
79 }
79
80
80 // ... and reset it again for the next run
81 // ... and reset it again for the next run
plugins/Wizard/System.cpp+69−7
@@ -1,4 +1,5 @@
1/*
1/*
2+ * Copyright (C) 2018 The UBports project
2 * Copyright (C) 2014-2016 Canonical Ltd.
3 * Copyright (C) 2014-2016 Canonical Ltd.
3 *
4 *
4 * This program is free software: you can redistribute it and/or modify it
5 * This program is free software: you can redistribute it and/or modify it
@@ -46,29 +47,93 @@ QString System::wizardEnabledPath()
46 return QDir::home().filePath(QStringLiteral(".config/ubuntu-system-settings/wizard-has-run"));
47 return QDir::home().filePath(QStringLiteral(".config/ubuntu-system-settings/wizard-has-run"));
47}
48}
48
49
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+
49bool System::wizardEnabled() const
68bool System::wizardEnabled() const
50{
69{
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+{
51− return !QFile::exists(wizardEnabledPath());
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();
52}
104}
53
105
54void System::setWizardEnabled(bool enabled)
106void System::setWizardEnabled(bool enabled)
55{
107{
56− if (wizardEnabled() == enabled)
108+ if (wizardEnabled() == enabled && !isUpdate())
57 return;
109 return;
58
110
59 if (enabled) {
111 if (enabled) {
60 QFile::remove(wizardEnabledPath());
112 QFile::remove(wizardEnabledPath());
61 } else {
113 } else {
62 QDir(wizardEnabledPath()).mkpath(QStringLiteral(".."));
114 QDir(wizardEnabledPath()).mkpath(QStringLiteral(".."));
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+ }
63− QFile(wizardEnabledPath()).open(QIODevice::WriteOnly);
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+ }
64 m_fsWatcher.addPath(wizardEnabledPath());
127 m_fsWatcher.addPath(wizardEnabledPath());
65 Q_EMIT wizardEnabledChanged();
128 Q_EMIT wizardEnabledChanged();
129+ Q_EMIT isUpdateChanged();
66 }
130 }
67}
131}
68
132
69void System::watcherFileChanged()
133void System::watcherFileChanged()
70{
134{
71 Q_EMIT wizardEnabledChanged();
135 Q_EMIT wizardEnabledChanged();
136+ Q_EMIT isUpdateChanged();
72 m_fsWatcher.removePath(wizardEnabledPath());
137 m_fsWatcher.removePath(wizardEnabledPath());
73}
138}
74
139
@@ -103,13 +168,10 @@ void System::updateSessionLocale(const QString &locale)
103
168
104 // Restart bits of the session to pick up new language.
169 // Restart bits of the session to pick up new language.
105 QProcess::startDetached(QStringLiteral("sh -c \"initctl emit indicator-services-end; \
170 QProcess::startDetached(QStringLiteral("sh -c \"initctl emit indicator-services-end; \
106− initctl stop scope-registry; \
107− initctl stop smart-scopes-proxy; \
108 initctl emit --no-wait indicator-services-start; \
171 initctl emit --no-wait indicator-services-start; \
109 initctl restart --no-wait ubuntu-location-service-trust-stored; \
172 initctl restart --no-wait ubuntu-location-service-trust-stored; \
110 initctl restart --no-wait maliit-server; \
173 initctl restart --no-wait maliit-server; \
111− initctl restart --no-wait indicator-messages; \
174+ initctl restart --no-wait indicator-messages"));
112− initctl restart --no-wait unity8-dash\""));
113}
175}
114
176
115void System::skipUntilFinishedPage()
177void System::skipUntilFinishedPage()
plugins/Wizard/System.h+17
@@ -1,4 +1,5 @@
1/*
1/*
2+ * Copyright (C) 2018 The UBports project
2 * Copyright (C) 2014-2016 Canonical Ltd.
3 * Copyright (C) 2014-2016 Canonical Ltd.
3 *
4 *
4 * This program is free software: you can redistribute it and/or modify it
5 * This program is free software: you can redistribute it and/or modify it
@@ -18,6 +19,7 @@
18#define WIZARD_SYSTEM_H
19#define WIZARD_SYSTEM_H
19
20
20#include <QFileSystemWatcher>
21#include <QFileSystemWatcher>
22+#include <QVersionNumber>
21#include <QObject>
23#include <QObject>
22#include <QString>
24#include <QString>
23
25
@@ -25,12 +27,21 @@ class System : public QObject
25{
27{
26 Q_OBJECT
28 Q_OBJECT
27 Q_PROPERTY(bool wizardEnabled READ wizardEnabled WRITE setWizardEnabled NOTIFY wizardEnabledChanged)
29 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)
28
32
29public:
33public:
30 System();
34 System();
31 ~System() = default;
35 ~System() = default;
32
36
37+ /**
38+ * Checks whether the wizard is enabled for first-run or otherwise.
39+ */
33 bool wizardEnabled() const;
40 bool wizardEnabled() const;
41+
42+ QString version() const;
43+ bool isUpdate() const;
44+
34 void setWizardEnabled(bool enabled);
45 void setWizardEnabled(bool enabled);
35
46
36public Q_SLOTS:
47public Q_SLOTS:
@@ -42,6 +53,8 @@ public Q_SLOTS:
42
53
43Q_SIGNALS:
54Q_SIGNALS:
44 void wizardEnabledChanged();
55 void wizardEnabledChanged();
56+ void versionChanged();
57+ void isUpdateChanged();
45
58
46private Q_SLOTS:
59private Q_SLOTS:
47 void watcherFileChanged();
60 void watcherFileChanged();
@@ -50,7 +63,11 @@ private:
50 Q_DISABLE_COPY(System)
63 Q_DISABLE_COPY(System)
51
64
52 static QString wizardEnabledPath();
65 static QString wizardEnabledPath();
66+ static QString currentFrameworkPath();
53 static void setSessionVariable(const QString &variable, const QString &value);
67 static void setSessionVariable(const QString &variable, const QString &value);
68+ static QString readCurrentFramework();
69+ static QString readWizardEnabled();
70+ static bool wizardPathExists();
54
71
55 QFileSystemWatcher m_fsWatcher;
72 QFileSystemWatcher m_fsWatcher;
56};
73};
plugins/Wizard/Utils/CMakeLists.txt+1−1
@@ -20,7 +20,7 @@ add_library(WizardUtils-qml SHARED
20# files directly in targets.
20# files directly in targets.
21set_target_properties(WizardUtils-qml PROPERTIES COMPILE_FLAGS -fvisibility=default)
21set_target_properties(WizardUtils-qml PROPERTIES COMPILE_FLAGS -fvisibility=default)
22
22
23−qt5_use_modules(WizardUtils-qml DBus Qml Quick)
23+target_link_libraries(WizardUtils-qml Qt5::DBus Qt5::Qml Qt5::Quick)
24
24
25set(PLUG_DIR ${PLUGIN_PRIVATE_MODULE_DIR}/Ubuntu/SystemSettings/Wizard/Utils)
25set(PLUG_DIR ${PLUGIN_PRIVATE_MODULE_DIR}/Ubuntu/SystemSettings/Wizard/Utils)
26install(FILES qmldir DESTINATION ${PLUG_DIR})
26install(FILES qmldir DESTINATION ${PLUG_DIR})
plugins/Wizard/plugin.cpp+2
@@ -20,6 +20,7 @@
20#include "timezonemodel.h"
20#include "timezonemodel.h"
21#include "LocalePlugin.h"
21#include "LocalePlugin.h"
22#include "Status.h"
22#include "Status.h"
23+#include "Changelog.h"
23#include "keyboardLayoutsModel.h"
24#include "keyboardLayoutsModel.h"
24
25
25#include <QtQml/qqml.h>
26#include <QtQml/qqml.h>
@@ -30,6 +31,7 @@ void WizardPlugin::registerTypes(const char *uri)
30 qmlRegisterType<PageList>(uri, 0, 1, "PageList");
31 qmlRegisterType<PageList>(uri, 0, 1, "PageList");
31 qmlRegisterSingletonType<System>(uri, 0, 1, "System", [](QQmlEngine*, QJSEngine*) -> QObject* { return new System; });
32 qmlRegisterSingletonType<System>(uri, 0, 1, "System", [](QQmlEngine*, QJSEngine*) -> QObject* { return new System; });
32 qmlRegisterSingletonType<Status>(uri, 0, 1, "Status", [](QQmlEngine*, QJSEngine*) -> QObject* { return new Status; });
33 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; });
33 qmlRegisterType<TimeZoneLocationModel>(uri, 0, 1, "TimeZoneModel");
35 qmlRegisterType<TimeZoneLocationModel>(uri, 0, 1, "TimeZoneModel");
34 qmlRegisterType<KeyboardLayoutsModel>(uri, 0, 1, "KeyboardLayoutsModel");
36 qmlRegisterType<KeyboardLayoutsModel>(uri, 0, 1, "KeyboardLayoutsModel");
35 qmlRegisterType<LocalePlugin>(uri, 0, 1, "LocalePlugin");
37 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
27 Q_PROPERTY(bool listUpdating READ listUpdating NOTIFY listUpdatingChanged)
27 Q_PROPERTY(bool listUpdating READ listUpdating NOTIFY listUpdatingChanged)
28 Q_PROPERTY(QString filter READ filter WRITE setFilter NOTIFY filterChanged)
28 Q_PROPERTY(QString filter READ filter WRITE setFilter NOTIFY filterChanged)
29 Q_PROPERTY(QString country READ country WRITE setCountry NOTIFY countryChanged)
29 Q_PROPERTY(QString country READ country WRITE setCountry NOTIFY countryChanged)
30+ Q_ENUMS(Roles)
30
31
31public:
32public:
32 explicit TimeZoneLocationModel(QObject *parent = nullptr);
33 explicit TimeZoneLocationModel(QObject *parent = nullptr);
@@ -41,7 +42,6 @@ public:
41 LatitudeRole,
42 LatitudeRole,
42 LongitudeRole
43 LongitudeRole
43 };
44 };
44− Q_ENUM(Roles)
45
45
46 int rowCount(const QModelIndex &parent = QModelIndex()) const override;
46 int rowCount(const QModelIndex &parent = QModelIndex()) const override;
47 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
47 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
po/aa.po+154−257
@@ -6,39 +6,41 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10−"POT-Creation-Date: 2017-04-04 22:56+0000\n"
10+"POT-Creation-Date: 2021-01-29 11:42-0600\n"
11−"PO-Revision-Date: 2016-02-12 10:18+0000\n"
11+"PO-Revision-Date: 2021-03-08 10:42+0000\n"
12−"Last-Translator: Charif AYFARAH <ayfarah@ymail.com>\n"
12+"Last-Translator: TigranKhachatryan0 <tigrank2008@gmail.com>\n"
13−"Language-Team: Afar <aa@li.org>\n"
13+"Language-Team: Afar <https://translate.ubports.com/projects/ubports/lomiri/"
14+"aa/>\n"
15+"Language: aa\n"
14"MIME-Version: 1.0\n"
16"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
18"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
19"Plural-Forms: nplurals=2; plural=n != 1;\n"
20+"X-Generator: Weblate 3.11.3\n"
18−"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
21+"X-Launchpad-Export-Date: 2016-11-23 06:34+0000\n"
19−"X-Generator: Launchpad (build 18343)\n"
20
22
21−#: plugins/LightDM/Greeter.cpp:188
23+#: plugins/LightDM/Greeter.cpp:199
22msgid "Password: "
24msgid "Password: "
23−msgstr "Cuumita "
25+msgstr ""
24
26
25−#: plugins/LightDM/Greeter.cpp:203
27+#: plugins/LightDM/Greeter.cpp:214
26msgid "Username"
28msgid "Username"
27msgstr ""
29msgstr ""
28
30
29−#: plugins/LightDM/Greeter.cpp:242
31+#: plugins/LightDM/Greeter.cpp:258
30msgid "Failed to authenticate"
32msgid "Failed to authenticate"
31msgstr ""
33msgstr ""
32
34
33−#: plugins/LightDM/Greeter.cpp:244
35+#: plugins/LightDM/Greeter.cpp:260
34msgid "Invalid password, please try again"
36msgid "Invalid password, please try again"
35msgstr ""
37msgstr ""
36
38
37−#: plugins/LightDM/Greeter.cpp:254
39+#: plugins/LightDM/Greeter.cpp:270
38msgid "Log In"
40msgid "Log In"
39msgstr ""
41msgstr ""
40
42
41−#: plugins/LightDM/Greeter.cpp:254
43+#: plugins/LightDM/Greeter.cpp:270
42msgid "Retry"
44msgid "Retry"
43msgstr "Qagis"
45msgstr "Qagis"
44
46
@@ -50,16 +52,16 @@ msgstr ""
50msgid "Guest Session"
52msgid "Guest Session"
51msgstr ""
53msgstr ""
52
54
53−#: plugins/Unity/Launcher/launcheritem.cpp:49
55+#: plugins/Unity/Launcher/launcheritem.cpp:48
54−#: plugins/Unity/Launcher/launcheritem.cpp:123
56+#: plugins/Unity/Launcher/launcheritem.cpp:122
55msgid "Pin shortcut"
57msgid "Pin shortcut"
56msgstr ""
58msgstr ""
57
59
58−#: plugins/Unity/Launcher/launcheritem.cpp:55
60+#: plugins/Unity/Launcher/launcheritem.cpp:54
59msgid "Quit"
61msgid "Quit"
60msgstr "Kat"
62msgstr "Kat"
61
63
62−#: plugins/Unity/Launcher/launcheritem.cpp:123
64+#: plugins/Unity/Launcher/launcheritem.cpp:122
63msgid "Unpin shortcut"
65msgid "Unpin shortcut"
64msgstr ""
66msgstr ""
65
67
@@ -82,9 +84,8 @@ msgctxt "Button: Log out from the system"
82msgid "Log Out"
84msgid "Log Out"
83msgstr "Eweq"
85msgstr "Eweq"
84
86
85−#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
87+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:284
86−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
87−#: qml/Wizard/Pages/passcode-confirm.qml:32
88+#: qml/Greeter/NarrowView.qml:215 qml/Wizard/Pages/passcode-confirm.qml:32
88#: qml/Wizard/Pages/passcode-set.qml:32
89#: qml/Wizard/Pages/passcode-set.qml:32
89msgid "Cancel"
90msgid "Cancel"
90msgstr "Bayis"
91msgstr "Bayis"
@@ -106,33 +107,37 @@ msgstr "Maleey"
106msgid "Yes"
107msgid "Yes"
107msgstr "Yeey"
108msgstr "Yeey"
108
109
109−#: qml/Components/Dialogs.qml:239
110+#: qml/Components/Dialogs.qml:243
110msgctxt "Title: Power off/Restart dialog"
111msgctxt "Title: Power off/Restart dialog"
111msgid "Power"
112msgid "Power"
112msgstr "Cayla"
113msgstr "Cayla"
113
114
114−#: qml/Components/Dialogs.qml:240
115+#: qml/Components/Dialogs.qml:244
115msgid ""
116msgid ""
116"Are you sure you would like\n"
117"Are you sure you would like\n"
117"to power off?"
118"to power off?"
118msgstr "Timmi haytuh digga maay litoo?"
119msgstr "Timmi haytuh digga maay litoo?"
119
120
120−#: qml/Components/Dialogs.qml:244
121+#: qml/Components/Dialogs.qml:248
121msgctxt "Button: Power off the system"
122msgctxt "Button: Power off the system"
122msgid "Power off"
123msgid "Power off"
123msgstr "Timmi hayis"
124msgstr "Timmi hayis"
124
125
125−#: qml/Components/Dialogs.qml:255
126+#: qml/Components/Dialogs.qml:263
126msgctxt "Button: Restart the system"
127msgctxt "Button: Restart the system"
127msgid "Restart"
128msgid "Restart"
128msgstr "Wadir-qimbis"
129msgstr "Wadir-qimbis"
129
130
131+#: qml/Components/Dialogs.qml:276
132+msgid "Screenshot"
133+msgstr ""
134+
130#: qml/Components/KeyboardShortcutsOverlay.qml:41
135#: qml/Components/KeyboardShortcutsOverlay.qml:41
131msgid "Keyboard Shortcuts"
136msgid "Keyboard Shortcuts"
132msgstr ""
137msgstr ""
133
138
134#: qml/Components/KeyboardShortcutsOverlay.qml:55
139#: qml/Components/KeyboardShortcutsOverlay.qml:55
135−msgid "Unity 8"
140+msgid "Lomiri"
136msgstr ""
141msgstr ""
137
142
138#: qml/Components/KeyboardShortcutsOverlay.qml:62
143#: qml/Components/KeyboardShortcutsOverlay.qml:62
@@ -219,18 +224,6 @@ msgstr ""
219msgid "Opens the Application Drawer."
224msgid "Opens the Application Drawer."
220msgstr ""
225msgstr ""
221
226
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−
234#: qml/Components/KeyboardShortcutsOverlay.qml:235
227#: qml/Components/KeyboardShortcutsOverlay.qml:235
235msgid "Switching"
228msgid "Switching"
236msgstr ""
229msgstr ""
@@ -303,7 +296,7 @@ msgstr ""
303msgid "Closes the current window."
296msgid "Closes the current window."
304msgstr ""
297msgstr ""
305
298
306−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
299+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:235
307msgid "Return to Call"
300msgid "Return to Call"
308msgstr "Seecol gacis"
301msgstr "Seecol gacis"
309
302
@@ -377,103 +370,6 @@ msgstr ""
377msgid "Find more settings in the system settings."
370msgid "Find more settings in the system settings."
378msgstr ""
371msgstr ""
379
372
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−
477#: qml/Greeter/CoverPage.qml:127
373#: qml/Greeter/CoverPage.qml:127
478msgid "Unlock"
374msgid "Unlock"
479msgstr ""
375msgstr ""
@@ -502,14 +398,18 @@ msgid "Try again"
502msgstr ""
398msgstr ""
503
399
504#: qml/Greeter/Greeter.qml:551
400#: qml/Greeter/Greeter.qml:551
401+#, fuzzy
402+#| msgid "Enter passphrase"
505msgid "Enter passphrase to unlock"
403msgid "Enter passphrase to unlock"
506−msgstr ""
404+msgstr "Tatur-maxco culus"
507
405
508#: qml/Greeter/Greeter.qml:552
406#: qml/Greeter/Greeter.qml:552
407+#, fuzzy
408+#| msgid "Enter passcode"
509msgid "Enter passcode to unlock"
409msgid "Enter passcode to unlock"
510−msgstr ""
410+msgstr "Tatur-mudenta culus"
511
411
512−#: qml/Greeter/NarrowView.qml:228
412+#: qml/Greeter/NarrowView.qml:235
513msgid "Emergency"
413msgid "Emergency"
514msgstr ""
414msgstr ""
515
415
@@ -525,17 +425,19 @@ msgstr ""
525msgid "Select desktop environment"
425msgid "Select desktop environment"
526msgstr ""
426msgstr ""
527
427
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"
529msgid "Search…"
432msgid "Search…"
530−msgstr ""
433+msgstr "Goranto"
531
434
532−#: qml/Launcher/Drawer.qml:129
435+#: qml/Launcher/PullToRefreshScopeStyle.qml:56
533−msgctxt "Apps sorted alphabetically"
534−msgid "A-Z"
436+msgid "Pull to refresh…"
535msgstr ""
437msgstr ""
536
438
537−#: qml/Launcher/MoreAppsHeader.qml:55
439+#: qml/Launcher/PullToRefreshScopeStyle.qml:61
538−msgid "More apps in the store"
440+msgid "Release to refresh…"
539msgstr ""
441msgstr ""
540
442
541#: qml/Notifications/NotificationMenuItemFactory.qml:124
443#: qml/Notifications/NotificationMenuItemFactory.qml:124
@@ -626,13 +528,20 @@ msgid "Call back"
626msgstr ""
528msgstr ""
627
529
628#: qml/Panel/PanelMenuPage.qml:92
530#: qml/Panel/PanelMenuPage.qml:92
531+#, fuzzy
532+#| msgctxt "Button: Go back one page in the Wizard"
533+#| msgid "Back"
629msgid "Back"
534msgid "Back"
630−msgstr ""
535+msgstr "Derre"
631
536
632#: qml/Stage/SideStage.qml:76
537#: qml/Stage/SideStage.qml:76
633msgid "Drag using 3 fingers any application from one window to the other"
538msgid "Drag using 3 fingers any application from one window to the other"
634msgstr ""
539msgstr ""
635
540
541+#: qml/Stage/Stage.qml:671
542+msgid "No running apps"
543+msgstr ""
544+
636#: qml/Tutorial/TutorialLeftLong.qml:49
545#: qml/Tutorial/TutorialLeftLong.qml:49
637msgid "Long swipe from the left edge to open the Application Drawer"
546msgid "Long swipe from the left edge to open the Application Drawer"
638msgstr ""
547msgstr ""
@@ -641,11 +550,11 @@ msgstr ""
641msgid "Short swipe from the left edge to open the launcher"
550msgid "Short swipe from the left edge to open the launcher"
642msgstr ""
551msgstr ""
643
552
644−#: qml/Tutorial/TutorialRight.qml:55
553+#: qml/Tutorial/TutorialRight.qml:54
645msgid "Push your mouse against the right edge to view your open apps"
554msgid "Push your mouse against the right edge to view your open apps"
646msgstr ""
555msgstr ""
647
556
648−#: qml/Tutorial/TutorialRight.qml:56
557+#: qml/Tutorial/TutorialRight.qml:55
649msgid "Swipe from the right edge to view your open apps"
558msgid "Swipe from the right edge to view your open apps"
650msgstr ""
559msgstr ""
651
560
@@ -653,25 +562,41 @@ msgstr ""
653msgid "Swipe from the top edge to access notifications and quick settings"
562msgid "Swipe from the top edge to access notifications and quick settings"
654msgstr ""
563msgstr ""
655
564
656−#: qml/Wizard/Page.qml:54
565+#: qml/Wizard/Page.qml:59
657msgctxt "Button: Go back one page in the Wizard"
566msgctxt "Button: Go back one page in the Wizard"
658msgid "Back"
567msgid "Back"
659msgstr "Derre"
568msgstr "Derre"
660
569
661−#: qml/Wizard/Pages/10-welcome.qml:28
570+#: qml/Wizard/Pages/10-welcome.qml:29
662msgid "Language"
571msgid "Language"
663msgstr ""
572msgstr ""
664
573
665−#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
574+#: qml/Wizard/Pages/10-welcome.qml:176
666−#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
575+#: qml/Wizard/Pages/10-welcome-update.qml:126
576+#: qml/Wizard/Pages/11-changelog.qml:74 qml/Wizard/Pages/20-keyboard.qml:152
667−#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
577+#: qml/Wizard/Pages/30-wifi.qml:214 qml/Wizard/Pages/50-timezone.qml:272
668−#: qml/Wizard/Pages/70-passwd-type.qml:145
578+#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/70-passwd-type.qml:146
669−#: qml/Wizard/Pages/75-report-check.qml:84
670−#: qml/Wizard/Pages/passcode-desktop.qml:142
579+#: qml/Wizard/Pages/passcode-desktop.qml:154
671−#: qml/Wizard/Pages/password-set.qml:142
580+#: qml/Wizard/Pages/password-set.qml:153
672msgid "Next"
581msgid "Next"
673msgstr ""
582msgstr ""
674
583
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+
675#: qml/Wizard/Pages/20-keyboard.qml:31
600#: qml/Wizard/Pages/20-keyboard.qml:31
676msgid "Select Keyboard"
601msgid "Select Keyboard"
677msgstr ""
602msgstr ""
@@ -684,64 +609,33 @@ msgstr ""
684msgid "Keyboard layout"
609msgid "Keyboard layout"
685msgstr ""
610msgstr ""
686
611
687−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
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
688−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
614+#: qml/Wizard/Pages/sim.qml:101
689msgid "Skip"
615msgid "Skip"
690msgstr "Kaqit"
616msgstr "Kaqit"
691
617
692−#: qml/Wizard/Pages/30-wifi.qml:30
618+#: qml/Wizard/Pages/30-wifi.qml:31
693msgid "Connect to Wi‑Fi"
619msgid "Connect to Wi‑Fi"
694msgstr ""
620msgstr ""
695
621
696−#: qml/Wizard/Pages/30-wifi.qml:131
622+#: qml/Wizard/Pages/30-wifi.qml:139
697msgid "Connected"
623msgid "Connected"
698msgstr ""
624msgstr ""
699
625
700−#: qml/Wizard/Pages/30-wifi.qml:164
626+#: qml/Wizard/Pages/30-wifi.qml:172
701msgid "Available Wi-Fi networks"
627msgid "Available Wi-Fi networks"
702msgstr ""
628msgstr ""
703
629
704−#: qml/Wizard/Pages/30-wifi.qml:165
630+#: qml/Wizard/Pages/30-wifi.qml:173
705msgid "No available Wi-Fi networks"
631msgid "No available Wi-Fi networks"
706msgstr ""
632msgstr ""
707
633
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−
740#: qml/Wizard/Pages/50-timezone.qml:30
634#: qml/Wizard/Pages/50-timezone.qml:30
741msgid "Time Zone"
635msgid "Time Zone"
742msgstr ""
636msgstr ""
743
637
744−#: qml/Wizard/Pages/50-timezone.qml:182
638+#: qml/Wizard/Pages/50-timezone.qml:183
745msgid "Enter your city"
639msgid "Enter your city"
746msgstr ""
640msgstr ""
747
641
@@ -749,7 +643,7 @@ msgstr ""
749msgid "Personalize Your Device"
643msgid "Personalize Your Device"
750msgstr ""
644msgstr ""
751
645
752−#: qml/Wizard/Pages/60-account.qml:48
646+#: qml/Wizard/Pages/60-account.qml:54
753msgid "Preferred Name"
647msgid "Preferred Name"
754msgstr ""
648msgstr ""
755
649
@@ -757,81 +651,72 @@ msgstr ""
757msgid "Lock Screen"
651msgid "Lock Screen"
758msgstr ""
652msgstr ""
759
653
760−#: qml/Wizard/Pages/70-passwd-type.qml:102
654+#: qml/Wizard/Pages/70-passwd-type.qml:103
761msgctxt "Label: Type of security method"
655msgctxt "Label: Type of security method"
762msgid "Create new password"
656msgid "Create new password"
763msgstr ""
657msgstr ""
764
658
765−#: qml/Wizard/Pages/70-passwd-type.qml:104
659+#: qml/Wizard/Pages/70-passwd-type.qml:105
766msgctxt "Label: Type of security method"
660msgctxt "Label: Type of security method"
767msgid "Create passcode (numbers only)"
661msgid "Create passcode (numbers only)"
768msgstr ""
662msgstr ""
769
663
770−#: qml/Wizard/Pages/70-passwd-type.qml:106
664+#: qml/Wizard/Pages/70-passwd-type.qml:107
771msgctxt "Label: Type of security method"
665msgctxt "Label: Type of security method"
772msgid "No lock code"
666msgid "No lock code"
773msgstr ""
667msgstr ""
774
668
775−#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
669+#: qml/Wizard/Pages/79-system-update.qml:28
776−msgid "Privacy Policy"
670+msgid "Update Device"
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."
785msgstr ""
671msgstr ""
786
672
787−#: qml/Wizard/Pages/75-report-check.qml:60
673+#: qml/Wizard/Pages/79-system-update.qml:55
788−msgid "Privacy policy"
674+msgid ""
675+"There is a system update available and ready to install. Afterwards, the "
676+"device will automatically restart."
789msgstr ""
677msgstr ""
790
678
791−#: qml/Wizard/Pages/80-finished.qml:89
679+#: qml/Wizard/Pages/79-system-update.qml:76
680+msgctxt "string identifying name of the update"
792−msgid "Welcome to Ubuntu"
681+msgid "Ubuntu Touch system"
793msgstr ""
682msgstr ""
794
683
795−#: qml/Wizard/Pages/80-finished.qml:104
684+#: qml/Wizard/Pages/79-system-update.qml:83
796−msgid "You are ready to use your device now"
685+#, qt-format
686+msgctxt "version of the system update"
687+msgid "Version %1"
797msgstr ""
688msgstr ""
798
689
799−#: qml/Wizard/Pages/80-finished.qml:124
690+#: qml/Wizard/Pages/79-system-update.qml:95
800−msgid "Get Started"
691+msgid "This could take a few minutes..."
801msgstr ""
692msgstr ""
802
693
803−#: qml/Wizard/Pages/here-terms.qml:25
694+#: qml/Wizard/Pages/79-system-update.qml:109
804−msgid "Terms & Conditions"
695+msgid "Install and restart now"
805msgstr ""
696msgstr ""
806
697
807−#: qml/Wizard/Pages/here-terms.qml:69
698+#: qml/Wizard/Pages/80-finished.qml:91
808−msgid "Your device uses positioning technologies provided by HERE."
699+msgid "Welcome Back"
809msgstr ""
700msgstr ""
810
701
811−#: qml/Wizard/Pages/here-terms.qml:81
702+#: qml/Wizard/Pages/80-finished.qml:91
812−msgid ""
703+msgid "Welcome to Ubuntu"
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."
816msgstr ""
704msgstr ""
817
705
818−#: qml/Wizard/Pages/here-terms.qml:93
706+#: qml/Wizard/Pages/80-finished.qml:106
819−msgid ""
707+msgid "You are ready to use your device now"
820−"The information collected is used to analyze the service and to improve the "
821−"use of service, but not to identify you personally."
822msgstr ""
708msgstr ""
823
709
824−#: qml/Wizard/Pages/here-terms.qml:106
710+#: qml/Wizard/Pages/80-finished.qml:126
825−#, qt-format
711+msgid "Continue"
826−msgid "By continuing, you agree to the HERE platform %1 and %2."
827−msgstr ""
712+msgstr "Tatur"
828
713
829−#: qml/Wizard/Pages/here-terms.qml:107
714+#: qml/Wizard/Pages/80-finished.qml:126
830−msgid "Service Terms"
715+msgid "Get Started"
831msgstr ""
716msgstr ""
832
717
833#: qml/Wizard/Pages/passcode-confirm.qml:43
718#: qml/Wizard/Pages/passcode-confirm.qml:43
834−#: qml/Wizard/Pages/passcode-desktop.qml:97
719+#: qml/Wizard/Pages/passcode-desktop.qml:104
835msgid "Confirm passcode"
720msgid "Confirm passcode"
836msgstr ""
721msgstr ""
837
722
@@ -848,24 +733,24 @@ msgstr ""
848msgid "Lock Screen Passcode"
733msgid "Lock Screen Passcode"
849msgstr ""
734msgstr ""
850
735
851−#: qml/Wizard/Pages/passcode-desktop.qml:61
736+#: qml/Wizard/Pages/passcode-desktop.qml:68
852msgid "Enter 4 numbers to setup your passcode"
737msgid "Enter 4 numbers to setup your passcode"
853msgstr ""
738msgstr ""
854
739
855−#: qml/Wizard/Pages/passcode-desktop.qml:77
740+#: qml/Wizard/Pages/passcode-desktop.qml:84
856#: qml/Wizard/Pages/passcode-set.qml:54
741#: qml/Wizard/Pages/passcode-set.qml:54
857msgid "Choose passcode"
742msgid "Choose passcode"
858msgstr ""
743msgstr ""
859
744
860−#: qml/Wizard/Pages/passcode-desktop.qml:127
745+#: qml/Wizard/Pages/passcode-desktop.qml:139
861msgid "Passcode too short"
746msgid "Passcode too short"
862msgstr ""
747msgstr ""
863
748
864−#: qml/Wizard/Pages/passcode-desktop.qml:129
749+#: qml/Wizard/Pages/passcode-desktop.qml:141
865msgid "Passcodes match"
750msgid "Passcodes match"
866msgstr ""
751msgstr ""
867
752
868−#: qml/Wizard/Pages/passcode-desktop.qml:131
753+#: qml/Wizard/Pages/passcode-desktop.qml:143
869msgid "Passcodes do not match"
754msgid "Passcodes do not match"
870msgstr ""
755msgstr ""
871
756
@@ -877,15 +762,15 @@ msgstr ""
877msgid "Lock Screen Password"
762msgid "Lock Screen Password"
878msgstr ""
763msgstr ""
879
764
880−#: qml/Wizard/Pages/password-set.qml:62
765+#: qml/Wizard/Pages/password-set.qml:68
881msgid "Enter at least 8 characters"
766msgid "Enter at least 8 characters"
882msgstr ""
767msgstr ""
883
768
884−#: qml/Wizard/Pages/password-set.qml:74
769+#: qml/Wizard/Pages/password-set.qml:80
885msgid "Choose password"
770msgid "Choose password"
886msgstr ""
771msgstr ""
887
772
888−#: qml/Wizard/Pages/password-set.qml:104
773+#: qml/Wizard/Pages/password-set.qml:110
889msgid "Confirm password"
774msgid "Confirm password"
890msgstr ""
775msgstr ""
891
776
@@ -941,6 +826,28 @@ msgstr ""
941msgid "Very weak password"
826msgid "Very weak password"
942msgstr ""
827msgstr ""
943
828
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+
944#~ msgctxt "Title: Reboot/Shut down dialog"
851#~ msgctxt "Title: Reboot/Shut down dialog"
945#~ msgid "Shut down"
852#~ msgid "Shut down"
946#~ msgstr "Bargus"
853#~ msgstr "Bargus"
@@ -956,16 +863,9 @@ msgstr ""
956#~ msgid "Reboot"
863#~ msgid "Reboot"
957#~ msgstr "Wadir-ugus"
864#~ msgstr "Wadir-ugus"
958
865
959−#, qt-format
960#~ msgid "Enter %1"
866#~ msgid "Enter %1"
961#~ msgstr "%1 culus"
867#~ msgstr "%1 culus"
962
868
963−#~ msgid "Enter passphrase"
964−#~ msgstr "Tatur-maxco culus"
965−
966−#~ msgid "Enter passcode"
967−#~ msgstr "Tatur-mudenta culus"
968−
969#~ msgctxt "Label: Type of security method"
869#~ msgctxt "Label: Type of security method"
970#~ msgid "Swipe"
870#~ msgid "Swipe"
971#~ msgstr "Uysuttuc"
871#~ msgstr "Uysuttuc"
@@ -978,6 +878,3 @@ msgstr ""
978
878
979#~ msgid "Let’s get started."
879#~ msgid "Let’s get started."
980#~ msgstr "Hayya qimbisnay."
880#~ msgstr "Hayya qimbisnay."
981−
982−#~ msgid "Continue"
983−#~ msgstr "Tatur"
po/am.po+368−334
@@ -6,39 +6,41 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10−"POT-Creation-Date: 2017-04-04 22:56+0000\n"
10+"POT-Creation-Date: 2021-01-29 11:42-0600\n"
11−"PO-Revision-Date: 2017-01-26 15:04+0000\n"
11+"PO-Revision-Date: 2021-08-29 20:18+0000\n"
12−"Last-Translator: samson <Unknown>\n"
12+"Last-Translator: Samson <sambelet@yahoo.com>\n"
13−"Language-Team: Amharic <am@li.org>\n"
13+"Language-Team: Amharic <https://translate.ubports.com/projects/ubports/"
14+"lomiri/am/>\n"
15+"Language: am\n"
14"MIME-Version: 1.0\n"
16"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
18"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
19"Plural-Forms: nplurals=2; plural=n > 1;\n"
20+"X-Generator: Weblate 3.11.3\n"
18−"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
21+"X-Launchpad-Export-Date: 2016-11-23 06:34+0000\n"
19−"X-Generator: Launchpad (build 18343)\n"
20
22
21−#: plugins/LightDM/Greeter.cpp:188
23+#: plugins/LightDM/Greeter.cpp:199
22msgid "Password: "
24msgid "Password: "
23msgstr "የ መግቢያ ቃል: "
25msgstr "የ መግቢያ ቃል: "
24
26
25−#: plugins/LightDM/Greeter.cpp:203
27+#: plugins/LightDM/Greeter.cpp:214
26msgid "Username"
28msgid "Username"
27msgstr "የ ተጠቃሚ ስም"
29msgstr "የ ተጠቃሚ ስም"
28
30
29−#: plugins/LightDM/Greeter.cpp:242
31+#: plugins/LightDM/Greeter.cpp:258
30msgid "Failed to authenticate"
32msgid "Failed to authenticate"
31msgstr "ማረጋገጥ አልተቻለም"
33msgstr "ማረጋገጥ አልተቻለም"
32
34
33−#: plugins/LightDM/Greeter.cpp:244
35+#: plugins/LightDM/Greeter.cpp:260
34msgid "Invalid password, please try again"
36msgid "Invalid password, please try again"
35−msgstr "እባክዎን እንደገና ይሞክሩ ዋጋ የሌለው የመግቢያ ቃል"
37+msgstr "ዋጋ የሌለው የ መግቢያ ቃል: እባክዎን እንደገና ይሞክሩ"
36
38
37−#: plugins/LightDM/Greeter.cpp:254
39+#: plugins/LightDM/Greeter.cpp:270
38msgid "Log In"
40msgid "Log In"
39msgstr "መግቢያ"
41msgstr "መግቢያ"
40
42
41−#: plugins/LightDM/Greeter.cpp:254
43+#: plugins/LightDM/Greeter.cpp:270
42msgid "Retry"
44msgid "Retry"
43msgstr "እንደገና ይሞክሩ"
45msgstr "እንደገና ይሞክሩ"
44
46
@@ -50,16 +52,16 @@ msgstr "መግቢያ"
50msgid "Guest Session"
52msgid "Guest Session"
51msgstr "የ እንግዳ ክፍለ ጊዜ"
53msgstr "የ እንግዳ ክፍለ ጊዜ"
52
54
53−#: plugins/Unity/Launcher/launcheritem.cpp:49
55+#: plugins/Unity/Launcher/launcheritem.cpp:48
54−#: plugins/Unity/Launcher/launcheritem.cpp:123
56+#: plugins/Unity/Launcher/launcheritem.cpp:122
55msgid "Pin shortcut"
57msgid "Pin shortcut"
56msgstr "አቋራጭ ማጣበቂያ"
58msgstr "አቋራጭ ማጣበቂያ"
57
59
58−#: plugins/Unity/Launcher/launcheritem.cpp:55
60+#: plugins/Unity/Launcher/launcheritem.cpp:54
59msgid "Quit"
61msgid "Quit"
60msgstr "ማጥፊያ"
62msgstr "ማጥፊያ"
61
63
62−#: plugins/Unity/Launcher/launcheritem.cpp:123
64+#: plugins/Unity/Launcher/launcheritem.cpp:122
63msgid "Unpin shortcut"
65msgid "Unpin shortcut"
64msgstr "አቋራጭ መለያያ"
66msgstr "አቋራጭ መለያያ"
65
67
@@ -82,9 +84,8 @@ msgctxt "Button: Log out from the system"
82msgid "Log Out"
84msgid "Log Out"
83msgstr "መውጫ"
85msgstr "መውጫ"
84
86
85−#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
87+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:284
86−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
87−#: qml/Wizard/Pages/passcode-confirm.qml:32
88+#: qml/Greeter/NarrowView.qml:215 qml/Wizard/Pages/passcode-confirm.qml:32
88#: qml/Wizard/Pages/passcode-set.qml:32
89#: qml/Wizard/Pages/passcode-set.qml:32
89msgid "Cancel"
90msgid "Cancel"
90msgstr "መሰረዣ"
91msgstr "መሰረዣ"
@@ -106,12 +107,12 @@ msgstr "አይ"
106msgid "Yes"
107msgid "Yes"
107msgstr "አዎ"
108msgstr "አዎ"
108
109
109−#: qml/Components/Dialogs.qml:239
110+#: qml/Components/Dialogs.qml:243
110msgctxt "Title: Power off/Restart dialog"
111msgctxt "Title: Power off/Restart dialog"
111msgid "Power"
112msgid "Power"
112msgstr "ሐይል"
113msgstr "ሐይል"
113
114
114−#: qml/Components/Dialogs.qml:240
115+#: qml/Components/Dialogs.qml:244
115msgid ""
116msgid ""
116"Are you sure you would like\n"
117"Are you sure you would like\n"
117"to power off?"
118"to power off?"
@@ -119,23 +120,27 @@ msgstr ""
119"በእርግጥ ሐይሉን ማጥፋት\n"
120"በእርግጥ ሐይሉን ማጥፋት\n"
120"ይፈልጋሉ?"
121"ይፈልጋሉ?"
121
122
122−#: qml/Components/Dialogs.qml:244
123+#: qml/Components/Dialogs.qml:248
123msgctxt "Button: Power off the system"
124msgctxt "Button: Power off the system"
124msgid "Power off"
125msgid "Power off"
125msgstr "ሐይል ማጥፊያ"
126msgstr "ሐይል ማጥፊያ"
126
127
127−#: qml/Components/Dialogs.qml:255
128+#: qml/Components/Dialogs.qml:263
128msgctxt "Button: Restart the system"
129msgctxt "Button: Restart the system"
129msgid "Restart"
130msgid "Restart"
130msgstr "እንደገና ማስጀመሪያ"
131msgstr "እንደገና ማስጀመሪያ"
131
132
133+#: qml/Components/Dialogs.qml:276
134+msgid "Screenshot"
135+msgstr "መመልከቻ ፎቶ ማንሻ"
136+
132#: qml/Components/KeyboardShortcutsOverlay.qml:41
137#: qml/Components/KeyboardShortcutsOverlay.qml:41
133msgid "Keyboard Shortcuts"
138msgid "Keyboard Shortcuts"
134msgstr "የ ፊደል ገበታ አቋራጮች"
139msgstr "የ ፊደል ገበታ አቋራጮች"
135
140
136#: qml/Components/KeyboardShortcutsOverlay.qml:55
141#: qml/Components/KeyboardShortcutsOverlay.qml:55
137−msgid "Unity 8"
142+msgid "Lomiri"
138−msgstr "Unity 8"
143+msgstr "Lomiri"
139
144
140#: qml/Components/KeyboardShortcutsOverlay.qml:62
145#: qml/Components/KeyboardShortcutsOverlay.qml:62
141msgid "PrtScr"
146msgid "PrtScr"
@@ -151,7 +156,7 @@ msgstr "Alt + PrtScr"
151
156
152#: qml/Components/KeyboardShortcutsOverlay.qml:80
157#: qml/Components/KeyboardShortcutsOverlay.qml:80
153msgid "Takes a screenshot of the current window."
158msgid "Takes a screenshot of the current window."
154−msgstr "የ አሁኑን መስኮት ፎቶ ማንሻ"
159+msgstr "የ አሁኑን መስኮት መመልከቻ ፎቶ ማንሻ"
155
160
156#: qml/Components/KeyboardShortcutsOverlay.qml:88
161#: qml/Components/KeyboardShortcutsOverlay.qml:88
157msgid "Super + Space"
162msgid "Super + Space"
@@ -207,7 +212,7 @@ msgstr "መተግበሪያዎችን በ ማስጀመሪያ መቀየሪያ"
207
212
208#: qml/Components/KeyboardShortcutsOverlay.qml:177
213#: qml/Components/KeyboardShortcutsOverlay.qml:177
209msgid "Super + 1 to 0"
214msgid "Super + 1 to 0"
210−msgstr "Super + 1 ወደ 0"
215+msgstr "Super + 0 እስከ 9"
211
216
212#: qml/Components/KeyboardShortcutsOverlay.qml:182
217#: qml/Components/KeyboardShortcutsOverlay.qml:182
213msgid "Same as clicking on a launcher icon."
218msgid "Same as clicking on a launcher icon."
@@ -219,19 +224,7 @@ msgstr "Super + A"
219
224
220#: qml/Components/KeyboardShortcutsOverlay.qml:195
225#: qml/Components/KeyboardShortcutsOverlay.qml:195
221msgid "Opens the Application Drawer."
226msgid "Opens the Application Drawer."
222−msgstr "መተግበሪያ መክፈቻ"
227+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 "የ ክልል ቤት መክፈቻ"
235
228
236#: qml/Components/KeyboardShortcutsOverlay.qml:235
229#: qml/Components/KeyboardShortcutsOverlay.qml:235
237msgid "Switching"
230msgid "Switching"
@@ -305,7 +298,7 @@ msgstr "Alt + F4"
305msgid "Closes the current window."
298msgid "Closes the current window."
306msgstr "የ አሁኑን መስኮት መዝጊያ"
299msgstr "የ አሁኑን መስኮት መዝጊያ"
307
300
308−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
301+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:235
309msgid "Return to Call"
302msgid "Return to Call"
310msgstr "ወደ ጥሪ መመለሻ"
303msgstr "ወደ ጥሪ መመለሻ"
311
304
@@ -365,116 +358,19 @@ msgstr "የ እርስዎ አካል አሁን ከ ውጪ ማሳያ ጋር ተገ
365
358
366#: qml/Components/VirtualTouchPad.qml:327
359#: qml/Components/VirtualTouchPad.qml:327
367msgid "Tap left button to click."
360msgid "Tap left button to click."
368−msgstr "መታ ያድርጉ በ ግራ ቁልፍ ላይ ለ መጫን"
361+msgstr "የ ግራ ቁልፍ መታ ያድርጉ ለ መጫን"
369
362
370#: qml/Components/VirtualTouchPad.qml:339
363#: qml/Components/VirtualTouchPad.qml:339
371msgid "Tap right button to right click."
364msgid "Tap right button to right click."
372−msgstr "መታ ያድርጉ በ ቀኝ ቁልፍ ላይ ለ መጫን"
365+msgstr "የ ቀኝ ቁልፍ መታ ያድርጉ በ ቀኝ ለ መጫን"
373
366
374#: qml/Components/VirtualTouchPad.qml:351
367#: qml/Components/VirtualTouchPad.qml:351
375msgid "Swipe with two fingers to scroll."
368msgid "Swipe with two fingers to scroll."
376−msgstr "ለ መሽብለል በ ሁለት ጣት ይጥረጉ"
369+msgstr "ለ መሸብለል በ ሁለት ጣቶች ይጥረጉ"
377
370
378#: qml/Components/VirtualTouchPad.qml:396
371#: qml/Components/VirtualTouchPad.qml:396
379msgid "Find more settings in the system settings."
372msgid "Find more settings in the system settings."
380−msgstr "ተጨማሪ ማሰናጃዎችን ያግኙ በ ስርአት ማሰናጃ ውስጥ"
373+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 "እንዲሁም የተገጠሙ"
478
374
479#: qml/Greeter/CoverPage.qml:127
375#: qml/Greeter/CoverPage.qml:127
480msgid "Unlock"
376msgid "Unlock"
@@ -505,13 +401,13 @@ msgstr "እንደገና ይሞክሩ"
505
401
506#: qml/Greeter/Greeter.qml:551
402#: qml/Greeter/Greeter.qml:551
507msgid "Enter passphrase to unlock"
403msgid "Enter passphrase to unlock"
508−msgstr "የ ማለፊያ ሀረግ ያስገቡ ለ መክፈት"
404+msgstr "የ ማለፊያ ሀረግ ያስገቡ"
509
405
510#: qml/Greeter/Greeter.qml:552
406#: qml/Greeter/Greeter.qml:552
511msgid "Enter passcode to unlock"
407msgid "Enter passcode to unlock"
512msgstr "የ ማለፊያ ኮድ ያስገቡ ለ መክፈት"
408msgstr "የ ማለፊያ ኮድ ያስገቡ ለ መክፈት"
513
409
514−#: qml/Greeter/NarrowView.qml:228
410+#: qml/Greeter/NarrowView.qml:235
515msgid "Emergency"
411msgid "Emergency"
516msgstr "ድንገተኛ"
412msgstr "ድንገተኛ"
517
413
@@ -527,18 +423,17 @@ msgstr "ማለፊያ ኮድ"
527msgid "Select desktop environment"
423msgid "Select desktop environment"
528msgstr "የ ዴስክቶፕ አይነት ይምረጡ"
424msgstr "የ ዴስክቶፕ አይነት ይምረጡ"
529
425
530−#: qml/Launcher/Drawer.qml:94
426+#: qml/Launcher/Drawer.qml:250
531msgid "Search…"
427msgid "Search…"
532−msgstr "መፈለጊያ..."
428+msgstr "መፈለጊያ…"
533
429
534−#: qml/Launcher/Drawer.qml:129
430+#: qml/Launcher/PullToRefreshScopeStyle.qml:56
535−msgctxt "Apps sorted alphabetically"
536−msgid "A-Z"
431+msgid "Pull to refresh…"
537−msgstr "A-Z"
432+msgstr "ይሳቡ ለማነቃቃት…"
538
433
539−#: qml/Launcher/MoreAppsHeader.qml:55
434+#: qml/Launcher/PullToRefreshScopeStyle.qml:61
540−msgid "More apps in the store"
435+msgid "Release to refresh…"
541−msgstr "ተጨማሪ መተግበሪያ በ ሱቅ ውስጥ"
436+msgstr "ይልቀቁ ለማነቃቃት…"
542
437
543#: qml/Notifications/NotificationMenuItemFactory.qml:124
438#: qml/Notifications/NotificationMenuItemFactory.qml:124
544msgid "Show password"
439msgid "Show password"
@@ -635,19 +530,25 @@ msgstr "ወደ ኋላ"
635msgid "Drag using 3 fingers any application from one window to the other"
530msgid "Drag using 3 fingers any application from one window to the other"
636msgstr "መጎተቻ 3 ጣቶች በ መጠቀም ማንኛውንም መተግበሪያ ከ አንድ መስኮት ወደ ሌላ"
531msgstr "መጎተቻ 3 ጣቶች በ መጠቀም ማንኛውንም መተግበሪያ ከ አንድ መስኮት ወደ ሌላ"
637
532
533+#: qml/Stage/Stage.qml:671
534+msgid "No running apps"
535+msgstr ""
536+
638#: qml/Tutorial/TutorialLeftLong.qml:49
537#: qml/Tutorial/TutorialLeftLong.qml:49
538+#, fuzzy
539+#| msgid "Long swipe from the left edge to open the Today scope"
639msgid "Long swipe from the left edge to open the Application Drawer"
540msgid "Long swipe from the left edge to open the Application Drawer"
640−msgstr "በረጅሙ ይጥረጉ ከ ግራ ጠርዝ በኩል መተግበሪያ ለ መክፈት ከ መሳቢያ ውስጥ"
541+msgstr "በ ረጅሙ ከ ግራ ጠርዝ በኩል ይጥረጉ የ ዛሬን ክልል ለ መክፈት"
641
542
642#: qml/Tutorial/TutorialLeft.qml:47
543#: qml/Tutorial/TutorialLeft.qml:47
643msgid "Short swipe from the left edge to open the launcher"
544msgid "Short swipe from the left edge to open the launcher"
644msgstr "በ አጭሩ ይጥረጉ ከ ግራ ጠርዝ በኩል ማስጀመሪያውን ለ መክፈት"
545msgstr "በ አጭሩ ይጥረጉ ከ ግራ ጠርዝ በኩል ማስጀመሪያውን ለ መክፈት"
645
546
646−#: qml/Tutorial/TutorialRight.qml:55
547+#: qml/Tutorial/TutorialRight.qml:54
647msgid "Push your mouse against the right edge to view your open apps"
548msgid "Push your mouse against the right edge to view your open apps"
648msgstr "የ እርስዎን አይጥ መጠቆሚያ ወደ ቀኝ ጠርዝ በኩል ያስጠጉ የ ተከፈቱ መተግበሪያዎችን ለ መመልከት"
549msgstr "የ እርስዎን አይጥ መጠቆሚያ ወደ ቀኝ ጠርዝ በኩል ያስጠጉ የ ተከፈቱ መተግበሪያዎችን ለ መመልከት"
649
550
650−#: qml/Tutorial/TutorialRight.qml:56
551+#: qml/Tutorial/TutorialRight.qml:55
651msgid "Swipe from the right edge to view your open apps"
552msgid "Swipe from the right edge to view your open apps"
652msgstr "ከ ቀኝ በኩል ይጥረጉ የ ተከፈቱ መተግበሪያዎችን ለ መመልከት"
553msgstr "ከ ቀኝ በኩል ይጥረጉ የ ተከፈቱ መተግበሪያዎችን ለ መመልከት"
653
554
@@ -655,28 +556,44 @@ msgstr "ከ ቀኝ በኩል ይጥረጉ የ ተከፈቱ መተግበሪያዎ
655msgid "Swipe from the top edge to access notifications and quick settings"
556msgid "Swipe from the top edge to access notifications and quick settings"
656msgstr "ከ ላይ ጠረዝ በኩል ይጥረጉ ማስታወቂያዎች እና በፍጥነት ማሰናጃዎች ጋር ለ መድረስ"
557msgstr "ከ ላይ ጠረዝ በኩል ይጥረጉ ማስታወቂያዎች እና በፍጥነት ማሰናጃዎች ጋር ለ መድረስ"
657
558
658−#: qml/Wizard/Page.qml:54
559+#: qml/Wizard/Page.qml:59
659msgctxt "Button: Go back one page in the Wizard"
560msgctxt "Button: Go back one page in the Wizard"
660msgid "Back"
561msgid "Back"
661msgstr "ወደ ኋላ"
562msgstr "ወደ ኋላ"
662
563
663−#: qml/Wizard/Pages/10-welcome.qml:28
564+#: qml/Wizard/Pages/10-welcome.qml:29
664msgid "Language"
565msgid "Language"
665msgstr "ቋንቋ"
566msgstr "ቋንቋ"
666
567
667−#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
568+#: qml/Wizard/Pages/10-welcome.qml:176
668−#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
569+#: qml/Wizard/Pages/10-welcome-update.qml:126
570+#: qml/Wizard/Pages/11-changelog.qml:74 qml/Wizard/Pages/20-keyboard.qml:152
669−#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
571+#: qml/Wizard/Pages/30-wifi.qml:214 qml/Wizard/Pages/50-timezone.qml:272
670−#: qml/Wizard/Pages/70-passwd-type.qml:145
572+#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/70-passwd-type.qml:146
671−#: qml/Wizard/Pages/75-report-check.qml:84
672−#: qml/Wizard/Pages/passcode-desktop.qml:142
573+#: qml/Wizard/Pages/passcode-desktop.qml:154
673−#: qml/Wizard/Pages/password-set.qml:142
574+#: qml/Wizard/Pages/password-set.qml:153
674msgid "Next"
575msgid "Next"
675msgstr "ይቀጥሉ"
576msgstr "ይቀጥሉ"
676
577
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+
677#: qml/Wizard/Pages/20-keyboard.qml:31
594#: qml/Wizard/Pages/20-keyboard.qml:31
678msgid "Select Keyboard"
595msgid "Select Keyboard"
679−msgstr "ቋንቋ ይምረጡ"
596+msgstr "የ ፊደል ገበታ ይምረጡ"
680
597
681#: qml/Wizard/Pages/20-keyboard.qml:71
598#: qml/Wizard/Pages/20-keyboard.qml:71
682msgid "Keyboard language"
599msgid "Keyboard language"
@@ -686,64 +603,33 @@ msgstr "የ ፊደል ገበታ ቋንቋ"
686msgid "Keyboard layout"
603msgid "Keyboard layout"
687msgstr "የ ፊደል ገበታ አቀራረብ"
604msgstr "የ ፊደል ገበታ አቀራረብ"
688
605
689−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
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
690−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
608+#: qml/Wizard/Pages/sim.qml:101
691msgid "Skip"
609msgid "Skip"
692msgstr "መዝለያ"
610msgstr "መዝለያ"
693
611
694−#: qml/Wizard/Pages/30-wifi.qml:30
612+#: qml/Wizard/Pages/30-wifi.qml:31
695msgid "Connect to Wi‑Fi"
613msgid "Connect to Wi‑Fi"
696msgstr "ወደ ዋይ‑ፋይ መገናኛ"
614msgstr "ወደ ዋይ‑ፋይ መገናኛ"
697
615
698−#: qml/Wizard/Pages/30-wifi.qml:131
616+#: qml/Wizard/Pages/30-wifi.qml:139
699msgid "Connected"
617msgid "Connected"
700msgstr "ተገናኝቷል"
618msgstr "ተገናኝቷል"
701
619
702−#: qml/Wizard/Pages/30-wifi.qml:164
620+#: qml/Wizard/Pages/30-wifi.qml:172
703msgid "Available Wi-Fi networks"
621msgid "Available Wi-Fi networks"
704msgstr "ዝግጁ የ ዋይ-ፋይ ኔትዎርኮች"
622msgstr "ዝግጁ የ ዋይ-ፋይ ኔትዎርኮች"
705
623
706−#: qml/Wizard/Pages/30-wifi.qml:165
624+#: qml/Wizard/Pages/30-wifi.qml:173
707msgid "No available Wi-Fi networks"
625msgid "No available Wi-Fi networks"
708msgstr "ምንም ዝግጁ ዋይ-ፋይ ኔትዎርኮች አልተገኙም"
626msgstr "ምንም ዝግጁ ዋይ-ፋይ ኔትዎርኮች አልተገኙም"
709
627
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−
742#: qml/Wizard/Pages/50-timezone.qml:30
628#: qml/Wizard/Pages/50-timezone.qml:30
743msgid "Time Zone"
629msgid "Time Zone"
744msgstr "የ ሰአት ክልል"
630msgstr "የ ሰአት ክልል"
745
631
746−#: qml/Wizard/Pages/50-timezone.qml:182
632+#: qml/Wizard/Pages/50-timezone.qml:183
747msgid "Enter your city"
633msgid "Enter your city"
748msgstr "የ እርስዎን ከተማ ያስገቡ"
634msgstr "የ እርስዎን ከተማ ያስገቡ"
749
635
@@ -751,7 +637,7 @@ msgstr "የ እርስዎን ከተማ ያስገቡ"
751msgid "Personalize Your Device"
637msgid "Personalize Your Device"
752msgstr "የ እርስዎን አካል የ ግልዎ ያድርጉ"
638msgstr "የ እርስዎን አካል የ ግልዎ ያድርጉ"
753
639
754−#: qml/Wizard/Pages/60-account.qml:48
640+#: qml/Wizard/Pages/60-account.qml:54
755msgid "Preferred Name"
641msgid "Preferred Name"
756msgstr "የመረጡት ስም"
642msgstr "የመረጡት ስም"
757
643
@@ -759,83 +645,75 @@ msgstr "የመረጡት ስም"
759msgid "Lock Screen"
645msgid "Lock Screen"
760msgstr "መመልከቻውን መቆለፊያ"
646msgstr "መመልከቻውን መቆለፊያ"
761
647
762−#: qml/Wizard/Pages/70-passwd-type.qml:102
648+#: qml/Wizard/Pages/70-passwd-type.qml:103
763msgctxt "Label: Type of security method"
649msgctxt "Label: Type of security method"
764msgid "Create new password"
650msgid "Create new password"
765msgstr "አዲስ የ መግቢያ ቃል መፍጠሪያ"
651msgstr "አዲስ የ መግቢያ ቃል መፍጠሪያ"
766
652
767−#: qml/Wizard/Pages/70-passwd-type.qml:104
653+#: qml/Wizard/Pages/70-passwd-type.qml:105
768msgctxt "Label: Type of security method"
654msgctxt "Label: Type of security method"
769msgid "Create passcode (numbers only)"
655msgid "Create passcode (numbers only)"
770msgstr "አዲስ የ ማለፊያ ኮድ መፍጠሪያ (ቁጥር ብቻ)"
656msgstr "አዲስ የ ማለፊያ ኮድ መፍጠሪያ (ቁጥር ብቻ)"
771
657
772−#: qml/Wizard/Pages/70-passwd-type.qml:106
658+#: qml/Wizard/Pages/70-passwd-type.qml:107
773msgctxt "Label: Type of security method"
659msgctxt "Label: Type of security method"
774msgid "No lock code"
660msgid "No lock code"
775msgstr "ምንም መቆለፊያ ኮድ አልተገኘም"
661msgstr "ምንም መቆለፊያ ኮድ አልተገኘም"
776
662
777−#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
663+#: qml/Wizard/Pages/79-system-update.qml:28
778−msgid "Privacy Policy"
664+msgid "Update Device"
779−msgstr "የ ግላዊነት መመሪያ"
665+msgstr "አካሉን ማሻሻያ"
780
666
781−#: qml/Wizard/Pages/75-report-check.qml:26
667+#: qml/Wizard/Pages/79-system-update.qml:55
782−msgid "Help Us Improve"
668+msgid ""
783−msgstr "እንድንሻሻል ይርዱን"
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"
784
686
785−#: qml/Wizard/Pages/75-report-check.qml:59
687+#: qml/Wizard/Pages/79-system-update.qml:95
786−msgid "Improve system performance by sending us crashes and error reports."
688+msgid "This could take a few minutes..."
787−msgstr "የ ስርአቱን አፈጻጸም ለማሻሻል የ ግጭት እና የ ስህተት መልእክቶች ይላኩልን"
689+msgstr "ይህ ትንሽ ደቂቃዎች ይወስዳል..."
788
690
789−#: qml/Wizard/Pages/75-report-check.qml:60
691+#: qml/Wizard/Pages/79-system-update.qml:109
790−msgid "Privacy policy"
692+msgid "Install and restart now"
791−msgstr "የ ግላዊነት መመሪያ"
693+msgstr "መግጠሚያ እና እንደገና ማስጀመሪያ"
792
694
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
794msgid "Welcome to Ubuntu"
700msgid "Welcome to Ubuntu"
795msgstr "እንኳን ደህና መጡ ወደ ኡቡንቱ"
701msgstr "እንኳን ደህና መጡ ወደ ኡቡንቱ"
796
702
797−#: qml/Wizard/Pages/80-finished.qml:104
703+#: qml/Wizard/Pages/80-finished.qml:106
798msgid "You are ready to use your device now"
704msgid "You are ready to use your device now"
799msgstr "የ እርስዎን አካል ለ መጠቀም አሁን ዝግጁ ነው"
705msgstr "የ እርስዎን አካል ለ መጠቀም አሁን ዝግጁ ነው"
800
706
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
802msgid "Get Started"
712msgid "Get Started"
803msgstr "እንጀምር"
713msgstr "እንጀምር"
804
714
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−
837#: qml/Wizard/Pages/passcode-confirm.qml:43
715#: qml/Wizard/Pages/passcode-confirm.qml:43
838−#: qml/Wizard/Pages/passcode-desktop.qml:97
716+#: qml/Wizard/Pages/passcode-desktop.qml:104
839msgid "Confirm passcode"
717msgid "Confirm passcode"
840msgstr "የማለፊያ ኮድ ማረጋገጫ"
718msgstr "የማለፊያ ኮድ ማረጋገጫ"
841
719
@@ -852,24 +730,24 @@ msgstr "እባክዎን እንደገና-ያስገቡ"
852msgid "Lock Screen Passcode"
730msgid "Lock Screen Passcode"
853msgstr "የ መመልከቻው መቆለፊያ የ ማለፊያ ኮድ"
731msgstr "የ መመልከቻው መቆለፊያ የ ማለፊያ ኮድ"
854
732
855−#: qml/Wizard/Pages/passcode-desktop.qml:61
733+#: qml/Wizard/Pages/passcode-desktop.qml:68
856msgid "Enter 4 numbers to setup your passcode"
734msgid "Enter 4 numbers to setup your passcode"
857msgstr "ያስገቡ 4 ቁጥሮች የ እርስዎን የ ማለፊያ ኮድ ለማሰናዳት"
735msgstr "ያስገቡ 4 ቁጥሮች የ እርስዎን የ ማለፊያ ኮድ ለማሰናዳት"
858
736
859−#: qml/Wizard/Pages/passcode-desktop.qml:77
737+#: qml/Wizard/Pages/passcode-desktop.qml:84
860#: qml/Wizard/Pages/passcode-set.qml:54
738#: qml/Wizard/Pages/passcode-set.qml:54
861msgid "Choose passcode"
739msgid "Choose passcode"
862msgstr "የ ማለፊያ ኮድ ይምረጡ"
740msgstr "የ ማለፊያ ኮድ ይምረጡ"
863
741
864−#: qml/Wizard/Pages/passcode-desktop.qml:127
742+#: qml/Wizard/Pages/passcode-desktop.qml:139
865msgid "Passcode too short"
743msgid "Passcode too short"
866msgstr "የ ማለፊያ ኮዱ በጣም አጭር ነው"
744msgstr "የ ማለፊያ ኮዱ በጣም አጭር ነው"
867
745
868−#: qml/Wizard/Pages/passcode-desktop.qml:129
746+#: qml/Wizard/Pages/passcode-desktop.qml:141
869msgid "Passcodes match"
747msgid "Passcodes match"
870msgstr "የ ማለፊያ ኮዶቹ ተመሳሳይ ናቸው"
748msgstr "የ ማለፊያ ኮዶቹ ተመሳሳይ ናቸው"
871
749
872−#: qml/Wizard/Pages/passcode-desktop.qml:131
750+#: qml/Wizard/Pages/passcode-desktop.qml:143
873msgid "Passcodes do not match"
751msgid "Passcodes do not match"
874msgstr "የ ማለፊያ ኮዶቹ አይመሳሰሉም"
752msgstr "የ ማለፊያ ኮዶቹ አይመሳሰሉም"
875
753
@@ -881,15 +759,15 @@ msgstr "የ ማለፊያ ኮድ 4 ባህሪዎች መሆን አለበት"
881msgid "Lock Screen Password"
759msgid "Lock Screen Password"
882msgstr "የ መመልከቻ መቆለፊያ የ መግቢያ ቃል"
760msgstr "የ መመልከቻ መቆለፊያ የ መግቢያ ቃል"
883
761
884−#: qml/Wizard/Pages/password-set.qml:62
762+#: qml/Wizard/Pages/password-set.qml:68
885msgid "Enter at least 8 characters"
763msgid "Enter at least 8 characters"
886msgstr "ያስገቡ ቢያንስ 8 ባህሪዎች"
764msgstr "ያስገቡ ቢያንስ 8 ባህሪዎች"
887
765
888−#: qml/Wizard/Pages/password-set.qml:74
766+#: qml/Wizard/Pages/password-set.qml:80
889msgid "Choose password"
767msgid "Choose password"
890msgstr "የ መግቢያ ቃል ይምረጡ"
768msgstr "የ መግቢያ ቃል ይምረጡ"
891
769
892−#: qml/Wizard/Pages/password-set.qml:104
770+#: qml/Wizard/Pages/password-set.qml:110
893msgid "Confirm password"
771msgid "Confirm password"
894msgstr "የ መግቢያ ቃሉን ያረጋግጡ"
772msgstr "የ መግቢያ ቃሉን ያረጋግጡ"
895
773
@@ -945,6 +823,217 @@ msgstr "ደካማ የ መግቢያ ቃል"
945msgid "Very weak password"
823msgid "Very weak password"
946msgstr "በጣም ደካማ የ መግቢያ ቃል"
824msgstr "በጣም ደካማ የ መግቢያ ቃል"
947
825
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+
948#~ msgid "Top edge"
1037#~ msgid "Top edge"
949#~ msgstr "የላይ ጠርዝ"
1038#~ msgstr "የላይ ጠርዝ"
950
1039
@@ -960,21 +1049,12 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
960#~ msgid "Type or say a command"
1049#~ msgid "Type or say a command"
961#~ msgstr "ትእዛዝ ይናገሩ ወይንም ይጻፉ"
1050#~ msgstr "ትእዛዝ ይናገሩ ወይንም ይጻፉ"
962
1051
963−#~ msgid "Loading. Please Wait..."
964−#~ msgstr "እባክዎን ይቆዩ በመጫን ላይ..."
965−
966−#~ msgid "Speaking..."
967−#~ msgstr "በመናገር ላይ..."
968−
969#~ msgid "Speak Now..."
1052#~ msgid "Speak Now..."
970#~ msgstr "አሁን ይናገሩ..."
1053#~ msgstr "አሁን ይናገሩ..."
971
1054
972#~ msgid "Confirm"
1055#~ msgid "Confirm"
973#~ msgstr "ማረጋገጫ"
1056#~ msgstr "ማረጋገጫ"
974
1057
975−#~ msgid "Search"
976−#~ msgstr "መፈለጊያ"
977−
978#~ msgid "See less"
1058#~ msgid "See less"
979#~ msgstr "አነስተኛ መመልከቻ"
1059#~ msgstr "አነስተኛ መመልከቻ"
980
1060
@@ -1017,7 +1097,6 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
1017#~ msgid "This will be your last attempt."
1097#~ msgid "This will be your last attempt."
1018#~ msgstr "ይህ የመጨረሻ ሙከራዎ ነው"
1098#~ msgstr "ይህ የመጨረሻ ሙከራዎ ነው"
1019
1099
1020−#, qt-format
1021#~ msgid "Sorry, incorrect %1"
1100#~ msgid "Sorry, incorrect %1"
1022#~ msgstr "አዝናለሁ: የተሳሳተ%1"
1101#~ msgstr "አዝናለሁ: የተሳሳተ%1"
1023
1102
@@ -1058,11 +1137,12 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
1058#~ "You have now mastered the edge gestures and can start using the "
1137#~ "You have now mastered the edge gestures and can start using the "
1059#~ "phone<br><br>Tap on the screen to start"
1138#~ "phone<br><br>Tap on the screen to start"
1060#~ msgstr ""
1139#~ msgstr ""
1061−#~ "አሁን የ ጠርዝ እንቅስቃሴን አውቀዋል እና መጀመር ይችላሉ ስልኩን መጠቀም <br><br>መመልከቻውን መታ ያድርጉ ለመጀመር"
1140+#~ "አሁን የ ጠርዝ እንቅስቃሴን አውቀዋል እና መጀመር ይችላሉ ስልኩን መጠቀም <br><br>መመልከቻውን መታ ያድርጉ "
1141+#~ "ለመጀመር"
1062
1142
1063#~ msgid ""
1143#~ msgid ""
1064−#~ "If passcode is entered incorrectly, your phone will conduct a factory reset "
1144+#~ "If passcode is entered incorrectly, your phone will conduct a factory "
1065−#~ "and all personal data will be deleted."
1145+#~ "reset and all personal data will be deleted."
1066#~ msgstr ""
1146#~ msgstr ""
1067#~ "የተሳሳተ የማለፊያ ኮድ ካስገቡ የ እርስዎ ስልክ ወደ ነበረበት ወደ ፋክቶሪው ዘዴ ይመለሳል: እና የ ግል ዳታ በሙሉ "
1147#~ "የተሳሳተ የማለፊያ ኮድ ካስገቡ የ እርስዎ ስልክ ወደ ነበረበት ወደ ፋክቶሪው ዘዴ ይመለሳል: እና የ ግል ዳታ በሙሉ "
1068#~ "ይጠፋል"
1148#~ "ይጠፋል"
@@ -1071,8 +1151,8 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
1071#~ "If passphrase is entered incorrectly, your phone will conduct a factory "
1151#~ "If passphrase is entered incorrectly, your phone will conduct a factory "
1072#~ "reset and all personal data will be deleted."
1152#~ "reset and all personal data will be deleted."
1073#~ msgstr ""
1153#~ msgstr ""
1074−#~ "የተሳሳተ የማለፊያ ሐረግ ካስገቡ የ እርስዎ ስልክ ወደ ነበረበት ወደ ፋክቶሪው ዘዴ ይመለሳል: እና የ ግል ዳታ በሙሉ "
1154+#~ "የተሳሳተ የማለፊያ ሐረግ ካስገቡ የ እርስዎ ስልክ ወደ ነበረበት ወደ ፋክቶሪው ዘዴ ይመለሳል: እና የ ግል ዳታ "
1075−#~ "ይጠፋል"
1155+#~ "በሙሉ ይጠፋል"
1076
1156
1077#~ msgid "Roaming"
1157#~ msgid "Roaming"
1078#~ msgstr "ማዘዋወሪያ"
1158#~ msgstr "ማዘዋወሪያ"
@@ -1080,19 +1160,12 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
1080#~ msgid "Manage Scopes"
1160#~ msgid "Manage Scopes"
1081#~ msgstr "የ ክልል አስተዳዳሪ"
1161#~ msgstr "የ ክልል አስተዳዳሪ"
1082
1162
1083−#, qt-format
1084#~ msgid "Enter %1"
1163#~ msgid "Enter %1"
1085#~ msgstr "ማስገቢያ %1"
1164#~ msgstr "ማስገቢያ %1"
1086
1165
1087#~ msgid "Please re-enter"
1166#~ msgid "Please re-enter"
1088#~ msgstr "እባክዎን እንደገና-ያስገቡ"
1167#~ msgstr "እባክዎን እንደገና-ያስገቡ"
1089
1168
1090−#~ msgid "Enter passphrase"
1091−#~ msgstr "የ ማለፊያ ሀረግ ያስገቡ"
1092−
1093−#~ msgid "Enter passcode"
1094−#~ msgstr "የ ማለፊያ ኮድ ያስገቡ"
1095−
1096#~ msgid "Lock security"
1169#~ msgid "Lock security"
1097#~ msgstr "ደህንነት መቆለፊያ"
1170#~ msgstr "ደህንነት መቆለፊያ"
1098
1171
@@ -1115,7 +1188,8 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
1115#~ "This can be disabled in <b>System Settings</b> under <b>Security &amp; "
1188#~ "This can be disabled in <b>System Settings</b> under <b>Security &amp; "
1116#~ "Privacy</b>"
1189#~ "Privacy</b>"
1117#~ msgstr ""
1190#~ msgstr ""
1118−#~ "ይህን ግልጋሎት ማሰናከል ይችላሉ ከ <b>ስርአት ማሰናጃዎች</b> under <b>Security &amp; Privacy</b>"
1191+#~ "ይህን ግልጋሎት ማሰናከል ይችላሉ ከ <b>ስርአት ማሰናጃዎች</b> under <b>Security &amp; "
1192+#~ "Privacy</b>"
1119
1193
1120#~ msgid "Nice work!"
1194#~ msgid "Nice work!"
1121#~ msgstr "ጥሩ ሰርተዋል!"
1195#~ msgstr "ጥሩ ሰርተዋል!"
@@ -1150,9 +1224,6 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
1150#~ msgid "Let’s get started."
1224#~ msgid "Let’s get started."
1151#~ msgstr "ስራ እንጀምር"
1225#~ msgstr "ስራ እንጀምር"
1152
1226
1153−#~ msgid "Continue"
1154−#~ msgstr "ይቀጥሉ"
1155−
1156#~ msgid "Passphrase must be 4 characters long"
1227#~ msgid "Passphrase must be 4 characters long"
1157#~ msgstr "የ ማለፊያ ሀረግ ቢያንስ 4 ባህሪዎች መሆን አለበት"
1228#~ msgstr "የ ማለፊያ ሀረግ ቢያንስ 4 ባህሪዎች መሆን አለበት"
1158
1229
@@ -1162,11 +1233,9 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
1162#~ msgid "Let the phone detect your location:"
1233#~ msgid "Let the phone detect your location:"
1163#~ msgstr "እባክዎን እርስዎ ያሉበትን አካባቢ ስልኩ እራሱ ይፈልግ:"
1234#~ msgstr "እባክዎን እርስዎ ያሉበትን አካባቢ ስልኩ እራሱ ይፈልግ:"
1164
1235
1165−#, qt-format
1166#~ msgid "〈 %1"
1236#~ msgid "〈 %1"
1167#~ msgstr "〈 %1"
1237#~ msgstr "〈 %1"
1168
1238
1169−#, qt-format
1170#~ msgid "%1 〉"
1239#~ msgid "%1 〉"
1171#~ msgstr "%1 〉"
1240#~ msgstr "%1 〉"
1172
1241
@@ -1183,12 +1252,12 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
1183#~ "Your phone is set up to automatically report errors to Canonical and its "
1252#~ "Your phone is set up to automatically report errors to Canonical and its "
1184#~ "partners, the makers of the operating system."
1253#~ "partners, the makers of the operating system."
1185#~ msgstr ""
1254#~ msgstr ""
1186−#~ "የ እርስዎ ስልክ ራሱ በራሱ የ ስህተት መግለጫዎች ወደ Canonical and its partners, የ መስሪያ ስርአት "
1255+#~ "የ እርስዎ ስልክ ራሱ በራሱ የ ስህተት መግለጫዎች ወደ Canonical and its partners, የ መስሪያ "
1187−#~ "አምራቾች"
1256+#~ "ስርአት አምራቾች"
1188
1257
1189#~ msgid ""
1258#~ msgid ""
1190−#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
1259+#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms "
1191−#~ "conditions</a>."
1260+#~ "and conditions</a>."
1192#~ msgstr "ይህን ምርጫ በመምረጥ ተስማምቻለሁ ከ Nokia HERE <a href='#'>ውሎች እና ሁኔታዎች ጋር</a>."
1261#~ msgstr "ይህን ምርጫ በመምረጥ ተስማምቻለሁ ከ Nokia HERE <a href='#'>ውሎች እና ሁኔታዎች ጋር</a>."
1193
1262
1194#~ msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
1263#~ msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
@@ -1203,9 +1272,6 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
1203#~ msgid "Short swipe from the left edge."
1272#~ msgid "Short swipe from the left edge."
1204#~ msgstr "ከ ግራ ጠርዝ በኩል በትንሹ ይጥረጉ"
1273#~ msgstr "ከ ግራ ጠርዝ በኩል በትንሹ ይጥረጉ"
1205
1274
1206−#~ msgid "Open the launcher"
1207−#~ msgstr "ማስጀመሪያውን መክፈቻ"
1208−
1209#~ msgid "Tap here to continue."
1275#~ msgid "Tap here to continue."
1210#~ msgstr "እዚህ መታ ይድርጉ ለመቀጠል"
1276#~ msgstr "እዚህ መታ ይድርጉ ለመቀጠል"
1211
1277
@@ -1333,40 +1399,8 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
1333#~ msgid "Short or long swipe from the right edge to view your open apps"
1399#~ msgid "Short or long swipe from the right edge to view your open apps"
1334#~ msgstr "በ አጭሩ ወይንም በ ረጅሙ ይጥረጉ ከ ቀኝ ጠረዝ በኩል የ ተከፈቱ መተግበሪያዎችን ለማየት"
1400#~ msgstr "በ አጭሩ ወይንም በ ረጅሙ ይጥረጉ ከ ቀኝ ጠረዝ በኩል የ ተከፈቱ መተግበሪያዎችን ለማየት"
1335
1401
1336−#~ msgid "Long swipe from the left edge to open the Today scope"
1337−#~ msgstr "በ ረጅሙ ከ ግራ ጠርዝ በኩል ይጥረጉ የ ዛሬን ክልል ለ መክፈት"
1338−
1339#~ msgid "Swipe from the left edge to open the launcher"
1402#~ msgid "Swipe from the left edge to open the launcher"
1340#~ msgstr "ከ ግራ ጠርዝ በኩል ይጥረጉ ማስጀመሪያውን ለ መክፈት"
1403#~ msgstr "ከ ግራ ጠርዝ በኩል ይጥረጉ ማስጀመሪያውን ለ መክፈት"
1341
1404
1342#~ msgid "Hover your mouse on the right edge to view your open apps"
1405#~ msgid "Hover your mouse on the right edge to view your open apps"
1343#~ msgstr "የ እርስዎን አይጥ ወደ ቀኝ ጠርዝ በኩል ሲያደርጉ የ ተከፈቱ መተግበሪያዎች መመልከቻ"
1406#~ 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 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10−"POT-Creation-Date: 2017-04-04 22:56+0000\n"
10+"POT-Creation-Date: 2021-01-29 11:42-0600\n"
11−"PO-Revision-Date: 2017-01-14 05:20+0000\n"
11+"PO-Revision-Date: 2021-10-12 07:49+0000\n"
12−"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
12+"Last-Translator: HEROBRINE7GAMER <tapermeerkat77@gmail.com>\n"
13−"Language-Team: Arabic <ar@li.org>\n"
13+"Language-Team: Arabic <https://translate.ubports.com/projects/ubports/lomiri/"
14+"ar/>\n"
15+"Language: ar\n"
14"MIME-Version: 1.0\n"
16"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
18"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
19+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
18−"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
20+"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
21+"X-Generator: Weblate 3.11.3\n"
19−"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
22+"X-Launchpad-Export-Date: 2016-11-23 06:34+0000\n"
20−"X-Generator: Launchpad (build 18343)\n"
21
23
22−#: plugins/LightDM/Greeter.cpp:188
24+#: plugins/LightDM/Greeter.cpp:199
23msgid "Password: "
25msgid "Password: "
24msgstr "كلمة السر: "
26msgstr "كلمة السر: "
25
27
26−#: plugins/LightDM/Greeter.cpp:203
28+#: plugins/LightDM/Greeter.cpp:214
27msgid "Username"
29msgid "Username"
28−msgstr ""
30+msgstr "اسم المستخدم"
29
31
30−#: plugins/LightDM/Greeter.cpp:242
32+#: plugins/LightDM/Greeter.cpp:258
31msgid "Failed to authenticate"
33msgid "Failed to authenticate"
32−msgstr ""
34+msgstr "فشل التحقق"
33
35
34−#: plugins/LightDM/Greeter.cpp:244
36+#: plugins/LightDM/Greeter.cpp:260
35msgid "Invalid password, please try again"
37msgid "Invalid password, please try again"
36−msgstr ""
38+msgstr "كلمة المرور غير صحيحة، الرجاء المحاولة مرة أخرى"
37
39
38−#: plugins/LightDM/Greeter.cpp:254
40+#: plugins/LightDM/Greeter.cpp:270
39msgid "Log In"
41msgid "Log In"
40−msgstr ""
42+msgstr "سجل الدخول"
41
43
42−#: plugins/LightDM/Greeter.cpp:254
44+#: plugins/LightDM/Greeter.cpp:270
43msgid "Retry"
45msgid "Retry"
44−msgstr "إعادة المحاولة"
46+msgstr "حاول مجدداً"
45
47
46#: plugins/LightDM/UsersModel.cpp:157
48#: plugins/LightDM/UsersModel.cpp:157
47msgid "Login"
49msgid "Login"
48−msgstr ""
50+msgstr "سجل الدخول"
49
51
50#: plugins/LightDM/UsersModel.cpp:165
52#: plugins/LightDM/UsersModel.cpp:165
51msgid "Guest Session"
53msgid "Guest Session"
52−msgstr ""
54+msgstr "جلسة ضيف"
53
55
54−#: plugins/Unity/Launcher/launcheritem.cpp:49
56+#: plugins/Unity/Launcher/launcheritem.cpp:48
55−#: plugins/Unity/Launcher/launcheritem.cpp:123
57+#: plugins/Unity/Launcher/launcheritem.cpp:122
56msgid "Pin shortcut"
58msgid "Pin shortcut"
57−msgstr "تثبيت الاختصار"
59+msgstr "ثبت اختصارًا"
58
60
59−#: plugins/Unity/Launcher/launcheritem.cpp:55
61+#: plugins/Unity/Launcher/launcheritem.cpp:54
60msgid "Quit"
62msgid "Quit"
61msgstr "خروج"
63msgstr "خروج"
62
64
63−#: plugins/Unity/Launcher/launcheritem.cpp:123
65+#: plugins/Unity/Launcher/launcheritem.cpp:122
64msgid "Unpin shortcut"
66msgid "Unpin shortcut"
65−msgstr "إزالة تثبيت الاختصار"
67+msgstr "ألغ تثبيت الاختصار"
66
68
67#: qml/Components/Dialogs.qml:176
69#: qml/Components/Dialogs.qml:176
68msgctxt "Title: Lock/Log out dialog"
70msgctxt "Title: Lock/Log out dialog"
69msgid "Log out"
71msgid "Log out"
70−msgstr "خروج"
72+msgstr "اخرج"
71
73
72#: qml/Components/Dialogs.qml:177
74#: qml/Components/Dialogs.qml:177
73msgid "Are you sure you want to log out?"
75msgid "Are you sure you want to log out?"
74−msgstr "هل أنت متأكد من رغبتك في تسجيل الخروج؟"
76+msgstr "أمتأكد أنك تريد تسجيل الخروج ؟"
75
77
76#: qml/Components/Dialogs.qml:180
78#: qml/Components/Dialogs.qml:180
77msgctxt "Button: Lock the system"
79msgctxt "Button: Lock the system"
@@ -81,23 +83,22 @@ msgstr "أوصِد"
81#: qml/Components/Dialogs.qml:191
83#: qml/Components/Dialogs.qml:191
82msgctxt "Button: Log out from the system"
84msgctxt "Button: Log out from the system"
83msgid "Log Out"
85msgid "Log Out"
84−msgstr "خروج"
86+msgstr "اخرج"
85
87
86−#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
88+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:284
87−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
88−#: qml/Wizard/Pages/passcode-confirm.qml:32
89+#: qml/Greeter/NarrowView.qml:215 qml/Wizard/Pages/passcode-confirm.qml:32
89#: qml/Wizard/Pages/passcode-set.qml:32
90#: qml/Wizard/Pages/passcode-set.qml:32
90msgid "Cancel"
91msgid "Cancel"
91−msgstr "إلغاء"
92+msgstr "ألغ"
92
93
93#: qml/Components/Dialogs.qml:211
94#: qml/Components/Dialogs.qml:211
94msgctxt "Title: Reboot dialog"
95msgctxt "Title: Reboot dialog"
95msgid "Reboot"
96msgid "Reboot"
96−msgstr "إعادة التشغيل"
97+msgstr "أعد التشغيل"
97
98
98#: qml/Components/Dialogs.qml:212
99#: qml/Components/Dialogs.qml:212
99msgid "Are you sure you want to reboot?"
100msgid "Are you sure you want to reboot?"
100−msgstr "هل أنت متأكد من رغبتك في إعادة تشغيل الجهاز؟"
101+msgstr "أمتأكد أنك تريد إعادة التشغيل؟"
101
102
102#: qml/Components/Dialogs.qml:215
103#: qml/Components/Dialogs.qml:215
103msgid "No"
104msgid "No"
@@ -107,12 +108,12 @@ msgstr "لا"
107msgid "Yes"
108msgid "Yes"
108msgstr "نعم"
109msgstr "نعم"
109
110
110−#: qml/Components/Dialogs.qml:239
111+#: qml/Components/Dialogs.qml:243
111msgctxt "Title: Power off/Restart dialog"
112msgctxt "Title: Power off/Restart dialog"
112msgid "Power"
113msgid "Power"
113msgstr "الطاقة"
114msgstr "الطاقة"
114
115
115−#: qml/Components/Dialogs.qml:240
116+#: qml/Components/Dialogs.qml:244
116msgid ""
117msgid ""
117"Are you sure you would like\n"
118"Are you sure you would like\n"
118"to power off?"
119"to power off?"
@@ -120,23 +121,27 @@ msgstr ""
120"هل أنت متأكد من رغبتك\n"
121"هل أنت متأكد من رغبتك\n"
121"في إيقاف التشغيل؟"
122"في إيقاف التشغيل؟"
122
123
123−#: qml/Components/Dialogs.qml:244
124+#: qml/Components/Dialogs.qml:248
124msgctxt "Button: Power off the system"
125msgctxt "Button: Power off the system"
125msgid "Power off"
126msgid "Power off"
126−msgstr "إيقاف التشغيل"
127+msgstr "أوقف التشغيل"
127
128
128−#: qml/Components/Dialogs.qml:255
129+#: qml/Components/Dialogs.qml:263
129msgctxt "Button: Restart the system"
130msgctxt "Button: Restart the system"
130msgid "Restart"
131msgid "Restart"
131−msgstr "إعادة التشغيل"
132+msgstr "أعد التشغيل"
133+
134+#: qml/Components/Dialogs.qml:276
135+msgid "Screenshot"
136+msgstr "لقطة شاشة"
132
137
133#: qml/Components/KeyboardShortcutsOverlay.qml:41
138#: qml/Components/KeyboardShortcutsOverlay.qml:41
134msgid "Keyboard Shortcuts"
139msgid "Keyboard Shortcuts"
135msgstr "اختصارات لوحة المفاتيح"
140msgstr "اختصارات لوحة المفاتيح"
136
141
137#: qml/Components/KeyboardShortcutsOverlay.qml:55
142#: qml/Components/KeyboardShortcutsOverlay.qml:55
138−msgid "Unity 8"
143+msgid "Lomiri"
139−msgstr "يونتي 8"
144+msgstr "لوميري"
140
145
141#: qml/Components/KeyboardShortcutsOverlay.qml:62
146#: qml/Components/KeyboardShortcutsOverlay.qml:62
142msgid "PrtScr"
147msgid "PrtScr"
@@ -144,7 +149,7 @@ msgstr "PrtScr"
144
149
145#: qml/Components/KeyboardShortcutsOverlay.qml:67
150#: qml/Components/KeyboardShortcutsOverlay.qml:67
146msgid "Takes a screenshot."
151msgid "Takes a screenshot."
147−msgstr "أخذ لقطة للشاشة"
152+msgstr "خُذ لقطة للشاشة."
148
153
149#: qml/Components/KeyboardShortcutsOverlay.qml:75
154#: qml/Components/KeyboardShortcutsOverlay.qml:75
150msgid "Alt + PrtScr"
155msgid "Alt + PrtScr"
@@ -152,7 +157,7 @@ msgstr "Alt + PrtScr"
152
157
153#: qml/Components/KeyboardShortcutsOverlay.qml:80
158#: qml/Components/KeyboardShortcutsOverlay.qml:80
154msgid "Takes a screenshot of the current window."
159msgid "Takes a screenshot of the current window."
155−msgstr ""
160+msgstr "خُذ لقطة شاشة للنافذة الحالية."
156
161
157#: qml/Components/KeyboardShortcutsOverlay.qml:88
162#: qml/Components/KeyboardShortcutsOverlay.qml:88
158msgid "Super + Space"
163msgid "Super + Space"
@@ -160,7 +165,7 @@ msgstr "Super + Space"
160
165
161#: qml/Components/KeyboardShortcutsOverlay.qml:93
166#: qml/Components/KeyboardShortcutsOverlay.qml:93
162msgid "Switches to next keyboard layout."
167msgid "Switches to next keyboard layout."
163−msgstr "للتحويل إلى مخطط لوحة المفاتيح التالي."
168+msgstr "بدل إلى تخطيط لوحة المفاتيح التالي."
164
169
165#: qml/Components/KeyboardShortcutsOverlay.qml:101
170#: qml/Components/KeyboardShortcutsOverlay.qml:101
166msgid "Super + Shift + Space"
171msgid "Super + Shift + Space"
@@ -168,27 +173,27 @@ msgstr "Super + Shift + Space"
168
173
169#: qml/Components/KeyboardShortcutsOverlay.qml:106
174#: qml/Components/KeyboardShortcutsOverlay.qml:106
170msgid "Switches to previous keyboard layout."
175msgid "Switches to previous keyboard layout."
171−msgstr "للتحويل إلى مخطط لوحة المفاتيح السابق."
176+msgstr "بدل إلى تخطيط لوحة المفاتيح السابق."
172
177
173#: qml/Components/KeyboardShortcutsOverlay.qml:114
178#: qml/Components/KeyboardShortcutsOverlay.qml:114
174msgid "Ctrl + Alt + T"
179msgid "Ctrl + Alt + T"
175−msgstr ""
180+msgstr "Ctrl + Alt + T"
176
181
177#: qml/Components/KeyboardShortcutsOverlay.qml:119
182#: qml/Components/KeyboardShortcutsOverlay.qml:119
178msgid "Starts the Terminal application."
183msgid "Starts the Terminal application."
179−msgstr ""
184+msgstr "شغِل الطرفية."
180
185
181#: qml/Components/KeyboardShortcutsOverlay.qml:131
186#: qml/Components/KeyboardShortcutsOverlay.qml:131
182msgid "Launcher"
187msgid "Launcher"
183−msgstr "شريط بدء التطبيقات"
188+msgstr "مطلق"
184
189
185#: qml/Components/KeyboardShortcutsOverlay.qml:138
190#: qml/Components/KeyboardShortcutsOverlay.qml:138
186msgid "Super (Hold)"
191msgid "Super (Hold)"
187−msgstr "Super (Hold)"
192+msgstr "Super (ضغط مع التعليق)"
188
193
189#: qml/Components/KeyboardShortcutsOverlay.qml:143
194#: qml/Components/KeyboardShortcutsOverlay.qml:143
190msgid "Opens the launcher, displays shortcuts."
195msgid "Opens the launcher, displays shortcuts."
191−msgstr "لفتح شريط بدء التطبيقات، وإظهار الاختصارات."
196+msgstr "يشغل المطلق، ويعرض الاختصارات."
192
197
193#: qml/Components/KeyboardShortcutsOverlay.qml:151
198#: qml/Components/KeyboardShortcutsOverlay.qml:151
194msgid "Alt + F1"
199msgid "Alt + F1"
@@ -196,7 +201,7 @@ msgstr "Alt + F1"
196
201
197#: qml/Components/KeyboardShortcutsOverlay.qml:156
202#: qml/Components/KeyboardShortcutsOverlay.qml:156
198msgid "Opens launcher keyboard navigation mode."
203msgid "Opens launcher keyboard navigation mode."
199−msgstr ""
204+msgstr "فتح وضع التنقل بلوحة المفاتيح المشغلة."
200
205
201#: qml/Components/KeyboardShortcutsOverlay.qml:164
206#: qml/Components/KeyboardShortcutsOverlay.qml:164
202msgid "Super + Tab"
207msgid "Super + Tab"
@@ -204,15 +209,15 @@ msgstr "Super + Tab"
204
209
205#: qml/Components/KeyboardShortcutsOverlay.qml:169
210#: qml/Components/KeyboardShortcutsOverlay.qml:169
206msgid "Switches applications via the launcher."
211msgid "Switches applications via the launcher."
207−msgstr "للتحويل بين التطبيقات عبر شريط بدء التطبيقات."
212+msgstr "انتقل بين التطبيقات عبر المُطلق."
208
213
209#: qml/Components/KeyboardShortcutsOverlay.qml:177
214#: qml/Components/KeyboardShortcutsOverlay.qml:177
210msgid "Super + 1 to 0"
215msgid "Super + 1 to 0"
211−msgstr ""
216+msgstr "Super + 1 to 0"
212
217
213#: qml/Components/KeyboardShortcutsOverlay.qml:182
218#: qml/Components/KeyboardShortcutsOverlay.qml:182
214msgid "Same as clicking on a launcher icon."
219msgid "Same as clicking on a launcher icon."
215−msgstr "نفس إجراء الضغط على أيقونة في الشريط."
220+msgstr "نفس تأثير النقر على أيقونة المطلق."
216
221
217#: qml/Components/KeyboardShortcutsOverlay.qml:190
222#: qml/Components/KeyboardShortcutsOverlay.qml:190
218msgid "Super + A"
223msgid "Super + A"
@@ -220,23 +225,11 @@ msgstr "Super + A"
220
225
221#: qml/Components/KeyboardShortcutsOverlay.qml:195
226#: qml/Components/KeyboardShortcutsOverlay.qml:195
222msgid "Opens the Application Drawer."
227msgid "Opens the Application Drawer."
223−msgstr ""
228+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 ""
236
229
237#: qml/Components/KeyboardShortcutsOverlay.qml:235
230#: qml/Components/KeyboardShortcutsOverlay.qml:235
238msgid "Switching"
231msgid "Switching"
239−msgstr "التبديل"
232+msgstr "يبدل"
240
233
241#: qml/Components/KeyboardShortcutsOverlay.qml:242
234#: qml/Components/KeyboardShortcutsOverlay.qml:242
242msgid "Alt + Tab"
235msgid "Alt + Tab"
@@ -244,27 +237,27 @@ msgstr "Alt + Tab"
244
237
245#: qml/Components/KeyboardShortcutsOverlay.qml:247
238#: qml/Components/KeyboardShortcutsOverlay.qml:247
246msgid "Switches between applications."
239msgid "Switches between applications."
247−msgstr "للتبديل بين التطبيقات المفتوحة."
240+msgstr "يبدل بين التطبيقات."
248
241
249#: qml/Components/KeyboardShortcutsOverlay.qml:255
242#: qml/Components/KeyboardShortcutsOverlay.qml:255
250msgid "Super + W"
243msgid "Super + W"
251−msgstr ""
244+msgstr "Super + W"
252
245
253#: qml/Components/KeyboardShortcutsOverlay.qml:260
246#: qml/Components/KeyboardShortcutsOverlay.qml:260
254msgid "Opens the desktop spread."
247msgid "Opens the desktop spread."
255−msgstr ""
248+msgstr "يفتح وضع سطح المكتب."
256
249
257#: qml/Components/KeyboardShortcutsOverlay.qml:268
250#: qml/Components/KeyboardShortcutsOverlay.qml:268
258msgid "Cursor Left or Right"
251msgid "Cursor Left or Right"
259−msgstr ""
252+msgstr "اتجاه المؤشر لليمين أو اليسار"
260
253
261#: qml/Components/KeyboardShortcutsOverlay.qml:273
254#: qml/Components/KeyboardShortcutsOverlay.qml:273
262msgid "Moves the focus."
255msgid "Moves the focus."
263−msgstr "لنقل التركيز."
256+msgstr "بدّل التركيز."
264
257
265#: qml/Components/KeyboardShortcutsOverlay.qml:285
258#: qml/Components/KeyboardShortcutsOverlay.qml:285
266msgid "Windows"
259msgid "Windows"
267−msgstr "النوافذ"
260+msgstr "نوافذ"
268
261
269#: qml/Components/KeyboardShortcutsOverlay.qml:292
262#: qml/Components/KeyboardShortcutsOverlay.qml:292
270msgid "Ctrl + Super + D"
263msgid "Ctrl + Super + D"
@@ -272,7 +265,7 @@ msgstr "Ctrl + Super + D"
272
265
273#: qml/Components/KeyboardShortcutsOverlay.qml:297
266#: qml/Components/KeyboardShortcutsOverlay.qml:297
274msgid "Minimizes all windows."
267msgid "Minimizes all windows."
275−msgstr "لتصغير جميع النوافذ."
268+msgstr "يصغر كل النوافذ."
276
269
277#: qml/Components/KeyboardShortcutsOverlay.qml:305
270#: qml/Components/KeyboardShortcutsOverlay.qml:305
278msgid "Ctrl + Super + Up"
271msgid "Ctrl + Super + Up"
@@ -280,7 +273,7 @@ msgstr "Ctrl + Super + Up"
280
273
281#: qml/Components/KeyboardShortcutsOverlay.qml:310
274#: qml/Components/KeyboardShortcutsOverlay.qml:310
282msgid "Maximizes the current window."
275msgid "Maximizes the current window."
283−msgstr "لتكبير النافذة الحالية."
276+msgstr "يكبر النافذة الحالية."
284
277
285#: qml/Components/KeyboardShortcutsOverlay.qml:318
278#: qml/Components/KeyboardShortcutsOverlay.qml:318
286msgid "Ctrl + Super + Down"
279msgid "Ctrl + Super + Down"
@@ -288,27 +281,27 @@ msgstr "Ctrl + Super + Down"
288
281
289#: qml/Components/KeyboardShortcutsOverlay.qml:323
282#: qml/Components/KeyboardShortcutsOverlay.qml:323
290msgid "Minimizes or restores the current window."
283msgid "Minimizes or restores the current window."
291−msgstr "لتصغير او استعادة النافذة الحالية."
284+msgstr "يصغر أو يستعيد النافذة الحالية."
292
285
293#: qml/Components/KeyboardShortcutsOverlay.qml:331
286#: qml/Components/KeyboardShortcutsOverlay.qml:331
294msgid "Ctrl + Super + Left or Right"
287msgid "Ctrl + Super + Left or Right"
295−msgstr ""
288+msgstr "Ctrl + Super + Left or Right"
296
289
297#: qml/Components/KeyboardShortcutsOverlay.qml:336
290#: qml/Components/KeyboardShortcutsOverlay.qml:336
298msgid "Semi-maximizes the current window."
291msgid "Semi-maximizes the current window."
299−msgstr ""
292+msgstr "كبر النافذة الحالة جزئيا."
300
293
301#: qml/Components/KeyboardShortcutsOverlay.qml:344
294#: qml/Components/KeyboardShortcutsOverlay.qml:344
302msgid "Alt + F4"
295msgid "Alt + F4"
303−msgstr ""
296+msgstr "Alt + F4"
304
297
305#: qml/Components/KeyboardShortcutsOverlay.qml:349
298#: qml/Components/KeyboardShortcutsOverlay.qml:349
306msgid "Closes the current window."
299msgid "Closes the current window."
307−msgstr ""
300+msgstr "يغلق النافذة الحالية."
308
301
309−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
302+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:235
310msgid "Return to Call"
303msgid "Return to Call"
311−msgstr "العودة إلى المكالمة"
304+msgstr "عُد للمكالمة"
312
305
313#: qml/Components/Lockscreen.qml:212
306#: qml/Components/Lockscreen.qml:212
314msgid "Emergency Call"
307msgid "Emergency Call"
@@ -321,48 +314,48 @@ msgstr "موافق"
321#: qml/Components/MediaServices/VideoPlayerControls.qml:44
314#: qml/Components/MediaServices/VideoPlayerControls.qml:44
322#, qt-format
315#, qt-format
323msgid "%1:%2:%3"
316msgid "%1:%2:%3"
324−msgstr ""
317+msgstr "%1:%2:%3"
325
318
326#: qml/Components/MediaServices/VideoPlayerControls.qml:49
319#: qml/Components/MediaServices/VideoPlayerControls.qml:49
327#, qt-format
320#, qt-format
328msgid "%1:%2"
321msgid "%1:%2"
329−msgstr ""
322+msgstr "%1:%2"
330
323
331#: qml/Components/ModeSwitchWarningDialog.qml:33
324#: qml/Components/ModeSwitchWarningDialog.qml:33
332msgid "Apps may have unsaved data:"
325msgid "Apps may have unsaved data:"
333−msgstr ""
326+msgstr "ربما لم تَحفظ بيانات هذه التطبيقات:"
334
327
335#: qml/Components/ModeSwitchWarningDialog.qml:60
328#: qml/Components/ModeSwitchWarningDialog.qml:60
336msgctxt ""
329msgctxt ""
337"Re-dock means connect the device again to an external screen/mouse/keyboard"
330"Re-dock means connect the device again to an external screen/mouse/keyboard"
338msgid "Re-dock, save your work and close these apps to continue."
331msgid "Re-dock, save your work and close these apps to continue."
339−msgstr ""
332+msgstr "أعد الوصل، احفظ عملك على هذه التطبيقات ثم أغلقها للمتابعة."
340
333
341#: qml/Components/ModeSwitchWarningDialog.qml:67
334#: qml/Components/ModeSwitchWarningDialog.qml:67
342msgid "Or force close now (unsaved data will be lost)."
335msgid "Or force close now (unsaved data will be lost)."
343−msgstr "أو أغلق إجباريا الآن (ستفقد أي بيانات غير محفوظة)."
336+msgstr "أو أغلقها قسريا (ستفقد البيانات غير المحفوظة)."
344
337
345#: qml/Components/ModeSwitchWarningDialog.qml:80
338#: qml/Components/ModeSwitchWarningDialog.qml:80
346msgid "OK, I will reconnect"
339msgid "OK, I will reconnect"
347−msgstr ""
340+msgstr "موافق، سؤعيد الاتصال"
348
341
349#: qml/Components/ModeSwitchWarningDialog.qml:81
342#: qml/Components/ModeSwitchWarningDialog.qml:81
350msgid "Reconnect now!"
343msgid "Reconnect now!"
351−msgstr ""
344+msgstr "أعد الاتصال الآن!"
352
345
353#: qml/Components/ModeSwitchWarningDialog.qml:94
346#: qml/Components/ModeSwitchWarningDialog.qml:94
354msgid "Close all"
347msgid "Close all"
355−msgstr ""
348+msgstr "أغلق الكل"
356
349
357#: qml/Components/SharingPicker.qml:54
350#: qml/Components/SharingPicker.qml:54
358msgid "Preview Share Item"
351msgid "Preview Share Item"
359−msgstr ""
352+msgstr "معاينة الملف المشارك"
360
353
361#: qml/Components/VirtualTouchPad.qml:317
354#: qml/Components/VirtualTouchPad.qml:317
362msgid ""
355msgid ""
363"Your device is now connected to an external display. Use this screen as a "
356"Your device is now connected to an external display. Use this screen as a "
364"touch pad to interact with the pointer."
357"touch pad to interact with the pointer."
365−msgstr ""
358+msgstr "جهازك متصل بجهاز عرض خارجي. استخدم جهازك كلوحة لمس لتحكم بالمؤشر."
366
359
367#: qml/Components/VirtualTouchPad.qml:327
360#: qml/Components/VirtualTouchPad.qml:327
368msgid "Tap left button to click."
361msgid "Tap left button to click."
@@ -370,116 +363,19 @@ msgstr "اضغط الزر الأيسر للنقر."
370
363
371#: qml/Components/VirtualTouchPad.qml:339
364#: qml/Components/VirtualTouchPad.qml:339
372msgid "Tap right button to right click."
365msgid "Tap right button to right click."
373−msgstr "اضغط الزر الأيمن للنقر الأيمن."
366+msgstr "اضغط على الزر الأيمن للنقر."
374
367
375#: qml/Components/VirtualTouchPad.qml:351
368#: qml/Components/VirtualTouchPad.qml:351
376msgid "Swipe with two fingers to scroll."
369msgid "Swipe with two fingers to scroll."
377−msgstr ""
370+msgstr "اسحب بإصبعين للتمرير."
378
371
379#: qml/Components/VirtualTouchPad.qml:396
372#: qml/Components/VirtualTouchPad.qml:396
380msgid "Find more settings in the system settings."
373msgid "Find more settings in the system settings."
381−msgstr "اعثر على مزيد من الإعدادات في إعدادات النظام."
374+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 "أيضا تم تثبيت"
479
375
480#: qml/Greeter/CoverPage.qml:127
376#: qml/Greeter/CoverPage.qml:127
481msgid "Unlock"
377msgid "Unlock"
482−msgstr "فك القفل"
378+msgstr "فك الإيصاد"
483
379
484#: qml/Greeter/DelayedLockscreen.qml:43
380#: qml/Greeter/DelayedLockscreen.qml:43
485msgid "Device Locked"
381msgid "Device Locked"
@@ -499,57 +395,56 @@ msgstr ""
499#, qt-format
395#, qt-format
500msgid "Please wait %1 minute and then try again…"
396msgid "Please wait %1 minute and then try again…"
501msgid_plural "Please wait %1 minutes and then try again…"
397msgid_plural "Please wait %1 minutes and then try again…"
502−msgstr[0] "برجاء الانتظار %1 دقيقة ثم المحاولة مجددًا..."
398+msgstr[0] "برجاء الانتظار %1 دقيقة ثم المحاولة مجددًا…"
503−msgstr[1] "برجاء الانتظار دقيقة واحدة (%1) ثم المحاولة مجددًا..."
399+msgstr[1] "برجاء الانتظار دقيقة واحدة (%1) ثم المحاولة مجددًا…"
504−msgstr[2] "برجاء الانتظار دقيقتين (%1) ثم المحاولة مجددًا..."
400+msgstr[2] "برجاء الانتظار دقيقتين (%1) ثم المحاولة مجددًا…"
505−msgstr[3] "برجاء الانتظار %1 دقائق ثم المحاولة مجددًا..."
401+msgstr[3] "برجاء الانتظار %1 دقائق ثم المحاولة مجددًا…"
506−msgstr[4] "برجاء الانتظار %1 دقيقة ثم المحاولة مجددًا..."
402+msgstr[4] "برجاء الانتظار %1 دقيقة ثم المحاولة مجددًا…"
507−msgstr[5] "برجاء الانتظار %1 دقيقة ثم المحاولة مجددًا..."
403+msgstr[5] "برجاء الانتظار %1 دقيقة ثم المحاولة مجددًا…"
508
404
509#: qml/Greeter/Greeter.qml:550
405#: qml/Greeter/Greeter.qml:550
510msgid "Try again"
406msgid "Try again"
511−msgstr ""
407+msgstr "حاول مجددا"
512
408
513#: qml/Greeter/Greeter.qml:551
409#: qml/Greeter/Greeter.qml:551
514msgid "Enter passphrase to unlock"
410msgid "Enter passphrase to unlock"
515−msgstr ""
411+msgstr "أدخِل العبارة السرية لفك الإيصاد"
516
412
517#: qml/Greeter/Greeter.qml:552
413#: qml/Greeter/Greeter.qml:552
518msgid "Enter passcode to unlock"
414msgid "Enter passcode to unlock"
519−msgstr ""
415+msgstr "أدخِل الرمز السرّي لفك الإيصاد"
520
416
521−#: qml/Greeter/NarrowView.qml:228
417+#: qml/Greeter/NarrowView.qml:235
522msgid "Emergency"
418msgid "Emergency"
523−msgstr ""
419+msgstr "طوارئ"
524
420
525#: qml/Greeter/PromptList.qml:126
421#: qml/Greeter/PromptList.qml:126
526msgid "Passphrase"
422msgid "Passphrase"
527−msgstr ""
423+msgstr "كلمة السر"
528
424
529#: qml/Greeter/PromptList.qml:126
425#: qml/Greeter/PromptList.qml:126
530msgid "Passcode"
426msgid "Passcode"
531−msgstr ""
427+msgstr "الرمز السري"
532
428
533#: qml/Greeter/SessionsList.qml:124
429#: qml/Greeter/SessionsList.qml:124
534msgid "Select desktop environment"
430msgid "Select desktop environment"
535−msgstr ""
431+msgstr "اختر بيئة سطح المكتب"
536
432
537−#: qml/Launcher/Drawer.qml:94
433+#: qml/Launcher/Drawer.qml:250
538msgid "Search…"
434msgid "Search…"
539−msgstr ""
435+msgstr "ابحث…"
540
436
541−#: qml/Launcher/Drawer.qml:129
437+#: qml/Launcher/PullToRefreshScopeStyle.qml:56
542−msgctxt "Apps sorted alphabetically"
543−msgid "A-Z"
438+msgid "Pull to refresh…"
544−msgstr ""
439+msgstr "اسحب للتحديث…"
545
440
546−#: qml/Launcher/MoreAppsHeader.qml:55
441+#: qml/Launcher/PullToRefreshScopeStyle.qml:61
547−msgid "More apps in the store"
442+msgid "Release to refresh…"
548−msgstr ""
443+msgstr "حرّر للتحديث…"
549
444
550#: qml/Notifications/NotificationMenuItemFactory.qml:124
445#: qml/Notifications/NotificationMenuItemFactory.qml:124
551msgid "Show password"
446msgid "Show password"
552−msgstr "عرض كلمة السر"
447+msgstr "اعرض كلمة السر"
553
448
554#: qml/Panel/ActiveCallHint.qml:79
449#: qml/Panel/ActiveCallHint.qml:79
555msgid "Tap to return to call..."
450msgid "Tap to return to call..."
@@ -578,9 +473,9 @@ msgstr[5] "%1 ساعة"
578#, qt-format
473#, qt-format
579msgid "%1 minute"
474msgid "%1 minute"
580msgid_plural "%1 minutes"
475msgid_plural "%1 minutes"
581−msgstr[0] "أقل من دقيقة (%1)"
476+msgstr[0] "%1 دقيقة"
582−msgstr[1] "دقيقة واحدة (%1)"
477+msgstr[1] "دقيقة واحدة"
583−msgstr[2] "دقيقتان (%1)"
478+msgstr[2] "دقيقتان"
584msgstr[3] "%1 دقائق"
479msgstr[3] "%1 دقائق"
585msgstr[4] "%1 دقيقة"
480msgstr[4] "%1 دقيقة"
586msgstr[5] "%1 دقيقة"
481msgstr[5] "%1 دقيقة"
@@ -608,11 +503,11 @@ msgstr "باق %1"
608
503
609#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
504#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
610msgid "In queue…"
505msgid "In queue…"
611−msgstr "في الانتظار..."
506+msgstr "في الانتظار…"
612
507
613#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
508#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
614msgid "Downloading"
509msgid "Downloading"
615−msgstr "التنزيل"
510+msgstr "ينزل"
616
511
617#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
512#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
618msgid "Paused, tap to resume"
513msgid "Paused, tap to resume"
@@ -620,7 +515,7 @@ msgstr "مُلبث، انقر للاستئناف"
620
515
621#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
516#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
622msgid "Canceled"
517msgid "Canceled"
623−msgstr "تم إلغائه"
518+msgstr "أُلغي"
624
519
625#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
520#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
626msgid "Finished"
521msgid "Finished"
@@ -628,13 +523,13 @@ msgstr "انتهى"
628
523
629#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
524#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
630msgid "Failed, tap to retry"
525msgid "Failed, tap to retry"
631−msgstr "فشل، انقل لإعادة المحاولة"
526+msgstr "فشل، انقر لإعادة المحاولة"
632
527
633#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
528#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
634#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
529#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
635msgctxt "Button: Send a reply message"
530msgctxt "Button: Send a reply message"
636msgid "Send"
531msgid "Send"
637−msgstr ""
532+msgstr "أرسل"
638
533
639#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
534#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
640msgctxt "Label: Hint in message indicator line edit"
535msgctxt "Label: Hint in message indicator line edit"
@@ -644,323 +539,431 @@ msgstr "رد"
644#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
539#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
645msgctxt "Button: Call back on phone"
540msgctxt "Button: Call back on phone"
646msgid "Call back"
541msgid "Call back"
647−msgstr ""
542+msgstr "عاود الاتصال"
648
543
649#: qml/Panel/PanelMenuPage.qml:92
544#: qml/Panel/PanelMenuPage.qml:92
650msgid "Back"
545msgid "Back"
651−msgstr ""
546+msgstr "للخلف"
652
547
653#: qml/Stage/SideStage.qml:76
548#: qml/Stage/SideStage.qml:76
654msgid "Drag using 3 fingers any application from one window to the other"
549msgid "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 "لا توجد تطبيقات مشغلة"
656
555
657#: qml/Tutorial/TutorialLeftLong.qml:49
556#: qml/Tutorial/TutorialLeftLong.qml:49
658msgid "Long swipe from the left edge to open the Application Drawer"
557msgid "Long swipe from the left edge to open the Application Drawer"
659−msgstr ""
558+msgstr "اسحب اصبعك مطولا بدءً من الحافة اليسرى لفتح درج التطبيقات"
660
559
661#: qml/Tutorial/TutorialLeft.qml:47
560#: qml/Tutorial/TutorialLeft.qml:47
662msgid "Short swipe from the left edge to open the launcher"
561msgid "Short swipe from the left edge to open the launcher"
663−msgstr ""
562+msgstr "اسحب اصبعك سحبا قصيرا بدءً من الحافة اليسرى لفتح المُطلِق"
664
563
665−#: qml/Tutorial/TutorialRight.qml:55
564+#: qml/Tutorial/TutorialRight.qml:54
666msgid "Push your mouse against the right edge to view your open apps"
565msgid "Push your mouse against the right edge to view your open apps"
667−msgstr ""
566+msgstr "حرك المؤشر للحافة اليمنى لعرض التطبيقات المفتوحة"
668
567
669−#: qml/Tutorial/TutorialRight.qml:56
568+#: qml/Tutorial/TutorialRight.qml:55
670msgid "Swipe from the right edge to view your open apps"
569msgid "Swipe from the right edge to view your open apps"
671−msgstr ""
570+msgstr "اسحب اصبعك بدءً من الحافة اليمنى لعرض التطبيقات المفتوحة"
672
571
673#: qml/Tutorial/TutorialTop.qml:53
572#: qml/Tutorial/TutorialTop.qml:53
674msgid "Swipe from the top edge to access notifications and quick settings"
573msgid "Swipe from the top edge to access notifications and quick settings"
675msgstr ""
574msgstr ""
575+"اسحب اصبعك بدءً من الحافة العلوية للوصول الى التنبيهات والإعدادات السريعة"
676
576
677−#: qml/Wizard/Page.qml:54
577+#: qml/Wizard/Page.qml:59
678msgctxt "Button: Go back one page in the Wizard"
578msgctxt "Button: Go back one page in the Wizard"
679msgid "Back"
579msgid "Back"
680−msgstr "عودة"
580+msgstr "للخلف"
681
581
682−#: qml/Wizard/Pages/10-welcome.qml:28
582+#: qml/Wizard/Pages/10-welcome.qml:29
683msgid "Language"
583msgid "Language"
684−msgstr ""
584+msgstr "اللغة"
685−
585+
686−#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
586+#: qml/Wizard/Pages/10-welcome.qml:176
687−#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
587+#: qml/Wizard/Pages/10-welcome-update.qml:126
588+#: qml/Wizard/Pages/11-changelog.qml:74 qml/Wizard/Pages/20-keyboard.qml:152
688−#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
589+#: qml/Wizard/Pages/30-wifi.qml:214 qml/Wizard/Pages/50-timezone.qml:272
689−#: qml/Wizard/Pages/70-passwd-type.qml:145
590+#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/70-passwd-type.qml:146
690−#: qml/Wizard/Pages/75-report-check.qml:84
691−#: qml/Wizard/Pages/passcode-desktop.qml:142
591+#: qml/Wizard/Pages/passcode-desktop.qml:154
692−#: qml/Wizard/Pages/password-set.qml:142
592+#: qml/Wizard/Pages/password-set.qml:153
693msgid "Next"
593msgid "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 "يحمل..."
695
611
696#: qml/Wizard/Pages/20-keyboard.qml:31
612#: qml/Wizard/Pages/20-keyboard.qml:31
697msgid "Select Keyboard"
613msgid "Select Keyboard"
698−msgstr ""
614+msgstr "اختر لوحة المفاتيح"
699
615
700#: qml/Wizard/Pages/20-keyboard.qml:71
616#: qml/Wizard/Pages/20-keyboard.qml:71
701msgid "Keyboard language"
617msgid "Keyboard language"
702−msgstr ""
618+msgstr "لغة لوحة المفاتيح"
703
619
704#: qml/Wizard/Pages/20-keyboard.qml:93
620#: qml/Wizard/Pages/20-keyboard.qml:93
705msgid "Keyboard layout"
621msgid "Keyboard layout"
706−msgstr ""
622+msgstr "تخطيط لوحة المفاتيح"
707
623
708−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
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
709−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
626+#: qml/Wizard/Pages/sim.qml:101
710msgid "Skip"
627msgid "Skip"
711−msgstr "تخطي"
628+msgstr "تخط"
712
629
713−#: qml/Wizard/Pages/30-wifi.qml:30
630+#: qml/Wizard/Pages/30-wifi.qml:31
714msgid "Connect to Wi‑Fi"
631msgid "Connect to Wi‑Fi"
715−msgstr "اتصل بالواي فاي"
632+msgstr "اتصل بالإنترنت"
716
633
717−#: qml/Wizard/Pages/30-wifi.qml:131
634+#: qml/Wizard/Pages/30-wifi.qml:139
718msgid "Connected"
635msgid "Connected"
719−msgstr ""
636+msgstr "متصل"
720
637
721−#: qml/Wizard/Pages/30-wifi.qml:164
638+#: qml/Wizard/Pages/30-wifi.qml:172
722msgid "Available Wi-Fi networks"
639msgid "Available Wi-Fi networks"
723−msgstr ""
640+msgstr "شبكات الواي فاي المتاحة"
724
641
725−#: qml/Wizard/Pages/30-wifi.qml:165
642+#: qml/Wizard/Pages/30-wifi.qml:173
726msgid "No available Wi-Fi networks"
643msgid "No available Wi-Fi networks"
727−msgstr ""
644+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 ""
760
645
761#: qml/Wizard/Pages/50-timezone.qml:30
646#: qml/Wizard/Pages/50-timezone.qml:30
762msgid "Time Zone"
647msgid "Time Zone"
763−msgstr ""
648+msgstr "المنطقة الزمنية"
764
649
765−#: qml/Wizard/Pages/50-timezone.qml:182
650+#: qml/Wizard/Pages/50-timezone.qml:183
766msgid "Enter your city"
651msgid "Enter your city"
767−msgstr ""
652+msgstr "أدخل مدينتك"
768
653
769#: qml/Wizard/Pages/60-account.qml:24
654#: qml/Wizard/Pages/60-account.qml:24
770msgid "Personalize Your Device"
655msgid "Personalize Your Device"
771−msgstr ""
656+msgstr "خصص جهازك"
772
657
773−#: qml/Wizard/Pages/60-account.qml:48
658+#: qml/Wizard/Pages/60-account.qml:54
774msgid "Preferred Name"
659msgid "Preferred Name"
775−msgstr ""
660+msgstr "اسم مستحسن"
776
661
777#: qml/Wizard/Pages/70-passwd-type.qml:40
662#: qml/Wizard/Pages/70-passwd-type.qml:40
778msgid "Lock Screen"
663msgid "Lock Screen"
779−msgstr ""
664+msgstr "قفل الشاشة"
780
665
781−#: qml/Wizard/Pages/70-passwd-type.qml:102
666+#: qml/Wizard/Pages/70-passwd-type.qml:103
782msgctxt "Label: Type of security method"
667msgctxt "Label: Type of security method"
783msgid "Create new password"
668msgid "Create new password"
784−msgstr ""
669+msgstr "أنشئ كلمة سر جديدة"
785
670
786−#: qml/Wizard/Pages/70-passwd-type.qml:104
671+#: qml/Wizard/Pages/70-passwd-type.qml:105
787msgctxt "Label: Type of security method"
672msgctxt "Label: Type of security method"
788msgid "Create passcode (numbers only)"
673msgid "Create passcode (numbers only)"
789−msgstr ""
674+msgstr "أنشئ رمز مرور (أرقام فقط)"
790
675
791−#: qml/Wizard/Pages/70-passwd-type.qml:106
676+#: qml/Wizard/Pages/70-passwd-type.qml:107
792msgctxt "Label: Type of security method"
677msgctxt "Label: Type of security method"
793msgid "No lock code"
678msgid "No lock code"
794−msgstr ""
679+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 ""
803
680
804−#: qml/Wizard/Pages/75-report-check.qml:59
681+#: qml/Wizard/Pages/79-system-update.qml:28
805−msgid "Improve system performance by sending us crashes and error reports."
682+msgid "Update Device"
806−msgstr ""
683+msgstr "حدث الجهاز"
807
684
808−#: qml/Wizard/Pages/75-report-check.qml:60
685+#: qml/Wizard/Pages/79-system-update.qml:55
809−msgid "Privacy policy"
686+msgid ""
810−msgstr ""
687+"There is a system update available and ready to install. Afterwards, the "
688+"device will automatically restart."
689+msgstr "يتوفر تحديث للنظام وهو جاهز للتثبيت، سيُعاد تشغيل الجهاز تلقائيا."
811
690
812−#: qml/Wizard/Pages/80-finished.qml:89
691+#: qml/Wizard/Pages/79-system-update.qml:76
692+msgctxt "string identifying name of the update"
813−msgid "Welcome to Ubuntu"
693+msgid "Ubuntu Touch system"
814−msgstr ""
694+msgstr "نظام أبونتو تاتش"
815
695
816−#: qml/Wizard/Pages/80-finished.qml:104
696+#: qml/Wizard/Pages/79-system-update.qml:83
817−msgid "You are ready to use your device now"
697+#, qt-format
698+msgctxt "version of the system update"
699+msgid "Version %1"
818−msgstr ""
700+msgstr "الإصدار %1"
819
701
820−#: qml/Wizard/Pages/80-finished.qml:124
702+#: qml/Wizard/Pages/79-system-update.qml:95
821−msgid "Get Started"
703+msgid "This could take a few minutes..."
822−msgstr ""
704+msgstr "قد يحتاج بضع دقائق..."
823
705
824−#: qml/Wizard/Pages/here-terms.qml:25
706+#: qml/Wizard/Pages/79-system-update.qml:109
825−msgid "Terms & Conditions"
707+msgid "Install and restart now"
826−msgstr "الشروط والأحكام"
708+msgstr "ثبت وأعد التشغيل الآن"
827
709
828−#: qml/Wizard/Pages/here-terms.qml:69
710+#: qml/Wizard/Pages/80-finished.qml:91
829−msgid "Your device uses positioning technologies provided by HERE."
711+msgid "Welcome Back"
830−msgstr ""
712+msgstr "مرحبا بعودتك"
831
713
832−#: qml/Wizard/Pages/here-terms.qml:81
714+#: qml/Wizard/Pages/80-finished.qml:91
833−msgid ""
715+msgid "Welcome to Ubuntu"
834−"To provide you with positioning services and to improve their quality, HERE "
716+msgstr "مرحبا بك في أبونتو"
835−"collects information about nearby cell towers and Wi-Fi hotspots around your "
836−"current location whenever your position is being found."
837−msgstr ""
838
717
839−#: qml/Wizard/Pages/here-terms.qml:93
718+#: qml/Wizard/Pages/80-finished.qml:106
840−msgid ""
719+msgid "You are ready to use your device now"
841−"The information collected is used to analyze the service and to improve the "
720+msgstr "أنت مستعد لاستخدام جهازك"
842−"use of service, but not to identify you personally."
843−msgstr ""
844
721
845−#: qml/Wizard/Pages/here-terms.qml:106
722+#: qml/Wizard/Pages/80-finished.qml:126
846−#, qt-format
723+msgid "Continue"
847−msgid "By continuing, you agree to the HERE platform %1 and %2."
848−msgstr ""
724+msgstr "تابع"
849
725
850−#: qml/Wizard/Pages/here-terms.qml:107
726+#: qml/Wizard/Pages/80-finished.qml:126
851−msgid "Service Terms"
727+msgid "Get Started"
852−msgstr ""
728+msgstr "ابدأ"
853
729
854#: qml/Wizard/Pages/passcode-confirm.qml:43
730#: qml/Wizard/Pages/passcode-confirm.qml:43
855−#: qml/Wizard/Pages/passcode-desktop.qml:97
731+#: qml/Wizard/Pages/passcode-desktop.qml:104
856msgid "Confirm passcode"
732msgid "Confirm passcode"
857−msgstr "تأكيد الرمز السري"
733+msgstr "تأكيد كلمة السر"
858
734
859#: qml/Wizard/Pages/passcode-confirm.qml:45
735#: qml/Wizard/Pages/passcode-confirm.qml:45
860msgid "Incorrect passcode."
736msgid "Incorrect passcode."
861−msgstr ""
737+msgstr "الرمز السري غير صحيح."
862
738
863#: qml/Wizard/Pages/passcode-confirm.qml:45
739#: qml/Wizard/Pages/passcode-confirm.qml:45
864msgctxt "Enter the passcode again"
740msgctxt "Enter the passcode again"
865msgid "Please re-enter."
741msgid "Please re-enter."
866−msgstr ""
742+msgstr "رجاء أعد الإدخال."
867
743
868#: qml/Wizard/Pages/passcode-desktop.qml:31
744#: qml/Wizard/Pages/passcode-desktop.qml:31
869msgid "Lock Screen Passcode"
745msgid "Lock Screen Passcode"
870−msgstr ""
746+msgstr "الرمز السري لقفل الشاشة"
871
747
872−#: qml/Wizard/Pages/passcode-desktop.qml:61
748+#: qml/Wizard/Pages/passcode-desktop.qml:68
873msgid "Enter 4 numbers to setup your passcode"
749msgid "Enter 4 numbers to setup your passcode"
874−msgstr ""
750+msgstr "أدخل 4 أرقام لإعداد الرمز السري"
875
751
876−#: qml/Wizard/Pages/passcode-desktop.qml:77
752+#: qml/Wizard/Pages/passcode-desktop.qml:84
877#: qml/Wizard/Pages/passcode-set.qml:54
753#: qml/Wizard/Pages/passcode-set.qml:54
878msgid "Choose passcode"
754msgid "Choose passcode"
879−msgstr ""
755+msgstr "اختر كلمة السر"
880
756
881−#: qml/Wizard/Pages/passcode-desktop.qml:127
757+#: qml/Wizard/Pages/passcode-desktop.qml:139
882msgid "Passcode too short"
758msgid "Passcode too short"
883−msgstr ""
759+msgstr "الرمز السري قصير جدا"
884
760
885−#: qml/Wizard/Pages/passcode-desktop.qml:129
761+#: qml/Wizard/Pages/passcode-desktop.qml:141
886msgid "Passcodes match"
762msgid "Passcodes match"
887−msgstr ""
763+msgstr "الرمزان السريان متطابقة"
888
764
889−#: qml/Wizard/Pages/passcode-desktop.qml:131
765+#: qml/Wizard/Pages/passcode-desktop.qml:143
890msgid "Passcodes do not match"
766msgid "Passcodes do not match"
891−msgstr ""
767+msgstr "الرمزان السريان لا يتطبقان"
892
768
893#: qml/Wizard/Pages/passcode-set.qml:62
769#: qml/Wizard/Pages/passcode-set.qml:62
894msgid "Passcode must be 4 characters long"
770msgid "Passcode must be 4 characters long"
895−msgstr ""
771+msgstr "يجب أن يكون الرمز السري 4 محارف"
896
772
897#: qml/Wizard/Pages/password-set.qml:31
773#: qml/Wizard/Pages/password-set.qml:31
898msgid "Lock Screen Password"
774msgid "Lock Screen Password"
899−msgstr ""
775+msgstr "كلمة سر قفل الشاشة"
900
776
901−#: qml/Wizard/Pages/password-set.qml:62
777+#: qml/Wizard/Pages/password-set.qml:68
902msgid "Enter at least 8 characters"
778msgid "Enter at least 8 characters"
903−msgstr ""
779+msgstr "أدخل 8 محارف على الأقل"
904
780
905−#: qml/Wizard/Pages/password-set.qml:74
781+#: qml/Wizard/Pages/password-set.qml:80
906msgid "Choose password"
782msgid "Choose password"
907−msgstr ""
783+msgstr "اختر كلمة السر"
908
784
909−#: qml/Wizard/Pages/password-set.qml:104
785+#: qml/Wizard/Pages/password-set.qml:110
910msgid "Confirm password"
786msgid "Confirm password"
911−msgstr ""
787+msgstr "أكد كلمة السر"
912
788
913#: qml/Wizard/Pages/sim.qml:27
789#: qml/Wizard/Pages/sim.qml:27
914msgid "No SIM card installed"
790msgid "No SIM card installed"
915−msgstr ""
791+msgstr "لم تدخل بطاقة SIM"
916
792
917#: qml/Wizard/Pages/sim.qml:54
793#: qml/Wizard/Pages/sim.qml:54
918msgid "SIM card added"
794msgid "SIM card added"
919−msgstr ""
795+msgstr "أُدخلت بطاقة SIM"
920
796
921#: qml/Wizard/Pages/sim.qml:55
797#: qml/Wizard/Pages/sim.qml:55
922msgid "You must restart the device to access the mobile network."
798msgid "You must restart the device to access the mobile network."
923−msgstr ""
799+msgstr "يجب عليك إعادة تشغيل الجهاز لتتمكن من دخول شبكة الجوال."
924
800
925#: qml/Wizard/Pages/sim.qml:59
801#: qml/Wizard/Pages/sim.qml:59
926msgid "Restart"
802msgid "Restart"
927−msgstr ""
803+msgstr "أعد التشغيل"
928
804
929#: qml/Wizard/Pages/sim.qml:78
805#: qml/Wizard/Pages/sim.qml:78
930msgid "You won’t be able to make calls or use text messaging without a SIM."
806msgid "You won’t be able to make calls or use text messaging without a SIM."
931−msgstr ""
807+msgstr "لن تتمكن من إجراء المكالمات أو إرسال الرسائل القصيرة بدون بطاقة SIM."
932
808
933#: qml/Wizard/Pages/sim.qml:90
809#: qml/Wizard/Pages/sim.qml:90
934msgid "To proceed with no SIM tap Skip."
810msgid "To proceed with no SIM tap Skip."
935−msgstr ""
811+msgstr "للاستمرار بدون بطاقة SIM اضغط تخطى."
936
812
937#: qml/Wizard/PasswordMeter.qml:87
813#: qml/Wizard/PasswordMeter.qml:87
938msgid "Password too short"
814msgid "Password too short"
939−msgstr ""
815+msgstr "كلمة السر قصيرة جداً"
940
816
941#: qml/Wizard/PasswordMeter.qml:89
817#: qml/Wizard/PasswordMeter.qml:89
942msgid "Passwords match"
818msgid "Passwords match"
943−msgstr ""
819+msgstr "كلمتا المرور متطابقتان"
944
820
945#: qml/Wizard/PasswordMeter.qml:91
821#: qml/Wizard/PasswordMeter.qml:91
946msgid "Passwords do not match"
822msgid "Passwords do not match"
947−msgstr ""
823+msgstr "كلمتا المرور غير متطابقتين"
948
824
949#: qml/Wizard/PasswordMeter.qml:95
825#: qml/Wizard/PasswordMeter.qml:95
950msgid "Strong password"
826msgid "Strong password"
951−msgstr ""
827+msgstr "كلمة سر قوية"
952
828
953#: qml/Wizard/PasswordMeter.qml:97
829#: qml/Wizard/PasswordMeter.qml:97
954msgid "Fair password"
830msgid "Fair password"
955−msgstr ""
831+msgstr "كلمة سر متوسطة"
956
832
957#: qml/Wizard/PasswordMeter.qml:99
833#: qml/Wizard/PasswordMeter.qml:99
958msgid "Weak password"
834msgid "Weak password"
959−msgstr ""
835+msgstr "كلمة سر ضعيفة"
960
836
961#: qml/Wizard/PasswordMeter.qml:101
837#: qml/Wizard/PasswordMeter.qml:101
962msgid "Very weak password"
838msgid "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 "الشروط والأحكام"
964
967
965#~ msgid "Confirm"
968#~ msgid "Confirm"
966#~ msgstr "التأكيد"
969#~ msgstr "التأكيد"
@@ -968,21 +971,9 @@ msgstr ""
968#~ msgid "Type or say a command"
971#~ msgid "Type or say a command"
969#~ msgstr "اكتب أو قُل أمرا"
972#~ msgstr "اكتب أو قُل أمرا"
970
973
971−#~ msgid "Loading. Please Wait..."
972−#~ msgstr "يجري التحميل. برجاء الانتظار..."
973−
974#~ msgid "Speak Now..."
974#~ msgid "Speak Now..."
975#~ msgstr "تكلم الآن..."
975#~ msgstr "تكلم الآن..."
976
976
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−
986#~ msgid "Top edge"
977#~ msgid "Top edge"
987#~ msgstr "الحافة العلوية"
978#~ msgstr "الحافة العلوية"
988
979
@@ -1018,8 +1009,8 @@ msgstr ""
1018#~ "You have now mastered the edge gestures and can start using the "
1009#~ "You have now mastered the edge gestures and can start using the "
1019#~ "phone<br><br>Tap on the screen to start"
1010#~ "phone<br><br>Tap on the screen to start"
1020#~ msgstr ""
1011#~ msgstr ""
1021−#~ "أنت الآن بارع في إيماءات الحواف ويمكنك البدء باستخدام هاتفك<br><br>انقر على "
1012+#~ "أنت الآن بارع في إيماءات الحواف ويمكنك البدء باستخدام هاتفك<br><br>انقر "
1022−#~ "الشاشة للبدء"
1013+#~ "على الشاشة للبدء"
1023
1014
1024#~ msgid "%a %l:%M %p"
1015#~ msgid "%a %l:%M %p"
1025#~ msgstr "%a %l:%M %p"
1016#~ msgstr "%a %l:%M %p"
@@ -1072,26 +1063,18 @@ msgstr ""
1072#~ msgid "Tap to unlock"
1063#~ msgid "Tap to unlock"
1073#~ msgstr "انقر لفك القفل"
1064#~ msgstr "انقر لفك القفل"
1074
1065
1075−#, qt-format
1076#~ msgid "Enter %1"
1066#~ msgid "Enter %1"
1077#~ msgstr "أدخِل %1"
1067#~ msgstr "أدخِل %1"
1078
1068
1079#~ msgid "Sorry, incorrect passcode."
1069#~ msgid "Sorry, incorrect passcode."
1080#~ msgstr "عذرًا، رمز سرّي خاطيء."
1070#~ msgstr "عذرًا، رمز سرّي خاطيء."
1081
1071
1082−#~ msgid "Enter passphrase"
1083−#~ msgstr "أدخِل العبارة السرية"
1084−
1085−#~ msgid "Enter passcode"
1086−#~ msgstr "أدخِل الرمز السرّي"
1087−
1088#~ msgid "Sorry, incorrect passphrase."
1072#~ msgid "Sorry, incorrect passphrase."
1089#~ msgstr "عذرًا، عبارة سرّية خاطئة."
1073#~ msgstr "عذرًا، عبارة سرّية خاطئة."
1090
1074
1091#~ msgid "This will be your last attempt."
1075#~ msgid "This will be your last attempt."
1092#~ msgstr "هذه ستكون المحاولة الأخيرة لك."
1076#~ msgstr "هذه ستكون المحاولة الأخيرة لك."
1093
1077
1094−#, qt-format
1095#~ msgid "Sorry, incorrect %1"
1078#~ msgid "Sorry, incorrect %1"
1096#~ msgstr "نأسف، %1 غير صحيحية"
1079#~ msgstr "نأسف، %1 غير صحيحية"
1097
1080
@@ -1162,9 +1145,6 @@ msgstr ""
1162#~ msgid "Let’s get started."
1145#~ msgid "Let’s get started."
1163#~ msgstr "هيا بنا نبدأ."
1146#~ msgstr "هيا بنا نبدأ."
1164
1147
1165−#~ msgid "Continue"
1166−#~ msgstr "متابعة"
1167−
1168#~ msgid "Choose your passcode"
1148#~ msgid "Choose your passcode"
1169#~ msgstr "اختر الرمز السري خاصتك"
1149#~ msgstr "اختر الرمز السري خاصتك"
1170
1150
@@ -1261,15 +1241,15 @@ msgstr ""
1261#~ msgstr "فتح قفل بطاقة SIM"
1241#~ msgstr "فتح قفل بطاقة SIM"
1262
1242
1263#~ msgid ""
1243#~ msgid ""
1264−#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
1244+#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms "
1265−#~ "conditions</a>."
1245+#~ "and conditions</a>."
1266#~ msgstr ""
1246#~ msgstr ""
1267−#~ "باختيارك لهذا الخيار فإنك توافق على <a href='#'>الشروط والأحكام</a> الخاصة "
1247+#~ "باختيارك لهذا الخيار فإنك توافق على <a href='#'>الشروط والأحكام</a> "
1268−#~ "بـ Nokia HERE."
1248+#~ "الخاصة بـ Nokia HERE."
1269
1249
1270#~ msgid ""
1250#~ msgid ""
1271−#~ "If passcode is entered incorrectly, your phone will conduct a factory reset "
1251+#~ "If passcode is entered incorrectly, your phone will conduct a factory "
1272−#~ "and all personal data will be deleted."
1252+#~ "reset and all personal data will be deleted."
1273#~ msgstr ""
1253#~ msgstr ""
1274#~ "إذا تم إدخال العبارة السرية بشكل خاطئ، فسوف يتم إعادة الهاتف لحالة ضبط "
1254#~ "إذا تم إدخال العبارة السرية بشكل خاطئ، فسوف يتم إعادة الهاتف لحالة ضبط "
1275#~ "المصنع وسيتم حذف كافة البيانات الشخصية."
1255#~ "المصنع وسيتم حذف كافة البيانات الشخصية."
@@ -1280,9 +1260,3 @@ msgstr ""
1280#~ msgstr ""
1260#~ msgstr ""
1281#~ "إذا تم إدخال العبارة السرية بشكل خاطئ، فسوف يتم إعادة الهاتف لحالة ضبط "
1261#~ "إذا تم إدخال العبارة السرية بشكل خاطئ، فسوف يتم إعادة الهاتف لحالة ضبط "
1282#~ "المصنع وسيتم حذف كافة البيانات الشخصية."
1262#~ "المصنع وسيتم حذف كافة البيانات الشخصية."
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 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10−"POT-Creation-Date: 2017-04-04 22:56+0000\n"
10+"POT-Creation-Date: 2021-01-29 11:42-0600\n"
11−"PO-Revision-Date: 2016-12-16 02:13+0000\n"
11+"PO-Revision-Date: 2019-10-30 03:35+0000\n"
12"Last-Translator: enolp <enolp@softastur.org>\n"
12"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"
14"MIME-Version: 1.0\n"
16"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
18"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
19"Plural-Forms: nplurals=2; plural=n != 1;\n"
20+"X-Generator: Weblate 3.8\n"
18−"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
21+"X-Launchpad-Export-Date: 2016-11-23 06:34+0000\n"
19−"X-Generator: Launchpad (build 18343)\n"
20
22
21−#: plugins/LightDM/Greeter.cpp:188
23+#: plugins/LightDM/Greeter.cpp:199
22msgid "Password: "
24msgid "Password: "
23msgstr "Contraseña: "
25msgstr "Contraseña: "
24
26
25−#: plugins/LightDM/Greeter.cpp:203
27+#: plugins/LightDM/Greeter.cpp:214
26msgid "Username"
28msgid "Username"
27msgstr ""
29msgstr ""
28
30
29−#: plugins/LightDM/Greeter.cpp:242
31+#: plugins/LightDM/Greeter.cpp:258
30msgid "Failed to authenticate"
32msgid "Failed to authenticate"
31msgstr ""
33msgstr ""
32
34
33−#: plugins/LightDM/Greeter.cpp:244
35+#: plugins/LightDM/Greeter.cpp:260
34msgid "Invalid password, please try again"
36msgid "Invalid password, please try again"
35msgstr ""
37msgstr ""
36
38
37−#: plugins/LightDM/Greeter.cpp:254
39+#: plugins/LightDM/Greeter.cpp:270
38msgid "Log In"
40msgid "Log In"
39−msgstr "Aniciar sesión"
41+msgstr ""
40
42
41−#: plugins/LightDM/Greeter.cpp:254
43+#: plugins/LightDM/Greeter.cpp:270
42msgid "Retry"
44msgid "Retry"
43−msgstr "Reintentar"
45+msgstr ""
44
46
45#: plugins/LightDM/UsersModel.cpp:157
47#: plugins/LightDM/UsersModel.cpp:157
46msgid "Login"
48msgid "Login"
@@ -50,23 +52,23 @@ msgstr ""
50msgid "Guest Session"
52msgid "Guest Session"
51msgstr ""
53msgstr ""
52
54
53−#: plugins/Unity/Launcher/launcheritem.cpp:49
55+#: plugins/Unity/Launcher/launcheritem.cpp:48
54−#: plugins/Unity/Launcher/launcheritem.cpp:123
56+#: plugins/Unity/Launcher/launcheritem.cpp:122
55msgid "Pin shortcut"
57msgid "Pin shortcut"
56−msgstr "Anclar atayu"
58+msgstr "Fixar l'atayu"
57
59
58−#: plugins/Unity/Launcher/launcheritem.cpp:55
60+#: plugins/Unity/Launcher/launcheritem.cpp:54
59msgid "Quit"
61msgid "Quit"
60msgstr "Colar"
62msgstr "Colar"
61
63
62−#: plugins/Unity/Launcher/launcheritem.cpp:123
64+#: plugins/Unity/Launcher/launcheritem.cpp:122
63msgid "Unpin shortcut"
65msgid "Unpin shortcut"
64−msgstr "Desanclar atayu"
66+msgstr "Quitar l'atayu"
65
67
66#: qml/Components/Dialogs.qml:176
68#: qml/Components/Dialogs.qml:176
67msgctxt "Title: Lock/Log out dialog"
69msgctxt "Title: Lock/Log out dialog"
68msgid "Log out"
70msgid "Log out"
69−msgstr "Zarrar sesión"
71+msgstr "Zarru de la sesión"
70
72
71#: qml/Components/Dialogs.qml:177
73#: qml/Components/Dialogs.qml:177
72msgid "Are you sure you want to log out?"
74msgid "Are you sure you want to log out?"
@@ -82,9 +84,8 @@ msgctxt "Button: Log out from the system"
82msgid "Log Out"
84msgid "Log Out"
83msgstr "Zarrar sesión"
85msgstr "Zarrar sesión"
84
86
85−#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
87+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:284
86−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
87−#: qml/Wizard/Pages/passcode-confirm.qml:32
88+#: qml/Greeter/NarrowView.qml:215 qml/Wizard/Pages/passcode-confirm.qml:32
88#: qml/Wizard/Pages/passcode-set.qml:32
89#: qml/Wizard/Pages/passcode-set.qml:32
89msgid "Cancel"
90msgid "Cancel"
90msgstr "Encaboxar"
91msgstr "Encaboxar"
@@ -106,36 +107,42 @@ msgstr "Non"
106msgid "Yes"
107msgid "Yes"
107msgstr "Sí"
108msgstr "Sí"
108
109
109−#: qml/Components/Dialogs.qml:239
110+#: qml/Components/Dialogs.qml:243
110msgctxt "Title: Power off/Restart dialog"
111msgctxt "Title: Power off/Restart dialog"
111msgid "Power"
112msgid "Power"
112−msgstr "Apagáu"
113+msgstr "Enerxía"
113
114
114−#: qml/Components/Dialogs.qml:240
115+#: qml/Components/Dialogs.qml:244
115msgid ""
116msgid ""
116"Are you sure you would like\n"
117"Are you sure you would like\n"
117"to power off?"
118"to power off?"
118msgstr ""
119msgstr ""
119−"¿De xuru que te prestaría\n"
120+"¿De xuru que quies\n"
120"apagar?"
121"apagar?"
121
122
122−#: qml/Components/Dialogs.qml:244
123+#: qml/Components/Dialogs.qml:248
123msgctxt "Button: Power off the system"
124msgctxt "Button: Power off the system"
124msgid "Power off"
125msgid "Power off"
125msgstr "Apagar"
126msgstr "Apagar"
126
127
127−#: qml/Components/Dialogs.qml:255
128+#: qml/Components/Dialogs.qml:263
128msgctxt "Button: Restart the system"
129msgctxt "Button: Restart the system"
129msgid "Restart"
130msgid "Restart"
130msgstr "Reaniciar"
131msgstr "Reaniciar"
131
132
133+#: qml/Components/Dialogs.qml:276
134+#, fuzzy
135+#| msgid "Takes a screenshot."
136+msgid "Screenshot"
137+msgstr "Fai una captura de pantalla."
138+
132#: qml/Components/KeyboardShortcutsOverlay.qml:41
139#: qml/Components/KeyboardShortcutsOverlay.qml:41
133msgid "Keyboard Shortcuts"
140msgid "Keyboard Shortcuts"
134−msgstr "Atayos de tecláu"
141+msgstr "Atayos del tecláu"
135
142
136#: qml/Components/KeyboardShortcutsOverlay.qml:55
143#: qml/Components/KeyboardShortcutsOverlay.qml:55
137−msgid "Unity 8"
144+msgid "Lomiri"
138−msgstr "Unity 8"
145+msgstr ""
139
146
140#: qml/Components/KeyboardShortcutsOverlay.qml:62
147#: qml/Components/KeyboardShortcutsOverlay.qml:62
141msgid "PrtScr"
148msgid "PrtScr"
@@ -143,35 +150,39 @@ msgstr "ImprPant"
143
150
144#: qml/Components/KeyboardShortcutsOverlay.qml:67
151#: qml/Components/KeyboardShortcutsOverlay.qml:67
145msgid "Takes a screenshot."
152msgid "Takes a screenshot."
146−msgstr "Saca una imaxe de la pantalla."
153+msgstr "Fai una captura de pantalla."
147
154
148#: qml/Components/KeyboardShortcutsOverlay.qml:75
155#: qml/Components/KeyboardShortcutsOverlay.qml:75
149msgid "Alt + PrtScr"
156msgid "Alt + PrtScr"
150msgstr "Alt + ImprPant"
157msgstr "Alt + ImprPant"
151
158
152#: qml/Components/KeyboardShortcutsOverlay.qml:80
159#: qml/Components/KeyboardShortcutsOverlay.qml:80
160+#, fuzzy
161+#| msgid "Takes a screenshot of a window."
153msgid "Takes a screenshot of the current window."
162msgid "Takes a screenshot of the current window."
154−msgstr ""
163+msgstr "Fai una captura d'una ventana."
155
164
156#: qml/Components/KeyboardShortcutsOverlay.qml:88
165#: qml/Components/KeyboardShortcutsOverlay.qml:88
157msgid "Super + Space"
166msgid "Super + Space"
158−msgstr "Super + Espaciu"
167+msgstr "Súper + Espaciu"
159
168
160#: qml/Components/KeyboardShortcutsOverlay.qml:93
169#: qml/Components/KeyboardShortcutsOverlay.qml:93
161msgid "Switches to next keyboard layout."
170msgid "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."
163
172
164#: qml/Components/KeyboardShortcutsOverlay.qml:101
173#: qml/Components/KeyboardShortcutsOverlay.qml:101
165msgid "Super + Shift + Space"
174msgid "Super + Shift + Space"
166−msgstr "Super +Mayús + Espaciu"
175+msgstr "Súper + Mayús + Espaciu"
167
176
168#: qml/Components/KeyboardShortcutsOverlay.qml:106
177#: qml/Components/KeyboardShortcutsOverlay.qml:106
169msgid "Switches to previous keyboard layout."
178msgid "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."
171
180
172#: qml/Components/KeyboardShortcutsOverlay.qml:114
181#: qml/Components/KeyboardShortcutsOverlay.qml:114
182+#, fuzzy
183+#| msgid "Ctrl + Super + D"
173msgid "Ctrl + Alt + T"
184msgid "Ctrl + Alt + T"
174−msgstr ""
185+msgstr "Ctrl + Súper + D"
175
186
176#: qml/Components/KeyboardShortcutsOverlay.qml:119
187#: qml/Components/KeyboardShortcutsOverlay.qml:119
177msgid "Starts the Terminal application."
188msgid "Starts the Terminal application."
@@ -183,11 +194,11 @@ msgstr "Llanzador"
183
194
184#: qml/Components/KeyboardShortcutsOverlay.qml:138
195#: qml/Components/KeyboardShortcutsOverlay.qml:138
185msgid "Super (Hold)"
196msgid "Super (Hold)"
186−msgstr "Super (Caltener)"
197+msgstr ""
187
198
188#: qml/Components/KeyboardShortcutsOverlay.qml:143
199#: qml/Components/KeyboardShortcutsOverlay.qml:143
189msgid "Opens the launcher, displays shortcuts."
200msgid "Opens the launcher, displays shortcuts."
190−msgstr "Abre'l llanzador, amuesa atayos."
201+msgstr "Abre'l llanzador, amuesa los atayos."
191
202
192#: qml/Components/KeyboardShortcutsOverlay.qml:151
203#: qml/Components/KeyboardShortcutsOverlay.qml:151
193msgid "Alt + F1"
204msgid "Alt + F1"
@@ -195,87 +206,81 @@ msgstr "Alt + F1"
195
206
196#: qml/Components/KeyboardShortcutsOverlay.qml:156
207#: qml/Components/KeyboardShortcutsOverlay.qml:156
197msgid "Opens launcher keyboard navigation mode."
208msgid "Opens launcher keyboard navigation mode."
198−msgstr "Abre'l mou de navegación con tecláu del llanzador."
209+msgstr ""
199
210
200#: qml/Components/KeyboardShortcutsOverlay.qml:164
211#: qml/Components/KeyboardShortcutsOverlay.qml:164
201msgid "Super + Tab"
212msgid "Super + Tab"
202−msgstr "Super + Tab"
213+msgstr "Súper + Tabulador"
203
214
204#: qml/Components/KeyboardShortcutsOverlay.qml:169
215#: qml/Components/KeyboardShortcutsOverlay.qml:169
205msgid "Switches applications via the launcher."
216msgid "Switches applications via the launcher."
206−msgstr "Cambia d'aplicaciones col llanzador."
217+msgstr ""
207
218
208#: qml/Components/KeyboardShortcutsOverlay.qml:177
219#: qml/Components/KeyboardShortcutsOverlay.qml:177
220+#, fuzzy
221+#| msgid "Super + 0 to 9"
209msgid "Super + 1 to 0"
222msgid "Super + 1 to 0"
210−msgstr ""
223+msgstr "Súper + 0 a 9"
211
224
212#: qml/Components/KeyboardShortcutsOverlay.qml:182
225#: qml/Components/KeyboardShortcutsOverlay.qml:182
213msgid "Same as clicking on a launcher icon."
226msgid "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."
215
228
216#: qml/Components/KeyboardShortcutsOverlay.qml:190
229#: qml/Components/KeyboardShortcutsOverlay.qml:190
230+#, fuzzy
231+#| msgid "Super + W"
217msgid "Super + A"
232msgid "Super + A"
218−msgstr ""
233+msgstr "Súper + W"
219
234
220#: qml/Components/KeyboardShortcutsOverlay.qml:195
235#: qml/Components/KeyboardShortcutsOverlay.qml:195
236+#, fuzzy
237+#| msgid "Open the launcher"
221msgid "Opens the Application Drawer."
238msgid "Opens the Application Drawer."
222−msgstr "Abre'l caxón d'aplicaciones."
239+msgstr "Abrir el llanzador"
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"
235
240
236#: qml/Components/KeyboardShortcutsOverlay.qml:235
241#: qml/Components/KeyboardShortcutsOverlay.qml:235
237msgid "Switching"
242msgid "Switching"
238−msgstr "Conmutación"
243+msgstr "Cambéu"
239
244
240#: qml/Components/KeyboardShortcutsOverlay.qml:242
245#: qml/Components/KeyboardShortcutsOverlay.qml:242
241msgid "Alt + Tab"
246msgid "Alt + Tab"
242−msgstr "Alt + Tab"
247+msgstr "Alt + Tabulador"
243
248
244#: qml/Components/KeyboardShortcutsOverlay.qml:247
249#: qml/Components/KeyboardShortcutsOverlay.qml:247
245msgid "Switches between applications."
250msgid "Switches between applications."
246−msgstr "Conmuta ente aplicaciones."
251+msgstr ""
247
252
248#: qml/Components/KeyboardShortcutsOverlay.qml:255
253#: qml/Components/KeyboardShortcutsOverlay.qml:255
249msgid "Super + W"
254msgid "Super + W"
250−msgstr "Super + W"
255+msgstr "Súper + W"
251
256
252#: qml/Components/KeyboardShortcutsOverlay.qml:260
257#: qml/Components/KeyboardShortcutsOverlay.qml:260
253msgid "Opens the desktop spread."
258msgid "Opens the desktop spread."
254−msgstr "Abre esparder l'escritoriu."
259+msgstr ""
255
260
256#: qml/Components/KeyboardShortcutsOverlay.qml:268
261#: qml/Components/KeyboardShortcutsOverlay.qml:268
257msgid "Cursor Left or Right"
262msgid "Cursor Left or Right"
258−msgstr "Flecha izq. o dre."
263+msgstr ""
259
264
260#: qml/Components/KeyboardShortcutsOverlay.qml:273
265#: qml/Components/KeyboardShortcutsOverlay.qml:273
261msgid "Moves the focus."
266msgid "Moves the focus."
262−msgstr "Mueve'l focu"
267+msgstr "Mueve'l focu."
263
268
264#: qml/Components/KeyboardShortcutsOverlay.qml:285
269#: qml/Components/KeyboardShortcutsOverlay.qml:285
265msgid "Windows"
270msgid "Windows"
266−msgstr "Ventanes"
271+msgstr ""
267
272
268#: qml/Components/KeyboardShortcutsOverlay.qml:292
273#: qml/Components/KeyboardShortcutsOverlay.qml:292
269msgid "Ctrl + Super + D"
274msgid "Ctrl + Super + D"
270−msgstr "Ctrl + Super + D"
275+msgstr "Ctrl + Súper + D"
271
276
272#: qml/Components/KeyboardShortcutsOverlay.qml:297
277#: qml/Components/KeyboardShortcutsOverlay.qml:297
273msgid "Minimizes all windows."
278msgid "Minimizes all windows."
274−msgstr "Amenorga toles ventanes."
279+msgstr "Minimiza toles ventanes."
275
280
276#: qml/Components/KeyboardShortcutsOverlay.qml:305
281#: qml/Components/KeyboardShortcutsOverlay.qml:305
277msgid "Ctrl + Super + Up"
282msgid "Ctrl + Super + Up"
278−msgstr "Ctrl + Super + Arriba"
283+msgstr "Ctrl + Súper + Arriba"
279
284
280#: qml/Components/KeyboardShortcutsOverlay.qml:310
285#: qml/Components/KeyboardShortcutsOverlay.qml:310
281msgid "Maximizes the current window."
286msgid "Maximizes the current window."
@@ -283,19 +288,19 @@ msgstr "Maximiza la ventana actual."
283
288
284#: qml/Components/KeyboardShortcutsOverlay.qml:318
289#: qml/Components/KeyboardShortcutsOverlay.qml:318
285msgid "Ctrl + Super + Down"
290msgid "Ctrl + Super + Down"
286−msgstr "Ctrl + Super + Abaxo"
291+msgstr "Ctrl + Súper + Abaxo"
287
292
288#: qml/Components/KeyboardShortcutsOverlay.qml:323
293#: qml/Components/KeyboardShortcutsOverlay.qml:323
289msgid "Minimizes or restores the current window."
294msgid "Minimizes or restores the current window."
290−msgstr "Amenorga o restaura la ventana actual."
295+msgstr "Minimiza o restaura la ventana actual."
291
296
292#: qml/Components/KeyboardShortcutsOverlay.qml:331
297#: qml/Components/KeyboardShortcutsOverlay.qml:331
293msgid "Ctrl + Super + Left or Right"
298msgid "Ctrl + Super + Left or Right"
294−msgstr "Ctrl + Super + Izquierda o Drecha"
299+msgstr "Ctrl + Súper + Esquierda o Drecha"
295
300
296#: qml/Components/KeyboardShortcutsOverlay.qml:336
301#: qml/Components/KeyboardShortcutsOverlay.qml:336
297msgid "Semi-maximizes the current window."
302msgid "Semi-maximizes the current window."
298−msgstr "Semi-maximiza la ventana actual."
303+msgstr ""
299
304
300#: qml/Components/KeyboardShortcutsOverlay.qml:344
305#: qml/Components/KeyboardShortcutsOverlay.qml:344
301msgid "Alt + F4"
306msgid "Alt + F4"
@@ -303,11 +308,11 @@ msgstr "Alt + F4"
303
308
304#: qml/Components/KeyboardShortcutsOverlay.qml:349
309#: qml/Components/KeyboardShortcutsOverlay.qml:349
305msgid "Closes the current window."
310msgid "Closes the current window."
306−msgstr "Zarra la ventana actual."
311+msgstr "Zarra toles ventanes actuales."
307
312
308−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
313+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:235
309msgid "Return to Call"
314msgid "Return to Call"
310−msgstr "Tornar a la llamada"
315+msgstr ""
311
316
312#: qml/Components/Lockscreen.qml:212
317#: qml/Components/Lockscreen.qml:212
313msgid "Emergency Call"
318msgid "Emergency Call"
@@ -315,7 +320,7 @@ msgstr "Llamada d'emerxencia"
315
320
316#: qml/Components/Lockscreen.qml:245
321#: qml/Components/Lockscreen.qml:245
317msgid "OK"
322msgid "OK"
318−msgstr "Aceutar"
323+msgstr ""
319
324
320#: qml/Components/MediaServices/VideoPlayerControls.qml:44
325#: qml/Components/MediaServices/VideoPlayerControls.qml:44
321#, qt-format
326#, qt-format
@@ -329,25 +334,25 @@ msgstr "%1:%2"
329
334
330#: qml/Components/ModeSwitchWarningDialog.qml:33
335#: qml/Components/ModeSwitchWarningDialog.qml:33
331msgid "Apps may have unsaved data:"
336msgid "Apps may have unsaved data:"
332−msgstr "Apps que pueden tener datos sin guardar:"
337+msgstr "Aplicaciones con datos ensin guardar:"
333
338
334#: qml/Components/ModeSwitchWarningDialog.qml:60
339#: qml/Components/ModeSwitchWarningDialog.qml:60
335msgctxt ""
340msgctxt ""
336"Re-dock means connect the device again to an external screen/mouse/keyboard"
341"Re-dock means connect the device again to an external screen/mouse/keyboard"
337msgid "Re-dock, save your work and close these apps to continue."
342msgid "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 ""
339
344
340#: qml/Components/ModeSwitchWarningDialog.qml:67
345#: qml/Components/ModeSwitchWarningDialog.qml:67
341msgid "Or force close now (unsaved data will be lost)."
346msgid "Or force close now (unsaved data will be lost)."
342−msgstr "O fuerza salir agora (perderás tolos datos sin guardar)."
347+msgstr ""
343
348
344#: qml/Components/ModeSwitchWarningDialog.qml:80
349#: qml/Components/ModeSwitchWarningDialog.qml:80
345msgid "OK, I will reconnect"
350msgid "OK, I will reconnect"
346−msgstr "D'alcuerdu, reconeutaré"
351+msgstr ""
347
352
348#: qml/Components/ModeSwitchWarningDialog.qml:81
353#: qml/Components/ModeSwitchWarningDialog.qml:81
349msgid "Reconnect now!"
354msgid "Reconnect now!"
350−msgstr "Reconeutar agora."
355+msgstr ""
351
356
352#: qml/Components/ModeSwitchWarningDialog.qml:94
357#: qml/Components/ModeSwitchWarningDialog.qml:94
353msgid "Close all"
358msgid "Close all"
@@ -355,128 +360,33 @@ msgstr "Zarrar too"
355
360
356#: qml/Components/SharingPicker.qml:54
361#: qml/Components/SharingPicker.qml:54
357msgid "Preview Share Item"
362msgid "Preview Share Item"
358−msgstr "Entever l'elementu compartíu"
363+msgstr ""
359
364
360#: qml/Components/VirtualTouchPad.qml:317
365#: qml/Components/VirtualTouchPad.qml:317
361msgid ""
366msgid ""
362"Your device is now connected to an external display. Use this screen as a "
367"Your device is now connected to an external display. Use this screen as a "
363"touch pad to interact with the pointer."
368"touch pad to interact with the pointer."
364msgstr ""
369msgstr ""
365−"El preséu agora ta coneutáu con una pantalla esterna. Usa esta pantalla como "
370+"Agora'l preséu ta coneutáu a una pantalla esterna. Usa esta pantalla como "
366−"touch pad pa interactuar col punteru."
371+"panel táutil pa interactuar col punteru."
367
372
368#: qml/Components/VirtualTouchPad.qml:327
373#: qml/Components/VirtualTouchPad.qml:327
374+#, fuzzy
375+#| msgid "Tap to return to call..."
369msgid "Tap left button to click."
376msgid "Tap left button to click."
370−msgstr "Calca nel botón esquierdu pa facer clic."
377+msgstr "Toca pa volver a la llamada…"
371
378
372#: qml/Components/VirtualTouchPad.qml:339
379#: qml/Components/VirtualTouchPad.qml:339
373msgid "Tap right button to right click."
380msgid "Tap right button to right click."
374−msgstr "Calca nel botón drechu pa facer clic."
381+msgstr ""
375
382
376#: qml/Components/VirtualTouchPad.qml:351
383#: qml/Components/VirtualTouchPad.qml:351
377msgid "Swipe with two fingers to scroll."
384msgid "Swipe with two fingers to scroll."
378−msgstr "Esliza con dos deos pa desplazate."
385+msgstr ""
379
386
380#: qml/Components/VirtualTouchPad.qml:396
387#: qml/Components/VirtualTouchPad.qml:396
381msgid "Find more settings in the system settings."
388msgid "Find more settings in the system settings."
382−msgstr "Alcuentra más axustes nos Axustes del Sistema."
389+msgstr ""
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"
480
390
481#: qml/Greeter/CoverPage.qml:127
391#: qml/Greeter/CoverPage.qml:127
482msgid "Unlock"
392msgid "Unlock"
@@ -488,33 +398,39 @@ msgstr "Preséu bloquiáu"
488
398
489#: qml/Greeter/DelayedLockscreen.qml:58
399#: qml/Greeter/DelayedLockscreen.qml:58
490msgid "You have been locked out due to too many failed passphrase attempts."
400msgid "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."
492
404
493#: qml/Greeter/DelayedLockscreen.qml:59
405#: qml/Greeter/DelayedLockscreen.qml:59
494msgid "You have been locked out due to too many failed passcode attempts."
406msgid "You have been locked out due to too many failed passcode attempts."
495msgstr ""
407msgstr ""
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."
497
409
498#: qml/Greeter/DelayedLockscreen.qml:68
410#: qml/Greeter/DelayedLockscreen.qml:68
499#, qt-format
411#, qt-format
500msgid "Please wait %1 minute and then try again…"
412msgid "Please wait %1 minute and then try again…"
501msgid_plural "Please wait %1 minutes and then try again…"
413msgid_plural "Please wait %1 minutes and then try again…"
502−msgstr[0] "Por favor, espera %1 minutu y vuelvi a intentalo…"
414+msgstr[0] "Espera %1 minutu y volvi tentalo darréu…"
503−msgstr[1] "Por favor, espera %1 minutos y vuelvi a intentalo…"
415+msgstr[1] "Espera %1 minutos y volvi tentalo darréu…"
504
416
505#: qml/Greeter/Greeter.qml:550
417#: qml/Greeter/Greeter.qml:550
506msgid "Try again"
418msgid "Try again"
507−msgstr "Tentar otra vuelta"
419+msgstr ""
508
420
509#: qml/Greeter/Greeter.qml:551
421#: qml/Greeter/Greeter.qml:551
422+#, fuzzy
423+#| msgid "Enter passphrase"
510msgid "Enter passphrase to unlock"
424msgid "Enter passphrase to unlock"
511−msgstr ""
425+msgstr "Introduz la fras de pasu"
512
426
513#: qml/Greeter/Greeter.qml:552
427#: qml/Greeter/Greeter.qml:552
428+#, fuzzy
429+#| msgid "Enter passcode"
514msgid "Enter passcode to unlock"
430msgid "Enter passcode to unlock"
515−msgstr ""
431+msgstr "Introduz el códigu de pasu"
516
432
517−#: qml/Greeter/NarrowView.qml:228
433+#: qml/Greeter/NarrowView.qml:235
518msgid "Emergency"
434msgid "Emergency"
519msgstr "Emerxencia"
435msgstr "Emerxencia"
520
436
@@ -524,32 +440,33 @@ msgstr "Fras de pasu"
524
440
525#: qml/Greeter/PromptList.qml:126
441#: qml/Greeter/PromptList.qml:126
526msgid "Passcode"
442msgid "Passcode"
527−msgstr "Códigu de pasu"
443+msgstr "Códigu numbéricu"
528
444
529#: qml/Greeter/SessionsList.qml:124
445#: qml/Greeter/SessionsList.qml:124
530msgid "Select desktop environment"
446msgid "Select desktop environment"
531−msgstr "Esbillar entornu d'escritoriu"
447+msgstr ""
532
448
533−#: qml/Launcher/Drawer.qml:94
449+#: qml/Launcher/Drawer.qml:250
450+#, fuzzy
451+#| msgid "Search"
534msgid "Search…"
452msgid "Search…"
535−msgstr "Guetar..."
453+msgstr "Guetar"
536
454
537−#: qml/Launcher/Drawer.qml:129
455+#: qml/Launcher/PullToRefreshScopeStyle.qml:56
538−msgctxt "Apps sorted alphabetically"
539−msgid "A-Z"
456+msgid "Pull to refresh…"
540−msgstr "A-Z"
457+msgstr "Tira pa refrescar…"
541
458
542−#: qml/Launcher/MoreAppsHeader.qml:55
459+#: qml/Launcher/PullToRefreshScopeStyle.qml:61
543−msgid "More apps in the store"
460+msgid "Release to refresh…"
544−msgstr "Más aplicaciones na tienda"
461+msgstr "Suelta pa refrescar…"
545
462
546#: qml/Notifications/NotificationMenuItemFactory.qml:124
463#: qml/Notifications/NotificationMenuItemFactory.qml:124
547msgid "Show password"
464msgid "Show password"
548−msgstr "Amosar contraseña"
465+msgstr "Amosar la contraseña"
549
466
550#: qml/Panel/ActiveCallHint.qml:79
467#: qml/Panel/ActiveCallHint.qml:79
551msgid "Tap to return to call..."
468msgid "Tap to return to call..."
552−msgstr "Toca pa tornar a la llamada..."
469+msgstr "Toca pa volver a la llamada…"
553
470
554#: qml/Panel/ActiveCallHint.qml:92
471#: qml/Panel/ActiveCallHint.qml:92
555msgid "Conference"
472msgid "Conference"
@@ -557,7 +474,7 @@ msgstr "Conferencia"
557
474
558#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
475#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
559msgid "Nothing is playing"
476msgid "Nothing is playing"
560−msgstr "Nun ta reproduciéndose nada"
477+msgstr "Nada en reproducción"
561
478
562#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
479#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
563#, qt-format
480#, qt-format
@@ -588,11 +505,11 @@ msgstr "0 segundos"
588#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
505#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
589#, qt-format
506#, qt-format
590msgid "%1 remaining"
507msgid "%1 remaining"
591−msgstr "Queden %1"
508+msgstr "%1 restante(s)"
592
509
593#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
510#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
594msgid "In queue…"
511msgid "In queue…"
595−msgstr "Na cola..."
512+msgstr "Na cola…"
596
513
597#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
514#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
598msgid "Downloading"
515msgid "Downloading"
@@ -600,11 +517,11 @@ msgstr "Baxando"
600
517
601#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
518#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
602msgid "Paused, tap to resume"
519msgid "Paused, tap to resume"
603−msgstr "Posáu, toca pa reanudar"
520+msgstr "Posóse, toca pa siguir"
604
521
605#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
522#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
606msgid "Canceled"
523msgid "Canceled"
607−msgstr "Encaboxáu"
524+msgstr "Encaboxóse"
608
525
609#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
526#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
610msgid "Finished"
527msgid "Finished"
@@ -612,7 +529,7 @@ msgstr "Finó"
612
529
613#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
530#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
614msgid "Failed, tap to retry"
531msgid "Failed, tap to retry"
615−msgstr "Falló, toca pa reintentar"
532+msgstr "Falló, toca pa retentar"
616
533
617#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
534#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
618#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
535#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
@@ -623,65 +540,88 @@ msgstr "Unviar"
623#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
540#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
624msgctxt "Label: Hint in message indicator line edit"
541msgctxt "Label: Hint in message indicator line edit"
625msgid "Reply"
542msgid "Reply"
626−msgstr "Responder"
543+msgstr ""
627
544
628#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
545#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
629msgctxt "Button: Call back on phone"
546msgctxt "Button: Call back on phone"
630msgid "Call back"
547msgid "Call back"
631−msgstr "Devolver llamada"
548+msgstr "Rellamar"
632
549
633#: qml/Panel/PanelMenuPage.qml:92
550#: qml/Panel/PanelMenuPage.qml:92
551+#, fuzzy
552+#| msgctxt "Button: Go back one page in the Wizard"
553+#| msgid "Back"
634msgid "Back"
554msgid "Back"
635−msgstr ""
555+msgstr "Atrás"
636
556
637#: qml/Stage/SideStage.qml:76
557#: qml/Stage/SideStage.qml:76
638msgid "Drag using 3 fingers any application from one window to the other"
558msgid "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 ""
640
564
641#: qml/Tutorial/TutorialLeftLong.qml:49
565#: qml/Tutorial/TutorialLeftLong.qml:49
566+#, fuzzy
567+#| msgid "Long swipe from the left edge to open the Today scope"
642msgid "Long swipe from the left edge to open the Application Drawer"
568msgid "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"
644
570
645#: qml/Tutorial/TutorialLeft.qml:47
571#: qml/Tutorial/TutorialLeft.qml:47
646msgid "Short swipe from the left edge to open the launcher"
572msgid "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"
648
574
649−#: qml/Tutorial/TutorialRight.qml:55
575+#: qml/Tutorial/TutorialRight.qml:54
650msgid "Push your mouse against the right edge to view your open apps"
576msgid "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"
652
578
653−#: qml/Tutorial/TutorialRight.qml:56
579+#: qml/Tutorial/TutorialRight.qml:55
654msgid "Swipe from the right edge to view your open apps"
580msgid "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"
656
582
657#: qml/Tutorial/TutorialTop.qml:53
583#: qml/Tutorial/TutorialTop.qml:53
658msgid "Swipe from the top edge to access notifications and quick settings"
584msgid "Swipe from the top edge to access notifications and quick settings"
659−msgstr ""
585+msgstr "Esliza dende'l berbesu cimeru p'acceder a los avisos y axustes rápidos"
660−"Barríu dende'l berbesu superior pa tener accesu a los avisos y configuración "
661−"nel intre"
662
586
663−#: qml/Wizard/Page.qml:54
587+#: qml/Wizard/Page.qml:59
664msgctxt "Button: Go back one page in the Wizard"
588msgctxt "Button: Go back one page in the Wizard"
665msgid "Back"
589msgid "Back"
666−msgstr "Atrás"
590+msgstr "Atrás"
667
591
668−#: qml/Wizard/Pages/10-welcome.qml:28
592+#: qml/Wizard/Pages/10-welcome.qml:29
669msgid "Language"
593msgid "Language"
670msgstr "Llingua"
594msgstr "Llingua"
671
595
672−#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
596+#: qml/Wizard/Pages/10-welcome.qml:176
673−#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
597+#: qml/Wizard/Pages/10-welcome-update.qml:126
598+#: qml/Wizard/Pages/11-changelog.qml:74 qml/Wizard/Pages/20-keyboard.qml:152
674−#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
599+#: qml/Wizard/Pages/30-wifi.qml:214 qml/Wizard/Pages/50-timezone.qml:272
675−#: qml/Wizard/Pages/70-passwd-type.qml:145
600+#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/70-passwd-type.qml:146
676−#: qml/Wizard/Pages/75-report-check.qml:84
677−#: qml/Wizard/Pages/passcode-desktop.qml:142
601+#: qml/Wizard/Pages/passcode-desktop.qml:154
678−#: qml/Wizard/Pages/password-set.qml:142
602+#: qml/Wizard/Pages/password-set.qml:153
679msgid "Next"
603msgid "Next"
680msgstr "Siguiente"
604msgstr "Siguiente"
681
605
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+
682#: qml/Wizard/Pages/20-keyboard.qml:31
622#: qml/Wizard/Pages/20-keyboard.qml:31
683msgid "Select Keyboard"
623msgid "Select Keyboard"
684−msgstr "Escoyer tecláu"
624+msgstr ""
685
625
686#: qml/Wizard/Pages/20-keyboard.qml:71
626#: qml/Wizard/Pages/20-keyboard.qml:71
687msgid "Keyboard language"
627msgid "Keyboard language"
@@ -691,247 +631,203 @@ msgstr "Llingua del tecláu"
691msgid "Keyboard layout"
631msgid "Keyboard layout"
692msgstr "Distribución del tecláu"
632msgstr "Distribución del tecláu"
693
633
694−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
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
695−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
636+#: qml/Wizard/Pages/sim.qml:101
696msgid "Skip"
637msgid "Skip"
697msgstr "Saltar"
638msgstr "Saltar"
698
639
699−#: qml/Wizard/Pages/30-wifi.qml:30
640+#: qml/Wizard/Pages/30-wifi.qml:31
700msgid "Connect to Wi‑Fi"
641msgid "Connect to Wi‑Fi"
701−msgstr "Coneutase al WiFi"
642+msgstr "Conexón a una Wi-Fi"
702
643
703−#: qml/Wizard/Pages/30-wifi.qml:131
644+#: qml/Wizard/Pages/30-wifi.qml:139
704msgid "Connected"
645msgid "Connected"
705−msgstr "Coneutáu"
646+msgstr "Coneutóse"
706
647
707−#: qml/Wizard/Pages/30-wifi.qml:164
648+#: qml/Wizard/Pages/30-wifi.qml:172
708msgid "Available Wi-Fi networks"
649msgid "Available Wi-Fi networks"
709msgstr "Redes Wi-Fi disponibles"
650msgstr "Redes Wi-Fi disponibles"
710
651
711−#: qml/Wizard/Pages/30-wifi.qml:165
652+#: qml/Wizard/Pages/30-wifi.qml:173
712msgid "No available Wi-Fi networks"
653msgid "No available Wi-Fi networks"
713msgstr "Nun hai redes Wi-Fi disponibles"
654msgstr "Nun hai redes Wi-Fi disponibles"
714
655
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−
749#: qml/Wizard/Pages/50-timezone.qml:30
656#: qml/Wizard/Pages/50-timezone.qml:30
750msgid "Time Zone"
657msgid "Time Zone"
751−msgstr "Estaya horaria"
658+msgstr "Fusu horariu"
752
659
753−#: qml/Wizard/Pages/50-timezone.qml:182
660+#: qml/Wizard/Pages/50-timezone.qml:183
754msgid "Enter your city"
661msgid "Enter your city"
755−msgstr "Escribe la ciudá"
662+msgstr "Introduz la to ciudá"
756
663
757#: qml/Wizard/Pages/60-account.qml:24
664#: qml/Wizard/Pages/60-account.qml:24
758msgid "Personalize Your Device"
665msgid "Personalize Your Device"
759−msgstr "Personaliza'l preséu"
666+msgstr "Personalización del preséu"
760
667
761−#: qml/Wizard/Pages/60-account.qml:48
668+#: qml/Wizard/Pages/60-account.qml:54
762msgid "Preferred Name"
669msgid "Preferred Name"
763msgstr "Nome preferíu"
670msgstr "Nome preferíu"
764
671
765#: qml/Wizard/Pages/70-passwd-type.qml:40
672#: qml/Wizard/Pages/70-passwd-type.qml:40
766msgid "Lock Screen"
673msgid "Lock Screen"
767−msgstr "Bloquiar pantalla"
674+msgstr "Pantalla de bloquéu"
768
675
769−#: qml/Wizard/Pages/70-passwd-type.qml:102
676+#: qml/Wizard/Pages/70-passwd-type.qml:103
770msgctxt "Label: Type of security method"
677msgctxt "Label: Type of security method"
771msgid "Create new password"
678msgid "Create new password"
772−msgstr "Crear contraseña nueva"
679+msgstr "Crear una contraseña"
773
680
774−#: qml/Wizard/Pages/70-passwd-type.qml:104
681+#: qml/Wizard/Pages/70-passwd-type.qml:105
775msgctxt "Label: Type of security method"
682msgctxt "Label: Type of security method"
776msgid "Create passcode (numbers only)"
683msgid "Create passcode (numbers only)"
777−msgstr "Crear códigu d'accesu (sólo númberos)"
684+msgstr "Crear un códigu numbéricu"
778
685
779−#: qml/Wizard/Pages/70-passwd-type.qml:106
686+#: qml/Wizard/Pages/70-passwd-type.qml:107
780msgctxt "Label: Type of security method"
687msgctxt "Label: Type of security method"
781msgid "No lock code"
688msgid "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 ""
783
694
784−#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
695+#: qml/Wizard/Pages/79-system-update.qml:55
785−msgid "Privacy Policy"
696+msgid ""
786−msgstr "Política d'intimidá"
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"
787
716
788−#: qml/Wizard/Pages/75-report-check.qml:26
717+#: qml/Wizard/Pages/79-system-update.qml:95
789−msgid "Help Us Improve"
718+msgid "This could take a few minutes..."
790−msgstr "Ayúdanos a meyorar"
719+msgstr "Esto podría tardar unos minutos…"
791
720
792−#: qml/Wizard/Pages/75-report-check.qml:59
721+#: qml/Wizard/Pages/79-system-update.qml:109
793−msgid "Improve system performance by sending us crashes and error reports."
722+msgid "Install and restart now"
794msgstr ""
723msgstr ""
795−"Ameyora'l rindimientu del sistema unviándonos los informes d'errores y "
796−"cuelgues."
797
724
798−#: qml/Wizard/Pages/75-report-check.qml:60
725+#: qml/Wizard/Pages/80-finished.qml:91
799−msgid "Privacy policy"
726+msgid "Welcome Back"
800−msgstr "Política d'intimidá"
727+msgstr "Volvi afayate"
801
728
802−#: qml/Wizard/Pages/80-finished.qml:89
729+#: qml/Wizard/Pages/80-finished.qml:91
803msgid "Welcome to Ubuntu"
730msgid "Welcome to Ubuntu"
804−msgstr "Bienveníu/a a Ubuntu"
731+msgstr "Afáyate n'Ubuntu"
805
732
806−#: qml/Wizard/Pages/80-finished.qml:104
733+#: qml/Wizard/Pages/80-finished.qml:106
807msgid "You are ready to use your device now"
734msgid "You are ready to use your device now"
808−msgstr "Ya tas preparáu pa usar el preséu"
735+msgstr "Agora 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."
831
736
832−#: qml/Wizard/Pages/here-terms.qml:93
737+#: qml/Wizard/Pages/80-finished.qml:126
833−msgid ""
738+msgid "Continue"
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 ""
739+msgstr "Siguir"
837−"La información collechada úsase p'analizar el serviciu y ameyorar l'usu del "
838−"serviciu, non pa identificate personalmente."
839
740
840−#: qml/Wizard/Pages/here-terms.qml:106
741+#: qml/Wizard/Pages/80-finished.qml:126
841−#, qt-format
742+msgid "Get Started"
842−msgid "By continuing, you agree to the HERE platform %1 and %2."
743+msgstr "Entamar"
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"
848
744
849#: qml/Wizard/Pages/passcode-confirm.qml:43
745#: qml/Wizard/Pages/passcode-confirm.qml:43
850−#: qml/Wizard/Pages/passcode-desktop.qml:97
746+#: qml/Wizard/Pages/passcode-desktop.qml:104
851msgid "Confirm passcode"
747msgid "Confirm passcode"
852−msgstr "Confirmar códigu de pasu"
748+msgstr "Confirmación"
853
749
854#: qml/Wizard/Pages/passcode-confirm.qml:45
750#: qml/Wizard/Pages/passcode-confirm.qml:45
855msgid "Incorrect passcode."
751msgid "Incorrect passcode."
856−msgstr "Códigu de pasu incorreutu."
752+msgstr "El códigu numbéricu ye incorreutu."
857
753
858#: qml/Wizard/Pages/passcode-confirm.qml:45
754#: qml/Wizard/Pages/passcode-confirm.qml:45
859msgctxt "Enter the passcode again"
755msgctxt "Enter the passcode again"
860msgid "Please re-enter."
756msgid "Please re-enter."
861−msgstr "Vuelve a escribilu."
757+msgstr "Volvi introducilu."
862
758
863#: qml/Wizard/Pages/passcode-desktop.qml:31
759#: qml/Wizard/Pages/passcode-desktop.qml:31
864msgid "Lock Screen Passcode"
760msgid "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"
866
762
867−#: qml/Wizard/Pages/passcode-desktop.qml:61
763+#: qml/Wizard/Pages/passcode-desktop.qml:68
868msgid "Enter 4 numbers to setup your passcode"
764msgid "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"
870
766
871−#: qml/Wizard/Pages/passcode-desktop.qml:77
767+#: qml/Wizard/Pages/passcode-desktop.qml:84
872#: qml/Wizard/Pages/passcode-set.qml:54
768#: qml/Wizard/Pages/passcode-set.qml:54
873msgid "Choose passcode"
769msgid "Choose passcode"
874−msgstr "Escueyi'l códigu de pasu"
770+msgstr "Códigu numbéricu"
875
771
876−#: qml/Wizard/Pages/passcode-desktop.qml:127
772+#: qml/Wizard/Pages/passcode-desktop.qml:139
877msgid "Passcode too short"
773msgid "Passcode too short"
878−msgstr "Códigu de pasu curtiu enforma"
774+msgstr "El códigu numbéricu ye percurtiu"
879
775
880−#: qml/Wizard/Pages/passcode-desktop.qml:129
776+#: qml/Wizard/Pages/passcode-desktop.qml:141
881msgid "Passcodes match"
777msgid "Passcodes match"
882−msgstr "Los códigos de pasu casen"
778+msgstr "Los códigos numbéricos concasen"
883
779
884−#: qml/Wizard/Pages/passcode-desktop.qml:131
780+#: qml/Wizard/Pages/passcode-desktop.qml:143
885msgid "Passcodes do not match"
781msgid "Passcodes do not match"
886−msgstr "Los códigos de pasu nun casen"
782+msgstr "Los códigos numbéricos nun concasen"
887
783
888#: qml/Wizard/Pages/passcode-set.qml:62
784#: qml/Wizard/Pages/passcode-set.qml:62
889msgid "Passcode must be 4 characters long"
785msgid "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"
891
787
892#: qml/Wizard/Pages/password-set.qml:31
788#: qml/Wizard/Pages/password-set.qml:31
893msgid "Lock Screen Password"
789msgid "Lock Screen Password"
894−msgstr "Contraseña del Bloquéu de pantalla"
790+msgstr "Contraseña de la pantalla de bloquéu"
895
791
896−#: qml/Wizard/Pages/password-set.qml:62
792+#: qml/Wizard/Pages/password-set.qml:68
897msgid "Enter at least 8 characters"
793msgid "Enter at least 8 characters"
898−msgstr "Escribe polo menos 8 caráuteres"
794+msgstr "Introduz 8 caráuteres polo menos"
899
795
900−#: qml/Wizard/Pages/password-set.qml:74
796+#: qml/Wizard/Pages/password-set.qml:80
901msgid "Choose password"
797msgid "Choose password"
902−msgstr "Escueye la contraseña"
798+msgstr "Contraseña"
903
799
904−#: qml/Wizard/Pages/password-set.qml:104
800+#: qml/Wizard/Pages/password-set.qml:110
905msgid "Confirm password"
801msgid "Confirm password"
906−msgstr "Confirmar contraseña"
802+msgstr "Confirmación"
907
803
908#: qml/Wizard/Pages/sim.qml:27
804#: qml/Wizard/Pages/sim.qml:27
909msgid "No SIM card installed"
805msgid "No SIM card installed"
910−msgstr "Nun ta instalada nenguna tarxeta SIM"
806+msgstr "Nun s'instaló denguna tarxeta SIM"
911
807
912#: qml/Wizard/Pages/sim.qml:54
808#: qml/Wizard/Pages/sim.qml:54
913msgid "SIM card added"
809msgid "SIM card added"
914−msgstr "Amestóse tarxeta SIM"
810+msgstr ""
915
811
916#: qml/Wizard/Pages/sim.qml:55
812#: qml/Wizard/Pages/sim.qml:55
917msgid "You must restart the device to access the mobile network."
813msgid "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."
919
815
920#: qml/Wizard/Pages/sim.qml:59
816#: qml/Wizard/Pages/sim.qml:59
921msgid "Restart"
817msgid "Restart"
922−msgstr "Reaniciar"
818+msgstr ""
923
819
924#: qml/Wizard/Pages/sim.qml:78
820#: qml/Wizard/Pages/sim.qml:78
925msgid "You won’t be able to make calls or use text messaging without a SIM."
821msgid "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."
927
823
928#: qml/Wizard/Pages/sim.qml:90
824#: qml/Wizard/Pages/sim.qml:90
929msgid "To proceed with no SIM tap Skip."
825msgid "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."
931
827
932#: qml/Wizard/PasswordMeter.qml:87
828#: qml/Wizard/PasswordMeter.qml:87
933msgid "Password too short"
829msgid "Password too short"
934−msgstr "Contraseña curtia enforma"
830+msgstr "La contraseña ye percurtia"
935
831
936#: qml/Wizard/PasswordMeter.qml:89
832#: qml/Wizard/PasswordMeter.qml:89
937msgid "Passwords match"
833msgid "Passwords match"
@@ -943,11 +839,11 @@ msgstr "Les contraseñes nun concasen"
943
839
944#: qml/Wizard/PasswordMeter.qml:95
840#: qml/Wizard/PasswordMeter.qml:95
945msgid "Strong password"
841msgid "Strong password"
946−msgstr "Contraseña fuerte"
842+msgstr "Contraseña perbona"
947
843
948#: qml/Wizard/PasswordMeter.qml:97
844#: qml/Wizard/PasswordMeter.qml:97
949msgid "Fair password"
845msgid "Fair password"
950−msgstr "Contraseña aceutable"
846+msgstr "Contraseña bona"
951
847
952#: qml/Wizard/PasswordMeter.qml:99
848#: qml/Wizard/PasswordMeter.qml:99
953msgid "Weak password"
849msgid "Weak password"
@@ -955,7 +851,185 @@ msgstr "Contraseña feble"
955
851
956#: qml/Wizard/PasswordMeter.qml:101
852#: qml/Wizard/PasswordMeter.qml:101
957msgid "Very weak password"
853msgid "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"
959
1033
960#~ msgid "Skip intro"
1034#~ msgid "Skip intro"
961#~ msgstr "Omitir la intro"
1035#~ msgstr "Omitir la intro"
@@ -983,8 +1057,8 @@ msgstr "Contraseña feble enforma"
983
1057
984#~ msgid "Swipe from the left to reveal the launcher for quick access to apps"
1058#~ msgid "Swipe from the left to reveal the launcher for quick access to apps"
985#~ msgstr ""
1059#~ msgstr ""
986−#~ "Esliza'l deu dende la esquierda p'amosar el llanzador y acceder rápidamente "
1060+#~ "Esliza'l deu dende la esquierda p'amosar el llanzador y acceder "
987−#~ "a les aplicaciones"
1061+#~ "rápidamente a les aplicaciones"
988
1062
989#~ msgid "Well done"
1063#~ msgid "Well done"
990#~ msgstr "Bien fecho"
1064#~ msgstr "Bien fecho"
@@ -992,21 +1066,12 @@ msgstr "Contraseña feble enforma"
992#~ msgid "Confirm"
1066#~ msgid "Confirm"
993#~ msgstr "Confirmar"
1067#~ msgstr "Confirmar"
994
1068
995−#~ msgid "Speaking..."
996−#~ msgstr "Falando…"
997−
998−#~ msgid "Loading. Please Wait..."
999−#~ msgstr "Cargando, espera…"
1000−
1001#~ msgid "Type or say a command"
1069#~ msgid "Type or say a command"
1002#~ msgstr "Escribi o di una orde"
1070#~ msgstr "Escribi o di una orde"
1003
1071
1004#~ msgid "Speak Now..."
1072#~ msgid "Speak Now..."
1005#~ msgstr "Fala agora…"
1073#~ msgstr "Fala agora…"
1006
1074
1007−#~ msgid "Search"
1008−#~ msgstr "Guetar"
1009−
1010#~ msgid "See less"
1075#~ msgid "See less"
1011#~ msgstr "Ver menos"
1076#~ msgstr "Ver menos"
1012
1077
@@ -1053,7 +1118,6 @@ msgstr "Contraseña feble enforma"
1053#~ msgid "Store"
1118#~ msgid "Store"
1054#~ msgstr "Tienda"
1119#~ msgstr "Tienda"
1055
1120
1056−#, qt-format
1057#~ msgid "Sorry, incorrect %1"
1121#~ msgid "Sorry, incorrect %1"
1058#~ msgstr "Sentímoslo, %1 incorreutu"
1122#~ msgstr "Sentímoslo, %1 incorreutu"
1059
1123
@@ -1069,9 +1133,6 @@ msgstr "Contraseña feble enforma"
1069#~ msgid "Manage Scopes"
1133#~ msgid "Manage Scopes"
1070#~ msgstr "Xestionar ámbitos"
1134#~ msgstr "Xestionar ámbitos"
1071
1135
1072−#~ msgid "Continue"
1073−#~ msgstr "Siguir"
1074−
1075#~ msgid "Without it, you won’t be able to make calls or use text messaging."
1136#~ msgid "Without it, you won’t be able to make calls or use text messaging."
1076#~ msgstr "Ensin ella, nun vas poder facer llamaes nin unviar mensaxes."
1137#~ msgstr "Ensin ella, nun vas poder facer llamaes nin unviar mensaxes."
1077
1138
@@ -1103,17 +1164,12 @@ msgstr "Contraseña feble enforma"
1103#~ msgid "Not at all"
1164#~ msgid "Not at all"
1104#~ msgstr "De nengún mou"
1165#~ msgstr "De nengún mou"
1105
1166
1106−#, qt-format
1107#~ msgid "〈 %1"
1167#~ msgid "〈 %1"
1108#~ msgstr "〈 %1"
1168#~ msgstr "〈 %1"
1109
1169
1110−#, qt-format
1111#~ msgid "%1 〉"
1170#~ msgid "%1 〉"
1112#~ msgstr "%1 〉"
1171#~ msgstr "%1 〉"
1113
1172
1114−#~ msgid "Open the launcher"
1115−#~ msgstr "Abrir el llanzador"
1116−
1117#~ msgid "Tap here to continue."
1173#~ msgid "Tap here to continue."
1118#~ msgstr "Toca equí pa siguir."
1174#~ msgstr "Toca equí pa siguir."
1119
1175
@@ -1154,35 +1210,28 @@ msgstr "Contraseña feble enforma"
1154#~ msgid "Sorry, incorrect passphrase."
1210#~ msgid "Sorry, incorrect passphrase."
1155#~ msgstr "Perdón, fras de pasu incorreuta"
1211#~ msgstr "Perdón, fras de pasu incorreuta"
1156
1212
1157−#, qt-format
1158#~ msgid "Enter %1"
1213#~ msgid "Enter %1"
1159#~ msgstr "Introduz %1"
1214#~ msgstr "Introduz %1"
1160
1215
1161#~ msgid "Sorry, incorrect passcode."
1216#~ msgid "Sorry, incorrect passcode."
1162#~ msgstr "Perdón, códigu de pasu incorreutu."
1217#~ msgstr "Perdón, códigu de pasu incorreutu."
1163
1218
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−
1170#~ msgid "Please re-enter"
1219#~ msgid "Please re-enter"
1171#~ msgstr "Por favor, reintroduzla"
1220#~ msgstr "Por favor, reintroduzla"
1172
1221
1173#~ msgid ""
1222#~ msgid ""
1174−#~ "If passcode is entered incorrectly, your phone will conduct a factory reset "
1223+#~ "If passcode is entered incorrectly, your phone will conduct a factory "
1175−#~ "and all personal data will be deleted."
1224+#~ "reset and all personal data will be deleted."
1176#~ msgstr ""
1225#~ msgstr ""
1177−#~ "Si s'inxerta'l códigu de pasu incorreutamente, el to teléfonu va reafitase y "
1226+#~ "Si s'inxerta'l códigu de pasu incorreutamente, el to teléfonu va "
1178−#~ "van desaniciase tolos datos personales."
1227+#~ "reafitase y van desaniciase tolos datos personales."
1179
1228
1180#~ msgid ""
1229#~ msgid ""
1181#~ "If passphrase is entered incorrectly, your phone will conduct a factory "
1230#~ "If passphrase is entered incorrectly, your phone will conduct a factory "
1182#~ "reset and all personal data will be deleted."
1231#~ "reset and all personal data will be deleted."
1183#~ msgstr ""
1232#~ msgstr ""
1184−#~ "Si s'inxerta la fras de pasu incorreutamente, el to teléfonu va reafitase y "
1233+#~ "Si s'inxerta la fras de pasu incorreutamente, el to teléfonu va reafitase "
1185−#~ "van desaniciase tolos datos personales."
1234+#~ "y van desaniciase tolos datos personales."
1186
1235
1187#~ msgid "This will be your last attempt."
1236#~ msgid "This will be your last attempt."
1188#~ msgstr "Esti sedra'l to caberu intentu"
1237#~ msgstr "Esti sedra'l to caberu intentu"
@@ -1266,11 +1315,11 @@ msgstr "Contraseña feble enforma"
1266#~ msgstr "¡Bon trabayu!"
1315#~ msgstr "¡Bon trabayu!"
1267
1316
1268#~ msgid ""
1317#~ msgid ""
1269−#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
1318+#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms "
1270−#~ "conditions</a>."
1319+#~ "and conditions</a>."
1271#~ msgstr ""
1320#~ msgstr ""
1272−#~ "Esbillando esta opción aceutes los <a href='#'>términos y condiciones</a> de "
1321+#~ "Esbillando esta opción aceutes los <a href='#'>términos y condiciones</a> "
1273−#~ "Nokia HERE."
1322+#~ "de Nokia HERE."
1274
1323
1275#~ msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
1324#~ msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
1276#~ msgstr ""
1325#~ msgstr ""
@@ -1349,44 +1398,11 @@ msgstr "Contraseña feble enforma"
1349
1398
1350#~ msgid "Short or long swipe from the right edge to view your open apps"
1399#~ msgid "Short or long swipe from the right edge to view your open apps"
1351#~ msgstr ""
1400#~ 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"
1353
1403
1354#~ msgid "Swipe up to manage the app"
1404#~ msgid "Swipe up to manage the app"
1355#~ msgstr "Eslizar p'alministrar la app"
1405#~ msgstr "Eslizar p'alministrar la app"
1356
1406
1357#~ msgid "Swipe up to create a message"
1407#~ msgid "Swipe up to create a message"
1358#~ msgstr "Eslizar pa crear un mensaxe"
1408#~ 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 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10−"POT-Creation-Date: 2017-04-04 22:56+0000\n"
10+"POT-Creation-Date: 2021-01-29 11:42-0600\n"
11"PO-Revision-Date: 2014-09-03 16:39+0000\n"
11"PO-Revision-Date: 2014-09-03 16:39+0000\n"
12"Last-Translator: Nicat Məmmədov <n1c4t97@gmail.com>\n"
12"Last-Translator: Nicat Məmmədov <n1c4t97@gmail.com>\n"
13"Language-Team: Azerbaijani <az@li.org>\n"
13"Language-Team: Azerbaijani <az@li.org>\n"
14+"Language: az\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
19+"X-Launchpad-Export-Date: 2016-11-23 06:34+0000\n"
19−"X-Generator: Launchpad (build 18343)\n"
20+"X-Generator: Launchpad (build 18269)\n"
20
21
21−#: plugins/LightDM/Greeter.cpp:188
22+#: plugins/LightDM/Greeter.cpp:199
22msgid "Password: "
23msgid "Password: "
23msgstr "Şifrә: "
24msgstr "Şifrә: "
24
25
25−#: plugins/LightDM/Greeter.cpp:203
26+#: plugins/LightDM/Greeter.cpp:214
26msgid "Username"
27msgid "Username"
27msgstr ""
28msgstr ""
28
29
29−#: plugins/LightDM/Greeter.cpp:242
30+#: plugins/LightDM/Greeter.cpp:258
30msgid "Failed to authenticate"
31msgid "Failed to authenticate"
31msgstr ""
32msgstr ""
32
33
33−#: plugins/LightDM/Greeter.cpp:244
34+#: plugins/LightDM/Greeter.cpp:260
34msgid "Invalid password, please try again"
35msgid "Invalid password, please try again"
35msgstr ""
36msgstr ""
36
37
37−#: plugins/LightDM/Greeter.cpp:254
38+#: plugins/LightDM/Greeter.cpp:270
38msgid "Log In"
39msgid "Log In"
39msgstr ""
40msgstr ""
40
41
41−#: plugins/LightDM/Greeter.cpp:254
42+#: plugins/LightDM/Greeter.cpp:270
42msgid "Retry"
43msgid "Retry"
43msgstr ""
44msgstr ""
44
45
@@ -50,16 +51,16 @@ msgstr ""
50msgid "Guest Session"
51msgid "Guest Session"
51msgstr ""
52msgstr ""
52
53
53−#: plugins/Unity/Launcher/launcheritem.cpp:49
54+#: plugins/Unity/Launcher/launcheritem.cpp:48
54−#: plugins/Unity/Launcher/launcheritem.cpp:123
55+#: plugins/Unity/Launcher/launcheritem.cpp:122
55msgid "Pin shortcut"
56msgid "Pin shortcut"
56msgstr "Pin qısayolu"
57msgstr "Pin qısayolu"
57
58
58−#: plugins/Unity/Launcher/launcheritem.cpp:55
59+#: plugins/Unity/Launcher/launcheritem.cpp:54
59msgid "Quit"
60msgid "Quit"
60msgstr ""
61msgstr ""
61
62
62−#: plugins/Unity/Launcher/launcheritem.cpp:123
63+#: plugins/Unity/Launcher/launcheritem.cpp:122
63msgid "Unpin shortcut"
64msgid "Unpin shortcut"
64msgstr "Açma qısayolu"
65msgstr "Açma qısayolu"
65
66
@@ -82,9 +83,8 @@ msgctxt "Button: Log out from the system"
82msgid "Log Out"
83msgid "Log Out"
83msgstr ""
84msgstr ""
84
85
85−#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:284
86−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
87−#: qml/Wizard/Pages/passcode-confirm.qml:32
87+#: qml/Greeter/NarrowView.qml:215 qml/Wizard/Pages/passcode-confirm.qml:32
88#: qml/Wizard/Pages/passcode-set.qml:32
88#: qml/Wizard/Pages/passcode-set.qml:32
89msgid "Cancel"
89msgid "Cancel"
90msgstr "İmtina"
90msgstr "İmtina"
@@ -106,33 +106,37 @@ msgstr "Yox"
106msgid "Yes"
106msgid "Yes"
107msgstr "Hə"
107msgstr "Hə"
108
108
109−#: qml/Components/Dialogs.qml:239
109+#: qml/Components/Dialogs.qml:243
110msgctxt "Title: Power off/Restart dialog"
110msgctxt "Title: Power off/Restart dialog"
111msgid "Power"
111msgid "Power"
112msgstr ""
112msgstr ""
113
113
114−#: qml/Components/Dialogs.qml:240
114+#: qml/Components/Dialogs.qml:244
115msgid ""
115msgid ""
116"Are you sure you would like\n"
116"Are you sure you would like\n"
117"to power off?"
117"to power off?"
118msgstr ""
118msgstr ""
119
119
120−#: qml/Components/Dialogs.qml:244
120+#: qml/Components/Dialogs.qml:248
121msgctxt "Button: Power off the system"
121msgctxt "Button: Power off the system"
122msgid "Power off"
122msgid "Power off"
123msgstr ""
123msgstr ""
124
124
125−#: qml/Components/Dialogs.qml:255
125+#: qml/Components/Dialogs.qml:263
126msgctxt "Button: Restart the system"
126msgctxt "Button: Restart the system"
127msgid "Restart"
127msgid "Restart"
128msgstr ""
128msgstr ""
129
129
130+#: qml/Components/Dialogs.qml:276
131+msgid "Screenshot"
132+msgstr ""
133+
130#: qml/Components/KeyboardShortcutsOverlay.qml:41
134#: qml/Components/KeyboardShortcutsOverlay.qml:41
131msgid "Keyboard Shortcuts"
135msgid "Keyboard Shortcuts"
132msgstr ""
136msgstr ""
133
137
134#: qml/Components/KeyboardShortcutsOverlay.qml:55
138#: qml/Components/KeyboardShortcutsOverlay.qml:55
135−msgid "Unity 8"
139+msgid "Lomiri"
136msgstr ""
140msgstr ""
137
141
138#: qml/Components/KeyboardShortcutsOverlay.qml:62
142#: qml/Components/KeyboardShortcutsOverlay.qml:62
@@ -219,18 +223,6 @@ msgstr ""
219msgid "Opens the Application Drawer."
223msgid "Opens the Application Drawer."
220msgstr ""
224msgstr ""
221
225
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−
234#: qml/Components/KeyboardShortcutsOverlay.qml:235
226#: qml/Components/KeyboardShortcutsOverlay.qml:235
235msgid "Switching"
227msgid "Switching"
236msgstr ""
228msgstr ""
@@ -303,7 +295,7 @@ msgstr ""
303msgid "Closes the current window."
295msgid "Closes the current window."
304msgstr ""
296msgstr ""
305
297
306−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
298+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:235
307msgid "Return to Call"
299msgid "Return to Call"
308msgstr ""
300msgstr ""
309
301
@@ -362,8 +354,10 @@ msgid ""
362msgstr ""
354msgstr ""
363
355
364#: qml/Components/VirtualTouchPad.qml:327
356#: qml/Components/VirtualTouchPad.qml:327
357+#, fuzzy
358+#| msgid "Tap to return to call..."
365msgid "Tap left button to click."
359msgid "Tap left button to click."
366−msgstr ""
360+msgstr "Zəngə qayıtmaq üçün toxunun..."
367
361
368#: qml/Components/VirtualTouchPad.qml:339
362#: qml/Components/VirtualTouchPad.qml:339
369msgid "Tap right button to right click."
363msgid "Tap right button to right click."
@@ -377,103 +371,6 @@ msgstr ""
377msgid "Find more settings in the system settings."
371msgid "Find more settings in the system settings."
378msgstr ""
372msgstr ""
379
373
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−
477#: qml/Greeter/CoverPage.qml:127
374#: qml/Greeter/CoverPage.qml:127
478msgid "Unlock"
375msgid "Unlock"
479msgstr ""
376msgstr ""
@@ -509,7 +406,7 @@ msgstr ""
509msgid "Enter passcode to unlock"
406msgid "Enter passcode to unlock"
510msgstr ""
407msgstr ""
511
408
512−#: qml/Greeter/NarrowView.qml:228
409+#: qml/Greeter/NarrowView.qml:235
513msgid "Emergency"
410msgid "Emergency"
514msgstr ""
411msgstr ""
515
412
@@ -525,17 +422,18 @@ msgstr ""
525msgid "Select desktop environment"
422msgid "Select desktop environment"
526msgstr ""
423msgstr ""
527
424
528−#: qml/Launcher/Drawer.qml:94
425+#: qml/Launcher/Drawer.qml:250
426+#, fuzzy
427+#| msgid "Search"
529msgid "Search…"
428msgid "Search…"
530−msgstr ""
429+msgstr "Axtar"
531
430
532−#: qml/Launcher/Drawer.qml:129
431+#: qml/Launcher/PullToRefreshScopeStyle.qml:56
533−msgctxt "Apps sorted alphabetically"
534−msgid "A-Z"
432+msgid "Pull to refresh…"
535msgstr ""
433msgstr ""
536
434
537−#: qml/Launcher/MoreAppsHeader.qml:55
435+#: qml/Launcher/PullToRefreshScopeStyle.qml:61
538−msgid "More apps in the store"
436+msgid "Release to refresh…"
539msgstr ""
437msgstr ""
540
438
541#: qml/Notifications/NotificationMenuItemFactory.qml:124
439#: qml/Notifications/NotificationMenuItemFactory.qml:124
@@ -633,19 +531,25 @@ msgstr ""
633msgid "Drag using 3 fingers any application from one window to the other"
531msgid "Drag using 3 fingers any application from one window to the other"
634msgstr ""
532msgstr ""
635
533
534+#: qml/Stage/Stage.qml:671
535+msgid "No running apps"
536+msgstr ""
537+
636#: qml/Tutorial/TutorialLeftLong.qml:49
538#: qml/Tutorial/TutorialLeftLong.qml:49
539+#, fuzzy
540+#| msgid "Try swiping from the top edge to access the indicators"
637msgid "Long swipe from the left edge to open the Application Drawer"
541msgid "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"
639
543
640#: qml/Tutorial/TutorialLeft.qml:47
544#: qml/Tutorial/TutorialLeft.qml:47
641msgid "Short swipe from the left edge to open the launcher"
545msgid "Short swipe from the left edge to open the launcher"
642msgstr ""
546msgstr ""
643
547
644−#: qml/Tutorial/TutorialRight.qml:55
548+#: qml/Tutorial/TutorialRight.qml:54
645msgid "Push your mouse against the right edge to view your open apps"
549msgid "Push your mouse against the right edge to view your open apps"
646msgstr ""
550msgstr ""
647
551
648−#: qml/Tutorial/TutorialRight.qml:56
552+#: qml/Tutorial/TutorialRight.qml:55
649msgid "Swipe from the right edge to view your open apps"
553msgid "Swipe from the right edge to view your open apps"
650msgstr ""
554msgstr ""
651
555
@@ -653,25 +557,42 @@ msgstr ""
653msgid "Swipe from the top edge to access notifications and quick settings"
557msgid "Swipe from the top edge to access notifications and quick settings"
654msgstr ""
558msgstr ""
655
559
656−#: qml/Wizard/Page.qml:54
560+#: qml/Wizard/Page.qml:59
657msgctxt "Button: Go back one page in the Wizard"
561msgctxt "Button: Go back one page in the Wizard"
658msgid "Back"
562msgid "Back"
659msgstr ""
563msgstr ""
660
564
661−#: qml/Wizard/Pages/10-welcome.qml:28
565+#: qml/Wizard/Pages/10-welcome.qml:29
662msgid "Language"
566msgid "Language"
663msgstr ""
567msgstr ""
664
568
665−#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
569+#: qml/Wizard/Pages/10-welcome.qml:176
666−#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
570+#: qml/Wizard/Pages/10-welcome-update.qml:126
571+#: qml/Wizard/Pages/11-changelog.qml:74 qml/Wizard/Pages/20-keyboard.qml:152
667−#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
572+#: qml/Wizard/Pages/30-wifi.qml:214 qml/Wizard/Pages/50-timezone.qml:272
668−#: qml/Wizard/Pages/70-passwd-type.qml:145
573+#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/70-passwd-type.qml:146
669−#: qml/Wizard/Pages/75-report-check.qml:84
670−#: qml/Wizard/Pages/passcode-desktop.qml:142
574+#: qml/Wizard/Pages/passcode-desktop.qml:154
671−#: qml/Wizard/Pages/password-set.qml:142
575+#: qml/Wizard/Pages/password-set.qml:153
672msgid "Next"
576msgid "Next"
673msgstr ""
577msgstr ""
674
578
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+
675#: qml/Wizard/Pages/20-keyboard.qml:31
596#: qml/Wizard/Pages/20-keyboard.qml:31
676msgid "Select Keyboard"
597msgid "Select Keyboard"
677msgstr ""
598msgstr ""
@@ -684,64 +605,33 @@ msgstr ""
684msgid "Keyboard layout"
605msgid "Keyboard layout"
685msgstr ""
606msgstr ""
686
607
687−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
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
688−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
610+#: qml/Wizard/Pages/sim.qml:101
689msgid "Skip"
611msgid "Skip"
690msgstr ""
612msgstr ""
691
613
692−#: qml/Wizard/Pages/30-wifi.qml:30
614+#: qml/Wizard/Pages/30-wifi.qml:31
693msgid "Connect to Wi‑Fi"
615msgid "Connect to Wi‑Fi"
694msgstr ""
616msgstr ""
695
617
696−#: qml/Wizard/Pages/30-wifi.qml:131
618+#: qml/Wizard/Pages/30-wifi.qml:139
697msgid "Connected"
619msgid "Connected"
698msgstr ""
620msgstr ""
699
621
700−#: qml/Wizard/Pages/30-wifi.qml:164
622+#: qml/Wizard/Pages/30-wifi.qml:172
701msgid "Available Wi-Fi networks"
623msgid "Available Wi-Fi networks"
702msgstr ""
624msgstr ""
703
625
704−#: qml/Wizard/Pages/30-wifi.qml:165
626+#: qml/Wizard/Pages/30-wifi.qml:173
705msgid "No available Wi-Fi networks"
627msgid "No available Wi-Fi networks"
706msgstr ""
628msgstr ""
707
629
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−
740#: qml/Wizard/Pages/50-timezone.qml:30
630#: qml/Wizard/Pages/50-timezone.qml:30
741msgid "Time Zone"
631msgid "Time Zone"
742msgstr ""
632msgstr ""
743
633
744−#: qml/Wizard/Pages/50-timezone.qml:182
634+#: qml/Wizard/Pages/50-timezone.qml:183
745msgid "Enter your city"
635msgid "Enter your city"
746msgstr ""
636msgstr ""
747
637
@@ -749,7 +639,7 @@ msgstr ""
749msgid "Personalize Your Device"
639msgid "Personalize Your Device"
750msgstr ""
640msgstr ""
751
641
752−#: qml/Wizard/Pages/60-account.qml:48
642+#: qml/Wizard/Pages/60-account.qml:54
753msgid "Preferred Name"
643msgid "Preferred Name"
754msgstr ""
644msgstr ""
755
645
@@ -757,81 +647,72 @@ msgstr ""
757msgid "Lock Screen"
647msgid "Lock Screen"
758msgstr ""
648msgstr ""
759
649
760−#: qml/Wizard/Pages/70-passwd-type.qml:102
650+#: qml/Wizard/Pages/70-passwd-type.qml:103
761msgctxt "Label: Type of security method"
651msgctxt "Label: Type of security method"
762msgid "Create new password"
652msgid "Create new password"
763msgstr ""
653msgstr ""
764
654
765−#: qml/Wizard/Pages/70-passwd-type.qml:104
655+#: qml/Wizard/Pages/70-passwd-type.qml:105
766msgctxt "Label: Type of security method"
656msgctxt "Label: Type of security method"
767msgid "Create passcode (numbers only)"
657msgid "Create passcode (numbers only)"
768msgstr ""
658msgstr ""
769
659
770−#: qml/Wizard/Pages/70-passwd-type.qml:106
660+#: qml/Wizard/Pages/70-passwd-type.qml:107
771msgctxt "Label: Type of security method"
661msgctxt "Label: Type of security method"
772msgid "No lock code"
662msgid "No lock code"
773msgstr ""
663msgstr ""
774
664
775−#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
665+#: qml/Wizard/Pages/79-system-update.qml:28
776−msgid "Privacy Policy"
666+msgid "Update Device"
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."
785msgstr ""
667msgstr ""
786
668
787−#: qml/Wizard/Pages/75-report-check.qml:60
669+#: qml/Wizard/Pages/79-system-update.qml:55
788−msgid "Privacy policy"
670+msgid ""
671+"There is a system update available and ready to install. Afterwards, the "
672+"device will automatically restart."
789msgstr ""
673msgstr ""
790
674
791−#: qml/Wizard/Pages/80-finished.qml:89
675+#: qml/Wizard/Pages/79-system-update.qml:76
676+msgctxt "string identifying name of the update"
792−msgid "Welcome to Ubuntu"
677+msgid "Ubuntu Touch system"
793msgstr ""
678msgstr ""
794
679
795−#: qml/Wizard/Pages/80-finished.qml:104
680+#: qml/Wizard/Pages/79-system-update.qml:83
796−msgid "You are ready to use your device now"
681+#, qt-format
682+msgctxt "version of the system update"
683+msgid "Version %1"
797msgstr ""
684msgstr ""
798
685
799−#: qml/Wizard/Pages/80-finished.qml:124
686+#: qml/Wizard/Pages/79-system-update.qml:95
800−msgid "Get Started"
687+msgid "This could take a few minutes..."
801msgstr ""
688msgstr ""
802
689
803−#: qml/Wizard/Pages/here-terms.qml:25
690+#: qml/Wizard/Pages/79-system-update.qml:109
804−msgid "Terms & Conditions"
691+msgid "Install and restart now"
805msgstr ""
692msgstr ""
806
693
807−#: qml/Wizard/Pages/here-terms.qml:69
694+#: qml/Wizard/Pages/80-finished.qml:91
808−msgid "Your device uses positioning technologies provided by HERE."
695+msgid "Welcome Back"
809msgstr ""
696msgstr ""
810
697
811−#: qml/Wizard/Pages/here-terms.qml:81
698+#: qml/Wizard/Pages/80-finished.qml:91
812−msgid ""
699+msgid "Welcome to Ubuntu"
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."
816msgstr ""
700msgstr ""
817
701
818−#: qml/Wizard/Pages/here-terms.qml:93
702+#: qml/Wizard/Pages/80-finished.qml:106
819−msgid ""
703+msgid "You are ready to use your device now"
820−"The information collected is used to analyze the service and to improve the "
821−"use of service, but not to identify you personally."
822msgstr ""
704msgstr ""
823
705
824−#: qml/Wizard/Pages/here-terms.qml:106
706+#: qml/Wizard/Pages/80-finished.qml:126
825−#, qt-format
707+msgid "Continue"
826−msgid "By continuing, you agree to the HERE platform %1 and %2."
827msgstr ""
708msgstr ""
828
709
829−#: qml/Wizard/Pages/here-terms.qml:107
710+#: qml/Wizard/Pages/80-finished.qml:126
830−msgid "Service Terms"
711+msgid "Get Started"
831msgstr ""
712msgstr ""
832
713
833#: qml/Wizard/Pages/passcode-confirm.qml:43
714#: qml/Wizard/Pages/passcode-confirm.qml:43
834−#: qml/Wizard/Pages/passcode-desktop.qml:97
715+#: qml/Wizard/Pages/passcode-desktop.qml:104
835msgid "Confirm passcode"
716msgid "Confirm passcode"
836msgstr ""
717msgstr ""
837
718
@@ -848,24 +729,24 @@ msgstr ""
848msgid "Lock Screen Passcode"
729msgid "Lock Screen Passcode"
849msgstr ""
730msgstr ""
850
731
851−#: qml/Wizard/Pages/passcode-desktop.qml:61
732+#: qml/Wizard/Pages/passcode-desktop.qml:68
852msgid "Enter 4 numbers to setup your passcode"
733msgid "Enter 4 numbers to setup your passcode"
853msgstr ""
734msgstr ""
854
735
855−#: qml/Wizard/Pages/passcode-desktop.qml:77
736+#: qml/Wizard/Pages/passcode-desktop.qml:84
856#: qml/Wizard/Pages/passcode-set.qml:54
737#: qml/Wizard/Pages/passcode-set.qml:54
857msgid "Choose passcode"
738msgid "Choose passcode"
858msgstr ""
739msgstr ""
859
740
860−#: qml/Wizard/Pages/passcode-desktop.qml:127
741+#: qml/Wizard/Pages/passcode-desktop.qml:139
861msgid "Passcode too short"
742msgid "Passcode too short"
862msgstr ""
743msgstr ""
863
744
864−#: qml/Wizard/Pages/passcode-desktop.qml:129
745+#: qml/Wizard/Pages/passcode-desktop.qml:141
865msgid "Passcodes match"
746msgid "Passcodes match"
866msgstr ""
747msgstr ""
867
748
868−#: qml/Wizard/Pages/passcode-desktop.qml:131
749+#: qml/Wizard/Pages/passcode-desktop.qml:143
869msgid "Passcodes do not match"
750msgid "Passcodes do not match"
870msgstr ""
751msgstr ""
871
752
@@ -877,15 +758,15 @@ msgstr ""
877msgid "Lock Screen Password"
758msgid "Lock Screen Password"
878msgstr ""
759msgstr ""
879
760
880−#: qml/Wizard/Pages/password-set.qml:62
761+#: qml/Wizard/Pages/password-set.qml:68
881msgid "Enter at least 8 characters"
762msgid "Enter at least 8 characters"
882msgstr ""
763msgstr ""
883
764
884−#: qml/Wizard/Pages/password-set.qml:74
765+#: qml/Wizard/Pages/password-set.qml:80
885msgid "Choose password"
766msgid "Choose password"
886msgstr ""
767msgstr ""
887
768
888−#: qml/Wizard/Pages/password-set.qml:104
769+#: qml/Wizard/Pages/password-set.qml:110
889msgid "Confirm password"
770msgid "Confirm password"
890msgstr ""
771msgstr ""
891
772
@@ -941,12 +822,42 @@ msgstr ""
941msgid "Very weak password"
822msgid "Very weak password"
942msgstr ""
823msgstr ""
943
824
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+
944#~ msgid "Confirm"
858#~ msgid "Confirm"
945#~ msgstr "Təsdiqlə"
859#~ msgstr "Təsdiqlə"
946
860
947−#~ msgid "Search"
948−#~ msgstr "Axtar"
949−
950#~ msgid "Top edge"
861#~ msgid "Top edge"
951#~ msgstr "Yuxarı künc"
862#~ msgstr "Yuxarı künc"
952
863
@@ -962,12 +873,6 @@ msgstr ""
962#~ msgid "Right edge"
873#~ msgid "Right edge"
963#~ msgstr "Sağ Künc"
874#~ msgstr "Sağ Künc"
964
875
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−
971#~ msgid "Speak Now..."
876#~ msgid "Speak Now..."
972#~ msgstr "Danışın..."
877#~ msgstr "Danışın..."
973
878
@@ -1003,18 +908,18 @@ msgstr ""
1003#~ msgstr "Bu sizin son cəhdiniz olacaq."
908#~ msgstr "Bu sizin son cəhdiniz olacaq."
1004
909
1005#~ msgid ""
910#~ msgid ""
1006−#~ "If passcode is entered incorrectly, your phone will conduct a factory reset "
911+#~ "If passcode is entered incorrectly, your phone will conduct a factory "
1007−#~ "and all personal data will be deleted."
912+#~ "reset and all personal data will be deleted."
1008#~ msgstr ""
913#~ msgstr ""
1009−#~ "Əgər açar kod yanlış daxil edilibsə, onda telefonunuz fabrika parametrlərinə "
914+#~ "Əgər açar kod yanlış daxil edilibsə, onda telefonunuz fabrika "
1010−#~ "geri qayıdacaq və bütün şəxsi məlumatlarınız silinəcək."
915+#~ "parametrlərinə geri qayıdacaq və bütün şəxsi məlumatlarınız silinəcək."
1011
916
1012#~ msgid ""
917#~ msgid ""
1013#~ "If passphrase is entered incorrectly, your phone will conduct a factory "
918#~ "If passphrase is entered incorrectly, your phone will conduct a factory "
1014#~ "reset and all personal data will be deleted."
919#~ "reset and all personal data will be deleted."
1015#~ msgstr ""
920#~ msgstr ""
1016−#~ "Əgər açar söz yanlış daxil edilibsə, onda telefonunuz fabrika parametrlərinə "
921+#~ "Əgər açar söz yanlış daxil edilibsə, onda telefonunuz fabrika "
1017−#~ "geri qayıdacaq və bütün şəxsi məlumatlarınız silinəcək."
922+#~ "parametrlərinə geri qayıdacaq və bütün şəxsi məlumatlarınız silinəcək."
1018
923
1019#~ msgid "Log out"
924#~ msgid "Log out"
1020#~ msgstr "Çıxış"
925#~ msgstr "Çıxış"
@@ -1028,9 +933,6 @@ msgstr ""
1028#~ msgid "Reboot"
933#~ msgid "Reboot"
1029#~ msgstr "Yenidən yüklə"
934#~ msgstr "Yenidən yüklə"
1030
935
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−
1034#~ msgid "Skip intro"
936#~ msgid "Skip intro"
1035#~ msgstr "Tәqdimatı keç"
937#~ msgstr "Tәqdimatı keç"
1036
938
@@ -1059,7 +961,6 @@ msgstr ""
1059#~ msgid "Sorry, incorrect passphrase"
961#~ msgid "Sorry, incorrect passphrase"
1060#~ msgstr "Bağışlayın, açar söz yanlışdır"
962#~ msgstr "Bağışlayın, açar söz yanlışdır"
1061
963
1062−#, qt-format
1063#~ msgid "Sorry, incorrect %1"
964#~ msgid "Sorry, incorrect %1"
1064#~ msgstr "Bağışlayın, %1 yanlışdır"
965#~ msgstr "Bağışlayın, %1 yanlışdır"
1065
966
po/be.po+374−433
@@ -6,72 +6,74 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10−"POT-Creation-Date: 2017-04-04 22:56+0000\n"
10+"POT-Creation-Date: 2021-01-29 11:42-0600\n"
11−"PO-Revision-Date: 2015-12-13 13:12+0000\n"
11+"PO-Revision-Date: 2021-03-07 20:28+0000\n"
12−"Last-Translator: Mikhail_SaTuRn <mikhail_saturn@tut.by>\n"
12+"Last-Translator: Zmicer <nashtlumach@gmail.com>\n"
13−"Language-Team: Belarusian <be@li.org>\n"
13+"Language-Team: Belarusian <https://translate.ubports.com/projects/ubports/"
14+"lomiri/be/>\n"
15+"Language: be\n"
14"MIME-Version: 1.0\n"
16"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
18"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
19+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
18−"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
20+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
21+"X-Generator: Weblate 3.11.3\n"
19−"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
22+"X-Launchpad-Export-Date: 2016-11-23 06:34+0000\n"
20−"X-Generator: Launchpad (build 18343)\n"
21
23
22−#: plugins/LightDM/Greeter.cpp:188
24+#: plugins/LightDM/Greeter.cpp:199
23msgid "Password: "
25msgid "Password: "
24msgstr "Пароль: "
26msgstr "Пароль: "
25
27
26−#: plugins/LightDM/Greeter.cpp:203
28+#: plugins/LightDM/Greeter.cpp:214
27msgid "Username"
29msgid "Username"
28−msgstr ""
30+msgstr "Імя карыстальніка"
29
31
30−#: plugins/LightDM/Greeter.cpp:242
32+#: plugins/LightDM/Greeter.cpp:258
31msgid "Failed to authenticate"
33msgid "Failed to authenticate"
32−msgstr ""
34+msgstr "Не атрымалася выканаць аўтэнтыфікацыю"
33
35
34−#: plugins/LightDM/Greeter.cpp:244
36+#: plugins/LightDM/Greeter.cpp:260
35msgid "Invalid password, please try again"
37msgid "Invalid password, please try again"
36−msgstr ""
38+msgstr "Хібны пароль, паспрабуйце яшчэ раз"
37
39
38−#: plugins/LightDM/Greeter.cpp:254
40+#: plugins/LightDM/Greeter.cpp:270
39msgid "Log In"
41msgid "Log In"
40−msgstr ""
42+msgstr "Увайсці"
41
43
42−#: plugins/LightDM/Greeter.cpp:254
44+#: plugins/LightDM/Greeter.cpp:270
43msgid "Retry"
45msgid "Retry"
44msgstr "Паспрабаваць зноў"
46msgstr "Паспрабаваць зноў"
45
47
46#: plugins/LightDM/UsersModel.cpp:157
48#: plugins/LightDM/UsersModel.cpp:157
47msgid "Login"
49msgid "Login"
48−msgstr ""
50+msgstr "Увайсці"
49
51
50#: plugins/LightDM/UsersModel.cpp:165
52#: plugins/LightDM/UsersModel.cpp:165
51msgid "Guest Session"
53msgid "Guest Session"
52−msgstr ""
54+msgstr "Гасцявы сеанс"
53
55
54−#: plugins/Unity/Launcher/launcheritem.cpp:49
56+#: plugins/Unity/Launcher/launcheritem.cpp:48
55−#: plugins/Unity/Launcher/launcheritem.cpp:123
57+#: plugins/Unity/Launcher/launcheritem.cpp:122
56msgid "Pin shortcut"
58msgid "Pin shortcut"
57−msgstr "Замацаваць кнопку"
59+msgstr "Замацаваць цэтлік"
58
60
59−#: plugins/Unity/Launcher/launcheritem.cpp:55
61+#: plugins/Unity/Launcher/launcheritem.cpp:54
60msgid "Quit"
62msgid "Quit"
61msgstr "Выйсці"
63msgstr "Выйсці"
62
64
63−#: plugins/Unity/Launcher/launcheritem.cpp:123
65+#: plugins/Unity/Launcher/launcheritem.cpp:122
64msgid "Unpin shortcut"
66msgid "Unpin shortcut"
65−msgstr "Адмацаваць кнопку"
67+msgstr "Адмацаваць цэтлік"
66
68
67#: qml/Components/Dialogs.qml:176
69#: qml/Components/Dialogs.qml:176
68msgctxt "Title: Lock/Log out dialog"
70msgctxt "Title: Lock/Log out dialog"
69msgid "Log out"
71msgid "Log out"
70−msgstr "Выйсці"
72+msgstr "Завяршыць сеанс"
71
73
72#: qml/Components/Dialogs.qml:177
74#: qml/Components/Dialogs.qml:177
73msgid "Are you sure you want to log out?"
75msgid "Are you sure you want to log out?"
74−msgstr "Вы ўпэўненыя, што хочаце выйсці?"
76+msgstr "Сапраўды завяршыць сеанс?"
75
77
76#: qml/Components/Dialogs.qml:180
78#: qml/Components/Dialogs.qml:180
77msgctxt "Button: Lock the system"
79msgctxt "Button: Lock the system"
@@ -83,9 +85,8 @@ msgctxt "Button: Log out from the system"
83msgid "Log Out"
85msgid "Log Out"
84msgstr "Выйсці"
86msgstr "Выйсці"
85
87
86−#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
88+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:284
87−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
88−#: qml/Wizard/Pages/passcode-confirm.qml:32
89+#: qml/Greeter/NarrowView.qml:215 qml/Wizard/Pages/passcode-confirm.qml:32
89#: qml/Wizard/Pages/passcode-set.qml:32
90#: qml/Wizard/Pages/passcode-set.qml:32
90msgid "Cancel"
91msgid "Cancel"
91msgstr "Скасаваць"
92msgstr "Скасаваць"
@@ -97,7 +98,7 @@ msgstr "Перазагрузіць"
97
98
98#: qml/Components/Dialogs.qml:212
99#: qml/Components/Dialogs.qml:212
99msgid "Are you sure you want to reboot?"
100msgid "Are you sure you want to reboot?"
100−msgstr "Вы ўпэўнены, што жадаеце перазагрузіць?"
101+msgstr "Сапраўды хочаце перазагрузіць сістэму?"
101
102
102#: qml/Components/Dialogs.qml:215
103#: qml/Components/Dialogs.qml:215
103msgid "No"
104msgid "No"
@@ -107,212 +108,206 @@ msgstr "Не"
107msgid "Yes"
108msgid "Yes"
108msgstr "Так"
109msgstr "Так"
109
110
110−#: qml/Components/Dialogs.qml:239
111+#: qml/Components/Dialogs.qml:243
111msgctxt "Title: Power off/Restart dialog"
112msgctxt "Title: Power off/Restart dialog"
112msgid "Power"
113msgid "Power"
113msgstr "Сілкаванне"
114msgstr "Сілкаванне"
114
115
115−#: qml/Components/Dialogs.qml:240
116+#: qml/Components/Dialogs.qml:244
116msgid ""
117msgid ""
117"Are you sure you would like\n"
118"Are you sure you would like\n"
118"to power off?"
119"to power off?"
119msgstr ""
120msgstr ""
120−"Вы ўпэўнены, што хочаце\n"
121+"Сапраўды хочаце\n"
121−"выключыць камп'ютэр?"
122+"выключыць?"
122
123
123−#: qml/Components/Dialogs.qml:244
124+#: qml/Components/Dialogs.qml:248
124msgctxt "Button: Power off the system"
125msgctxt "Button: Power off the system"
125msgid "Power off"
126msgid "Power off"
126msgstr "Выключыць"
127msgstr "Выключыць"
127
128
128−#: qml/Components/Dialogs.qml:255
129+#: qml/Components/Dialogs.qml:263
129msgctxt "Button: Restart the system"
130msgctxt "Button: Restart the system"
130msgid "Restart"
131msgid "Restart"
131−msgstr "Перазапуск"
132+msgstr "Перазапусціць"
133+
134+#: qml/Components/Dialogs.qml:276
135+#, fuzzy
136+#| msgid "Takes a screenshot."
137+msgid "Screenshot"
138+msgstr "Здымак экрана."
132
139
133#: qml/Components/KeyboardShortcutsOverlay.qml:41
140#: qml/Components/KeyboardShortcutsOverlay.qml:41
134msgid "Keyboard Shortcuts"
141msgid "Keyboard Shortcuts"
135−msgstr ""
142+msgstr "Спалучэнні клавіш"
136
143
137#: qml/Components/KeyboardShortcutsOverlay.qml:55
144#: qml/Components/KeyboardShortcutsOverlay.qml:55
138−msgid "Unity 8"
145+msgid "Lomiri"
139msgstr ""
146msgstr ""
140
147
141#: qml/Components/KeyboardShortcutsOverlay.qml:62
148#: qml/Components/KeyboardShortcutsOverlay.qml:62
142msgid "PrtScr"
149msgid "PrtScr"
143−msgstr ""
150+msgstr "PrtScr"
144
151
145#: qml/Components/KeyboardShortcutsOverlay.qml:67
152#: qml/Components/KeyboardShortcutsOverlay.qml:67
146msgid "Takes a screenshot."
153msgid "Takes a screenshot."
147−msgstr ""
154+msgstr "Здымак экрана."
148
155
149#: qml/Components/KeyboardShortcutsOverlay.qml:75
156#: qml/Components/KeyboardShortcutsOverlay.qml:75
150msgid "Alt + PrtScr"
157msgid "Alt + PrtScr"
151−msgstr ""
158+msgstr "Alt + PrtScr"
152
159
153#: qml/Components/KeyboardShortcutsOverlay.qml:80
160#: qml/Components/KeyboardShortcutsOverlay.qml:80
154msgid "Takes a screenshot of the current window."
161msgid "Takes a screenshot of the current window."
155−msgstr ""
162+msgstr "Робіць здымак экрана бягучага акна."
156
163
157#: qml/Components/KeyboardShortcutsOverlay.qml:88
164#: qml/Components/KeyboardShortcutsOverlay.qml:88
158msgid "Super + Space"
165msgid "Super + Space"
159−msgstr ""
166+msgstr "Super + Прагал"
160
167
161#: qml/Components/KeyboardShortcutsOverlay.qml:93
168#: qml/Components/KeyboardShortcutsOverlay.qml:93
162msgid "Switches to next keyboard layout."
169msgid "Switches to next keyboard layout."
163−msgstr ""
170+msgstr "Пераключыцца на наступную раскладку клавіятуры."
164
171
165#: qml/Components/KeyboardShortcutsOverlay.qml:101
172#: qml/Components/KeyboardShortcutsOverlay.qml:101
166msgid "Super + Shift + Space"
173msgid "Super + Shift + Space"
167−msgstr ""
174+msgstr "Super + Shift + Прагал"
168
175
169#: qml/Components/KeyboardShortcutsOverlay.qml:106
176#: qml/Components/KeyboardShortcutsOverlay.qml:106
170msgid "Switches to previous keyboard layout."
177msgid "Switches to previous keyboard layout."
171−msgstr ""
178+msgstr "Пераключыцца на папярэднюю раскладку клавіятуры."
172
179
173#: qml/Components/KeyboardShortcutsOverlay.qml:114
180#: qml/Components/KeyboardShortcutsOverlay.qml:114
174msgid "Ctrl + Alt + T"
181msgid "Ctrl + Alt + T"
175−msgstr ""
182+msgstr "Ctrl + Alt + T"
176
183
177#: qml/Components/KeyboardShortcutsOverlay.qml:119
184#: qml/Components/KeyboardShortcutsOverlay.qml:119
178msgid "Starts the Terminal application."
185msgid "Starts the Terminal application."
179−msgstr ""
186+msgstr "Запускае тэрмінал."
180
187
181#: qml/Components/KeyboardShortcutsOverlay.qml:131
188#: qml/Components/KeyboardShortcutsOverlay.qml:131
182msgid "Launcher"
189msgid "Launcher"
183−msgstr ""
190+msgstr "Панэль запуску"
184
191
185#: qml/Components/KeyboardShortcutsOverlay.qml:138
192#: qml/Components/KeyboardShortcutsOverlay.qml:138
186msgid "Super (Hold)"
193msgid "Super (Hold)"
187−msgstr ""
194+msgstr "Super (утрыманне)"
188
195
189#: qml/Components/KeyboardShortcutsOverlay.qml:143
196#: qml/Components/KeyboardShortcutsOverlay.qml:143
190msgid "Opens the launcher, displays shortcuts."
197msgid "Opens the launcher, displays shortcuts."
191−msgstr ""
198+msgstr "Адкрывае панэль запуску, паказвае спалучэнні клавіш."
192
199
193#: qml/Components/KeyboardShortcutsOverlay.qml:151
200#: qml/Components/KeyboardShortcutsOverlay.qml:151
194msgid "Alt + F1"
201msgid "Alt + F1"
195−msgstr ""
202+msgstr "Alt + F1"
196
203
197#: qml/Components/KeyboardShortcutsOverlay.qml:156
204#: qml/Components/KeyboardShortcutsOverlay.qml:156
198msgid "Opens launcher keyboard navigation mode."
205msgid "Opens launcher keyboard navigation mode."
199−msgstr ""
206+msgstr "Актывуе рэжым навігацыі па панэлі запуску з клавіятуры."
200
207
201#: qml/Components/KeyboardShortcutsOverlay.qml:164
208#: qml/Components/KeyboardShortcutsOverlay.qml:164
202msgid "Super + Tab"
209msgid "Super + Tab"
203−msgstr ""
210+msgstr "Super + Tab"
204
211
205#: qml/Components/KeyboardShortcutsOverlay.qml:169
212#: qml/Components/KeyboardShortcutsOverlay.qml:169
206msgid "Switches applications via the launcher."
213msgid "Switches applications via the launcher."
207−msgstr ""
214+msgstr "Пераключае праграмы праз панэль запуску."
208
215
209#: qml/Components/KeyboardShortcutsOverlay.qml:177
216#: qml/Components/KeyboardShortcutsOverlay.qml:177
210msgid "Super + 1 to 0"
217msgid "Super + 1 to 0"
211−msgstr ""
218+msgstr "Super + лічба ад 1 да 0"
212
219
213#: qml/Components/KeyboardShortcutsOverlay.qml:182
220#: qml/Components/KeyboardShortcutsOverlay.qml:182
214msgid "Same as clicking on a launcher icon."
221msgid "Same as clicking on a launcher icon."
215−msgstr ""
222+msgstr "Адпаведнік націскання на значок запуску."
216
223
217#: qml/Components/KeyboardShortcutsOverlay.qml:190
224#: qml/Components/KeyboardShortcutsOverlay.qml:190
218msgid "Super + A"
225msgid "Super + A"
219−msgstr ""
226+msgstr "Super + A"
220
227
221#: qml/Components/KeyboardShortcutsOverlay.qml:195
228#: qml/Components/KeyboardShortcutsOverlay.qml:195
222msgid "Opens the Application Drawer."
229msgid "Opens the Application Drawer."
223−msgstr ""
230+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 ""
236
231
237#: qml/Components/KeyboardShortcutsOverlay.qml:235
232#: qml/Components/KeyboardShortcutsOverlay.qml:235
238msgid "Switching"
233msgid "Switching"
239−msgstr ""
234+msgstr "Пераключэнне"
240
235
241#: qml/Components/KeyboardShortcutsOverlay.qml:242
236#: qml/Components/KeyboardShortcutsOverlay.qml:242
242msgid "Alt + Tab"
237msgid "Alt + Tab"
243−msgstr ""
238+msgstr "Alt + Tab"
244
239
245#: qml/Components/KeyboardShortcutsOverlay.qml:247
240#: qml/Components/KeyboardShortcutsOverlay.qml:247
246msgid "Switches between applications."
241msgid "Switches between applications."
247−msgstr ""
242+msgstr "Пераключэнне паміж праграмамі."
248
243
249#: qml/Components/KeyboardShortcutsOverlay.qml:255
244#: qml/Components/KeyboardShortcutsOverlay.qml:255
250msgid "Super + W"
245msgid "Super + W"
251−msgstr ""
246+msgstr "Super + W"
252
247
253#: qml/Components/KeyboardShortcutsOverlay.qml:260
248#: qml/Components/KeyboardShortcutsOverlay.qml:260
254msgid "Opens the desktop spread."
249msgid "Opens the desktop spread."
255−msgstr ""
250+msgstr "Адкрывае працоўны стол."
256
251
257#: qml/Components/KeyboardShortcutsOverlay.qml:268
252#: qml/Components/KeyboardShortcutsOverlay.qml:268
258msgid "Cursor Left or Right"
253msgid "Cursor Left or Right"
259−msgstr ""
254+msgstr "Улева ці ўправа"
260
255
261#: qml/Components/KeyboardShortcutsOverlay.qml:273
256#: qml/Components/KeyboardShortcutsOverlay.qml:273
262msgid "Moves the focus."
257msgid "Moves the focus."
263−msgstr ""
258+msgstr "Перамяшчае фокус."
264
259
265#: qml/Components/KeyboardShortcutsOverlay.qml:285
260#: qml/Components/KeyboardShortcutsOverlay.qml:285
266msgid "Windows"
261msgid "Windows"
267−msgstr ""
262+msgstr "Вокны"
268
263
269#: qml/Components/KeyboardShortcutsOverlay.qml:292
264#: qml/Components/KeyboardShortcutsOverlay.qml:292
270msgid "Ctrl + Super + D"
265msgid "Ctrl + Super + D"
271−msgstr ""
266+msgstr "Ctrl + Super + D"
272
267
273#: qml/Components/KeyboardShortcutsOverlay.qml:297
268#: qml/Components/KeyboardShortcutsOverlay.qml:297
274msgid "Minimizes all windows."
269msgid "Minimizes all windows."
275−msgstr ""
270+msgstr "Згарнуць усе вокны."
276
271
277#: qml/Components/KeyboardShortcutsOverlay.qml:305
272#: qml/Components/KeyboardShortcutsOverlay.qml:305
278msgid "Ctrl + Super + Up"
273msgid "Ctrl + Super + Up"
279−msgstr ""
274+msgstr "Ctrl + Super + уверх"
280
275
281#: qml/Components/KeyboardShortcutsOverlay.qml:310
276#: qml/Components/KeyboardShortcutsOverlay.qml:310
282msgid "Maximizes the current window."
277msgid "Maximizes the current window."
283−msgstr ""
278+msgstr "Разгарнуць бягучае акно."
284
279
285#: qml/Components/KeyboardShortcutsOverlay.qml:318
280#: qml/Components/KeyboardShortcutsOverlay.qml:318
286msgid "Ctrl + Super + Down"
281msgid "Ctrl + Super + Down"
287−msgstr ""
282+msgstr "Ctrl + Super + уніз"
288
283
289#: qml/Components/KeyboardShortcutsOverlay.qml:323
284#: qml/Components/KeyboardShortcutsOverlay.qml:323
290msgid "Minimizes or restores the current window."
285msgid "Minimizes or restores the current window."
291−msgstr ""
286+msgstr "Згарнуць альбо аднавіць бягучае акно."
292
287
293#: qml/Components/KeyboardShortcutsOverlay.qml:331
288#: qml/Components/KeyboardShortcutsOverlay.qml:331
294msgid "Ctrl + Super + Left or Right"
289msgid "Ctrl + Super + Left or Right"
295−msgstr ""
290+msgstr "Ctrl + Super + улева ці ўправа"
296
291
297#: qml/Components/KeyboardShortcutsOverlay.qml:336
292#: qml/Components/KeyboardShortcutsOverlay.qml:336
298msgid "Semi-maximizes the current window."
293msgid "Semi-maximizes the current window."
299−msgstr ""
294+msgstr "Разгортвае бягучае акно напалову."
300
295
301#: qml/Components/KeyboardShortcutsOverlay.qml:344
296#: qml/Components/KeyboardShortcutsOverlay.qml:344
302msgid "Alt + F4"
297msgid "Alt + F4"
303−msgstr ""
298+msgstr "Alt + F4"
304
299
305#: qml/Components/KeyboardShortcutsOverlay.qml:349
300#: qml/Components/KeyboardShortcutsOverlay.qml:349
306msgid "Closes the current window."
301msgid "Closes the current window."
307−msgstr ""
302+msgstr "Закрывае бягучае акно."
308
303
309−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
304+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:235
310msgid "Return to Call"
305msgid "Return to Call"
311msgstr "Вярнуцца да выкліку"
306msgstr "Вярнуцца да выкліку"
312
307
313#: qml/Components/Lockscreen.qml:212
308#: qml/Components/Lockscreen.qml:212
314msgid "Emergency Call"
309msgid "Emergency Call"
315−msgstr "Терміновы выклік"
310+msgstr "Экстраны выклік"
316
311
317#: qml/Components/Lockscreen.qml:245
312#: qml/Components/Lockscreen.qml:245
318msgid "OK"
313msgid "OK"
@@ -321,26 +316,28 @@ msgstr "Добра"
321#: qml/Components/MediaServices/VideoPlayerControls.qml:44
316#: qml/Components/MediaServices/VideoPlayerControls.qml:44
322#, qt-format
317#, qt-format
323msgid "%1:%2:%3"
318msgid "%1:%2:%3"
324−msgstr ""
319+msgstr "%1:%2:%3"
325
320
326#: qml/Components/MediaServices/VideoPlayerControls.qml:49
321#: qml/Components/MediaServices/VideoPlayerControls.qml:49
327#, qt-format
322#, qt-format
328msgid "%1:%2"
323msgid "%1:%2"
329−msgstr ""
324+msgstr "%1:%2"
330
325
331#: qml/Components/ModeSwitchWarningDialog.qml:33
326#: qml/Components/ModeSwitchWarningDialog.qml:33
332msgid "Apps may have unsaved data:"
327msgid "Apps may have unsaved data:"
333−msgstr "Прылады могуць мець незахованыя дадзеныя:"
328+msgstr "У праграм могуць быць незахаваныя даныя:"
334
329
335#: qml/Components/ModeSwitchWarningDialog.qml:60
330#: qml/Components/ModeSwitchWarningDialog.qml:60
336msgctxt ""
331msgctxt ""
337"Re-dock means connect the device again to an external screen/mouse/keyboard"
332"Re-dock means connect the device again to an external screen/mouse/keyboard"
338msgid "Re-dock, save your work and close these apps to continue."
333msgid "Re-dock, save your work and close these apps to continue."
339msgstr ""
334msgstr ""
335+"Перападлучыцеся, захавайце вынікі працы і закрыйце вокны праграм, каб "
336+"працягнуць."
340
337
341#: qml/Components/ModeSwitchWarningDialog.qml:67
338#: qml/Components/ModeSwitchWarningDialog.qml:67
342msgid "Or force close now (unsaved data will be lost)."
339msgid "Or force close now (unsaved data will be lost)."
343−msgstr "Прымусіць зачыніць (незахаваныя дадзеныя будуць страчаны)."
340+msgstr "Альбо закрыйце прымусова (незахаваныя даныя страцяцца)."
344
341
345#: qml/Components/ModeSwitchWarningDialog.qml:80
342#: qml/Components/ModeSwitchWarningDialog.qml:80
346msgid "OK, I will reconnect"
343msgid "OK, I will reconnect"
@@ -352,130 +349,35 @@ msgstr "Перападлучыцца зараз!"
352
349
353#: qml/Components/ModeSwitchWarningDialog.qml:94
350#: qml/Components/ModeSwitchWarningDialog.qml:94
354msgid "Close all"
351msgid "Close all"
355−msgstr "Зачыніць усё"
352+msgstr "Закрыць усе"
356
353
357#: qml/Components/SharingPicker.qml:54
354#: qml/Components/SharingPicker.qml:54
358msgid "Preview Share Item"
355msgid "Preview Share Item"
359−msgstr "Праглядзець элемент"
356+msgstr "Папярэдні прагляд"
360
357
361#: qml/Components/VirtualTouchPad.qml:317
358#: qml/Components/VirtualTouchPad.qml:317
362msgid ""
359msgid ""
363"Your device is now connected to an external display. Use this screen as a "
360"Your device is now connected to an external display. Use this screen as a "
364"touch pad to interact with the pointer."
361"touch pad to interact with the pointer."
365msgstr ""
362msgstr ""
363+"Ваша прылада падлучаная да вонкавага дысплея. Выкарыстоўвайце гэты экран як "
364+"сэнсарную панэль для кіравання курсорам."
366
365
367#: qml/Components/VirtualTouchPad.qml:327
366#: qml/Components/VirtualTouchPad.qml:327
368msgid "Tap left button to click."
367msgid "Tap left button to click."
369−msgstr ""
368+msgstr "Націсніце левую кнопку, каб пстрыкнуць."
370
369
371#: qml/Components/VirtualTouchPad.qml:339
370#: qml/Components/VirtualTouchPad.qml:339
372msgid "Tap right button to right click."
371msgid "Tap right button to right click."
373−msgstr ""
372+msgstr "Націсніце правую кнопку, каб пстрыкнуць правай клавішай мышы."
374
373
375#: qml/Components/VirtualTouchPad.qml:351
374#: qml/Components/VirtualTouchPad.qml:351
376msgid "Swipe with two fingers to scroll."
375msgid "Swipe with two fingers to scroll."
377−msgstr ""
376+msgstr "Правядзіце двума пальцамі, каб пракруціць."
378
377
379#: qml/Components/VirtualTouchPad.qml:396
378#: qml/Components/VirtualTouchPad.qml:396
380msgid "Find more settings in the system settings."
379msgid "Find more settings in the system settings."
381−msgstr ""
380+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 "Таксама ўсталявана"
479
381
480#: qml/Greeter/CoverPage.qml:127
382#: qml/Greeter/CoverPage.qml:127
481msgid "Unlock"
383msgid "Unlock"
@@ -488,12 +390,13 @@ msgstr "Прылада заблакаваная"
488#: qml/Greeter/DelayedLockscreen.qml:58
390#: qml/Greeter/DelayedLockscreen.qml:58
489msgid "You have been locked out due to too many failed passphrase attempts."
391msgid "You have been locked out due to too many failed passphrase attempts."
490msgstr ""
392msgstr ""
491−"Вы былі заблакаваныя з-за занадта вялікай колькасці няўдалых спробаў."
393+"Вы былі заблакаваныя праз занадта вялікую колькасць няўдалых спробаў уводу "
394+"пароля."
492
395
493#: qml/Greeter/DelayedLockscreen.qml:59
396#: qml/Greeter/DelayedLockscreen.qml:59
494msgid "You have been locked out due to too many failed passcode attempts."
397msgid "You have been locked out due to too many failed passcode attempts."
495msgstr ""
398msgstr ""
496−"Вы былі заблакаваныя з-за занадта вялікай колькасці няўдалых спробаў уводу "
399+"Вы былі заблакаваныя праз занадта вялікую колькасць няўдалых спробаў уводу "
497"кода доступу."
400"кода доступу."
498
401
499#: qml/Greeter/DelayedLockscreen.qml:68
402#: qml/Greeter/DelayedLockscreen.qml:68
@@ -506,44 +409,43 @@ msgstr[2] "Пачакайце %1 хвілін і паўтарыце спробу
506
409
507#: qml/Greeter/Greeter.qml:550
410#: qml/Greeter/Greeter.qml:550
508msgid "Try again"
411msgid "Try again"
509−msgstr ""
412+msgstr "Паспрабаваць зноў"
510
413
511#: qml/Greeter/Greeter.qml:551
414#: qml/Greeter/Greeter.qml:551
512msgid "Enter passphrase to unlock"
415msgid "Enter passphrase to unlock"
513−msgstr ""
416+msgstr "Увядзіце парольную фразу, каб разблакаваць"
514
417
515#: qml/Greeter/Greeter.qml:552
418#: qml/Greeter/Greeter.qml:552
516msgid "Enter passcode to unlock"
419msgid "Enter passcode to unlock"
517−msgstr ""
420+msgstr "Увядзіце код доступу, каб разблакаваць"
518
421
519−#: qml/Greeter/NarrowView.qml:228
422+#: qml/Greeter/NarrowView.qml:235
520msgid "Emergency"
423msgid "Emergency"
521−msgstr ""
424+msgstr "Экстраны выклік"
522
425
523#: qml/Greeter/PromptList.qml:126
426#: qml/Greeter/PromptList.qml:126
524msgid "Passphrase"
427msgid "Passphrase"
525−msgstr ""
428+msgstr "Парольная фраза"
526
429
527#: qml/Greeter/PromptList.qml:126
430#: qml/Greeter/PromptList.qml:126
528msgid "Passcode"
431msgid "Passcode"
529−msgstr ""
432+msgstr "Код доступу"
530
433
531#: qml/Greeter/SessionsList.qml:124
434#: qml/Greeter/SessionsList.qml:124
532msgid "Select desktop environment"
435msgid "Select desktop environment"
533−msgstr ""
436+msgstr "Абраць працоўнае асяроддзе"
534
437
535−#: qml/Launcher/Drawer.qml:94
438+#: qml/Launcher/Drawer.qml:250
536msgid "Search…"
439msgid "Search…"
537−msgstr ""
440+msgstr "Пошук…"
538
441
539−#: qml/Launcher/Drawer.qml:129
442+#: qml/Launcher/PullToRefreshScopeStyle.qml:56
540−msgctxt "Apps sorted alphabetically"
541−msgid "A-Z"
443+msgid "Pull to refresh…"
542−msgstr ""
444+msgstr "Пацягніце для абнаўлення..."
543
445
544−#: qml/Launcher/MoreAppsHeader.qml:55
446+#: qml/Launcher/PullToRefreshScopeStyle.qml:61
545−msgid "More apps in the store"
447+msgid "Release to refresh…"
546−msgstr ""
448+msgstr "Адпусціце для абнаўлення..."
547
449
548#: qml/Notifications/NotificationMenuItemFactory.qml:124
450#: qml/Notifications/NotificationMenuItemFactory.qml:124
549msgid "Show password"
451msgid "Show password"
@@ -559,7 +461,7 @@ msgstr "Канферэнцыя"
559
461
560#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
462#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
561msgid "Nothing is playing"
463msgid "Nothing is playing"
562−msgstr "Нічога не грае"
464+msgstr "Нічога не прайграецца"
563
465
564#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
466#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
565#, qt-format
467#, qt-format
@@ -567,7 +469,7 @@ msgid "%1 hour"
567msgid_plural "%1 hours"
469msgid_plural "%1 hours"
568msgstr[0] "%1 гадзіна"
470msgstr[0] "%1 гадзіна"
569msgstr[1] "%1 гадзіны"
471msgstr[1] "%1 гадзіны"
570−msgstr[2] "%1 гадзінаў"
472+msgstr[2] "%1 гадзін"
571
473
572#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
474#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
573#, qt-format
475#, qt-format
@@ -575,7 +477,7 @@ msgid "%1 minute"
575msgid_plural "%1 minutes"
477msgid_plural "%1 minutes"
576msgstr[0] "%1 хвіліна"
478msgstr[0] "%1 хвіліна"
577msgstr[1] "%1 хвіліны"
479msgstr[1] "%1 хвіліны"
578−msgstr[2] "%1 хвілінаў"
480+msgstr[2] "%1 хвілін"
579
481
580#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
482#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
581#, qt-format
483#, qt-format
@@ -583,7 +485,7 @@ msgid "%1 second"
583msgid_plural "%1 seconds"
485msgid_plural "%1 seconds"
584msgstr[0] "%1 секунда"
486msgstr[0] "%1 секунда"
585msgstr[1] "%1 секунды"
487msgstr[1] "%1 секунды"
586−msgstr[2] "%1 секундаў"
488+msgstr[2] "%1 секунд"
587
489
588#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
490#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
589msgid "0 seconds"
491msgid "0 seconds"
@@ -593,15 +495,15 @@ msgstr "0 секунд"
593#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
495#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
594#, qt-format
496#, qt-format
595msgid "%1 remaining"
497msgid "%1 remaining"
596−msgstr "%1 засталося"
498+msgstr "Засталося %1"
597
499
598#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
500#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
599msgid "In queue…"
501msgid "In queue…"
600−msgstr "У чарзе..."
502+msgstr "У чарзе…"
601
503
602#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
504#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
603msgid "Downloading"
505msgid "Downloading"
604−msgstr "Запампоўка"
506+msgstr "Запампоўванне"
605
507
606#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
508#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
607msgid "Paused, tap to resume"
509msgid "Paused, tap to resume"
@@ -613,7 +515,7 @@ msgstr "Скасавана"
613
515
614#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
516#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
615msgid "Finished"
517msgid "Finished"
616−msgstr "Скончана"
518+msgstr "Завершана"
617
519
618#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
520#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
619msgid "Failed, tap to retry"
521msgid "Failed, tap to retry"
@@ -623,7 +525,7 @@ msgstr "Не атрымалася, націсніце, каб паўтарыць
623#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
525#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
624msgctxt "Button: Send a reply message"
526msgctxt "Button: Send a reply message"
625msgid "Send"
527msgid "Send"
626−msgstr "Даслаць"
528+msgstr "Адправіць"
627
529
628#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
530#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
629msgctxt "Label: Hint in message indicator line edit"
531msgctxt "Label: Hint in message indicator line edit"
@@ -637,279 +539,265 @@ msgstr "Патэлефанаваць"
637
539
638#: qml/Panel/PanelMenuPage.qml:92
540#: qml/Panel/PanelMenuPage.qml:92
639msgid "Back"
541msgid "Back"
640−msgstr ""
542+msgstr "Назад"
641
543
642#: qml/Stage/SideStage.qml:76
544#: qml/Stage/SideStage.qml:76
643msgid "Drag using 3 fingers any application from one window to the other"
545msgid "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 "Няма запушчаных праграм"
645
551
646#: qml/Tutorial/TutorialLeftLong.qml:49
552#: qml/Tutorial/TutorialLeftLong.qml:49
647msgid "Long swipe from the left edge to open the Application Drawer"
553msgid "Long swipe from the left edge to open the Application Drawer"
648−msgstr ""
554+msgstr "Правядзіце ад левага краю, каб адкрыць панэль праграм"
649
555
650#: qml/Tutorial/TutorialLeft.qml:47
556#: qml/Tutorial/TutorialLeft.qml:47
651msgid "Short swipe from the left edge to open the launcher"
557msgid "Short swipe from the left edge to open the launcher"
652−msgstr ""
558+msgstr "Коратка правядзіце ад левага краю, каб адкрыць панэль запуску"
653
559
654−#: qml/Tutorial/TutorialRight.qml:55
560+#: qml/Tutorial/TutorialRight.qml:54
655msgid "Push your mouse against the right edge to view your open apps"
561msgid "Push your mouse against the right edge to view your open apps"
656msgstr ""
562msgstr ""
563+"Навядзіце курсор мышы на правы край экрана, каб праглядзець спіс адкрытых "
564+"акон праграм"
657
565
658−#: qml/Tutorial/TutorialRight.qml:56
566+#: qml/Tutorial/TutorialRight.qml:55
659msgid "Swipe from the right edge to view your open apps"
567msgid "Swipe from the right edge to view your open apps"
660−msgstr ""
568+msgstr "Правядзіце ад правага краю, каб праглядзець спіс адкрытых акон праграм"
661
569
662#: qml/Tutorial/TutorialTop.qml:53
570#: qml/Tutorial/TutorialTop.qml:53
663msgid "Swipe from the top edge to access notifications and quick settings"
571msgid "Swipe from the top edge to access notifications and quick settings"
664msgstr ""
572msgstr ""
573+"Правядзіце ад верхняга краю, каб атрымаць доступ да апавяшчэнняў і хуткіх "
574+"налад"
665
575
666−#: qml/Wizard/Page.qml:54
576+#: qml/Wizard/Page.qml:59
667msgctxt "Button: Go back one page in the Wizard"
577msgctxt "Button: Go back one page in the Wizard"
668msgid "Back"
578msgid "Back"
669−msgstr "Вярнуцца"
579+msgstr "Назад"
670
580
671−#: qml/Wizard/Pages/10-welcome.qml:28
581+#: qml/Wizard/Pages/10-welcome.qml:29
672msgid "Language"
582msgid "Language"
673−msgstr ""
583+msgstr "Мова"
674−
584+
675−#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
585+#: qml/Wizard/Pages/10-welcome.qml:176
676−#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
586+#: qml/Wizard/Pages/10-welcome-update.qml:126
587+#: qml/Wizard/Pages/11-changelog.qml:74 qml/Wizard/Pages/20-keyboard.qml:152
677−#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
588+#: qml/Wizard/Pages/30-wifi.qml:214 qml/Wizard/Pages/50-timezone.qml:272
678−#: qml/Wizard/Pages/70-passwd-type.qml:145
589+#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/70-passwd-type.qml:146
679−#: qml/Wizard/Pages/75-report-check.qml:84
680−#: qml/Wizard/Pages/passcode-desktop.qml:142
590+#: qml/Wizard/Pages/passcode-desktop.qml:154
681−#: qml/Wizard/Pages/password-set.qml:142
591+#: qml/Wizard/Pages/password-set.qml:153
682msgid "Next"
592msgid "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 "Загрузка..."
684
610
685#: qml/Wizard/Pages/20-keyboard.qml:31
611#: qml/Wizard/Pages/20-keyboard.qml:31
686msgid "Select Keyboard"
612msgid "Select Keyboard"
687−msgstr ""
613+msgstr "Абярыце клавіятуру"
688
614
689#: qml/Wizard/Pages/20-keyboard.qml:71
615#: qml/Wizard/Pages/20-keyboard.qml:71
690msgid "Keyboard language"
616msgid "Keyboard language"
691−msgstr ""
617+msgstr "Мова клавіятуры"
692
618
693#: qml/Wizard/Pages/20-keyboard.qml:93
619#: qml/Wizard/Pages/20-keyboard.qml:93
694msgid "Keyboard layout"
620msgid "Keyboard layout"
695−msgstr ""
621+msgstr "Раскладка клавіятуры"
696
622
697−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
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
698−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
625+#: qml/Wizard/Pages/sim.qml:101
699msgid "Skip"
626msgid "Skip"
700−msgstr "Прапусціць"
627+msgstr "Мінуць"
701
628
702−#: qml/Wizard/Pages/30-wifi.qml:30
629+#: qml/Wizard/Pages/30-wifi.qml:31
703msgid "Connect to Wi‑Fi"
630msgid "Connect to Wi‑Fi"
704−msgstr "Злучыцца з Wi-Fi"
631+msgstr "Злучэнне з Wi-Fi"
705
632
706−#: qml/Wizard/Pages/30-wifi.qml:131
633+#: qml/Wizard/Pages/30-wifi.qml:139
707msgid "Connected"
634msgid "Connected"
708−msgstr ""
635+msgstr "Падлучана"
709
636
710−#: qml/Wizard/Pages/30-wifi.qml:164
637+#: qml/Wizard/Pages/30-wifi.qml:172
711msgid "Available Wi-Fi networks"
638msgid "Available Wi-Fi networks"
712−msgstr ""
639+msgstr "Даступныя сеткі Wi-Fi"
713
640
714−#: qml/Wizard/Pages/30-wifi.qml:165
641+#: qml/Wizard/Pages/30-wifi.qml:173
715msgid "No available Wi-Fi networks"
642msgid "No available Wi-Fi networks"
716−msgstr ""
643+msgstr "Няма даступных сетак Wi-Fi"
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 ""
749
644
750#: qml/Wizard/Pages/50-timezone.qml:30
645#: qml/Wizard/Pages/50-timezone.qml:30
751msgid "Time Zone"
646msgid "Time Zone"
752−msgstr ""
647+msgstr "Часавы пояс"
753
648
754−#: qml/Wizard/Pages/50-timezone.qml:182
649+#: qml/Wizard/Pages/50-timezone.qml:183
755msgid "Enter your city"
650msgid "Enter your city"
756−msgstr ""
651+msgstr "Увядзіце ваш горад"
757
652
758#: qml/Wizard/Pages/60-account.qml:24
653#: qml/Wizard/Pages/60-account.qml:24
759msgid "Personalize Your Device"
654msgid "Personalize Your Device"
760−msgstr ""
655+msgstr "Персаналізацыя прылады"
761
656
762−#: qml/Wizard/Pages/60-account.qml:48
657+#: qml/Wizard/Pages/60-account.qml:54
763msgid "Preferred Name"
658msgid "Preferred Name"
764−msgstr ""
659+msgstr "Пераважнае імя"
765
660
766#: qml/Wizard/Pages/70-passwd-type.qml:40
661#: qml/Wizard/Pages/70-passwd-type.qml:40
767msgid "Lock Screen"
662msgid "Lock Screen"
768−msgstr ""
663+msgstr "Заблакаваць экран"
769
664
770−#: qml/Wizard/Pages/70-passwd-type.qml:102
665+#: qml/Wizard/Pages/70-passwd-type.qml:103
771msgctxt "Label: Type of security method"
666msgctxt "Label: Type of security method"
772msgid "Create new password"
667msgid "Create new password"
773−msgstr ""
668+msgstr "Стварыць новы пароль"
774
669
775−#: qml/Wizard/Pages/70-passwd-type.qml:104
670+#: qml/Wizard/Pages/70-passwd-type.qml:105
776msgctxt "Label: Type of security method"
671msgctxt "Label: Type of security method"
777msgid "Create passcode (numbers only)"
672msgid "Create passcode (numbers only)"
778−msgstr ""
673+msgstr "Стварыць код доступу (толькі лічбы)"
779
674
780−#: qml/Wizard/Pages/70-passwd-type.qml:106
675+#: qml/Wizard/Pages/70-passwd-type.qml:107
781msgctxt "Label: Type of security method"
676msgctxt "Label: Type of security method"
782msgid "No lock code"
677msgid "No lock code"
783−msgstr ""
678+msgstr "Без кода блакавання"
784−
785−#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
786−msgid "Privacy Policy"
787−msgstr ""
788
679
789−#: qml/Wizard/Pages/75-report-check.qml:26
680+#: qml/Wizard/Pages/79-system-update.qml:28
790−msgid "Help Us Improve"
681+msgid "Update Device"
791−msgstr ""
682+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 ""
796
683
797−#: qml/Wizard/Pages/75-report-check.qml:60
684+#: qml/Wizard/Pages/79-system-update.qml:55
798−msgid "Privacy policy"
685+msgid ""
686+"There is a system update available and ready to install. Afterwards, the "
687+"device will automatically restart."
799msgstr ""
688msgstr ""
689+"Ёсць даступнае абнаўленне сістэмы, якое можна ўсталяваць. Пасля ўсталёўкі "
690+"сістэма аўтаматычна перазапусціцца."
800
691
801−#: qml/Wizard/Pages/80-finished.qml:89
692+#: qml/Wizard/Pages/79-system-update.qml:76
802−msgid "Welcome to Ubuntu"
693+msgctxt "string identifying name of the update"
803−msgstr ""
694+msgid "Ubuntu Touch system"
695+msgstr "Сістэма Ubuntu Touch"
804
696
805−#: qml/Wizard/Pages/80-finished.qml:104
697+#: qml/Wizard/Pages/79-system-update.qml:83
806−msgid "You are ready to use your device now"
698+#, qt-format
699+msgctxt "version of the system update"
700+msgid "Version %1"
807−msgstr ""
701+msgstr "Версія %1"
808
702
809−#: qml/Wizard/Pages/80-finished.qml:124
703+#: qml/Wizard/Pages/79-system-update.qml:95
810−msgid "Get Started"
704+msgid "This could take a few minutes..."
811−msgstr ""
705+msgstr "Аперацыя можа заняць некалькі хвілін…"
812
706
813−#: qml/Wizard/Pages/here-terms.qml:25
707+#: qml/Wizard/Pages/79-system-update.qml:109
814−msgid "Terms & Conditions"
708+msgid "Install and restart now"
815−msgstr "Умовы карыстання"
709+msgstr "Усталяваць і перазапусціць"
816
710
817−#: qml/Wizard/Pages/here-terms.qml:69
711+#: qml/Wizard/Pages/80-finished.qml:91
818−msgid "Your device uses positioning technologies provided by HERE."
712+msgid "Welcome Back"
819−msgstr ""
713+msgstr "Сардэчна запрашаем назад"
820
714
821−#: qml/Wizard/Pages/here-terms.qml:81
715+#: qml/Wizard/Pages/80-finished.qml:91
822−msgid ""
716+msgid "Welcome to Ubuntu"
823−"To provide you with positioning services and to improve their quality, HERE "
717+msgstr "Вітаем ва Ubuntu"
824−"collects information about nearby cell towers and Wi-Fi hotspots around your "
825−"current location whenever your position is being found."
826−msgstr ""
827
718
828−#: qml/Wizard/Pages/here-terms.qml:93
719+#: qml/Wizard/Pages/80-finished.qml:106
829−msgid ""
720+msgid "You are ready to use your device now"
830−"The information collected is used to analyze the service and to improve the "
721+msgstr "Цяпер прылада гатовая да выкарыстання"
831−"use of service, but not to identify you personally."
832−msgstr ""
833
722
834−#: qml/Wizard/Pages/here-terms.qml:106
723+#: qml/Wizard/Pages/80-finished.qml:126
835−#, qt-format
724+msgid "Continue"
836−msgid "By continuing, you agree to the HERE platform %1 and %2."
725+msgstr "Працягнуць"
837−msgstr ""
838
726
839−#: qml/Wizard/Pages/here-terms.qml:107
727+#: qml/Wizard/Pages/80-finished.qml:126
840−msgid "Service Terms"
728+msgid "Get Started"
841−msgstr ""
729+msgstr "Пачаць"
842
730
843#: qml/Wizard/Pages/passcode-confirm.qml:43
731#: qml/Wizard/Pages/passcode-confirm.qml:43
844−#: qml/Wizard/Pages/passcode-desktop.qml:97
732+#: qml/Wizard/Pages/passcode-desktop.qml:104
845msgid "Confirm passcode"
733msgid "Confirm passcode"
846−msgstr "Пацвердзіце код-пароль"
734+msgstr "Пацвердзіце код доступу"
847
735
848#: qml/Wizard/Pages/passcode-confirm.qml:45
736#: qml/Wizard/Pages/passcode-confirm.qml:45
849msgid "Incorrect passcode."
737msgid "Incorrect passcode."
850−msgstr ""
738+msgstr "Няправільны код доступу."
851
739
852#: qml/Wizard/Pages/passcode-confirm.qml:45
740#: qml/Wizard/Pages/passcode-confirm.qml:45
853msgctxt "Enter the passcode again"
741msgctxt "Enter the passcode again"
854msgid "Please re-enter."
742msgid "Please re-enter."
855−msgstr ""
743+msgstr "Увядзіце нанова."
856
744
857#: qml/Wizard/Pages/passcode-desktop.qml:31
745#: qml/Wizard/Pages/passcode-desktop.qml:31
858msgid "Lock Screen Passcode"
746msgid "Lock Screen Passcode"
859−msgstr ""
747+msgstr "Код блакавання экрана"
860
748
861−#: qml/Wizard/Pages/passcode-desktop.qml:61
749+#: qml/Wizard/Pages/passcode-desktop.qml:68
862msgid "Enter 4 numbers to setup your passcode"
750msgid "Enter 4 numbers to setup your passcode"
863−msgstr ""
751+msgstr "Увядзіце код блакавання з чаторых лічбаў"
864
752
865−#: qml/Wizard/Pages/passcode-desktop.qml:77
753+#: qml/Wizard/Pages/passcode-desktop.qml:84
866#: qml/Wizard/Pages/passcode-set.qml:54
754#: qml/Wizard/Pages/passcode-set.qml:54
867msgid "Choose passcode"
755msgid "Choose passcode"
868−msgstr ""
756+msgstr "Абраць код доступу"
869
757
870−#: qml/Wizard/Pages/passcode-desktop.qml:127
758+#: qml/Wizard/Pages/passcode-desktop.qml:139
871msgid "Passcode too short"
759msgid "Passcode too short"
872−msgstr ""
760+msgstr "Код доступу занадта кароткі"
873
761
874−#: qml/Wizard/Pages/passcode-desktop.qml:129
762+#: qml/Wizard/Pages/passcode-desktop.qml:141
875msgid "Passcodes match"
763msgid "Passcodes match"
876−msgstr ""
764+msgstr "Коды доступу супадаюць"
877
765
878−#: qml/Wizard/Pages/passcode-desktop.qml:131
766+#: qml/Wizard/Pages/passcode-desktop.qml:143
879msgid "Passcodes do not match"
767msgid "Passcodes do not match"
880−msgstr ""
768+msgstr "Коды доступу не супадаюць"
881
769
882#: qml/Wizard/Pages/passcode-set.qml:62
770#: qml/Wizard/Pages/passcode-set.qml:62
883msgid "Passcode must be 4 characters long"
771msgid "Passcode must be 4 characters long"
884−msgstr ""
772+msgstr "Код доступу павінен складацца з чатырох лічбаў"
885
773
886#: qml/Wizard/Pages/password-set.qml:31
774#: qml/Wizard/Pages/password-set.qml:31
887msgid "Lock Screen Password"
775msgid "Lock Screen Password"
888−msgstr ""
776+msgstr "Пароль блакавання экрана"
889
777
890−#: qml/Wizard/Pages/password-set.qml:62
778+#: qml/Wizard/Pages/password-set.qml:68
891msgid "Enter at least 8 characters"
779msgid "Enter at least 8 characters"
892−msgstr ""
780+msgstr "Увядзіце прынамсі 8 сімвалаў"
893
781
894−#: qml/Wizard/Pages/password-set.qml:74
782+#: qml/Wizard/Pages/password-set.qml:80
895msgid "Choose password"
783msgid "Choose password"
896−msgstr ""
784+msgstr "Абярыце пароль"
897
785
898−#: qml/Wizard/Pages/password-set.qml:104
786+#: qml/Wizard/Pages/password-set.qml:110
899msgid "Confirm password"
787msgid "Confirm password"
900−msgstr ""
788+msgstr "Пацвердзіце пароль"
901
789
902#: qml/Wizard/Pages/sim.qml:27
790#: qml/Wizard/Pages/sim.qml:27
903msgid "No SIM card installed"
791msgid "No SIM card installed"
904−msgstr ""
792+msgstr "SIM-картка не ўстаўленая"
905
793
906#: qml/Wizard/Pages/sim.qml:54
794#: qml/Wizard/Pages/sim.qml:54
907msgid "SIM card added"
795msgid "SIM card added"
908−msgstr ""
796+msgstr "Дададзена SIM-картка"
909
797
910#: qml/Wizard/Pages/sim.qml:55
798#: qml/Wizard/Pages/sim.qml:55
911msgid "You must restart the device to access the mobile network."
799msgid "You must restart the device to access the mobile network."
912−msgstr ""
800+msgstr "Для доступу да мабільнай сеткі неабходна перазапусціць прыладу."
913
801
914#: qml/Wizard/Pages/sim.qml:59
802#: qml/Wizard/Pages/sim.qml:59
915msgid "Restart"
803msgid "Restart"
@@ -917,39 +805,123 @@ msgstr "Перазапусціць"
917
805
918#: qml/Wizard/Pages/sim.qml:78
806#: qml/Wizard/Pages/sim.qml:78
919msgid "You won’t be able to make calls or use text messaging without a SIM."
807msgid "You won’t be able to make calls or use text messaging without a SIM."
920−msgstr ""
808+msgstr "Без SIM-карткі немагчыма тэлефанаваць і адпраўляць SMS."
921
809
922#: qml/Wizard/Pages/sim.qml:90
810#: qml/Wizard/Pages/sim.qml:90
923msgid "To proceed with no SIM tap Skip."
811msgid "To proceed with no SIM tap Skip."
924−msgstr ""
812+msgstr "Каб працягнуць працу без SIM-карткі, націсніце \"Прамінуць\"."
925
813
926#: qml/Wizard/PasswordMeter.qml:87
814#: qml/Wizard/PasswordMeter.qml:87
927msgid "Password too short"
815msgid "Password too short"
928−msgstr ""
816+msgstr "Пароль занадта кароткі"
929
817
930#: qml/Wizard/PasswordMeter.qml:89
818#: qml/Wizard/PasswordMeter.qml:89
931msgid "Passwords match"
819msgid "Passwords match"
932−msgstr ""
820+msgstr "Паролі супадаюць"
933
821
934#: qml/Wizard/PasswordMeter.qml:91
822#: qml/Wizard/PasswordMeter.qml:91
935msgid "Passwords do not match"
823msgid "Passwords do not match"
936−msgstr ""
824+msgstr "Паролі не супадаюць"
937
825
938#: qml/Wizard/PasswordMeter.qml:95
826#: qml/Wizard/PasswordMeter.qml:95
939msgid "Strong password"
827msgid "Strong password"
940−msgstr ""
828+msgstr "Надзейны пароль"
941
829
942#: qml/Wizard/PasswordMeter.qml:97
830#: qml/Wizard/PasswordMeter.qml:97
943msgid "Fair password"
831msgid "Fair password"
944−msgstr ""
832+msgstr "Неблагі пароль"
945
833
946#: qml/Wizard/PasswordMeter.qml:99
834#: qml/Wizard/PasswordMeter.qml:99
947msgid "Weak password"
835msgid "Weak password"
948−msgstr ""
836+msgstr "Слабы пароль"
949
837
950#: qml/Wizard/PasswordMeter.qml:101
838#: qml/Wizard/PasswordMeter.qml:101
951msgid "Very weak password"
839msgid "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 "Умовы карыстання"
953
925
954#~ msgid "Reboot"
926#~ msgid "Reboot"
955#~ msgstr "Перазагрузіць"
927#~ msgstr "Перазагрузіць"
@@ -966,9 +938,6 @@ msgstr ""
966#~ msgid "Left edge"
938#~ msgid "Left edge"
967#~ msgstr "Левы край"
939#~ msgstr "Левы край"
968
940
969−#~ msgid "Search"
970−#~ msgstr "Пошук"
971−
972#~ msgid "Confirm"
941#~ msgid "Confirm"
973#~ msgstr "Пацвердзіць"
942#~ msgstr "Пацвердзіць"
974
943
@@ -981,29 +950,18 @@ msgstr ""
981#~ msgid "Try swiping from the right edge to unlock the phone"
950#~ msgid "Try swiping from the right edge to unlock the phone"
982#~ msgstr "Правядзіце пальцам з правага краю, каб разблакаваць тэлефон"
951#~ msgstr "Правядзіце пальцам з правага краю, каб разблакаваць тэлефон"
983
952
984−#~ msgid "Loading. Please Wait..."
985−#~ msgstr "Загрузка. Чакайце..."
986−
987−#~ msgid "Speaking..."
988−#~ msgstr "Кажа..."
989−
990#~ msgid "Speak Now..."
953#~ msgid "Speak Now..."
991#~ msgstr "Кажыце..."
954#~ msgstr "Кажыце..."
992
955
993#~ msgid "Type or say a command"
956#~ msgid "Type or say a command"
994#~ msgstr "Напішыце або вымавіце каманду"
957#~ msgstr "Напішыце або вымавіце каманду"
995
958
996−#, qt-format
997#~ msgid "Enter %1"
959#~ msgid "Enter %1"
998#~ msgstr "Увядзіце %1"
960#~ msgstr "Увядзіце %1"
999
961
1000−#, qt-format
1001#~ msgid "Sorry, incorrect %1"
962#~ msgid "Sorry, incorrect %1"
1002#~ msgstr "Даруйце, некарэктны %1"
963#~ msgstr "Даруйце, некарэктны %1"
1003
964
1004−#~ msgid "Enter passcode"
1005−#~ msgstr "Увядзіце код"
1006−
1007#~ msgid "This will be your last attempt."
965#~ msgid "This will be your last attempt."
1008#~ msgstr "Апошняя спроба."
966#~ msgstr "Апошняя спроба."
1009
967
@@ -1027,8 +985,8 @@ msgstr ""
1027
985
1028#~ msgid "Swipe from the left to reveal the launcher for quick access to apps"
986#~ msgid "Swipe from the left to reveal the launcher for quick access to apps"
1029#~ msgstr ""
987#~ msgstr ""
1030−#~ "Правядзіце пальцам ад левага краю, каб адкрыць панэль запуску для паскарэння "
988+#~ "Правядзіце пальцам ад левага краю, каб адкрыць панэль запуску для "
1031−#~ "доступу да праграм"
989+#~ "паскарэння доступу да праграм"
1032
990
1033#~ msgid "Skip intro"
991#~ msgid "Skip intro"
1034#~ msgstr "Прапусціць уводзіны"
992#~ msgstr "Прапусціць уводзіны"
@@ -1054,9 +1012,6 @@ msgstr ""
1054#~ msgid "Let’s get started."
1012#~ msgid "Let’s get started."
1055#~ msgstr "Пачнем."
1013#~ msgstr "Пачнем."
1056
1014
1057−#~ msgid "Continue"
1058−#~ msgstr "Працягнуць"
1059−
1060#~ msgid "Please select how you’d like to unlock your phone."
1015#~ msgid "Please select how you’d like to unlock your phone."
1061#~ msgstr "Калі ласка, абярыце спосаб разблакавання тэлефона."
1016#~ msgstr "Калі ласка, абярыце спосаб разблакавання тэлефона."
1062
1017
@@ -1077,7 +1032,8 @@ msgstr ""
1077
1032
1078#~ msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
1033#~ msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
1079#~ msgstr ""
1034#~ msgstr ""
1080−#~ "На аснове GPS, ананімізаванага Wi-Fi і дадзеных сотавай сеткі (рэкамендуецца)"
1035+#~ "На аснове GPS, ананімізаванага Wi-Fi і дадзеных сотавай сеткі "
1036+#~ "(рэкамендуецца)"
1081
1037
1082#~ msgid "Improving your experience"
1038#~ msgid "Improving your experience"
1083#~ msgstr "Спрашчэнне вашай працы"
1039#~ msgstr "Спрашчэнне вашай працы"
@@ -1102,23 +1058,18 @@ msgstr ""
1102#~ msgstr "Цяпер Вашым тэлефонам можна карыстацца."
1058#~ msgstr "Цяпер Вашым тэлефонам можна карыстацца."
1103
1059
1104#~ msgid ""
1060#~ msgid ""
1105−#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
1061+#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms "
1106−#~ "conditions</a>."
1062+#~ "and conditions</a>."
1107#~ msgstr ""
1063#~ msgstr ""
1108#~ "Выбарам гэтага варыянту дзеянняў вы згаджаецеся з <a href='#'> умовамі "
1064#~ "Выбарам гэтага варыянту дзеянняў вы згаджаецеся з <a href='#'> умовамі "
1109#~ "прадстаўлення паслуг Nokia HERE</a>."
1065#~ "прадстаўлення паслуг Nokia HERE</a>."
1110
1066
1111−#~ msgid "Not at all"
1112−#~ msgstr "Не дазваляць"
1113−
1114−#, qt-format
1115#~ msgid "〈 %1"
1067#~ msgid "〈 %1"
1116#~ msgstr "〈 %1"
1068#~ msgstr "〈 %1"
1117
1069
1118#~ msgid "Confirm passphrase"
1070#~ msgid "Confirm passphrase"
1119#~ msgstr "Пацвердзіце пароль"
1071#~ msgstr "Пацвердзіце пароль"
1120
1072
1121−#, qt-format
1122#~ msgid "%1 〉"
1073#~ msgid "%1 〉"
1123#~ msgstr "%1 〉"
1074#~ msgstr "%1 〉"
1124
1075
@@ -1128,10 +1079,6 @@ msgstr ""
1128#~ msgid "Close"
1079#~ msgid "Close"
1129#~ msgstr "Закрыць"
1080#~ msgstr "Закрыць"
1130
1081
1131−#~ msgid "Try swiping from the top edge to access the indicators"
1132−#~ msgstr ""
1133−#~ "Паспрабуйце правесці пальцам ад верхняга краю для доступу да індыкатараў"
1134−
1135#~ msgid "Settings"
1082#~ msgid "Settings"
1136#~ msgstr "Наладкі"
1083#~ msgstr "Наладкі"
1137
1084
@@ -1142,9 +1089,6 @@ msgstr ""
1142#~ "Вы толькі што асвоілі асноўная жэсты і можаце пачаць выкарыстоўваць "
1089#~ "Вы толькі што асвоілі асноўная жэсты і можаце пачаць выкарыстоўваць "
1143#~ "тэлефон<br><br>Дакраніцеся да экрана, каб пачаць"
1090#~ "тэлефон<br><br>Дакраніцеся да экрана, каб пачаць"
1144
1091
1145−#~ msgid "Enter passphrase"
1146−#~ msgstr "Увядзіце пароль"
1147−
1148#~ msgid "Sorry, incorrect passcode."
1092#~ msgid "Sorry, incorrect passcode."
1149#~ msgstr "Даруйце, няслушны код."
1093#~ msgstr "Даруйце, няслушны код."
1150
1094
@@ -1212,9 +1156,6 @@ msgstr ""
1212#~ msgid "Try again."
1156#~ msgid "Try again."
1213#~ msgstr "Паспрабуйце яшчэ."
1157#~ msgstr "Паспрабуйце яшчэ."
1214
1158
1215−#~ msgid "Open the launcher"
1216−#~ msgstr "Адкрыць панэль запуску"
1217−
1218#~ msgid "Tap here to continue."
1159#~ msgid "Tap here to continue."
1219#~ msgstr "Націсніце тут, каб працягнуць."
1160#~ msgstr "Націсніце тут, каб працягнуць."
1220
1161
@@ -1298,15 +1239,15 @@ msgstr ""
1298#~ msgstr "Даруйце, некарэктны код"
1239#~ msgstr "Даруйце, некарэктны код"
1299
1240
1300#~ msgid ""
1241#~ msgid ""
1301−#~ "If passcode is entered incorrectly, your phone will conduct a factory reset "
1242+#~ "If passcode is entered incorrectly, your phone will conduct a factory "
1302−#~ "and all personal data will be deleted."
1243+#~ "reset and all personal data will be deleted."
1303#~ msgstr ""
1244#~ msgstr ""
1304−#~ "Калі ўведзены код неправільны, Ваш тэлефон зробіць агульны скід налад і ўсе "
1245+#~ "Калі ўведзены код неправільны, Ваш тэлефон зробіць агульны скід налад і "
1305−#~ "асабістыя дадзеныя будуць выдалены."
1246+#~ "ўсе асабістыя дадзеныя будуць выдалены."
1306
1247
1307#~ msgid ""
1248#~ msgid ""
1308#~ "If passphrase is entered incorrectly, your phone will conduct a factory "
1249#~ "If passphrase is entered incorrectly, your phone will conduct a factory "
1309#~ "reset and all personal data will be deleted."
1250#~ "reset and all personal data will be deleted."
1310#~ msgstr ""
1251#~ msgstr ""
1311−#~ "Калі ўведзены пароль неправільны, Ваш тэлефон зробіць агульны скід налад і "
1252+#~ "Калі ўведзены пароль неправільны, Ваш тэлефон зробіць агульны скід налад "
1312−#~ "ўсе асабістыя дадзеныя будуць выдалены."
1253+#~ "і ўсе асабістыя дадзеныя будуць выдалены."
po/bg.po+138−255
@@ -6,39 +6,40 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10−"POT-Creation-Date: 2017-04-04 22:56+0000\n"
10+"POT-Creation-Date: 2021-01-29 11:42-0600\n"
11"PO-Revision-Date: 2015-04-12 14:43+0000\n"
11"PO-Revision-Date: 2015-04-12 14:43+0000\n"
12"Last-Translator: George Karavasilev <kokoto-java@ubuntu.com>\n"
12"Last-Translator: George Karavasilev <kokoto-java@ubuntu.com>\n"
13"Language-Team: Bulgarian <bg@li.org>\n"
13"Language-Team: Bulgarian <bg@li.org>\n"
14+"Language: bg\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
19+"X-Launchpad-Export-Date: 2016-11-23 06:34+0000\n"
19−"X-Generator: Launchpad (build 18343)\n"
20+"X-Generator: Launchpad (build 18269)\n"
20
21
21−#: plugins/LightDM/Greeter.cpp:188
22+#: plugins/LightDM/Greeter.cpp:199
22msgid "Password: "
23msgid "Password: "
23msgstr ""
24msgstr ""
24
25
25−#: plugins/LightDM/Greeter.cpp:203
26+#: plugins/LightDM/Greeter.cpp:214
26msgid "Username"
27msgid "Username"
27msgstr ""
28msgstr ""
28
29
29−#: plugins/LightDM/Greeter.cpp:242
30+#: plugins/LightDM/Greeter.cpp:258
30msgid "Failed to authenticate"
31msgid "Failed to authenticate"
31msgstr ""
32msgstr ""
32
33
33−#: plugins/LightDM/Greeter.cpp:244
34+#: plugins/LightDM/Greeter.cpp:260
34msgid "Invalid password, please try again"
35msgid "Invalid password, please try again"
35msgstr ""
36msgstr ""
36
37
37−#: plugins/LightDM/Greeter.cpp:254
38+#: plugins/LightDM/Greeter.cpp:270
38msgid "Log In"
39msgid "Log In"
39msgstr ""
40msgstr ""
40
41
41−#: plugins/LightDM/Greeter.cpp:254
42+#: plugins/LightDM/Greeter.cpp:270
42msgid "Retry"
43msgid "Retry"
43msgstr ""
44msgstr ""
44
45
@@ -50,16 +51,16 @@ msgstr ""
50msgid "Guest Session"
51msgid "Guest Session"
51msgstr ""
52msgstr ""
52
53
53−#: plugins/Unity/Launcher/launcheritem.cpp:49
54+#: plugins/Unity/Launcher/launcheritem.cpp:48
54−#: plugins/Unity/Launcher/launcheritem.cpp:123
55+#: plugins/Unity/Launcher/launcheritem.cpp:122
55msgid "Pin shortcut"
56msgid "Pin shortcut"
56msgstr ""
57msgstr ""
57
58
58−#: plugins/Unity/Launcher/launcheritem.cpp:55
59+#: plugins/Unity/Launcher/launcheritem.cpp:54
59msgid "Quit"
60msgid "Quit"
60msgstr ""
61msgstr ""
61
62
62−#: plugins/Unity/Launcher/launcheritem.cpp:123
63+#: plugins/Unity/Launcher/launcheritem.cpp:122
63msgid "Unpin shortcut"
64msgid "Unpin shortcut"
64msgstr ""
65msgstr ""
65
66
@@ -82,9 +83,8 @@ msgctxt "Button: Log out from the system"
82msgid "Log Out"
83msgid "Log Out"
83msgstr ""
84msgstr ""
84
85
85−#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:284
86−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
87−#: qml/Wizard/Pages/passcode-confirm.qml:32
87+#: qml/Greeter/NarrowView.qml:215 qml/Wizard/Pages/passcode-confirm.qml:32
88#: qml/Wizard/Pages/passcode-set.qml:32
88#: qml/Wizard/Pages/passcode-set.qml:32
89msgid "Cancel"
89msgid "Cancel"
90msgstr ""
90msgstr ""
@@ -106,12 +106,12 @@ msgstr ""
106msgid "Yes"
106msgid "Yes"
107msgstr ""
107msgstr ""
108
108
109−#: qml/Components/Dialogs.qml:239
109+#: qml/Components/Dialogs.qml:243
110msgctxt "Title: Power off/Restart dialog"
110msgctxt "Title: Power off/Restart dialog"
111msgid "Power"
111msgid "Power"
112msgstr ""
112msgstr ""
113
113
114−#: qml/Components/Dialogs.qml:240
114+#: qml/Components/Dialogs.qml:244
115msgid ""
115msgid ""
116"Are you sure you would like\n"
116"Are you sure you would like\n"
117"to power off?"
117"to power off?"
@@ -119,22 +119,26 @@ msgstr ""
119"Искате ли да \n"
119"Искате ли да \n"
120"изключите захранването на устройството?"
120"изключите захранването на устройството?"
121
121
122−#: qml/Components/Dialogs.qml:244
122+#: qml/Components/Dialogs.qml:248
123msgctxt "Button: Power off the system"
123msgctxt "Button: Power off the system"
124msgid "Power off"
124msgid "Power off"
125msgstr ""
125msgstr ""
126
126
127−#: qml/Components/Dialogs.qml:255
127+#: qml/Components/Dialogs.qml:263
128msgctxt "Button: Restart the system"
128msgctxt "Button: Restart the system"
129msgid "Restart"
129msgid "Restart"
130msgstr ""
130msgstr ""
131
131
132+#: qml/Components/Dialogs.qml:276
133+msgid "Screenshot"
134+msgstr ""
135+
132#: qml/Components/KeyboardShortcutsOverlay.qml:41
136#: qml/Components/KeyboardShortcutsOverlay.qml:41
133msgid "Keyboard Shortcuts"
137msgid "Keyboard Shortcuts"
134msgstr ""
138msgstr ""
135
139
136#: qml/Components/KeyboardShortcutsOverlay.qml:55
140#: qml/Components/KeyboardShortcutsOverlay.qml:55
137−msgid "Unity 8"
141+msgid "Lomiri"
138msgstr ""
142msgstr ""
139
143
140#: qml/Components/KeyboardShortcutsOverlay.qml:62
144#: qml/Components/KeyboardShortcutsOverlay.qml:62
@@ -221,18 +225,6 @@ msgstr ""
221msgid "Opens the Application Drawer."
225msgid "Opens the Application Drawer."
222msgstr ""
226msgstr ""
223
227
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−
236#: qml/Components/KeyboardShortcutsOverlay.qml:235
228#: qml/Components/KeyboardShortcutsOverlay.qml:235
237msgid "Switching"
229msgid "Switching"
238msgstr ""
230msgstr ""
@@ -305,7 +297,7 @@ msgstr ""
305msgid "Closes the current window."
297msgid "Closes the current window."
306msgstr ""
298msgstr ""
307
299
308−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
300+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:235
309msgid "Return to Call"
301msgid "Return to Call"
310msgstr ""
302msgstr ""
311
303
@@ -379,103 +371,6 @@ msgstr ""
379msgid "Find more settings in the system settings."
371msgid "Find more settings in the system settings."
380msgstr ""
372msgstr ""
381
373
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−
479#: qml/Greeter/CoverPage.qml:127
374#: qml/Greeter/CoverPage.qml:127
480msgid "Unlock"
375msgid "Unlock"
481msgstr ""
376msgstr ""
@@ -511,7 +406,7 @@ msgstr ""
511msgid "Enter passcode to unlock"
406msgid "Enter passcode to unlock"
512msgstr ""
407msgstr ""
513
408
514−#: qml/Greeter/NarrowView.qml:228
409+#: qml/Greeter/NarrowView.qml:235
515msgid "Emergency"
410msgid "Emergency"
516msgstr ""
411msgstr ""
517
412
@@ -527,17 +422,18 @@ msgstr ""
527msgid "Select desktop environment"
422msgid "Select desktop environment"
528msgstr ""
423msgstr ""
529
424
530−#: qml/Launcher/Drawer.qml:94
425+#: qml/Launcher/Drawer.qml:250
426+#, fuzzy
427+#| msgid "Search"
531msgid "Search…"
428msgid "Search…"
532−msgstr ""
429+msgstr "Търсене"
533
430
534−#: qml/Launcher/Drawer.qml:129
431+#: qml/Launcher/PullToRefreshScopeStyle.qml:56
535−msgctxt "Apps sorted alphabetically"
536−msgid "A-Z"
432+msgid "Pull to refresh…"
537msgstr ""
433msgstr ""
538
434
539−#: qml/Launcher/MoreAppsHeader.qml:55
435+#: qml/Launcher/PullToRefreshScopeStyle.qml:61
540−msgid "More apps in the store"
436+msgid "Release to refresh…"
541msgstr ""
437msgstr ""
542
438
543#: qml/Notifications/NotificationMenuItemFactory.qml:124
439#: qml/Notifications/NotificationMenuItemFactory.qml:124
@@ -635,19 +531,27 @@ msgstr ""
635msgid "Drag using 3 fingers any application from one window to the other"
531msgid "Drag using 3 fingers any application from one window to the other"
636msgstr ""
532msgstr ""
637
533
534+#: qml/Stage/Stage.qml:671
535+msgid "No running apps"
536+msgstr ""
537+
638#: qml/Tutorial/TutorialLeftLong.qml:49
538#: qml/Tutorial/TutorialLeftLong.qml:49
539+#, fuzzy
540+#| msgid "Try swiping from the top edge to access the indicators"
639msgid "Long swipe from the left edge to open the Application Drawer"
541msgid "Long swipe from the left edge to open the Application Drawer"
640msgstr ""
542msgstr ""
543+"Опитайте се да приплъзнете пръста си от горния край към долния, за да "
544+"получите достъп до индикаторите"
641
545
642#: qml/Tutorial/TutorialLeft.qml:47
546#: qml/Tutorial/TutorialLeft.qml:47
643msgid "Short swipe from the left edge to open the launcher"
547msgid "Short swipe from the left edge to open the launcher"
644msgstr ""
548msgstr ""
645
549
646−#: qml/Tutorial/TutorialRight.qml:55
550+#: qml/Tutorial/TutorialRight.qml:54
647msgid "Push your mouse against the right edge to view your open apps"
551msgid "Push your mouse against the right edge to view your open apps"
648msgstr ""
552msgstr ""
649
553
650−#: qml/Tutorial/TutorialRight.qml:56
554+#: qml/Tutorial/TutorialRight.qml:55
651msgid "Swipe from the right edge to view your open apps"
555msgid "Swipe from the right edge to view your open apps"
652msgstr ""
556msgstr ""
653
557
@@ -655,25 +559,42 @@ msgstr ""
655msgid "Swipe from the top edge to access notifications and quick settings"
559msgid "Swipe from the top edge to access notifications and quick settings"
656msgstr ""
560msgstr ""
657
561
658−#: qml/Wizard/Page.qml:54
562+#: qml/Wizard/Page.qml:59
659msgctxt "Button: Go back one page in the Wizard"
563msgctxt "Button: Go back one page in the Wizard"
660msgid "Back"
564msgid "Back"
661msgstr ""
565msgstr ""
662
566
663−#: qml/Wizard/Pages/10-welcome.qml:28
567+#: qml/Wizard/Pages/10-welcome.qml:29
664msgid "Language"
568msgid "Language"
665msgstr ""
569msgstr ""
666
570
667−#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
571+#: qml/Wizard/Pages/10-welcome.qml:176
668−#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
572+#: qml/Wizard/Pages/10-welcome-update.qml:126
573+#: qml/Wizard/Pages/11-changelog.qml:74 qml/Wizard/Pages/20-keyboard.qml:152
669−#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
574+#: qml/Wizard/Pages/30-wifi.qml:214 qml/Wizard/Pages/50-timezone.qml:272
670−#: qml/Wizard/Pages/70-passwd-type.qml:145
575+#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/70-passwd-type.qml:146
671−#: qml/Wizard/Pages/75-report-check.qml:84
672−#: qml/Wizard/Pages/passcode-desktop.qml:142
576+#: qml/Wizard/Pages/passcode-desktop.qml:154
673−#: qml/Wizard/Pages/password-set.qml:142
577+#: qml/Wizard/Pages/password-set.qml:153
674msgid "Next"
578msgid "Next"
675msgstr ""
579msgstr ""
676
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+#, fuzzy
595+msgid "Loading..."
596+msgstr "Говорете..."
597+
677#: qml/Wizard/Pages/20-keyboard.qml:31
598#: qml/Wizard/Pages/20-keyboard.qml:31
678msgid "Select Keyboard"
599msgid "Select Keyboard"
679msgstr ""
600msgstr ""
@@ -686,64 +607,33 @@ msgstr ""
686msgid "Keyboard layout"
607msgid "Keyboard layout"
687msgstr ""
608msgstr ""
688
609
689−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
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
690−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
612+#: qml/Wizard/Pages/sim.qml:101
691msgid "Skip"
613msgid "Skip"
692msgstr ""
614msgstr ""
693
615
694−#: qml/Wizard/Pages/30-wifi.qml:30
616+#: qml/Wizard/Pages/30-wifi.qml:31
695msgid "Connect to Wi‑Fi"
617msgid "Connect to Wi‑Fi"
696msgstr ""
618msgstr ""
697
619
698−#: qml/Wizard/Pages/30-wifi.qml:131
620+#: qml/Wizard/Pages/30-wifi.qml:139
699msgid "Connected"
621msgid "Connected"
700msgstr ""
622msgstr ""
701
623
702−#: qml/Wizard/Pages/30-wifi.qml:164
624+#: qml/Wizard/Pages/30-wifi.qml:172
703msgid "Available Wi-Fi networks"
625msgid "Available Wi-Fi networks"
704msgstr ""
626msgstr ""
705
627
706−#: qml/Wizard/Pages/30-wifi.qml:165
628+#: qml/Wizard/Pages/30-wifi.qml:173
707msgid "No available Wi-Fi networks"
629msgid "No available Wi-Fi networks"
708msgstr ""
630msgstr ""
709
631
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−
742#: qml/Wizard/Pages/50-timezone.qml:30
632#: qml/Wizard/Pages/50-timezone.qml:30
743msgid "Time Zone"
633msgid "Time Zone"
744msgstr ""
634msgstr ""
745
635
746−#: qml/Wizard/Pages/50-timezone.qml:182
636+#: qml/Wizard/Pages/50-timezone.qml:183
747msgid "Enter your city"
637msgid "Enter your city"
748msgstr ""
638msgstr ""
749
639
@@ -751,7 +641,7 @@ msgstr ""
751msgid "Personalize Your Device"
641msgid "Personalize Your Device"
752msgstr ""
642msgstr ""
753
643
754−#: qml/Wizard/Pages/60-account.qml:48
644+#: qml/Wizard/Pages/60-account.qml:54
755msgid "Preferred Name"
645msgid "Preferred Name"
756msgstr ""
646msgstr ""
757
647
@@ -759,81 +649,72 @@ msgstr ""
759msgid "Lock Screen"
649msgid "Lock Screen"
760msgstr ""
650msgstr ""
761
651
762−#: qml/Wizard/Pages/70-passwd-type.qml:102
652+#: qml/Wizard/Pages/70-passwd-type.qml:103
763msgctxt "Label: Type of security method"
653msgctxt "Label: Type of security method"
764msgid "Create new password"
654msgid "Create new password"
765msgstr ""
655msgstr ""
766
656
767−#: qml/Wizard/Pages/70-passwd-type.qml:104
657+#: qml/Wizard/Pages/70-passwd-type.qml:105
768msgctxt "Label: Type of security method"
658msgctxt "Label: Type of security method"
769msgid "Create passcode (numbers only)"
659msgid "Create passcode (numbers only)"
770msgstr ""
660msgstr ""
771
661
772−#: qml/Wizard/Pages/70-passwd-type.qml:106
662+#: qml/Wizard/Pages/70-passwd-type.qml:107
773msgctxt "Label: Type of security method"
663msgctxt "Label: Type of security method"
774msgid "No lock code"
664msgid "No lock code"
775msgstr ""
665msgstr ""
776
666
777−#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
667+#: qml/Wizard/Pages/79-system-update.qml:28
778−msgid "Privacy Policy"
668+msgid "Update Device"
779−msgstr ""
780−
781−#: qml/Wizard/Pages/75-report-check.qml:26
782−msgid "Help Us Improve"
783msgstr ""
669msgstr ""
784
670
785−#: qml/Wizard/Pages/75-report-check.qml:59
671+#: qml/Wizard/Pages/79-system-update.qml:55
786−msgid "Improve system performance by sending us crashes and error reports."
672+msgid ""
787−msgstr ""
673+"There is a system update available and ready to install. Afterwards, the "
788−
674+"device will automatically restart."
789−#: qml/Wizard/Pages/75-report-check.qml:60
790−msgid "Privacy policy"
791msgstr ""
675msgstr ""
792
676
793−#: qml/Wizard/Pages/80-finished.qml:89
677+#: qml/Wizard/Pages/79-system-update.qml:76
678+msgctxt "string identifying name of the update"
794−msgid "Welcome to Ubuntu"
679+msgid "Ubuntu Touch system"
795msgstr ""
680msgstr ""
796
681
797−#: qml/Wizard/Pages/80-finished.qml:104
682+#: qml/Wizard/Pages/79-system-update.qml:83
798−msgid "You are ready to use your device now"
683+#, qt-format
684+msgctxt "version of the system update"
685+msgid "Version %1"
799msgstr ""
686msgstr ""
800
687
801−#: qml/Wizard/Pages/80-finished.qml:124
688+#: qml/Wizard/Pages/79-system-update.qml:95
802−msgid "Get Started"
689+msgid "This could take a few minutes..."
803msgstr ""
690msgstr ""
804
691
805−#: qml/Wizard/Pages/here-terms.qml:25
692+#: qml/Wizard/Pages/79-system-update.qml:109
806−msgid "Terms & Conditions"
693+msgid "Install and restart now"
807msgstr ""
694msgstr ""
808
695
809−#: qml/Wizard/Pages/here-terms.qml:69
696+#: qml/Wizard/Pages/80-finished.qml:91
810−msgid "Your device uses positioning technologies provided by HERE."
697+msgid "Welcome Back"
811msgstr ""
698msgstr ""
812
699
813−#: qml/Wizard/Pages/here-terms.qml:81
700+#: qml/Wizard/Pages/80-finished.qml:91
814−msgid ""
701+msgid "Welcome to Ubuntu"
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."
818msgstr ""
702msgstr ""
819
703
820−#: qml/Wizard/Pages/here-terms.qml:93
704+#: qml/Wizard/Pages/80-finished.qml:106
821−msgid ""
705+msgid "You are ready to use your device now"
822−"The information collected is used to analyze the service and to improve the "
823−"use of service, but not to identify you personally."
824msgstr ""
706msgstr ""
825
707
826−#: qml/Wizard/Pages/here-terms.qml:106
708+#: qml/Wizard/Pages/80-finished.qml:126
827−#, qt-format
709+msgid "Continue"
828−msgid "By continuing, you agree to the HERE platform %1 and %2."
829msgstr ""
710msgstr ""
830
711
831−#: qml/Wizard/Pages/here-terms.qml:107
712+#: qml/Wizard/Pages/80-finished.qml:126
832−msgid "Service Terms"
713+msgid "Get Started"
833msgstr ""
714msgstr ""
834
715
835#: qml/Wizard/Pages/passcode-confirm.qml:43
716#: qml/Wizard/Pages/passcode-confirm.qml:43
836−#: qml/Wizard/Pages/passcode-desktop.qml:97
717+#: qml/Wizard/Pages/passcode-desktop.qml:104
837msgid "Confirm passcode"
718msgid "Confirm passcode"
838msgstr ""
719msgstr ""
839
720
@@ -850,24 +731,24 @@ msgstr ""
850msgid "Lock Screen Passcode"
731msgid "Lock Screen Passcode"
851msgstr ""
732msgstr ""
852
733
853−#: qml/Wizard/Pages/passcode-desktop.qml:61
734+#: qml/Wizard/Pages/passcode-desktop.qml:68
854msgid "Enter 4 numbers to setup your passcode"
735msgid "Enter 4 numbers to setup your passcode"
855msgstr ""
736msgstr ""
856
737
857−#: qml/Wizard/Pages/passcode-desktop.qml:77
738+#: qml/Wizard/Pages/passcode-desktop.qml:84
858#: qml/Wizard/Pages/passcode-set.qml:54
739#: qml/Wizard/Pages/passcode-set.qml:54
859msgid "Choose passcode"
740msgid "Choose passcode"
860msgstr ""
741msgstr ""
861
742
862−#: qml/Wizard/Pages/passcode-desktop.qml:127
743+#: qml/Wizard/Pages/passcode-desktop.qml:139
863msgid "Passcode too short"
744msgid "Passcode too short"
864msgstr ""
745msgstr ""
865
746
866−#: qml/Wizard/Pages/passcode-desktop.qml:129
747+#: qml/Wizard/Pages/passcode-desktop.qml:141
867msgid "Passcodes match"
748msgid "Passcodes match"
868msgstr ""
749msgstr ""
869
750
870−#: qml/Wizard/Pages/passcode-desktop.qml:131
751+#: qml/Wizard/Pages/passcode-desktop.qml:143
871msgid "Passcodes do not match"
752msgid "Passcodes do not match"
872msgstr ""
753msgstr ""
873
754
@@ -879,15 +760,15 @@ msgstr ""
879msgid "Lock Screen Password"
760msgid "Lock Screen Password"
880msgstr ""
761msgstr ""
881
762
882−#: qml/Wizard/Pages/password-set.qml:62
763+#: qml/Wizard/Pages/password-set.qml:68
883msgid "Enter at least 8 characters"
764msgid "Enter at least 8 characters"
884msgstr ""
765msgstr ""
885
766
886−#: qml/Wizard/Pages/password-set.qml:74
767+#: qml/Wizard/Pages/password-set.qml:80
887msgid "Choose password"
768msgid "Choose password"
888msgstr ""
769msgstr ""
889
770
890−#: qml/Wizard/Pages/password-set.qml:104
771+#: qml/Wizard/Pages/password-set.qml:110
891msgid "Confirm password"
772msgid "Confirm password"
892msgstr ""
773msgstr ""
893
774
@@ -943,12 +824,25 @@ msgstr ""
943msgid "Very weak password"
824msgid "Very weak password"
944msgstr ""
825msgstr ""
945
826
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+
946#~ msgid "Confirm"
843#~ msgid "Confirm"
947#~ msgstr "Потвърди"
844#~ msgstr "Потвърди"
948
845
949−#~ msgid "Search"
950−#~ msgstr "Търсене"
951−
952#~ msgid "Top edge"
846#~ msgid "Top edge"
953#~ msgstr "Горен край"
847#~ msgstr "Горен край"
954
848
@@ -964,9 +858,6 @@ msgstr ""
964#~ msgid "Type or say a command"
858#~ msgid "Type or say a command"
965#~ msgstr "Въведете или кажете команда"
859#~ msgstr "Въведете или кажете команда"
966
860
967−#~ msgid "Speaking..."
968−#~ msgstr "Говорете..."
969−
970#~ msgid "Speak Now..."
861#~ msgid "Speak Now..."
971#~ msgstr "Говорете сега..."
862#~ msgstr "Говорете сега..."
972
863
@@ -976,22 +867,14 @@ msgstr ""
976#~ msgid "Skip intro"
867#~ msgid "Skip intro"
977#~ msgstr "Пропусни интрото"
868#~ msgstr "Пропусни интрото"
978
869
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−
987#~ msgid "Swipe up again to close the settings screen"
870#~ msgid "Swipe up again to close the settings screen"
988#~ msgstr ""
871#~ msgstr ""
989#~ "Отново приплъзнете пръста си нагоре за да затворите екрана с настройките"
872#~ "Отново приплъзнете пръста си нагоре за да затворите екрана с настройките"
990
873
991#~ msgid "Swipe from the left to reveal the launcher for quick access to apps"
874#~ msgid "Swipe from the left to reveal the launcher for quick access to apps"
992#~ msgstr ""
875#~ msgstr ""
993−#~ "Приплъзнете пръста си от левия край към десния, за да отворите стартера за "
876+#~ "Приплъзнете пръста си от левия край към десния, за да отворите стартера "
994−#~ "бърз достъп до приложенията"
877+#~ "за бърз достъп до приложенията"
995
878
996#~ msgid "Try swiping from the right edge to unlock the phone"
879#~ msgid "Try swiping from the right edge to unlock the phone"
997#~ msgstr ""
880#~ msgstr ""
po/bn.po+350−420
@@ -6,67 +6,69 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10−"POT-Creation-Date: 2017-04-04 22:56+0000\n"
10+"POT-Creation-Date: 2021-01-29 11:42-0600\n"
11−"PO-Revision-Date: 2015-11-27 19:38+0000\n"
11+"PO-Revision-Date: 2021-02-01 21:06+0000\n"
12−"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12+"Last-Translator: imrufbd <imrufbd@gmail.com>\n"
13−"Language-Team: Bengali <bn@li.org>\n"
13+"Language-Team: Bengali <https://translate.ubports.com/projects/ubports/"
14+"lomiri/bn/>\n"
15+"Language: bn\n"
14"MIME-Version: 1.0\n"
16"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
18"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
19"Plural-Forms: nplurals=2; plural=n != 1;\n"
20+"X-Generator: Weblate 3.11.3\n"
18−"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
21+"X-Launchpad-Export-Date: 2016-11-23 06:34+0000\n"
19−"X-Generator: Launchpad (build 18343)\n"
20
22
21−#: plugins/LightDM/Greeter.cpp:188
23+#: plugins/LightDM/Greeter.cpp:199
22msgid "Password: "
24msgid "Password: "
23msgstr "পাসওয়ার্ড: "
25msgstr "পাসওয়ার্ড: "
24
26
25−#: plugins/LightDM/Greeter.cpp:203
27+#: plugins/LightDM/Greeter.cpp:214
26msgid "Username"
28msgid "Username"
27−msgstr ""
29+msgstr "ইউজারনেম"
28
30
29−#: plugins/LightDM/Greeter.cpp:242
31+#: plugins/LightDM/Greeter.cpp:258
30msgid "Failed to authenticate"
32msgid "Failed to authenticate"
31−msgstr ""
33+msgstr "যাচাই করা যায়নি"
32
34
33−#: plugins/LightDM/Greeter.cpp:244
35+#: plugins/LightDM/Greeter.cpp:260
34msgid "Invalid password, please try again"
36msgid "Invalid password, please try again"
35−msgstr ""
37+msgstr "ভুল পাসওয়ার্ড, আবার চেষ্টা করুন"
36
38
37−#: plugins/LightDM/Greeter.cpp:254
39+#: plugins/LightDM/Greeter.cpp:270
38msgid "Log In"
40msgid "Log In"
39−msgstr ""
41+msgstr "লগইন করুন"
40
42
41−#: plugins/LightDM/Greeter.cpp:254
43+#: plugins/LightDM/Greeter.cpp:270
42msgid "Retry"
44msgid "Retry"
43−msgstr ""
45+msgstr "আবার চেষ্টা করুন"
44
46
45#: plugins/LightDM/UsersModel.cpp:157
47#: plugins/LightDM/UsersModel.cpp:157
46msgid "Login"
48msgid "Login"
47−msgstr ""
49+msgstr "লগইন করুন"
48
50
49#: plugins/LightDM/UsersModel.cpp:165
51#: plugins/LightDM/UsersModel.cpp:165
50msgid "Guest Session"
52msgid "Guest Session"
51−msgstr ""
53+msgstr "গেস্ট সেশন"
52
54
53−#: plugins/Unity/Launcher/launcheritem.cpp:49
55+#: plugins/Unity/Launcher/launcheritem.cpp:48
54−#: plugins/Unity/Launcher/launcheritem.cpp:123
56+#: plugins/Unity/Launcher/launcheritem.cpp:122
55msgid "Pin shortcut"
57msgid "Pin shortcut"
56−msgstr "পিন"
58+msgstr "শর্টকাট যোগ করুন"
57
59
58−#: plugins/Unity/Launcher/launcheritem.cpp:55
60+#: plugins/Unity/Launcher/launcheritem.cpp:54
59msgid "Quit"
61msgid "Quit"
60−msgstr ""
62+msgstr "বাহির"
61
63
62−#: plugins/Unity/Launcher/launcheritem.cpp:123
64+#: plugins/Unity/Launcher/launcheritem.cpp:122
63msgid "Unpin shortcut"
65msgid "Unpin shortcut"
64−msgstr "আনপিন"
66+msgstr "শর্টকাট সরান"
65
67
66#: qml/Components/Dialogs.qml:176
68#: qml/Components/Dialogs.qml:176
67msgctxt "Title: Lock/Log out dialog"
69msgctxt "Title: Lock/Log out dialog"
68msgid "Log out"
70msgid "Log out"
69−msgstr ""
71+msgstr "লগআউট করুন"
70
72
71#: qml/Components/Dialogs.qml:177
73#: qml/Components/Dialogs.qml:177
72msgid "Are you sure you want to log out?"
74msgid "Are you sure you want to log out?"
@@ -80,11 +82,10 @@ msgstr "লক করুন"
80#: qml/Components/Dialogs.qml:191
82#: qml/Components/Dialogs.qml:191
81msgctxt "Button: Log out from the system"
83msgctxt "Button: Log out from the system"
82msgid "Log Out"
84msgid "Log Out"
83−msgstr ""
85+msgstr "লগআউট করুন"
84
86
85−#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
87+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:284
86−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
87−#: qml/Wizard/Pages/passcode-confirm.qml:32
88+#: qml/Greeter/NarrowView.qml:215 qml/Wizard/Pages/passcode-confirm.qml:32
88#: qml/Wizard/Pages/passcode-set.qml:32
89#: qml/Wizard/Pages/passcode-set.qml:32
89msgid "Cancel"
90msgid "Cancel"
90msgstr "বাতিল"
91msgstr "বাতিল"
@@ -106,12 +107,12 @@ msgstr "না"
106msgid "Yes"
107msgid "Yes"
107msgstr "হ্যাঁ"
108msgstr "হ্যাঁ"
108
109
109−#: qml/Components/Dialogs.qml:239
110+#: qml/Components/Dialogs.qml:243
110msgctxt "Title: Power off/Restart dialog"
111msgctxt "Title: Power off/Restart dialog"
111msgid "Power"
112msgid "Power"
112−msgstr ""
113+msgstr "বন্ধ/চালু"
113
114
114−#: qml/Components/Dialogs.qml:240
115+#: qml/Components/Dialogs.qml:244
115msgid ""
116msgid ""
116"Are you sure you would like\n"
117"Are you sure you would like\n"
117"to power off?"
118"to power off?"
@@ -119,193 +120,187 @@ msgstr ""
119"আপনি নিশ্চিত যে আপনি\n"
120"আপনি নিশ্চিত যে আপনি\n"
120"বন্ধ করতে চান?"
121"বন্ধ করতে চান?"
121
122
122−#: qml/Components/Dialogs.qml:244
123+#: qml/Components/Dialogs.qml:248
123msgctxt "Button: Power off the system"
124msgctxt "Button: Power off the system"
124msgid "Power off"
125msgid "Power off"
125msgstr "বন্ধ করুন"
126msgstr "বন্ধ করুন"
126
127
127−#: qml/Components/Dialogs.qml:255
128+#: qml/Components/Dialogs.qml:263
128msgctxt "Button: Restart the system"
129msgctxt "Button: Restart the system"
129msgid "Restart"
130msgid "Restart"
130msgstr "পুনরায় চালু"
131msgstr "পুনরায় চালু"
131
132
133+#: qml/Components/Dialogs.qml:276
134+#, fuzzy
135+#| msgid "Takes a screenshot."
136+msgid "Screenshot"
137+msgstr "স্ক্রীনশট নেওয়া।"
138+
132#: qml/Components/KeyboardShortcutsOverlay.qml:41
139#: qml/Components/KeyboardShortcutsOverlay.qml:41
133msgid "Keyboard Shortcuts"
140msgid "Keyboard Shortcuts"
134−msgstr ""
141+msgstr "কিবোর্ড শর্টকাট"
135
142
136#: qml/Components/KeyboardShortcutsOverlay.qml:55
143#: qml/Components/KeyboardShortcutsOverlay.qml:55
137−msgid "Unity 8"
144+msgid "Lomiri"
138msgstr ""
145msgstr ""
139
146
140#: qml/Components/KeyboardShortcutsOverlay.qml:62
147#: qml/Components/KeyboardShortcutsOverlay.qml:62
141msgid "PrtScr"
148msgid "PrtScr"
142−msgstr ""
149+msgstr "প্রিন্টস্ক্রিন"
143
150
144#: qml/Components/KeyboardShortcutsOverlay.qml:67
151#: qml/Components/KeyboardShortcutsOverlay.qml:67
145msgid "Takes a screenshot."
152msgid "Takes a screenshot."
146−msgstr ""
153+msgstr "স্ক্রীনশট নেওয়া।"
147
154
148#: qml/Components/KeyboardShortcutsOverlay.qml:75
155#: qml/Components/KeyboardShortcutsOverlay.qml:75
149msgid "Alt + PrtScr"
156msgid "Alt + PrtScr"
150−msgstr ""
157+msgstr "অল্টার কী + প্রিন্টস্ক্রীন কী"
151
158
152#: qml/Components/KeyboardShortcutsOverlay.qml:80
159#: qml/Components/KeyboardShortcutsOverlay.qml:80
153msgid "Takes a screenshot of the current window."
160msgid "Takes a screenshot of the current window."
154−msgstr ""
161+msgstr "দৃশ্যমান উইন্ডো এর স্ক্রীনশট।"
155
162
156#: qml/Components/KeyboardShortcutsOverlay.qml:88
163#: qml/Components/KeyboardShortcutsOverlay.qml:88
157msgid "Super + Space"
164msgid "Super + Space"
158−msgstr ""
165+msgstr "সুপার কী + স্পেস কী"
159
166
160#: qml/Components/KeyboardShortcutsOverlay.qml:93
167#: qml/Components/KeyboardShortcutsOverlay.qml:93
161msgid "Switches to next keyboard layout."
168msgid "Switches to next keyboard layout."
162−msgstr ""
169+msgstr "পরবর্তী কিবোর্ড নকশা নির্বাচন।"
163
170
164#: qml/Components/KeyboardShortcutsOverlay.qml:101
171#: qml/Components/KeyboardShortcutsOverlay.qml:101
165msgid "Super + Shift + Space"
172msgid "Super + Shift + Space"
166−msgstr ""
173+msgstr "সুপার কী + শিফট্ কী + স্পেস কী"
167
174
168#: qml/Components/KeyboardShortcutsOverlay.qml:106
175#: qml/Components/KeyboardShortcutsOverlay.qml:106
169msgid "Switches to previous keyboard layout."
176msgid "Switches to previous keyboard layout."
170−msgstr ""
177+msgstr "পূর্ববর্তী কিবোর্ড নকশা নির্বাচন।"
171
178
172#: qml/Components/KeyboardShortcutsOverlay.qml:114
179#: qml/Components/KeyboardShortcutsOverlay.qml:114
173msgid "Ctrl + Alt + T"
180msgid "Ctrl + Alt + T"
174−msgstr ""
181+msgstr "কন্ট্রোল কী + অল্টার কী + T"
175
182
176#: qml/Components/KeyboardShortcutsOverlay.qml:119
183#: qml/Components/KeyboardShortcutsOverlay.qml:119
177msgid "Starts the Terminal application."
184msgid "Starts the Terminal application."
178−msgstr ""
185+msgstr "টার্মিনাল এপ্লিকেশন চালু।"
179
186
180#: qml/Components/KeyboardShortcutsOverlay.qml:131
187#: qml/Components/KeyboardShortcutsOverlay.qml:131
181msgid "Launcher"
188msgid "Launcher"
182−msgstr ""
189+msgstr "লঞ্চার"
183
190
184#: qml/Components/KeyboardShortcutsOverlay.qml:138
191#: qml/Components/KeyboardShortcutsOverlay.qml:138
185msgid "Super (Hold)"
192msgid "Super (Hold)"
186−msgstr ""
193+msgstr "সুপার কী (কিছুক্ষণ চেপে ধরে রাখুন)"
187
194
188#: qml/Components/KeyboardShortcutsOverlay.qml:143
195#: qml/Components/KeyboardShortcutsOverlay.qml:143
189msgid "Opens the launcher, displays shortcuts."
196msgid "Opens the launcher, displays shortcuts."
190−msgstr ""
197+msgstr "লঞ্চারে প্রবেশ, শর্টকাট প্রদর্শন।"
191
198
192#: qml/Components/KeyboardShortcutsOverlay.qml:151
199#: qml/Components/KeyboardShortcutsOverlay.qml:151
193msgid "Alt + F1"
200msgid "Alt + F1"
194−msgstr ""
201+msgstr "অল্টার কী + F1 কী"
195
202
196#: qml/Components/KeyboardShortcutsOverlay.qml:156
203#: qml/Components/KeyboardShortcutsOverlay.qml:156
197msgid "Opens launcher keyboard navigation mode."
204msgid "Opens launcher keyboard navigation mode."
198−msgstr ""
205+msgstr "লঞ্চার কিবোর্ড নেভিগেশন মোড চালু ।"
199
206
200#: qml/Components/KeyboardShortcutsOverlay.qml:164
207#: qml/Components/KeyboardShortcutsOverlay.qml:164
201msgid "Super + Tab"
208msgid "Super + Tab"
202−msgstr ""
209+msgstr "সুপার কী + ট্যাব কী"
203
210
204#: qml/Components/KeyboardShortcutsOverlay.qml:169
211#: qml/Components/KeyboardShortcutsOverlay.qml:169
205msgid "Switches applications via the launcher."
212msgid "Switches applications via the launcher."
206−msgstr ""
213+msgstr "লঞ্চারের মাধ্যমে এপ্লিকেশন পরিবর্তন।"
207
214
208#: qml/Components/KeyboardShortcutsOverlay.qml:177
215#: qml/Components/KeyboardShortcutsOverlay.qml:177
209msgid "Super + 1 to 0"
216msgid "Super + 1 to 0"
210−msgstr ""
217+msgstr "সুপার কী + ১ থেকে ০"
211
218
212#: qml/Components/KeyboardShortcutsOverlay.qml:182
219#: qml/Components/KeyboardShortcutsOverlay.qml:182
213msgid "Same as clicking on a launcher icon."
220msgid "Same as clicking on a launcher icon."
214−msgstr ""
221+msgstr "লঞ্চার আইকনে ক্লিক করার মতই কাজ করে।"
215
222
216#: qml/Components/KeyboardShortcutsOverlay.qml:190
223#: qml/Components/KeyboardShortcutsOverlay.qml:190
217msgid "Super + A"
224msgid "Super + A"
218−msgstr ""
225+msgstr "সুপার কী + A"
219
226
220#: qml/Components/KeyboardShortcutsOverlay.qml:195
227#: qml/Components/KeyboardShortcutsOverlay.qml:195
221msgid "Opens the Application Drawer."
228msgid "Opens the Application Drawer."
222−msgstr ""
229+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 ""
235
230
236#: qml/Components/KeyboardShortcutsOverlay.qml:235
231#: qml/Components/KeyboardShortcutsOverlay.qml:235
237msgid "Switching"
232msgid "Switching"
238−msgstr ""
233+msgstr "পরিবর্তন"
239
234
240#: qml/Components/KeyboardShortcutsOverlay.qml:242
235#: qml/Components/KeyboardShortcutsOverlay.qml:242
241msgid "Alt + Tab"
236msgid "Alt + Tab"
242−msgstr ""
237+msgstr "অল্টার কী + ট্যাব কী"
243
238
244#: qml/Components/KeyboardShortcutsOverlay.qml:247
239#: qml/Components/KeyboardShortcutsOverlay.qml:247
245msgid "Switches between applications."
240msgid "Switches between applications."
246−msgstr ""
241+msgstr "একাধিক চালু এপ্লিকেশনের মধ্যে একটি নির্বাচন করে।"
247
242
248#: qml/Components/KeyboardShortcutsOverlay.qml:255
243#: qml/Components/KeyboardShortcutsOverlay.qml:255
249msgid "Super + W"
244msgid "Super + W"
250−msgstr ""
245+msgstr "সুপার কী + W"
251
246
252#: qml/Components/KeyboardShortcutsOverlay.qml:260
247#: qml/Components/KeyboardShortcutsOverlay.qml:260
253msgid "Opens the desktop spread."
248msgid "Opens the desktop spread."
254−msgstr ""
249+msgstr "ডেস্কটপের প্রসারণে প্রবেশ।"
255
250
256#: qml/Components/KeyboardShortcutsOverlay.qml:268
251#: qml/Components/KeyboardShortcutsOverlay.qml:268
257msgid "Cursor Left or Right"
252msgid "Cursor Left or Right"
258−msgstr ""
253+msgstr "কার্সর বাম থেকে ডানে"
259
254
260#: qml/Components/KeyboardShortcutsOverlay.qml:273
255#: qml/Components/KeyboardShortcutsOverlay.qml:273
261msgid "Moves the focus."
256msgid "Moves the focus."
262−msgstr ""
257+msgstr "ফোকাস সরায়।"
263
258
264#: qml/Components/KeyboardShortcutsOverlay.qml:285
259#: qml/Components/KeyboardShortcutsOverlay.qml:285
265msgid "Windows"
260msgid "Windows"
266−msgstr ""
261+msgstr "উইন্ডো সমূহ"
267
262
268#: qml/Components/KeyboardShortcutsOverlay.qml:292
263#: qml/Components/KeyboardShortcutsOverlay.qml:292
269msgid "Ctrl + Super + D"
264msgid "Ctrl + Super + D"
270−msgstr ""
265+msgstr "কন্ট্রোল কী + সুপার কী + D"
271
266
272#: qml/Components/KeyboardShortcutsOverlay.qml:297
267#: qml/Components/KeyboardShortcutsOverlay.qml:297
273msgid "Minimizes all windows."
268msgid "Minimizes all windows."
274−msgstr ""
269+msgstr "সব উইন্ডোকে লঘু করে।"
275
270
276#: qml/Components/KeyboardShortcutsOverlay.qml:305
271#: qml/Components/KeyboardShortcutsOverlay.qml:305
277msgid "Ctrl + Super + Up"
272msgid "Ctrl + Super + Up"
278−msgstr ""
273+msgstr "কন্ট্রোল কী + সুপার কী + আপ এ্যরো কী"
279
274
280#: qml/Components/KeyboardShortcutsOverlay.qml:310
275#: qml/Components/KeyboardShortcutsOverlay.qml:310
281msgid "Maximizes the current window."
276msgid "Maximizes the current window."
282−msgstr ""
277+msgstr "দৃশ্যমান উইন্ডোটিকে বর্ধিত করে।"
283
278
284#: qml/Components/KeyboardShortcutsOverlay.qml:318
279#: qml/Components/KeyboardShortcutsOverlay.qml:318
285msgid "Ctrl + Super + Down"
280msgid "Ctrl + Super + Down"
286−msgstr ""
281+msgstr "কন্ট্রোল কী + সুপার কী + ডাউন এ্যরো কী"
287
282
288#: qml/Components/KeyboardShortcutsOverlay.qml:323
283#: qml/Components/KeyboardShortcutsOverlay.qml:323
289msgid "Minimizes or restores the current window."
284msgid "Minimizes or restores the current window."
290−msgstr ""
285+msgstr "বর্তমান উইন্ডোটিকে লঘু করে অথবা পূ্র্বাবস্থায় ফিরিয়ে নিয়ে যায়।"
291
286
292#: qml/Components/KeyboardShortcutsOverlay.qml:331
287#: qml/Components/KeyboardShortcutsOverlay.qml:331
293msgid "Ctrl + Super + Left or Right"
288msgid "Ctrl + Super + Left or Right"
294−msgstr ""
289+msgstr "কন্ট্রোল কী + সুপার কী + বাম এ্যরো কী"
295
290
296#: qml/Components/KeyboardShortcutsOverlay.qml:336
291#: qml/Components/KeyboardShortcutsOverlay.qml:336
297msgid "Semi-maximizes the current window."
292msgid "Semi-maximizes the current window."
298−msgstr ""
293+msgstr "বর্তমান উইন্ডোটিকে অর্ধ-বর্ধিত করে।"
299
294
300#: qml/Components/KeyboardShortcutsOverlay.qml:344
295#: qml/Components/KeyboardShortcutsOverlay.qml:344
301msgid "Alt + F4"
296msgid "Alt + F4"
302−msgstr ""
297+msgstr "অল্টার কী + F4 কী"
303
298
304#: qml/Components/KeyboardShortcutsOverlay.qml:349
299#: qml/Components/KeyboardShortcutsOverlay.qml:349
305msgid "Closes the current window."
300msgid "Closes the current window."
306−msgstr ""
301+msgstr "বর্তমান উইন্ডোটি বন্ধ করে।"
307
302
308−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
303+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:235
309msgid "Return to Call"
304msgid "Return to Call"
310msgstr "কল এ ফিরে যান"
305msgstr "কল এ ফিরে যান"
311
306
@@ -320,225 +315,130 @@ msgstr "ঠিক আছে"
320#: qml/Components/MediaServices/VideoPlayerControls.qml:44
315#: qml/Components/MediaServices/VideoPlayerControls.qml:44
321#, qt-format
316#, qt-format
322msgid "%1:%2:%3"
317msgid "%1:%2:%3"
323−msgstr ""
318+msgstr "%1:%2:%3"
324
319
325#: qml/Components/MediaServices/VideoPlayerControls.qml:49
320#: qml/Components/MediaServices/VideoPlayerControls.qml:49
326#, qt-format
321#, qt-format
327msgid "%1:%2"
322msgid "%1:%2"
328−msgstr ""
323+msgstr "%1:%2"
329
324
330#: qml/Components/ModeSwitchWarningDialog.qml:33
325#: qml/Components/ModeSwitchWarningDialog.qml:33
331msgid "Apps may have unsaved data:"
326msgid "Apps may have unsaved data:"
332−msgstr ""
327+msgstr "এ্যাপ সমূহে কিছু অসংরক্ষিত ডেটা থাকতে পারে:"
333
328
334#: qml/Components/ModeSwitchWarningDialog.qml:60
329#: qml/Components/ModeSwitchWarningDialog.qml:60
335msgctxt ""
330msgctxt ""
336"Re-dock means connect the device again to an external screen/mouse/keyboard"
331"Re-dock means connect the device again to an external screen/mouse/keyboard"
337msgid "Re-dock, save your work and close these apps to continue."
332msgid "Re-dock, save your work and close these apps to continue."
338msgstr ""
333msgstr ""
334+"পূনসংযুক্ত করুন, প্রক্রিয়া চলমান রাখার জন্য কাজগুলি সংরক্ষণ করে অ্যাপগুলি বন্ধ করুন।"
339
335
340#: qml/Components/ModeSwitchWarningDialog.qml:67
336#: qml/Components/ModeSwitchWarningDialog.qml:67
341msgid "Or force close now (unsaved data will be lost)."
337msgid "Or force close now (unsaved data will be lost)."
342−msgstr ""
338+msgstr "অথবা জোরপূর্বক এখনি বন্ধ করুন (আপনার অসংরক্ষিত তথ্য হারিয়ে যাবে)।"
343
339
344#: qml/Components/ModeSwitchWarningDialog.qml:80
340#: qml/Components/ModeSwitchWarningDialog.qml:80
345msgid "OK, I will reconnect"
341msgid "OK, I will reconnect"
346−msgstr ""
342+msgstr "ঠিক আছে, আমি পূনঃসংযুক্ত করব"
347
343
348#: qml/Components/ModeSwitchWarningDialog.qml:81
344#: qml/Components/ModeSwitchWarningDialog.qml:81
349msgid "Reconnect now!"
345msgid "Reconnect now!"
350−msgstr ""
346+msgstr "এখনি পূনসংযুক্ত করুন!"
351
347
352#: qml/Components/ModeSwitchWarningDialog.qml:94
348#: qml/Components/ModeSwitchWarningDialog.qml:94
353msgid "Close all"
349msgid "Close all"
354−msgstr ""
350+msgstr "সবগুলো বন্ধ করুন"
355
351
356#: qml/Components/SharingPicker.qml:54
352#: qml/Components/SharingPicker.qml:54
357msgid "Preview Share Item"
353msgid "Preview Share Item"
358−msgstr ""
354+msgstr "বিনিময় তালিকা অবলোকন"
359
355
360#: qml/Components/VirtualTouchPad.qml:317
356#: qml/Components/VirtualTouchPad.qml:317
361msgid ""
357msgid ""
362"Your device is now connected to an external display. Use this screen as a "
358"Your device is now connected to an external display. Use this screen as a "
363"touch pad to interact with the pointer."
359"touch pad to interact with the pointer."
364msgstr ""
360msgstr ""
361+"আপনার ডিভাইস অন্য পর্দার সাথে সংযুক্ত হয়েছে। মাউসের জন্য এই পর্দাটি টাচপ্যাড হিসেবে "
362+"ব্যবহার করুন।"
365
363
366#: qml/Components/VirtualTouchPad.qml:327
364#: qml/Components/VirtualTouchPad.qml:327
367msgid "Tap left button to click."
365msgid "Tap left button to click."
368−msgstr ""
366+msgstr "ক্লিক করার জন্য বাম বোতাম চাপুন..."
369
367
370#: qml/Components/VirtualTouchPad.qml:339
368#: qml/Components/VirtualTouchPad.qml:339
371msgid "Tap right button to right click."
369msgid "Tap right button to right click."
372−msgstr ""
370+msgstr "ডান ক্লিকের জন্য ডান বোতাম চাপুন।"
373
371
374#: qml/Components/VirtualTouchPad.qml:351
372#: qml/Components/VirtualTouchPad.qml:351
375msgid "Swipe with two fingers to scroll."
373msgid "Swipe with two fingers to scroll."
376−msgstr ""
374+msgstr "স্ক্রলের জন্য আঙুল চালান।"
377
375
378#: qml/Components/VirtualTouchPad.qml:396
376#: qml/Components/VirtualTouchPad.qml:396
379msgid "Find more settings in the system settings."
377msgid "Find more settings in the system settings."
380−msgstr ""
378+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 "আরও ইন্সটল করা রয়েছে..."
478
379
479#: qml/Greeter/CoverPage.qml:127
380#: qml/Greeter/CoverPage.qml:127
480msgid "Unlock"
381msgid "Unlock"
481−msgstr "লক খুলুন"
382+msgstr "তালা খুলুন"
482
383
483#: qml/Greeter/DelayedLockscreen.qml:43
384#: qml/Greeter/DelayedLockscreen.qml:43
484msgid "Device Locked"
385msgid "Device Locked"
485−msgstr "ডিভাইসটি লক করা"
386+msgstr "ডিভাইসটি তালা দেওয়া"
486
387
487#: qml/Greeter/DelayedLockscreen.qml:58
388#: qml/Greeter/DelayedLockscreen.qml:58
488msgid "You have been locked out due to too many failed passphrase attempts."
389msgid "You have been locked out due to too many failed passphrase attempts."
489−msgstr "অধিকবার পাসফ্রেজ ভুল দেওয়ার কারনে আপনার আইডি লক করা হয়েছে"
390+msgstr "অনেকবেশিবার ভুল পাসফ্রেজ চেষ্টা করায় আপনাকে প্রবেশ হতে বিরত রাখা হল।"
490
391
491#: qml/Greeter/DelayedLockscreen.qml:59
392#: qml/Greeter/DelayedLockscreen.qml:59
492msgid "You have been locked out due to too many failed passcode attempts."
393msgid "You have been locked out due to too many failed passcode attempts."
493−msgstr "অধিকবার পাসকোড ভুল করার কারনে আপনার আইডি লক করা হয়েছে"
394+msgstr "অনেকবেশিবার ভুল পাসকোড চেষ্টা করায় আপনাকে প্রবেশ হতে বিরত রাখা হল।"
494
395
495#: qml/Greeter/DelayedLockscreen.qml:68
396#: qml/Greeter/DelayedLockscreen.qml:68
496#, qt-format
397#, qt-format
497msgid "Please wait %1 minute and then try again…"
398msgid "Please wait %1 minute and then try again…"
498msgid_plural "Please wait %1 minutes and then try again…"
399msgid_plural "Please wait %1 minutes and then try again…"
499−msgstr[0] "অনুগ্রহ করে %1 মিনিট অপেক্ষা করুন এবং পরবর্তীতে চেষ্টা করুন..."
400+msgstr[0] "অনুগ্রহ করে %1 মিনিট অপেক্ষা করুন এবং পরবর্তীতে আবার চেষ্টা করুন …"
500−msgstr[1] "অনুগ্রহ করে %1 মিনিট অপেক্ষা করুন এবং পরবর্তীতে চেষ্টা করুন..."
401+msgstr[1] "অনুগ্রহ করে %1 মিনিটের মত অপেক্ষা করুন এবং পরবর্তীতে চেষ্টা করুন …"
501
402
502#: qml/Greeter/Greeter.qml:550
403#: qml/Greeter/Greeter.qml:550
503msgid "Try again"
404msgid "Try again"
504−msgstr ""
405+msgstr "আবার চেষ্টা করুন"
505
406
506#: qml/Greeter/Greeter.qml:551
407#: qml/Greeter/Greeter.qml:551
507msgid "Enter passphrase to unlock"
408msgid "Enter passphrase to unlock"
508−msgstr ""
409+msgstr "তালা খোলার জন্য পাসফ্রেজ লিখুন"
509
410
510#: qml/Greeter/Greeter.qml:552
411#: qml/Greeter/Greeter.qml:552
511msgid "Enter passcode to unlock"
412msgid "Enter passcode to unlock"
512−msgstr ""
413+msgstr "তালা খোলার জন্য পাসকোড লিখুন"
513
414
514−#: qml/Greeter/NarrowView.qml:228
415+#: qml/Greeter/NarrowView.qml:235
515msgid "Emergency"
416msgid "Emergency"
516−msgstr ""
417+msgstr "জরুরী"
517
418
518#: qml/Greeter/PromptList.qml:126
419#: qml/Greeter/PromptList.qml:126
519msgid "Passphrase"
420msgid "Passphrase"
520−msgstr ""
421+msgstr "পাসফ্রেজ"
521
422
522#: qml/Greeter/PromptList.qml:126
423#: qml/Greeter/PromptList.qml:126
523msgid "Passcode"
424msgid "Passcode"
524−msgstr ""
425+msgstr "পাসকোড"
525
426
526#: qml/Greeter/SessionsList.qml:124
427#: qml/Greeter/SessionsList.qml:124
527msgid "Select desktop environment"
428msgid "Select desktop environment"
528−msgstr ""
429+msgstr "ডেস্কটপ বাতাবরণ নির্বাচন করুন"
529
430
530−#: qml/Launcher/Drawer.qml:94
431+#: qml/Launcher/Drawer.qml:250
531msgid "Search…"
432msgid "Search…"
532−msgstr ""
433+msgstr "অনুসন্ধান …"
533
434
534−#: qml/Launcher/Drawer.qml:129
435+#: qml/Launcher/PullToRefreshScopeStyle.qml:56
535−msgctxt "Apps sorted alphabetically"
536−msgid "A-Z"
436+msgid "Pull to refresh…"
537−msgstr ""
437+msgstr "রিফ্রেশ করার জন্য টানুন"
538
438
539−#: qml/Launcher/MoreAppsHeader.qml:55
439+#: qml/Launcher/PullToRefreshScopeStyle.qml:61
540−msgid "More apps in the store"
440+msgid "Release to refresh…"
541−msgstr ""
441+msgstr "রিফ্রেশ করার জন্য ছেড়ে দিন"
542
442
543#: qml/Notifications/NotificationMenuItemFactory.qml:124
443#: qml/Notifications/NotificationMenuItemFactory.qml:124
544msgid "Show password"
444msgid "Show password"
@@ -554,28 +454,28 @@ msgstr "কনফারেন্স"
554
454
555#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
455#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
556msgid "Nothing is playing"
456msgid "Nothing is playing"
557−msgstr "কোন কিছু বাজছে না।"
457+msgstr "কোনকিছু প্লে হচ্ছেনা"
558
458
559#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
459#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
560#, qt-format
460#, qt-format
561msgid "%1 hour"
461msgid "%1 hour"
562msgid_plural "%1 hours"
462msgid_plural "%1 hours"
563−msgstr[0] "%1 ঘণ্টা"
463+msgstr[0] "%1 ঘন্টা"
564−msgstr[1] "%1 ঘণ্টা"
464+msgstr[1] "%1 ঘন্টায়"
565
465
566#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
466#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
567#, qt-format
467#, qt-format
568msgid "%1 minute"
468msgid "%1 minute"
569msgid_plural "%1 minutes"
469msgid_plural "%1 minutes"
570msgstr[0] "%1 মিনিট"
470msgstr[0] "%1 মিনিট"
571−msgstr[1] "%1 মিনিট"
471+msgstr[1] "%1 মিনিটে"
572
472
573#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
473#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
574#, qt-format
474#, qt-format
575msgid "%1 second"
475msgid "%1 second"
576msgid_plural "%1 seconds"
476msgid_plural "%1 seconds"
577msgstr[0] "%1 সেকেন্ড"
477msgstr[0] "%1 সেকেন্ড"
578−msgstr[1] "%1 সেকেন্ড"
478+msgstr[1] "%1 সেকেন্ডে"
579
479
580#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
480#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
581msgid "0 seconds"
481msgid "0 seconds"
@@ -589,7 +489,7 @@ msgstr "%1 বাকি"
589
489
590#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
490#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
591msgid "In queue…"
491msgid "In queue…"
592−msgstr "অপেক্ষায় রয়েছে..."
492+msgstr "অপেক্ষমান…"
593
493
594#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
494#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
595msgid "Downloading"
495msgid "Downloading"
@@ -597,7 +497,7 @@ msgstr "ডাউনলোড হচ্ছে"
597
497
598#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
498#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
599msgid "Paused, tap to resume"
499msgid "Paused, tap to resume"
600−msgstr "থামানো, শুরু করতে চাপ দিন"
500+msgstr "থেমে আছে, শুরু করতে চাপ দিন"
601
501
602#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
502#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
603msgid "Canceled"
503msgid "Canceled"
@@ -615,7 +515,7 @@ msgstr "ব্যার্থ হয়েছে, পুনরায় চেষ্
615#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
515#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
616msgctxt "Button: Send a reply message"
516msgctxt "Button: Send a reply message"
617msgid "Send"
517msgid "Send"
618−msgstr ""
518+msgstr "পাঠান"
619
519
620#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
520#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
621msgctxt "Label: Hint in message indicator line edit"
521msgctxt "Label: Hint in message indicator line edit"
@@ -629,279 +529,261 @@ msgstr "কল ব্যাক"
629
529
630#: qml/Panel/PanelMenuPage.qml:92
530#: qml/Panel/PanelMenuPage.qml:92
631msgid "Back"
531msgid "Back"
632−msgstr ""
532+msgstr "পূর্বপাতা"
633
533
634#: qml/Stage/SideStage.qml:76
534#: qml/Stage/SideStage.qml:76
635msgid "Drag using 3 fingers any application from one window to the other"
535msgid "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 "কোন অ্যাপ চলমান নেই"
637
541
638#: qml/Tutorial/TutorialLeftLong.qml:49
542#: qml/Tutorial/TutorialLeftLong.qml:49
639msgid "Long swipe from the left edge to open the Application Drawer"
543msgid "Long swipe from the left edge to open the Application Drawer"
640−msgstr ""
544+msgstr "অ্যাপ্লিকেশন দেরাজ খুলতে বামদিক হতে সজোরে আঙুল চালান"
641
545
642#: qml/Tutorial/TutorialLeft.qml:47
546#: qml/Tutorial/TutorialLeft.qml:47
643msgid "Short swipe from the left edge to open the launcher"
547msgid "Short swipe from the left edge to open the launcher"
644−msgstr ""
548+msgstr "লঞ্চার খুলতে বামদিক হতে আঙুল চালান"
645
549
646−#: qml/Tutorial/TutorialRight.qml:55
550+#: qml/Tutorial/TutorialRight.qml:54
647msgid "Push your mouse against the right edge to view your open apps"
551msgid "Push your mouse against the right edge to view your open apps"
648−msgstr ""
552+msgstr "চলমান অ্যাপগুলি দেখতে ডানপান্তের দিকে মাউস চাপুন"
649
553
650−#: qml/Tutorial/TutorialRight.qml:56
554+#: qml/Tutorial/TutorialRight.qml:55
651msgid "Swipe from the right edge to view your open apps"
555msgid "Swipe from the right edge to view your open apps"
652−msgstr ""
556+msgstr "চলমান অ্যাপগুলি দেখতে ডানপ্রান্ত হতে আঙুল চালান"
653
557
654#: qml/Tutorial/TutorialTop.qml:53
558#: qml/Tutorial/TutorialTop.qml:53
655msgid "Swipe from the top edge to access notifications and quick settings"
559msgid "Swipe from the top edge to access notifications and quick settings"
656−msgstr ""
560+msgstr "বার্তাসমূহ এবং তড়িৎ সেটিংস দেখতে উপরের প্রান্ত হতে আঙুল চালান"
657
561
658−#: qml/Wizard/Page.qml:54
562+#: qml/Wizard/Page.qml:59
659msgctxt "Button: Go back one page in the Wizard"
563msgctxt "Button: Go back one page in the Wizard"
660msgid "Back"
564msgid "Back"
661−msgstr ""
565+msgstr "পূর্বপাতা"
662
566
663−#: qml/Wizard/Pages/10-welcome.qml:28
567+#: qml/Wizard/Pages/10-welcome.qml:29
664msgid "Language"
568msgid "Language"
665−msgstr ""
569+msgstr "ভাষা"
666−
570+
667−#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
571+#: qml/Wizard/Pages/10-welcome.qml:176
668−#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
572+#: qml/Wizard/Pages/10-welcome-update.qml:126
573+#: qml/Wizard/Pages/11-changelog.qml:74 qml/Wizard/Pages/20-keyboard.qml:152
669−#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
574+#: qml/Wizard/Pages/30-wifi.qml:214 qml/Wizard/Pages/50-timezone.qml:272
670−#: qml/Wizard/Pages/70-passwd-type.qml:145
575+#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/70-passwd-type.qml:146
671−#: qml/Wizard/Pages/75-report-check.qml:84
672−#: qml/Wizard/Pages/passcode-desktop.qml:142
576+#: qml/Wizard/Pages/passcode-desktop.qml:154
673−#: qml/Wizard/Pages/password-set.qml:142
577+#: qml/Wizard/Pages/password-set.qml:153
674msgid "Next"
578msgid "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 "লোড হচ্ছে..."
676
596
677#: qml/Wizard/Pages/20-keyboard.qml:31
597#: qml/Wizard/Pages/20-keyboard.qml:31
678msgid "Select Keyboard"
598msgid "Select Keyboard"
679−msgstr ""
599+msgstr "কিবোর্ড নির্বাচন করুন"
680
600
681#: qml/Wizard/Pages/20-keyboard.qml:71
601#: qml/Wizard/Pages/20-keyboard.qml:71
682msgid "Keyboard language"
602msgid "Keyboard language"
683−msgstr ""
603+msgstr "কিবোর্ডের ভাষা"
684
604
685#: qml/Wizard/Pages/20-keyboard.qml:93
605#: qml/Wizard/Pages/20-keyboard.qml:93
686msgid "Keyboard layout"
606msgid "Keyboard layout"
687−msgstr ""
607+msgstr "কিবোর্ডের নকশা"
688
608
689−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
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
690−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
611+#: qml/Wizard/Pages/sim.qml:101
691msgid "Skip"
612msgid "Skip"
692msgstr "এড়িয়ে যান"
613msgstr "এড়িয়ে যান"
693
614
694−#: qml/Wizard/Pages/30-wifi.qml:30
615+#: qml/Wizard/Pages/30-wifi.qml:31
695msgid "Connect to Wi‑Fi"
616msgid "Connect to Wi‑Fi"
696−msgstr ""
617+msgstr "ওযাই-ফাইতে সংযুক্ত হোন"
697
618
698−#: qml/Wizard/Pages/30-wifi.qml:131
619+#: qml/Wizard/Pages/30-wifi.qml:139
699msgid "Connected"
620msgid "Connected"
700−msgstr ""
621+msgstr "সংযুক্ত"
701
622
702−#: qml/Wizard/Pages/30-wifi.qml:164
623+#: qml/Wizard/Pages/30-wifi.qml:172
703msgid "Available Wi-Fi networks"
624msgid "Available Wi-Fi networks"
704−msgstr ""
625+msgstr "লব্দ ওয়াই-ফাই নেটওয়ার্ক"
705
626
706−#: qml/Wizard/Pages/30-wifi.qml:165
627+#: qml/Wizard/Pages/30-wifi.qml:173
707msgid "No available Wi-Fi networks"
628msgid "No available Wi-Fi networks"
708−msgstr ""
629+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 ""
741
630
742#: qml/Wizard/Pages/50-timezone.qml:30
631#: qml/Wizard/Pages/50-timezone.qml:30
743msgid "Time Zone"
632msgid "Time Zone"
744−msgstr ""
633+msgstr "সময় অঞ্চল"
745
634
746−#: qml/Wizard/Pages/50-timezone.qml:182
635+#: qml/Wizard/Pages/50-timezone.qml:183
747msgid "Enter your city"
636msgid "Enter your city"
748−msgstr ""
637+msgstr "আপনার শহরের নাম লিখুন"
749
638
750#: qml/Wizard/Pages/60-account.qml:24
639#: qml/Wizard/Pages/60-account.qml:24
751msgid "Personalize Your Device"
640msgid "Personalize Your Device"
752−msgstr ""
641+msgstr "আপনার ডিভাইসে নিজস্বতা আনুন"
753
642
754−#: qml/Wizard/Pages/60-account.qml:48
643+#: qml/Wizard/Pages/60-account.qml:54
755msgid "Preferred Name"
644msgid "Preferred Name"
756−msgstr ""
645+msgstr "পছন্দসই নাম"
757
646
758#: qml/Wizard/Pages/70-passwd-type.qml:40
647#: qml/Wizard/Pages/70-passwd-type.qml:40
759msgid "Lock Screen"
648msgid "Lock Screen"
760−msgstr ""
649+msgstr "তালাপর্দা"
761
650
762−#: qml/Wizard/Pages/70-passwd-type.qml:102
651+#: qml/Wizard/Pages/70-passwd-type.qml:103
763msgctxt "Label: Type of security method"
652msgctxt "Label: Type of security method"
764msgid "Create new password"
653msgid "Create new password"
765−msgstr ""
654+msgstr "নতুন পাসওয়ার্ড"
766
655
767−#: qml/Wizard/Pages/70-passwd-type.qml:104
656+#: qml/Wizard/Pages/70-passwd-type.qml:105
768msgctxt "Label: Type of security method"
657msgctxt "Label: Type of security method"
769msgid "Create passcode (numbers only)"
658msgid "Create passcode (numbers only)"
770−msgstr ""
659+msgstr "নতুন পাসকোড (শুধুমাত্র সংখ্যা)"
771
660
772−#: qml/Wizard/Pages/70-passwd-type.qml:106
661+#: qml/Wizard/Pages/70-passwd-type.qml:107
773msgctxt "Label: Type of security method"
662msgctxt "Label: Type of security method"
774msgid "No lock code"
663msgid "No lock code"
775−msgstr ""
664+msgstr "কোডবিহীন তালা"
776
665
777−#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
666+#: qml/Wizard/Pages/79-system-update.qml:28
778−msgid "Privacy Policy"
667+msgid "Update Device"
779−msgstr ""
668+msgstr "ডিভাইসের আধুনিকায়ন"
780
669
781−#: qml/Wizard/Pages/75-report-check.qml:26
670+#: qml/Wizard/Pages/79-system-update.qml:55
782−msgid "Help Us Improve"
671+msgid ""
783−msgstr ""
672+"There is a system update available and ready to install. Afterwards, the "
784−
673+"device will automatically restart."
785−#: qml/Wizard/Pages/75-report-check.qml:59
786−msgid "Improve system performance by sending us crashes and error reports."
787msgstr ""
674msgstr ""
675+"একটি সিস্টেম সংযোজন ইন্সটলের জন্য প্রস্তুত। ইন্সটল শেষে ডিভাইসটি নিজেই পুনরায় চালু "
676+"হবে।"
788
677
789−#: qml/Wizard/Pages/75-report-check.qml:60
678+#: qml/Wizard/Pages/79-system-update.qml:76
790−msgid "Privacy policy"
679+msgctxt "string identifying name of the update"
791−msgstr ""
680+msgid "Ubuntu Touch system"
681+msgstr "উবুন্টু টাচ সিস্টেম"
792
682
793−#: qml/Wizard/Pages/80-finished.qml:89
683+#: qml/Wizard/Pages/79-system-update.qml:83
794−msgid "Welcome to Ubuntu"
684+#, qt-format
795−msgstr ""
685+msgctxt "version of the system update"
686+msgid "Version %1"
687+msgstr "সংস্করণ %1"
796
688
797−#: qml/Wizard/Pages/80-finished.qml:104
689+#: qml/Wizard/Pages/79-system-update.qml:95
798−msgid "You are ready to use your device now"
690+msgid "This could take a few minutes..."
799−msgstr ""
691+msgstr "সম্পন্ন হতে কিছু সময় লাগতে পারে ..."
800
692
801−#: qml/Wizard/Pages/80-finished.qml:124
693+#: qml/Wizard/Pages/79-system-update.qml:109
802−msgid "Get Started"
694+msgid "Install and restart now"
803−msgstr ""
695+msgstr "এখনি ইন্সটল এবং পুনরায় চালু করুন"
804
696
805−#: qml/Wizard/Pages/here-terms.qml:25
697+#: qml/Wizard/Pages/80-finished.qml:91
806−msgid "Terms & Conditions"
698+msgid "Welcome Back"
807−msgstr ""
699+msgstr "ফিরে আসায় স্বাগতম"
808
700
809−#: qml/Wizard/Pages/here-terms.qml:69
701+#: qml/Wizard/Pages/80-finished.qml:91
810−msgid "Your device uses positioning technologies provided by HERE."
811−msgstr ""
812−
813−#: qml/Wizard/Pages/here-terms.qml:81
814−msgid ""
702+msgid "Welcome to Ubuntu"
815−"To provide you with positioning services and to improve their quality, HERE "
703+msgstr "উবুন্টুতে স্বাগতম"
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
704
820−#: qml/Wizard/Pages/here-terms.qml:93
705+#: qml/Wizard/Pages/80-finished.qml:106
821−msgid ""
706+msgid "You are ready to use your device now"
822−"The information collected is used to analyze the service and to improve the "
707+msgstr "আপনার ডিভাইসটি এখন ব্যবহারের জন্য প্রস্তুত"
823−"use of service, but not to identify you personally."
824−msgstr ""
825
708
826−#: qml/Wizard/Pages/here-terms.qml:106
709+#: qml/Wizard/Pages/80-finished.qml:126
827−#, qt-format
710+msgid "Continue"
828−msgid "By continuing, you agree to the HERE platform %1 and %2."
711+msgstr "এগিয়ে যান"
829−msgstr ""
830
712
831−#: qml/Wizard/Pages/here-terms.qml:107
713+#: qml/Wizard/Pages/80-finished.qml:126
832−msgid "Service Terms"
714+msgid "Get Started"
833−msgstr ""
715+msgstr "চলুন শুরু করি"
834
716
835#: qml/Wizard/Pages/passcode-confirm.qml:43
717#: qml/Wizard/Pages/passcode-confirm.qml:43
836−#: qml/Wizard/Pages/passcode-desktop.qml:97
718+#: qml/Wizard/Pages/passcode-desktop.qml:104
837msgid "Confirm passcode"
719msgid "Confirm passcode"
838−msgstr ""
720+msgstr "পাসকোড নিশ্চিত করুন"
839
721
840#: qml/Wizard/Pages/passcode-confirm.qml:45
722#: qml/Wizard/Pages/passcode-confirm.qml:45
841msgid "Incorrect passcode."
723msgid "Incorrect passcode."
842−msgstr ""
724+msgstr "ভুল পাসকোড।"
843
725
844#: qml/Wizard/Pages/passcode-confirm.qml:45
726#: qml/Wizard/Pages/passcode-confirm.qml:45
845msgctxt "Enter the passcode again"
727msgctxt "Enter the passcode again"
846msgid "Please re-enter."
728msgid "Please re-enter."
847−msgstr ""
729+msgstr "পুনরায় লিখুন।"
848
730
849#: qml/Wizard/Pages/passcode-desktop.qml:31
731#: qml/Wizard/Pages/passcode-desktop.qml:31
850msgid "Lock Screen Passcode"
732msgid "Lock Screen Passcode"
851−msgstr ""
733+msgstr "তালাপর্দার পাসকোড"
852
734
853−#: qml/Wizard/Pages/passcode-desktop.qml:61
735+#: qml/Wizard/Pages/passcode-desktop.qml:68
854msgid "Enter 4 numbers to setup your passcode"
736msgid "Enter 4 numbers to setup your passcode"
855−msgstr ""
737+msgstr "পাসকোডের জন্য ৪ টি সংখ্যা লিখুন"
856
738
857−#: qml/Wizard/Pages/passcode-desktop.qml:77
739+#: qml/Wizard/Pages/passcode-desktop.qml:84
858#: qml/Wizard/Pages/passcode-set.qml:54
740#: qml/Wizard/Pages/passcode-set.qml:54
859msgid "Choose passcode"
741msgid "Choose passcode"
860−msgstr ""
742+msgstr "পাসকোড নির্বাচন করুন"
861
743
862−#: qml/Wizard/Pages/passcode-desktop.qml:127
744+#: qml/Wizard/Pages/passcode-desktop.qml:139
863msgid "Passcode too short"
745msgid "Passcode too short"
864−msgstr ""
746+msgstr "পাসকোড নির্ধারিত সংখ্যার চেয়ে কম"
865
747
866−#: qml/Wizard/Pages/passcode-desktop.qml:129
748+#: qml/Wizard/Pages/passcode-desktop.qml:141
867msgid "Passcodes match"
749msgid "Passcodes match"
868−msgstr ""
750+msgstr "অনুরূপ পাসকোড"
869
751
870−#: qml/Wizard/Pages/passcode-desktop.qml:131
752+#: qml/Wizard/Pages/passcode-desktop.qml:143
871msgid "Passcodes do not match"
753msgid "Passcodes do not match"
872−msgstr ""
754+msgstr "পাসকোড মিলেনি"
873
755
874#: qml/Wizard/Pages/passcode-set.qml:62
756#: qml/Wizard/Pages/passcode-set.qml:62
875msgid "Passcode must be 4 characters long"
757msgid "Passcode must be 4 characters long"
876−msgstr ""
758+msgstr "পাসকোড কমপক্ষে ৪ সংখ্যার হতে হবে"
877
759
878#: qml/Wizard/Pages/password-set.qml:31
760#: qml/Wizard/Pages/password-set.qml:31
879msgid "Lock Screen Password"
761msgid "Lock Screen Password"
880−msgstr ""
762+msgstr "তালাপর্দার পাসওয়ার্ড"
881
763
882−#: qml/Wizard/Pages/password-set.qml:62
764+#: qml/Wizard/Pages/password-set.qml:68
883msgid "Enter at least 8 characters"
765msgid "Enter at least 8 characters"
884−msgstr ""
766+msgstr "কমপক্ষে ৮ টি বর্ণ লিখুন"
885
767
886−#: qml/Wizard/Pages/password-set.qml:74
768+#: qml/Wizard/Pages/password-set.qml:80
887msgid "Choose password"
769msgid "Choose password"
888−msgstr ""
770+msgstr "পাসওয়ার্ড নির্বাচন করুন"
889
771
890−#: qml/Wizard/Pages/password-set.qml:104
772+#: qml/Wizard/Pages/password-set.qml:110
891msgid "Confirm password"
773msgid "Confirm password"
892−msgstr ""
774+msgstr "পাসওয়ার্ড নিশ্চিত করুন"
893
775
894#: qml/Wizard/Pages/sim.qml:27
776#: qml/Wizard/Pages/sim.qml:27
895msgid "No SIM card installed"
777msgid "No SIM card installed"
896−msgstr ""
778+msgstr "কোন সিমকার্ড প্রবেশ করানো হয়নি"
897
779
898#: qml/Wizard/Pages/sim.qml:54
780#: qml/Wizard/Pages/sim.qml:54
899msgid "SIM card added"
781msgid "SIM card added"
900−msgstr ""
782+msgstr "সিমকার্ড যুক্ত করা হয়েছে"
901
783
902#: qml/Wizard/Pages/sim.qml:55
784#: qml/Wizard/Pages/sim.qml:55
903msgid "You must restart the device to access the mobile network."
785msgid "You must restart the device to access the mobile network."
904−msgstr ""
786+msgstr "মোবাইল নেটওয়ার্কে সংযুক্তির জন্য ডিভাইসটি পুনারায় চালু করুন।"
905
787
906#: qml/Wizard/Pages/sim.qml:59
788#: qml/Wizard/Pages/sim.qml:59
907msgid "Restart"
789msgid "Restart"
@@ -909,39 +791,113 @@ msgstr "পুনরায় চালু"
909
791
910#: qml/Wizard/Pages/sim.qml:78
792#: qml/Wizard/Pages/sim.qml:78
911msgid "You won’t be able to make calls or use text messaging without a SIM."
793msgid "You won’t be able to make calls or use text messaging without a SIM."
912−msgstr ""
794+msgstr "সিম কার্ড ছাড়া আপনি কল করা বা টেক্সট মেসেজ পাঠাতে পারবেন না।"
913
795
914#: qml/Wizard/Pages/sim.qml:90
796#: qml/Wizard/Pages/sim.qml:90
915msgid "To proceed with no SIM tap Skip."
797msgid "To proceed with no SIM tap Skip."
916−msgstr ""
798+msgstr "সিমবিহীন ব্যবহারের জন্য এড়িয়ে যান চাপুন।"
917
799
918#: qml/Wizard/PasswordMeter.qml:87
800#: qml/Wizard/PasswordMeter.qml:87
919msgid "Password too short"
801msgid "Password too short"
920−msgstr ""
802+msgstr "পাসওয়ার্ড নির্ধারিত বর্ণসংখ্যার চেয়ে কম"
921
803
922#: qml/Wizard/PasswordMeter.qml:89
804#: qml/Wizard/PasswordMeter.qml:89
923msgid "Passwords match"
805msgid "Passwords match"
924−msgstr ""
806+msgstr "অনুরূপ পাসওয়ার্ড"
925
807
926#: qml/Wizard/PasswordMeter.qml:91
808#: qml/Wizard/PasswordMeter.qml:91
927msgid "Passwords do not match"
809msgid "Passwords do not match"
928−msgstr ""
810+msgstr "পাসওয়ার্ড মিলেনি"
929
811
930#: qml/Wizard/PasswordMeter.qml:95
812#: qml/Wizard/PasswordMeter.qml:95
931msgid "Strong password"
813msgid "Strong password"
932−msgstr ""
814+msgstr "জটিল পাসওয়ার্ড"
933
815
934#: qml/Wizard/PasswordMeter.qml:97
816#: qml/Wizard/PasswordMeter.qml:97
935msgid "Fair password"
817msgid "Fair password"
936−msgstr ""
818+msgstr "মাঝারি পাসওয়ার্ড"
937
819
938#: qml/Wizard/PasswordMeter.qml:99
820#: qml/Wizard/PasswordMeter.qml:99
939msgid "Weak password"
821msgid "Weak password"
940−msgstr ""
822+msgstr "দুর্বল পাসওয়ার্ড"
941
823
942#: qml/Wizard/PasswordMeter.qml:101
824#: qml/Wizard/PasswordMeter.qml:101
943msgid "Very weak password"
825msgid "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 "আরও ইন্সটল করা রয়েছে..."
945
901
946#~ msgctxt "Button: Reboot the system"
902#~ msgctxt "Button: Reboot the system"
947#~ msgid "Reboot"
903#~ msgid "Reboot"
@@ -959,7 +915,6 @@ msgstr ""
959#~ msgid "This will be your last attempt."
915#~ msgid "This will be your last attempt."
960#~ msgstr "এটিই আপনার সর্বশেষ সুযোগ।"
916#~ msgstr "এটিই আপনার সর্বশেষ সুযোগ।"
961
917
962−#, qt-format
963#~ msgid "Sorry, incorrect %1"
918#~ msgid "Sorry, incorrect %1"
964#~ msgstr "দুঃখিত, %1 ভুল হয়েছে"
919#~ msgstr "দুঃখিত, %1 ভুল হয়েছে"
965
920
@@ -981,9 +936,6 @@ msgstr ""
981#~ msgid "You almost got it!"
936#~ msgid "You almost got it!"
982#~ msgstr "আপনি প্রায় পেরে গেছেন!"
937#~ msgstr "আপনি প্রায় পেরে গেছেন!"
983
938
984−#~ msgid "Open the launcher"
985−#~ msgstr "লঞ্চার খুলুন"
986−
987#~ msgctxt "Label: Type of security method"
939#~ msgctxt "Label: Type of security method"
988#~ msgid "Passcode"
940#~ msgid "Passcode"
989#~ msgstr "পাসকোড"
941#~ msgstr "পাসকোড"
@@ -1034,9 +986,6 @@ msgstr ""
1034#~ msgid "Well done"
986#~ msgid "Well done"
1035#~ msgstr "অস্থির!"
987#~ msgstr "অস্থির!"
1036
988
1037−#~ msgid "Try swiping from the right edge to unlock the phone"
1038−#~ msgstr "ফোনটির লক খুলতে ডান প্রান্ত থেকে সোয়াইপ করুন"
1039−
1040#~ msgid "Right edge"
989#~ msgid "Right edge"
1041#~ msgstr "ডান প্রান্ত"
990#~ msgstr "ডান প্রান্ত"
1042
991
@@ -1046,18 +995,9 @@ msgstr ""
1046#~ msgid "Store"
995#~ msgid "Store"
1047#~ msgstr "স্টোর"
996#~ msgstr "স্টোর"
1048
997
1049−#~ msgid "Search"
1050−#~ msgstr "খুঁজুন"
1051−
1052#~ msgid "Type or say a command"
998#~ msgid "Type or say a command"
1053#~ msgstr "কমান্ড লিখুন বা বলুন"
999#~ msgstr "কমান্ড লিখুন বা বলুন"
1054
1000
1055−#~ msgid "Loading. Please Wait..."
1056−#~ msgstr "অপেক্ষা করুন..."
1057−
1058−#~ msgid "Speaking..."
1059−#~ msgstr "বলা হচ্ছে..."
1060−
1061#~ msgid "Speak Now..."
1001#~ msgid "Speak Now..."
1062#~ msgstr "এখন বলুন..."
1002#~ msgstr "এখন বলুন..."
1063
1003
@@ -1067,13 +1007,9 @@ msgstr ""
1067#~ msgid "Roaming"
1007#~ msgid "Roaming"
1068#~ msgstr "রোমিং"
1008#~ msgstr "রোমিং"
1069
1009
1070−#~ msgid "Enter passphrase"
1071−#~ msgstr "পাসওয়ার্ড লিখুন"
1072−
1073#~ msgid "Sorry, incorrect passphrase"
1010#~ msgid "Sorry, incorrect passphrase"
1074#~ msgstr "দুঃখিত, পাসওয়ার্ড ভুল হয়েছে"
1011#~ msgstr "দুঃখিত, পাসওয়ার্ড ভুল হয়েছে"
1075
1012
1076−#, qt-format
1077#~ msgid "Enter %1"
1013#~ msgid "Enter %1"
1078#~ msgstr "%1 লিখুন"
1014#~ msgstr "%1 লিখুন"
1079
1015
@@ -1083,12 +1019,9 @@ msgstr ""
1083#~ msgid "Please re-enter"
1019#~ msgid "Please re-enter"
1084#~ msgstr "অনুগ্রহ করে আবার লিখুন"
1020#~ msgstr "অনুগ্রহ করে আবার লিখুন"
1085
1021
1086−#~ msgid "Enter passcode"
1087−#~ msgstr "পাসকোড লিখুন"
1088−
1089#~ msgid ""
1022#~ msgid ""
1090−#~ "If passcode is entered incorrectly, your phone will conduct a factory reset "
1023+#~ "If passcode is entered incorrectly, your phone will conduct a factory "
1091−#~ "and all personal data will be deleted."
1024+#~ "reset and all personal data will be deleted."
1092#~ msgstr "ভুল পাসকোড প্রদান করলে, আপনার ফোনটির সকল ব্যক্তিগত তথ্য মুছে যাবে।"
1025#~ msgstr "ভুল পাসকোড প্রদান করলে, আপনার ফোনটির সকল ব্যক্তিগত তথ্য মুছে যাবে।"
1093
1026
1094#~ msgid ""
1027#~ msgid ""
@@ -1127,6 +1060,3 @@ msgstr ""
1127#~ msgctxt "Label: Description of security method"
1060#~ msgctxt "Label: Description of security method"
1128#~ msgid "4 digits only"
1061#~ msgid "4 digits only"
1129#~ msgstr "কেবল মাত্র ৪টি সংখ্যা"
1062#~ msgstr "কেবল মাত্র ৪টি সংখ্যা"
1130−
1131−#~ msgid "Continue"
1132−#~ msgstr "পরবর্তী"
po/br.po+327−349

This diff is too big to show here.

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+5−4

This diff is too big to show here.

src/Dash/CMakeLists.txtdeleted−29

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/libunity8-private/CMakeLists.txt+1−1

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/AccountsService/CMakeLists.txt+1−2

This diff is too big to show here.

tests/mocks/Biometryd/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/GSettings.1.0/CMakeLists.txt+1−2

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/LightDMController/CMakeLists.txt+1−2

This diff is too big to show here.

tests/mocks/Lights/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/MeeGo/QOfono/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/Powerd/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/QMenuModel/CMakeLists.txt+1−2

This diff is too big to show here.

tests/mocks/QtMultimedia/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/SessionBroadcast/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/UInput/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/Ubuntu/Connectivity/CMakeLists.txt+1−1

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/DownloadDaemonListener/CMakeLists.txt+1−1

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/SecurityPrivacy/CMakeLists.txt+1−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/Ubuntu/Telephony/CMakeLists.txt+1−1

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/CMakeLists.txt+2−2

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/CMakeLists.txt+1−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/Connectivity/CMakeLists.txt+1−1

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/CMakeLists.txt+1−2

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/InputInfo/CMakeLists.txt+1−1

This diff is too big to show here.

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

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/MockLauncherItem.cpp+13

This diff is too big to show here.

tests/mocks/Unity/Launcher/MockLauncherItem.h+3

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/Notifications/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/Unity/Screens/CMakeLists.txt+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/Utils/CMakeLists.txt+4−3

This diff is too big to show here.

tests/mocks/Wizard/CMakeLists.txt+2−2

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/mocks/liblightdm/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/liblightdm/demo/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/libusermetrics/CMakeLists.txt+1−1

This diff is too big to show here.

tests/plugins/AccountsService/CMakeLists.txt+2−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−104

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/GlobalShortcut/CMakeLists.txt+1−2

This diff is too big to show here.

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

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/CMakeLists.txt+6−6

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/SessionBroadcast/CMakeLists.txt+2−2

This diff is too big to show here.

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

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/CMakeLists.txt+4−2

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/GestureTest.cpp+10−1

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_TouchGate.cpp+11−2

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/Indicators/CMakeLists.txt+1−1

This diff is too big to show here.

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

This diff is too big to show here.

tests/plugins/Unity/Launcher/appdrawermodeltest.cppnew file+68

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.cppnew file+58

This diff is too big to show here.

tests/plugins/Unity/Launcher/ualwrapper.hnew file+55

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+2−2

This diff is too big to show here.

tests/plugins/Utils/CMakeLists.txt+2−4

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/CMakeLists.txt+4−2

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/plugins/Wizard/CMakeLists.txt+2−2

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+5−51

This diff is too big to show here.

tests/qmltests/Components/CMakeLists.txt+8−4

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_DragHandle.cpp+19−2

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/uqmlscene/CMakeLists.txt+1−1

This diff is too big to show here.

tests/utils/CMakeLists.txt+1−1

This diff is too big to show here.

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

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/TouchEventSequenceWrapper.cpp+10−1

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/indicatorsclient/CMakeLists.txt+1−1

This diff is too big to show here.

tools/menutool/CMakeLists.txt+1−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.