on xenial help sign in
Merge from trunk
4f2dddbMichael Terry
CMakeLists.txt+5
@@ -121,3 +121,8 @@ add_subdirectory(data)
121# Translation
121# Translation
122#
122#
123add_subdirectory(po)
123add_subdirectory(po)
124+
125+#
126+# Documentation
127+#
128+add_subdirectory(doc)
build+1
@@ -45,6 +45,7 @@ install_dependencies() {
45 qtdeclarative5-dee-plugin \
45 qtdeclarative5-dee-plugin \
46 qtdeclarative5-gsettings1.0 \
46 qtdeclarative5-gsettings1.0 \
47 qtdeclarative5-ubuntu-ui-toolkit-plugin \
47 qtdeclarative5-ubuntu-ui-toolkit-plugin \
48+ qtdeclarative5-ubuntu-settings-components \
48 unity-notifications-impl \
49 unity-notifications-impl \
49 qtdeclarative5-xmllistmodel-plugin \
50 qtdeclarative5-xmllistmodel-plugin \
50 ubuntu-mobile-icons \
51 ubuntu-mobile-icons \
data/unity8.conf+3
@@ -4,6 +4,8 @@ author "Ricardo Mendoza <ricmm@ubuntu.com>"
4start on ((xsession SESSION=ubuntu-touch) or (xsession SESSION=ubuntu-touch-surfaceflinger)) and started dbus
4start on ((xsession SESSION=ubuntu-touch) or (xsession SESSION=ubuntu-touch-surfaceflinger)) and started dbus
5stop on desktop-end
5stop on desktop-end
6
6
7+kill timeout 30
8+
7respawn
9respawn
8expect stop
10expect stop
9
11
@@ -24,6 +26,7 @@ pre-start script
24 # Point all future jobs in this session to our Mir socket instead of
26 # Point all future jobs in this session to our Mir socket instead of
25 # unity-system-compositor's socket.
27 # unity-system-compositor's socket.
26 initctl set-env --global MIR_SOCKET=$MIR_SERVER_FILE
28 initctl set-env --global MIR_SOCKET=$MIR_SERVER_FILE
29+ gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.UpdateActivationEnvironment "@a{ss} {'MIR_SOCKET': '$MIR_SERVER_FILE'}"
27 fi
30 fi
28end script
31end script
29
32
data/unity8.desktop.in−1
@@ -1,7 +1,6 @@
1[Desktop Entry]
1[Desktop Entry]
2Type=Application
2Type=Application
3Name=Unity 8
3Name=Unity 8
4−GenericName=unity8
5Comment=The converged Unity shell
4Comment=The converged Unity shell
6Exec=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@/unity8
5Exec=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@/unity8
7Terminal=false
6Terminal=false
data/unity8.overridedeleted−1
@@ -1 +0,0 @@
1−kill timeout 30
debian/changelog+177
@@ -1,3 +1,180 @@
1+unity8 (7.84+14.04.20140204-0ubuntu1) trusty; urgency=low
2+
3+ [ Michael Terry ]
4+ * Disable NM integration test, jenkins has a problem with it because
5+ logind isn't configured
6+
7+ [ Ubuntu daily release ]
8+ * New rebuild forced
9+
10+ [ Michał Sawicz ]
11+ * Add ubuntu-settings-components to build script. Revert workaround
12+ for bug #1268578, got fixed upstream. Drop GenericName from
13+ unity8.desktop. (LP: #1268578)
14+ * Improve Card and CardHeader layouts: anchor summary to art when no
15+ header. don't indent header when no mascot. reduce header and
16+ summary font sizes and weights. increase art shape radius .
17+ * Add doxygen-based documentation generator.
18+ * Add CardTool to determine category-wide card properties based on the
19+ category template. Clean up test configurations, too.
20+ * Move upstart kill timeout to the unity8 job itself.
21+ * Don't treat scope as active when preview open to inhibit model
22+ updates and reset processing on previewData changes. (LP: #1275832)
23+
24+ [ Leo Arias ]
25+ * Added the DashPreview autopilot helper.
26+
27+ [ Michał Karnicki ]
28+ * CardHeader mascot improvements.
29+
30+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 04 Feb 2014 14:09:14 +0000
31+
32+unity8 (7.84+14.04.20140130-0ubuntu1) trusty; urgency=low
33+
34+ [ Michał Sawicz ]
35+ * Bring back libunity-mir1, it's dlopen'ed, so not linked to unity8,
36+ so not in shlibs.
37+
38+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 30 Jan 2014 14:00:40 +0000
39+
40+unity8 (7.84+14.04.20140129-0ubuntu1) trusty; urgency=low
41+
42+ [ Nick Dedekind ]
43+ * Added Panel/VisibleIndicatorsModel for use with both indicator row &
44+ menuContent. This removes the need to hide indicators in the row and
45+ map inicator indexes between row & content. Fixes the indicator
46+ highlight line offset not bound by listView position.
47+ * Ported indicators to using ubuntu-settings-components
48+
49+ [ Albert Astals ]
50+ * Prepend /sbin/ to initctl calls My phablet user does not have /sbin/
51+ in path and thus this calls fail
52+ * Call updateDelegateCreationRange when it's needed It depends on
53+ other variables than the ones we were using to call it, so need to
54+ call it if these change too Device manual test, go to apps scope,
55+ scroll down so that only part of the installed apps collapsed
56+ category is shown, expand it, see how previously some icons were not
57+ painted and now they are
58+
59+ [ Mirco Müller ]
60+ * Fixed the failure of notification autopilot-test
61+ test_sd_incoming_call.
62+
63+ [ Andrea Cimitan ]
64+ * Add AP test for policykit/network manager, which was causing issues
65+ with nested mir
66+
67+ [ CI bot ]
68+ * Resync trunk
69+
70+ [ Michał Karnicki ]
71+ * Don't display artShape when artImage source not set.
72+ * Fix FilterGrid rendering issues.
73+
74+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 29 Jan 2014 16:11:20 +0000
75+
76+unity8 (7.84+14.04.20140128-0ubuntu1) trusty; urgency=low
77+
78+ [ Michal Hruby ]
79+ * Added unity-scope-tool, which will help when developing scopes.
80+
81+ [ Michał Sawicz ]
82+ * Added unity-scope-tool, which will help when developing scopes.
83+ * Use full DashContent, not just GenericScopeView in ScopeTool.qml.
84+ * Bring Card and CardHeader over from new-scopes.
85+ * Work around bug #1268578. (LP: #1268578)
86+ * Drop unnecessary version dependencies.
87+ * Return null instead of undefined from findChild and
88+ findInvisibleChild.
89+ * Fix CardHeader and Card heights (empty Label does have non-zero
90+ height apparently). Also improve test robustness and reduce future
91+ diffs.
92+
93+ [ Albert Astals ]
94+ * Do not assert if the item we are removing was not created yet
95+ (because e.g. it's not in the viewport).
96+ * Position correctly the pointer of the search history box .
97+ * Make test_filter_expand_expand less unstable in CI VMs Make sure
98+ header0 is the header0 we want to click On the CI VM stuff is a bit
99+ slower than on real hw and we were clicking in the wrong place.
100+ * Add TabBar to the Dash header navigation Changes this comes with: *
101+ DashBar at the bottom is gone * PageHeader doesn't have a Label
102+ anymore, it has the childItem property where you add which thing it
103+ has to contain * New: PageHeaderLabel mimics the old behaviour of
104+ PageHeader * The header of the LVWPH of GenericScopeView is now fake
105+ and only used for positioning. There is a single global floating
106+ header in DashContent (which is a PageHeader with a TabBar as
107+ childItem) * The GenericScopeView previewLoader and OpenEffect have
108+ been also moved to the DashContent so that the openEffect includes
109+ the floating header in the "animation" .
110+ * Introduce the HorizontalJournal.
111+ * If there are no items m_firstVisibleIndex has to be -1 .
112+ * Add some more documentation about tests to the CODING file.
113+ * Fixes to the journal cmake tests code * Output to the correct
114+ filename for the test * Don't output stuff from the tryXYZ targets.
115+ * Adapt to findChild return value changes .
116+ * Organic Grid for the Dash View.
117+ * Misc journal fixes Don't init *modelIndex to INT_MAX Makes no sense
118+ since we're not doing any qMin and the calling function also accepts
119+ any index >= 0 as valid so in some cases it may end up wanting to
120+ create an index that doesn't exist Don't refill if height() < 0,
121+ that gives bad ranges for from/to and the code gets confused .
122+
123+ [ Michał Karnicki ]
124+ * Fix grid view column count.
125+ * Add test for minimum number of items in a carousel.
126+
127+ [ Allan LeSage ]
128+ * Add stubs for indicators autopilot tests.
129+
130+ [ Andrea Cimitan ]
131+ * Avoid input falling through notifications onto surfaces below, thus
132+ fixing LP: #1257312. (LP: #1257312)
133+
134+ [ Leo Arias ]
135+ * Close the Touch devices after the tests. (LP: #1267600)
136+ * Added methods to scroll to other scopes on autopilot tests.
137+ * Added autopilot helpers for the app scope and the app preview.
138+ Install the fake scopes in order to use them on the tests. (LP:
139+ #1269114)
140+ * On autopilot helpers, wait for the scope category to appear.
141+
142+ [ Nick Dedekind ]
143+ * Visual updates for indicator panel highlight and opening opacity.
144+ * Added inidcator tests for page & item factories.
145+ * Fixes visible indicator misalignment in indicator items/menus
146+ (lp#1264678). (LP: #1264678)
147+
148+ [ Mirco Müller ]
149+ * Fixed the failure of notification autopilot-test
150+ test_sd_incoming_call.
151+
152+ [ Michael Zanetti ]
153+ * clean up fullscreen notifications code.
154+ * import qml files into cmake, drop qmlproject.
155+ * also add qml files in tests directory.
156+ * Added autopilot helpers for the app scope and the app preview.
157+ Install the fake scopes in order to use them on the tests. (LP:
158+ #1269114)
159+
160+ [ Michael Terry ]
161+ * Fix failure to build when using the ./build script with ninja-build
162+ installed. (LP: #1268525)
163+ * Point DBus-activated processes at unity8's MIR_SOCKET rather than
164+ the system socket.
165+
166+ [ Daniel d'Andrada ]
167+ * DragHandle: Never restart hinting animation while still pressed (LP:
168+ #1269022)
169+
170+ [ Bill Filler ]
171+ * fix for lp:1259294, turn off auto capitalization for wifi password
172+ field. (LP: #1259294)
173+ * disable predictive text in Dash search field as it interferes with
174+ built-in search (LP: #1273643)
175+
176+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 28 Jan 2014 15:58:45 +0000
177+
1unity8 (7.84+14.04.20131220-0ubuntu1) trusty; urgency=low
178unity8 (7.84+14.04.20131220-0ubuntu1) trusty; urgency=low
2
179
3 [ Michał Sawicz ]
180 [ Michał Sawicz ]
debian/control+17−3
@@ -5,6 +5,8 @@ Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
5Build-Depends: cmake,
5Build-Depends: cmake,
6 dbus-test-runner,
6 dbus-test-runner,
7 debhelper (>= 9),
7 debhelper (>= 9),
8+ doxyqml,
9+ graphviz,
8 libdee-qt5-dev (>= 3.2),
10 libdee-qt5-dev (>= 3.2),
9 libgl1-mesa-dev[!armhf] | libgl-dev[!armhf],
11 libgl1-mesa-dev[!armhf] | libgl-dev[!armhf],
10 libgl1-mesa-dri,
12 libgl1-mesa-dri,
@@ -38,6 +40,7 @@ Build-Depends: cmake,
38 qtdeclarative5-private-dev,
40 qtdeclarative5-private-dev,
39 qtdeclarative5-qtquick2-plugin,
41 qtdeclarative5-qtquick2-plugin,
40 qtdeclarative5-test-plugin,
42 qtdeclarative5-test-plugin,
43+ qtdeclarative5-ubuntu-settings-components,
41 qtdeclarative5-ubuntu-ui-toolkit-plugin,
44 qtdeclarative5-ubuntu-ui-toolkit-plugin,
42 qtdeclarative5-xmllistmodel-plugin,
45 qtdeclarative5-xmllistmodel-plugin,
43 libqt5xmlpatterns5-dev,
46 libqt5xmlpatterns5-dev,
@@ -53,7 +56,7 @@ Vcs-Browser: https://bazaar.launchpad.net/~unity-team/unity8/trunk
53Package: indicators-client
56Package: indicators-client
54Architecture: amd64 armhf i386
57Architecture: amd64 armhf i386
55Depends: qmenumodel-qml (>= 0.2.7),
58Depends: qmenumodel-qml (>= 0.2.7),
56− qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 0.1.46+13.10.20130829.1-0ubuntu1),
59+ qtdeclarative5-ubuntu-ui-toolkit-plugin,
57 unity8 (= ${binary:Version}),
60 unity8 (= ${binary:Version}),
58 ${misc:Depends},
61 ${misc:Depends},
59 ${shlibs:Depends},
62 ${shlibs:Depends},
@@ -73,11 +76,13 @@ Package: unity8
73Architecture: any
76Architecture: any
74Provides: indicator-renderer,
77Provides: indicator-renderer,
75Depends: gsettings-desktop-schemas,
78Depends: gsettings-desktop-schemas,
79+ libglib2.0-bin,
76− libunity-mir1 (>= 0.2),
80+ libunity-mir1,
77 qmenumodel-qml (>= 0.2.7),
81 qmenumodel-qml (>= 0.2.7),
78 qtdeclarative5-dee-plugin,
82 qtdeclarative5-dee-plugin,
79 qtdeclarative5-gsettings1.0,
83 qtdeclarative5-gsettings1.0,
80− qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 0.1.46+13.10.20130829.1-0ubuntu1),
84+ qtdeclarative5-ubuntu-settings-components,
85+ qtdeclarative5-ubuntu-ui-toolkit-plugin,
81 qtdeclarative5-unity-notifications-plugin | unity-notifications-impl,
86 qtdeclarative5-unity-notifications-plugin | unity-notifications-impl,
82 qtdeclarative5-xmllistmodel-plugin,
87 qtdeclarative5-xmllistmodel-plugin,
83 unity-greeter-session-broadcast,
88 unity-greeter-session-broadcast,
@@ -118,6 +123,7 @@ Depends: gir1.2-glib-2.0,
118 libqt5test5,
123 libqt5test5,
119 libqt5widgets5,
124 libqt5widgets5,
120 python-evdev,
125 python-evdev,
126+ python-fixtures,
121 python-gi,
127 python-gi,
122 python-mock,
128 python-mock,
123 unity8 (>= ${source:Version}),
129 unity8 (>= ${source:Version}),
@@ -153,3 +159,11 @@ Description: Unity 8 private libs
153 .
159 .
154 This package contains the private libraries for QML and other components
160 This package contains the private libraries for QML and other components
155 only used by the shell.
161 only used by the shell.
162+
163+Package: unity8-doc
164+Section: doc
165+Architecture: all
166+Multi-Arch: foreign
167+Depends: ${misc:Depends},
168+Description: Documentation for Unity8
169+ The Unity 8 shell is the primary user interface for Ubuntu devices. (documentation)
debian/rules+4
@@ -21,6 +21,10 @@ override_dh_auto_configure:
21 # So until Debian bug 719148 is fixed, do it ourselves.
21 # So until Debian bug 719148 is fixed, do it ourselves.
22 dh_auto_configure -- -DCMAKE_INSTALL_LOCALSTATEDIR="/var"
22 dh_auto_configure -- -DCMAKE_INSTALL_LOCALSTATEDIR="/var"
23
23
24+override_dh_auto_build:
25+ # doc is not a default target
26+ dh_auto_build -- all doc
27+
24override_dh_install:
28override_dh_install:
25 # install autopilot tests
29 # install autopilot tests
26 cd tests/autopilot; \
30 cd tests/autopilot; \
debian/unity8-autopilot.install−1
@@ -1,2 +1 @@
1usr/lib/python*/*/unity*
1usr/lib/python*/*/unity*
2−data/unity8.override usr/share/upstart/sessions
debian/unity8-doc.installnew file+1
@@ -0,0 +1 @@
1+usr/share/doc/unity8/*
debian/unity8-fake-env.install+1
@@ -1,2 +1,3 @@
1usr/lib/*/unity8/qml/mocks
1usr/lib/*/unity8/qml/mocks
2+usr/lib/*/unity8/qml/scopefakes
2usr/share/unity8/mocks
3usr/share/unity8/mocks
doc/CMakeLists.txtnew file+38
@@ -0,0 +1,38 @@
1+#
2+# Documentation
3+#
4+
5+find_package(Doxygen)
6+find_program(DOT_EXECUTABLE dot /usr/bin)
7+find_program(DOXYQML_EXECUTABLE doxyqml /usr/bin)
8+if (NOT DOXYGEN_FOUND OR NOT DOT_EXECUTABLE OR NOT DOXYQML_EXECUTABLE)
9+ message(WARNING "Cannot generate documentation: doxygen, doxyqml and/or graphviz not found")
10+else()
11+ file(GLOB_RECURSE DOC_FILES
12+ ${CMAKE_BINARY_DIR}/include/*.h
13+ ${CMAKE_SOURCE_DIR}/include/*.h
14+ ${CMAKE_SOURCE_DIR}/src/*.h
15+ ${CMAKE_SOURCE_DIR}/src/*.cpp
16+ ${CMAKE_SOURCE_DIR}/plugins/*.h
17+ ${CMAKE_SOURCE_DIR}/plugins/*.cpp
18+ ${CMAKE_SOURCE_DIR}/qml/*.qml
19+ ${CMAKE_SOURCE_DIR}/qml/*.js
20+ ${CMAKE_SOURCE_DIR}/tests/autopilot/*.py
21+ ${CMAKE_SOURCE_DIR}/tests/utils/*.h
22+ ${CMAKE_SOURCE_DIR}/tests/utils/*.cpp
23+ ${CMAKE_SOURCE_DIR}/tests/utils/*.qml
24+ ${CMAKE_SOURCE_DIR}/tests/utils/*.js
25+ ${CMAKE_SOURCE_DIR}/tests/autopilot/unity8/shell/emulators/*.py
26+ ${CMAKE_SOURCE_DIR}/tests/autopilot/unity8/process_helpers.py)
27+
28+ string(REPLACE ";" " " DOXYGEN_INPUT "${DOC_FILES}")
29+
30+ configure_file(${PROJECT_SOURCE_DIR}/doc/Doxyfile.in ${PROJECT_BINARY_DIR}/doc/Doxyfile @ONLY IMMEDIATE)
31+ add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/doc/${PROJECT_NAME}/index.html
32+ COMMAND ${DOXYGEN_EXECUTABLE} ${PROJECT_BINARY_DIR}/doc/Doxyfile
33+ DEPENDS ${PROJECT_BINARY_DIR}/doc/Doxyfile ${DOC_FILES})
34+ add_custom_target(doc DEPENDS ${PROJECT_BINARY_DIR}/doc/${PROJECT_NAME}/index.html)
35+ install(DIRECTORY ${PROJECT_BINARY_DIR}/doc/${PROJECT_NAME}
36+ DESTINATION ${CMAKE_INSTALL_PREFIX}/share/doc
37+ OPTIONAL)
38+endif()
doc/Doxyfile.innew file+2317
@@ -0,0 +1,2317 @@
1+# Doxyfile 1.8.6
2+
3+# This file describes the settings to be used by the documentation system
4+# doxygen (www.doxygen.org) for a project.
5+#
6+# All text after a double hash (##) is considered a comment and is placed in
7+# front of the TAG it is preceding.
8+#
9+# All text after a single hash (#) is considered a comment and will be ignored.
10+# The format is:
11+# TAG = value [value, ...]
12+# For lists, items can also be appended using:
13+# TAG += value [value, ...]
14+# Values that contain spaces should be placed between quotes (\" \").
15+
16+#---------------------------------------------------------------------------
17+# Project related configuration options
18+#---------------------------------------------------------------------------
19+
20+# This tag specifies the encoding used for all characters in the config file
21+# that follow. The default is UTF-8 which is also the encoding used for all text
22+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
23+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
24+# for the list of possible encodings.
25+# The default value is: UTF-8.
26+
27+DOXYFILE_ENCODING = UTF-8
28+
29+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
30+# double-quotes, unless you are using Doxywizard) that should identify the
31+# project for which the documentation is generated. This name is used in the
32+# title of most generated pages and in a few other places.
33+# The default value is: My Project.
34+
35+PROJECT_NAME = "Unity 8"
36+
37+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
38+# could be handy for archiving the generated documentation or if some version
39+# control system is used.
40+
41+PROJECT_NUMBER =
42+
43+# Using the PROJECT_BRIEF tag one can provide an optional one line description
44+# for a project that appears at the top of each page and should give viewer a
45+# quick idea about the purpose of the project. Keep the description short.
46+
47+PROJECT_BRIEF =
48+
49+# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
50+# the documentation. The maximum height of the logo should not exceed 55 pixels
51+# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
52+# to the output directory.
53+
54+PROJECT_LOGO =
55+
56+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
57+# into which the generated documentation will be written. If a relative path is
58+# entered, it will be relative to the location where doxygen was started. If
59+# left blank the current directory will be used.
60+
61+OUTPUT_DIRECTORY = @PROJECT_BINARY_DIR@/doc
62+
63+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
64+# directories (in 2 levels) under the output directory of each output format and
65+# will distribute the generated files over these directories. Enabling this
66+# option can be useful when feeding doxygen a huge amount of source files, where
67+# putting all generated files in the same directory would otherwise causes
68+# performance problems for the file system.
69+# The default value is: NO.
70+
71+CREATE_SUBDIRS = NO
72+
73+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
74+# documentation generated by doxygen is written. Doxygen will use this
75+# information to generate all constant output in the proper language.
76+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
77+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
78+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
79+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
80+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
81+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
82+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
83+# Ukrainian and Vietnamese.
84+# The default value is: English.
85+
86+OUTPUT_LANGUAGE = English
87+
88+# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member
89+# descriptions after the members that are listed in the file and class
90+# documentation (similar to Javadoc). Set to NO to disable this.
91+# The default value is: YES.
92+
93+BRIEF_MEMBER_DESC = YES
94+
95+# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief
96+# description of a member or function before the detailed description
97+#
98+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
99+# brief descriptions will be completely suppressed.
100+# The default value is: YES.
101+
102+REPEAT_BRIEF = YES
103+
104+# This tag implements a quasi-intelligent brief description abbreviator that is
105+# used to form the text in various listings. Each string in this list, if found
106+# as the leading text of the brief description, will be stripped from the text
107+# and the result, after processing the whole list, is used as the annotated
108+# text. Otherwise, the brief description is used as-is. If left blank, the
109+# following values are used ($name is automatically replaced with the name of
110+# the entity):The $name class, The $name widget, The $name file, is, provides,
111+# specifies, contains, represents, a, an and the.
112+
113+ABBREVIATE_BRIEF = "The $name class" \
114+ "The $name widget" \
115+ "The $name file" \
116+ is \
117+ provides \
118+ specifies \
119+ contains \
120+ represents \
121+ a \
122+ an \
123+ the
124+
125+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
126+# doxygen will generate a detailed section even if there is only a brief
127+# description.
128+# The default value is: NO.
129+
130+ALWAYS_DETAILED_SEC = NO
131+
132+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
133+# inherited members of a class in the documentation of that class as if those
134+# members were ordinary class members. Constructors, destructors and assignment
135+# operators of the base classes will not be shown.
136+# The default value is: NO.
137+
138+INLINE_INHERITED_MEMB = NO
139+
140+# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
141+# before files name in the file list and in the header files. If set to NO the
142+# shortest path that makes the file name unique will be used
143+# The default value is: YES.
144+
145+FULL_PATH_NAMES = YES
146+
147+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
148+# Stripping is only done if one of the specified strings matches the left-hand
149+# part of the path. The tag can be used to show relative paths in the file list.
150+# If left blank the directory from which doxygen is run is used as the path to
151+# strip.
152+#
153+# Note that you can specify absolute paths here, but also relative paths, which
154+# will be relative from the directory where doxygen is started.
155+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
156+
157+STRIP_FROM_PATH = @PROJECT_SOURCE_DIR@ @PROJECT_BINARY_DIR@
158+
159+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
160+# path mentioned in the documentation of a class, which tells the reader which
161+# header file to include in order to use a class. If left blank only the name of
162+# the header file containing the class definition is used. Otherwise one should
163+# specify the list of include paths that are normally passed to the compiler
164+# using the -I flag.
165+
166+STRIP_FROM_INC_PATH = @PROJECT_SOURCE_DIR@ @PROJECT_BINARY_DIR@
167+
168+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
169+# less readable) file names. This can be useful is your file systems doesn't
170+# support long names like on DOS, Mac, or CD-ROM.
171+# The default value is: NO.
172+
173+SHORT_NAMES = NO
174+
175+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
176+# first line (until the first dot) of a Javadoc-style comment as the brief
177+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
178+# style comments (thus requiring an explicit @brief command for a brief
179+# description.)
180+# The default value is: NO.
181+
182+JAVADOC_AUTOBRIEF = NO
183+
184+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
185+# line (until the first dot) of a Qt-style comment as the brief description. If
186+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
187+# requiring an explicit \brief command for a brief description.)
188+# The default value is: NO.
189+
190+QT_AUTOBRIEF = NO
191+
192+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
193+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
194+# a brief description. This used to be the default behavior. The new default is
195+# to treat a multi-line C++ comment block as a detailed description. Set this
196+# tag to YES if you prefer the old behavior instead.
197+#
198+# Note that setting this tag to YES also means that rational rose comments are
199+# not recognized any more.
200+# The default value is: NO.
201+
202+MULTILINE_CPP_IS_BRIEF = NO
203+
204+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
205+# documentation from any documented member that it re-implements.
206+# The default value is: YES.
207+
208+INHERIT_DOCS = YES
209+
210+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a
211+# new page for each member. If set to NO, the documentation of a member will be
212+# part of the file/class/namespace that contains it.
213+# The default value is: NO.
214+
215+SEPARATE_MEMBER_PAGES = NO
216+
217+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
218+# uses this value to replace tabs by spaces in code fragments.
219+# Minimum value: 1, maximum value: 16, default value: 4.
220+
221+TAB_SIZE = 4
222+
223+# This tag can be used to specify a number of aliases that act as commands in
224+# the documentation. An alias has the form:
225+# name=value
226+# For example adding
227+# "sideeffect=@par Side Effects:\n"
228+# will allow you to put the command \sideeffect (or @sideeffect) in the
229+# documentation, which will result in a user-defined paragraph with heading
230+# "Side Effects:". You can put \n's in the value part of an alias to insert
231+# newlines.
232+
233+ALIASES = "accessors=\par Accessors:\n" "notifier=\par Notifier:\n"
234+
235+# This tag can be used to specify a number of word-keyword mappings (TCL only).
236+# A mapping has the form "name=value". For example adding "class=itcl::class"
237+# will allow you to use the command class in the itcl::class meaning.
238+
239+TCL_SUBST =
240+
241+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
242+# only. Doxygen will then generate output that is more tailored for C. For
243+# instance, some of the names that are used will be different. The list of all
244+# members will be omitted, etc.
245+# The default value is: NO.
246+
247+OPTIMIZE_OUTPUT_FOR_C = NO
248+
249+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
250+# Python sources only. Doxygen will then generate output that is more tailored
251+# for that language. For instance, namespaces will be presented as packages,
252+# qualified scopes will look different, etc.
253+# The default value is: NO.
254+
255+OPTIMIZE_OUTPUT_JAVA = NO
256+
257+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
258+# sources. Doxygen will then generate output that is tailored for Fortran.
259+# The default value is: NO.
260+
261+OPTIMIZE_FOR_FORTRAN = NO
262+
263+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
264+# sources. Doxygen will then generate output that is tailored for VHDL.
265+# The default value is: NO.
266+
267+OPTIMIZE_OUTPUT_VHDL = NO
268+
269+# Doxygen selects the parser to use depending on the extension of the files it
270+# parses. With this tag you can assign which parser to use for a given
271+# extension. Doxygen has a built-in mapping, but you can override or extend it
272+# using this tag. The format is ext=language, where ext is a file extension, and
273+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
274+# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make
275+# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
276+# (default is Fortran), use: inc=Fortran f=C.
277+#
278+# Note For files without extension you can use no_extension as a placeholder.
279+#
280+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
281+# the files are not read by doxygen.
282+
283+EXTENSION_MAPPING =
284+
285+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
286+# according to the Markdown format, which allows for more readable
287+# documentation. See http://daringfireball.net/projects/markdown/ for details.
288+# The output of markdown processing is further processed by doxygen, so you can
289+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
290+# case of backward compatibilities issues.
291+# The default value is: YES.
292+
293+MARKDOWN_SUPPORT = YES
294+
295+# When enabled doxygen tries to link words that correspond to documented
296+# classes, or namespaces to their corresponding documentation. Such a link can
297+# be prevented in individual cases by by putting a % sign in front of the word
298+# or globally by setting AUTOLINK_SUPPORT to NO.
299+# The default value is: YES.
300+
301+AUTOLINK_SUPPORT = YES
302+
303+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
304+# to include (a tag file for) the STL sources as input, then you should set this
305+# tag to YES in order to let doxygen match functions declarations and
306+# definitions whose arguments contain STL classes (e.g. func(std::string);
307+# versus func(std::string) {}). This also make the inheritance and collaboration
308+# diagrams that involve STL classes more complete and accurate.
309+# The default value is: NO.
310+
311+BUILTIN_STL_SUPPORT = NO
312+
313+# If you use Microsoft's C++/CLI language, you should set this option to YES to
314+# enable parsing support.
315+# The default value is: NO.
316+
317+CPP_CLI_SUPPORT = NO
318+
319+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
320+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
321+# will parse them like normal C++ but will assume all classes use public instead
322+# of private inheritance when no explicit protection keyword is present.
323+# The default value is: NO.
324+
325+SIP_SUPPORT = NO
326+
327+# For Microsoft's IDL there are propget and propput attributes to indicate
328+# getter and setter methods for a property. Setting this option to YES will make
329+# doxygen to replace the get and set methods by a property in the documentation.
330+# This will only work if the methods are indeed getting or setting a simple
331+# type. If this is not the case, or you want to show the methods anyway, you
332+# should set this option to NO.
333+# The default value is: YES.
334+
335+IDL_PROPERTY_SUPPORT = YES
336+
337+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
338+# tag is set to YES, then doxygen will reuse the documentation of the first
339+# member in the group (if any) for the other members of the group. By default
340+# all members of a group must be documented explicitly.
341+# The default value is: NO.
342+
343+DISTRIBUTE_GROUP_DOC = NO
344+
345+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
346+# (for instance a group of public functions) to be put as a subgroup of that
347+# type (e.g. under the Public Functions section). Set it to NO to prevent
348+# subgrouping. Alternatively, this can be done per class using the
349+# \nosubgrouping command.
350+# The default value is: YES.
351+
352+SUBGROUPING = YES
353+
354+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
355+# are shown inside the group in which they are included (e.g. using \ingroup)
356+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
357+# and RTF).
358+#
359+# Note that this feature does not work in combination with
360+# SEPARATE_MEMBER_PAGES.
361+# The default value is: NO.
362+
363+INLINE_GROUPED_CLASSES = NO
364+
365+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
366+# with only public data fields or simple typedef fields will be shown inline in
367+# the documentation of the scope in which they are defined (i.e. file,
368+# namespace, or group documentation), provided this scope is documented. If set
369+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
370+# Man pages) or section (for LaTeX and RTF).
371+# The default value is: NO.
372+
373+INLINE_SIMPLE_STRUCTS = NO
374+
375+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
376+# enum is documented as struct, union, or enum with the name of the typedef. So
377+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
378+# with name TypeT. When disabled the typedef will appear as a member of a file,
379+# namespace, or class. And the struct will be named TypeS. This can typically be
380+# useful for C code in case the coding convention dictates that all compound
381+# types are typedef'ed and only the typedef is referenced, never the tag name.
382+# The default value is: NO.
383+
384+TYPEDEF_HIDES_STRUCT = NO
385+
386+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
387+# cache is used to resolve symbols given their name and scope. Since this can be
388+# an expensive process and often the same symbol appears multiple times in the
389+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
390+# doxygen will become slower. If the cache is too large, memory is wasted. The
391+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
392+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
393+# symbols. At the end of a run doxygen will report the cache usage and suggest
394+# the optimal cache size from a speed point of view.
395+# Minimum value: 0, maximum value: 9, default value: 0.
396+
397+LOOKUP_CACHE_SIZE = 0
398+
399+#---------------------------------------------------------------------------
400+# Build related configuration options
401+#---------------------------------------------------------------------------
402+
403+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
404+# documentation are documented, even if no documentation was available. Private
405+# class members and static file members will be hidden unless the
406+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
407+# Note: This will also disable the warnings about undocumented members that are
408+# normally produced when WARNINGS is set to YES.
409+# The default value is: NO.
410+
411+EXTRACT_ALL = NO
412+
413+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will
414+# be included in the documentation.
415+# The default value is: NO.
416+
417+EXTRACT_PRIVATE = NO
418+
419+# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
420+# scope will be included in the documentation.
421+# The default value is: NO.
422+
423+EXTRACT_PACKAGE = NO
424+
425+# If the EXTRACT_STATIC tag is set to YES all static members of a file will be
426+# included in the documentation.
427+# The default value is: NO.
428+
429+EXTRACT_STATIC = NO
430+
431+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined
432+# locally in source files will be included in the documentation. If set to NO
433+# only classes defined in header files are included. Does not have any effect
434+# for Java sources.
435+# The default value is: YES.
436+
437+EXTRACT_LOCAL_CLASSES = YES
438+
439+# This flag is only useful for Objective-C code. When set to YES local methods,
440+# which are defined in the implementation section but not in the interface are
441+# included in the documentation. If set to NO only methods in the interface are
442+# included.
443+# The default value is: NO.
444+
445+EXTRACT_LOCAL_METHODS = NO
446+
447+# If this flag is set to YES, the members of anonymous namespaces will be
448+# extracted and appear in the documentation as a namespace called
449+# 'anonymous_namespace{file}', where file will be replaced with the base name of
450+# the file that contains the anonymous namespace. By default anonymous namespace
451+# are hidden.
452+# The default value is: NO.
453+
454+EXTRACT_ANON_NSPACES = NO
455+
456+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
457+# undocumented members inside documented classes or files. If set to NO these
458+# members will be included in the various overviews, but no documentation
459+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
460+# The default value is: NO.
461+
462+HIDE_UNDOC_MEMBERS = NO
463+
464+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
465+# undocumented classes that are normally visible in the class hierarchy. If set
466+# to NO these classes will be included in the various overviews. This option has
467+# no effect if EXTRACT_ALL is enabled.
468+# The default value is: NO.
469+
470+HIDE_UNDOC_CLASSES = YES
471+
472+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
473+# (class|struct|union) declarations. If set to NO these declarations will be
474+# included in the documentation.
475+# The default value is: NO.
476+
477+HIDE_FRIEND_COMPOUNDS = NO
478+
479+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
480+# documentation blocks found inside the body of a function. If set to NO these
481+# blocks will be appended to the function's detailed documentation block.
482+# The default value is: NO.
483+
484+HIDE_IN_BODY_DOCS = NO
485+
486+# The INTERNAL_DOCS tag determines if documentation that is typed after a
487+# \internal command is included. If the tag is set to NO then the documentation
488+# will be excluded. Set it to YES to include the internal documentation.
489+# The default value is: NO.
490+
491+INTERNAL_DOCS = NO
492+
493+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
494+# names in lower-case letters. If set to YES upper-case letters are also
495+# allowed. This is useful if you have classes or files whose names only differ
496+# in case and if your file system supports case sensitive file names. Windows
497+# and Mac users are advised to set this option to NO.
498+# The default value is: system dependent.
499+
500+CASE_SENSE_NAMES = NO
501+
502+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
503+# their full class and namespace scopes in the documentation. If set to YES the
504+# scope will be hidden.
505+# The default value is: NO.
506+
507+HIDE_SCOPE_NAMES = NO
508+
509+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
510+# the files that are included by a file in the documentation of that file.
511+# The default value is: YES.
512+
513+SHOW_INCLUDE_FILES = YES
514+
515+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
516+# grouped member an include statement to the documentation, telling the reader
517+# which file to include in order to use the member.
518+# The default value is: NO.
519+
520+SHOW_GROUPED_MEMB_INC = NO
521+
522+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
523+# files with double quotes in the documentation rather than with sharp brackets.
524+# The default value is: NO.
525+
526+FORCE_LOCAL_INCLUDES = NO
527+
528+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
529+# documentation for inline members.
530+# The default value is: YES.
531+
532+INLINE_INFO = YES
533+
534+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
535+# (detailed) documentation of file and class members alphabetically by member
536+# name. If set to NO the members will appear in declaration order.
537+# The default value is: YES.
538+
539+SORT_MEMBER_DOCS = YES
540+
541+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
542+# descriptions of file, namespace and class members alphabetically by member
543+# name. If set to NO the members will appear in declaration order. Note that
544+# this will also influence the order of the classes in the class list.
545+# The default value is: NO.
546+
547+SORT_BRIEF_DOCS = NO
548+
549+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
550+# (brief and detailed) documentation of class members so that constructors and
551+# destructors are listed first. If set to NO the constructors will appear in the
552+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
553+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
554+# member documentation.
555+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
556+# detailed member documentation.
557+# The default value is: NO.
558+
559+SORT_MEMBERS_CTORS_1ST = NO
560+
561+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
562+# of group names into alphabetical order. If set to NO the group names will
563+# appear in their defined order.
564+# The default value is: NO.
565+
566+SORT_GROUP_NAMES = NO
567+
568+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
569+# fully-qualified names, including namespaces. If set to NO, the class list will
570+# be sorted only by class name, not including the namespace part.
571+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
572+# Note: This option applies only to the class list, not to the alphabetical
573+# list.
574+# The default value is: NO.
575+
576+SORT_BY_SCOPE_NAME = NO
577+
578+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
579+# type resolution of all parameters of a function it will reject a match between
580+# the prototype and the implementation of a member function even if there is
581+# only one candidate or it is obvious which candidate to choose by doing a
582+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
583+# accept a match between prototype and implementation in such cases.
584+# The default value is: NO.
585+
586+STRICT_PROTO_MATCHING = NO
587+
588+# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the
589+# todo list. This list is created by putting \todo commands in the
590+# documentation.
591+# The default value is: YES.
592+
593+GENERATE_TODOLIST = YES
594+
595+# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the
596+# test list. This list is created by putting \test commands in the
597+# documentation.
598+# The default value is: YES.
599+
600+GENERATE_TESTLIST = YES
601+
602+# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug
603+# list. This list is created by putting \bug commands in the documentation.
604+# The default value is: YES.
605+
606+GENERATE_BUGLIST = YES
607+
608+# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)
609+# the deprecated list. This list is created by putting \deprecated commands in
610+# the documentation.
611+# The default value is: YES.
612+
613+GENERATE_DEPRECATEDLIST= YES
614+
615+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
616+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
617+# ... \endcond blocks.
618+
619+ENABLED_SECTIONS =
620+
621+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
622+# initial value of a variable or macro / define can have for it to appear in the
623+# documentation. If the initializer consists of more lines than specified here
624+# it will be hidden. Use a value of 0 to hide initializers completely. The
625+# appearance of the value of individual variables and macros / defines can be
626+# controlled using \showinitializer or \hideinitializer command in the
627+# documentation regardless of this setting.
628+# Minimum value: 0, maximum value: 10000, default value: 30.
629+
630+MAX_INITIALIZER_LINES = 30
631+
632+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
633+# the bottom of the documentation of classes and structs. If set to YES the list
634+# will mention the files that were used to generate the documentation.
635+# The default value is: YES.
636+
637+SHOW_USED_FILES = YES
638+
639+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
640+# will remove the Files entry from the Quick Index and from the Folder Tree View
641+# (if specified).
642+# The default value is: YES.
643+
644+SHOW_FILES = YES
645+
646+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
647+# page. This will remove the Namespaces entry from the Quick Index and from the
648+# Folder Tree View (if specified).
649+# The default value is: YES.
650+
651+SHOW_NAMESPACES = YES
652+
653+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
654+# doxygen should invoke to get the current version for each file (typically from
655+# the version control system). Doxygen will invoke the program by executing (via
656+# popen()) the command command input-file, where command is the value of the
657+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
658+# by doxygen. Whatever the program writes to standard output is used as the file
659+# version. For an example see the documentation.
660+
661+FILE_VERSION_FILTER =
662+
663+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
664+# by doxygen. The layout file controls the global structure of the generated
665+# output files in an output format independent way. To create the layout file
666+# that represents doxygen's defaults, run doxygen with the -l option. You can
667+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
668+# will be used as the name of the layout file.
669+#
670+# Note that if you run doxygen from a directory containing a file called
671+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
672+# tag is left empty.
673+
674+LAYOUT_FILE =
675+
676+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
677+# the reference definitions. This must be a list of .bib files. The .bib
678+# extension is automatically appended if omitted. This requires the bibtex tool
679+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
680+# For LaTeX the style of the bibliography can be controlled using
681+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
682+# search path. Do not use file names with spaces, bibtex cannot handle them. See
683+# also \cite for info how to create references.
684+
685+CITE_BIB_FILES =
686+
687+#---------------------------------------------------------------------------
688+# Configuration options related to warning and progress messages
689+#---------------------------------------------------------------------------
690+
691+# The QUIET tag can be used to turn on/off the messages that are generated to
692+# standard output by doxygen. If QUIET is set to YES this implies that the
693+# messages are off.
694+# The default value is: NO.
695+
696+QUIET = YES
697+
698+# The WARNINGS tag can be used to turn on/off the warning messages that are
699+# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES
700+# this implies that the warnings are on.
701+#
702+# Tip: Turn warnings on while writing the documentation.
703+# The default value is: YES.
704+
705+WARNINGS = YES
706+
707+# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate
708+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
709+# will automatically be disabled.
710+# The default value is: YES.
711+
712+WARN_IF_UNDOCUMENTED = NO
713+
714+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
715+# potential errors in the documentation, such as not documenting some parameters
716+# in a documented function, or documenting parameters that don't exist or using
717+# markup commands wrongly.
718+# The default value is: YES.
719+
720+WARN_IF_DOC_ERROR = YES
721+
722+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
723+# are documented, but have no documentation for their parameters or return
724+# value. If set to NO doxygen will only warn about wrong or incomplete parameter
725+# documentation, but not about the absence of documentation.
726+# The default value is: NO.
727+
728+WARN_NO_PARAMDOC = NO
729+
730+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
731+# can produce. The string should contain the $file, $line, and $text tags, which
732+# will be replaced by the file and line number from which the warning originated
733+# and the warning text. Optionally the format may contain $version, which will
734+# be replaced by the version of the file (if it could be obtained via
735+# FILE_VERSION_FILTER)
736+# The default value is: $file:$line: $text.
737+
738+WARN_FORMAT = "$file:$line: $text"
739+
740+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
741+# messages should be written. If left blank the output is written to standard
742+# error (stderr).
743+
744+WARN_LOGFILE =
745+
746+#---------------------------------------------------------------------------
747+# Configuration options related to the input files
748+#---------------------------------------------------------------------------
749+
750+# The INPUT tag is used to specify the files and/or directories that contain
751+# documented source files. You may enter file names like myfile.cpp or
752+# directories like /usr/src/myproject. Separate the files or directories with
753+# spaces.
754+# Note: If this tag is empty the current directory is searched.
755+
756+INPUT = @DOXYGEN_INPUT@
757+
758+# This tag can be used to specify the character encoding of the source files
759+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
760+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
761+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
762+# possible encodings.
763+# The default value is: UTF-8.
764+
765+INPUT_ENCODING = UTF-8
766+
767+# If the value of the INPUT tag contains directories, you can use the
768+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
769+# *.h) to filter out the source-files in the directories. If left blank the
770+# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
771+# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
772+# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
773+# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
774+# *.qsf, *.as and *.js.
775+
776+FILE_PATTERNS = *.cpp \
777+ *.h \
778+ *.py \
779+ *.js \
780+ *.qml
781+
782+# The RECURSIVE tag can be used to specify whether or not subdirectories should
783+# be searched for input files as well.
784+# The default value is: NO.
785+
786+RECURSIVE = YES
787+
788+# The EXCLUDE tag can be used to specify files and/or directories that should be
789+# excluded from the INPUT source files. This way you can easily exclude a
790+# subdirectory from a directory tree whose root is specified with the INPUT tag.
791+#
792+# Note that relative paths are relative to the directory from which doxygen is
793+# run.
794+
795+EXCLUDE =
796+
797+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
798+# directories that are symbolic links (a Unix file system feature) are excluded
799+# from the input.
800+# The default value is: NO.
801+
802+EXCLUDE_SYMLINKS = NO
803+
804+# If the value of the INPUT tag contains directories, you can use the
805+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
806+# certain files from those directories.
807+#
808+# Note that the wildcards are matched against the file with absolute path, so to
809+# exclude all test directories for example use the pattern */test/*
810+
811+EXCLUDE_PATTERNS =
812+
813+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
814+# (namespaces, classes, functions, etc.) that should be excluded from the
815+# output. The symbol name can be a fully qualified name, a word, or if the
816+# wildcard * is used, a substring. Examples: ANamespace, AClass,
817+# AClass::ANamespace, ANamespace::*Test
818+#
819+# Note that the wildcards are matched against the file with absolute path, so to
820+# exclude all test directories use the pattern */test/*
821+
822+EXCLUDE_SYMBOLS =
823+
824+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
825+# that contain example code fragments that are included (see the \include
826+# command).
827+
828+EXAMPLE_PATH =
829+
830+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
831+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
832+# *.h) to filter out the source-files in the directories. If left blank all
833+# files are included.
834+
835+EXAMPLE_PATTERNS =
836+
837+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
838+# searched for input files to be used with the \include or \dontinclude commands
839+# irrespective of the value of the RECURSIVE tag.
840+# The default value is: NO.
841+
842+EXAMPLE_RECURSIVE = NO
843+
844+# The IMAGE_PATH tag can be used to specify one or more files or directories
845+# that contain images that are to be included in the documentation (see the
846+# \image command).
847+
848+IMAGE_PATH =
849+
850+# The INPUT_FILTER tag can be used to specify a program that doxygen should
851+# invoke to filter for each input file. Doxygen will invoke the filter program
852+# by executing (via popen()) the command:
853+#
854+# <filter> <input-file>
855+#
856+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
857+# name of an input file. Doxygen will then use the output that the filter
858+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
859+# will be ignored.
860+#
861+# Note that the filter must not add or remove lines; it is applied before the
862+# code is scanned, but not when the output code is generated. If lines are added
863+# or removed, the anchors will not be placed correctly.
864+
865+INPUT_FILTER =
866+
867+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
868+# basis. Doxygen will compare the file name with each pattern and apply the
869+# filter if there is a match. The filters are a list of the form: pattern=filter
870+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
871+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
872+# patterns match the file name, INPUT_FILTER is applied.
873+
874+FILTER_PATTERNS = *.qml=doxyqml
875+
876+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
877+# INPUT_FILTER ) will also be used to filter the input files that are used for
878+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
879+# The default value is: NO.
880+
881+FILTER_SOURCE_FILES = NO
882+
883+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
884+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
885+# it is also possible to disable source filtering for a specific pattern using
886+# *.ext= (so without naming a filter).
887+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
888+
889+FILTER_SOURCE_PATTERNS =
890+
891+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
892+# is part of the input, its contents will be placed on the main page
893+# (index.html). This can be useful if you have a project on for instance GitHub
894+# and want to reuse the introduction page also for the doxygen output.
895+
896+USE_MDFILE_AS_MAINPAGE =
897+
898+#---------------------------------------------------------------------------
899+# Configuration options related to source browsing
900+#---------------------------------------------------------------------------
901+
902+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
903+# generated. Documented entities will be cross-referenced with these sources.
904+#
905+# Note: To get rid of all source code in the generated output, make sure that
906+# also VERBATIM_HEADERS is set to NO.
907+# The default value is: NO.
908+
909+SOURCE_BROWSER = YES
910+
911+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
912+# classes and enums directly into the documentation.
913+# The default value is: NO.
914+
915+INLINE_SOURCES = YES
916+
917+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
918+# special comment blocks from generated source code fragments. Normal C, C++ and
919+# Fortran comments will always remain visible.
920+# The default value is: YES.
921+
922+STRIP_CODE_COMMENTS = YES
923+
924+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
925+# function all documented functions referencing it will be listed.
926+# The default value is: NO.
927+
928+REFERENCED_BY_RELATION = NO
929+
930+# If the REFERENCES_RELATION tag is set to YES then for each documented function
931+# all documented entities called/used by that function will be listed.
932+# The default value is: NO.
933+
934+REFERENCES_RELATION = NO
935+
936+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
937+# to YES, then the hyperlinks from functions in REFERENCES_RELATION and
938+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
939+# link to the documentation.
940+# The default value is: YES.
941+
942+REFERENCES_LINK_SOURCE = YES
943+
944+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
945+# source code will show a tooltip with additional information such as prototype,
946+# brief description and links to the definition and documentation. Since this
947+# will make the HTML file larger and loading of large files a bit slower, you
948+# can opt to disable this feature.
949+# The default value is: YES.
950+# This tag requires that the tag SOURCE_BROWSER is set to YES.
951+
952+SOURCE_TOOLTIPS = YES
953+
954+# If the USE_HTAGS tag is set to YES then the references to source code will
955+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
956+# source browser. The htags tool is part of GNU's global source tagging system
957+# (see http://www.gnu.org/software/global/global.html). You will need version
958+# 4.8.6 or higher.
959+#
960+# To use it do the following:
961+# - Install the latest version of global
962+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
963+# - Make sure the INPUT points to the root of the source tree
964+# - Run doxygen as normal
965+#
966+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
967+# tools must be available from the command line (i.e. in the search path).
968+#
969+# The result: instead of the source browser generated by doxygen, the links to
970+# source code will now point to the output of htags.
971+# The default value is: NO.
972+# This tag requires that the tag SOURCE_BROWSER is set to YES.
973+
974+USE_HTAGS = NO
975+
976+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
977+# verbatim copy of the header file for each class for which an include is
978+# specified. Set to NO to disable this.
979+# See also: Section \class.
980+# The default value is: YES.
981+
982+VERBATIM_HEADERS = YES
983+
984+#---------------------------------------------------------------------------
985+# Configuration options related to the alphabetical class index
986+#---------------------------------------------------------------------------
987+
988+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
989+# compounds will be generated. Enable this if the project contains a lot of
990+# classes, structs, unions or interfaces.
991+# The default value is: YES.
992+
993+ALPHABETICAL_INDEX = YES
994+
995+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
996+# which the alphabetical index list will be split.
997+# Minimum value: 1, maximum value: 20, default value: 5.
998+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
999+
1000+COLS_IN_ALPHA_INDEX = 5
1001+
1002+# In case all classes in a project start with a common prefix, all classes will
1003+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
1004+# can be used to specify a prefix (or a list of prefixes) that should be ignored
1005+# while generating the index headers.
1006+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
1007+
1008+IGNORE_PREFIX =
1009+
1010+#---------------------------------------------------------------------------
1011+# Configuration options related to the HTML output
1012+#---------------------------------------------------------------------------
1013+
1014+# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output
1015+# The default value is: YES.
1016+
1017+GENERATE_HTML = YES
1018+
1019+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
1020+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
1021+# it.
1022+# The default directory is: html.
1023+# This tag requires that the tag GENERATE_HTML is set to YES.
1024+
1025+HTML_OUTPUT = unity8
1026+
1027+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
1028+# generated HTML page (for example: .htm, .php, .asp).
1029+# The default value is: .html.
1030+# This tag requires that the tag GENERATE_HTML is set to YES.
1031+
1032+HTML_FILE_EXTENSION = .html
1033+
1034+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
1035+# each generated HTML page. If the tag is left blank doxygen will generate a
1036+# standard header.
1037+#
1038+# To get valid HTML the header file that includes any scripts and style sheets
1039+# that doxygen needs, which is dependent on the configuration options used (e.g.
1040+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
1041+# default header using
1042+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
1043+# YourConfigFile
1044+# and then modify the file new_header.html. See also section "Doxygen usage"
1045+# for information on how to generate the default header that doxygen normally
1046+# uses.
1047+# Note: The header is subject to change so you typically have to regenerate the
1048+# default header when upgrading to a newer version of doxygen. For a description
1049+# of the possible markers and block names see the documentation.
1050+# This tag requires that the tag GENERATE_HTML is set to YES.
1051+
1052+HTML_HEADER =
1053+
1054+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
1055+# generated HTML page. If the tag is left blank doxygen will generate a standard
1056+# footer. See HTML_HEADER for more information on how to generate a default
1057+# footer and what special commands can be used inside the footer. See also
1058+# section "Doxygen usage" for information on how to generate the default footer
1059+# that doxygen normally uses.
1060+# This tag requires that the tag GENERATE_HTML is set to YES.
1061+
1062+HTML_FOOTER =
1063+
1064+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
1065+# sheet that is used by each HTML page. It can be used to fine-tune the look of
1066+# the HTML output. If left blank doxygen will generate a default style sheet.
1067+# See also section "Doxygen usage" for information on how to generate the style
1068+# sheet that doxygen normally uses.
1069+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
1070+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
1071+# obsolete.
1072+# This tag requires that the tag GENERATE_HTML is set to YES.
1073+
1074+HTML_STYLESHEET =
1075+
1076+# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user-
1077+# defined cascading style sheet that is included after the standard style sheets
1078+# created by doxygen. Using this option one can overrule certain style aspects.
1079+# This is preferred over using HTML_STYLESHEET since it does not replace the
1080+# standard style sheet and is therefor more robust against future updates.
1081+# Doxygen will copy the style sheet file to the output directory. For an example
1082+# see the documentation.
1083+# This tag requires that the tag GENERATE_HTML is set to YES.
1084+
1085+HTML_EXTRA_STYLESHEET =
1086+
1087+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
1088+# other source files which should be copied to the HTML output directory. Note
1089+# that these files will be copied to the base HTML output directory. Use the
1090+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
1091+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
1092+# files will be copied as-is; there are no commands or markers available.
1093+# This tag requires that the tag GENERATE_HTML is set to YES.
1094+
1095+HTML_EXTRA_FILES =
1096+
1097+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
1098+# will adjust the colors in the stylesheet and background images according to
1099+# this color. Hue is specified as an angle on a colorwheel, see
1100+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
1101+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
1102+# purple, and 360 is red again.
1103+# Minimum value: 0, maximum value: 359, default value: 220.
1104+# This tag requires that the tag GENERATE_HTML is set to YES.
1105+
1106+HTML_COLORSTYLE_HUE = 220
1107+
1108+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
1109+# in the HTML output. For a value of 0 the output will use grayscales only. A
1110+# value of 255 will produce the most vivid colors.
1111+# Minimum value: 0, maximum value: 255, default value: 100.
1112+# This tag requires that the tag GENERATE_HTML is set to YES.
1113+
1114+HTML_COLORSTYLE_SAT = 100
1115+
1116+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
1117+# luminance component of the colors in the HTML output. Values below 100
1118+# gradually make the output lighter, whereas values above 100 make the output
1119+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
1120+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
1121+# change the gamma.
1122+# Minimum value: 40, maximum value: 240, default value: 80.
1123+# This tag requires that the tag GENERATE_HTML is set to YES.
1124+
1125+HTML_COLORSTYLE_GAMMA = 80
1126+
1127+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
1128+# page will contain the date and time when the page was generated. Setting this
1129+# to NO can help when comparing the output of multiple runs.
1130+# The default value is: YES.
1131+# This tag requires that the tag GENERATE_HTML is set to YES.
1132+
1133+HTML_TIMESTAMP = YES
1134+
1135+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
1136+# documentation will contain sections that can be hidden and shown after the
1137+# page has loaded.
1138+# The default value is: NO.
1139+# This tag requires that the tag GENERATE_HTML is set to YES.
1140+
1141+HTML_DYNAMIC_SECTIONS = NO
1142+
1143+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
1144+# shown in the various tree structured indices initially; the user can expand
1145+# and collapse entries dynamically later on. Doxygen will expand the tree to
1146+# such a level that at most the specified number of entries are visible (unless
1147+# a fully collapsed tree already exceeds this amount). So setting the number of
1148+# entries 1 will produce a full collapsed tree by default. 0 is a special value
1149+# representing an infinite number of entries and will result in a full expanded
1150+# tree by default.
1151+# Minimum value: 0, maximum value: 9999, default value: 100.
1152+# This tag requires that the tag GENERATE_HTML is set to YES.
1153+
1154+HTML_INDEX_NUM_ENTRIES = 100
1155+
1156+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
1157+# generated that can be used as input for Apple's Xcode 3 integrated development
1158+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
1159+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
1160+# Makefile in the HTML output directory. Running make will produce the docset in
1161+# that directory and running make install will install the docset in
1162+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
1163+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
1164+# for more information.
1165+# The default value is: NO.
1166+# This tag requires that the tag GENERATE_HTML is set to YES.
1167+
1168+GENERATE_DOCSET = NO
1169+
1170+# This tag determines the name of the docset feed. A documentation feed provides
1171+# an umbrella under which multiple documentation sets from a single provider
1172+# (such as a company or product suite) can be grouped.
1173+# The default value is: Doxygen generated docs.
1174+# This tag requires that the tag GENERATE_DOCSET is set to YES.
1175+
1176+DOCSET_FEEDNAME = "Doxygen generated docs"
1177+
1178+# This tag specifies a string that should uniquely identify the documentation
1179+# set bundle. This should be a reverse domain-name style string, e.g.
1180+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
1181+# The default value is: org.doxygen.Project.
1182+# This tag requires that the tag GENERATE_DOCSET is set to YES.
1183+
1184+DOCSET_BUNDLE_ID = org.doxygen.Project
1185+
1186+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
1187+# the documentation publisher. This should be a reverse domain-name style
1188+# string, e.g. com.mycompany.MyDocSet.documentation.
1189+# The default value is: org.doxygen.Publisher.
1190+# This tag requires that the tag GENERATE_DOCSET is set to YES.
1191+
1192+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
1193+
1194+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
1195+# The default value is: Publisher.
1196+# This tag requires that the tag GENERATE_DOCSET is set to YES.
1197+
1198+DOCSET_PUBLISHER_NAME = Publisher
1199+
1200+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
1201+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
1202+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
1203+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
1204+# Windows.
1205+#
1206+# The HTML Help Workshop contains a compiler that can convert all HTML output
1207+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
1208+# files are now used as the Windows 98 help format, and will replace the old
1209+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
1210+# HTML files also contain an index, a table of contents, and you can search for
1211+# words in the documentation. The HTML workshop also contains a viewer for
1212+# compressed HTML files.
1213+# The default value is: NO.
1214+# This tag requires that the tag GENERATE_HTML is set to YES.
1215+
1216+GENERATE_HTMLHELP = NO
1217+
1218+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
1219+# file. You can add a path in front of the file if the result should not be
1220+# written to the html output directory.
1221+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
1222+
1223+CHM_FILE =
1224+
1225+# The HHC_LOCATION tag can be used to specify the location (absolute path
1226+# including file name) of the HTML help compiler ( hhc.exe). If non-empty
1227+# doxygen will try to run the HTML help compiler on the generated index.hhp.
1228+# The file has to be specified with full path.
1229+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
1230+
1231+HHC_LOCATION =
1232+
1233+# The GENERATE_CHI flag controls if a separate .chi index file is generated (
1234+# YES) or that it should be included in the master .chm file ( NO).
1235+# The default value is: NO.
1236+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
1237+
1238+GENERATE_CHI = NO
1239+
1240+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc)
1241+# and project file content.
1242+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
1243+
1244+CHM_INDEX_ENCODING =
1245+
1246+# The BINARY_TOC flag controls whether a binary table of contents is generated (
1247+# YES) or a normal table of contents ( NO) in the .chm file.
1248+# The default value is: NO.
1249+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
1250+
1251+BINARY_TOC = NO
1252+
1253+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
1254+# the table of contents of the HTML help documentation and to the tree view.
1255+# The default value is: NO.
1256+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
1257+
1258+TOC_EXPAND = NO
1259+
1260+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
1261+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
1262+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
1263+# (.qch) of the generated HTML documentation.
1264+# The default value is: NO.
1265+# This tag requires that the tag GENERATE_HTML is set to YES.
1266+
1267+GENERATE_QHP = NO
1268+
1269+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
1270+# the file name of the resulting .qch file. The path specified is relative to
1271+# the HTML output folder.
1272+# This tag requires that the tag GENERATE_QHP is set to YES.
1273+
1274+QCH_FILE =
1275+
1276+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
1277+# Project output. For more information please see Qt Help Project / Namespace
1278+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
1279+# The default value is: org.doxygen.Project.
1280+# This tag requires that the tag GENERATE_QHP is set to YES.
1281+
1282+QHP_NAMESPACE = org.doxygen.Project
1283+
1284+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
1285+# Help Project output. For more information please see Qt Help Project / Virtual
1286+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
1287+# folders).
1288+# The default value is: doc.
1289+# This tag requires that the tag GENERATE_QHP is set to YES.
1290+
1291+QHP_VIRTUAL_FOLDER = doc
1292+
1293+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
1294+# filter to add. For more information please see Qt Help Project / Custom
1295+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
1296+# filters).
1297+# This tag requires that the tag GENERATE_QHP is set to YES.
1298+
1299+QHP_CUST_FILTER_NAME =
1300+
1301+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
1302+# custom filter to add. For more information please see Qt Help Project / Custom
1303+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
1304+# filters).
1305+# This tag requires that the tag GENERATE_QHP is set to YES.
1306+
1307+QHP_CUST_FILTER_ATTRS =
1308+
1309+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
1310+# project's filter section matches. Qt Help Project / Filter Attributes (see:
1311+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
1312+# This tag requires that the tag GENERATE_QHP is set to YES.
1313+
1314+QHP_SECT_FILTER_ATTRS =
1315+
1316+# The QHG_LOCATION tag can be used to specify the location of Qt's
1317+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
1318+# generated .qhp file.
1319+# This tag requires that the tag GENERATE_QHP is set to YES.
1320+
1321+QHG_LOCATION =
1322+
1323+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
1324+# generated, together with the HTML files, they form an Eclipse help plugin. To
1325+# install this plugin and make it available under the help contents menu in
1326+# Eclipse, the contents of the directory containing the HTML and XML files needs
1327+# to be copied into the plugins directory of eclipse. The name of the directory
1328+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
1329+# After copying Eclipse needs to be restarted before the help appears.
1330+# The default value is: NO.
1331+# This tag requires that the tag GENERATE_HTML is set to YES.
1332+
1333+GENERATE_ECLIPSEHELP = NO
1334+
1335+# A unique identifier for the Eclipse help plugin. When installing the plugin
1336+# the directory name containing the HTML and XML files should also have this
1337+# name. Each documentation set should have its own identifier.
1338+# The default value is: org.doxygen.Project.
1339+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
1340+
1341+ECLIPSE_DOC_ID = org.doxygen.Project
1342+
1343+# If you want full control over the layout of the generated HTML pages it might
1344+# be necessary to disable the index and replace it with your own. The
1345+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
1346+# of each HTML page. A value of NO enables the index and the value YES disables
1347+# it. Since the tabs in the index contain the same information as the navigation
1348+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
1349+# The default value is: NO.
1350+# This tag requires that the tag GENERATE_HTML is set to YES.
1351+
1352+DISABLE_INDEX = NO
1353+
1354+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
1355+# structure should be generated to display hierarchical information. If the tag
1356+# value is set to YES, a side panel will be generated containing a tree-like
1357+# index structure (just like the one that is generated for HTML Help). For this
1358+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
1359+# (i.e. any modern browser). Windows users are probably better off using the
1360+# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can
1361+# further fine-tune the look of the index. As an example, the default style
1362+# sheet generated by doxygen has an example that shows how to put an image at
1363+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
1364+# the same information as the tab index, you could consider setting
1365+# DISABLE_INDEX to YES when enabling this option.
1366+# The default value is: NO.
1367+# This tag requires that the tag GENERATE_HTML is set to YES.
1368+
1369+GENERATE_TREEVIEW = YES
1370+
1371+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
1372+# doxygen will group on one line in the generated HTML documentation.
1373+#
1374+# Note that a value of 0 will completely suppress the enum values from appearing
1375+# in the overview section.
1376+# Minimum value: 0, maximum value: 20, default value: 4.
1377+# This tag requires that the tag GENERATE_HTML is set to YES.
1378+
1379+ENUM_VALUES_PER_LINE = 4
1380+
1381+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
1382+# to set the initial width (in pixels) of the frame in which the tree is shown.
1383+# Minimum value: 0, maximum value: 1500, default value: 250.
1384+# This tag requires that the tag GENERATE_HTML is set to YES.
1385+
1386+TREEVIEW_WIDTH = 250
1387+
1388+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to
1389+# external symbols imported via tag files in a separate window.
1390+# The default value is: NO.
1391+# This tag requires that the tag GENERATE_HTML is set to YES.
1392+
1393+EXT_LINKS_IN_WINDOW = NO
1394+
1395+# Use this tag to change the font size of LaTeX formulas included as images in
1396+# the HTML documentation. When you change the font size after a successful
1397+# doxygen run you need to manually remove any form_*.png images from the HTML
1398+# output directory to force them to be regenerated.
1399+# Minimum value: 8, maximum value: 50, default value: 10.
1400+# This tag requires that the tag GENERATE_HTML is set to YES.
1401+
1402+FORMULA_FONTSIZE = 10
1403+
1404+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
1405+# generated for formulas are transparent PNGs. Transparent PNGs are not
1406+# supported properly for IE 6.0, but are supported on all modern browsers.
1407+#
1408+# Note that when changing this option you need to delete any form_*.png files in
1409+# the HTML output directory before the changes have effect.
1410+# The default value is: YES.
1411+# This tag requires that the tag GENERATE_HTML is set to YES.
1412+
1413+FORMULA_TRANSPARENT = YES
1414+
1415+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
1416+# http://www.mathjax.org) which uses client side Javascript for the rendering
1417+# instead of using prerendered bitmaps. Use this if you do not have LaTeX
1418+# installed or if you want to formulas look prettier in the HTML output. When
1419+# enabled you may also need to install MathJax separately and configure the path
1420+# to it using the MATHJAX_RELPATH option.
1421+# The default value is: NO.
1422+# This tag requires that the tag GENERATE_HTML is set to YES.
1423+
1424+USE_MATHJAX = NO
1425+
1426+# When MathJax is enabled you can set the default output format to be used for
1427+# the MathJax output. See the MathJax site (see:
1428+# http://docs.mathjax.org/en/latest/output.html) for more details.
1429+# Possible values are: HTML-CSS (which is slower, but has the best
1430+# compatibility), NativeMML (i.e. MathML) and SVG.
1431+# The default value is: HTML-CSS.
1432+# This tag requires that the tag USE_MATHJAX is set to YES.
1433+
1434+MATHJAX_FORMAT = HTML-CSS
1435+
1436+# When MathJax is enabled you need to specify the location relative to the HTML
1437+# output directory using the MATHJAX_RELPATH option. The destination directory
1438+# should contain the MathJax.js script. For instance, if the mathjax directory
1439+# is located at the same level as the HTML output directory, then
1440+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
1441+# Content Delivery Network so you can quickly see the result without installing
1442+# MathJax. However, it is strongly recommended to install a local copy of
1443+# MathJax from http://www.mathjax.org before deployment.
1444+# The default value is: http://cdn.mathjax.org/mathjax/latest.
1445+# This tag requires that the tag USE_MATHJAX is set to YES.
1446+
1447+MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
1448+
1449+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
1450+# extension names that should be enabled during MathJax rendering. For example
1451+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
1452+# This tag requires that the tag USE_MATHJAX is set to YES.
1453+
1454+MATHJAX_EXTENSIONS =
1455+
1456+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
1457+# of code that will be used on startup of the MathJax code. See the MathJax site
1458+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
1459+# example see the documentation.
1460+# This tag requires that the tag USE_MATHJAX is set to YES.
1461+
1462+MATHJAX_CODEFILE =
1463+
1464+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
1465+# the HTML output. The underlying search engine uses javascript and DHTML and
1466+# should work on any modern browser. Note that when using HTML help
1467+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
1468+# there is already a search function so this one should typically be disabled.
1469+# For large projects the javascript based search engine can be slow, then
1470+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
1471+# search using the keyboard; to jump to the search box use <access key> + S
1472+# (what the <access key> is depends on the OS and browser, but it is typically
1473+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
1474+# key> to jump into the search results window, the results can be navigated
1475+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
1476+# the search. The filter options can be selected when the cursor is inside the
1477+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
1478+# to select a filter and <Enter> or <escape> to activate or cancel the filter
1479+# option.
1480+# The default value is: YES.
1481+# This tag requires that the tag GENERATE_HTML is set to YES.
1482+
1483+SEARCHENGINE = YES
1484+
1485+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
1486+# implemented using a web server instead of a web client using Javascript. There
1487+# are two flavours of web server based searching depending on the
1488+# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for
1489+# searching and an index file used by the script. When EXTERNAL_SEARCH is
1490+# enabled the indexing and searching needs to be provided by external tools. See
1491+# the section "External Indexing and Searching" for details.
1492+# The default value is: NO.
1493+# This tag requires that the tag SEARCHENGINE is set to YES.
1494+
1495+SERVER_BASED_SEARCH = NO
1496+
1497+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
1498+# script for searching. Instead the search results are written to an XML file
1499+# which needs to be processed by an external indexer. Doxygen will invoke an
1500+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
1501+# search results.
1502+#
1503+# Doxygen ships with an example indexer ( doxyindexer) and search engine
1504+# (doxysearch.cgi) which are based on the open source search engine library
1505+# Xapian (see: http://xapian.org/).
1506+#
1507+# See the section "External Indexing and Searching" for details.
1508+# The default value is: NO.
1509+# This tag requires that the tag SEARCHENGINE is set to YES.
1510+
1511+EXTERNAL_SEARCH = NO
1512+
1513+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
1514+# which will return the search results when EXTERNAL_SEARCH is enabled.
1515+#
1516+# Doxygen ships with an example indexer ( doxyindexer) and search engine
1517+# (doxysearch.cgi) which are based on the open source search engine library
1518+# Xapian (see: http://xapian.org/). See the section "External Indexing and
1519+# Searching" for details.
1520+# This tag requires that the tag SEARCHENGINE is set to YES.
1521+
1522+SEARCHENGINE_URL =
1523+
1524+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
1525+# search data is written to a file for indexing by an external tool. With the
1526+# SEARCHDATA_FILE tag the name of this file can be specified.
1527+# The default file is: searchdata.xml.
1528+# This tag requires that the tag SEARCHENGINE is set to YES.
1529+
1530+SEARCHDATA_FILE = searchdata.xml
1531+
1532+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
1533+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
1534+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
1535+# projects and redirect the results back to the right project.
1536+# This tag requires that the tag SEARCHENGINE is set to YES.
1537+
1538+EXTERNAL_SEARCH_ID =
1539+
1540+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
1541+# projects other than the one defined by this configuration file, but that are
1542+# all added to the same external search index. Each project needs to have a
1543+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
1544+# to a relative location where the documentation can be found. The format is:
1545+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
1546+# This tag requires that the tag SEARCHENGINE is set to YES.
1547+
1548+EXTRA_SEARCH_MAPPINGS =
1549+
1550+#---------------------------------------------------------------------------
1551+# Configuration options related to the LaTeX output
1552+#---------------------------------------------------------------------------
1553+
1554+# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output.
1555+# The default value is: YES.
1556+
1557+GENERATE_LATEX = NO
1558+
1559+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
1560+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
1561+# it.
1562+# The default directory is: latex.
1563+# This tag requires that the tag GENERATE_LATEX is set to YES.
1564+
1565+LATEX_OUTPUT = latex
1566+
1567+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
1568+# invoked.
1569+#
1570+# Note that when enabling USE_PDFLATEX this option is only used for generating
1571+# bitmaps for formulas in the HTML output, but not in the Makefile that is
1572+# written to the output directory.
1573+# The default file is: latex.
1574+# This tag requires that the tag GENERATE_LATEX is set to YES.
1575+
1576+LATEX_CMD_NAME = latex
1577+
1578+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
1579+# index for LaTeX.
1580+# The default file is: makeindex.
1581+# This tag requires that the tag GENERATE_LATEX is set to YES.
1582+
1583+MAKEINDEX_CMD_NAME = makeindex
1584+
1585+# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX
1586+# documents. This may be useful for small projects and may help to save some
1587+# trees in general.
1588+# The default value is: NO.
1589+# This tag requires that the tag GENERATE_LATEX is set to YES.
1590+
1591+COMPACT_LATEX = NO
1592+
1593+# The PAPER_TYPE tag can be used to set the paper type that is used by the
1594+# printer.
1595+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
1596+# 14 inches) and executive (7.25 x 10.5 inches).
1597+# The default value is: a4.
1598+# This tag requires that the tag GENERATE_LATEX is set to YES.
1599+
1600+PAPER_TYPE = a4
1601+
1602+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
1603+# that should be included in the LaTeX output. To get the times font for
1604+# instance you can specify
1605+# EXTRA_PACKAGES=times
1606+# If left blank no extra packages will be included.
1607+# This tag requires that the tag GENERATE_LATEX is set to YES.
1608+
1609+EXTRA_PACKAGES =
1610+
1611+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
1612+# generated LaTeX document. The header should contain everything until the first
1613+# chapter. If it is left blank doxygen will generate a standard header. See
1614+# section "Doxygen usage" for information on how to let doxygen write the
1615+# default header to a separate file.
1616+#
1617+# Note: Only use a user-defined header if you know what you are doing! The
1618+# following commands have a special meaning inside the header: $title,
1619+# $datetime, $date, $doxygenversion, $projectname, $projectnumber. Doxygen will
1620+# replace them by respectively the title of the page, the current date and time,
1621+# only the current date, the version number of doxygen, the project name (see
1622+# PROJECT_NAME), or the project number (see PROJECT_NUMBER).
1623+# This tag requires that the tag GENERATE_LATEX is set to YES.
1624+
1625+LATEX_HEADER =
1626+
1627+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
1628+# generated LaTeX document. The footer should contain everything after the last
1629+# chapter. If it is left blank doxygen will generate a standard footer.
1630+#
1631+# Note: Only use a user-defined footer if you know what you are doing!
1632+# This tag requires that the tag GENERATE_LATEX is set to YES.
1633+
1634+LATEX_FOOTER =
1635+
1636+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
1637+# other source files which should be copied to the LATEX_OUTPUT output
1638+# directory. Note that the files will be copied as-is; there are no commands or
1639+# markers available.
1640+# This tag requires that the tag GENERATE_LATEX is set to YES.
1641+
1642+LATEX_EXTRA_FILES =
1643+
1644+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
1645+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
1646+# contain links (just like the HTML output) instead of page references. This
1647+# makes the output suitable for online browsing using a PDF viewer.
1648+# The default value is: YES.
1649+# This tag requires that the tag GENERATE_LATEX is set to YES.
1650+
1651+PDF_HYPERLINKS = YES
1652+
1653+# If the LATEX_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
1654+# the PDF file directly from the LaTeX files. Set this option to YES to get a
1655+# higher quality PDF documentation.
1656+# The default value is: YES.
1657+# This tag requires that the tag GENERATE_LATEX is set to YES.
1658+
1659+USE_PDFLATEX = YES
1660+
1661+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
1662+# command to the generated LaTeX files. This will instruct LaTeX to keep running
1663+# if errors occur, instead of asking the user for help. This option is also used
1664+# when generating formulas in HTML.
1665+# The default value is: NO.
1666+# This tag requires that the tag GENERATE_LATEX is set to YES.
1667+
1668+LATEX_BATCHMODE = NO
1669+
1670+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
1671+# index chapters (such as File Index, Compound Index, etc.) in the output.
1672+# The default value is: NO.
1673+# This tag requires that the tag GENERATE_LATEX is set to YES.
1674+
1675+LATEX_HIDE_INDICES = NO
1676+
1677+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
1678+# code with syntax highlighting in the LaTeX output.
1679+#
1680+# Note that which sources are shown also depends on other settings such as
1681+# SOURCE_BROWSER.
1682+# The default value is: NO.
1683+# This tag requires that the tag GENERATE_LATEX is set to YES.
1684+
1685+LATEX_SOURCE_CODE = NO
1686+
1687+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
1688+# bibliography, e.g. plainnat, or ieeetr. See
1689+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
1690+# The default value is: plain.
1691+# This tag requires that the tag GENERATE_LATEX is set to YES.
1692+
1693+LATEX_BIB_STYLE = plain
1694+
1695+#---------------------------------------------------------------------------
1696+# Configuration options related to the RTF output
1697+#---------------------------------------------------------------------------
1698+
1699+# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The
1700+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
1701+# readers/editors.
1702+# The default value is: NO.
1703+
1704+GENERATE_RTF = NO
1705+
1706+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
1707+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
1708+# it.
1709+# The default directory is: rtf.
1710+# This tag requires that the tag GENERATE_RTF is set to YES.
1711+
1712+RTF_OUTPUT = rtf
1713+
1714+# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF
1715+# documents. This may be useful for small projects and may help to save some
1716+# trees in general.
1717+# The default value is: NO.
1718+# This tag requires that the tag GENERATE_RTF is set to YES.
1719+
1720+COMPACT_RTF = NO
1721+
1722+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
1723+# contain hyperlink fields. The RTF file will contain links (just like the HTML
1724+# output) instead of page references. This makes the output suitable for online
1725+# browsing using Word or some other Word compatible readers that support those
1726+# fields.
1727+#
1728+# Note: WordPad (write) and others do not support links.
1729+# The default value is: NO.
1730+# This tag requires that the tag GENERATE_RTF is set to YES.
1731+
1732+RTF_HYPERLINKS = NO
1733+
1734+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
1735+# file, i.e. a series of assignments. You only have to provide replacements,
1736+# missing definitions are set to their default value.
1737+#
1738+# See also section "Doxygen usage" for information on how to generate the
1739+# default style sheet that doxygen normally uses.
1740+# This tag requires that the tag GENERATE_RTF is set to YES.
1741+
1742+RTF_STYLESHEET_FILE =
1743+
1744+# Set optional variables used in the generation of an RTF document. Syntax is
1745+# similar to doxygen's config file. A template extensions file can be generated
1746+# using doxygen -e rtf extensionFile.
1747+# This tag requires that the tag GENERATE_RTF is set to YES.
1748+
1749+RTF_EXTENSIONS_FILE =
1750+
1751+#---------------------------------------------------------------------------
1752+# Configuration options related to the man page output
1753+#---------------------------------------------------------------------------
1754+
1755+# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for
1756+# classes and files.
1757+# The default value is: NO.
1758+
1759+GENERATE_MAN = NO
1760+
1761+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
1762+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
1763+# it. A directory man3 will be created inside the directory specified by
1764+# MAN_OUTPUT.
1765+# The default directory is: man.
1766+# This tag requires that the tag GENERATE_MAN is set to YES.
1767+
1768+MAN_OUTPUT = man
1769+
1770+# The MAN_EXTENSION tag determines the extension that is added to the generated
1771+# man pages. In case the manual section does not start with a number, the number
1772+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
1773+# optional.
1774+# The default value is: .3.
1775+# This tag requires that the tag GENERATE_MAN is set to YES.
1776+
1777+MAN_EXTENSION = .3
1778+
1779+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
1780+# will generate one additional man file for each entity documented in the real
1781+# man page(s). These additional files only source the real man page, but without
1782+# them the man command would be unable to find the correct page.
1783+# The default value is: NO.
1784+# This tag requires that the tag GENERATE_MAN is set to YES.
1785+
1786+MAN_LINKS = NO
1787+
1788+#---------------------------------------------------------------------------
1789+# Configuration options related to the XML output
1790+#---------------------------------------------------------------------------
1791+
1792+# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that
1793+# captures the structure of the code including all documentation.
1794+# The default value is: NO.
1795+
1796+GENERATE_XML = NO
1797+
1798+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
1799+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
1800+# it.
1801+# The default directory is: xml.
1802+# This tag requires that the tag GENERATE_XML is set to YES.
1803+
1804+XML_OUTPUT = xml
1805+
1806+# The XML_SCHEMA tag can be used to specify a XML schema, which can be used by a
1807+# validating XML parser to check the syntax of the XML files.
1808+# This tag requires that the tag GENERATE_XML is set to YES.
1809+
1810+XML_SCHEMA =
1811+
1812+# The XML_DTD tag can be used to specify a XML DTD, which can be used by a
1813+# validating XML parser to check the syntax of the XML files.
1814+# This tag requires that the tag GENERATE_XML is set to YES.
1815+
1816+XML_DTD =
1817+
1818+# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
1819+# listings (including syntax highlighting and cross-referencing information) to
1820+# the XML output. Note that enabling this will significantly increase the size
1821+# of the XML output.
1822+# The default value is: YES.
1823+# This tag requires that the tag GENERATE_XML is set to YES.
1824+
1825+XML_PROGRAMLISTING = YES
1826+
1827+#---------------------------------------------------------------------------
1828+# Configuration options related to the DOCBOOK output
1829+#---------------------------------------------------------------------------
1830+
1831+# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files
1832+# that can be used to generate PDF.
1833+# The default value is: NO.
1834+
1835+GENERATE_DOCBOOK = NO
1836+
1837+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
1838+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
1839+# front of it.
1840+# The default directory is: docbook.
1841+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
1842+
1843+DOCBOOK_OUTPUT = docbook
1844+
1845+#---------------------------------------------------------------------------
1846+# Configuration options for the AutoGen Definitions output
1847+#---------------------------------------------------------------------------
1848+
1849+# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen
1850+# Definitions (see http://autogen.sf.net) file that captures the structure of
1851+# the code including all documentation. Note that this feature is still
1852+# experimental and incomplete at the moment.
1853+# The default value is: NO.
1854+
1855+GENERATE_AUTOGEN_DEF = NO
1856+
1857+#---------------------------------------------------------------------------
1858+# Configuration options related to the Perl module output
1859+#---------------------------------------------------------------------------
1860+
1861+# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module
1862+# file that captures the structure of the code including all documentation.
1863+#
1864+# Note that this feature is still experimental and incomplete at the moment.
1865+# The default value is: NO.
1866+
1867+GENERATE_PERLMOD = NO
1868+
1869+# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary
1870+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
1871+# output from the Perl module output.
1872+# The default value is: NO.
1873+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
1874+
1875+PERLMOD_LATEX = NO
1876+
1877+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely
1878+# formatted so it can be parsed by a human reader. This is useful if you want to
1879+# understand what is going on. On the other hand, if this tag is set to NO the
1880+# size of the Perl module output will be much smaller and Perl will parse it
1881+# just the same.
1882+# The default value is: YES.
1883+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
1884+
1885+PERLMOD_PRETTY = YES
1886+
1887+# The names of the make variables in the generated doxyrules.make file are
1888+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
1889+# so different doxyrules.make files included by the same Makefile don't
1890+# overwrite each other's variables.
1891+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
1892+
1893+PERLMOD_MAKEVAR_PREFIX =
1894+
1895+#---------------------------------------------------------------------------
1896+# Configuration options related to the preprocessor
1897+#---------------------------------------------------------------------------
1898+
1899+# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all
1900+# C-preprocessor directives found in the sources and include files.
1901+# The default value is: YES.
1902+
1903+ENABLE_PREPROCESSING = YES
1904+
1905+# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names
1906+# in the source code. If set to NO only conditional compilation will be
1907+# performed. Macro expansion can be done in a controlled way by setting
1908+# EXPAND_ONLY_PREDEF to YES.
1909+# The default value is: NO.
1910+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
1911+
1912+MACRO_EXPANSION = NO
1913+
1914+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
1915+# the macro expansion is limited to the macros specified with the PREDEFINED and
1916+# EXPAND_AS_DEFINED tags.
1917+# The default value is: NO.
1918+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
1919+
1920+EXPAND_ONLY_PREDEF = NO
1921+
1922+# If the SEARCH_INCLUDES tag is set to YES the includes files in the
1923+# INCLUDE_PATH will be searched if a #include is found.
1924+# The default value is: YES.
1925+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
1926+
1927+SEARCH_INCLUDES = YES
1928+
1929+# The INCLUDE_PATH tag can be used to specify one or more directories that
1930+# contain include files that are not input files but should be processed by the
1931+# preprocessor.
1932+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
1933+
1934+INCLUDE_PATH =
1935+
1936+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
1937+# patterns (like *.h and *.hpp) to filter out the header-files in the
1938+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
1939+# used.
1940+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
1941+
1942+INCLUDE_FILE_PATTERNS =
1943+
1944+# The PREDEFINED tag can be used to specify one or more macro names that are
1945+# defined before the preprocessor is started (similar to the -D option of e.g.
1946+# gcc). The argument of the tag is a list of macros of the form: name or
1947+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
1948+# is assumed. To prevent a macro definition from being undefined via #undef or
1949+# recursively expanded use the := operator instead of the = operator.
1950+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
1951+
1952+PREDEFINED =
1953+
1954+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
1955+# tag can be used to specify a list of macro names that should be expanded. The
1956+# macro definition that is found in the sources will be used. Use the PREDEFINED
1957+# tag if you want to use a different macro definition that overrules the
1958+# definition found in the source code.
1959+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
1960+
1961+EXPAND_AS_DEFINED =
1962+
1963+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
1964+# remove all refrences to function-like macros that are alone on a line, have an
1965+# all uppercase name, and do not end with a semicolon. Such function macros are
1966+# typically used for boiler-plate code, and will confuse the parser if not
1967+# removed.
1968+# The default value is: YES.
1969+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
1970+
1971+SKIP_FUNCTION_MACROS = YES
1972+
1973+#---------------------------------------------------------------------------
1974+# Configuration options related to external references
1975+#---------------------------------------------------------------------------
1976+
1977+# The TAGFILES tag can be used to specify one or more tag files. For each tag
1978+# file the location of the external documentation should be added. The format of
1979+# a tag file without this location is as follows:
1980+# TAGFILES = file1 file2 ...
1981+# Adding location for the tag files is done as follows:
1982+# TAGFILES = file1=loc1 "file2 = loc2" ...
1983+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
1984+# section "Linking to external documentation" for more information about the use
1985+# of tag files.
1986+# Note: Each tag file must have an unique name (where the name does NOT include
1987+# the path). If a tag file is not located in the directory in which doxygen is
1988+# run, you must also specify the path to the tagfile here.
1989+
1990+TAGFILES =
1991+
1992+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
1993+# tag file that is based on the input files it reads. See section "Linking to
1994+# external documentation" for more information about the usage of tag files.
1995+
1996+GENERATE_TAGFILE =
1997+
1998+# If the ALLEXTERNALS tag is set to YES all external class will be listed in the
1999+# class index. If set to NO only the inherited external classes will be listed.
2000+# The default value is: NO.
2001+
2002+ALLEXTERNALS = NO
2003+
2004+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in
2005+# the modules index. If set to NO, only the current project's groups will be
2006+# listed.
2007+# The default value is: YES.
2008+
2009+EXTERNAL_GROUPS = YES
2010+
2011+# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in
2012+# the related pages index. If set to NO, only the current project's pages will
2013+# be listed.
2014+# The default value is: YES.
2015+
2016+EXTERNAL_PAGES = YES
2017+
2018+# The PERL_PATH should be the absolute path and name of the perl script
2019+# interpreter (i.e. the result of 'which perl').
2020+# The default file (with absolute path) is: /usr/bin/perl.
2021+
2022+PERL_PATH = /usr/bin/perl
2023+
2024+#---------------------------------------------------------------------------
2025+# Configuration options related to the dot tool
2026+#---------------------------------------------------------------------------
2027+
2028+# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram
2029+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
2030+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
2031+# disabled, but it is recommended to install and use dot, since it yields more
2032+# powerful graphs.
2033+# The default value is: YES.
2034+
2035+CLASS_DIAGRAMS = YES
2036+
2037+# You can define message sequence charts within doxygen comments using the \msc
2038+# command. Doxygen will then run the mscgen tool (see:
2039+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
2040+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
2041+# the mscgen tool resides. If left empty the tool is assumed to be found in the
2042+# default search path.
2043+
2044+MSCGEN_PATH =
2045+
2046+# You can include diagrams made with dia in doxygen documentation. Doxygen will
2047+# then run dia to produce the diagram and insert it in the documentation. The
2048+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
2049+# If left empty dia is assumed to be found in the default search path.
2050+
2051+DIA_PATH =
2052+
2053+# If set to YES, the inheritance and collaboration graphs will hide inheritance
2054+# and usage relations if the target is undocumented or is not a class.
2055+# The default value is: YES.
2056+
2057+HIDE_UNDOC_RELATIONS = YES
2058+
2059+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
2060+# available from the path. This tool is part of Graphviz (see:
2061+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
2062+# Bell Labs. The other options in this section have no effect if this option is
2063+# set to NO
2064+# The default value is: NO.
2065+
2066+HAVE_DOT = YES
2067+
2068+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
2069+# to run in parallel. When set to 0 doxygen will base this on the number of
2070+# processors available in the system. You can set it explicitly to a value
2071+# larger than 0 to get control over the balance between CPU load and processing
2072+# speed.
2073+# Minimum value: 0, maximum value: 32, default value: 0.
2074+# This tag requires that the tag HAVE_DOT is set to YES.
2075+
2076+DOT_NUM_THREADS = 0
2077+
2078+# When you want a differently looking font n the dot files that doxygen
2079+# generates you can specify the font name using DOT_FONTNAME. You need to make
2080+# sure dot is able to find the font, which can be done by putting it in a
2081+# standard location or by setting the DOTFONTPATH environment variable or by
2082+# setting DOT_FONTPATH to the directory containing the font.
2083+# The default value is: Helvetica.
2084+# This tag requires that the tag HAVE_DOT is set to YES.
2085+
2086+DOT_FONTNAME = Helvetica
2087+
2088+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
2089+# dot graphs.
2090+# Minimum value: 4, maximum value: 24, default value: 10.
2091+# This tag requires that the tag HAVE_DOT is set to YES.
2092+
2093+DOT_FONTSIZE = 10
2094+
2095+# By default doxygen will tell dot to use the default font as specified with
2096+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
2097+# the path where dot can find it using this tag.
2098+# This tag requires that the tag HAVE_DOT is set to YES.
2099+
2100+DOT_FONTPATH =
2101+
2102+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
2103+# each documented class showing the direct and indirect inheritance relations.
2104+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
2105+# The default value is: YES.
2106+# This tag requires that the tag HAVE_DOT is set to YES.
2107+
2108+CLASS_GRAPH = YES
2109+
2110+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
2111+# graph for each documented class showing the direct and indirect implementation
2112+# dependencies (inheritance, containment, and class references variables) of the
2113+# class with other documented classes.
2114+# The default value is: YES.
2115+# This tag requires that the tag HAVE_DOT is set to YES.
2116+
2117+COLLABORATION_GRAPH = YES
2118+
2119+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
2120+# groups, showing the direct groups dependencies.
2121+# The default value is: YES.
2122+# This tag requires that the tag HAVE_DOT is set to YES.
2123+
2124+GROUP_GRAPHS = YES
2125+
2126+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
2127+# collaboration diagrams in a style similar to the OMG's Unified Modeling
2128+# Language.
2129+# The default value is: NO.
2130+# This tag requires that the tag HAVE_DOT is set to YES.
2131+
2132+UML_LOOK = NO
2133+
2134+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
2135+# class node. If there are many fields or methods and many nodes the graph may
2136+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
2137+# number of items for each type to make the size more manageable. Set this to 0
2138+# for no limit. Note that the threshold may be exceeded by 50% before the limit
2139+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
2140+# but if the number exceeds 15, the total amount of fields shown is limited to
2141+# 10.
2142+# Minimum value: 0, maximum value: 100, default value: 10.
2143+# This tag requires that the tag HAVE_DOT is set to YES.
2144+
2145+UML_LIMIT_NUM_FIELDS = 10
2146+
2147+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
2148+# collaboration graphs will show the relations between templates and their
2149+# instances.
2150+# The default value is: NO.
2151+# This tag requires that the tag HAVE_DOT is set to YES.
2152+
2153+TEMPLATE_RELATIONS = NO
2154+
2155+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
2156+# YES then doxygen will generate a graph for each documented file showing the
2157+# direct and indirect include dependencies of the file with other documented
2158+# files.
2159+# The default value is: YES.
2160+# This tag requires that the tag HAVE_DOT is set to YES.
2161+
2162+INCLUDE_GRAPH = YES
2163+
2164+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
2165+# set to YES then doxygen will generate a graph for each documented file showing
2166+# the direct and indirect include dependencies of the file with other documented
2167+# files.
2168+# The default value is: YES.
2169+# This tag requires that the tag HAVE_DOT is set to YES.
2170+
2171+INCLUDED_BY_GRAPH = YES
2172+
2173+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
2174+# dependency graph for every global function or class method.
2175+#
2176+# Note that enabling this option will significantly increase the time of a run.
2177+# So in most cases it will be better to enable call graphs for selected
2178+# functions only using the \callgraph command.
2179+# The default value is: NO.
2180+# This tag requires that the tag HAVE_DOT is set to YES.
2181+
2182+CALL_GRAPH = NO
2183+
2184+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
2185+# dependency graph for every global function or class method.
2186+#
2187+# Note that enabling this option will significantly increase the time of a run.
2188+# So in most cases it will be better to enable caller graphs for selected
2189+# functions only using the \callergraph command.
2190+# The default value is: NO.
2191+# This tag requires that the tag HAVE_DOT is set to YES.
2192+
2193+CALLER_GRAPH = NO
2194+
2195+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
2196+# hierarchy of all classes instead of a textual one.
2197+# The default value is: YES.
2198+# This tag requires that the tag HAVE_DOT is set to YES.
2199+
2200+GRAPHICAL_HIERARCHY = YES
2201+
2202+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
2203+# dependencies a directory has on other directories in a graphical way. The
2204+# dependency relations are determined by the #include relations between the
2205+# files in the directories.
2206+# The default value is: YES.
2207+# This tag requires that the tag HAVE_DOT is set to YES.
2208+
2209+DIRECTORY_GRAPH = YES
2210+
2211+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
2212+# generated by dot.
2213+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
2214+# to make the SVG files visible in IE 9+ (other browsers do not have this
2215+# requirement).
2216+# Possible values are: png, jpg, gif and svg.
2217+# The default value is: png.
2218+# This tag requires that the tag HAVE_DOT is set to YES.
2219+
2220+DOT_IMAGE_FORMAT = png
2221+
2222+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
2223+# enable generation of interactive SVG images that allow zooming and panning.
2224+#
2225+# Note that this requires a modern browser other than Internet Explorer. Tested
2226+# and working are Firefox, Chrome, Safari, and Opera.
2227+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
2228+# the SVG files visible. Older versions of IE do not have SVG support.
2229+# The default value is: NO.
2230+# This tag requires that the tag HAVE_DOT is set to YES.
2231+
2232+INTERACTIVE_SVG = NO
2233+
2234+# The DOT_PATH tag can be used to specify the path where the dot tool can be
2235+# found. If left blank, it is assumed the dot tool can be found in the path.
2236+# This tag requires that the tag HAVE_DOT is set to YES.
2237+
2238+DOT_PATH =
2239+
2240+# The DOTFILE_DIRS tag can be used to specify one or more directories that
2241+# contain dot files that are included in the documentation (see the \dotfile
2242+# command).
2243+# This tag requires that the tag HAVE_DOT is set to YES.
2244+
2245+DOTFILE_DIRS =
2246+
2247+# The MSCFILE_DIRS tag can be used to specify one or more directories that
2248+# contain msc files that are included in the documentation (see the \mscfile
2249+# command).
2250+
2251+MSCFILE_DIRS =
2252+
2253+# The DIAFILE_DIRS tag can be used to specify one or more directories that
2254+# contain dia files that are included in the documentation (see the \diafile
2255+# command).
2256+
2257+DIAFILE_DIRS =
2258+
2259+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
2260+# that will be shown in the graph. If the number of nodes in a graph becomes
2261+# larger than this value, doxygen will truncate the graph, which is visualized
2262+# by representing a node as a red box. Note that doxygen if the number of direct
2263+# children of the root node in a graph is already larger than
2264+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
2265+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
2266+# Minimum value: 0, maximum value: 10000, default value: 50.
2267+# This tag requires that the tag HAVE_DOT is set to YES.
2268+
2269+DOT_GRAPH_MAX_NODES = 50
2270+
2271+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
2272+# generated by dot. A depth value of 3 means that only nodes reachable from the
2273+# root by following a path via at most 3 edges will be shown. Nodes that lay
2274+# further from the root node will be omitted. Note that setting this option to 1
2275+# or 2 may greatly reduce the computation time needed for large code bases. Also
2276+# note that the size of a graph can be further restricted by
2277+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
2278+# Minimum value: 0, maximum value: 1000, default value: 0.
2279+# This tag requires that the tag HAVE_DOT is set to YES.
2280+
2281+MAX_DOT_GRAPH_DEPTH = 0
2282+
2283+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
2284+# background. This is disabled by default, because dot on Windows does not seem
2285+# to support this out of the box.
2286+#
2287+# Warning: Depending on the platform used, enabling this option may lead to
2288+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
2289+# read).
2290+# The default value is: NO.
2291+# This tag requires that the tag HAVE_DOT is set to YES.
2292+
2293+DOT_TRANSPARENT = NO
2294+
2295+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
2296+# files in one run (i.e. multiple -o and -T options on the command line). This
2297+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
2298+# this, this feature is disabled by default.
2299+# The default value is: NO.
2300+# This tag requires that the tag HAVE_DOT is set to YES.
2301+
2302+DOT_MULTI_TARGETS = YES
2303+
2304+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
2305+# explaining the meaning of the various boxes and arrows in the dot generated
2306+# graphs.
2307+# The default value is: YES.
2308+# This tag requires that the tag HAVE_DOT is set to YES.
2309+
2310+GENERATE_LEGEND = YES
2311+
2312+# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot
2313+# files that are used to generate the various graphs.
2314+# The default value is: YES.
2315+# This tag requires that the tag HAVE_DOT is set to YES.
2316+
2317+DOT_CLEANUP = YES
plugins/DashViews/CMakeLists.txt+2−1
@@ -24,9 +24,10 @@ remove_definitions(-DQT_NO_KEYWORDS)
24set(QMLPLUGIN_SRC
24set(QMLPLUGIN_SRC
25 plugin.cpp
25 plugin.cpp
26 listviewwithpageheader.cpp
26 listviewwithpageheader.cpp
27− abstractjournal.cpp
27+ abstractdashview.cpp
28 verticaljournal.cpp
28 verticaljournal.cpp
29 horizontaljournal.cpp
29 horizontaljournal.cpp
30+ organicgrid.cpp
30 )
31 )
31
32
32add_library(DashViews-qml MODULE
33add_library(DashViews-qml MODULE
plugins/DashViews/abstractjournal.cpp → plugins/DashViews/abstractdashview.cpprenamed+34−34
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2014 Canonical, Ltd.
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
@@ -14,11 +14,11 @@
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
16
17−#include "abstractjournal.h"
17+#include "abstractdashview.h"
18
18
19static const qreal bufferRatio = 0.5;
19static const qreal bufferRatio = 0.5;
20
20
21−AbstractJournal::AbstractJournal()
21+AbstractDashView::AbstractDashView()
22 : m_delegateModel(nullptr)
22 : m_delegateModel(nullptr)
23 , m_asyncRequestedIndex(-1)
23 , m_asyncRequestedIndex(-1)
24 , m_columnSpacing(0)
24 , m_columnSpacing(0)
@@ -35,12 +35,12 @@ AbstractJournal::AbstractJournal()
35 connect(this, SIGNAL(heightChanged()), this, SLOT(onHeightChanged()));
35 connect(this, SIGNAL(heightChanged()), this, SLOT(onHeightChanged()));
36}
36}
37
37
38−QAbstractItemModel *AbstractJournal::model() const
38+QAbstractItemModel *AbstractDashView::model() const
39{
39{
40 return m_delegateModel ? m_delegateModel->model().value<QAbstractItemModel *>() : nullptr;
40 return m_delegateModel ? m_delegateModel->model().value<QAbstractItemModel *>() : nullptr;
41}
41}
42
42
43−void AbstractJournal::setModel(QAbstractItemModel *model)
43+void AbstractDashView::setModel(QAbstractItemModel *model)
44{
44{
45 if (model != this->model()) {
45 if (model != this->model()) {
46 if (!m_delegateModel) {
46 if (!m_delegateModel) {
@@ -65,12 +65,12 @@ void AbstractJournal::setModel(QAbstractItemModel *model)
65 }
65 }
66}
66}
67
67
68−QQmlComponent *AbstractJournal::delegate() const
68+QQmlComponent *AbstractDashView::delegate() const
69{
69{
70 return m_delegateModel ? m_delegateModel->delegate() : nullptr;
70 return m_delegateModel ? m_delegateModel->delegate() : nullptr;
71}
71}
72
72
73−void AbstractJournal::setDelegate(QQmlComponent *delegate)
73+void AbstractDashView::setDelegate(QQmlComponent *delegate)
74{
74{
75 if (delegate != this->delegate()) {
75 if (delegate != this->delegate()) {
76 if (!m_delegateModel) {
76 if (!m_delegateModel) {
@@ -87,12 +87,12 @@ void AbstractJournal::setDelegate(QQmlComponent *delegate)
87 }
87 }
88}
88}
89
89
90−qreal AbstractJournal::columnSpacing() const
90+qreal AbstractDashView::columnSpacing() const
91{
91{
92 return m_columnSpacing;
92 return m_columnSpacing;
93}
93}
94
94
95−void AbstractJournal::setColumnSpacing(qreal columnSpacing)
95+void AbstractDashView::setColumnSpacing(qreal columnSpacing)
96{
96{
97 if (columnSpacing != m_columnSpacing) {
97 if (columnSpacing != m_columnSpacing) {
98 m_columnSpacing = columnSpacing;
98 m_columnSpacing = columnSpacing;
@@ -104,12 +104,12 @@ void AbstractJournal::setColumnSpacing(qreal columnSpacing)
104 }
104 }
105}
105}
106
106
107−qreal AbstractJournal::rowSpacing() const
107+qreal AbstractDashView::rowSpacing() const
108{
108{
109 return m_rowSpacing;
109 return m_rowSpacing;
110}
110}
111
111
112−void AbstractJournal::setRowSpacing(qreal rowSpacing)
112+void AbstractDashView::setRowSpacing(qreal rowSpacing)
113{
113{
114 if (rowSpacing != m_rowSpacing) {
114 if (rowSpacing != m_rowSpacing) {
115 m_rowSpacing = rowSpacing;
115 m_rowSpacing = rowSpacing;
@@ -121,12 +121,12 @@ void AbstractJournal::setRowSpacing(qreal rowSpacing)
121 }
121 }
122}
122}
123
123
124−qreal AbstractJournal::delegateCreationBegin() const
124+qreal AbstractDashView::delegateCreationBegin() const
125{
125{
126 return m_delegateCreationBegin;
126 return m_delegateCreationBegin;
127}
127}
128
128
129−void AbstractJournal::setDelegateCreationBegin(qreal begin)
129+void AbstractDashView::setDelegateCreationBegin(qreal begin)
130{
130{
131 m_delegateCreationBeginValid = true;
131 m_delegateCreationBeginValid = true;
132 if (m_delegateCreationBegin == begin)
132 if (m_delegateCreationBegin == begin)
@@ -138,7 +138,7 @@ void AbstractJournal::setDelegateCreationBegin(qreal begin)
138 emit delegateCreationBeginChanged();
138 emit delegateCreationBeginChanged();
139}
139}
140
140
141−void AbstractJournal::resetDelegateCreationBegin()
141+void AbstractDashView::resetDelegateCreationBegin()
142{
142{
143 m_delegateCreationBeginValid = false;
143 m_delegateCreationBeginValid = false;
144 if (m_delegateCreationBegin == 0)
144 if (m_delegateCreationBegin == 0)
@@ -150,12 +150,12 @@ void AbstractJournal::resetDelegateCreationBegin()
150 emit delegateCreationBeginChanged();
150 emit delegateCreationBeginChanged();
151}
151}
152
152
153−qreal AbstractJournal::delegateCreationEnd() const
153+qreal AbstractDashView::delegateCreationEnd() const
154{
154{
155 return m_delegateCreationEnd;
155 return m_delegateCreationEnd;
156}
156}
157
157
158−void AbstractJournal::setDelegateCreationEnd(qreal end)
158+void AbstractDashView::setDelegateCreationEnd(qreal end)
159{
159{
160 m_delegateCreationEndValid = true;
160 m_delegateCreationEndValid = true;
161 if (m_delegateCreationEnd == end)
161 if (m_delegateCreationEnd == end)
@@ -167,7 +167,7 @@ void AbstractJournal::setDelegateCreationEnd(qreal end)
167 emit delegateCreationEndChanged();
167 emit delegateCreationEndChanged();
168}
168}
169
169
170−void AbstractJournal::resetDelegateCreationEnd()
170+void AbstractDashView::resetDelegateCreationEnd()
171{
171{
172 m_delegateCreationEndValid = false;
172 m_delegateCreationEndValid = false;
173 if (m_delegateCreationEnd == 0)
173 if (m_delegateCreationEnd == 0)
@@ -179,7 +179,7 @@ void AbstractJournal::resetDelegateCreationEnd()
179 emit delegateCreationEndChanged();
179 emit delegateCreationEndChanged();
180}
180}
181
181
182−void AbstractJournal::createDelegateModel()
182+void AbstractDashView::createDelegateModel()
183{
183{
184#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
184#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
185 m_delegateModel = new QQuickVisualDataModel(qmlContext(this), this);
185 m_delegateModel = new QQuickVisualDataModel(qmlContext(this), this);
@@ -192,9 +192,9 @@ void AbstractJournal::createDelegateModel()
192 m_delegateModel->componentComplete();
192 m_delegateModel->componentComplete();
193}
193}
194
194
195−void AbstractJournal::refill()
195+void AbstractDashView::refill()
196{
196{
197− if (!isComponentComplete()) {
197+ if (!isComponentComplete() || height() < 0) {
198 return;
198 return;
199 }
199 }
200
200
@@ -215,7 +215,7 @@ void AbstractJournal::refill()
215 }
215 }
216}
216}
217
217
218−bool AbstractJournal::addVisibleItems(qreal fillFromY, qreal fillToY, bool asynchronous)
218+bool AbstractDashView::addVisibleItems(qreal fillFromY, qreal fillToY, bool asynchronous)
219{
219{
220 if (!delegate())
220 if (!delegate())
221 return false;
221 return false;
@@ -247,7 +247,7 @@ bool AbstractJournal::addVisibleItems(qreal fillFromY, qreal fillToY, bool async
247 return changed;
247 return changed;
248}
248}
249
249
250−QQuickItem *AbstractJournal::createItem(int modelIndex, bool asynchronous)
250+QQuickItem *AbstractDashView::createItem(int modelIndex, bool asynchronous)
251{
251{
252 if (asynchronous && m_asyncRequestedIndex != -1)
252 if (asynchronous && m_asyncRequestedIndex != -1)
253 return nullptr;
253 return nullptr;
@@ -276,12 +276,12 @@ QQuickItem *AbstractJournal::createItem(int modelIndex, bool asynchronous)
276#endif
276#endif
277 return nullptr;
277 return nullptr;
278 } else {
278 } else {
279− positionItem(modelIndex, item);
279+ addItemToView(modelIndex, item);
280 return item;
280 return item;
281 }
281 }
282}
282}
283
283
284−void AbstractJournal::releaseItem(QQuickItem *item)
284+void AbstractDashView::releaseItem(QQuickItem *item)
285{
285{
286#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
286#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
287 QQuickVisualModel::ReleaseFlags flags = m_delegateModel->release(item);
287 QQuickVisualModel::ReleaseFlags flags = m_delegateModel->release(item);
@@ -294,20 +294,20 @@ void AbstractJournal::releaseItem(QQuickItem *item)
294 }
294 }
295}
295}
296
296
297−void AbstractJournal::setImplicitHeightDirty()
297+void AbstractDashView::setImplicitHeightDirty()
298{
298{
299 m_implicitHeightDirty = true;
299 m_implicitHeightDirty = true;
300}
300}
301
301
302#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
302#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
303−void AbstractJournal::itemCreated(int modelIndex, QQuickItem *item)
303+void AbstractDashView::itemCreated(int modelIndex, QQuickItem *item)
304{
304{
305#else
305#else
306−void AbstractJournal::itemCreated(int modelIndex, QObject *object)
306+void AbstractDashView::itemCreated(int modelIndex, QObject *object)
307{
307{
308 QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
308 QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
309 if (!item) {
309 if (!item) {
310− qWarning() << "AbstractJournal::itemCreated got a non item for index" << modelIndex;
310+ qWarning() << "AbstractDashView::itemCreated got a non item for index" << modelIndex;
311 return;
311 return;
312 }
312 }
313#endif
313#endif
@@ -326,9 +326,9 @@ void AbstractJournal::itemCreated(int modelIndex, QObject *object)
326}
326}
327
327
328#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
328#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
329−void AbstractJournal::onModelUpdated(const QQuickChangeSet &changeSet, bool reset)
329+void AbstractDashView::onModelUpdated(const QQuickChangeSet &changeSet, bool reset)
330#else
330#else
331−void AbstractJournal::onModelUpdated(const QQmlChangeSet &changeSet, bool reset)
331+void AbstractDashView::onModelUpdated(const QQmlChangeSet &changeSet, bool reset)
332#endif
332#endif
333{
333{
334 if (reset) {
334 if (reset) {
@@ -340,18 +340,18 @@ void AbstractJournal::onModelUpdated(const QQmlChangeSet &changeSet, bool reset)
340}
340}
341
341
342
342
343−void AbstractJournal::relayout()
343+void AbstractDashView::relayout()
344{
344{
345 m_needsRelayout = true;
345 m_needsRelayout = true;
346 polish();
346 polish();
347}
347}
348
348
349−void AbstractJournal::onHeightChanged()
349+void AbstractDashView::onHeightChanged()
350{
350{
351 polish();
351 polish();
352}
352}
353
353
354−void AbstractJournal::updatePolish()
354+void AbstractDashView::updatePolish()
355{
355{
356 if (!model())
356 if (!model())
357 return;
357 return;
@@ -375,7 +375,7 @@ void AbstractJournal::updatePolish()
375 }
375 }
376}
376}
377
377
378−void AbstractJournal::componentComplete()
378+void AbstractDashView::componentComplete()
379{
379{
380 if (m_delegateModel)
380 if (m_delegateModel)
381 m_delegateModel->componentComplete();
381 m_delegateModel->componentComplete();
plugins/DashViews/abstractjournal.h → plugins/DashViews/abstractdashview.hrenamed+7−6
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2014 Canonical, Ltd.
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
@@ -14,8 +14,8 @@
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
16
17−#ifndef ABSTRACTJOURNAL_H
17+#ifndef ABSTRACTDASHVIEW_H
18−#define ABSTRACTJOURNAL_H
18+#define ABSTRACTDASHVIEW_H
19
19
20#include <QQuickItem>
20#include <QQuickItem>
21
21
@@ -31,7 +31,7 @@ class QQmlComponent;
31#endif
31#endif
32#pragma GCC diagnostic pop
32#pragma GCC diagnostic pop
33
33
34−class AbstractJournal : public QQuickItem
34+class AbstractDashView : public QQuickItem
35{
35{
36 Q_OBJECT
36 Q_OBJECT
37
37
@@ -50,9 +50,10 @@ class AbstractJournal : public QQuickItem
50
50
51friend class VerticalJournalTest;
51friend class VerticalJournalTest;
52friend class HorizontalJournalTest;
52friend class HorizontalJournalTest;
53+friend class OrganicGridTest;
53
54
54public:
55public:
55− AbstractJournal();
56+ AbstractDashView();
56
57
57 QAbstractItemModel *model() const;
58 QAbstractItemModel *model() const;
58 void setModel(QAbstractItemModel *model);
59 void setModel(QAbstractItemModel *model);
@@ -110,7 +111,7 @@ private:
110
111
111 virtual void findBottomModelIndexToAdd(int *modelIndex, qreal *yPos) = 0;
112 virtual void findBottomModelIndexToAdd(int *modelIndex, qreal *yPos) = 0;
112 virtual void findTopModelIndexToAdd(int *modelIndex, qreal *yPos) = 0;
113 virtual void findTopModelIndexToAdd(int *modelIndex, qreal *yPos) = 0;
113− virtual void positionItem(int modelIndex, QQuickItem *item) = 0;
114+ virtual void addItemToView(int modelIndex, QQuickItem *item) = 0;
114 virtual bool removeNonVisibleItems(qreal bufferFromY, qreal bufferToY) = 0;
115 virtual bool removeNonVisibleItems(qreal bufferFromY, qreal bufferToY) = 0;
115 virtual void cleanupExistingItems() = 0;
116 virtual void cleanupExistingItems() = 0;
116 virtual void doRelayout() = 0;
117 virtual void doRelayout() = 0;
plugins/DashViews/horizontaljournal.cpp+4−3
@@ -118,7 +118,7 @@ bool HorizontalJournal::removeNonVisibleItems(qreal bufferFromY, qreal bufferToY
118 return changed;
118 return changed;
119}
119}
120
120
121−void HorizontalJournal::positionItem(int modelIndex, QQuickItem *item)
121+void HorizontalJournal::addItemToView(int modelIndex, QQuickItem *item)
122{
122{
123 if (item->height() != m_rowHeight) {
123 if (item->height() != m_rowHeight) {
124 qWarning() << "Item" << modelIndex << "height is not the one that the rowHeight mandates, resetting it";
124 qWarning() << "Item" << modelIndex << "height is not the one that the rowHeight mandates, resetting it";
@@ -159,7 +159,7 @@ void HorizontalJournal::positionItem(int modelIndex, QQuickItem *item)
159 m_firstVisibleIndex = modelIndex;
159 m_firstVisibleIndex = modelIndex;
160 m_visibleItems.prepend(item);
160 m_visibleItems.prepend(item);
161 } else {
161 } else {
162− qWarning() << "HorizontalJournal::positionItem - Got unexpected modelIndex"
162+ qWarning() << "HorizontalJournal::addItemToView - Got unexpected modelIndex"
163 << modelIndex << m_firstVisibleIndex << m_visibleItems.count();
163 << modelIndex << m_firstVisibleIndex << m_visibleItems.count();
164 }
164 }
165 }
165 }
@@ -173,6 +173,7 @@ void HorizontalJournal::cleanupExistingItems()
173 m_visibleItems.clear();
173 m_visibleItems.clear();
174 m_lastInRowIndexPosition.clear();
174 m_lastInRowIndexPosition.clear();
175 m_firstVisibleIndex = -1;
175 m_firstVisibleIndex = -1;
176+ setImplicitHeightDirty();
176}
177}
177
178
178void HorizontalJournal::calculateImplicitHeight()
179void HorizontalJournal::calculateImplicitHeight()
@@ -232,7 +233,7 @@ void HorizontalJournal::doRelayout()
232 m_visibleItems.clear();
233 m_visibleItems.clear();
233 m_lastInRowIndexPosition.clear();
234 m_lastInRowIndexPosition.clear();
234 Q_FOREACH(QQuickItem *item, allItems) {
235 Q_FOREACH(QQuickItem *item, allItems) {
235− positionItem(i, item);
236+ addItemToView(i, item);
236 ++i;
237 ++i;
237 }
238 }
238 } else {
239 } else {
plugins/DashViews/horizontaljournal.h+3−3
@@ -17,7 +17,7 @@
17#ifndef HORIZONTALJOURNAL_H
17#ifndef HORIZONTALJOURNAL_H
18#define HORIZONTALJOURNAL_H
18#define HORIZONTALJOURNAL_H
19
19
20−#include "abstractjournal.h"
20+#include "abstractdashview.h"
21
21
22 /** A horizontal journal is a view that creates delegates
22 /** A horizontal journal is a view that creates delegates
23 * based on a model and layouts them one after the other
23 * based on a model and layouts them one after the other
@@ -26,7 +26,7 @@
26 *
26 *
27 * All delegates are forced to rowHeight if they don't have it.
27 * All delegates are forced to rowHeight if they don't have it.
28 */
28 */
29− class HorizontalJournal : public AbstractJournal
29+ class HorizontalJournal : public AbstractDashView
30{
30{
31 Q_OBJECT
31 Q_OBJECT
32
32
@@ -47,7 +47,7 @@ private:
47 void findBottomModelIndexToAdd(int *modelIndex, qreal *yPos) override;
47 void findBottomModelIndexToAdd(int *modelIndex, qreal *yPos) override;
48 void findTopModelIndexToAdd(int *modelIndex, qreal *yPos) override;
48 void findTopModelIndexToAdd(int *modelIndex, qreal *yPos) override;
49 bool removeNonVisibleItems(qreal bufferFromY, qreal bufferToY) override;
49 bool removeNonVisibleItems(qreal bufferFromY, qreal bufferToY) override;
50− void positionItem(int modelIndex, QQuickItem *item) override;
50+ void addItemToView(int modelIndex, QQuickItem *item) override;
51 void cleanupExistingItems() override;
51 void cleanupExistingItems() override;
52 void calculateImplicitHeight() override;
52 void calculateImplicitHeight() override;
53 void doRelayout() override;
53 void doRelayout() override;
plugins/DashViews/organicgrid.cppnew file+268
@@ -0,0 +1,268 @@
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+#include "organicgrid.h"
18+
19+#pragma GCC diagnostic push
20+#pragma GCC diagnostic ignored "-pedantic"
21+#include <private/qquickitem_p.h>
22+#pragma GCC diagnostic pop
23+
24+static const qreal bufferRatio = 0.5;
25+
26+OrganicGrid::OrganicGrid()
27+ : m_firstVisibleIndex(-1)
28+ , m_numberOfModulesPerRow(-1)
29+{
30+}
31+
32+QSizeF OrganicGrid::smallDelegateSize() const
33+{
34+ return m_smallDelegateSize;
35+}
36+
37+void OrganicGrid::setSmallDelegateSize(const QSizeF &size)
38+{
39+ if (m_smallDelegateSize != size) {
40+ m_smallDelegateSize = size;
41+ Q_EMIT smallDelegateSizeChanged();
42+
43+ if (isComponentComplete()) {
44+ relayout();
45+ }
46+ }
47+}
48+
49+QSizeF OrganicGrid::bigDelegateSize() const
50+{
51+ return m_bigDelegateSize;
52+}
53+
54+void OrganicGrid::setBigDelegateSize(const QSizeF &size)
55+{
56+ if (m_bigDelegateSize != size) {
57+ m_bigDelegateSize = size;
58+ Q_EMIT bigDelegateSizeChanged();
59+
60+ if (isComponentComplete()) {
61+ relayout();
62+ }
63+ }
64+}
65+
66+QPointF OrganicGrid::positionForIndex(int modelIndex) const
67+{
68+ const qreal moduleHeight = m_smallDelegateSize.height() + rowSpacing() + m_bigDelegateSize.height();
69+ const qreal moduleWidth = m_smallDelegateSize.width() * 2 + columnSpacing() * 2 + m_bigDelegateSize.width();
70+ const int itemsPerRow = m_numberOfModulesPerRow * 6;
71+ const int rowIndex = floor(modelIndex / itemsPerRow);
72+ const int columnIndex = floor((modelIndex - rowIndex * itemsPerRow) / 6);
73+
74+ qreal yPos = (moduleHeight + rowSpacing()) * rowIndex;
75+ const int moduleIndex = modelIndex % 6;
76+ if (moduleIndex == 2) {
77+ yPos += m_smallDelegateSize.height() + rowSpacing();
78+ } else if (moduleIndex == 3 || moduleIndex == 5) {
79+ yPos += m_bigDelegateSize.height() + rowSpacing();
80+ }
81+
82+ qreal xPos = (moduleWidth + columnSpacing()) * columnIndex;
83+ if (moduleIndex == 1) {
84+ xPos += m_smallDelegateSize.width() + columnSpacing();
85+ } else if (moduleIndex == 3) {
86+ xPos += m_bigDelegateSize.width() + columnSpacing();
87+ } else if (moduleIndex == 4) {
88+ xPos += (m_smallDelegateSize.width() + columnSpacing()) * 2;
89+ } else if (moduleIndex == 5) {
90+ xPos += m_bigDelegateSize.width() + m_smallDelegateSize.width() + columnSpacing() * 2;
91+ }
92+
93+ return QPointF(xPos, yPos);
94+}
95+
96+QSizeF OrganicGrid::sizeForIndex(int modelIndex) const
97+{
98+ const int moduleIndex = modelIndex % 6;
99+ if (moduleIndex == 0 || moduleIndex == 1 || moduleIndex == 3 || moduleIndex == 5) {
100+ return m_smallDelegateSize;
101+ } else {
102+ return m_bigDelegateSize;
103+ }
104+}
105+
106+void OrganicGrid::findBottomModelIndexToAdd(int *modelIndex, qreal *yPos)
107+{
108+ if (m_visibleItems.isEmpty()) {
109+ *modelIndex = 0;
110+ *yPos = 0;
111+ } else {
112+ *modelIndex = m_firstVisibleIndex + m_visibleItems.count();
113+ // We create stuff in a 6-module basis, so always return back
114+ // the y position of the first item
115+ const int firstModuleIndex = ((*modelIndex) / 6) * 6;
116+ *yPos = positionForIndex(firstModuleIndex).y();
117+ }
118+}
119+
120+void OrganicGrid::findTopModelIndexToAdd(int *modelIndex, qreal *yPos)
121+{
122+ if (m_visibleItems.isEmpty()) {
123+ *modelIndex = 0;
124+ *yPos = 0;
125+ } else {
126+ *modelIndex = m_firstVisibleIndex - 1;
127+ // We create stuff in a 6-module basis, so always return back
128+ // the y position of the last item bottom
129+ const int lastModuleIndex = ((*modelIndex) / 6) * 6 + 5;
130+ *yPos = positionForIndex(lastModuleIndex).y();
131+ *yPos += sizeForIndex(lastModuleIndex).height();
132+ }
133+}
134+
135+void OrganicGrid::addItemToView(int modelIndex, QQuickItem *item)
136+{
137+ // modelIndex has to be either m_firstVisibleIndex - 1 or m_firstVisibleIndex + m_visibleItems.count() or the first
138+ if (modelIndex == m_firstVisibleIndex + m_visibleItems.count()) {
139+ m_visibleItems << item;
140+ } else if (modelIndex == m_firstVisibleIndex - 1) {
141+ m_firstVisibleIndex = modelIndex;
142+ m_visibleItems.prepend(item);
143+ } else if (modelIndex == 0) {
144+ m_firstVisibleIndex = 0;
145+ m_visibleItems << item;
146+ } else {
147+ qWarning() << "OrganicGrid::addItemToView - Got unexpected modelIndex"
148+ << modelIndex << m_firstVisibleIndex << m_visibleItems.count();
149+ return;
150+ }
151+
152+ const QPointF pos = positionForIndex(modelIndex);
153+ item->setPosition(pos);
154+
155+ item->setSize(sizeForIndex(modelIndex));
156+}
157+
158+bool OrganicGrid::removeNonVisibleItems(qreal bufferFromY, qreal bufferToY)
159+{
160+ bool changed = false;
161+
162+ // As adding, we also remove in a 6-module basis
163+ int lastModuleIndex = (m_firstVisibleIndex / 6) * 6 + 5;
164+ bool removeIndex = positionForIndex(lastModuleIndex).y() + sizeForIndex(lastModuleIndex).height() < bufferFromY;
165+ while (removeIndex && !m_visibleItems.isEmpty()) {
166+ releaseItem(m_visibleItems.takeFirst());
167+ changed = true;
168+ m_firstVisibleIndex++;
169+
170+ lastModuleIndex = (m_firstVisibleIndex / 6) * 6 + 5;
171+ removeIndex = positionForIndex(lastModuleIndex).y() + sizeForIndex(lastModuleIndex).height() < bufferFromY;
172+ }
173+
174+ int firstModuleIndex = ((m_firstVisibleIndex + m_visibleItems.count() - 1) / 6) * 6;
175+ removeIndex = positionForIndex(firstModuleIndex).y() > bufferToY;
176+ while (removeIndex && !m_visibleItems.isEmpty()) {
177+ releaseItem(m_visibleItems.takeLast());
178+ changed = true;
179+
180+ firstModuleIndex = ((m_firstVisibleIndex + m_visibleItems.count() - 1) / 6) * 6;
181+ removeIndex = positionForIndex(firstModuleIndex).y() > bufferToY;
182+ }
183+
184+ if (m_visibleItems.isEmpty()) {
185+ m_firstVisibleIndex = -1;
186+ }
187+
188+ return changed;
189+}
190+
191+void OrganicGrid::cleanupExistingItems()
192+{
193+ Q_FOREACH(QQuickItem *item, m_visibleItems)
194+ releaseItem(item);
195+ m_visibleItems.clear();
196+ m_firstVisibleIndex = -1;
197+ setImplicitHeightDirty();
198+}
199+
200+void OrganicGrid::doRelayout()
201+{
202+ const qreal moduleWidth = m_smallDelegateSize.width() * 2 + columnSpacing() * 2 + m_bigDelegateSize.width();
203+ m_numberOfModulesPerRow = floor((width() + columnSpacing()) / (moduleWidth + columnSpacing()));
204+ m_numberOfModulesPerRow = qMax(1, m_numberOfModulesPerRow);
205+
206+ int i = m_firstVisibleIndex;
207+ const QList<QQuickItem*> allItems = m_visibleItems;
208+ m_visibleItems.clear();
209+ Q_FOREACH(QQuickItem *item, allItems) {
210+ addItemToView(i, item);
211+ ++i;
212+ }
213+}
214+
215+void OrganicGrid::updateItemCulling(qreal visibleFromY, qreal visibleToY)
216+{
217+ Q_FOREACH(QQuickItem *item, m_visibleItems) {
218+ QQuickItemPrivate::get(item)->setCulled(item->y() + item->height() <= visibleFromY || item->y() >= visibleToY);
219+ }
220+}
221+
222+void OrganicGrid::calculateImplicitHeight()
223+{
224+ const qreal moduleHeight = m_smallDelegateSize.height() + rowSpacing() + m_bigDelegateSize.height();
225+ const int itemCount = !model() ? 0 : model()->rowCount();
226+ const int itemsPerRow = m_numberOfModulesPerRow * 6;
227+ const int fullRows = floor(itemCount / itemsPerRow);
228+ const qreal fullRowsHeight = fullRows == 0 ? 0 : fullRows * moduleHeight + rowSpacing() * (fullRows - 1);
229+
230+ const int remainingItems = itemCount - fullRows * itemsPerRow;
231+ if (remainingItems == 0) {
232+ setImplicitHeight(fullRowsHeight);
233+ } else if (remainingItems <= 2) {
234+ setImplicitHeight(fullRowsHeight + m_smallDelegateSize.height() + rowSpacing());
235+ } else {
236+ setImplicitHeight(fullRowsHeight + rowSpacing() + moduleHeight);
237+ }
238+}
239+
240+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
241+void OrganicGrid::processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes)
242+#else
243+void OrganicGrid::processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes)
244+#endif
245+{
246+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
247+ Q_FOREACH(const QQuickChangeSet::Remove &remove, removes) {
248+#else
249+ Q_FOREACH(const QQmlChangeSet::Remove &remove, removes) {
250+#endif
251+ for (int i = remove.count - 1; i >= 0; --i) {
252+ const int indexToRemove = remove.index + i;
253+ // We only support removing from the end
254+ const int lastIndex = m_firstVisibleIndex + m_visibleItems.count() - 1;
255+ if (indexToRemove == lastIndex) {
256+ releaseItem(m_visibleItems.takeLast());
257+ } else {
258+ if (indexToRemove < lastIndex) {
259+ qFatal("OrganicGrid only supports removal from the end of the model");
260+ }
261+ }
262+ }
263+ }
264+ if (m_visibleItems.isEmpty()) {
265+ m_firstVisibleIndex = -1;
266+ }
267+ setImplicitHeightDirty();
268+}
plugins/DashViews/organicgrid.hnew file+95
@@ -0,0 +1,95 @@
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+#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
83+ void processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes) override;
84+#else
85+ void processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes) override;
86+#endif
87+
88+ QSizeF m_smallDelegateSize;
89+ QSizeF m_bigDelegateSize;
90+ int m_firstVisibleIndex;
91+ int m_numberOfModulesPerRow;
92+ QList<QQuickItem*> m_visibleItems;
93+};
94+
95+#endif
plugins/DashViews/plugin.cpp+2
@@ -19,6 +19,7 @@
19
19
20#include "horizontaljournal.h"
20#include "horizontaljournal.h"
21#include "listviewwithpageheader.h"
21#include "listviewwithpageheader.h"
22+#include "organicgrid.h"
22#include "verticaljournal.h"
23#include "verticaljournal.h"
23
24
24#include <QAbstractItemModel>
25#include <QAbstractItemModel>
@@ -29,5 +30,6 @@ void DashViewsPlugin::registerTypes(const char *uri)
29 qmlRegisterType<QAbstractItemModel>();
30 qmlRegisterType<QAbstractItemModel>();
30 qmlRegisterType<HorizontalJournal>(uri, 0, 1, "HorizontalJournal");
31 qmlRegisterType<HorizontalJournal>(uri, 0, 1, "HorizontalJournal");
31 qmlRegisterType<ListViewWithPageHeader>(uri, 0, 1, "ListViewWithPageHeader");
32 qmlRegisterType<ListViewWithPageHeader>(uri, 0, 1, "ListViewWithPageHeader");
33+ qmlRegisterType<OrganicGrid>(uri, 0, 1, "OrganicGrid");
32 qmlRegisterType<VerticalJournal>(uri, 0, 1, "VerticalJournal");
34 qmlRegisterType<VerticalJournal>(uri, 0, 1, "VerticalJournal");
33}
35}
plugins/DashViews/verticaljournal.cpp+4−3
@@ -79,7 +79,7 @@ void VerticalJournal::findBottomModelIndexToAdd(int *modelIndex, qreal *yPos)
79
79
80void VerticalJournal::findTopModelIndexToAdd(int *modelIndex, qreal *yPos)
80void VerticalJournal::findTopModelIndexToAdd(int *modelIndex, qreal *yPos)
81{
81{
82− *modelIndex = INT_MAX;
82+ *modelIndex = 0;
83 *yPos = std::numeric_limits<qreal>::lowest();
83 *yPos = std::numeric_limits<qreal>::lowest();
84 int columnToAddTo = -1;
84 int columnToAddTo = -1;
85
85
@@ -130,7 +130,7 @@ bool VerticalJournal::removeNonVisibleItems(qreal bufferFromY, qreal bufferToY)
130 return changed;
130 return changed;
131}
131}
132
132
133−void VerticalJournal::positionItem(int modelIndex, QQuickItem *item)
133+void VerticalJournal::addItemToView(int modelIndex, QQuickItem *item)
134{
134{
135 if (item->width() != m_columnWidth) {
135 if (item->width() != m_columnWidth) {
136 qWarning() << "Item" << modelIndex << "width is not the one that the columnWidth mandates, resetting it";
136 qWarning() << "Item" << modelIndex << "width is not the one that the columnWidth mandates, resetting it";
@@ -179,6 +179,7 @@ void VerticalJournal::cleanupExistingItems()
179 column.clear();
179 column.clear();
180 }
180 }
181 m_indexColumnMap.clear();
181 m_indexColumnMap.clear();
182+ setImplicitHeightDirty();
182}
183}
183
184
184void VerticalJournal::calculateImplicitHeight()
185void VerticalJournal::calculateImplicitHeight()
@@ -220,7 +221,7 @@ void VerticalJournal::doRelayout()
220 if (!allItems.isEmpty()) {
221 if (!allItems.isEmpty()) {
221 if (allItems.first().m_modelIndex == 0) {
222 if (allItems.first().m_modelIndex == 0) {
222 Q_FOREACH(const ViewItem &item, allItems)
223 Q_FOREACH(const ViewItem &item, allItems)
223− positionItem(item.m_modelIndex, item.m_item);
224+ addItemToView(item.m_modelIndex, item.m_item);
224 } else {
225 } else {
225 Q_FOREACH(const ViewItem &item, allItems)
226 Q_FOREACH(const ViewItem &item, allItems)
226 releaseItem(item.m_item);
227 releaseItem(item.m_item);
plugins/DashViews/verticaljournal.h+3−3
@@ -17,7 +17,7 @@
17#ifndef VERTICALJOURNAL_H
17#ifndef VERTICALJOURNAL_H
18#define VERTICALJOURNAL_H
18#define VERTICALJOURNAL_H
19
19
20−#include "abstractjournal.h"
20+#include "abstractdashview.h"
21
21
22 /** A vertical journal is a view that creates delegates
22 /** A vertical journal is a view that creates delegates
23 * based on a model and layouts them in columns following
23 * based on a model and layouts them in columns following
@@ -51,7 +51,7 @@
51 *
51 *
52 */
52 */
53
53
54−class VerticalJournal : public AbstractJournal
54+class VerticalJournal : public AbstractDashView
55{
55{
56 Q_OBJECT
56 Q_OBJECT
57
57
@@ -85,7 +85,7 @@ private:
85 void findBottomModelIndexToAdd(int *modelIndex, qreal *yPos) override;
85 void findBottomModelIndexToAdd(int *modelIndex, qreal *yPos) override;
86 void findTopModelIndexToAdd(int *modelIndex, qreal *yPos) override;
86 void findTopModelIndexToAdd(int *modelIndex, qreal *yPos) override;
87 bool removeNonVisibleItems(qreal bufferFromY, qreal bufferToY) override;
87 bool removeNonVisibleItems(qreal bufferFromY, qreal bufferToY) override;
88− void positionItem(int modelIndex, QQuickItem *item) override;
88+ void addItemToView(int modelIndex, QQuickItem *item) override;
89 void cleanupExistingItems() override;
89 void cleanupExistingItems() override;
90 void calculateImplicitHeight() override;
90 void calculateImplicitHeight() override;
91 void doRelayout() override;
91 void doRelayout() override;
plugins/Unity/Indicators/CMakeLists.txt−2
@@ -12,8 +12,6 @@ find_package(Qt5Core REQUIRED)
12find_package(Qt5Quick REQUIRED)
12find_package(Qt5Quick REQUIRED)
13
13
14add_subdirectory(qml)
14add_subdirectory(qml)
15−add_subdirectory(Messaging)
16−add_subdirectory(Network)
17
15
18include_directories(
16include_directories(
19 ${CMAKE_CURRENT_SOURCE_DIR}
17 ${CMAKE_CURRENT_SOURCE_DIR}
plugins/Unity/Indicators/Messaging/CMakeLists.txtdeleted−1
@@ -1 +0,0 @@
1−add_subdirectory(qml)
plugins/Unity/Indicators/Messaging/qml/ActionTextField.qmldeleted−69
@@ -1,69 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− * Olivier Tilloy <olivier.tilloy@canonical.com>
19− */
20−
21−import QtQuick 2.0
22−import Ubuntu.Components 0.1
23−
24−Item {
25− id: textField
26− property alias text: replyField.text
27− property alias buttonText: sendButton.text
28− property bool activateEnabled: false
29−
30− signal activate(var value)
31−
32− TextField {
33− id: replyField
34−
35− anchors {
36− top: parent.top
37− bottom: parent.bottom
38− left: parent.left
39− right: sendButton.left
40− rightMargin: units.gu(1)
41− }
42− placeholderText: "Reply"
43− hasClearButton: false
44−
45− onEnabledChanged: {
46− //Make sure that the component lost focus when enabled = false,
47− //otherwise it will get focus again when enable = true
48− if (!enabled) {
49− focus = false;
50− }
51− }
52− }
53−
54− Button {
55− id: sendButton
56− anchors {
57− top: parent.top
58− bottom: parent.bottom
59− right: parent.right
60− }
61− width: units.gu(9)
62− enabled: replyField.text !== "" && textField.activateEnabled
63− color: enabled ? "#c94212" : "#bababa"
64−
65− onClicked: {
66− textField.activate(replyField.text);
67− }
68− }
69−}
plugins/Unity/Indicators/Messaging/qml/CMakeLists.txtdeleted−5
@@ -1,5 +0,0 @@
1−# export_qmlfiles macro
2−include(Plugins)
3−
4−# export the qmldir, *.qml files.
5−export_qmlfiles(Unity.Indicators.Messaging Unity/Indicators/Messaging)
plugins/Unity/Indicators/Messaging/qml/GroupedMessage.qmldeleted−91
@@ -1,91 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− * Olivier Tilloy <olivier.tilloy@canonical.com>
19− */
20−
21−import QtQuick 2.0
22−import Ubuntu.Components 0.1
23−import Unity.Indicators 0.1 as Indicators
24−
25−Indicators.BaseMenuItem {
26− id: groupedMessage
27−
28− property alias title: __title.text
29− property alias count: label.text
30− property string appIcon: "qrc:/indicators/artwork/messaging/default_app.svg"
31−
32− signal activateApp()
33− signal dismiss()
34−
35− implicitHeight: units.gu(10)
36−
37− Row {
38− anchors.fill: parent
39− anchors.margins: units.gu(2)
40− spacing: units.gu(4)
41−
42− UbuntuShape {
43− height: units.gu(6)
44− width: units.gu(6)
45− image: Image {
46− source: groupedMessage.appIcon
47− fillMode: Image.PreserveAspectFit
48− }
49− }
50−
51− Label {
52− id: __title
53− anchors.verticalCenter: parent.verticalCenter
54− color: "#e8e1d0"
55− font.weight: Font.DemiBold
56− fontSize: "medium"
57− }
58−
59− Label {
60− id: label
61− anchors.verticalCenter: parent.verticalCenter
62− width: parent.width - x
63− horizontalAlignment: Text.AlignRight
64− color: "#e8e1d0"
65− font.weight: Font.DemiBold
66− fontSize: "medium"
67− text: "0"
68− }
69− }
70−
71− Indicators.HLine {
72− anchors.top: parent.top
73− color: "#403b37"
74− }
75−
76− Indicators.HLine {
77− anchors.bottom: parent.bottom
78− color: "#060606"
79− }
80−
81− MouseArea {
82− anchors.fill: parent
83− onClicked: {
84− groupedMessage.activateApp();
85− }
86− }
87−
88− onItemRemoved: {
89− groupedMessage.dismiss();
90− }
91−}
plugins/Unity/Indicators/Messaging/qml/HeroMessage.qmldeleted−123
@@ -1,123 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− * Olivier Tilloy <olivier.tilloy@canonical.com>
19− */
20−
21−import QtQuick 2.0
22−import Ubuntu.Components 0.1
23−import Unity.Indicators 0.1 as Indicators
24−
25−Indicators.BaseMenuItem {
26− id: heroMessage
27−
28− property alias heroMessageHeader: __heroMessageHeader
29− property real collapsedHeight: heroMessageHeader.y + heroMessageHeader.bodyBottom + units.gu(2)
30− property real expandedHeight: collapsedHeight
31−
32− property alias avatar: __heroMessageHeader.avatar
33− property alias appIcon: __heroMessageHeader.icon
34−
35− signal activateApp
36− signal dismiss
37−
38− removable: state !== "expanded"
39− implicitHeight: collapsedHeight
40−
41− Rectangle {
42− id: background
43− property real alpha: 0.0
44− anchors.fill: parent
45− color: Qt.rgba(1.0, 1.0, 1.0, alpha)
46− z: -1
47− }
48−
49− HeroMessageHeader {
50− id: __heroMessageHeader
51−
52− anchors.top: parent.top
53− anchors.left: parent.left
54− anchors.right: parent.right
55−
56− avatar: "qrc:/indicators/artwork/messaging/default_contact.png"
57− appIcon: icon
58−
59− state: heroMessage.state
60−
61− onAppIconClicked: {
62− deselectMenu();
63− heroMessage.activateApp();
64− }
65− }
66−
67− onClicked: {
68− if (menuSelected) {
69− deselectMenu();
70− } else {
71− selectMenu();
72− }
73− }
74−
75− Indicators.HLine {
76− id: __topHLine
77− anchors.top: parent.top
78− color: "#403b37"
79− }
80−
81− Indicators.HLine {
82− id: __bottomHLine
83− anchors.bottom: parent.bottom
84− color: "#060606"
85− }
86−
87− states: State {
88− name: "expanded"
89− when: menuSelected
90−
91− PropertyChanges {
92− target: heroMessage
93− implicitHeight: heroMessage.expandedHeight
94− }
95− PropertyChanges {
96− target: background
97− alpha: 0.05
98− }
99− PropertyChanges {
100− target: __topHLine
101− opacity: 0.0
102− }
103− PropertyChanges {
104− target: __bottomHLine
105− opacity: 0.0
106− }
107− }
108−
109− transitions: Transition {
110− ParallelAnimation {
111− NumberAnimation {
112− properties: "opacity,implicitHeight"
113− duration: 200
114− easing.type: Easing.OutQuad
115− }
116− ColorAnimation {}
117− }
118− }
119−
120− onItemRemoved: {
121− heroMessage.dismiss();
122− }
123−}
plugins/Unity/Indicators/Messaging/qml/HeroMessageHeader.qmldeleted−161
@@ -1,161 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− * Olivier Tilloy <olivier.tilloy@canonical.com>
19− */
20−
21−import QtQuick 2.0
22−import Ubuntu.Components 0.1
23−
24−Item {
25− id: heroMessageHeader
26−
27− property alias avatar: avatarImage.source
28− property alias icon: iconImage.source
29− property alias appIcon: appIconImage.source
30− property alias titleText: __titleText
31− property alias subtitleText: __subtitleText
32− property alias bodyText: __bodyText
33− property real bodyBottom: bodyText.y + bodyText.height
34−
35− signal appIconClicked()
36−
37− height: units.gu(9)
38−
39− UbuntuShape {
40− id: avatarImageContainer
41− anchors {
42− top: parent.top
43− topMargin: units.gu(2)
44− left: parent.left
45− leftMargin: units.gu(2)
46− }
47− height: units.gu(6)
48− width: units.gu(6)
49− image: Image {
50− id: avatarImage
51− fillMode: Image.PreserveAspectFit
52− }
53− }
54−
55− Image {
56− id: iconImage
57− anchors {
58− top: parent.top
59− topMargin: units.gu(2)
60− left: avatarImageContainer.right
61− leftMargin: units.gu(1)
62− }
63− height: units.gu(1.5)
64− width: units.gu(2)
65− horizontalAlignment: Image.AlignHCenter
66− verticalAlignment: Image.AlignBottom
67− fillMode: Image.PreserveAspectFit
68− }
69−
70− Label {
71− id: __titleText
72− anchors {
73− baseline: iconImage.bottom
74− left: iconImage.right
75− leftMargin: units.gu(1)
76− right: __appIcon.left
77− rightMargin: units.gu(2)
78− }
79− elide: Text.ElideRight
80− color: "#e8e1d0"
81− font.weight: Font.DemiBold
82− fontSize: "medium"
83− }
84−
85− Label {
86− id: __subtitleText
87− anchors {
88− baseline: __titleText.baseline
89− baselineOffset: units.gu(2.5)
90− left: __titleText.left
91− right: __titleText.right
92− }
93− elide: Text.ElideRight
94− color: "#8f8f88"
95− fontSize: "small"
96− }
97−
98− Label {
99− id: __bodyText
100− anchors {
101− baseline: __subtitleText.baseline
102− baselineOffset: units.gu(2.5)
103− left: __titleText.left
104− right: parent.right
105− rightMargin: units.gu(2)
106− }
107− maximumLineCount: 2
108− wrapMode: Text.WordWrap
109− elide: Text.ElideRight
110− color: "#e8e1d0"
111− fontSize: "small"
112− }
113−
114− Item {
115− id: __appIcon
116− width: units.gu(7)
117− height: units.gu(7)
118− anchors {
119− top: parent.top
120− right: parent.right
121− }
122− opacity: 0.0
123− enabled: heroMessageHeader.state === "expanded"
124−
125− Image {
126− id: appIconImage
127− height: width
128− anchors {
129− left: parent.left
130− leftMargin: units.gu(2)
131− right: parent.right
132− rightMargin: units.gu(2)
133− topMargin: units.gu(1)
134− verticalCenter: parent.verticalCenter
135− }
136− fillMode: Image.PreserveAspectFit
137− }
138−
139− MouseArea {
140− anchors.fill: parent
141− onClicked: heroMessageHeader.appIconClicked()
142− }
143− }
144−
145− states: State {
146− name: "expanded"
147−
148− PropertyChanges {
149− target: __appIcon
150− opacity: 1.0
151− }
152− }
153−
154− transitions: Transition {
155− NumberAnimation {
156− property: "opacity"
157− duration: 200
158− easing.type: Easing.OutQuad
159− }
160− }
161−}
plugins/Unity/Indicators/Messaging/qml/QuickReply.qmldeleted−165
@@ -1,165 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− * Olivier Tilloy <olivier.tilloy@canonical.com>
19− */
20−
21−import QtQuick 2.0
22−import Ubuntu.Components 0.1
23−import Unity.Indicators 0.1 as Indicators
24−
25−Item {
26− id: quickReply
27− property alias buttonText: actionTextField.buttonText
28− property real expandedHeight: childrenRect.height
29− property alias messages : messagelistRepeater.model
30− property alias replyEnabled: actionTextField.activateEnabled
31−
32− signal reply(var value)
33−
34− Item {
35− id: header
36− anchors.top: parent.top
37− anchors.left: parent.left
38− anchors.right: parent.right
39− height: units.gu(4)
40−
41− Row {
42− anchors {
43− fill: parent
44− leftMargin: units.gu(2)
45− rightMargin: units.gu(2)
46− topMargin: units.gu(1)
47− bottomMargin: units.gu(1)
48− }
49− spacing: units.gu(1)
50−
51− Image {
52− width: units.gu(2)
53− height: width
54− fillMode: Image.PreserveAspectFit
55− source: "qrc:/indicators/artwork/messaging/message_sms01_54px.png"
56− }
57−
58− Label {
59− height: parent.height
60− verticalAlignment: Text.AlignVCenter
61− fontSize: "small"
62− color: "#8f8f88"
63− text: "Quick reply with:"
64− }
65− }
66−
67− Indicators.HLine {
68− anchors.bottom: parent.bottom
69− color: "#20201F"
70− }
71− }
72−
73− Column {
74− id: messagelist
75− anchors {
76− left: parent.left
77− right: parent.right
78− top: header.bottom
79− }
80− height: childrenRect.height
81−
82− Repeater {
83− id: messagelistRepeater
84−
85− height: childrenRect.height
86−
87− Item {
88− width: messagelist.width
89− height: units.gu(5)
90−
91− Label {
92− id: __label
93−
94− anchors {
95− fill: parent
96− leftMargin: units.gu(2)
97− rightMargin: units.gu(2)
98− }
99− verticalAlignment: Text.AlignVCenter
100− fontSize: "medium"
101− color: "#e8e1d0"
102− text: modelData
103− }
104−
105− Indicators.HLine {
106− anchors.top: parent.top
107− color: "#464543"
108− }
109−
110− Indicators.HLine {
111− anchors.bottom: parent.bottom
112− color: "#20201F"
113− }
114−
115− MouseArea {
116− id: __mouseArea
117−
118− anchors.fill: parent
119− onClicked: {
120− actionTextField.text = modelData;
121− }
122− }
123−
124− Rectangle {
125− id: __mask
126−
127− anchors.fill: parent
128− color: "black"
129− opacity: __mouseArea.pressed ? 0.3 : 0.0
130− Behavior on opacity {
131− NumberAnimation {
132− duration: 200
133− easing.type: Easing.OutQuad
134− }
135− }
136− }
137− }
138−
139− }
140− }
141−
142− Item {
143− anchors.top: messagelist.bottom
144− anchors.left: parent.left
145− anchors.right: parent.right
146− height: units.gu(6)
147−
148− ActionTextField {
149− id: actionTextField
150−
151− anchors.fill: parent
152− anchors.margins: units.gu(1)
153− activateEnabled: replyEnabled
154−
155− onActivate: {
156− quickReply.reply(value)
157− }
158− }
159−
160− Indicators.HLine {
161− anchors.top: parent.top
162− color: "#464543"
163− }
164− }
165−}
plugins/Unity/Indicators/Messaging/qml/SimpleTextMessage.qmldeleted−108
@@ -1,108 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− * Olivier Tilloy <olivier.tilloy@canonical.com>
19− */
20−
21−import QtQuick 2.0
22−import Ubuntu.Components 0.1
23−import Unity.Indicators 0.1
24−import Utils 0.1 as Utils
25−
26−HeroMessage {
27− id: __heroMessage
28−
29− property string title: ""
30− property var time
31− property string message: ""
32−
33− property alias footer: footerLoader.sourceComponent
34−
35− expandedHeight: fullMessage.y + fullMessage.height + units.gu(2)
36− heroMessageHeader.titleText.text: title
37− heroMessageHeader.subtitleText.text: timeFormatter.timeString
38− heroMessageHeader.bodyText.text: message
39−
40− Item {
41− id: fullMessage
42−
43− anchors {
44− left: parent.left
45− leftMargin: units.gu(2)
46− right: parent.right
47− rightMargin: units.gu(2)
48− top: heroMessageHeader.bottom
49− }
50− height: childrenRect.height
51− opacity: 0.0
52− enabled: false
53−
54− Utils.TimeFormatter {
55− id: timeFormatter
56− time: __heroMessage.time
57− format: "hh:mm - MMM dd"
58− }
59−
60− Label {
61− id: bodyText
62− anchors {
63− top: parent.top
64− left: parent.left
65− right: parent.right
66− }
67− wrapMode: Text.WordWrap
68− elide: Text.ElideRight
69− color: "#e8e1d0"
70− fontSize: "medium"
71− text: heroMessageHeader.bodyText.text
72− }
73−
74− Loader {
75− id: footerLoader
76−
77− anchors {
78− top: bodyText.bottom
79− topMargin: units.gu(2)
80− left: parent.left
81− right: parent.right
82− }
83− height: item != undefined ? units.gu(4) : 0
84− }
85−
86− states: State {
87− name: "expanded"
88− when: __heroMessage.state === "expanded"
89−
90− PropertyChanges {
91− target: heroMessageHeader.bodyText
92− opacity: 0.0
93− }
94−
95− PropertyChanges {
96− target: fullMessage
97− opacity: 1.0
98− enabled: true
99− }
100− }
101− transitions: Transition {
102− NumberAnimation {
103− property: "opacity"
104− duration: 200
105− }
106− }
107− }
108−}
plugins/Unity/Indicators/Messaging/qml/SnapDecision.qmldeleted−167
@@ -1,167 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− * Olivier Tilloy <olivier.tilloy@canonical.com>
19− */
20−
21−import QtQuick 2.0
22−import Ubuntu.Components 0.1
23−import Unity.Indicators 0.1
24−import Utils 0.1 as Utils
25−
26−HeroMessage {
27− id: snapDecision
28−
29− property string title: ""
30− property var time
31− property string message: ""
32−
33− property bool activateEnabled: true
34− property alias actionButtonText: actionButton.text
35−
36− property bool replyEnabled: true
37− property alias replyMessages: quickreply.messages
38− property alias replyButtonText: quickreply.buttonText
39−
40− expandedHeight: buttons.y + buttons.height + quickreply.height + units.gu(2)
41− heroMessageHeader.titleText.text: title
42− heroMessageHeader.subtitleText.text: message
43− heroMessageHeader.subtitleText.color: "#e8e1d0"
44− heroMessageHeader.bodyText.text: timeFormatter.timeString
45− heroMessageHeader.bodyText.color: "#8f8f88"
46−
47− signal activate
48− signal reply(string value)
49−
50− Item {
51− id: buttons
52−
53− anchors.left: parent.left
54− anchors.leftMargin: units.gu(2)
55− anchors.right: parent.right
56− anchors.rightMargin: units.gu(2)
57− anchors.top: heroMessageHeader.bottom
58− anchors.topMargin: units.gu(1)
59− height: units.gu(4)
60− opacity: 0.0
61−
62− Utils.TimeFormatter {
63− id: timeFormatter
64− time: snapDecision.time
65− format: "hh:mm - MMM dd"
66− }
67−
68− Button {
69− text: "Message"
70− color: "#bababa"
71− anchors.left: parent.left
72− anchors.top: parent.top
73− anchors.bottom: parent.bottom
74− width: (parent.width - units.gu(1)) / 2
75−
76− onClicked: {
77− if (quickreply.state === "") {
78− quickreply.state = "expanded";
79− } else {
80− quickreply.state = "";
81− }
82− }
83− }
84−
85− Button {
86− id: actionButton
87− text: "Call back"
88− color: enabled ? "#c94212" : "#bababa"
89− anchors.right: parent.right
90− anchors.top: parent.top
91− anchors.bottom: parent.bottom
92− width: (parent.width - units.gu(1)) / 2
93− enabled: snapDecision.activateEnabled
94−
95− onClicked: {
96− snapDecision.activate();
97− }
98− }
99−
100− states: State {
101− name: "expanded"
102− when: snapDecision.state === "expanded"
103−
104− PropertyChanges {
105− target: buttons
106− opacity: 1.0
107− }
108− }
109− transitions: Transition {
110− NumberAnimation {
111− property: "opacity"
112− duration: 200
113− easing.type: Easing.OutQuad
114− }
115− }
116− }
117−
118− QuickReply {
119− id: quickreply
120−
121− onReply: {
122− snapDecision.reply(value);
123− }
124−
125− messages: ""
126− buttonText: "Send"
127− anchors {
128− top: buttons.bottom
129− topMargin: units.gu(2)
130− left: parent.left
131− right: parent.right
132− }
133− height: 0
134− opacity: 0.0
135− enabled: false
136− replyEnabled: snapDecision.replyEnabled
137−
138− states: State {
139− name: "expanded"
140−
141− PropertyChanges {
142− target: quickreply
143− height: expandedHeight
144− opacity: 1.0
145− }
146−
147− PropertyChanges {
148− target: quickreply
149− enabled: true
150− }
151− }
152−
153− transitions: Transition {
154− NumberAnimation {
155− properties: "opacity,height"
156− duration: 200
157− easing.type: Easing.OutQuad
158− }
159− }
160− }
161−
162− onStateChanged: {
163− if (state === "") {
164− quickreply.state = "";
165− }
166− }
167−}
plugins/Unity/Indicators/Messaging/qml/TextMessage.qmldeleted−43
@@ -1,43 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− * Olivier Tilloy <olivier.tilloy@canonical.com>
19− */
20−
21−import QtQuick 2.0
22−import Ubuntu.Components 0.1
23−import Unity.Indicators 0.1 as Indicators
24−
25−SimpleTextMessage {
26− id: simpleMessage
27−
28− property bool replyEnabled: false
29− property string replyButtonText: "Send"
30−
31− signal reply(string value)
32−
33− footer: ActionTextField {
34− anchors.fill: parent
35−
36− activateEnabled: simpleMessage.replyEnabled
37− buttonText: simpleMessage.replyButtonText
38−
39− onActivate: {
40− simpleMessage.reply(value);
41− }
42− }
43−}
plugins/Unity/Indicators/Messaging/qml/qmldirdeleted−12
@@ -1,12 +0,0 @@
1−module Unity.Indicators.Messaging
2−
3−ActionButton 0.1 ActionButton.qml
4−ActionTextField 0.1 ActionTextField.qml
5−GroupedMessage 0.1 GroupedMessage.qml
6−HeroMessage 0.1 HeroMessage.qml
7−HeroMessageHeader 0.1 HeroMessageHeader.qml
8−MessageMenuItemFactory 0.1 MessageMenuItemFactory.qml
9−QuickReply 0.1 QuickReply.qml
10−SimpleTextMessage 0.1 SimpleTextMessage.qml
11−SnapDecision 0.1 SnapDecision.qml
12−TextMessage 0.1 TextMessage.qml
plugins/Unity/Indicators/Network/CMakeLists.txtdeleted−1
@@ -1 +0,0 @@
1−add_subdirectory(qml)
plugins/Unity/Indicators/Network/qml/AccessPoint.qmldeleted−117
@@ -1,117 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−import Ubuntu.Components.ListItems 0.1 as ListItem
23−import Unity.Indicators 0.1 as Indicators
24−
25−Indicators.BaseMenuItem {
26− id: menuItem
27− implicitHeight: units.gu(5.5)
28−
29− property bool checked: false
30− property bool secure: false
31− property bool adHoc: false
32− property int signalStrength: 0
33− property alias label: _label.text
34−
35− signal activate()
36−
37− onCheckedChanged: {
38− // Can't rely on binding. Checked is assigned on click.
39− checkBoxActive.checked = checked;
40− }
41−
42− onClicked: {
43− checkBoxActive.clicked();
44− }
45−
46− CheckBox {
47− id: checkBoxActive
48− height: units.gu(3)
49− width: units.gu(3)
50−
51− anchors {
52− left: parent.left
53− leftMargin: menuItem.__contentsMargins
54− verticalCenter: parent.verticalCenter
55− }
56−
57− onClicked: {
58− menuItem.activate();
59− }
60− }
61−
62− Image {
63− id: iconSignal
64−
65− width: height
66− height: Math.min(units.gu(5), parent.height - units.gu(1))
67− anchors {
68− left: checkBoxActive.right
69− leftMargin: units.gu(1)
70− verticalCenter: parent.verticalCenter
71− }
72−
73− source: {
74− var imageName = "nm-signal-100"
75−
76− if (adHoc) {
77− imageName = "nm-adhoc";
78− } else if (signalStrength == 0) {
79− imageName = "nm-signal-00";
80− } else if (signalStrength <= 25) {
81− imageName = "nm-signal-25";
82− } else if (signalStrength <= 50) {
83− imageName = "nm-signal-50";
84− } else if (signalStrength <= 75) {
85− imageName = "nm-signal-75";
86− }
87− return "image://theme/" + imageName;
88− }
89− }
90−
91− Label {
92− id: _label
93− anchors {
94− left: iconSignal.right
95− leftMargin: units.gu(1)
96− verticalCenter: parent.verticalCenter
97− right: iconSecure.visible ? iconSecure.left : parent.right
98− rightMargin: menuItem.__contentsMargins
99− }
100− elide: Text.ElideRight
101− opacity: label.enabled ? 1.0 : 0.5
102− }
103−
104− Image {
105− id: iconSecure
106− visible: secure
107− source: "qrc:/indicators/artwork/network/secure.svg"
108−
109− width: height
110− height: Math.min(units.gu(4), parent.height - units.gu(1))
111− anchors {
112− right: parent.right
113− rightMargin: units.gu(1)
114− verticalCenter: parent.verticalCenter
115− }
116− }
117−}
plugins/Unity/Indicators/Network/qml/CMakeLists.txtdeleted−5
@@ -1,5 +0,0 @@
1−# export_qmlplugin macro
2−include(Plugins)
3−
4−# export the qmldir, *.qml files.
5−export_qmlfiles(Unity.Indicators.Network Unity/Indicators/Network)
plugins/Unity/Indicators/Network/qml/qmldirdeleted−3
@@ -1,3 +0,0 @@
1−module Unity.Indicators.Network
2−
3−AccessPoint 0.1 AccessPoint.qml
plugins/Unity/Indicators/qml/BaseMenuItem.qmldeleted−38
@@ -1,38 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− * Nick Dedekind <nick.dedekind@canonical.com>
19− */
20−
21−import QtQuick 2.0
22−import Ubuntu.Components.ListItems 0.1 as ListItem
23−
24−ListItem.Standard {
25− id: baseMenu
26−
27− property bool menuSelected: false
28−
29− signal selectMenu()
30− signal deselectMenu()
31−
32− showDivider: false
33− __foregroundColor: "#e8e1d0" // FIXME not in palette yet
34−
35− backgroundIndicator: RemoveBackground {
36− state: baseMenu.swipingState
37− }
38−}
plugins/Unity/Indicators/qml/ButtonMenuItem.qmldeleted−44
@@ -1,44 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− * Nick Dedekind <nick.dedekind@canonical.com>
19− */
20−
21−import QtQuick 2.0
22−import Ubuntu.Components 0.1
23−import Unity.Indicators 0.1 as Indicators
24−
25−BaseMenuItem {
26− id: menuItem
27− implicitHeight: units.gu(7)
28−
29− property alias buttonText: button.text
30−
31− signal activate()
32−
33− Button {
34− id: button
35− anchors.centerIn: parent
36− height: units.gu(4)
37− width: units.gu(16)
38− color: "#1b1817"
39−
40− onClicked: {
41− menuItem.activate();
42− }
43− }
44−}
plugins/Unity/Indicators/qml/DivMenuItem.qmldeleted−26
@@ -1,26 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Olivier Tilloy <olivier.tilloy@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−
23−Rectangle {
24− color: "#181514" // FIXME not in palette yet
25− implicitHeight: units.gu(1)
26−}
plugins/Unity/Indicators/qml/FramedMenuItem.qmldeleted−39
@@ -1,39 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− * Nick Dedekind <nick.dedekind@canonical.com>
19− */
20−
21−import QtQuick 2.0
22−import Ubuntu.Components 0.1
23−import Ubuntu.Components.ListItems 0.1 as ListItem
24−
25−BaseMenuItem {
26− implicitHeight: units.gu(7)
27−
28− iconFrame: false
29−
30− HLine {
31− anchors.top: parent.top
32− color: "#403b37" // FIXME not in palette yet
33− }
34−
35− HLine {
36− anchors.bottom: parent.bottom
37− color: "#060606" // FIXME not in palette yet
38− }
39−}
plugins/Unity/Indicators/qml/MenuItemFactory.qml+226−42
@@ -18,11 +18,10 @@
18 */
18 */
19
19
20import QtQuick 2.0
20import QtQuick 2.0
21−import Unity.Indicators 0.1 as Indicators
21+import Ubuntu.Settings.Menus 0.1 as Menus
22−import Unity.Indicators.Network 0.1 as ICNetwork
23−import Unity.Indicators.Messaging 0.1 as ICMessaging
24import QMenuModel 0.1 as QMenuModel
22import QMenuModel 0.1 as QMenuModel
23+import Utils 0.1 as Utils
25−import Ubuntu.Components 0.1
24+import Ubuntu.Components.ListItems 0.1 as ListItems
26
25
27Item {
26Item {
28 id: menuFactory
27 id: menuFactory
@@ -33,12 +32,14 @@ Item {
33 "unity.widgets.systemsettings.tablet.volumecontrol" : sliderMenu,
32 "unity.widgets.systemsettings.tablet.volumecontrol" : sliderMenu,
34 "unity.widgets.systemsettings.tablet.switch" : switchMenu,
33 "unity.widgets.systemsettings.tablet.switch" : switchMenu,
35
34
36− "com.canonical.indicator.button" : buttonMenu,
35+ "com.canonical.indicator.button" : buttonMenu,
37− "com.canonical.indicator.div" : divMenu,
36+ "com.canonical.indicator.div" : separatorMenu,
38− "com.canonical.indicator.section" : sectionMenu,
37+ "com.canonical.indicator.section" : sectionMenu,
39− "com.canonical.indicator.progress" : progressMenu,
38+ "com.canonical.indicator.progress" : progressMenu,
40− "com.canonical.indicator.slider" : sliderMenu,
39+ "com.canonical.indicator.slider" : sliderMenu,
41− "com.canonical.indicator.switch" : switchMenu,
40+ "com.canonical.indicator.switch" : switchMenu,
41+ "com.canonical.indicator.alarm" : alarmMenu,
42+ "com.canonical.indicator.appointment" : appointmentMenu,
42
43
43 "com.canonical.indicator.messages.messageitem" : messageItem,
44 "com.canonical.indicator.messages.messageitem" : messageItem,
44 "com.canonical.indicator.messages.sourceitem" : groupedMessage,
45 "com.canonical.indicator.messages.sourceitem" : groupedMessage,
@@ -46,6 +47,9 @@ Item {
46 "com.canonical.unity.slider" : sliderMenu,
47 "com.canonical.unity.slider" : sliderMenu,
47 "com.canonical.unity.switch" : switchMenu,
48 "com.canonical.unity.switch" : switchMenu,
48
49
50+ "com.canonical.unity.media-player" : mediaPayerMenu,
51+ "com.canonical.unity.playback-item" : playbackItemMenu,
52+
49 "unity.widgets.systemsettings.tablet.wifisection" : wifiSection,
53 "unity.widgets.systemsettings.tablet.wifisection" : wifiSection,
50 "unity.widgets.systemsettings.tablet.accesspoint" : accessPoint,
54 "unity.widgets.systemsettings.tablet.accesspoint" : accessPoint,
51 }
55 }
@@ -58,15 +62,15 @@ Item {
58 }
62 }
59
63
60 Component {
64 Component {
61− id: divMenu;
65+ id: separatorMenu;
62− Indicators.DivMenuItem {
66+ Menus.SeparatorMenu {
63− objectName: "divMenu"
67+ objectName: "separatorMenu"
64 }
68 }
65 }
69 }
66
70
67 Component {
71 Component {
68 id: sliderMenu;
72 id: sliderMenu;
69− Indicators.SliderMenuItem {
73+ Menus.SliderMenu {
70 objectName: "sliderMenu"
74 objectName: "sliderMenu"
71 property QtObject menuData: null
75 property QtObject menuData: null
72 property var menuModel: menuFactory.menuModel
76 property var menuModel: menuFactory.menuModel
@@ -95,12 +99,12 @@ Item {
95 onMenuIndexChanged: {
99 onMenuIndexChanged: {
96 loadAttributes();
100 loadAttributes();
97 }
101 }
98− onChangeState: {
102+ onUpdated: {
99 menuModel.changeState(menuIndex, value);
103 menuModel.changeState(menuIndex, value);
100 }
104 }
101
105
102 function loadAttributes() {
106 function loadAttributes() {
103− if (!menuModel || menuIndex == undefined) return;
107+ if (!menuModel || menuIndex == -1) return;
104 menuModel.loadExtendedAttributes(menuIndex, {'min-value': 'double',
108 menuModel.loadExtendedAttributes(menuIndex, {'min-value': 'double',
105 'max-value': 'double',
109 'max-value': 'double',
106 'min-icon': 'icon',
110 'min-icon': 'icon',
@@ -111,7 +115,7 @@ Item {
111
115
112 Component {
116 Component {
113 id: buttonMenu;
117 id: buttonMenu;
114− Indicators.ButtonMenuItem {
118+ Menus.ButtonMenu {
115 objectName: "buttonMenu"
119 objectName: "buttonMenu"
116 property QtObject menuData: null
120 property QtObject menuData: null
117 property var menuModel: menuFactory.menuModel
121 property var menuModel: menuFactory.menuModel
@@ -120,7 +124,7 @@ Item {
120 buttonText: menuData && menuData.label || ""
124 buttonText: menuData && menuData.label || ""
121 enabled: menuData && menuData.sensitive || false
125 enabled: menuData && menuData.sensitive || false
122
126
123− onActivate: {
127+ onTriggered: {
124 menuModel.activate(menuIndex);
128 menuModel.activate(menuIndex);
125 shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
129 shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
126 }
130 }
@@ -128,18 +132,19 @@ Item {
128 }
132 }
129 Component {
133 Component {
130 id: sectionMenu;
134 id: sectionMenu;
131− Indicators.SectionMenuItem {
135+ Menus.SectionMenu {
132 objectName: "sectionMenu"
136 objectName: "sectionMenu"
133 property QtObject menuData: null
137 property QtObject menuData: null
134 property var menuIndex: undefined
138 property var menuIndex: undefined
135
139
136 text: menuData && menuData.label || ""
140 text: menuData && menuData.label || ""
141+ busy: false
137 }
142 }
138 }
143 }
139
144
140 Component {
145 Component {
141 id: progressMenu;
146 id: progressMenu;
142− Indicators.ProgressMenuItem {
147+ Menus.ProgressValueMenu {
143 objectName: "progressMenu"
148 objectName: "progressMenu"
144 property QtObject menuData: null
149 property QtObject menuData: null
145 property int menuIndex: -1
150 property int menuIndex: -1
@@ -153,7 +158,7 @@ Item {
153
158
154 Component {
159 Component {
155 id: standardMenu;
160 id: standardMenu;
156− Indicators.StandardMenuItem {
161+ ListItems.Standard {
157 objectName: "standardMenu"
162 objectName: "standardMenu"
158 property QtObject menuData: null
163 property QtObject menuData: null
159 property int menuIndex: -1
164 property int menuIndex: -1
@@ -161,19 +166,36 @@ Item {
161 text: menuData && menuData.label || ""
166 text: menuData && menuData.label || ""
162 iconSource: menuData && menuData.icon || ""
167 iconSource: menuData && menuData.icon || ""
163 enabled: menuData && menuData.sensitive || false
168 enabled: menuData && menuData.sensitive || false
164− checkable: menuData ? (menuData.isCheck || menuData.isRadio) : false
165− checked: checkable ? menuData.isToggled : false
166
169
167− onActivate: {
170+ onTriggered: {
171+ menuModel.activate(menuIndex);
172+ shell.hideIndicatorMenu(UbuntuAnimation.BriskDuration);
173+ }
174+ }
175+ }
176+
177+ Component {
178+ id: checkableMenu;
179+ Menus.CheckableMenu {
180+ objectName: "checkableMenu"
181+ property QtObject menuData: null
182+ property int menuIndex: -1
183+
184+ text: menuData && menuData.label || ""
185+ enabled: menuData && menuData.sensitive || false
186+ checked: menuData && menuData.isToggled || false
187+
188+ onTriggered: {
168 menuModel.activate(menuIndex);
189 menuModel.activate(menuIndex);
169 shell.hideIndicatorMenu(UbuntuAnimation.BriskDuration);
190 shell.hideIndicatorMenu(UbuntuAnimation.BriskDuration);
170 }
191 }
171 }
192 }
172 }
193 }
173
194
195+
174 Component {
196 Component {
175 id: switchMenu;
197 id: switchMenu;
176− Indicators.SwitchMenuItem {
198+ Menus.SwitchMenu {
177 objectName: "switchMenu"
199 objectName: "switchMenu"
178 property QtObject menuData: null
200 property QtObject menuData: null
179 property int menuIndex: -1
201 property int menuIndex: -1
@@ -181,18 +203,94 @@ Item {
181 text: menuData && menuData.label || ""
203 text: menuData && menuData.label || ""
182 iconSource: menuData && menuData.icon || ""
204 iconSource: menuData && menuData.icon || ""
183 enabled: menuData && menuData.sensitive || false
205 enabled: menuData && menuData.sensitive || false
184− checked: menuData ? menuData.isToggled : false
206+ checked: menuData && menuData.isToggled || false
185
207
186− onActivate: {
208+ onTriggered: {
187 menuModel.activate(menuIndex);
209 menuModel.activate(menuIndex);
188 shell.hideIndicatorMenu(UbuntuAnimation.BriskDuration);
210 shell.hideIndicatorMenu(UbuntuAnimation.BriskDuration);
189 }
211 }
190 }
212 }
191 }
213 }
192
214
215+ Component {
216+ id: alarmMenu;
217+ Menus.EventMenu {
218+ objectName: "alarmMenu"
219+ property QtObject menuData: null
220+ property var menuModel: menuFactory.menuModel
221+ property int menuIndex: -1
222+ property var extendedData: menuData && menuData.ext || undefined
223+ // TODO - bug #1260728
224+ property var timeFormatter: Utils.GDateTimeFormatter {
225+ time: getExtendedProperty(extendedData, "xCanonicalTime", 0)
226+ format: getExtendedProperty(extendedData, "xCanonicalTimeFormat", "")
227+ }
228+
229+ text: menuData && menuData.label || ""
230+ iconSource: menuData && menuData.icon || "image://theme/alarm-clock"
231+ time: timeFormatter.timeString
232+ enabled: menuData && menuData.sensitive || false
233+
234+ onMenuModelChanged: {
235+ loadAttributes();
236+ }
237+ onMenuIndexChanged: {
238+ loadAttributes();
239+ }
240+ onTriggered: {
241+ menuModel.activate(menuIndex);
242+ }
243+
244+ function loadAttributes() {
245+ if (!menuModel || menuIndex == -1) return;
246+ menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-time': 'int64',
247+ 'x-canonical-time-format': 'string'});
248+ }
249+ }
250+ }
251+
252+ Component {
253+ id: appointmentMenu;
254+ Menus.EventMenu {
255+ objectName: "appointmentMenu"
256+ property QtObject menuData: null
257+ property var menuModel: menuFactory.menuModel
258+ property int menuIndex: -1
259+ property var extendedData: menuData && menuData.ext || undefined
260+ // TODO - bug #1260728
261+ property var timeFormatter: Utils.GDateTimeFormatter {
262+ time: getExtendedProperty(extendedData, "xCanonicalTime", 0)
263+ format: getExtendedProperty(extendedData, "xCanonicalTimeFormat", "")
264+ }
265+
266+ text: menuData && menuData.label || ""
267+ iconSource: menuData && menuData.icon || "image://theme/calendar"
268+ time: timeFormatter.timeString
269+ eventColor: menu && menu.ext.hasOwnProperty("xCanonicalColor") ? menu.ext.xCanonicalColor : Qt.rgba(0.0, 0.0, 0.0, 0.0)
270+ enabled: menuData && menuData.sensitive || false
271+
272+ onMenuModelChanged: {
273+ loadAttributes();
274+ }
275+ onMenuIndexChanged: {
276+ loadAttributes();
277+ }
278+ onTriggered: {
279+ menuModel.activate(menuIndex);
280+ }
281+
282+ function loadAttributes() {
283+ if (!menuModel || menuIndex == -1) return;
284+ menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-color': 'string',
285+ 'x-canonical-time': 'int64',
286+ 'x-canonical-time-format': 'string'});
287+ }
288+ }
289+ }
290+
193 Component {
291 Component {
194 id: wifiSection;
292 id: wifiSection;
195− Indicators.SectionMenuItem {
293+ Menus.SectionMenu {
196 objectName: "wifiSection"
294 objectName: "wifiSection"
197 property QtObject menuData: null
295 property QtObject menuData: null
198 property var menuModel: menuFactory.menuModel
296 property var menuModel: menuFactory.menuModel
@@ -210,7 +308,7 @@ Item {
210 }
308 }
211
309
212 function loadAttributes() {
310 function loadAttributes() {
213− if (!menuModel || menuIndex == undefined) return;
311+ if (!menuModel || menuIndex == -1) return;
214 menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-busy-action': 'bool'})
312 menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-busy-action': 'bool'})
215 }
313 }
216 }
314 }
@@ -218,7 +316,7 @@ Item {
218
316
219 Component {
317 Component {
220 id: accessPoint;
318 id: accessPoint;
221− ICNetwork.AccessPoint {
319+ Menus.AccessPointMenu {
222 objectName: "accessPoint"
320 objectName: "accessPoint"
223 property QtObject menuData: null
321 property QtObject menuData: null
224 property var menuModel: menuFactory.menuModel
322 property var menuModel: menuFactory.menuModel
@@ -231,11 +329,11 @@ Item {
231 name: getExtendedProperty(extendedData, "xCanonicalWifiApStrengthAction", "")
329 name: getExtendedProperty(extendedData, "xCanonicalWifiApStrengthAction", "")
232 }
330 }
233
331
234− label: menuData && menuData.label || ""
332+ text: menuData && menuData.label || ""
235 enabled: menuData && menuData.sensitive || false
333 enabled: menuData && menuData.sensitive || false
334+ checked: menuData && menuData.isToggled || false
236 secure: getExtendedProperty(extendedData, "xCanonicalWifiApIsSecure", false)
335 secure: getExtendedProperty(extendedData, "xCanonicalWifiApIsSecure", false)
237 adHoc: getExtendedProperty(extendedData, "xCanonicalWifiApIsAdhoc", false)
336 adHoc: getExtendedProperty(extendedData, "xCanonicalWifiApIsAdhoc", false)
238− checked: menuData ? menuData.isToggled : false
239 signalStrength: strengthAction.valid ? strengthAction.state : 0
337 signalStrength: strengthAction.valid ? strengthAction.state : 0
240
338
241 onMenuModelChanged: {
339 onMenuModelChanged: {
@@ -244,13 +342,13 @@ Item {
244 onMenuIndexChanged: {
342 onMenuIndexChanged: {
245 loadAttributes();
343 loadAttributes();
246 }
344 }
247− onActivate: {
345+ onTriggered: {
248 menuModel.activate(menuIndex);
346 menuModel.activate(menuIndex);
249 shell.hideIndicatorMenu(UbuntuAnimation.BriskDuration);
347 shell.hideIndicatorMenu(UbuntuAnimation.BriskDuration);
250 }
348 }
251
349
252 function loadAttributes() {
350 function loadAttributes() {
253− if (!menuModel || menuIndex == undefined) return;
351+ if (!menuModel || menuIndex == -1) return;
254 menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-wifi-ap-is-adhoc': 'bool',
352 menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-wifi-ap-is-adhoc': 'bool',
255 'x-canonical-wifi-ap-is-secure': 'bool',
353 'x-canonical-wifi-ap-is-secure': 'bool',
256 'x-canonical-wifi-ap-strength-action': 'string'});
354 'x-canonical-wifi-ap-strength-action': 'string'});
@@ -260,7 +358,7 @@ Item {
260
358
261 Component {
359 Component {
262 id: messageItem
360 id: messageItem
263− ICMessaging.MessageMenuItemFactory {
361+ MessageMenuItemFactory {
264 objectName: "messageItem"
362 objectName: "messageItem"
265 menuModel: menuFactory.menuModel
363 menuModel: menuFactory.menuModel
266 }
364 }
@@ -268,17 +366,18 @@ Item {
268
366
269 Component {
367 Component {
270 id: groupedMessage
368 id: groupedMessage
271− ICMessaging.GroupedMessage {
369+ Menus.GroupedMessageMenu {
272 objectName: "groupedMessage"
370 objectName: "groupedMessage"
273 property QtObject menuData: null
371 property QtObject menuData: null
274 property var menuModel: menuFactory.menuModel
372 property var menuModel: menuFactory.menuModel
275 property int menuIndex: -1
373 property int menuIndex: -1
276 property var extendedData: menuData && menuData.ext || undefined
374 property var extendedData: menuData && menuData.ext || undefined
277
375
278− title: menuData && menuData.label || ""
376+ text: menuData && menuData.label || ""
279− appIcon: getExtendedProperty(extendedData, "icon", "qrc:/indicators/artwork/messaging/default_app.svg")
377+ iconSource: getExtendedProperty(extendedData, "icon", "qrc:/indicators/artwork/messaging/default_app.svg")
280 count: menuData && menuData.actionState.length > 0 ? menuData.actionState[0] : "0"
378 count: menuData && menuData.actionState.length > 0 ? menuData.actionState[0] : "0"
281 enabled: menuData && menuData.sensitive || false
379 enabled: menuData && menuData.sensitive || false
380+ removable: true
282
381
283 onMenuModelChanged: {
382 onMenuModelChanged: {
284 loadAttributes();
383 loadAttributes();
@@ -286,21 +385,103 @@ Item {
286 onMenuIndexChanged: {
385 onMenuIndexChanged: {
287 loadAttributes();
386 loadAttributes();
288 }
387 }
289− onActivateApp: {
388+ onClicked: {
290 menuModel.activate(menuIndex, true);
389 menuModel.activate(menuIndex, true);
291 shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
390 shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
292 }
391 }
293− onDismiss: {
392+ onDismissed: {
294 menuModel.activate(menuIndex, false);
393 menuModel.activate(menuIndex, false);
295 }
394 }
296
395
297 function loadAttributes() {
396 function loadAttributes() {
298− if (!menuModel || menuIndex == undefined) return;
397+ if (!menuModel || menuIndex == -1) return;
299 menuModel.loadExtendedAttributes(modelIndex, {'icon': 'icon'});
398 menuModel.loadExtendedAttributes(modelIndex, {'icon': 'icon'});
300 }
399 }
301 }
400 }
302 }
401 }
303
402
403+ Component {
404+ id: mediaPayerMenu;
405+ Menus.MediaPlayerMenu {
406+ objectName: "mediaPayerMenu"
407+ property QtObject menuData: null
408+ property var menuModel: menuFactory.menuModel
409+ property int menuIndex: -1
410+ property var actionState: menuData && menuData.actionState || undefined
411+
412+ playerIcon: menuData && menuData.icon || ""
413+ playerName: menuData && menuData.label || ""
414+
415+ albumArt: getExtendedProperty(actionState, "art-url", "")
416+ song: getExtendedProperty(actionState, "title", "unknown")
417+ artist: getExtendedProperty(actionState, "artist", "unknown")
418+ album: getExtendedProperty(actionState, "album", "unknown")
419+ running: getExtendedProperty(actionState, "running", false)
420+ state: getExtendedProperty(actionState, "state", "")
421+ enabled: menuData && menuData.sensitive || false
422+
423+ onTriggered: {
424+ model.activate(modelIndex);
425+ }
426+ }
427+ }
428+
429+ Component {
430+ id: playbackItemMenu;
431+ Menus.PlaybackItemMenu {
432+ objectName: "playbackItemMenu"
433+ property QtObject menuData: null
434+ property var menuModel: menuFactory.menuModel
435+ property int menuIndex: -1
436+ property var extendedData: menuData && menuData.ext || undefined
437+
438+ property var playAction: QMenuModel.UnityMenuAction {
439+ model: menuModel
440+ index: menuIndex
441+ name: getExtendedProperty(extendedData, "xCanonicalPlayAction", "")
442+ }
443+ property var nextAction: QMenuModel.UnityMenuAction {
444+ model: menuModel
445+ index: menuIndex
446+ name: getExtendedProperty(extendedData, "xCanonicalNextAction", "")
447+ }
448+ property var previousAction: QMenuModel.UnityMenuAction {
449+ model: menuModel
450+ index: menuIndex
451+ name: getExtendedProperty(extendedData, "xCanonicalPreviousAction", "")
452+ }
453+
454+ playing: playAction.state === "Playing"
455+ canPlay: playAction.valid
456+ canGoNext: nextAction.valid
457+ canGoPrevious: previousAction.valid
458+ enabled: menuData && menuData.sensitive || false
459+
460+ onPlay: {
461+ playAction.activate();
462+ }
463+ onNext: {
464+ nextAction.activate();
465+ }
466+ onPrevious: {
467+ previousAction.activate();
468+ }
469+ onMenuModelChanged: {
470+ loadAttributes();
471+ }
472+ onMenuIndexChanged: {
473+ loadAttributes();
474+ }
475+
476+ function loadAttributes() {
477+ if (!menuModel || menuIndex == -1) return;
478+ menuModel.loadExtendedAttributes(modelIndex, {'x-canonical-play-action': 'string',
479+ 'x-canonical-next-action': 'string',
480+ 'x-canonical-previous-action': 'string'});
481+ }
482+ }
483+ }
484+
304 function load(modelData) {
485 function load(modelData) {
305 if (modelData.type !== undefined) {
486 if (modelData.type !== undefined) {
306 var component = _map[modelData.type];
487 var component = _map[modelData.type];
@@ -308,8 +489,11 @@ Item {
308 return component;
489 return component;
309 }
490 }
310 }
491 }
492+ if (modelData.isCheck || modelData.isRadio) {
493+ return checkableMenu;
494+ }
311 if (modelData.isSeparator) {
495 if (modelData.isSeparator) {
312− return divMenu;
496+ return separatorMenu;
313 }
497 }
314 return standardMenu;
498 return standardMenu;
315 }
499 }
plugins/Unity/Indicators/Messaging/qml/MessageMenuItemFactory.qml → plugins/Unity/Indicators/qml/MessageMenuItemFactory.qmlrenamed+69−28
@@ -20,18 +20,29 @@
20
20
21import QtQuick 2.0
21import QtQuick 2.0
22import Ubuntu.Components 0.1
22import Ubuntu.Components 0.1
23−import Unity.Indicators 0.1 as Indicators
23+import Ubuntu.Settings.Menus 0.1 as Menus
24import QMenuModel 0.1 as QMenuModel
24import QMenuModel 0.1 as QMenuModel
25+import Utils 0.1 as Utils
25
26
26−Indicators.BaseMenuItem {
27+Item {
27 id: messageFactoryItem
28 id: messageFactoryItem
28 property var menuModel: null
29 property var menuModel: null
29 property QtObject menuData: null
30 property QtObject menuData: null
30 property int menuIndex: -1
31 property int menuIndex: -1
31
32
33+ property bool selected: false
34+ signal menuSelected
35+ signal menuDeselected
36+
32 property var extendedData: menuData && menuData.ext || undefined
37 property var extendedData: menuData && menuData.ext || undefined
33 property var actionsDescription: getExtendedProperty(extendedData, "xCanonicalMessageActions", undefined)
38 property var actionsDescription: getExtendedProperty(extendedData, "xCanonicalMessageActions", undefined)
34
39
40+ // TODO - bug #1260728
41+ property var timeFormatter: Utils.TimeFormatter {
42+ time: getExtendedProperty(extendedData, "xCanonicalTime", 0)
43+ format: "hh:mm - MMM dd"
44+ }
45+
35 onMenuModelChanged: {
46 onMenuModelChanged: {
36 loadAttributes();
47 loadAttributes();
37 }
48 }
@@ -40,8 +51,7 @@ Indicators.BaseMenuItem {
40 }
51 }
41
52
42 function loadAttributes() {
53 function loadAttributes() {
43− if (!menuModel || menuIndex == undefined) return;
54+ if (!menuModel || menuIndex == -1) return;
44−
45 menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-time': 'int64',
55 menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-time': 'int64',
46 'x-canonical-text': 'string',
56 'x-canonical-text': 'string',
47 'x-canonical-message-actions': 'variant',
57 'x-canonical-message-actions': 'variant',
@@ -67,34 +77,46 @@ Indicators.BaseMenuItem {
67
77
68 Component {
78 Component {
69 id: simpleTextMessage
79 id: simpleTextMessage
70− SimpleTextMessage {
80+ Menus.SimpleTextMessageMenu {
81+ id: message
71 objectName: "simpleTextMessage"
82 objectName: "simpleTextMessage"
72 // text
83 // text
73 title: menuData && menuData.label || ""
84 title: menuData && menuData.label || ""
74− time: getExtendedProperty(extendedData, "xCanonicalTime", 0)
85+ time: timeFormatter.timeString
75 message: getExtendedProperty(extendedData, "xCanonicalText", "")
86 message: getExtendedProperty(extendedData, "xCanonicalText", "")
76 // icons
87 // icons
77 avatar: getExtendedProperty(extendedData, "icon", "qrc:/indicators/artwork/messaging/default_contact.png")
88 avatar: getExtendedProperty(extendedData, "icon", "qrc:/indicators/artwork/messaging/default_contact.png")
78 appIcon: getExtendedProperty(extendedData, "xCanonicalAppIcon", "qrc:/indicators/artwork/messaging/default_app.svg")
89 appIcon: getExtendedProperty(extendedData, "xCanonicalAppIcon", "qrc:/indicators/artwork/messaging/default_app.svg")
79 // actions
90 // actions
80 enabled: menuData && menuData.sensitive || false
91 enabled: menuData && menuData.sensitive || false
92+ removable: !selected
93+ selected: messageFactoryItem.selected
81
94
82− onActivateApp: {
95+ onAppActivated: {
83 menuModel.activate(menuIndex, true);
96 menuModel.activate(menuIndex, true);
84 shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
97 shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
85 }
98 }
86− onDismiss: {
99+ onDismissed: {
87 menuModel.activate(menuIndex, false);
100 menuModel.activate(menuIndex, false);
88 }
101 }
102+ onClicked: {
103+ if (selected) {
104+ menuDeselected();
105+ } else {
106+ menuSelected();
107+ }
108+ }
89
109
90− menuSelected: messageFactoryItem.menuSelected
110+ backgroundIndicator: RemoveBackground {
91− onSelectMenu: messageFactoryItem.selectMenu()
111+ state: message.swipingState
92− onDeselectMenu: messageFactoryItem.deselectMenu()
112+ }
93 }
113 }
94 }
114 }
115+
95 Component {
116 Component {
96 id: textMessage
117 id: textMessage
97− TextMessage {
118+ Menus.TextMessageMenu {
119+ id: message
98 objectName: "textMessage"
120 objectName: "textMessage"
99 property var replyActionDescription: actionsDescription && actionsDescription.length > 0 ? actionsDescription[0] : undefined
121 property var replyActionDescription: actionsDescription && actionsDescription.length > 0 ? actionsDescription[0] : undefined
100
122
@@ -106,7 +128,7 @@ Indicators.BaseMenuItem {
106
128
107 // text
129 // text
108 title: menuData && menuData.label || ""
130 title: menuData && menuData.label || ""
109− time: getExtendedProperty(extendedData, "xCanonicalTime", 0)
131+ time: timeFormatter.timeString
110 message: getExtendedProperty(extendedData, "xCanonicalText", "")
132 message: getExtendedProperty(extendedData, "xCanonicalText", "")
111 replyButtonText: getExtendedProperty(replyActionDescription, "label", "Send")
133 replyButtonText: getExtendedProperty(replyActionDescription, "label", "Send")
112 // icons
134 // icons
@@ -115,26 +137,36 @@ Indicators.BaseMenuItem {
115 // actions
137 // actions
116 replyEnabled: replyAction.valid && replyAction.enabled
138 replyEnabled: replyAction.valid && replyAction.enabled
117 enabled: menuData && menuData.sensitive || false
139 enabled: menuData && menuData.sensitive || false
140+ removable: !selected
141+ selected: messageFactoryItem.selected
118
142
119− onActivateApp: {
143+ onAppActivated: {
120 menuModel.activate(menuIndex, true);
144 menuModel.activate(menuIndex, true);
121 shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
145 shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
122 }
146 }
123− onDismiss: {
147+ onDismissed: {
124 menuModel.activate(menuIndex, false);
148 menuModel.activate(menuIndex, false);
125 }
149 }
126− onReply: {
150+ onReplied: {
127 replyAction.activate(value);
151 replyAction.activate(value);
128 }
152 }
153+ onClicked: {
154+ if (selected) {
155+ menuDeselected();
156+ } else {
157+ menuSelected();
158+ }
159+ }
129
160
130− menuSelected: messageFactoryItem.menuSelected
161+ backgroundIndicator: RemoveBackground {
131− onSelectMenu: messageFactoryItem.selectMenu()
162+ state: message.swipingState
132− onDeselectMenu: messageFactoryItem.deselectMenu()
163+ }
133 }
164 }
134 }
165 }
135 Component {
166 Component {
136 id: snapDecision
167 id: snapDecision
137− SnapDecision {
168+ Menus.SnapDecisionMenu {
169+ id: message
138 objectName: "snapDecision"
170 objectName: "snapDecision"
139 property var activateActionDescription: actionsDescription && actionsDescription.length > 0 ? actionsDescription[0] : undefined
171 property var activateActionDescription: actionsDescription && actionsDescription.length > 0 ? actionsDescription[0] : undefined
140 property var replyActionDescription: actionsDescription && actionsDescription.length > 1 ? actionsDescription[1] : undefined
172 property var replyActionDescription: actionsDescription && actionsDescription.length > 1 ? actionsDescription[1] : undefined
@@ -152,7 +184,7 @@ Indicators.BaseMenuItem {
152
184
153 // text
185 // text
154 title: menuData && menuData.label || ""
186 title: menuData && menuData.label || ""
155− time: getExtendedProperty(extendedData, "xCanonicalTime", 0)
187+ time: timeFormatter.timeString
156 message: getExtendedProperty(extendedData, "xCanonicalText", "")
188 message: getExtendedProperty(extendedData, "xCanonicalText", "")
157 actionButtonText: getExtendedProperty(activateActionDescription, "label", "Call back")
189 actionButtonText: getExtendedProperty(activateActionDescription, "label", "Call back")
158 replyButtonText: getExtendedProperty(replyActionDescription, "label", "Send")
190 replyButtonText: getExtendedProperty(replyActionDescription, "label", "Send")
@@ -164,24 +196,33 @@ Indicators.BaseMenuItem {
164 activateEnabled: activateAction.valid && activateAction.enabled
196 activateEnabled: activateAction.valid && activateAction.enabled
165 replyEnabled: replyAction.valid && replyAction.enabled
197 replyEnabled: replyAction.valid && replyAction.enabled
166 enabled: menuData && menuData.sensitive || false
198 enabled: menuData && menuData.sensitive || false
199+ removable: !selected
200+ selected: messageFactoryItem.selected
167
201
168− onActivateApp: {
202+ onAppActivated: {
169 menuModel.activate(menuIndex, true);
203 menuModel.activate(menuIndex, true);
170 shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
204 shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
171 }
205 }
172− onDismiss: {
206+ onDismissed: {
173 menuModel.activate(menuIndex, false);
207 menuModel.activate(menuIndex, false);
174 }
208 }
175− onActivate: {
209+ onActivated: {
176 activateAction.activate();
210 activateAction.activate();
177 }
211 }
178− onReply: {
212+ onReplied: {
179 replyAction.activate(value);
213 replyAction.activate(value);
180 }
214 }
215+ onClicked: {
216+ if (selected) {
217+ menuDeselected();
218+ } else {
219+ menuSelected();
220+ }
221+ }
181
222
182− menuSelected: messageFactoryItem.menuSelected
223+ backgroundIndicator: RemoveBackground {
183− onSelectMenu: messageFactoryItem.selectMenu()
224+ state: message.swipingState
184− onDeselectMenu: messageFactoryItem.deselectMenu()
225+ }
185 }
226 }
186 }
227 }
187 }
228 }
plugins/Unity/Indicators/qml/ProgressMenuItem.qmldeleted−38
@@ -1,38 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Michael Zanetti <michael.zanetti@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−import Unity.Indicators 0.1 as Indicators
23−
24−FramedMenuItem {
25− id: menuItem
26−
27− property int value : 0.0
28−
29− control: Label {
30− id: progress
31− anchors.verticalCenter: parent.verticalCenter
32− anchors.right: parent.right
33−
34− text: menuItem.value + " %"
35− fontSize: "medium"
36− color: "#e8e1d0"
37− }
38−}
plugins/Unity/Indicators/qml/SectionMenuItem.qmldeleted−54
@@ -1,54 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1
22−import Ubuntu.Components.ListItems 0.1 as ListItem
23−
24−BaseMenuItem {
25− id: menuItem
26− property alias text: header.text
27− property bool busy: false
28−
29− implicitHeight: text !== "" ? header.height : 0
30−
31− ListItem.Header {
32− id: header
33−
34− height: units.gu(4)
35− anchors {
36− left: parent.left
37− right: parent.right
38− top: parent.top
39− }
40− visible: text != ""
41−
42− ActivityIndicator {
43− id: indicator
44− running: busy
45− anchors {
46− margins: units.gu(0.5)
47− right: parent.right
48− }
49− height: parent.height - (anchors.margins * 2)
50− width: height
51− anchors.verticalCenter: parent.verticalCenter
52− }
53− }
54−}
plugins/Unity/Indicators/qml/SliderMenuItem.qmldeleted−106
@@ -1,106 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− * Nick Dedekind <nick.dedekind@canonical.com>
19− */
20−
21−import QtQuick 2.0
22−import Ubuntu.Components 0.1 as Components
23−import Unity.Indicators 0.1 as Indicators
24−
25−FramedMenuItem {
26− id: menuItem
27−
28− property alias minimumValue: slider.minimumValue
29− property alias maximumValue: slider.maximumValue
30− property double value: 0.0
31−
32− property alias minIcon: leftImage.source
33− property alias maxIcon: rightImage.source
34−
35− property QtObject d: QtObject {
36− property bool enableValueConnection: true
37− }
38−
39− signal changeState(real value)
40−
41− onValueChanged: {
42− // TODO: look into adding a component to manage bi-directional bindings.
43− var oldEnable = d.enableValueConnection
44− d.enableValueConnection = false;
45−
46− // Can't rely on binding. Slider value is assigned by user slide.
47− slider.value = value;
48−
49− d.enableValueConnection = oldEnable;
50− }
51−
52− control: Item {
53− id: row
54− width: menuItem.text ? units.gu(20) : menuItem.width - (2 * menuItem.__contentsMargins)
55− height: slider.height
56−
57− Image {
58− id: leftImage
59− visible: status === Image.Ready
60− anchors.left: row.left
61− anchors.verticalCenter: row.verticalCenter
62− height: units.gu(4)
63− width: height
64− }
65−
66− Components.Slider {
67− id: slider
68− anchors {
69− left: leftImage.visible ? leftImage.right : row.left
70− right: rightImage.visible ? rightImage.left : row.right
71− leftMargin: leftImage.visible ? units.gu(0.5) : 0
72− rightMargin: rightImage.visible ? units.gu(0.5) : 0
73− }
74− live: true
75−
76− Component.onCompleted: {
77− value = menuItem.value
78− }
79−
80− minimumValue: 0.0
81− maximumValue: 0.1
82−
83− // FIXME - to be deprecated in Ubuntu.Components.
84− // Use this to disable the label, since there is not way to do it on the component.
85− function formatValue(v) {
86− return "";
87− }
88−
89− Connections {
90− target: d.enableValueConnection ? slider : null
91− onValueChanged: {
92− menuItem.changeState(slider.value);
93− }
94− }
95− }
96−
97− Image {
98− id: rightImage
99− visible: status === Image.Ready
100− anchors.right: row.right
101− anchors.verticalCenter: row.verticalCenter
102− height: units.gu(4)
103− width: height
104− }
105− }
106−}
plugins/Unity/Indicators/qml/StandardMenuItem.qmldeleted−71
@@ -1,71 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Nick Dedekind <nick.dedekind@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import Ubuntu.Components 0.1 as Components
22−import Unity.Indicators 0.1 as Indicators
23−
24−FramedMenuItem {
25− id: menuItem
26−
27− property bool checkable: false
28− property bool checked: false
29−
30− signal activate()
31−
32− // FIXME : need a radio button from sdk
33− // https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1211866
34− onCheckableChanged: {
35− if (checkable) {
36− icon = checkComponent.createObject(menuItem);
37− }
38− }
39−
40− onCheckedChanged: {
41− // Can't rely on binding. Checked is assigned on click.
42− if (icon) {
43− icon.checked = checked;
44− }
45− }
46−
47− onClicked: {
48− if (checkable && icon) {
49− icon.clicked();
50− } else {
51− menuItem.activate();
52− }
53− }
54−
55− property var checkComponent: Component {
56− Components.CheckBox {
57− anchors.verticalCenter: parent.verticalCenter
58− anchors.left: parent.left
59−
60− Component.onCompleted: {
61− checked = menuItem.checked;
62− }
63−
64− // FIXME : should use Checkbox.toggled signal
65− // lp:~nick-dedekind/ubuntu-ui-toolkit/checkbox.toggled
66− onClicked: {
67− menuItem.activate();
68− }
69− }
70− }
71−}
plugins/Unity/Indicators/qml/SwitchMenuItem.qmldeleted−53
@@ -1,53 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
18− * Nick Dedekind <nick.dedekind@canonical.com>
19− */
20−
21−import QtQuick 2.0
22−import Ubuntu.Components 0.1
23−import Unity.Indicators 0.1 as Indicators
24−
25−FramedMenuItem {
26− id: menuItem
27−
28− property bool checked: false
29−
30− signal activate()
31−
32− onCheckedChanged: {
33− // Can't rely on binding. Checked is assigned on click.
34− switcher.checked = checked;
35− }
36−
37− control: Switch {
38− id: switcher
39−
40− Component.onCompleted: {
41− checked = menuItem.checked;
42− }
43−
44− anchors.verticalCenter: parent.verticalCenter
45− anchors.right: parent.right
46−
47− // FIXME : should use Checkbox.toggled signal
48− // lp:~nick-dedekind/ubuntu-ui-toolkit/checkbox.toggled
49− onClicked: {
50− menuItem.activate();
51− }
52− }
53−}
plugins/Unity/Indicators/qml/qmldir+1−12
@@ -2,20 +2,9 @@ module Unity.Indicators
2plugin IndicatorsQml
2plugin IndicatorsQml
3typeinfo plugin.qmltypes
3typeinfo plugin.qmltypes
4
4
5−BaseMenuItem 0.1 BaseMenuItem.qml
6−ButtonMenuItem 0.1 ButtonMenuItem.qml
7CachedUnityMenuModel 0.1 CachedUnityMenuModel.qml
5CachedUnityMenuModel 0.1 CachedUnityMenuModel.qml
8−DivMenuItem 0.1 DivMenuItem.qml
9−FramedMenuItem 0.1 FramedMenuItem.qml
10−HLine 0.1 HLine.qml
11IndicatorBase 0.1 IndicatorBase.qml
6IndicatorBase 0.1 IndicatorBase.qml
12−MenuActionBinding 0.1 MenuActionBinding.qml
13MenuItemFactory 0.1 MenuItemFactory.qml
7MenuItemFactory 0.1 MenuItemFactory.qml
14−ProgressMenuItem 0.1 ProgressMenuItem.qml
8+MessageMenuItemFactory 0.1 MessageMenuItemFactory.qml
15−SectionMenuItem 0.1 SectionMenuItem.qml
16−SliderMenuItem 0.1 SliderMenuItem.qml
17−StandardMenuItem 0.1 StandardMenuItem.qml
18−SwitchMenuItem 0.1 SwitchMenuItem.qml
19−
20
9
21internal RemoveBackground RemoveBackground.qml
10internal RemoveBackground RemoveBackground.qml
plugins/Unity/Indicators/resources/artwork/messaging/message_sms01_54px.pngdeleted

Binary file not shown.

plugins/Unity/Indicators/resources/artwork/network/secure.svgdeleted−71
@@ -1,71 +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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11− xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12− width="64"
13− height="64"
14− id="svg2986"
15− version="1.1"
16− inkscape:version="0.48.4 r9939"
17− sodipodi:docname="secure.svg">
18− <defs
19− id="defs2988" />
20− <sodipodi:namedview
21− id="base"
22− pagecolor="#ffffff"
23− bordercolor="#666666"
24− borderopacity="1.0"
25− inkscape:pageopacity="0.0"
26− inkscape:pageshadow="2"
27− inkscape:zoom="7.9180415"
28− inkscape:cx="7.5048745"
29− inkscape:cy="29.401628"
30− inkscape:current-layer="layer1"
31− showgrid="true"
32− inkscape:grid-bbox="true"
33− inkscape:document-units="px"
34− inkscape:snap-grids="false"
35− inkscape:window-width="1549"
36− inkscape:window-height="876"
37− inkscape:window-x="51"
38− inkscape:window-y="24"
39− inkscape:window-maximized="1">
40− <inkscape:grid
41− type="xygrid"
42− id="grid3012"
43− empspacing="5"
44− visible="true"
45− enabled="true"
46− snapvisiblegridlinesonly="true" />
47− </sodipodi:namedview>
48− <metadata
49− id="metadata2991">
50− <rdf:RDF>
51− <cc:Work
52− rdf:about="">
53− <dc:format>image/svg+xml</dc:format>
54− <dc:type
55− rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
56− <dc:title />
57− </cc:Work>
58− </rdf:RDF>
59− </metadata>
60− <g
61− id="layer1"
62− inkscape:label="Layer 1"
63− inkscape:groupmode="layer"
64− transform="translate(0,32)">
65− <path
66− inkscape:connector-curvature="0"
67− d="M 29.999999,-18 C 25.568001,-18 22,-14.432 22,-10 v 6 h -2 c -1.107999,0 -2,0.892 -2,2 v 18 c 0,1.108 0.892001,2 2,2 h 24 c 1.108,0 2,-0.892 2,-2 V -2 c 0,-1.108 -0.892,-2 -2,-2 h -2 v -6 c 0,-4.432 -3.568001,-8 -8.000001,-8 h -4 z m 0,4 h 4 c 2.216,0 4,1.784 4,4 v 6 H 26.000001 v -6 c 0,-2.216 1.784,-4 3.999998,-4 z"
68− style="fill:#dfdbd2;fill-rule:evenodd"
69− id="path8" />
70− </g>
71−</svg>
plugins/Unity/Indicators/resources/indicators.qrc−2
@@ -1,8 +1,6 @@
1<RCC>
1<RCC>
2 <qresource prefix="/indicators">
2 <qresource prefix="/indicators">
3− <file>artwork/network/secure.svg</file>
4 <file>artwork/messaging/default_contact.png</file>
3 <file>artwork/messaging/default_contact.png</file>
5 <file>artwork/messaging/default_app.svg</file>
4 <file>artwork/messaging/default_app.svg</file>
6− <file>artwork/messaging/message_sms01_54px.png</file>
7 </qresource>
5 </qresource>
8</RCC>
6</RCC>
po/am.ponew file+158
@@ -0,0 +1,158 @@
1+# Amharic translation for unity8
2+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11+"PO-Revision-Date: 2014-01-18 19:28+0000\n"
12+"Last-Translator: samson <Unknown>\n"
13+"Language-Team: Amharic <am@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=2; plural=n > 1;\n"
18+"X-Launchpad-Export-Date: 2014-01-19 06:02+0000\n"
19+"X-Generator: Launchpad (build 16901)\n"
20+
21+#: Components/EdgeDemoOverlay.qml:151
22+msgid "Skip intro"
23+msgstr ""
24+
25+#: Components/EdgeDemo.qml:112
26+msgid "Right edge"
27+msgstr "የቀኝ ጠርዝ"
28+
29+#: Components/EdgeDemo.qml:113
30+msgid "Try swiping from the right edge to unlock the phone"
31+msgstr ""
32+
33+#: Components/EdgeDemo.qml:144
34+msgid "Top edge"
35+msgstr "የላይ ጠርዝ"
36+
37+#: Components/EdgeDemo.qml:145
38+msgid "Try swiping from the top edge to access the indicators"
39+msgstr ""
40+
41+#: Components/EdgeDemo.qml:170
42+msgid "Close"
43+msgstr "መዝጊያ"
44+
45+#: Components/EdgeDemo.qml:171
46+msgid "Swipe up again to close the settings screen"
47+msgstr ""
48+
49+#: Components/EdgeDemo.qml:198
50+msgid "Left edge"
51+msgstr "የግራ ጠርዝ"
52+
53+#: Components/EdgeDemo.qml:199
54+msgid "Swipe from the left to reveal the launcher for quick access to apps"
55+msgstr ""
56+
57+#: Components/EdgeDemo.qml:226
58+msgid "Well done"
59+msgstr ""
60+
61+#: Components/EdgeDemo.qml:227
62+msgid ""
63+"You have now mastered the edge gestures and can start using the "
64+"phone<br><br>Tap anywhere to start"
65+msgstr ""
66+
67+#: Components/PageHeader.qml:364
68+msgid "Recent searches"
69+msgstr ""
70+
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
75+#. TRANSLATORS: Number of persons who rated this app/video/whatever
76+#: Dash/Previews/Header.qml:93
77+#, qt-format
78+msgid "(%1)"
79+msgstr "(%1)"
80+
81+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
82+#: Dash/Previews/Header.qml:105
83+#, qt-format
84+msgid "%1 review"
85+msgid_plural "%1 reviews"
86+msgstr[0] ""
87+msgstr[1] ""
88+
89+#: Dash/Previews/Reviews.qml:74
90+msgid "Add a review"
91+msgstr ""
92+
93+#: Dash/Previews/Reviews.qml:86
94+msgid "Review"
95+msgstr ""
96+
97+#: Dash/Previews/Reviews.qml:121
98+msgid "Send"
99+msgstr "መላኪያ"
100+
101+#: Dash/Previews/Reviews.qml:139
102+msgid "Comments:"
103+msgstr "አስተያየቶች:"
104+
105+#: Greeter/Lockscreen.qml:149
106+msgid "Emergency Call"
107+msgstr ""
108+
109+#: Greeter/PassphraseLockscreen.qml:59
110+#, qt-format
111+msgid "Hello %1"
112+msgstr "ሰላም %1"
113+
114+#: Greeter/PassphraseLockscreen.qml:59
115+msgid "Hello"
116+msgstr "ሰላም"
117+
118+#: Hud/HudParametrizedActionsPage.qml:132
119+msgid "Confirm"
120+msgstr "ማረጋገጫ"
121+
122+#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
123+msgid "Type or say a command"
124+msgstr "ትእዛዝ ይናገሩ ወይንም ይጻፉ"
125+
126+#: Hud/Hud.qml:84
127+msgid "Loading. Please Wait..."
128+msgstr "እባክዎን ይቆዩ በመጫን ላይ..."
129+
130+#: Hud/Hud.qml:89
131+msgid "Speak Now..."
132+msgstr "አሁን ይናገሩ..."
133+
134+#: Hud/Hud.qml:94
135+msgid "Speaking..."
136+msgstr "በመናገር ላይ..."
137+
138+#: Notifications/NotificationMenuItemFactory.qml:89
139+msgid "Show password"
140+msgstr "የመግቢያ ቃል ማሳያ"
141+
142+#: Panel/SearchIndicator.qml:27
143+msgid "Search"
144+msgstr "መፈለጊያ"
145+
146+#: plugins/Unity/Launcher/launcheritem.cpp:43
147+#: plugins/Unity/Launcher/launcheritem.cpp:73
148+msgid "Lock to Launcher"
149+msgstr "ማስነሻው ላይ መቆለፊያ"
150+
151+#: plugins/Unity/Launcher/launcheritem.cpp:73
152+msgid "Unlock from Launcher"
153+msgstr "ከማስነሻው ላይ ማላቀቂያ"
154+
155+#: Shell.qml:439
156+#, qt-format
157+msgid "Please enter %1"
158+msgstr "እባክዎን ያስገቡ %1"
po/az.po+34−31
@@ -8,61 +8,64 @@ msgstr ""
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: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-06-26 23:48+0000\n"
11+"PO-Revision-Date: 2014-01-15 09:50+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12+"Last-Translator: Turan Mahmudov <turan.mahmudov@gmail.com>\n"
13"Language-Team: Azerbaijani <az@li.org>\n"
13"Language-Team: Azerbaijani <az@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2014-01-16 06:09+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
19+"X-Generator: Launchpad (build 16901)\n"
20
20
21#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
22msgid "Skip intro"
22msgid "Skip intro"
23−msgstr ""
23+msgstr "Intro -nu keç"
24
24
25#: Components/EdgeDemo.qml:112
25#: Components/EdgeDemo.qml:112
26msgid "Right edge"
26msgid "Right edge"
27−msgstr ""
27+msgstr "Sağ Künc"
28
28
29#: Components/EdgeDemo.qml:113
29#: Components/EdgeDemo.qml:113
30msgid "Try swiping from the right edge to unlock the phone"
30msgid "Try swiping from the right edge to unlock the phone"
31−msgstr ""
31+msgstr "Kilidi açmaq üçün sağ küncdən çəkin"
32
32
33#: Components/EdgeDemo.qml:144
33#: Components/EdgeDemo.qml:144
34msgid "Top edge"
34msgid "Top edge"
35−msgstr ""
35+msgstr "Yuxarı künc"
36
36
37#: Components/EdgeDemo.qml:145
37#: Components/EdgeDemo.qml:145
38msgid "Try swiping from the top edge to access the indicators"
38msgid "Try swiping from the top edge to access the indicators"
39−msgstr ""
39+msgstr "Göstəricilərə keçid üçün yuxarı küncdən çəkin"
40
40
41#: Components/EdgeDemo.qml:170
41#: Components/EdgeDemo.qml:170
42msgid "Close"
42msgid "Close"
43−msgstr ""
43+msgstr "Bağla"
44
44
45#: Components/EdgeDemo.qml:171
45#: Components/EdgeDemo.qml:171
46msgid "Swipe up again to close the settings screen"
46msgid "Swipe up again to close the settings screen"
47−msgstr ""
47+msgstr "Nizamlamalar ekranını bağlamaq üçün yenidən yuxarı çəkin"
48
48
49#: Components/EdgeDemo.qml:198
49#: Components/EdgeDemo.qml:198
50msgid "Left edge"
50msgid "Left edge"
51−msgstr ""
51+msgstr "Sol künc"
52
52
53#: Components/EdgeDemo.qml:199
53#: Components/EdgeDemo.qml:199
54msgid "Swipe from the left to reveal the launcher for quick access to apps"
54msgid "Swipe from the left to reveal the launcher for quick access to apps"
55msgstr ""
55msgstr ""
56+"Applikasiyalara sürətli keçid üçün paneli açmaq üçün sol küncdən çəkin"
56
57
57#: Components/EdgeDemo.qml:226
58#: Components/EdgeDemo.qml:226
58msgid "Well done"
59msgid "Well done"
59−msgstr ""
60+msgstr "Təbriklər"
60
61
61#: Components/EdgeDemo.qml:227
62#: Components/EdgeDemo.qml:227
62msgid ""
63msgid ""
63"You have now mastered the edge gestures and can start using the "
64"You have now mastered the edge gestures and can start using the "
64"phone<br><br>Tap anywhere to start"
65"phone<br><br>Tap anywhere to start"
65msgstr ""
66msgstr ""
67+"Siz indi künc hərəkətlərini mənimsəmisiniz və telefonu işlətməyə başlaya "
68+"bilərsiniz<br><br>Başlamaq üçün toxunun"
66
69
67#: Components/PageHeader.qml:364
70#: Components/PageHeader.qml:364
68msgid "Recent searches"
71msgid "Recent searches"
@@ -70,50 +73,50 @@ msgstr "Son axtarışlar"
70
73
71#: Dash/Apps/AppPreview.qml:135
74#: Dash/Apps/AppPreview.qml:135
72msgid "Rate this"
75msgid "Rate this"
73−msgstr ""
76+msgstr "Qiymət ver"
74
77
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
78#. TRANSLATORS: Number of persons who rated this app/video/whatever
76#: Dash/Previews/Header.qml:93
79#: Dash/Previews/Header.qml:93
77#, qt-format
80#, qt-format
78msgid "(%1)"
81msgid "(%1)"
79−msgstr ""
82+msgstr "(%1)"
80
83
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
84#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
82#: Dash/Previews/Header.qml:105
85#: Dash/Previews/Header.qml:105
83#, qt-format
86#, qt-format
84msgid "%1 review"
87msgid "%1 review"
85msgid_plural "%1 reviews"
88msgid_plural "%1 reviews"
86−msgstr[0] ""
89+msgstr[0] "%1 rəy"
87−msgstr[1] ""
90+msgstr[1] "%1 rəy"
88
91
89#: Dash/Previews/Reviews.qml:74
92#: Dash/Previews/Reviews.qml:74
90msgid "Add a review"
93msgid "Add a review"
91−msgstr ""
94+msgstr "Rəy yaz"
92
95
93#: Dash/Previews/Reviews.qml:86
96#: Dash/Previews/Reviews.qml:86
94msgid "Review"
97msgid "Review"
95−msgstr ""
98+msgstr "Rəy"
96
99
97#: Dash/Previews/Reviews.qml:121
100#: Dash/Previews/Reviews.qml:121
98msgid "Send"
101msgid "Send"
99−msgstr ""
102+msgstr "Göndər"
100
103
101#: Dash/Previews/Reviews.qml:139
104#: Dash/Previews/Reviews.qml:139
102msgid "Comments:"
105msgid "Comments:"
103−msgstr ""
106+msgstr "Şərhlər:"
104
107
105#: Greeter/Lockscreen.qml:149
108#: Greeter/Lockscreen.qml:149
106msgid "Emergency Call"
109msgid "Emergency Call"
107−msgstr ""
110+msgstr "Zərurət zəngi"
108
111
109#: Greeter/PassphraseLockscreen.qml:59
112#: Greeter/PassphraseLockscreen.qml:59
110#, qt-format
113#, qt-format
111msgid "Hello %1"
114msgid "Hello %1"
112−msgstr ""
115+msgstr "Xoş gördük %1"
113
116
114#: Greeter/PassphraseLockscreen.qml:59
117#: Greeter/PassphraseLockscreen.qml:59
115msgid "Hello"
118msgid "Hello"
116−msgstr ""
119+msgstr "Xoş gördük"
117
120
118#: Hud/HudParametrizedActionsPage.qml:132
121#: Hud/HudParametrizedActionsPage.qml:132
119msgid "Confirm"
122msgid "Confirm"
@@ -125,19 +128,19 @@ msgstr "Əmri söyləyin və ya yazın"
125
128
126#: Hud/Hud.qml:84
129#: Hud/Hud.qml:84
127msgid "Loading. Please Wait..."
130msgid "Loading. Please Wait..."
128−msgstr "Yüklənir. Zəhmət olmasa, Gözləyin..."
131+msgstr "Yüklənir. Zəhmət olmasa, gözləyin..."
129
132
130#: Hud/Hud.qml:89
133#: Hud/Hud.qml:89
131msgid "Speak Now..."
134msgid "Speak Now..."
132−msgstr "Söyləyin..."
135+msgstr "Danışın..."
133
136
134#: Hud/Hud.qml:94
137#: Hud/Hud.qml:94
135msgid "Speaking..."
138msgid "Speaking..."
136−msgstr "Söylənilir..."
139+msgstr "Danışır..."
137
140
138#: Notifications/NotificationMenuItemFactory.qml:89
141#: Notifications/NotificationMenuItemFactory.qml:89
139msgid "Show password"
142msgid "Show password"
140−msgstr ""
143+msgstr "Parolu göstər"
141
144
142#: Panel/SearchIndicator.qml:27
145#: Panel/SearchIndicator.qml:27
143msgid "Search"
146msgid "Search"
@@ -146,13 +149,13 @@ msgstr "Axtar"
146#: plugins/Unity/Launcher/launcheritem.cpp:43
149#: plugins/Unity/Launcher/launcheritem.cpp:43
147#: plugins/Unity/Launcher/launcheritem.cpp:73
150#: plugins/Unity/Launcher/launcheritem.cpp:73
148msgid "Lock to Launcher"
151msgid "Lock to Launcher"
149−msgstr ""
152+msgstr "Panelə Bərkit"
150
153
151#: plugins/Unity/Launcher/launcheritem.cpp:73
154#: plugins/Unity/Launcher/launcheritem.cpp:73
152msgid "Unlock from Launcher"
155msgid "Unlock from Launcher"
153−msgstr ""
156+msgstr "Paneldən Qaldır"
154
157
155#: Shell.qml:439
158#: Shell.qml:439
156#, qt-format
159#, qt-format
157msgid "Please enter %1"
160msgid "Please enter %1"
158−msgstr ""
161+msgstr "Xahiş edirik daxil edin: %1"
po/bg.po+39−31
@@ -8,113 +8,121 @@ msgstr ""
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: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-06-27 00:06+0000\n"
11+"PO-Revision-Date: 2014-01-28 19:22+0000\n"
12−"Last-Translator: Miroslav E. Hadzhiev (Хаджиев) "
12+"Last-Translator: Atanas Kovachki <Unknown>\n"
13−"<miroslav.hadzhiev@gmail.com>\n"
14"Language-Team: Bulgarian <bg@li.org>\n"
13"Language-Team: Bulgarian <bg@li.org>\n"
15"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
18"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
19−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2014-01-30 06:07+0000\n"
20−"X-Generator: Launchpad (build 16877)\n"
19+"X-Generator: Launchpad (build 16916)\n"
21
20
22#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
23msgid "Skip intro"
22msgid "Skip intro"
24−msgstr ""
23+msgstr "Пропусни интрото"
25
24
26#: Components/EdgeDemo.qml:112
25#: Components/EdgeDemo.qml:112
27msgid "Right edge"
26msgid "Right edge"
28−msgstr ""
27+msgstr "Десен край"
29
28
30#: Components/EdgeDemo.qml:113
29#: Components/EdgeDemo.qml:113
31msgid "Try swiping from the right edge to unlock the phone"
30msgid "Try swiping from the right edge to unlock the phone"
32msgstr ""
31msgstr ""
32+"Опитайте се да приплъзнете пръста си от десния край към левия, за да "
33+"отключите телефона"
33
34
34#: Components/EdgeDemo.qml:144
35#: Components/EdgeDemo.qml:144
35msgid "Top edge"
36msgid "Top edge"
36−msgstr ""
37+msgstr "Горен край"
37
38
38#: Components/EdgeDemo.qml:145
39#: Components/EdgeDemo.qml:145
39msgid "Try swiping from the top edge to access the indicators"
40msgid "Try swiping from the top edge to access the indicators"
40msgstr ""
41msgstr ""
42+"Опитайте се да приплъзнете пръста си от горния край към долния, за да "
43+"получите достъп до индикаторите"
41
44
42#: Components/EdgeDemo.qml:170
45#: Components/EdgeDemo.qml:170
43msgid "Close"
46msgid "Close"
44−msgstr ""
47+msgstr "Затвори"
45
48
46#: Components/EdgeDemo.qml:171
49#: Components/EdgeDemo.qml:171
47msgid "Swipe up again to close the settings screen"
50msgid "Swipe up again to close the settings screen"
48msgstr ""
51msgstr ""
52+"Отново приплъзнете пръста си нагоре за да затворите екрана с настройките"
49
53
50#: Components/EdgeDemo.qml:198
54#: Components/EdgeDemo.qml:198
51msgid "Left edge"
55msgid "Left edge"
52−msgstr ""
56+msgstr "Ляв край"
53
57
54#: Components/EdgeDemo.qml:199
58#: Components/EdgeDemo.qml:199
55msgid "Swipe from the left to reveal the launcher for quick access to apps"
59msgid "Swipe from the left to reveal the launcher for quick access to apps"
56msgstr ""
60msgstr ""
61+"Приплъзнете пръста си от левия край към десния, за да отворите стартера за "
62+"бърз достъп до приложенията"
57
63
58#: Components/EdgeDemo.qml:226
64#: Components/EdgeDemo.qml:226
59msgid "Well done"
65msgid "Well done"
60−msgstr ""
66+msgstr "Великолепно"
61
67
62#: Components/EdgeDemo.qml:227
68#: Components/EdgeDemo.qml:227
63msgid ""
69msgid ""
64"You have now mastered the edge gestures and can start using the "
70"You have now mastered the edge gestures and can start using the "
65"phone<br><br>Tap anywhere to start"
71"phone<br><br>Tap anywhere to start"
66msgstr ""
72msgstr ""
73+"Сега, когато сте научили основните движения, можете да започнете да "
74+"използвате телефона си.<br><br>Натиснете някъде за да започнете"
67
75
68#: Components/PageHeader.qml:364
76#: Components/PageHeader.qml:364
69msgid "Recent searches"
77msgid "Recent searches"
70−msgstr "Скорошни търсения"
78+msgstr "Последни търсения"
71
79
72#: Dash/Apps/AppPreview.qml:135
80#: Dash/Apps/AppPreview.qml:135
73msgid "Rate this"
81msgid "Rate this"
74−msgstr ""
82+msgstr "Оценете това"
75
83
76#. TRANSLATORS: Number of persons who rated this app/video/whatever
84#. TRANSLATORS: Number of persons who rated this app/video/whatever
77#: Dash/Previews/Header.qml:93
85#: Dash/Previews/Header.qml:93
78#, qt-format
86#, qt-format
79msgid "(%1)"
87msgid "(%1)"
80−msgstr ""
88+msgstr "(%1)"
81
89
82#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
90#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
83#: Dash/Previews/Header.qml:105
91#: Dash/Previews/Header.qml:105
84#, qt-format
92#, qt-format
85msgid "%1 review"
93msgid "%1 review"
86msgid_plural "%1 reviews"
94msgid_plural "%1 reviews"
87−msgstr[0] ""
95+msgstr[0] "%1 отзив"
88−msgstr[1] ""
96+msgstr[1] "%1 отзива"
89
97
90#: Dash/Previews/Reviews.qml:74
98#: Dash/Previews/Reviews.qml:74
91msgid "Add a review"
99msgid "Add a review"
92−msgstr ""
100+msgstr "Добави отзив"
93
101
94#: Dash/Previews/Reviews.qml:86
102#: Dash/Previews/Reviews.qml:86
95msgid "Review"
103msgid "Review"
96−msgstr ""
104+msgstr "Отзив"
97
105
98#: Dash/Previews/Reviews.qml:121
106#: Dash/Previews/Reviews.qml:121
99msgid "Send"
107msgid "Send"
100−msgstr ""
108+msgstr "Изпрати"
101
109
102#: Dash/Previews/Reviews.qml:139
110#: Dash/Previews/Reviews.qml:139
103msgid "Comments:"
111msgid "Comments:"
104−msgstr ""
112+msgstr "Коментари:"
105
113
106#: Greeter/Lockscreen.qml:149
114#: Greeter/Lockscreen.qml:149
107msgid "Emergency Call"
115msgid "Emergency Call"
108−msgstr ""
116+msgstr "Спешно повикване"
109
117
110#: Greeter/PassphraseLockscreen.qml:59
118#: Greeter/PassphraseLockscreen.qml:59
111#, qt-format
119#, qt-format
112msgid "Hello %1"
120msgid "Hello %1"
113−msgstr ""
121+msgstr "Здравей, %1"
114
122
115#: Greeter/PassphraseLockscreen.qml:59
123#: Greeter/PassphraseLockscreen.qml:59
116msgid "Hello"
124msgid "Hello"
117−msgstr ""
125+msgstr "Здравей"
118
126
119#: Hud/HudParametrizedActionsPage.qml:132
127#: Hud/HudParametrizedActionsPage.qml:132
120msgid "Confirm"
128msgid "Confirm"
@@ -122,23 +130,23 @@ msgstr "Потвърди"
122
130
123#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
131#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
124msgid "Type or say a command"
132msgid "Type or say a command"
125−msgstr ""
133+msgstr "Въведете или кажете команда"
126
134
127#: Hud/Hud.qml:84
135#: Hud/Hud.qml:84
128msgid "Loading. Please Wait..."
136msgid "Loading. Please Wait..."
129−msgstr ""
137+msgstr "Зарежда се. Моля, почакайте..."
130
138
131#: Hud/Hud.qml:89
139#: Hud/Hud.qml:89
132msgid "Speak Now..."
140msgid "Speak Now..."
133−msgstr ""
141+msgstr "Говорете сега..."
134
142
135#: Hud/Hud.qml:94
143#: Hud/Hud.qml:94
136msgid "Speaking..."
144msgid "Speaking..."
137−msgstr ""
145+msgstr "Говорете..."
138
146
139#: Notifications/NotificationMenuItemFactory.qml:89
147#: Notifications/NotificationMenuItemFactory.qml:89
140msgid "Show password"
148msgid "Show password"
141−msgstr ""
149+msgstr "Покажи паролата"
142
150
143#: Panel/SearchIndicator.qml:27
151#: Panel/SearchIndicator.qml:27
144msgid "Search"
152msgid "Search"
@@ -147,13 +155,13 @@ msgstr "Търсене"
147#: plugins/Unity/Launcher/launcheritem.cpp:43
155#: plugins/Unity/Launcher/launcheritem.cpp:43
148#: plugins/Unity/Launcher/launcheritem.cpp:73
156#: plugins/Unity/Launcher/launcheritem.cpp:73
149msgid "Lock to Launcher"
157msgid "Lock to Launcher"
150−msgstr ""
158+msgstr "Заключване към панела"
151
159
152#: plugins/Unity/Launcher/launcheritem.cpp:73
160#: plugins/Unity/Launcher/launcheritem.cpp:73
153msgid "Unlock from Launcher"
161msgid "Unlock from Launcher"
154−msgstr ""
162+msgstr "Отключи от панела за стартиране"
155
163
156#: Shell.qml:439
164#: Shell.qml:439
157#, qt-format
165#, qt-format
158msgid "Please enter %1"
166msgid "Please enter %1"
159−msgstr ""
167+msgstr "Моля, въведете %1"
po/bs.ponew file+159
@@ -0,0 +1,159 @@
1+# Bosnian translation for unity8
2+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11+"PO-Revision-Date: 2014-01-16 22:33+0000\n"
12+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13+"Language-Team: Bosnian <bs@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19+"X-Launchpad-Export-Date: 2014-01-17 07:08+0000\n"
20+"X-Generator: Launchpad (build 16901)\n"
21+
22+#: Components/EdgeDemoOverlay.qml:151
23+msgid "Skip intro"
24+msgstr ""
25+
26+#: Components/EdgeDemo.qml:112
27+msgid "Right edge"
28+msgstr ""
29+
30+#: Components/EdgeDemo.qml:113
31+msgid "Try swiping from the right edge to unlock the phone"
32+msgstr ""
33+
34+#: Components/EdgeDemo.qml:144
35+msgid "Top edge"
36+msgstr ""
37+
38+#: Components/EdgeDemo.qml:145
39+msgid "Try swiping from the top edge to access the indicators"
40+msgstr ""
41+
42+#: Components/EdgeDemo.qml:170
43+msgid "Close"
44+msgstr ""
45+
46+#: Components/EdgeDemo.qml:171
47+msgid "Swipe up again to close the settings screen"
48+msgstr ""
49+
50+#: Components/EdgeDemo.qml:198
51+msgid "Left edge"
52+msgstr ""
53+
54+#: Components/EdgeDemo.qml:199
55+msgid "Swipe from the left to reveal the launcher for quick access to apps"
56+msgstr ""
57+
58+#: Components/EdgeDemo.qml:226
59+msgid "Well done"
60+msgstr ""
61+
62+#: Components/EdgeDemo.qml:227
63+msgid ""
64+"You have now mastered the edge gestures and can start using the "
65+"phone<br><br>Tap anywhere to start"
66+msgstr ""
67+
68+#: Components/PageHeader.qml:364
69+msgid "Recent searches"
70+msgstr ""
71+
72+#: Dash/Apps/AppPreview.qml:135
73+msgid "Rate this"
74+msgstr ""
75+
76+#. TRANSLATORS: Number of persons who rated this app/video/whatever
77+#: Dash/Previews/Header.qml:93
78+#, qt-format
79+msgid "(%1)"
80+msgstr ""
81+
82+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
83+#: Dash/Previews/Header.qml:105
84+#, qt-format
85+msgid "%1 review"
86+msgid_plural "%1 reviews"
87+msgstr[0] ""
88+msgstr[1] ""
89+
90+#: Dash/Previews/Reviews.qml:74
91+msgid "Add a review"
92+msgstr ""
93+
94+#: Dash/Previews/Reviews.qml:86
95+msgid "Review"
96+msgstr ""
97+
98+#: Dash/Previews/Reviews.qml:121
99+msgid "Send"
100+msgstr ""
101+
102+#: Dash/Previews/Reviews.qml:139
103+msgid "Comments:"
104+msgstr ""
105+
106+#: Greeter/Lockscreen.qml:149
107+msgid "Emergency Call"
108+msgstr ""
109+
110+#: Greeter/PassphraseLockscreen.qml:59
111+#, qt-format
112+msgid "Hello %1"
113+msgstr ""
114+
115+#: Greeter/PassphraseLockscreen.qml:59
116+msgid "Hello"
117+msgstr ""
118+
119+#: Hud/HudParametrizedActionsPage.qml:132
120+msgid "Confirm"
121+msgstr ""
122+
123+#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
124+msgid "Type or say a command"
125+msgstr ""
126+
127+#: Hud/Hud.qml:84
128+msgid "Loading. Please Wait..."
129+msgstr ""
130+
131+#: Hud/Hud.qml:89
132+msgid "Speak Now..."
133+msgstr ""
134+
135+#: Hud/Hud.qml:94
136+msgid "Speaking..."
137+msgstr ""
138+
139+#: Notifications/NotificationMenuItemFactory.qml:89
140+msgid "Show password"
141+msgstr ""
142+
143+#: Panel/SearchIndicator.qml:27
144+msgid "Search"
145+msgstr ""
146+
147+#: plugins/Unity/Launcher/launcheritem.cpp:43
148+#: plugins/Unity/Launcher/launcheritem.cpp:73
149+msgid "Lock to Launcher"
150+msgstr ""
151+
152+#: plugins/Unity/Launcher/launcheritem.cpp:73
153+msgid "Unlock from Launcher"
154+msgstr ""
155+
156+#: Shell.qml:439
157+#, qt-format
158+msgid "Please enter %1"
159+msgstr ""
po/ckb.ponew file+160
@@ -0,0 +1,160 @@
1+# Kurdish (Sorani) translation for unity8
2+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11+"PO-Revision-Date: 2014-01-21 11:05+0000\n"
12+"Last-Translator: Aras <aras.noori@gmail.com>\n"
13+"Language-Team: Kurdish (Sorani) <ckb@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=2; plural=n != 1;\n"
18+"X-Launchpad-Export-Date: 2014-01-22 06:16+0000\n"
19+"X-Generator: Launchpad (build 16901)\n"
20+
21+#: Components/EdgeDemoOverlay.qml:151
22+msgid "Skip intro"
23+msgstr "پێشەکیی بپەڕێنە"
24+
25+#: Components/EdgeDemo.qml:112
26+msgid "Right edge"
27+msgstr "لێواری ڕاست"
28+
29+#: Components/EdgeDemo.qml:113
30+msgid "Try swiping from the right edge to unlock the phone"
31+msgstr "لێواری ڕاست ڕابکێشە بۆ کردنەوەی مۆبایلەکە"
32+
33+#: Components/EdgeDemo.qml:144
34+msgid "Top edge"
35+msgstr "لێواری سەرەوە"
36+
37+#: Components/EdgeDemo.qml:145
38+msgid "Try swiping from the top edge to access the indicators"
39+msgstr "لێواری سەرەوە ڕابکێشە بۆ گەیشتن بە نیشاندەرەکان"
40+
41+#: Components/EdgeDemo.qml:170
42+msgid "Close"
43+msgstr "داخستن"
44+
45+#: Components/EdgeDemo.qml:171
46+msgid "Swipe up again to close the settings screen"
47+msgstr "ڕایکێشەوە سەرەوە جارێکی تر بۆ داخستنی پەردەی ڕێکخستنەکان"
48+
49+#: Components/EdgeDemo.qml:198
50+msgid "Left edge"
51+msgstr "لێواری چەپ"
52+
53+#: Components/EdgeDemo.qml:199
54+msgid "Swipe from the left to reveal the launcher for quick access to apps"
55+msgstr "لە چەپەوە بچۆرەوە سەر دەستپێک بۆئەوەی بتوانی هەموو ئەپەکان ببینی"
56+
57+#: Components/EdgeDemo.qml:226
58+msgid "Well done"
59+msgstr "دەستخۆش"
60+
61+#: Components/EdgeDemo.qml:227
62+msgid ""
63+"You have now mastered the edge gestures and can start using the "
64+"phone<br><br>Tap anywhere to start"
65+msgstr ""
66+"ئێستا شارەزایییت پەیدا کرد لە جوڵەی لێوارەکان و دەتوانی مۆبایلەکە بەکار "
67+"بهێنییت<br><br>پەنجە بە شوێنێکدا بنێ بۆ دەست پێ کردن"
68+
69+#: Components/PageHeader.qml:364
70+msgid "Recent searches"
71+msgstr "دوایین گەڕانەکان"
72+
73+#: Dash/Apps/AppPreview.qml:135
74+msgid "Rate this"
75+msgstr "پلە دابنی بۆی"
76+
77+#. TRANSLATORS: Number of persons who rated this app/video/whatever
78+#: Dash/Previews/Header.qml:93
79+#, qt-format
80+msgid "(%1)"
81+msgstr "(%1)"
82+
83+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
84+#: Dash/Previews/Header.qml:105
85+#, qt-format
86+msgid "%1 review"
87+msgid_plural "%1 reviews"
88+msgstr[0] "%1 پێداچوونەوە"
89+msgstr[1] "%1 پێداچوونەوەکان"
90+
91+#: Dash/Previews/Reviews.qml:74
92+msgid "Add a review"
93+msgstr "پێداچوونەوە زۆر بکە"
94+
95+#: Dash/Previews/Reviews.qml:86
96+msgid "Review"
97+msgstr "پێداچوونەوە"
98+
99+#: Dash/Previews/Reviews.qml:121
100+msgid "Send"
101+msgstr "ناردن"
102+
103+#: Dash/Previews/Reviews.qml:139
104+msgid "Comments:"
105+msgstr "لێدوانەکان:"
106+
107+#: Greeter/Lockscreen.qml:149
108+msgid "Emergency Call"
109+msgstr "هێڵی فریاگوزاری"
110+
111+#: Greeter/PassphraseLockscreen.qml:59
112+#, qt-format
113+msgid "Hello %1"
114+msgstr "سڵاو %1"
115+
116+#: Greeter/PassphraseLockscreen.qml:59
117+msgid "Hello"
118+msgstr "سڵاو"
119+
120+#: Hud/HudParametrizedActionsPage.qml:132
121+msgid "Confirm"
122+msgstr "پشتڕاستکردنەوە"
123+
124+#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
125+msgid "Type or say a command"
126+msgstr "فەرمانێک بێژە یان بنووسە"
127+
128+#: Hud/Hud.qml:84
129+msgid "Loading. Please Wait..."
130+msgstr "لە بارکردندایە. تکایە چاوەڕێ بکە..."
131+
132+#: Hud/Hud.qml:89
133+msgid "Speak Now..."
134+msgstr "ئێستا قسە بکە"
135+
136+#: Hud/Hud.qml:94
137+msgid "Speaking..."
138+msgstr "قسە دەکات..."
139+
140+#: Notifications/NotificationMenuItemFactory.qml:89
141+msgid "Show password"
142+msgstr "تێپەڕەوشە پیشان بدە"
143+
144+#: Panel/SearchIndicator.qml:27
145+msgid "Search"
146+msgstr "گەڕان"
147+
148+#: plugins/Unity/Launcher/launcheritem.cpp:43
149+#: plugins/Unity/Launcher/launcheritem.cpp:73
150+msgid "Lock to Launcher"
151+msgstr "چەسباندن بە لانچرەوە"
152+
153+#: plugins/Unity/Launcher/launcheritem.cpp:73
154+msgid "Unlock from Launcher"
155+msgstr "ھەڵکەندن لە لانچر"
156+
157+#: Shell.qml:439
158+#, qt-format
159+msgid "Please enter %1"
160+msgstr "تکایە %1 بنووسە"
po/da.ponew file+158
@@ -0,0 +1,158 @@
1+# Danish translation for unity8
2+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11+"PO-Revision-Date: 2014-01-14 20:16+0000\n"
12+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13+"Language-Team: Danish <da@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=2; plural=n != 1;\n"
18+"X-Launchpad-Export-Date: 2014-01-15 06:35+0000\n"
19+"X-Generator: Launchpad (build 16890)\n"
20+
21+#: Components/EdgeDemoOverlay.qml:151
22+msgid "Skip intro"
23+msgstr ""
24+
25+#: Components/EdgeDemo.qml:112
26+msgid "Right edge"
27+msgstr ""
28+
29+#: Components/EdgeDemo.qml:113
30+msgid "Try swiping from the right edge to unlock the phone"
31+msgstr ""
32+
33+#: Components/EdgeDemo.qml:144
34+msgid "Top edge"
35+msgstr ""
36+
37+#: Components/EdgeDemo.qml:145
38+msgid "Try swiping from the top edge to access the indicators"
39+msgstr ""
40+
41+#: Components/EdgeDemo.qml:170
42+msgid "Close"
43+msgstr ""
44+
45+#: Components/EdgeDemo.qml:171
46+msgid "Swipe up again to close the settings screen"
47+msgstr ""
48+
49+#: Components/EdgeDemo.qml:198
50+msgid "Left edge"
51+msgstr ""
52+
53+#: Components/EdgeDemo.qml:199
54+msgid "Swipe from the left to reveal the launcher for quick access to apps"
55+msgstr ""
56+
57+#: Components/EdgeDemo.qml:226
58+msgid "Well done"
59+msgstr ""
60+
61+#: Components/EdgeDemo.qml:227
62+msgid ""
63+"You have now mastered the edge gestures and can start using the "
64+"phone<br><br>Tap anywhere to start"
65+msgstr ""
66+
67+#: Components/PageHeader.qml:364
68+msgid "Recent searches"
69+msgstr ""
70+
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
75+#. TRANSLATORS: Number of persons who rated this app/video/whatever
76+#: Dash/Previews/Header.qml:93
77+#, qt-format
78+msgid "(%1)"
79+msgstr ""
80+
81+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
82+#: Dash/Previews/Header.qml:105
83+#, qt-format
84+msgid "%1 review"
85+msgid_plural "%1 reviews"
86+msgstr[0] ""
87+msgstr[1] ""
88+
89+#: Dash/Previews/Reviews.qml:74
90+msgid "Add a review"
91+msgstr ""
92+
93+#: Dash/Previews/Reviews.qml:86
94+msgid "Review"
95+msgstr ""
96+
97+#: Dash/Previews/Reviews.qml:121
98+msgid "Send"
99+msgstr ""
100+
101+#: Dash/Previews/Reviews.qml:139
102+msgid "Comments:"
103+msgstr ""
104+
105+#: Greeter/Lockscreen.qml:149
106+msgid "Emergency Call"
107+msgstr ""
108+
109+#: Greeter/PassphraseLockscreen.qml:59
110+#, qt-format
111+msgid "Hello %1"
112+msgstr ""
113+
114+#: Greeter/PassphraseLockscreen.qml:59
115+msgid "Hello"
116+msgstr ""
117+
118+#: Hud/HudParametrizedActionsPage.qml:132
119+msgid "Confirm"
120+msgstr ""
121+
122+#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
123+msgid "Type or say a command"
124+msgstr ""
125+
126+#: Hud/Hud.qml:84
127+msgid "Loading. Please Wait..."
128+msgstr ""
129+
130+#: Hud/Hud.qml:89
131+msgid "Speak Now..."
132+msgstr ""
133+
134+#: Hud/Hud.qml:94
135+msgid "Speaking..."
136+msgstr ""
137+
138+#: Notifications/NotificationMenuItemFactory.qml:89
139+msgid "Show password"
140+msgstr ""
141+
142+#: Panel/SearchIndicator.qml:27
143+msgid "Search"
144+msgstr ""
145+
146+#: plugins/Unity/Launcher/launcheritem.cpp:43
147+#: plugins/Unity/Launcher/launcheritem.cpp:73
148+msgid "Lock to Launcher"
149+msgstr ""
150+
151+#: plugins/Unity/Launcher/launcheritem.cpp:73
152+msgid "Unlock from Launcher"
153+msgstr ""
154+
155+#: Shell.qml:439
156+#, qt-format
157+msgid "Please enter %1"
158+msgstr ""
po/de.po+8−8
@@ -8,19 +8,19 @@ msgstr ""
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: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-10-18 12:26+0000\n"
11+"PO-Revision-Date: 2014-01-15 11:01+0000\n"
12−"Last-Translator: Phillip Sz <Unknown>\n"
12+"Last-Translator: Dennis Baudys <Unknown>\n"
13"Language-Team: German <de@li.org>\n"
13"Language-Team: German <de@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2014-01-16 06:09+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
19+"X-Generator: Launchpad (build 16901)\n"
20
20
21#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
22msgid "Skip intro"
22msgid "Skip intro"
23−msgstr "Überspringe Einführung"
23+msgstr "Einführung überspringen"
24
24
25#: Components/EdgeDemo.qml:112
25#: Components/EdgeDemo.qml:112
26msgid "Right edge"
26msgid "Right edge"
@@ -125,7 +125,7 @@ msgstr "Bestätigen"
125
125
126#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
126#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
127msgid "Type or say a command"
127msgid "Type or say a command"
128−msgstr "Geben Sie einen Befehl ein oder sprechen Sie ihn"
128+msgstr "Befehl eingeben oder sprechen"
129
129
130#: Hud/Hud.qml:84
130#: Hud/Hud.qml:84
131msgid "Loading. Please Wait..."
131msgid "Loading. Please Wait..."
@@ -137,11 +137,11 @@ msgstr "Sprechen Sie jetzt …"
137
137
138#: Hud/Hud.qml:94
138#: Hud/Hud.qml:94
139msgid "Speaking..."
139msgid "Speaking..."
140−msgstr "Sie sprechen …"
140+msgstr "Sprechen Sie …"
141
141
142#: Notifications/NotificationMenuItemFactory.qml:89
142#: Notifications/NotificationMenuItemFactory.qml:89
143msgid "Show password"
143msgid "Show password"
144−msgstr ""
144+msgstr "Passwort anzeigen"
145
145
146#: Panel/SearchIndicator.qml:27
146#: Panel/SearchIndicator.qml:27
147msgid "Search"
147msgid "Search"
po/el.po+32−28
@@ -8,61 +8,65 @@ msgstr ""
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: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-06-27 00:53+0000\n"
11+"PO-Revision-Date: 2014-01-15 16:34+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12+"Last-Translator: Filippos Kolyvas <Unknown>\n"
13"Language-Team: Greek <el@li.org>\n"
13"Language-Team: Greek <el@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2014-01-16 06:09+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
19+"X-Generator: Launchpad (build 16901)\n"
20
20
21#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
22msgid "Skip intro"
22msgid "Skip intro"
23−msgstr ""
23+msgstr "Παράλειψη εισαγωγής"
24
24
25#: Components/EdgeDemo.qml:112
25#: Components/EdgeDemo.qml:112
26msgid "Right edge"
26msgid "Right edge"
27−msgstr ""
27+msgstr "Δεξί άκρο"
28
28
29#: Components/EdgeDemo.qml:113
29#: Components/EdgeDemo.qml:113
30msgid "Try swiping from the right edge to unlock the phone"
30msgid "Try swiping from the right edge to unlock the phone"
31−msgstr ""
31+msgstr "Σύρετε από το δεξί άκρο για ξεκλείδωμα του τηλεφώνου"
32
32
33#: Components/EdgeDemo.qml:144
33#: Components/EdgeDemo.qml:144
34msgid "Top edge"
34msgid "Top edge"
35−msgstr ""
35+msgstr "Πάνω άκρο"
36
36
37#: Components/EdgeDemo.qml:145
37#: Components/EdgeDemo.qml:145
38msgid "Try swiping from the top edge to access the indicators"
38msgid "Try swiping from the top edge to access the indicators"
39−msgstr ""
39+msgstr "Σύρετε από το πάνω άκρο για πρόσβαση στις ρυθμίσεις"
40
40
41#: Components/EdgeDemo.qml:170
41#: Components/EdgeDemo.qml:170
42msgid "Close"
42msgid "Close"
43−msgstr ""
43+msgstr "Κλείσιμο"
44
44
45#: Components/EdgeDemo.qml:171
45#: Components/EdgeDemo.qml:171
46msgid "Swipe up again to close the settings screen"
46msgid "Swipe up again to close the settings screen"
47−msgstr ""
47+msgstr "Σύρετε προς τα επάνω για κλείσιμο των ρυθμίσεων"
48
48
49#: Components/EdgeDemo.qml:198
49#: Components/EdgeDemo.qml:198
50msgid "Left edge"
50msgid "Left edge"
51−msgstr ""
51+msgstr "Αριστερό άκρο"
52
52
53#: Components/EdgeDemo.qml:199
53#: Components/EdgeDemo.qml:199
54msgid "Swipe from the left to reveal the launcher for quick access to apps"
54msgid "Swipe from the left to reveal the launcher for quick access to apps"
55msgstr ""
55msgstr ""
56+"Σύρετε από τα αριστερό άκρο για εμφάνιση του εκκινητή για άμεση πρόσβαση "
57+"στις εφαρμογές"
56
58
57#: Components/EdgeDemo.qml:226
59#: Components/EdgeDemo.qml:226
58msgid "Well done"
60msgid "Well done"
59−msgstr ""
61+msgstr "Συγχαρητήρια"
60
62
61#: Components/EdgeDemo.qml:227
63#: Components/EdgeDemo.qml:227
62msgid ""
64msgid ""
63"You have now mastered the edge gestures and can start using the "
65"You have now mastered the edge gestures and can start using the "
64"phone<br><br>Tap anywhere to start"
66"phone<br><br>Tap anywhere to start"
65msgstr ""
67msgstr ""
68+"Τώρα γνωρίζετε τις χειρονομίες άκρων και μπορείτε να αρχίσετε να "
69+"χρησιμοποιείτε το τηλέφωνο<br><br>Πατήστε οπουδήποτε για να ξεκινήσετε"
66
70
67#: Components/PageHeader.qml:364
71#: Components/PageHeader.qml:364
68msgid "Recent searches"
72msgid "Recent searches"
@@ -70,50 +74,50 @@ msgstr "Πρόσφατες αναζητήσεις"
70
74
71#: Dash/Apps/AppPreview.qml:135
75#: Dash/Apps/AppPreview.qml:135
72msgid "Rate this"
76msgid "Rate this"
73−msgstr ""
77+msgstr "Βαθμολογήστε το"
74
78
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
79#. TRANSLATORS: Number of persons who rated this app/video/whatever
76#: Dash/Previews/Header.qml:93
80#: Dash/Previews/Header.qml:93
77#, qt-format
81#, qt-format
78msgid "(%1)"
82msgid "(%1)"
79−msgstr ""
83+msgstr "(%1)"
80
84
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
85#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
82#: Dash/Previews/Header.qml:105
86#: Dash/Previews/Header.qml:105
83#, qt-format
87#, qt-format
84msgid "%1 review"
88msgid "%1 review"
85msgid_plural "%1 reviews"
89msgid_plural "%1 reviews"
86−msgstr[0] ""
90+msgstr[0] "%1 αξιολόγηση"
87−msgstr[1] ""
91+msgstr[1] "%1 αξιολογήσεις"
88
92
89#: Dash/Previews/Reviews.qml:74
93#: Dash/Previews/Reviews.qml:74
90msgid "Add a review"
94msgid "Add a review"
91−msgstr ""
95+msgstr "Προσθέστε την αξιολόγησή σας"
92
96
93#: Dash/Previews/Reviews.qml:86
97#: Dash/Previews/Reviews.qml:86
94msgid "Review"
98msgid "Review"
95−msgstr ""
99+msgstr "Αξιολόγηση"
96
100
97#: Dash/Previews/Reviews.qml:121
101#: Dash/Previews/Reviews.qml:121
98msgid "Send"
102msgid "Send"
99−msgstr ""
103+msgstr "Αποστολή"
100
104
101#: Dash/Previews/Reviews.qml:139
105#: Dash/Previews/Reviews.qml:139
102msgid "Comments:"
106msgid "Comments:"
103−msgstr ""
107+msgstr "Σχόλια:"
104
108
105#: Greeter/Lockscreen.qml:149
109#: Greeter/Lockscreen.qml:149
106msgid "Emergency Call"
110msgid "Emergency Call"
107−msgstr ""
111+msgstr "Κλήση έκτακτης ανάγκης"
108
112
109#: Greeter/PassphraseLockscreen.qml:59
113#: Greeter/PassphraseLockscreen.qml:59
110#, qt-format
114#, qt-format
111msgid "Hello %1"
115msgid "Hello %1"
112−msgstr ""
116+msgstr "Γεια σας %1"
113
117
114#: Greeter/PassphraseLockscreen.qml:59
118#: Greeter/PassphraseLockscreen.qml:59
115msgid "Hello"
119msgid "Hello"
116−msgstr ""
120+msgstr "Γεια σας"
117
121
118#: Hud/HudParametrizedActionsPage.qml:132
122#: Hud/HudParametrizedActionsPage.qml:132
119msgid "Confirm"
123msgid "Confirm"
@@ -137,7 +141,7 @@ msgstr "Ομιλία..."
137
141
138#: Notifications/NotificationMenuItemFactory.qml:89
142#: Notifications/NotificationMenuItemFactory.qml:89
139msgid "Show password"
143msgid "Show password"
140−msgstr ""
144+msgstr "Εμφάνιση κωδικού"
141
145
142#: Panel/SearchIndicator.qml:27
146#: Panel/SearchIndicator.qml:27
143msgid "Search"
147msgid "Search"
@@ -146,13 +150,13 @@ msgstr "Αναζήτηση"
146#: plugins/Unity/Launcher/launcheritem.cpp:43
150#: plugins/Unity/Launcher/launcheritem.cpp:43
147#: plugins/Unity/Launcher/launcheritem.cpp:73
151#: plugins/Unity/Launcher/launcheritem.cpp:73
148msgid "Lock to Launcher"
152msgid "Lock to Launcher"
149−msgstr ""
153+msgstr "Διατήρηση στον εκκινητή"
150
154
151#: plugins/Unity/Launcher/launcheritem.cpp:73
155#: plugins/Unity/Launcher/launcheritem.cpp:73
152msgid "Unlock from Launcher"
156msgid "Unlock from Launcher"
153−msgstr ""
157+msgstr "Απομάκρυνση από τον εκκινητή"
154
158
155#: Shell.qml:439
159#: Shell.qml:439
156#, qt-format
160#, qt-format
157msgid "Please enter %1"
161msgid "Please enter %1"
158−msgstr ""
162+msgstr "Πληκτρολογήστε %1"
po/en_GB.po+28−26
@@ -8,61 +8,63 @@ msgstr ""
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: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-06-27 08:53+0000\n"
11+"PO-Revision-Date: 2014-01-14 20:46+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12+"Last-Translator: Dan Bishop <dan@danbishop.org>\n"
13"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
13"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2014-01-15 06:35+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
19+"X-Generator: Launchpad (build 16890)\n"
20
20
21#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
22msgid "Skip intro"
22msgid "Skip intro"
23−msgstr ""
23+msgstr "Skip intro"
24
24
25#: Components/EdgeDemo.qml:112
25#: Components/EdgeDemo.qml:112
26msgid "Right edge"
26msgid "Right edge"
27−msgstr ""
27+msgstr "Right edge"
28
28
29#: Components/EdgeDemo.qml:113
29#: Components/EdgeDemo.qml:113
30msgid "Try swiping from the right edge to unlock the phone"
30msgid "Try swiping from the right edge to unlock the phone"
31−msgstr ""
31+msgstr "Try swiping from the right edge to unlock the phone"
32
32
33#: Components/EdgeDemo.qml:144
33#: Components/EdgeDemo.qml:144
34msgid "Top edge"
34msgid "Top edge"
35−msgstr ""
35+msgstr "Top edge"
36
36
37#: Components/EdgeDemo.qml:145
37#: Components/EdgeDemo.qml:145
38msgid "Try swiping from the top edge to access the indicators"
38msgid "Try swiping from the top edge to access the indicators"
39−msgstr ""
39+msgstr "Try swiping from the top edge to access the indicators"
40
40
41#: Components/EdgeDemo.qml:170
41#: Components/EdgeDemo.qml:170
42msgid "Close"
42msgid "Close"
43−msgstr ""
43+msgstr "Close"
44
44
45#: Components/EdgeDemo.qml:171
45#: Components/EdgeDemo.qml:171
46msgid "Swipe up again to close the settings screen"
46msgid "Swipe up again to close the settings screen"
47−msgstr ""
47+msgstr "Swipe up again to close the settings screen"
48
48
49#: Components/EdgeDemo.qml:198
49#: Components/EdgeDemo.qml:198
50msgid "Left edge"
50msgid "Left edge"
51−msgstr ""
51+msgstr "Left edge"
52
52
53#: Components/EdgeDemo.qml:199
53#: Components/EdgeDemo.qml:199
54msgid "Swipe from the left to reveal the launcher for quick access to apps"
54msgid "Swipe from the left to reveal the launcher for quick access to apps"
55−msgstr ""
55+msgstr "Swipe from the left to reveal the launcher for quick access to apps"
56
56
57#: Components/EdgeDemo.qml:226
57#: Components/EdgeDemo.qml:226
58msgid "Well done"
58msgid "Well done"
59−msgstr ""
59+msgstr "Well done"
60
60
61#: Components/EdgeDemo.qml:227
61#: Components/EdgeDemo.qml:227
62msgid ""
62msgid ""
63"You have now mastered the edge gestures and can start using the "
63"You have now mastered the edge gestures and can start using the "
64"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
65msgstr ""
65msgstr ""
66+"You have now mastered the edge gestures and can start using the "
67+"phone<br><br>Tap anywhere to start"
66
68
67#: Components/PageHeader.qml:364
69#: Components/PageHeader.qml:364
68msgid "Recent searches"
70msgid "Recent searches"
@@ -70,41 +72,41 @@ msgstr "Recent searches"
70
72
71#: Dash/Apps/AppPreview.qml:135
73#: Dash/Apps/AppPreview.qml:135
72msgid "Rate this"
74msgid "Rate this"
73−msgstr ""
75+msgstr "Rate this"
74
76
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
77#. TRANSLATORS: Number of persons who rated this app/video/whatever
76#: Dash/Previews/Header.qml:93
78#: Dash/Previews/Header.qml:93
77#, qt-format
79#, qt-format
78msgid "(%1)"
80msgid "(%1)"
79−msgstr ""
81+msgstr "(%1)"
80
82
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
83#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
82#: Dash/Previews/Header.qml:105
84#: Dash/Previews/Header.qml:105
83#, qt-format
85#, qt-format
84msgid "%1 review"
86msgid "%1 review"
85msgid_plural "%1 reviews"
87msgid_plural "%1 reviews"
86−msgstr[0] ""
88+msgstr[0] "%1 review"
87−msgstr[1] ""
89+msgstr[1] "%1 reviews"
88
90
89#: Dash/Previews/Reviews.qml:74
91#: Dash/Previews/Reviews.qml:74
90msgid "Add a review"
92msgid "Add a review"
91−msgstr ""
93+msgstr "Add a review"
92
94
93#: Dash/Previews/Reviews.qml:86
95#: Dash/Previews/Reviews.qml:86
94msgid "Review"
96msgid "Review"
95−msgstr ""
97+msgstr "Review"
96
98
97#: Dash/Previews/Reviews.qml:121
99#: Dash/Previews/Reviews.qml:121
98msgid "Send"
100msgid "Send"
99−msgstr ""
101+msgstr "Send"
100
102
101#: Dash/Previews/Reviews.qml:139
103#: Dash/Previews/Reviews.qml:139
102msgid "Comments:"
104msgid "Comments:"
103−msgstr ""
105+msgstr "Comments:"
104
106
105#: Greeter/Lockscreen.qml:149
107#: Greeter/Lockscreen.qml:149
106msgid "Emergency Call"
108msgid "Emergency Call"
107−msgstr ""
109+msgstr "Emergency Call"
108
110
109#: Greeter/PassphraseLockscreen.qml:59
111#: Greeter/PassphraseLockscreen.qml:59
110#, qt-format
112#, qt-format
@@ -137,7 +139,7 @@ msgstr "Speaking..."
137
139
138#: Notifications/NotificationMenuItemFactory.qml:89
140#: Notifications/NotificationMenuItemFactory.qml:89
139msgid "Show password"
141msgid "Show password"
140−msgstr ""
142+msgstr "Show password"
141
143
142#: Panel/SearchIndicator.qml:27
144#: Panel/SearchIndicator.qml:27
143msgid "Search"
145msgid "Search"
@@ -146,11 +148,11 @@ msgstr "Search"
146#: plugins/Unity/Launcher/launcheritem.cpp:43
148#: plugins/Unity/Launcher/launcheritem.cpp:43
147#: plugins/Unity/Launcher/launcheritem.cpp:73
149#: plugins/Unity/Launcher/launcheritem.cpp:73
148msgid "Lock to Launcher"
150msgid "Lock to Launcher"
149−msgstr ""
151+msgstr "Lock to Launcher"
150
152
151#: plugins/Unity/Launcher/launcheritem.cpp:73
153#: plugins/Unity/Launcher/launcheritem.cpp:73
152msgid "Unlock from Launcher"
154msgid "Unlock from Launcher"
153−msgstr ""
155+msgstr "Unlock from Launcher"
154
156
155#: Shell.qml:439
157#: Shell.qml:439
156#, qt-format
158#, qt-format
po/es.po+7−6
@@ -8,15 +8,15 @@ msgstr ""
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: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-11-20 08:46+0000\n"
11+"PO-Revision-Date: 2014-01-15 18:49+0000\n"
12−"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
12+"Last-Translator: Paco Molinero <paco@byasl.com>\n"
13"Language-Team: Spanish <es@li.org>\n"
13"Language-Team: Spanish <es@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2014-01-16 06:09+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
19+"X-Generator: Launchpad (build 16901)\n"
20
20
21#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
22msgid "Skip intro"
22msgid "Skip intro"
@@ -36,7 +36,8 @@ msgstr "Borde superior"
36
36
37#: Components/EdgeDemo.qml:145
37#: Components/EdgeDemo.qml:145
38msgid "Try swiping from the top edge to access the indicators"
38msgid "Try swiping from the top edge to access the indicators"
39+msgstr ""
39−msgstr "Deslice el dedo desde el borde superior para acceder a los menús"
40+"Deslice el dedo desde el borde superior para acceder a los indicadores"
40
41
41#: Components/EdgeDemo.qml:170
42#: Components/EdgeDemo.qml:170
42msgid "Close"
43msgid "Close"
@@ -113,7 +114,7 @@ msgstr "Llamada de emergencia"
113#: Greeter/PassphraseLockscreen.qml:59
114#: Greeter/PassphraseLockscreen.qml:59
114#, qt-format
115#, qt-format
115msgid "Hello %1"
116msgid "Hello %1"
116−msgstr "Hola %1"
117+msgstr "Hola, %1"
117
118
118#: Greeter/PassphraseLockscreen.qml:59
119#: Greeter/PassphraseLockscreen.qml:59
119msgid "Hello"
120msgid "Hello"
po/eu.ponew file+160
@@ -0,0 +1,160 @@
1+# Basque translation for unity8
2+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11+"PO-Revision-Date: 2014-02-03 22:04+0000\n"
12+"Last-Translator: Ibai Oihanguren Sala <Unknown>\n"
13+"Language-Team: Basque <eu@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=2; plural=n != 1;\n"
18+"X-Launchpad-Export-Date: 2014-02-04 07:02+0000\n"
19+"X-Generator: Launchpad (build 16916)\n"
20+
21+#: Components/EdgeDemoOverlay.qml:151
22+msgid "Skip intro"
23+msgstr "Saltatu aurkezpena"
24+
25+#: Components/EdgeDemo.qml:112
26+msgid "Right edge"
27+msgstr "Eskuineko ertza"
28+
29+#: Components/EdgeDemo.qml:113
30+msgid "Try swiping from the right edge to unlock the phone"
31+msgstr "Probatu eskuineko ertzetik arrastatzen telefonoa desblokeatzeko"
32+
33+#: Components/EdgeDemo.qml:144
34+msgid "Top edge"
35+msgstr "Goiko ertza"
36+
37+#: Components/EdgeDemo.qml:145
38+msgid "Try swiping from the top edge to access the indicators"
39+msgstr "Probatu goiko ertzetik arrastatzen adierazleak ikusteko"
40+
41+#: Components/EdgeDemo.qml:170
42+msgid "Close"
43+msgstr "Itxi"
44+
45+#: Components/EdgeDemo.qml:171
46+msgid "Swipe up again to close the settings screen"
47+msgstr "Arrastatu gora berriro ezarpenen leihoa ixteko"
48+
49+#: Components/EdgeDemo.qml:198
50+msgid "Left edge"
51+msgstr "Ezkerreko ertza"
52+
53+#: Components/EdgeDemo.qml:199
54+msgid "Swipe from the left to reveal the launcher for quick access to apps"
55+msgstr ""
56+"Arrastatu ezkerretik abiarazlea erakutsi eta aplikazioak eskura berehala "
57+"izateko"
58+
59+#: Components/EdgeDemo.qml:226
60+msgid "Well done"
61+msgstr "Bikain"
62+
63+#: Components/EdgeDemo.qml:227
64+msgid ""
65+"You have now mastered the edge gestures and can start using the "
66+"phone<br><br>Tap anywhere to start"
67+msgstr ""
68+
69+#: Components/PageHeader.qml:364
70+msgid "Recent searches"
71+msgstr ""
72+
73+#: Dash/Apps/AppPreview.qml:135
74+msgid "Rate this"
75+msgstr ""
76+
77+#. TRANSLATORS: Number of persons who rated this app/video/whatever
78+#: Dash/Previews/Header.qml:93
79+#, qt-format
80+msgid "(%1)"
81+msgstr ""
82+
83+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
84+#: Dash/Previews/Header.qml:105
85+#, qt-format
86+msgid "%1 review"
87+msgid_plural "%1 reviews"
88+msgstr[0] ""
89+msgstr[1] ""
90+
91+#: Dash/Previews/Reviews.qml:74
92+msgid "Add a review"
93+msgstr ""
94+
95+#: Dash/Previews/Reviews.qml:86
96+msgid "Review"
97+msgstr ""
98+
99+#: Dash/Previews/Reviews.qml:121
100+msgid "Send"
101+msgstr ""
102+
103+#: Dash/Previews/Reviews.qml:139
104+msgid "Comments:"
105+msgstr ""
106+
107+#: Greeter/Lockscreen.qml:149
108+msgid "Emergency Call"
109+msgstr ""
110+
111+#: Greeter/PassphraseLockscreen.qml:59
112+#, qt-format
113+msgid "Hello %1"
114+msgstr ""
115+
116+#: Greeter/PassphraseLockscreen.qml:59
117+msgid "Hello"
118+msgstr ""
119+
120+#: Hud/HudParametrizedActionsPage.qml:132
121+msgid "Confirm"
122+msgstr ""
123+
124+#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
125+msgid "Type or say a command"
126+msgstr ""
127+
128+#: Hud/Hud.qml:84
129+msgid "Loading. Please Wait..."
130+msgstr ""
131+
132+#: Hud/Hud.qml:89
133+msgid "Speak Now..."
134+msgstr ""
135+
136+#: Hud/Hud.qml:94
137+msgid "Speaking..."
138+msgstr ""
139+
140+#: Notifications/NotificationMenuItemFactory.qml:89
141+msgid "Show password"
142+msgstr ""
143+
144+#: Panel/SearchIndicator.qml:27
145+msgid "Search"
146+msgstr ""
147+
148+#: plugins/Unity/Launcher/launcheritem.cpp:43
149+#: plugins/Unity/Launcher/launcheritem.cpp:73
150+msgid "Lock to Launcher"
151+msgstr ""
152+
153+#: plugins/Unity/Launcher/launcheritem.cpp:73
154+msgid "Unlock from Launcher"
155+msgstr ""
156+
157+#: Shell.qml:439
158+#, qt-format
159+msgid "Please enter %1"
160+msgstr ""
po/fo.po+5−5
@@ -8,15 +8,15 @@ msgstr ""
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: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-10-01 15:13+0000\n"
11+"PO-Revision-Date: 2014-01-14 20:08+0000\n"
12"Last-Translator: Jógvan Olsen <jeggy@jebster.net>\n"
12"Last-Translator: Jógvan Olsen <jeggy@jebster.net>\n"
13"Language-Team: Faroese <fo@li.org>\n"
13"Language-Team: Faroese <fo@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2014-01-15 06:35+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
19+"X-Generator: Launchpad (build 16890)\n"
20
20
21#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
22msgid "Skip intro"
22msgid "Skip intro"
@@ -24,7 +24,7 @@ msgstr ""
24
24
25#: Components/EdgeDemo.qml:112
25#: Components/EdgeDemo.qml:112
26msgid "Right edge"
26msgid "Right edge"
27−msgstr ""
27+msgstr "Høgra kant"
28
28
29#: Components/EdgeDemo.qml:113
29#: Components/EdgeDemo.qml:113
30msgid "Try swiping from the right edge to unlock the phone"
30msgid "Try swiping from the right edge to unlock the phone"
@@ -32,7 +32,7 @@ msgstr ""
32
32
33#: Components/EdgeDemo.qml:144
33#: Components/EdgeDemo.qml:144
34msgid "Top edge"
34msgid "Top edge"
35−msgstr ""
35+msgstr "Topp kantur"
36
36
37#: Components/EdgeDemo.qml:145
37#: Components/EdgeDemo.qml:145
38msgid "Try swiping from the top edge to access the indicators"
38msgid "Try swiping from the top edge to access the indicators"
po/fr.po+29−29
@@ -8,23 +8,23 @@ msgstr ""
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: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-06-27 03:21+0000\n"
11+"PO-Revision-Date: 2014-01-28 00:34+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12+"Last-Translator: Pierre <Unknown>\n"
13"Language-Team: French <fr@li.org>\n"
13"Language-Team: French <fr@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2014-01-28 07:06+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
19+"X-Generator: Launchpad (build 16914)\n"
20
20
21#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
22msgid "Skip intro"
22msgid "Skip intro"
23−msgstr ""
23+msgstr "Passer l'intro"
24
24
25#: Components/EdgeDemo.qml:112
25#: Components/EdgeDemo.qml:112
26msgid "Right edge"
26msgid "Right edge"
27−msgstr ""
27+msgstr "Bord droit"
28
28
29#: Components/EdgeDemo.qml:113
29#: Components/EdgeDemo.qml:113
30msgid "Try swiping from the right edge to unlock the phone"
30msgid "Try swiping from the right edge to unlock the phone"
@@ -32,7 +32,7 @@ msgstr ""
32
32
33#: Components/EdgeDemo.qml:144
33#: Components/EdgeDemo.qml:144
34msgid "Top edge"
34msgid "Top edge"
35−msgstr ""
35+msgstr "Bord supérieur"
36
36
37#: Components/EdgeDemo.qml:145
37#: Components/EdgeDemo.qml:145
38msgid "Try swiping from the top edge to access the indicators"
38msgid "Try swiping from the top edge to access the indicators"
@@ -40,7 +40,7 @@ msgstr ""
40
40
41#: Components/EdgeDemo.qml:170
41#: Components/EdgeDemo.qml:170
42msgid "Close"
42msgid "Close"
43−msgstr ""
43+msgstr "Fermer"
44
44
45#: Components/EdgeDemo.qml:171
45#: Components/EdgeDemo.qml:171
46msgid "Swipe up again to close the settings screen"
46msgid "Swipe up again to close the settings screen"
@@ -48,7 +48,7 @@ msgstr ""
48
48
49#: Components/EdgeDemo.qml:198
49#: Components/EdgeDemo.qml:198
50msgid "Left edge"
50msgid "Left edge"
51−msgstr ""
51+msgstr "Bord gauche"
52
52
53#: Components/EdgeDemo.qml:199
53#: Components/EdgeDemo.qml:199
54msgid "Swipe from the left to reveal the launcher for quick access to apps"
54msgid "Swipe from the left to reveal the launcher for quick access to apps"
@@ -66,70 +66,70 @@ msgstr ""
66
66
67#: Components/PageHeader.qml:364
67#: Components/PageHeader.qml:364
68msgid "Recent searches"
68msgid "Recent searches"
69−msgstr ""
69+msgstr "Recherches récentes"
70
70
71#: Dash/Apps/AppPreview.qml:135
71#: Dash/Apps/AppPreview.qml:135
72msgid "Rate this"
72msgid "Rate this"
73−msgstr ""
73+msgstr "Evaluez ceci"
74
74
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
76#: Dash/Previews/Header.qml:93
76#: Dash/Previews/Header.qml:93
77#, qt-format
77#, qt-format
78msgid "(%1)"
78msgid "(%1)"
79−msgstr ""
79+msgstr "(%1)"
80
80
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
82#: Dash/Previews/Header.qml:105
82#: Dash/Previews/Header.qml:105
83#, qt-format
83#, qt-format
84msgid "%1 review"
84msgid "%1 review"
85msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
86−msgstr[0] ""
86+msgstr[0] "%1 avis"
87−msgstr[1] ""
87+msgstr[1] "%1 avis"
88
88
89#: Dash/Previews/Reviews.qml:74
89#: Dash/Previews/Reviews.qml:74
90msgid "Add a review"
90msgid "Add a review"
91−msgstr ""
91+msgstr "Ajouter un avis"
92
92
93#: Dash/Previews/Reviews.qml:86
93#: Dash/Previews/Reviews.qml:86
94msgid "Review"
94msgid "Review"
95−msgstr ""
95+msgstr "Avis"
96
96
97#: Dash/Previews/Reviews.qml:121
97#: Dash/Previews/Reviews.qml:121
98msgid "Send"
98msgid "Send"
99−msgstr ""
99+msgstr "Envoyer"
100
100
101#: Dash/Previews/Reviews.qml:139
101#: Dash/Previews/Reviews.qml:139
102msgid "Comments:"
102msgid "Comments:"
103−msgstr ""
103+msgstr "Commentaires :"
104
104
105#: Greeter/Lockscreen.qml:149
105#: Greeter/Lockscreen.qml:149
106msgid "Emergency Call"
106msgid "Emergency Call"
107−msgstr ""
107+msgstr "Appel d'urgence"
108
108
109#: Greeter/PassphraseLockscreen.qml:59
109#: Greeter/PassphraseLockscreen.qml:59
110#, qt-format
110#, qt-format
111msgid "Hello %1"
111msgid "Hello %1"
112−msgstr ""
112+msgstr "Bonjour %1"
113
113
114#: Greeter/PassphraseLockscreen.qml:59
114#: Greeter/PassphraseLockscreen.qml:59
115msgid "Hello"
115msgid "Hello"
116−msgstr ""
116+msgstr "Bonjour"
117
117
118#: Hud/HudParametrizedActionsPage.qml:132
118#: Hud/HudParametrizedActionsPage.qml:132
119msgid "Confirm"
119msgid "Confirm"
120−msgstr ""
120+msgstr "Confirmez"
121
121
122#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
122#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
123msgid "Type or say a command"
123msgid "Type or say a command"
124−msgstr ""
124+msgstr "Rédigez ou dictez une commande"
125
125
126#: Hud/Hud.qml:84
126#: Hud/Hud.qml:84
127msgid "Loading. Please Wait..."
127msgid "Loading. Please Wait..."
128−msgstr ""
128+msgstr "Chargement. Veuillez patienter…"
129
129
130#: Hud/Hud.qml:89
130#: Hud/Hud.qml:89
131msgid "Speak Now..."
131msgid "Speak Now..."
132−msgstr ""
132+msgstr "Parlez maintenant…"
133
133
134#: Hud/Hud.qml:94
134#: Hud/Hud.qml:94
135msgid "Speaking..."
135msgid "Speaking..."
@@ -137,16 +137,16 @@ msgstr ""
137
137
138#: Notifications/NotificationMenuItemFactory.qml:89
138#: Notifications/NotificationMenuItemFactory.qml:89
139msgid "Show password"
139msgid "Show password"
140−msgstr ""
140+msgstr "Afficher le mot de passe"
141
141
142#: Panel/SearchIndicator.qml:27
142#: Panel/SearchIndicator.qml:27
143msgid "Search"
143msgid "Search"
144−msgstr ""
144+msgstr "Rechercher"
145
145
146#: plugins/Unity/Launcher/launcheritem.cpp:43
146#: plugins/Unity/Launcher/launcheritem.cpp:43
147#: plugins/Unity/Launcher/launcheritem.cpp:73
147#: plugins/Unity/Launcher/launcheritem.cpp:73
148msgid "Lock to Launcher"
148msgid "Lock to Launcher"
149−msgstr ""
149+msgstr "Conserver dans le lanceur"
150
150
151#: plugins/Unity/Launcher/launcheritem.cpp:73
151#: plugins/Unity/Launcher/launcheritem.cpp:73
152msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
@@ -155,4 +155,4 @@ msgstr ""
155#: Shell.qml:439
155#: Shell.qml:439
156#, qt-format
156#, qt-format
157msgid "Please enter %1"
157msgid "Please enter %1"
158−msgstr ""
158+msgstr "Veuillez saisir %1"
po/hi.ponew file+158
@@ -0,0 +1,158 @@
1+# Hindi translation for unity8
2+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11+"PO-Revision-Date: 2014-01-15 01:49+0000\n"
12+"Last-Translator: Siddhanathan S. <Unknown>\n"
13+"Language-Team: Hindi <hi@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=2; plural=n != 1;\n"
18+"X-Launchpad-Export-Date: 2014-01-16 06:09+0000\n"
19+"X-Generator: Launchpad (build 16901)\n"
20+
21+#: Components/EdgeDemoOverlay.qml:151
22+msgid "Skip intro"
23+msgstr "परिचय छोड़"
24+
25+#: Components/EdgeDemo.qml:112
26+msgid "Right edge"
27+msgstr "दायाँ किनारा"
28+
29+#: Components/EdgeDemo.qml:113
30+msgid "Try swiping from the right edge to unlock the phone"
31+msgstr ""
32+
33+#: Components/EdgeDemo.qml:144
34+msgid "Top edge"
35+msgstr "ऊपर किनारे"
36+
37+#: Components/EdgeDemo.qml:145
38+msgid "Try swiping from the top edge to access the indicators"
39+msgstr ""
40+
41+#: Components/EdgeDemo.qml:170
42+msgid "Close"
43+msgstr "बंद करें"
44+
45+#: Components/EdgeDemo.qml:171
46+msgid "Swipe up again to close the settings screen"
47+msgstr ""
48+
49+#: Components/EdgeDemo.qml:198
50+msgid "Left edge"
51+msgstr "बायाँ किनारा"
52+
53+#: Components/EdgeDemo.qml:199
54+msgid "Swipe from the left to reveal the launcher for quick access to apps"
55+msgstr ""
56+
57+#: Components/EdgeDemo.qml:226
58+msgid "Well done"
59+msgstr "शाबाश"
60+
61+#: Components/EdgeDemo.qml:227
62+msgid ""
63+"You have now mastered the edge gestures and can start using the "
64+"phone<br><br>Tap anywhere to start"
65+msgstr ""
66+
67+#: Components/PageHeader.qml:364
68+msgid "Recent searches"
69+msgstr "पिछले खोजों"
70+
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
75+#. TRANSLATORS: Number of persons who rated this app/video/whatever
76+#: Dash/Previews/Header.qml:93
77+#, qt-format
78+msgid "(%1)"
79+msgstr ""
80+
81+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
82+#: Dash/Previews/Header.qml:105
83+#, qt-format
84+msgid "%1 review"
85+msgid_plural "%1 reviews"
86+msgstr[0] ""
87+msgstr[1] ""
88+
89+#: Dash/Previews/Reviews.qml:74
90+msgid "Add a review"
91+msgstr "समीक्षा दे"
92+
93+#: Dash/Previews/Reviews.qml:86
94+msgid "Review"
95+msgstr "समीक्षा"
96+
97+#: Dash/Previews/Reviews.qml:121
98+msgid "Send"
99+msgstr "भेजें"
100+
101+#: Dash/Previews/Reviews.qml:139
102+msgid "Comments:"
103+msgstr ""
104+
105+#: Greeter/Lockscreen.qml:149
106+msgid "Emergency Call"
107+msgstr "आपातकालीन कॉल"
108+
109+#: Greeter/PassphraseLockscreen.qml:59
110+#, qt-format
111+msgid "Hello %1"
112+msgstr ""
113+
114+#: Greeter/PassphraseLockscreen.qml:59
115+msgid "Hello"
116+msgstr "नमस्ते"
117+
118+#: Hud/HudParametrizedActionsPage.qml:132
119+msgid "Confirm"
120+msgstr ""
121+
122+#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
123+msgid "Type or say a command"
124+msgstr ""
125+
126+#: Hud/Hud.qml:84
127+msgid "Loading. Please Wait..."
128+msgstr "काम कर रहा है | कृपया प्रतीक्षा करे |"
129+
130+#: Hud/Hud.qml:89
131+msgid "Speak Now..."
132+msgstr "अब बात करें"
133+
134+#: Hud/Hud.qml:94
135+msgid "Speaking..."
136+msgstr "अब बोल रहे हैं"
137+
138+#: Notifications/NotificationMenuItemFactory.qml:89
139+msgid "Show password"
140+msgstr ""
141+
142+#: Panel/SearchIndicator.qml:27
143+msgid "Search"
144+msgstr "खोजें"
145+
146+#: plugins/Unity/Launcher/launcheritem.cpp:43
147+#: plugins/Unity/Launcher/launcheritem.cpp:73
148+msgid "Lock to Launcher"
149+msgstr ""
150+
151+#: plugins/Unity/Launcher/launcheritem.cpp:73
152+msgid "Unlock from Launcher"
153+msgstr ""
154+
155+#: Shell.qml:439
156+#, qt-format
157+msgid "Please enter %1"
158+msgstr ""
po/hu.po+5−5
@@ -8,15 +8,15 @@ msgstr ""
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: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2014-01-07 18:02+0000\n"
11+"PO-Revision-Date: 2014-01-14 23:02+0000\n"
12−"Last-Translator: Gabor Kelemen <kelemeng@gnome.hu>\n"
12+"Last-Translator: Kristóf Kiszel <Unknown>\n"
13"Language-Team: Hungarian <hu@li.org>\n"
13"Language-Team: Hungarian <hu@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-01-08 05:43+0000\n"
18+"X-Launchpad-Export-Date: 2014-01-15 06:35+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
19+"X-Generator: Launchpad (build 16890)\n"
20
20
21#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
22msgid "Skip intro"
22msgid "Skip intro"
@@ -133,7 +133,7 @@ msgstr "Betöltés, kis türelmet…"
133
133
134#: Hud/Hud.qml:89
134#: Hud/Hud.qml:89
135msgid "Speak Now..."
135msgid "Speak Now..."
136−msgstr "Beszéljen most…"
136+msgstr "Most beszéljen…"
137
137
138#: Hud/Hud.qml:94
138#: Hud/Hud.qml:94
139msgid "Speaking..."
139msgid "Speaking..."
po/it.po+7−7
@@ -8,15 +8,15 @@ msgstr ""
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: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-10-07 09:34+0000\n"
11+"PO-Revision-Date: 2014-01-22 09:15+0000\n"
12−"Last-Translator: Claudio Arseni <claudio.arseni@gmail.com>\n"
12+"Last-Translator: Domenico <domenico.verde125@live.it>\n"
13"Language-Team: Italian <it@li.org>\n"
13"Language-Team: Italian <it@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2014-01-23 06:00+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
19+"X-Generator: Launchpad (build 16901)\n"
20
20
21#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
22msgid "Skip intro"
22msgid "Skip intro"
@@ -144,7 +144,7 @@ msgstr "Sto parlando..."
144
144
145#: Notifications/NotificationMenuItemFactory.qml:89
145#: Notifications/NotificationMenuItemFactory.qml:89
146msgid "Show password"
146msgid "Show password"
147−msgstr ""
147+msgstr "Mostra password"
148
148
149#: Panel/SearchIndicator.qml:27
149#: Panel/SearchIndicator.qml:27
150msgid "Search"
150msgid "Search"
@@ -153,11 +153,11 @@ msgstr "Cerca"
153#: plugins/Unity/Launcher/launcheritem.cpp:43
153#: plugins/Unity/Launcher/launcheritem.cpp:43
154#: plugins/Unity/Launcher/launcheritem.cpp:73
154#: plugins/Unity/Launcher/launcheritem.cpp:73
155msgid "Lock to Launcher"
155msgid "Lock to Launcher"
156−msgstr ""
156+msgstr "Blocca nel Launcher"
157
157
158#: plugins/Unity/Launcher/launcheritem.cpp:73
158#: plugins/Unity/Launcher/launcheritem.cpp:73
159msgid "Unlock from Launcher"
159msgid "Unlock from Launcher"
160−msgstr ""
160+msgstr "Sblocca dal Launcher"
161
161
162#: Shell.qml:439
162#: Shell.qml:439
163#, qt-format
163#, qt-format
po/ja.po+20−20
@@ -8,15 +8,15 @@ msgstr ""
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: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-06-26 22:36+0000\n"
11+"PO-Revision-Date: 2014-01-18 07:01+0000\n"
12−"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12+"Last-Translator: Shushi Kurose <md81bird@hitaki.net>\n"
13"Language-Team: Japanese <ja@li.org>\n"
13"Language-Team: Japanese <ja@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2014-01-19 06:02+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
19+"X-Generator: Launchpad (build 16901)\n"
20
20
21#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
22msgid "Skip intro"
22msgid "Skip intro"
@@ -24,7 +24,7 @@ msgstr ""
24
24
25#: Components/EdgeDemo.qml:112
25#: Components/EdgeDemo.qml:112
26msgid "Right edge"
26msgid "Right edge"
27−msgstr ""
27+msgstr "右端"
28
28
29#: Components/EdgeDemo.qml:113
29#: Components/EdgeDemo.qml:113
30msgid "Try swiping from the right edge to unlock the phone"
30msgid "Try swiping from the right edge to unlock the phone"
@@ -32,7 +32,7 @@ msgstr ""
32
32
33#: Components/EdgeDemo.qml:144
33#: Components/EdgeDemo.qml:144
34msgid "Top edge"
34msgid "Top edge"
35−msgstr ""
35+msgstr "上端"
36
36
37#: Components/EdgeDemo.qml:145
37#: Components/EdgeDemo.qml:145
38msgid "Try swiping from the top edge to access the indicators"
38msgid "Try swiping from the top edge to access the indicators"
@@ -40,7 +40,7 @@ msgstr ""
40
40
41#: Components/EdgeDemo.qml:170
41#: Components/EdgeDemo.qml:170
42msgid "Close"
42msgid "Close"
43−msgstr ""
43+msgstr "閉じる"
44
44
45#: Components/EdgeDemo.qml:171
45#: Components/EdgeDemo.qml:171
46msgid "Swipe up again to close the settings screen"
46msgid "Swipe up again to close the settings screen"
@@ -48,7 +48,7 @@ msgstr ""
48
48
49#: Components/EdgeDemo.qml:198
49#: Components/EdgeDemo.qml:198
50msgid "Left edge"
50msgid "Left edge"
51−msgstr ""
51+msgstr "左端"
52
52
53#: Components/EdgeDemo.qml:199
53#: Components/EdgeDemo.qml:199
54msgid "Swipe from the left to reveal the launcher for quick access to apps"
54msgid "Swipe from the left to reveal the launcher for quick access to apps"
@@ -66,7 +66,7 @@ msgstr ""
66
66
67#: Components/PageHeader.qml:364
67#: Components/PageHeader.qml:364
68msgid "Recent searches"
68msgid "Recent searches"
69−msgstr ""
69+msgstr "最近の検索"
70
70
71#: Dash/Apps/AppPreview.qml:135
71#: Dash/Apps/AppPreview.qml:135
72msgid "Rate this"
72msgid "Rate this"
@@ -76,7 +76,7 @@ msgstr ""
76#: Dash/Previews/Header.qml:93
76#: Dash/Previews/Header.qml:93
77#, qt-format
77#, qt-format
78msgid "(%1)"
78msgid "(%1)"
79−msgstr ""
79+msgstr "(%1)"
80
80
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
82#: Dash/Previews/Header.qml:105
82#: Dash/Previews/Header.qml:105
@@ -96,11 +96,11 @@ msgstr ""
96
96
97#: Dash/Previews/Reviews.qml:121
97#: Dash/Previews/Reviews.qml:121
98msgid "Send"
98msgid "Send"
99−msgstr ""
99+msgstr "送信"
100
100
101#: Dash/Previews/Reviews.qml:139
101#: Dash/Previews/Reviews.qml:139
102msgid "Comments:"
102msgid "Comments:"
103−msgstr ""
103+msgstr "コメント:"
104
104
105#: Greeter/Lockscreen.qml:149
105#: Greeter/Lockscreen.qml:149
106msgid "Emergency Call"
106msgid "Emergency Call"
@@ -113,11 +113,11 @@ msgstr ""
113
113
114#: Greeter/PassphraseLockscreen.qml:59
114#: Greeter/PassphraseLockscreen.qml:59
115msgid "Hello"
115msgid "Hello"
116−msgstr ""
116+msgstr "こんにちは"
117
117
118#: Hud/HudParametrizedActionsPage.qml:132
118#: Hud/HudParametrizedActionsPage.qml:132
119msgid "Confirm"
119msgid "Confirm"
120−msgstr ""
120+msgstr "確認"
121
121
122#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
122#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
123msgid "Type or say a command"
123msgid "Type or say a command"
@@ -125,11 +125,11 @@ msgstr ""
125
125
126#: Hud/Hud.qml:84
126#: Hud/Hud.qml:84
127msgid "Loading. Please Wait..."
127msgid "Loading. Please Wait..."
128−msgstr ""
128+msgstr "読み込み中です。お待ちください..."
129
129
130#: Hud/Hud.qml:89
130#: Hud/Hud.qml:89
131msgid "Speak Now..."
131msgid "Speak Now..."
132−msgstr ""
132+msgstr "音声入力を開始..."
133
133
134#: Hud/Hud.qml:94
134#: Hud/Hud.qml:94
135msgid "Speaking..."
135msgid "Speaking..."
@@ -137,20 +137,20 @@ msgstr ""
137
137
138#: Notifications/NotificationMenuItemFactory.qml:89
138#: Notifications/NotificationMenuItemFactory.qml:89
139msgid "Show password"
139msgid "Show password"
140−msgstr ""
140+msgstr "パスワードを表示"
141
141
142#: Panel/SearchIndicator.qml:27
142#: Panel/SearchIndicator.qml:27
143msgid "Search"
143msgid "Search"
144−msgstr ""
144+msgstr "検索"
145
145
146#: plugins/Unity/Launcher/launcheritem.cpp:43
146#: plugins/Unity/Launcher/launcheritem.cpp:43
147#: plugins/Unity/Launcher/launcheritem.cpp:73
147#: plugins/Unity/Launcher/launcheritem.cpp:73
148msgid "Lock to Launcher"
148msgid "Lock to Launcher"
149−msgstr ""
149+msgstr "Launcherに登録"
150
150
151#: plugins/Unity/Launcher/launcheritem.cpp:73
151#: plugins/Unity/Launcher/launcheritem.cpp:73
152msgid "Unlock from Launcher"
152msgid "Unlock from Launcher"
153−msgstr ""
153+msgstr "Launcherへの登録を解除"
154
154
155#: Shell.qml:439
155#: Shell.qml:439
156#, qt-format
156#, qt-format
po/lt.ponew file+165
@@ -0,0 +1,165 @@
1+# Lithuanian translation for unity8
2+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11+"PO-Revision-Date: 2014-01-15 12:42+0000\n"
12+"Last-Translator: Gediminas Paulauskas <menesis@pov.lt>\n"
13+"Language-Team: Lithuanian <lt@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18+"(n%100<10 || n%100>=20) ? 1 : 2;\n"
19+"X-Launchpad-Export-Date: 2014-01-16 06:09+0000\n"
20+"X-Generator: Launchpad (build 16901)\n"
21+
22+#: Components/EdgeDemoOverlay.qml:151
23+msgid "Skip intro"
24+msgstr "Praleisti įžangą"
25+
26+#: Components/EdgeDemo.qml:112
27+msgid "Right edge"
28+msgstr "Dešinysis kraštas"
29+
30+#: Components/EdgeDemo.qml:113
31+msgid "Try swiping from the right edge to unlock the phone"
32+msgstr "Pabandykite braukti nuo dešiniojo krašto, kad atrakintumėte telefoną"
33+
34+#: Components/EdgeDemo.qml:144
35+msgid "Top edge"
36+msgstr "Viršutinis kraštas"
37+
38+#: Components/EdgeDemo.qml:145
39+msgid "Try swiping from the top edge to access the indicators"
40+msgstr ""
41+"Pabandykite braukti nuo dešiniojo krašto, kad pasiektumėte indikatorius"
42+
43+#: Components/EdgeDemo.qml:170
44+msgid "Close"
45+msgstr "Užverti"
46+
47+#: Components/EdgeDemo.qml:171
48+msgid "Swipe up again to close the settings screen"
49+msgstr "Braukite aukštyn, kad užvertumėte nustatymų langą"
50+
51+#: Components/EdgeDemo.qml:198
52+msgid "Left edge"
53+msgstr "Kairysis kraštas"
54+
55+#: Components/EdgeDemo.qml:199
56+msgid "Swipe from the left to reveal the launcher for quick access to apps"
57+msgstr ""
58+"Braukite nuo kairiojo krašto, kad pamatytumėte skydelį greitam programų "
59+"paleidimui"
60+
61+#: Components/EdgeDemo.qml:226
62+msgid "Well done"
63+msgstr "Šaunu"
64+
65+#: Components/EdgeDemo.qml:227
66+msgid ""
67+"You have now mastered the edge gestures and can start using the "
68+"phone<br><br>Tap anywhere to start"
69+msgstr ""
70+"Jūs išmokote kraštų gestus, ir galite pradėti naudotis "
71+"telefonu.<br><br>Palieskite bet kur ir pradėkite"
72+
73+#: Components/PageHeader.qml:364
74+msgid "Recent searches"
75+msgstr "Paskiausios paieškos"
76+
77+#: Dash/Apps/AppPreview.qml:135
78+msgid "Rate this"
79+msgstr "Įvertinkite tai"
80+
81+#. TRANSLATORS: Number of persons who rated this app/video/whatever
82+#: Dash/Previews/Header.qml:93
83+#, qt-format
84+msgid "(%1)"
85+msgstr "(%1)"
86+
87+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
88+#: Dash/Previews/Header.qml:105
89+#, qt-format
90+msgid "%1 review"
91+msgid_plural "%1 reviews"
92+msgstr[0] "%1 apžvalga"
93+msgstr[1] "%1 apžvalgos"
94+msgstr[2] "%1 apžvalgų"
95+
96+#: Dash/Previews/Reviews.qml:74
97+msgid "Add a review"
98+msgstr "Pridėkite apžvalgą"
99+
100+#: Dash/Previews/Reviews.qml:86
101+msgid "Review"
102+msgstr "Apžvalga"
103+
104+#: Dash/Previews/Reviews.qml:121
105+msgid "Send"
106+msgstr "Siųsti"
107+
108+#: Dash/Previews/Reviews.qml:139
109+msgid "Comments:"
110+msgstr "Komentarai:"
111+
112+#: Greeter/Lockscreen.qml:149
113+msgid "Emergency Call"
114+msgstr "Pagalbos skambutis"
115+
116+#: Greeter/PassphraseLockscreen.qml:59
117+#, qt-format
118+msgid "Hello %1"
119+msgstr "Laba diena, %1"
120+
121+#: Greeter/PassphraseLockscreen.qml:59
122+msgid "Hello"
123+msgstr "Sveiki"
124+
125+#: Hud/HudParametrizedActionsPage.qml:132
126+msgid "Confirm"
127+msgstr "Patvirtinti"
128+
129+#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
130+msgid "Type or say a command"
131+msgstr "Rašykite arba sakykite komandą"
132+
133+#: Hud/Hud.qml:84
134+msgid "Loading. Please Wait..."
135+msgstr "Įkeliama. Prašom palaukti..."
136+
137+#: Hud/Hud.qml:89
138+msgid "Speak Now..."
139+msgstr "Kalbėkite..."
140+
141+#: Hud/Hud.qml:94
142+msgid "Speaking..."
143+msgstr "Kalbama..."
144+
145+#: Notifications/NotificationMenuItemFactory.qml:89
146+msgid "Show password"
147+msgstr "Rodyti slaptažodį"
148+
149+#: Panel/SearchIndicator.qml:27
150+msgid "Search"
151+msgstr "Paieška"
152+
153+#: plugins/Unity/Launcher/launcheritem.cpp:43
154+#: plugins/Unity/Launcher/launcheritem.cpp:73
155+msgid "Lock to Launcher"
156+msgstr "Palikti mygtukų juostoje"
157+
158+#: plugins/Unity/Launcher/launcheritem.cpp:73
159+msgid "Unlock from Launcher"
160+msgstr "Nelaikyti mygtukų juostoje"
161+
162+#: Shell.qml:439
163+#, qt-format
164+msgid "Please enter %1"
165+msgstr "Prašom įvesti %1"
po/mr.ponew file+158
@@ -0,0 +1,158 @@
1+# Marathi translation for unity8
2+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11+"PO-Revision-Date: 2014-01-14 19:54+0000\n"
12+"Last-Translator: Rohan Deshmukh <Unknown>\n"
13+"Language-Team: Marathi <mr@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=2; plural=n != 1;\n"
18+"X-Launchpad-Export-Date: 2014-01-15 06:35+0000\n"
19+"X-Generator: Launchpad (build 16890)\n"
20+
21+#: Components/EdgeDemoOverlay.qml:151
22+msgid "Skip intro"
23+msgstr "परिचय वगळा"
24+
25+#: Components/EdgeDemo.qml:112
26+msgid "Right edge"
27+msgstr "उजवा काठ"
28+
29+#: Components/EdgeDemo.qml:113
30+msgid "Try swiping from the right edge to unlock the phone"
31+msgstr "फोन अनलॉक करण्यासाठी उजव्या काठावरुन स्वाइप करण्याचा प्रयत्न करा"
32+
33+#: Components/EdgeDemo.qml:144
34+msgid "Top edge"
35+msgstr "वरचा काठ"
36+
37+#: Components/EdgeDemo.qml:145
38+msgid "Try swiping from the top edge to access the indicators"
39+msgstr "इंडिकेटर वापरण्याकरिता वरचा काठावरून स्वाइप करण्याचा प्रयत्न करा"
40+
41+#: Components/EdgeDemo.qml:170
42+msgid "Close"
43+msgstr "बंद करा"
44+
45+#: Components/EdgeDemo.qml:171
46+msgid "Swipe up again to close the settings screen"
47+msgstr "सेटिंग्ज स्क्रीन बंद करण्यासाठी पुन्हा एकदा स्वाइप करा"
48+
49+#: Components/EdgeDemo.qml:198
50+msgid "Left edge"
51+msgstr "डावा काठ"
52+
53+#: Components/EdgeDemo.qml:199
54+msgid "Swipe from the left to reveal the launcher for quick access to apps"
55+msgstr "लाँचर वरील अॕप्प्स त्वरित वापरण्याकरिता डाव्या बाजूने स्वाइप करा"
56+
57+#: Components/EdgeDemo.qml:226
58+msgid "Well done"
59+msgstr "कौशल्यपूर्वक केले"
60+
61+#: Components/EdgeDemo.qml:227
62+msgid ""
63+"You have now mastered the edge gestures and can start using the "
64+"phone<br><br>Tap anywhere to start"
65+msgstr ""
66+
67+#: Components/PageHeader.qml:364
68+msgid "Recent searches"
69+msgstr ""
70+
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
75+#. TRANSLATORS: Number of persons who rated this app/video/whatever
76+#: Dash/Previews/Header.qml:93
77+#, qt-format
78+msgid "(%1)"
79+msgstr ""
80+
81+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
82+#: Dash/Previews/Header.qml:105
83+#, qt-format
84+msgid "%1 review"
85+msgid_plural "%1 reviews"
86+msgstr[0] ""
87+msgstr[1] ""
88+
89+#: Dash/Previews/Reviews.qml:74
90+msgid "Add a review"
91+msgstr ""
92+
93+#: Dash/Previews/Reviews.qml:86
94+msgid "Review"
95+msgstr ""
96+
97+#: Dash/Previews/Reviews.qml:121
98+msgid "Send"
99+msgstr ""
100+
101+#: Dash/Previews/Reviews.qml:139
102+msgid "Comments:"
103+msgstr ""
104+
105+#: Greeter/Lockscreen.qml:149
106+msgid "Emergency Call"
107+msgstr ""
108+
109+#: Greeter/PassphraseLockscreen.qml:59
110+#, qt-format
111+msgid "Hello %1"
112+msgstr ""
113+
114+#: Greeter/PassphraseLockscreen.qml:59
115+msgid "Hello"
116+msgstr ""
117+
118+#: Hud/HudParametrizedActionsPage.qml:132
119+msgid "Confirm"
120+msgstr ""
121+
122+#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
123+msgid "Type or say a command"
124+msgstr ""
125+
126+#: Hud/Hud.qml:84
127+msgid "Loading. Please Wait..."
128+msgstr ""
129+
130+#: Hud/Hud.qml:89
131+msgid "Speak Now..."
132+msgstr ""
133+
134+#: Hud/Hud.qml:94
135+msgid "Speaking..."
136+msgstr ""
137+
138+#: Notifications/NotificationMenuItemFactory.qml:89
139+msgid "Show password"
140+msgstr ""
141+
142+#: Panel/SearchIndicator.qml:27
143+msgid "Search"
144+msgstr ""
145+
146+#: plugins/Unity/Launcher/launcheritem.cpp:43
147+#: plugins/Unity/Launcher/launcheritem.cpp:73
148+msgid "Lock to Launcher"
149+msgstr ""
150+
151+#: plugins/Unity/Launcher/launcheritem.cpp:73
152+msgid "Unlock from Launcher"
153+msgstr ""
154+
155+#: Shell.qml:439
156+#, qt-format
157+msgid "Please enter %1"
158+msgstr ""
po/ms.ponew file+160
@@ -0,0 +1,160 @@
1+# Malay translation for unity8
2+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11+"PO-Revision-Date: 2014-01-17 09:05+0000\n"
12+"Last-Translator: abuyop <Unknown>\n"
13+"Language-Team: Malay <ms@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=2; plural=n != 1;\n"
18+"X-Launchpad-Export-Date: 2014-01-18 07:11+0000\n"
19+"X-Generator: Launchpad (build 16901)\n"
20+
21+#: Components/EdgeDemoOverlay.qml:151
22+msgid "Skip intro"
23+msgstr "Langkau pengenalan"
24+
25+#: Components/EdgeDemo.qml:112
26+msgid "Right edge"
27+msgstr "Pinggir kanan"
28+
29+#: Components/EdgeDemo.qml:113
30+msgid "Try swiping from the right edge to unlock the phone"
31+msgstr "Cuba meleret dari pinggir kanan untuk buka aktifkan telefon"
32+
33+#: Components/EdgeDemo.qml:144
34+msgid "Top edge"
35+msgstr "Pinggir atas"
36+
37+#: Components/EdgeDemo.qml:145
38+msgid "Try swiping from the top edge to access the indicators"
39+msgstr "Cuba meleret dari pinggir atas untuk buka aktifkan telefon"
40+
41+#: Components/EdgeDemo.qml:170
42+msgid "Close"
43+msgstr "Tutup"
44+
45+#: Components/EdgeDemo.qml:171
46+msgid "Swipe up again to close the settings screen"
47+msgstr "Leret ke atas sekali lagi untuk menutup skrin tetapan"
48+
49+#: Components/EdgeDemo.qml:198
50+msgid "Left edge"
51+msgstr "Pinggir kiri"
52+
53+#: Components/EdgeDemo.qml:199
54+msgid "Swipe from the left to reveal the launcher for quick access to apps"
55+msgstr "Leret dari kiri untuk munculkan pelancar untuk capaian pantas ke apl"
56+
57+#: Components/EdgeDemo.qml:226
58+msgid "Well done"
59+msgstr "Bagus"
60+
61+#: Components/EdgeDemo.qml:227
62+msgid ""
63+"You have now mastered the edge gestures and can start using the "
64+"phone<br><br>Tap anywhere to start"
65+msgstr ""
66+"Anda kini sudah mahir gerak isyarat pinggir dan boleh mulakan "
67+"telefon<br><br>Ketik dimana shaja untuk mula"
68+
69+#: Components/PageHeader.qml:364
70+msgid "Recent searches"
71+msgstr "Gelintar baru-baru ini"
72+
73+#: Dash/Apps/AppPreview.qml:135
74+msgid "Rate this"
75+msgstr "Kadar ini"
76+
77+#. TRANSLATORS: Number of persons who rated this app/video/whatever
78+#: Dash/Previews/Header.qml:93
79+#, qt-format
80+msgid "(%1)"
81+msgstr "(%1)"
82+
83+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
84+#: Dash/Previews/Header.qml:105
85+#, qt-format
86+msgid "%1 review"
87+msgid_plural "%1 reviews"
88+msgstr[0] "%1 ulasan"
89+msgstr[1] "%1 ulasan"
90+
91+#: Dash/Previews/Reviews.qml:74
92+msgid "Add a review"
93+msgstr "Tambah ulasan"
94+
95+#: Dash/Previews/Reviews.qml:86
96+msgid "Review"
97+msgstr "Tinjauan"
98+
99+#: Dash/Previews/Reviews.qml:121
100+msgid "Send"
101+msgstr "Hantar"
102+
103+#: Dash/Previews/Reviews.qml:139
104+msgid "Comments:"
105+msgstr "Ulasan:"
106+
107+#: Greeter/Lockscreen.qml:149
108+msgid "Emergency Call"
109+msgstr "panggilan Kecemasan"
110+
111+#: Greeter/PassphraseLockscreen.qml:59
112+#, qt-format
113+msgid "Hello %1"
114+msgstr "Hai %1"
115+
116+#: Greeter/PassphraseLockscreen.qml:59
117+msgid "Hello"
118+msgstr "Hello"
119+
120+#: Hud/HudParametrizedActionsPage.qml:132
121+msgid "Confirm"
122+msgstr "Sahkan"
123+
124+#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
125+msgid "Type or say a command"
126+msgstr "Taip atau sebut satu perintah"
127+
128+#: Hud/Hud.qml:84
129+msgid "Loading. Please Wait..."
130+msgstr "Memuatkan. Tunggu Sebentar..."
131+
132+#: Hud/Hud.qml:89
133+msgid "Speak Now..."
134+msgstr "Cakap Sekarang..."
135+
136+#: Hud/Hud.qml:94
137+msgid "Speaking..."
138+msgstr "Bercakap..."
139+
140+#: Notifications/NotificationMenuItemFactory.qml:89
141+msgid "Show password"
142+msgstr "Tunjuk kata laluan"
143+
144+#: Panel/SearchIndicator.qml:27
145+msgid "Search"
146+msgstr "Gelintar"
147+
148+#: plugins/Unity/Launcher/launcheritem.cpp:43
149+#: plugins/Unity/Launcher/launcheritem.cpp:73
150+msgid "Lock to Launcher"
151+msgstr "Kunci ke Pelancar"
152+
153+#: plugins/Unity/Launcher/launcheritem.cpp:73
154+msgid "Unlock from Launcher"
155+msgstr "Tanggalkan dari Pelancar"
156+
157+#: Shell.qml:439
158+#, qt-format
159+msgid "Please enter %1"
160+msgstr "Sila masukkan %1"
po/nl.po+29−27
@@ -8,23 +8,23 @@ msgstr ""
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: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-06-27 07:19+0000\n"
11+"PO-Revision-Date: 2014-01-15 16:42+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12+"Last-Translator: Hannie Dumoleyn <Unknown>\n"
13"Language-Team: Dutch <nl@li.org>\n"
13"Language-Team: Dutch <nl@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2014-01-16 06:09+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
19+"X-Generator: Launchpad (build 16901)\n"
20
20
21#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
22msgid "Skip intro"
22msgid "Skip intro"
23−msgstr ""
23+msgstr "Intro overslaan"
24
24
25#: Components/EdgeDemo.qml:112
25#: Components/EdgeDemo.qml:112
26msgid "Right edge"
26msgid "Right edge"
27−msgstr ""
27+msgstr "Rechterrand"
28
28
29#: Components/EdgeDemo.qml:113
29#: Components/EdgeDemo.qml:113
30msgid "Try swiping from the right edge to unlock the phone"
30msgid "Try swiping from the right edge to unlock the phone"
@@ -32,7 +32,7 @@ msgstr ""
32
32
33#: Components/EdgeDemo.qml:144
33#: Components/EdgeDemo.qml:144
34msgid "Top edge"
34msgid "Top edge"
35−msgstr ""
35+msgstr "Bovenrand"
36
36
37#: Components/EdgeDemo.qml:145
37#: Components/EdgeDemo.qml:145
38msgid "Try swiping from the top edge to access the indicators"
38msgid "Try swiping from the top edge to access the indicators"
@@ -40,29 +40,31 @@ msgstr ""
40
40
41#: Components/EdgeDemo.qml:170
41#: Components/EdgeDemo.qml:170
42msgid "Close"
42msgid "Close"
43−msgstr ""
43+msgstr "Sluiten"
44
44
45#: Components/EdgeDemo.qml:171
45#: Components/EdgeDemo.qml:171
46msgid "Swipe up again to close the settings screen"
46msgid "Swipe up again to close the settings screen"
47−msgstr ""
47+msgstr "Veeg nogmaals omhoog om het instellingenscherm te sluiten"
48
48
49#: Components/EdgeDemo.qml:198
49#: Components/EdgeDemo.qml:198
50msgid "Left edge"
50msgid "Left edge"
51−msgstr ""
51+msgstr "Linkerrand"
52
52
53#: Components/EdgeDemo.qml:199
53#: Components/EdgeDemo.qml:199
54msgid "Swipe from the left to reveal the launcher for quick access to apps"
54msgid "Swipe from the left to reveal the launcher for quick access to apps"
55−msgstr ""
55+msgstr "Veeg vanaf links om de Starter te tonen voor snelle toegang tot apps"
56
56
57#: Components/EdgeDemo.qml:226
57#: Components/EdgeDemo.qml:226
58msgid "Well done"
58msgid "Well done"
59−msgstr ""
59+msgstr "Goed gedaan"
60
60
61#: Components/EdgeDemo.qml:227
61#: Components/EdgeDemo.qml:227
62msgid ""
62msgid ""
63"You have now mastered the edge gestures and can start using the "
63"You have now mastered the edge gestures and can start using the "
64"phone<br><br>Tap anywhere to start"
64"phone<br><br>Tap anywhere to start"
65msgstr ""
65msgstr ""
66+"Nu je het vegen onder de knie hebt, kun je de telefoon gebruiken<br><br>Tik "
67+"ergens om te beginnen"
66
68
67#: Components/PageHeader.qml:364
69#: Components/PageHeader.qml:364
68msgid "Recent searches"
70msgid "Recent searches"
@@ -70,50 +72,50 @@ msgstr "Recente zoekopdrachten"
70
72
71#: Dash/Apps/AppPreview.qml:135
73#: Dash/Apps/AppPreview.qml:135
72msgid "Rate this"
74msgid "Rate this"
73−msgstr ""
75+msgstr "Beoordeel dit"
74
76
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
77#. TRANSLATORS: Number of persons who rated this app/video/whatever
76#: Dash/Previews/Header.qml:93
78#: Dash/Previews/Header.qml:93
77#, qt-format
79#, qt-format
78msgid "(%1)"
80msgid "(%1)"
79−msgstr ""
81+msgstr "(%1)"
80
82
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
83#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
82#: Dash/Previews/Header.qml:105
84#: Dash/Previews/Header.qml:105
83#, qt-format
85#, qt-format
84msgid "%1 review"
86msgid "%1 review"
85msgid_plural "%1 reviews"
87msgid_plural "%1 reviews"
86−msgstr[0] ""
88+msgstr[0] "%1 recensie"
87−msgstr[1] ""
89+msgstr[1] "%1 recensies"
88
90
89#: Dash/Previews/Reviews.qml:74
91#: Dash/Previews/Reviews.qml:74
90msgid "Add a review"
92msgid "Add a review"
91−msgstr ""
93+msgstr "Voeg recensie toe"
92
94
93#: Dash/Previews/Reviews.qml:86
95#: Dash/Previews/Reviews.qml:86
94msgid "Review"
96msgid "Review"
95−msgstr ""
97+msgstr "Recensie"
96
98
97#: Dash/Previews/Reviews.qml:121
99#: Dash/Previews/Reviews.qml:121
98msgid "Send"
100msgid "Send"
99−msgstr ""
101+msgstr "Versturen"
100
102
101#: Dash/Previews/Reviews.qml:139
103#: Dash/Previews/Reviews.qml:139
102msgid "Comments:"
104msgid "Comments:"
103−msgstr ""
105+msgstr "Reacties:"
104
106
105#: Greeter/Lockscreen.qml:149
107#: Greeter/Lockscreen.qml:149
106msgid "Emergency Call"
108msgid "Emergency Call"
107−msgstr ""
109+msgstr "Noodoproep"
108
110
109#: Greeter/PassphraseLockscreen.qml:59
111#: Greeter/PassphraseLockscreen.qml:59
110#, qt-format
112#, qt-format
111msgid "Hello %1"
113msgid "Hello %1"
112−msgstr ""
114+msgstr "Hallo %1"
113
115
114#: Greeter/PassphraseLockscreen.qml:59
116#: Greeter/PassphraseLockscreen.qml:59
115msgid "Hello"
117msgid "Hello"
116−msgstr ""
118+msgstr "Hallo"
117
119
118#: Hud/HudParametrizedActionsPage.qml:132
120#: Hud/HudParametrizedActionsPage.qml:132
119msgid "Confirm"
121msgid "Confirm"
@@ -137,7 +139,7 @@ msgstr "Inspreken…"
137
139
138#: Notifications/NotificationMenuItemFactory.qml:89
140#: Notifications/NotificationMenuItemFactory.qml:89
139msgid "Show password"
141msgid "Show password"
140−msgstr ""
142+msgstr "Wachtwoord tonen"
141
143
142#: Panel/SearchIndicator.qml:27
144#: Panel/SearchIndicator.qml:27
143msgid "Search"
145msgid "Search"
@@ -146,13 +148,13 @@ msgstr "Zoeken"
146#: plugins/Unity/Launcher/launcheritem.cpp:43
148#: plugins/Unity/Launcher/launcheritem.cpp:43
147#: plugins/Unity/Launcher/launcheritem.cpp:73
149#: plugins/Unity/Launcher/launcheritem.cpp:73
148msgid "Lock to Launcher"
150msgid "Lock to Launcher"
149−msgstr ""
151+msgstr "In Starter vastzetten"
150
152
151#: plugins/Unity/Launcher/launcheritem.cpp:73
153#: plugins/Unity/Launcher/launcheritem.cpp:73
152msgid "Unlock from Launcher"
154msgid "Unlock from Launcher"
153−msgstr ""
155+msgstr "Uit Starter verwijderen"
154
156
155#: Shell.qml:439
157#: Shell.qml:439
156#, qt-format
158#, qt-format
157msgid "Please enter %1"
159msgid "Please enter %1"
158−msgstr ""
160+msgstr "Voer %1 in"
po/pt.ponew file+158
@@ -0,0 +1,158 @@
1+# Portuguese translation for unity8
2+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11+"PO-Revision-Date: 2014-01-14 19:18+0000\n"
12+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13+"Language-Team: Portuguese <pt@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=2; plural=n != 1;\n"
18+"X-Launchpad-Export-Date: 2014-01-15 06:35+0000\n"
19+"X-Generator: Launchpad (build 16890)\n"
20+
21+#: Components/EdgeDemoOverlay.qml:151
22+msgid "Skip intro"
23+msgstr ""
24+
25+#: Components/EdgeDemo.qml:112
26+msgid "Right edge"
27+msgstr ""
28+
29+#: Components/EdgeDemo.qml:113
30+msgid "Try swiping from the right edge to unlock the phone"
31+msgstr ""
32+
33+#: Components/EdgeDemo.qml:144
34+msgid "Top edge"
35+msgstr ""
36+
37+#: Components/EdgeDemo.qml:145
38+msgid "Try swiping from the top edge to access the indicators"
39+msgstr ""
40+
41+#: Components/EdgeDemo.qml:170
42+msgid "Close"
43+msgstr ""
44+
45+#: Components/EdgeDemo.qml:171
46+msgid "Swipe up again to close the settings screen"
47+msgstr ""
48+
49+#: Components/EdgeDemo.qml:198
50+msgid "Left edge"
51+msgstr ""
52+
53+#: Components/EdgeDemo.qml:199
54+msgid "Swipe from the left to reveal the launcher for quick access to apps"
55+msgstr ""
56+
57+#: Components/EdgeDemo.qml:226
58+msgid "Well done"
59+msgstr ""
60+
61+#: Components/EdgeDemo.qml:227
62+msgid ""
63+"You have now mastered the edge gestures and can start using the "
64+"phone<br><br>Tap anywhere to start"
65+msgstr ""
66+
67+#: Components/PageHeader.qml:364
68+msgid "Recent searches"
69+msgstr ""
70+
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
75+#. TRANSLATORS: Number of persons who rated this app/video/whatever
76+#: Dash/Previews/Header.qml:93
77+#, qt-format
78+msgid "(%1)"
79+msgstr ""
80+
81+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
82+#: Dash/Previews/Header.qml:105
83+#, qt-format
84+msgid "%1 review"
85+msgid_plural "%1 reviews"
86+msgstr[0] ""
87+msgstr[1] ""
88+
89+#: Dash/Previews/Reviews.qml:74
90+msgid "Add a review"
91+msgstr ""
92+
93+#: Dash/Previews/Reviews.qml:86
94+msgid "Review"
95+msgstr ""
96+
97+#: Dash/Previews/Reviews.qml:121
98+msgid "Send"
99+msgstr ""
100+
101+#: Dash/Previews/Reviews.qml:139
102+msgid "Comments:"
103+msgstr ""
104+
105+#: Greeter/Lockscreen.qml:149
106+msgid "Emergency Call"
107+msgstr ""
108+
109+#: Greeter/PassphraseLockscreen.qml:59
110+#, qt-format
111+msgid "Hello %1"
112+msgstr ""
113+
114+#: Greeter/PassphraseLockscreen.qml:59
115+msgid "Hello"
116+msgstr ""
117+
118+#: Hud/HudParametrizedActionsPage.qml:132
119+msgid "Confirm"
120+msgstr ""
121+
122+#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
123+msgid "Type or say a command"
124+msgstr ""
125+
126+#: Hud/Hud.qml:84
127+msgid "Loading. Please Wait..."
128+msgstr ""
129+
130+#: Hud/Hud.qml:89
131+msgid "Speak Now..."
132+msgstr ""
133+
134+#: Hud/Hud.qml:94
135+msgid "Speaking..."
136+msgstr ""
137+
138+#: Notifications/NotificationMenuItemFactory.qml:89
139+msgid "Show password"
140+msgstr ""
141+
142+#: Panel/SearchIndicator.qml:27
143+msgid "Search"
144+msgstr ""
145+
146+#: plugins/Unity/Launcher/launcheritem.cpp:43
147+#: plugins/Unity/Launcher/launcheritem.cpp:73
148+msgid "Lock to Launcher"
149+msgstr ""
150+
151+#: plugins/Unity/Launcher/launcheritem.cpp:73
152+msgid "Unlock from Launcher"
153+msgstr ""
154+
155+#: Shell.qml:439
156+#, qt-format
157+msgid "Please enter %1"
158+msgstr ""
po/pt_BR.po+9−7
@@ -8,15 +8,15 @@ msgstr ""
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: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-10-01 13:05+0000\n"
11+"PO-Revision-Date: 2014-01-18 23:24+0000\n"
12−"Last-Translator: Rafael Neri <Unknown>\n"
12+"Last-Translator: Fábio Nogueira <deb-user-ba@ubuntu.com>\n"
13"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
13"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2014-01-19 06:02+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
19+"X-Generator: Launchpad (build 16901)\n"
20
20
21#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
22msgid "Skip intro"
22msgid "Skip intro"
@@ -65,6 +65,8 @@ msgid ""
65"You have now mastered the edge gestures and can start using the "
65"You have now mastered the edge gestures and can start using the "
66"phone<br><br>Tap anywhere to start"
66"phone<br><br>Tap anywhere to start"
67msgstr ""
67msgstr ""
68+"Agora você já domina o uso dos gestos de borda e pode começar a utilizar o "
69+"telefone<br><br>Toque na tela para começar"
68
70
69#: Components/PageHeader.qml:364
71#: Components/PageHeader.qml:364
70msgid "Recent searches"
72msgid "Recent searches"
@@ -139,7 +141,7 @@ msgstr "Falando..."
139
141
140#: Notifications/NotificationMenuItemFactory.qml:89
142#: Notifications/NotificationMenuItemFactory.qml:89
141msgid "Show password"
143msgid "Show password"
142−msgstr ""
144+msgstr "Exibir senha"
143
145
144#: Panel/SearchIndicator.qml:27
146#: Panel/SearchIndicator.qml:27
145msgid "Search"
147msgid "Search"
@@ -148,11 +150,11 @@ msgstr "Pesquisar"
148#: plugins/Unity/Launcher/launcheritem.cpp:43
150#: plugins/Unity/Launcher/launcheritem.cpp:43
149#: plugins/Unity/Launcher/launcheritem.cpp:73
151#: plugins/Unity/Launcher/launcheritem.cpp:73
150msgid "Lock to Launcher"
152msgid "Lock to Launcher"
151−msgstr ""
153+msgstr "Bloquear no lançador"
152
154
153#: plugins/Unity/Launcher/launcheritem.cpp:73
155#: plugins/Unity/Launcher/launcheritem.cpp:73
154msgid "Unlock from Launcher"
156msgid "Unlock from Launcher"
155−msgstr ""
157+msgstr "Desbloquear do lançador"
156
158
157#: Shell.qml:439
159#: Shell.qml:439
158#, qt-format
160#, qt-format
po/ru.po+9−6
@@ -8,16 +8,16 @@ msgstr ""
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: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2014-01-07 05:21+0000\n"
11+"PO-Revision-Date: 2014-01-26 15:56+0000\n"
12−"Last-Translator: Ivlev Denis <Unknown>\n"
12+"Last-Translator: Zonov Roman <Unknown>\n"
13"Language-Team: Russian <ru@li.org>\n"
13"Language-Team: Russian <ru@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-01-08 05:43+0000\n"
19+"X-Launchpad-Export-Date: 2014-01-27 05:48+0000\n"
20−"X-Generator: Launchpad (build 16877)\n"
20+"X-Generator: Launchpad (build 16914)\n"
21
21
22#: Components/EdgeDemoOverlay.qml:151
22#: Components/EdgeDemoOverlay.qml:151
23msgid "Skip intro"
23msgid "Skip intro"
@@ -69,6 +69,8 @@ msgid ""
69"You have now mastered the edge gestures and can start using the "
69"You have now mastered the edge gestures and can start using the "
70"phone<br><br>Tap anywhere to start"
70"phone<br><br>Tap anywhere to start"
71msgstr ""
71msgstr ""
72+"Теперь, когда вы изучили основные движения, вы можете начать использовать "
73+"телефон.<br><br>Нажмите, чтобы начать"
72
74
73#: Components/PageHeader.qml:364
75#: Components/PageHeader.qml:364
74msgid "Recent searches"
76msgid "Recent searches"
@@ -89,8 +91,9 @@ msgstr "(%1)"
89#, qt-format
91#, qt-format
90msgid "%1 review"
92msgid "%1 review"
91msgid_plural "%1 reviews"
93msgid_plural "%1 reviews"
94+msgstr[0] "%1 отзыв"
92−msgstr[0] "%1 отзыва"
95+msgstr[1] "%1 отзыва"
93−msgstr[1] "%1 отзывов"
96+msgstr[2] "%1 отзывов"
94
97
95#: Dash/Previews/Reviews.qml:74
98#: Dash/Previews/Reviews.qml:74
96msgid "Add a review"
99msgid "Add a review"
po/sq.ponew file+159
@@ -0,0 +1,159 @@
1+# Albanian translation for unity8
2+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11+"PO-Revision-Date: 2014-01-15 13:51+0000\n"
12+"Last-Translator: Besmir Zanaj <besmirzanaj@gmail.com>\n"
13+"Language-Team: Albanian <sq@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=2; plural=n != 1;\n"
18+"X-Launchpad-Export-Date: 2014-01-16 06:09+0000\n"
19+"X-Generator: Launchpad (build 16901)\n"
20+
21+#: Components/EdgeDemoOverlay.qml:151
22+msgid "Skip intro"
23+msgstr ""
24+
25+#: Components/EdgeDemo.qml:112
26+msgid "Right edge"
27+msgstr "Cepi djathtas"
28+
29+#: Components/EdgeDemo.qml:113
30+msgid "Try swiping from the right edge to unlock the phone"
31+msgstr ""
32+
33+#: Components/EdgeDemo.qml:144
34+msgid "Top edge"
35+msgstr "Cepi i sipërm"
36+
37+#: Components/EdgeDemo.qml:145
38+msgid "Try swiping from the top edge to access the indicators"
39+msgstr ""
40+"Përpiqu te fërkosh gishtin prej cepit të sipërm për te zhblokuar telefonin"
41+
42+#: Components/EdgeDemo.qml:170
43+msgid "Close"
44+msgstr "Mbylle"
45+
46+#: Components/EdgeDemo.qml:171
47+msgid "Swipe up again to close the settings screen"
48+msgstr ""
49+
50+#: Components/EdgeDemo.qml:198
51+msgid "Left edge"
52+msgstr "Cepi majtas"
53+
54+#: Components/EdgeDemo.qml:199
55+msgid "Swipe from the left to reveal the launcher for quick access to apps"
56+msgstr ""
57+
58+#: Components/EdgeDemo.qml:226
59+msgid "Well done"
60+msgstr "Shumë mirë"
61+
62+#: Components/EdgeDemo.qml:227
63+msgid ""
64+"You have now mastered the edge gestures and can start using the "
65+"phone<br><br>Tap anywhere to start"
66+msgstr ""
67+
68+#: Components/PageHeader.qml:364
69+msgid "Recent searches"
70+msgstr ""
71+
72+#: Dash/Apps/AppPreview.qml:135
73+msgid "Rate this"
74+msgstr "Vlerësoje këtë"
75+
76+#. TRANSLATORS: Number of persons who rated this app/video/whatever
77+#: Dash/Previews/Header.qml:93
78+#, qt-format
79+msgid "(%1)"
80+msgstr "(%1)"
81+
82+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
83+#: Dash/Previews/Header.qml:105
84+#, qt-format
85+msgid "%1 review"
86+msgid_plural "%1 reviews"
87+msgstr[0] "%1 rishikim"
88+msgstr[1] "%1 rishikime"
89+
90+#: Dash/Previews/Reviews.qml:74
91+msgid "Add a review"
92+msgstr "Shto një rishikim"
93+
94+#: Dash/Previews/Reviews.qml:86
95+msgid "Review"
96+msgstr ""
97+
98+#: Dash/Previews/Reviews.qml:121
99+msgid "Send"
100+msgstr ""
101+
102+#: Dash/Previews/Reviews.qml:139
103+msgid "Comments:"
104+msgstr ""
105+
106+#: Greeter/Lockscreen.qml:149
107+msgid "Emergency Call"
108+msgstr ""
109+
110+#: Greeter/PassphraseLockscreen.qml:59
111+#, qt-format
112+msgid "Hello %1"
113+msgstr ""
114+
115+#: Greeter/PassphraseLockscreen.qml:59
116+msgid "Hello"
117+msgstr ""
118+
119+#: Hud/HudParametrizedActionsPage.qml:132
120+msgid "Confirm"
121+msgstr ""
122+
123+#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
124+msgid "Type or say a command"
125+msgstr ""
126+
127+#: Hud/Hud.qml:84
128+msgid "Loading. Please Wait..."
129+msgstr ""
130+
131+#: Hud/Hud.qml:89
132+msgid "Speak Now..."
133+msgstr ""
134+
135+#: Hud/Hud.qml:94
136+msgid "Speaking..."
137+msgstr ""
138+
139+#: Notifications/NotificationMenuItemFactory.qml:89
140+msgid "Show password"
141+msgstr ""
142+
143+#: Panel/SearchIndicator.qml:27
144+msgid "Search"
145+msgstr ""
146+
147+#: plugins/Unity/Launcher/launcheritem.cpp:43
148+#: plugins/Unity/Launcher/launcheritem.cpp:73
149+msgid "Lock to Launcher"
150+msgstr ""
151+
152+#: plugins/Unity/Launcher/launcheritem.cpp:73
153+msgid "Unlock from Launcher"
154+msgstr ""
155+
156+#: Shell.qml:439
157+#, qt-format
158+msgid "Please enter %1"
159+msgstr ""
po/sw.ponew file+158
@@ -0,0 +1,158 @@
1+# Swahili translation for unity8
2+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11+"PO-Revision-Date: 2014-01-14 19:28+0000\n"
12+"Last-Translator: Damas Mlabwa <Unknown>\n"
13+"Language-Team: Swahili <sw@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=2; plural=n != 1;\n"
18+"X-Launchpad-Export-Date: 2014-01-15 06:35+0000\n"
19+"X-Generator: Launchpad (build 16890)\n"
20+
21+#: Components/EdgeDemoOverlay.qml:151
22+msgid "Skip intro"
23+msgstr ""
24+
25+#: Components/EdgeDemo.qml:112
26+msgid "Right edge"
27+msgstr ""
28+
29+#: Components/EdgeDemo.qml:113
30+msgid "Try swiping from the right edge to unlock the phone"
31+msgstr ""
32+
33+#: Components/EdgeDemo.qml:144
34+msgid "Top edge"
35+msgstr ""
36+
37+#: Components/EdgeDemo.qml:145
38+msgid "Try swiping from the top edge to access the indicators"
39+msgstr ""
40+
41+#: Components/EdgeDemo.qml:170
42+msgid "Close"
43+msgstr "Funga"
44+
45+#: Components/EdgeDemo.qml:171
46+msgid "Swipe up again to close the settings screen"
47+msgstr ""
48+
49+#: Components/EdgeDemo.qml:198
50+msgid "Left edge"
51+msgstr ""
52+
53+#: Components/EdgeDemo.qml:199
54+msgid "Swipe from the left to reveal the launcher for quick access to apps"
55+msgstr ""
56+
57+#: Components/EdgeDemo.qml:226
58+msgid "Well done"
59+msgstr ""
60+
61+#: Components/EdgeDemo.qml:227
62+msgid ""
63+"You have now mastered the edge gestures and can start using the "
64+"phone<br><br>Tap anywhere to start"
65+msgstr ""
66+
67+#: Components/PageHeader.qml:364
68+msgid "Recent searches"
69+msgstr ""
70+
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
75+#. TRANSLATORS: Number of persons who rated this app/video/whatever
76+#: Dash/Previews/Header.qml:93
77+#, qt-format
78+msgid "(%1)"
79+msgstr ""
80+
81+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
82+#: Dash/Previews/Header.qml:105
83+#, qt-format
84+msgid "%1 review"
85+msgid_plural "%1 reviews"
86+msgstr[0] ""
87+msgstr[1] ""
88+
89+#: Dash/Previews/Reviews.qml:74
90+msgid "Add a review"
91+msgstr ""
92+
93+#: Dash/Previews/Reviews.qml:86
94+msgid "Review"
95+msgstr ""
96+
97+#: Dash/Previews/Reviews.qml:121
98+msgid "Send"
99+msgstr "Tuma"
100+
101+#: Dash/Previews/Reviews.qml:139
102+msgid "Comments:"
103+msgstr "Maoni:"
104+
105+#: Greeter/Lockscreen.qml:149
106+msgid "Emergency Call"
107+msgstr ""
108+
109+#: Greeter/PassphraseLockscreen.qml:59
110+#, qt-format
111+msgid "Hello %1"
112+msgstr ""
113+
114+#: Greeter/PassphraseLockscreen.qml:59
115+msgid "Hello"
116+msgstr ""
117+
118+#: Hud/HudParametrizedActionsPage.qml:132
119+msgid "Confirm"
120+msgstr "Thibitisha"
121+
122+#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
123+msgid "Type or say a command"
124+msgstr ""
125+
126+#: Hud/Hud.qml:84
127+msgid "Loading. Please Wait..."
128+msgstr ""
129+
130+#: Hud/Hud.qml:89
131+msgid "Speak Now..."
132+msgstr ""
133+
134+#: Hud/Hud.qml:94
135+msgid "Speaking..."
136+msgstr ""
137+
138+#: Notifications/NotificationMenuItemFactory.qml:89
139+msgid "Show password"
140+msgstr ""
141+
142+#: Panel/SearchIndicator.qml:27
143+msgid "Search"
144+msgstr "Tafuta"
145+
146+#: plugins/Unity/Launcher/launcheritem.cpp:43
147+#: plugins/Unity/Launcher/launcheritem.cpp:73
148+msgid "Lock to Launcher"
149+msgstr ""
150+
151+#: plugins/Unity/Launcher/launcheritem.cpp:73
152+msgid "Unlock from Launcher"
153+msgstr ""
154+
155+#: Shell.qml:439
156+#, qt-format
157+msgid "Please enter %1"
158+msgstr ""
po/tr.po+6−4
@@ -8,15 +8,15 @@ msgstr ""
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: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-12-12 16:06+0000\n"
11+"PO-Revision-Date: 2014-01-14 19:05+0000\n"
12−"Last-Translator: Arda Ünlü <aarda.uunlu@gmail.com>\n"
12+"Last-Translator: Osman Coşkun <Unknown>\n"
13"Language-Team: Turkish <tr@li.org>\n"
13"Language-Team: Turkish <tr@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2014-01-15 06:35+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
19+"X-Generator: Launchpad (build 16890)\n"
20
20
21#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
22msgid "Skip intro"
22msgid "Skip intro"
@@ -64,6 +64,8 @@ msgid ""
64"You have now mastered the edge gestures and can start using the "
64"You have now mastered the edge gestures and can start using the "
65"phone<br><br>Tap anywhere to start"
65"phone<br><br>Tap anywhere to start"
66msgstr ""
66msgstr ""
67+"Kenar hareketlerini öğrendiniz ve herhangi bir yere dokunarak telefonunuzu "
68+"<br><br> kullanmaya başlayabilirsiniz"
67
69
68#: Components/PageHeader.qml:364
70#: Components/PageHeader.qml:364
69msgid "Recent searches"
71msgid "Recent searches"
po/ug.po+7−7
@@ -8,15 +8,15 @@ msgstr ""
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: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-10-09 22:38+0000\n"
11+"PO-Revision-Date: 2014-01-17 04:33+0000\n"
12"Last-Translator: Gheyret T.Kenji <Unknown>\n"
12"Last-Translator: Gheyret T.Kenji <Unknown>\n"
13"Language-Team: Uyghur <ug@li.org>\n"
13"Language-Team: Uyghur <ug@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2014-01-18 07:11+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
19+"X-Generator: Launchpad (build 16901)\n"
20
20
21#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
22msgid "Skip intro"
22msgid "Skip intro"
@@ -91,7 +91,7 @@ msgstr ""
91
91
92#: Dash/Previews/Reviews.qml:86
92#: Dash/Previews/Reviews.qml:86
93msgid "Review"
93msgid "Review"
94−msgstr ""
94+msgstr "تەكشۈر"
95
95
96#: Dash/Previews/Reviews.qml:121
96#: Dash/Previews/Reviews.qml:121
97msgid "Send"
97msgid "Send"
@@ -136,7 +136,7 @@ msgstr "سۆزلەۋاتىسىز…"
136
136
137#: Notifications/NotificationMenuItemFactory.qml:89
137#: Notifications/NotificationMenuItemFactory.qml:89
138msgid "Show password"
138msgid "Show password"
139−msgstr ""
139+msgstr "ئىم كۆرسەت"
140
140
141#: Panel/SearchIndicator.qml:27
141#: Panel/SearchIndicator.qml:27
142msgid "Search"
142msgid "Search"
@@ -145,11 +145,11 @@ msgstr "ئىزدە"
145#: plugins/Unity/Launcher/launcheritem.cpp:43
145#: plugins/Unity/Launcher/launcheritem.cpp:43
146#: plugins/Unity/Launcher/launcheritem.cpp:73
146#: plugins/Unity/Launcher/launcheritem.cpp:73
147msgid "Lock to Launcher"
147msgid "Lock to Launcher"
148−msgstr ""
148+msgstr "ئىجراچىغا سولىۋەت"
149
149
150#: plugins/Unity/Launcher/launcheritem.cpp:73
150#: plugins/Unity/Launcher/launcheritem.cpp:73
151msgid "Unlock from Launcher"
151msgid "Unlock from Launcher"
152−msgstr ""
152+msgstr "ئىجراچىدىن چىقار"
153
153
154#: Shell.qml:439
154#: Shell.qml:439
155#, qt-format
155#, qt-format
po/vi.ponew file+158
@@ -0,0 +1,158 @@
1+# Vietnamese translation for unity8
2+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11+"PO-Revision-Date: 2014-01-15 01:19+0000\n"
12+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13+"Language-Team: Vietnamese <vi@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=1; plural=0;\n"
18+"X-Launchpad-Export-Date: 2014-01-16 06:09+0000\n"
19+"X-Generator: Launchpad (build 16901)\n"
20+
21+#: Components/EdgeDemoOverlay.qml:151
22+msgid "Skip intro"
23+msgstr ""
24+
25+#: Components/EdgeDemo.qml:112
26+msgid "Right edge"
27+msgstr ""
28+
29+#: Components/EdgeDemo.qml:113
30+msgid "Try swiping from the right edge to unlock the phone"
31+msgstr ""
32+
33+#: Components/EdgeDemo.qml:144
34+msgid "Top edge"
35+msgstr ""
36+
37+#: Components/EdgeDemo.qml:145
38+msgid "Try swiping from the top edge to access the indicators"
39+msgstr ""
40+
41+#: Components/EdgeDemo.qml:170
42+msgid "Close"
43+msgstr ""
44+
45+#: Components/EdgeDemo.qml:171
46+msgid "Swipe up again to close the settings screen"
47+msgstr ""
48+
49+#: Components/EdgeDemo.qml:198
50+msgid "Left edge"
51+msgstr ""
52+
53+#: Components/EdgeDemo.qml:199
54+msgid "Swipe from the left to reveal the launcher for quick access to apps"
55+msgstr ""
56+
57+#: Components/EdgeDemo.qml:226
58+msgid "Well done"
59+msgstr ""
60+
61+#: Components/EdgeDemo.qml:227
62+msgid ""
63+"You have now mastered the edge gestures and can start using the "
64+"phone<br><br>Tap anywhere to start"
65+msgstr ""
66+
67+#: Components/PageHeader.qml:364
68+msgid "Recent searches"
69+msgstr ""
70+
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr ""
74+
75+#. TRANSLATORS: Number of persons who rated this app/video/whatever
76+#: Dash/Previews/Header.qml:93
77+#, qt-format
78+msgid "(%1)"
79+msgstr ""
80+
81+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
82+#: Dash/Previews/Header.qml:105
83+#, qt-format
84+msgid "%1 review"
85+msgid_plural "%1 reviews"
86+msgstr[0] ""
87+msgstr[1] ""
88+
89+#: Dash/Previews/Reviews.qml:74
90+msgid "Add a review"
91+msgstr ""
92+
93+#: Dash/Previews/Reviews.qml:86
94+msgid "Review"
95+msgstr ""
96+
97+#: Dash/Previews/Reviews.qml:121
98+msgid "Send"
99+msgstr ""
100+
101+#: Dash/Previews/Reviews.qml:139
102+msgid "Comments:"
103+msgstr ""
104+
105+#: Greeter/Lockscreen.qml:149
106+msgid "Emergency Call"
107+msgstr ""
108+
109+#: Greeter/PassphraseLockscreen.qml:59
110+#, qt-format
111+msgid "Hello %1"
112+msgstr ""
113+
114+#: Greeter/PassphraseLockscreen.qml:59
115+msgid "Hello"
116+msgstr ""
117+
118+#: Hud/HudParametrizedActionsPage.qml:132
119+msgid "Confirm"
120+msgstr ""
121+
122+#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
123+msgid "Type or say a command"
124+msgstr ""
125+
126+#: Hud/Hud.qml:84
127+msgid "Loading. Please Wait..."
128+msgstr ""
129+
130+#: Hud/Hud.qml:89
131+msgid "Speak Now..."
132+msgstr ""
133+
134+#: Hud/Hud.qml:94
135+msgid "Speaking..."
136+msgstr ""
137+
138+#: Notifications/NotificationMenuItemFactory.qml:89
139+msgid "Show password"
140+msgstr ""
141+
142+#: Panel/SearchIndicator.qml:27
143+msgid "Search"
144+msgstr ""
145+
146+#: plugins/Unity/Launcher/launcheritem.cpp:43
147+#: plugins/Unity/Launcher/launcheritem.cpp:73
148+msgid "Lock to Launcher"
149+msgstr ""
150+
151+#: plugins/Unity/Launcher/launcheritem.cpp:73
152+msgid "Unlock from Launcher"
153+msgstr ""
154+
155+#: Shell.qml:439
156+#, qt-format
157+msgid "Please enter %1"
158+msgstr ""
po/zh_HK.ponew file+157
@@ -0,0 +1,157 @@
1+# Chinese (Hong Kong) translation for unity8
2+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11+"PO-Revision-Date: 2014-01-25 13:32+0000\n"
12+"Last-Translator: Daniel Cheung <daniel.2345@hotmail.com>\n"
13+"Language-Team: Chinese (Hong Kong) <zh_HK@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=1; plural=0;\n"
18+"X-Launchpad-Export-Date: 2014-01-26 05:18+0000\n"
19+"X-Generator: Launchpad (build 16914)\n"
20+
21+#: Components/EdgeDemoOverlay.qml:151
22+msgid "Skip intro"
23+msgstr "跳過介紹"
24+
25+#: Components/EdgeDemo.qml:112
26+msgid "Right edge"
27+msgstr "右邊緣"
28+
29+#: Components/EdgeDemo.qml:113
30+msgid "Try swiping from the right edge to unlock the phone"
31+msgstr "試從右邊緣輕掃解鎖手機"
32+
33+#: Components/EdgeDemo.qml:144
34+msgid "Top edge"
35+msgstr "頂部邊緣"
36+
37+#: Components/EdgeDemo.qml:145
38+msgid "Try swiping from the top edge to access the indicators"
39+msgstr "試從頂部邊緣輕掃存取指示器"
40+
41+#: Components/EdgeDemo.qml:170
42+msgid "Close"
43+msgstr "關閉"
44+
45+#: Components/EdgeDemo.qml:171
46+msgid "Swipe up again to close the settings screen"
47+msgstr "再向上掃一次以關閉設定畫面"
48+
49+#: Components/EdgeDemo.qml:198
50+msgid "Left edge"
51+msgstr "左邊緣"
52+
53+#: Components/EdgeDemo.qml:199
54+msgid "Swipe from the left to reveal the launcher for quick access to apps"
55+msgstr "從左邊緣輕掃以顯示啟動器快速訪問應用"
56+
57+#: Components/EdgeDemo.qml:226
58+msgid "Well done"
59+msgstr "做得好"
60+
61+#: Components/EdgeDemo.qml:227
62+msgid ""
63+"You have now mastered the edge gestures and can start using the "
64+"phone<br><br>Tap anywhere to start"
65+msgstr "現在你已經掌握了邊緣手勢,可以開始使用手機<br><br>點擊任意位置以開始"
66+
67+#: Components/PageHeader.qml:364
68+msgid "Recent searches"
69+msgstr "最近的搜尋"
70+
71+#: Dash/Apps/AppPreview.qml:135
72+msgid "Rate this"
73+msgstr "評價"
74+
75+#. TRANSLATORS: Number of persons who rated this app/video/whatever
76+#: Dash/Previews/Header.qml:93
77+#, qt-format
78+msgid "(%1)"
79+msgstr "(%1)"
80+
81+#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
82+#: Dash/Previews/Header.qml:105
83+#, qt-format
84+msgid "%1 review"
85+msgid_plural "%1 reviews"
86+msgstr[0] "%1 評論"
87+
88+#: Dash/Previews/Reviews.qml:74
89+msgid "Add a review"
90+msgstr "新增評論"
91+
92+#: Dash/Previews/Reviews.qml:86
93+msgid "Review"
94+msgstr "評論"
95+
96+#: Dash/Previews/Reviews.qml:121
97+msgid "Send"
98+msgstr "傳送"
99+
100+#: Dash/Previews/Reviews.qml:139
101+msgid "Comments:"
102+msgstr "評論:"
103+
104+#: Greeter/Lockscreen.qml:149
105+msgid "Emergency Call"
106+msgstr "緊急電話"
107+
108+#: Greeter/PassphraseLockscreen.qml:59
109+#, qt-format
110+msgid "Hello %1"
111+msgstr "您好 %1"
112+
113+#: Greeter/PassphraseLockscreen.qml:59
114+msgid "Hello"
115+msgstr "您好"
116+
117+#: Hud/HudParametrizedActionsPage.qml:132
118+msgid "Confirm"
119+msgstr "確認"
120+
121+#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
122+msgid "Type or say a command"
123+msgstr "輸入或說出指令"
124+
125+#: Hud/Hud.qml:84
126+msgid "Loading. Please Wait..."
127+msgstr "正載入。請稍候..."
128+
129+#: Hud/Hud.qml:89
130+msgid "Speak Now..."
131+msgstr "馬上講..."
132+
133+#: Hud/Hud.qml:94
134+msgid "Speaking..."
135+msgstr "正在講..."
136+
137+#: Notifications/NotificationMenuItemFactory.qml:89
138+msgid "Show password"
139+msgstr "顯示密碼"
140+
141+#: Panel/SearchIndicator.qml:27
142+msgid "Search"
143+msgstr "搜尋"
144+
145+#: plugins/Unity/Launcher/launcheritem.cpp:43
146+#: plugins/Unity/Launcher/launcheritem.cpp:73
147+msgid "Lock to Launcher"
148+msgstr "鎖定至啟動器"
149+
150+#: plugins/Unity/Launcher/launcheritem.cpp:73
151+msgid "Unlock from Launcher"
152+msgstr "從啟動器解除鎖定"
153+
154+#: Shell.qml:439
155+#, qt-format
156+msgid "Please enter %1"
157+msgstr "請輸入 %1"
po/zh_TW.po+24−25
@@ -8,47 +8,47 @@ msgstr ""
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: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
10"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-06-27 10:24+0000\n"
11+"PO-Revision-Date: 2014-01-16 06:04+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12+"Last-Translator: Henry Yang <henry9846@hotmail.com>\n"
13"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
13"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
18+"X-Launchpad-Export-Date: 2014-01-17 07:08+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
19+"X-Generator: Launchpad (build 16901)\n"
20
20
21#: Components/EdgeDemoOverlay.qml:151
21#: Components/EdgeDemoOverlay.qml:151
22msgid "Skip intro"
22msgid "Skip intro"
23−msgstr ""
23+msgstr "略過導覽"
24
24
25#: Components/EdgeDemo.qml:112
25#: Components/EdgeDemo.qml:112
26msgid "Right edge"
26msgid "Right edge"
27−msgstr ""
27+msgstr "右方邊界"
28
28
29#: Components/EdgeDemo.qml:113
29#: Components/EdgeDemo.qml:113
30msgid "Try swiping from the right edge to unlock the phone"
30msgid "Try swiping from the right edge to unlock the phone"
31−msgstr ""
31+msgstr "向左滑動以解鎖手機"
32
32
33#: Components/EdgeDemo.qml:144
33#: Components/EdgeDemo.qml:144
34msgid "Top edge"
34msgid "Top edge"
35−msgstr ""
35+msgstr "頂部邊界"
36
36
37#: Components/EdgeDemo.qml:145
37#: Components/EdgeDemo.qml:145
38msgid "Try swiping from the top edge to access the indicators"
38msgid "Try swiping from the top edge to access the indicators"
39−msgstr ""
39+msgstr "向下滑動以開啟指引"
40
40
41#: Components/EdgeDemo.qml:170
41#: Components/EdgeDemo.qml:170
42msgid "Close"
42msgid "Close"
43−msgstr ""
43+msgstr "關閉"
44
44
45#: Components/EdgeDemo.qml:171
45#: Components/EdgeDemo.qml:171
46msgid "Swipe up again to close the settings screen"
46msgid "Swipe up again to close the settings screen"
47−msgstr ""
47+msgstr "再次向上滑動以關財設定頁面"
48
48
49#: Components/EdgeDemo.qml:198
49#: Components/EdgeDemo.qml:198
50msgid "Left edge"
50msgid "Left edge"
51−msgstr ""
51+msgstr "左方邊界"
52
52
53#: Components/EdgeDemo.qml:199
53#: Components/EdgeDemo.qml:199
54msgid "Swipe from the left to reveal the launcher for quick access to apps"
54msgid "Swipe from the left to reveal the launcher for quick access to apps"
@@ -70,50 +70,49 @@ msgstr "最近搜尋"
70
70
71#: Dash/Apps/AppPreview.qml:135
71#: Dash/Apps/AppPreview.qml:135
72msgid "Rate this"
72msgid "Rate this"
73−msgstr ""
73+msgstr "對此評比"
74
74
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
75#. TRANSLATORS: Number of persons who rated this app/video/whatever
76#: Dash/Previews/Header.qml:93
76#: Dash/Previews/Header.qml:93
77#, qt-format
77#, qt-format
78msgid "(%1)"
78msgid "(%1)"
79−msgstr ""
79+msgstr "(%1)"
80
80
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
81#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
82#: Dash/Previews/Header.qml:105
82#: Dash/Previews/Header.qml:105
83#, qt-format
83#, qt-format
84msgid "%1 review"
84msgid "%1 review"
85msgid_plural "%1 reviews"
85msgid_plural "%1 reviews"
86−msgstr[0] ""
86+msgstr[0] "%1 回覆"
87−msgstr[1] ""
88
87
89#: Dash/Previews/Reviews.qml:74
88#: Dash/Previews/Reviews.qml:74
90msgid "Add a review"
89msgid "Add a review"
91−msgstr ""
90+msgstr "新增回覆"
92
91
93#: Dash/Previews/Reviews.qml:86
92#: Dash/Previews/Reviews.qml:86
94msgid "Review"
93msgid "Review"
95−msgstr ""
94+msgstr "回覆"
96
95
97#: Dash/Previews/Reviews.qml:121
96#: Dash/Previews/Reviews.qml:121
98msgid "Send"
97msgid "Send"
99−msgstr ""
98+msgstr "發送"
100
99
101#: Dash/Previews/Reviews.qml:139
100#: Dash/Previews/Reviews.qml:139
102msgid "Comments:"
101msgid "Comments:"
103−msgstr ""
102+msgstr "備註:"
104
103
105#: Greeter/Lockscreen.qml:149
104#: Greeter/Lockscreen.qml:149
106msgid "Emergency Call"
105msgid "Emergency Call"
107−msgstr ""
106+msgstr "緊急連絡"
108
107
109#: Greeter/PassphraseLockscreen.qml:59
108#: Greeter/PassphraseLockscreen.qml:59
110#, qt-format
109#, qt-format
111msgid "Hello %1"
110msgid "Hello %1"
112−msgstr ""
111+msgstr "%1 您好"
113
112
114#: Greeter/PassphraseLockscreen.qml:59
113#: Greeter/PassphraseLockscreen.qml:59
115msgid "Hello"
114msgid "Hello"
116−msgstr ""
115+msgstr "您好"
117
116
118#: Hud/HudParametrizedActionsPage.qml:132
117#: Hud/HudParametrizedActionsPage.qml:132
119msgid "Confirm"
118msgid "Confirm"
@@ -137,7 +136,7 @@ msgstr "說話中..."
137
136
138#: Notifications/NotificationMenuItemFactory.qml:89
137#: Notifications/NotificationMenuItemFactory.qml:89
139msgid "Show password"
138msgid "Show password"
140−msgstr ""
139+msgstr "顯示密碼"
141
140
142#: Panel/SearchIndicator.qml:27
141#: Panel/SearchIndicator.qml:27
143msgid "Search"
142msgid "Search"
@@ -146,7 +145,7 @@ msgstr "搜尋"
146#: plugins/Unity/Launcher/launcheritem.cpp:43
145#: plugins/Unity/Launcher/launcheritem.cpp:43
147#: plugins/Unity/Launcher/launcheritem.cpp:73
146#: plugins/Unity/Launcher/launcheritem.cpp:73
148msgid "Lock to Launcher"
147msgid "Lock to Launcher"
149−msgstr ""
148+msgstr "鎖定至啟動欄"
150
149
151#: plugins/Unity/Launcher/launcheritem.cpp:73
150#: plugins/Unity/Launcher/launcheritem.cpp:73
152msgid "Unlock from Launcher"
151msgid "Unlock from Launcher"
qml/Components/DragHandle.qml+7−7
@@ -97,7 +97,7 @@ EdgeDragArea {
97 // Private stuff
97 // Private stuff
98 QtObject {
98 QtObject {
99 id: d
99 id: d
100− property var previousStatus: undefined
100+ property var previousStatus: DirectionalDragArea.WaitingForTouch
101 property real startValue
101 property real startValue
102 property real minValue: Direction.isPositive(direction) ? startValue
102 property real minValue: Direction.isPositive(direction) ? startValue
103 : startValue - maxTotalDragDistance
103 : startValue - maxTotalDragDistance
@@ -193,14 +193,14 @@ EdgeDragArea {
193 d.rollbackDrag();
193 d.rollbackDrag();
194 }
194 }
195 } else /* Undecided || Recognized */ {
195 } else /* Undecided || Recognized */ {
196− if (d.previousStatus === DirectionalDragArea.WaitingForTouch ||
196+ if (d.previousStatus === DirectionalDragArea.WaitingForTouch) {
197− d.previousStatus === undefined) {
198 dragEvaluator.reset();
197 dragEvaluator.reset();
199 d.startValue = parent[d.targetProp];
198 d.startValue = parent[d.targetProp];
200− }
199+
201− if (hintDisplacement > 0) {
200+ if (hintDisplacement > 0) {
202− hintingAnimation.targetValue = d.startValue;
201+ hintingAnimation.targetValue = d.startValue;
203− hintingAnimation.start();
202+ hintingAnimation.start();
203+ }
204 }
204 }
205 }
205 }
206
206
qml/Components/FilterGrid.qml+6−8
@@ -35,19 +35,17 @@ Item {
35
35
36 /* Whether, when collapsed, a button should be displayed enabling the user to expand
36 /* Whether, when collapsed, a button should be displayed enabling the user to expand
37 the grid to its full size. */
37 the grid to its full size. */
38− readonly property bool expandable: model.count > collapsedRowCount * iconTileGrid.columns
38+ readonly property bool expandable: model.count > rowsWhenCollapsed * iconTileGrid.columns
39
39
40 property var model: null
40 property var model: null
41
41
42 /* Maximum number of rows to be show when filter=true. */
42 /* Maximum number of rows to be show when filter=true. */
43 property int collapsedRowCount: 2
43 property int collapsedRowCount: 2
44 property int uncollapsedRowCount: Math.ceil(model.count / columns)
44 property int uncollapsedRowCount: Math.ceil(model.count / columns)
45− readonly property int collapsedHeight: {
45+ /* Never show more rows than model would fill up. */
46− return iconTileGrid.contentHeightForRows(Math.min(collapsedRowCount, Math.ceil(model.count / columns)))
46+ readonly property int rowsWhenCollapsed: Math.min(collapsedRowCount, uncollapsedRowCount)
47− }
47+ readonly property int collapsedHeight: iconTileGrid.contentHeightForRows(rowsWhenCollapsed)
48− readonly property int uncollapsedHeight: {
49− return iconTileGrid.contentHeightForRows(uncollapsedRowCount)
48+ readonly property int uncollapsedHeight: iconTileGrid.contentHeightForRows(uncollapsedRowCount)
50− }
51
49
52 property alias minimumHorizontalSpacing: iconTileGrid.minimumHorizontalSpacing
50 property alias minimumHorizontalSpacing: iconTileGrid.minimumHorizontalSpacing
53 property alias maximumNumberOfColumns: iconTileGrid.maximumNumberOfColumns
51 property alias maximumNumberOfColumns: iconTileGrid.maximumNumberOfColumns
@@ -106,7 +104,7 @@ Item {
106
104
107 model: LimitProxyModel {
105 model: LimitProxyModel {
108 model: root.model
106 model: root.model
109− limit: (filter && !filterAnimation.running) ? collapsedRowCount * iconTileGrid.columns : -1
107+ limit: (filter && !filterAnimation.running) ? rowsWhenCollapsed * iconTileGrid.columns : -1
110 }
108 }
111 }
109 }
112}
110}
qml/Components/PageHeader.qml+1
@@ -146,6 +146,7 @@ Item {
146 anchors.fill: parent
146 anchors.fill: parent
147 anchors.margins: units.gu(1)
147 anchors.margins: units.gu(1)
148
148
149+ inputMethodHints: Qt.ImhNoPredictiveText
149 hasClearButton: false
150 hasClearButton: false
150
151
151 primaryItem: AbstractButton {
152 primaryItem: AbstractButton {
qml/Components/ResponsiveGridView.qml+1−1
@@ -72,7 +72,7 @@ Item {
72
72
73 function columnsForSpacing(spacing) {
73 function columnsForSpacing(spacing) {
74 // minimum margin is half of the spacing
74 // minimum margin is half of the spacing
75− return Math.max(1, Math.floor((parent.width - spacing/2) / (delegateWidth + spacing)));
75+ return Math.max(1, Math.floor(parent.width / (delegateWidth + spacing)));
76 }
76 }
77
77
78 property real allocatableHorizontalSpace: parent.width - columns * delegateWidth
78 property real allocatableHorizontalSpace: parent.width - columns * delegateWidth
qml/Dash/Apps/AppPreview.qml+1
@@ -97,6 +97,7 @@ GenericPreview {
97 spacing: units.gu(1)
97 spacing: units.gu(1)
98
98
99 Label {
99 Label {
100+ objectName: "descriptionLabel"
100 anchors { left: parent.left; right: parent.right }
101 anchors { left: parent.left; right: parent.right }
101 text: root.previewData.description
102 text: root.previewData.description
102 fontSize: "medium"
103 fontSize: "medium"
qml/Dash/Card.qml+17−15
@@ -23,24 +23,24 @@ Item {
23 property var components
23 property var components
24 property var cardData
24 property var cardData
25
25
26− width: {
26+ implicitWidth: childrenRect.width
27− if (template !== undefined) {
28− if (template["card-layout"] === "horizontal") return units.gu(38);
29− switch (template['card-size']) {
30− case "small": return units.gu(12);
31− case "large": return units.gu(38);
32− }
33− }
34− return units.gu(18.5);
35− }
36− height: childrenRect.height
27+ implicitHeight: childrenRect.height
37
28
38 UbuntuShape {
29 UbuntuShape {
39 id: artShape
30 id: artShape
31+ radius: "medium"
40 objectName: "artShape"
32 objectName: "artShape"
33+ width: {
34+ if (!visible) return 0
41− width: image.fillMode === Image.PreserveAspectCrop || aspect < image.aspect ? image.width : height * image.aspect
35+ return image.fillMode === Image.PreserveAspectCrop || aspect < image.aspect ? image.width : height * image.aspect
36+ }
37+ height: {
38+ if (!visible) return 0
42− height: image.fillMode === Image.PreserveAspectCrop || aspect > image.aspect ? image.height : width / image.aspect
39+ return image.fillMode === Image.PreserveAspectCrop || aspect > image.aspect ? image.height : width / image.aspect
40+ }
43 anchors.horizontalCenter: template && template["card-layout"] === "horizontal" ? undefined : parent.horizontalCenter
41 anchors.horizontalCenter: template && template["card-layout"] === "horizontal" ? undefined : parent.horizontalCenter
42+ anchors.left: template && template["card-layout"] === "horizontal" ? parent.left : undefined
43+ visible: cardData && cardData["art"] || false
44
44
45 property real aspect: components !== undefined ? components["art"]["aspect-ratio"] : 1
45 property real aspect: components !== undefined ? components["art"]["aspect-ratio"] : 1
46
46
@@ -52,7 +52,7 @@ Item {
52 // FIXME uncomment when having investigated / fixed the crash
52 // FIXME uncomment when having investigated / fixed the crash
53 //sourceSize.width: width > height ? width : 0
53 //sourceSize.width: width > height ? width : 0
54 //sourceSize.height: height > width ? height : 0
54 //sourceSize.height: height > width ? height : 0
55− fillMode: components["art"]["fill-mode"] === "fit" ? Image.PreserveAspectFit: Image.PreserveAspectCrop
55+ fillMode: components && components["art"]["fill-mode"] === "fit" ? Image.PreserveAspectFit: Image.PreserveAspectCrop
56
56
57 property real aspect: implicitWidth / implicitHeight
57 property real aspect: implicitWidth / implicitHeight
58 }
58 }
@@ -74,10 +74,12 @@ Item {
74
74
75 Label {
75 Label {
76 objectName: "summaryLabel"
76 objectName: "summaryLabel"
77− anchors { top: header.bottom; left: parent.left; right: parent.right }
77+ anchors { top: header.visible ? header.bottom : artShape.bottom; left: parent.left; right: parent.right }
78 wrapMode: Text.Wrap
78 wrapMode: Text.Wrap
79 maximumLineCount: 5
79 maximumLineCount: 5
80 elide: Text.ElideRight
80 elide: Text.ElideRight
81 text: cardData && cardData["summary"] || ""
81 text: cardData && cardData["summary"] || ""
82+ height: text ? implicitHeight : 0
83+ fontSize: "small"
82 }
84 }
83}
85}
qml/Dash/CardHeader.qml+28−7
@@ -27,48 +27,66 @@ Item {
27 property alias altPrice: altPriceLabel.text
27 property alias altPrice: altPriceLabel.text
28
28
29 visible: mascotImage.status === Image.Ready || title || price
29 visible: mascotImage.status === Image.Ready || title || price
30− height: row.height > 0 ? row.height + row.spacing * 2 : 0
30+ height: row.height > 0 ? row.height + row.margins * 2 : 0
31
31
32 Row {
32 Row {
33 id: row
33 id: row
34 objectName: "outerRow"
34 objectName: "outerRow"
35
35
36− anchors { top: parent.top; left: parent.left; right: parent.right; margins: spacing }
36+ property real margins: units.gu(1)
37− spacing: units.gu(1)
37+
38+ anchors {
39+ top: parent.top; left: parent.left; right: parent.right
40+ margins: margins
41+ leftMargin: spacing
42+ rightMargin: spacing
43+ }
44+ spacing: mascotShape.visible ? margins : 0
38
45
39 UbuntuShape {
46 UbuntuShape {
40 id: mascotShape
47 id: mascotShape
41 objectName: "mascotShape"
48 objectName: "mascotShape"
42
49
50+ // TODO karni: Icon aspect-ratio is 8:7.5. Revisit these values to avoid fraction of pixels.
43− width: units.gu(8)
51+ width: units.gu(6)
44− height: units.gu(8)
52+ height: units.gu(5.625)
45 visible: image.status === Image.Ready
53 visible: image.status === Image.Ready
54+ readonly property int maxSize: Math.max(width, height)
46
55
47 image: Image {
56 image: Image {
48 id: mascotImage
57 id: mascotImage
58+
49− sourceSize { width: mascotShape.width; height: mascotShape.height }
59+ sourceSize { width: mascotShape.maxSize; height: mascotShape.maxSize }
60+ fillMode: Image.PreserveAspectCrop
61+ horizontalAlignment: Image.AlignHCenter
62+ verticalAlignment: Image.AlignVCenter
50 }
63 }
51 }
64 }
52
65
53 Column {
66 Column {
54 objectName: "column"
67 objectName: "column"
55 width: parent.width - x
68 width: parent.width - x
69+ spacing: units.gu(0.5)
56
70
57 Label {
71 Label {
58 id: titleLabel
72 id: titleLabel
73+ objectName: "titleLabel"
59 anchors { left: parent.left; right: parent.right }
74 anchors { left: parent.left; right: parent.right }
60 elide: Text.ElideRight
75 elide: Text.ElideRight
61− objectName: "titleLabel"
62 font.weight: Font.DemiBold
76 font.weight: Font.DemiBold
63 wrapMode: Text.Wrap
77 wrapMode: Text.Wrap
64 maximumLineCount: 2
78 maximumLineCount: 2
79+ fontSize: "small"
65 }
80 }
66
81
67 Label {
82 Label {
68 id: subtitleLabel
83 id: subtitleLabel
84+ objectName: "subtitleLabel"
69 anchors { left: parent.left; right: parent.right }
85 anchors { left: parent.left; right: parent.right }
70 elide: Text.ElideRight
86 elide: Text.ElideRight
87+ font.weight: Font.Light
71 visible: titleLabel.text && text
88 visible: titleLabel.text && text
89+ fontSize: "x-small"
72 }
90 }
73
91
74 Row {
92 Row {
@@ -90,6 +108,7 @@ Item {
90 elide: Text.ElideRight
108 elide: Text.ElideRight
91 font.weight: Font.DemiBold
109 font.weight: Font.DemiBold
92 color: Theme.palette.selected.foreground
110 color: Theme.palette.selected.foreground
111+ visible: text
93 }
112 }
94
113
95 Label {
114 Label {
@@ -98,6 +117,7 @@ Item {
98 width: parent.labelWidth
117 width: parent.labelWidth
99 elide: Text.ElideRight
118 elide: Text.ElideRight
100 horizontalAlignment: parent.labels === 3 ? Text.AlignHCenter : Text.AlignRight
119 horizontalAlignment: parent.labels === 3 ? Text.AlignHCenter : Text.AlignRight
120+ visible: text
101 }
121 }
102
122
103 Label {
123 Label {
@@ -105,6 +125,7 @@ Item {
105 width: parent.labelWidth
125 width: parent.labelWidth
106 elide: Text.ElideRight
126 elide: Text.ElideRight
107 horizontalAlignment: Text.AlignRight
127 horizontalAlignment: Text.AlignRight
128+ visible: text
108 }
129 }
109 }
130 }
110 }
131 }
qml/Dash/CardTool.qmlnew file+136
@@ -0,0 +1,136 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+
19+/*!
20+ \brief Tool for introspecting Card properties.
21+
22+ Some properties of Cards we need to determine category-wide (like card sizes in grid),
23+ so we should not do them per-Card but in the category renderer.
24+
25+ This component creates an invisible card filled with maximum mapped data and calculates
26+ or measures card properties for this configuration.
27+ */
28+
29+Item {
30+ id: cardTool
31+ /*!
32+ \brief Template supplied for the category.
33+ */
34+ property var template
35+
36+ /*!
37+ \brief Component mapping supplied for the category.
38+ */
39+ property var components
40+
41+ /*!
42+ \brief Width of the view, based on which carousel width is calculated.
43+ */
44+ property var viewWidth
45+
46+ // FIXME: Saviq
47+ // Only way for the card below to actually be laid out completely.
48+ // If invisible or in "data" array, some components are not taken into account.
49+ width: 0
50+ height: 0
51+ clip: true
52+
53+ /*!
54+ type:real \brief Width to be enforced on the card in this configuration.
55+
56+ If undefined, should use implicit width of the actual card.
57+ */
58+ readonly property var cardWidth: {
59+ switch (template !== undefined && template["category-layout"]) {
60+ case "grid":
61+ case "vertical-journal":
62+ if (template["card-layout"] === "horizontal") return units.gu(38);
63+ switch (template["card-size"]) {
64+ case "small": return units.gu(12);
65+ case "large": return units.gu(38);
66+ }
67+ return units.gu(18.5);
68+ case "carousel":
69+ if (viewWidth === undefined) return undefined
70+ if (viewWidth <= units.gu(40)) return units.gu(18)
71+ if (viewWidth >= units.gu(128)) return units.gu(26)
72+ return units.gu(18 + Math.round((viewWidth - units.gu(40))/ units.gu(11)))
73+ case undefined:
74+ case "organic-grid":
75+ case "journal":
76+ default:
77+ return undefined;
78+ }
79+ }
80+
81+ /*!
82+ type:real \brief Height to be enforced on the card in this configuration.
83+
84+ If undefined, should use implicit height of the actual card.
85+ */
86+ readonly property var cardHeight: {
87+ switch (template !== undefined && template["category-layout"]) {
88+ case "journal":
89+ if (template["card-size"] >= 12 && template["card-size"] <= 38) return units.gu(template["card-size"]);
90+ return units.gu(18.5);
91+ case "grid":
92+ return card.implicitHeight
93+ case "carousel":
94+ return cardWidth / (components ? components["art"]["aspect-ratio"] : 1)
95+ case undefined:
96+ case "organic-grid":
97+ case "vertical-journal":
98+ default:
99+ return undefined;
100+ }
101+ }
102+
103+ readonly property QtObject priv: card
104+
105+ Card {
106+ id: card
107+ template: cardTool.template
108+ components: cardTool.components
109+
110+ width: cardTool.cardWidth || implicitWidth
111+ height: cardTool.cardHeight || implicitHeight
112+
113+ property var fields: ["art", "mascot", "title", "subtitle", "summary"]
114+ property var maxData: {
115+ "art": Qt.resolvedUrl("graphics/checkers.png"),
116+ "mascot": Qt.resolvedUrl("graphics/checkers.png"),
117+ "title": "—\n—",
118+ "subtitle": "—",
119+ "summary": "—\n—\n—\n—\n—"
120+ }
121+
122+ onComponentsChanged: {
123+ var data = {};
124+ for (var k in fields) {
125+ var component = components[fields[k]];
126+ var key = fields[k];
127+ if ((typeof component === "string" && component.length > 0) ||
128+ (typeof component === "object" && component !== null
129+ && typeof component["field"] === "string" && component["field"].length > 0)) {
130+ data[key] = maxData[key];
131+ }
132+ }
133+ cardData = data;
134+ }
135+ }
136+}
qml/Dash/DashPreview.qml+2
@@ -57,6 +57,8 @@ Item {
57 }
57 }
58 }
58 }
59
59
60+ onPreviewDataChanged: showProcessingAction = false
61+
60 MouseArea {
62 MouseArea {
61 anchors.fill: parent
63 anchors.fill: parent
62 }
64 }
qml/Dash/Generic/GenericPreview.qml+2−1
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2014 Canonical, Ltd.
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
@@ -120,6 +120,7 @@ DashPreview {
120
120
121 Label {
121 Label {
122 id: descriptionLabel
122 id: descriptionLabel
123+ objectName: "descriptionLabel"
123 anchors { left: parent.left; right: parent.right }
124 anchors { left: parent.left; right: parent.right }
124 visible: text != ""
125 visible: text != ""
125 fontSize: "small"
126 fontSize: "small"
qml/Dash/GenericScopeView.qml+8−2
@@ -56,7 +56,7 @@ FocusScope {
56 Binding {
56 Binding {
57 target: scope
57 target: scope
58 property: "isActive"
58 property: "isActive"
59− value: isCurrent
59+ value: isCurrent && !previewListView.onScreen
60 }
60 }
61
61
62 Timer {
62 Timer {
@@ -141,6 +141,7 @@ FocusScope {
141 readonly property bool expandable: rendererLoader.item ? rendererLoader.item.expandable : false
141 readonly property bool expandable: rendererLoader.item ? rendererLoader.item.expandable : false
142 readonly property bool filtered: rendererLoader.item ? rendererLoader.item.filter : true
142 readonly property bool filtered: rendererLoader.item ? rendererLoader.item.filter : true
143 readonly property string category: categoryId
143 readonly property string category: categoryId
144+ readonly property var item: rendererLoader.item
144
145
145 Loader {
146 Loader {
146 id: rendererLoader
147 id: rendererLoader
@@ -248,8 +249,10 @@ FocusScope {
248 }
249 }
249 }
250 }
250 }
251 }
252+ onOriginYChanged: rendererLoader.updateDelegateCreationRange();
251 onContentYChanged: rendererLoader.updateDelegateCreationRange();
253 onContentYChanged: rendererLoader.updateDelegateCreationRange();
252 onHeightChanged: rendererLoader.updateDelegateCreationRange();
254 onHeightChanged: rendererLoader.updateDelegateCreationRange();
255+ onContentHeightChanged: rendererLoader.updateDelegateCreationRange();
253 }
256 }
254
257
255 function updateDelegateCreationRange() {
258 function updateDelegateCreationRange() {
@@ -261,7 +264,7 @@ FocusScope {
261 return;
264 return;
262 }
265 }
263
266
264− if (item.hasOwnProperty("delegateCreationBegin")) {
267+ if (item && item.hasOwnProperty("delegateCreationBegin")) {
265 if (baseItem.y + baseItem.height <= 0) {
268 if (baseItem.y + baseItem.height <= 0) {
266 // Not visible (item at top of the list)
269 // Not visible (item at top of the list)
267 item.delegateCreationBegin = baseItem.height
270 item.delegateCreationBegin = baseItem.height
@@ -277,6 +280,9 @@ FocusScope {
277 }
280 }
278 }
281 }
279 }
282 }
283+
284+ onHeightChanged: rendererLoader.updateDelegateCreationRange();
285+ onYChanged: rendererLoader.updateDelegateCreationRange();
280 }
286 }
281
287
282 sectionProperty: "name"
288 sectionProperty: "name"
qml/Dash/graphics/checkers.pngnew file

Binary file not shown.

qml/Panel/IndicatorItem.qml+1−1
@@ -29,7 +29,7 @@ Item {
29 property string identifier
29 property string identifier
30
30
31 opacity: dimmed ? 0.4 : 1
31 opacity: dimmed ? 0.4 : 1
32− Behavior on opacity { StandardAnimation {} }
32+ Behavior on opacity { UbuntuNumberAnimation { duration: UbuntuAnimation.BriskDuration } }
33
33
34 width: loader.item ? loader.item.width : 0
34 width: loader.item ? loader.item.width : 0
35
35
qml/Panel/IndicatorRow.qml+73−91
@@ -22,11 +22,10 @@ import "../Components"
22Item {
22Item {
23 id: indicatorRow
23 id: indicatorRow
24
24
25− property QtObject currentItem : null
25+ readonly property alias currentItem : itemView.currentItem
26− readonly property int currentItemIndex: currentItem ? currentItem.ownIndex : -1
26+ readonly property alias currentItemIndex: itemView.currentIndex
27− property alias row: row
27+ readonly property alias row: itemView
28 property QtObject indicatorsModel: null
28 property QtObject indicatorsModel: null
29− property var visibleIndicators: defined
30 property int overFlowWidth: width
29 property int overFlowWidth: width
31 property bool showAll: false
30 property bool showAll: false
32 property real currentItemOffset: 0.0
31 property real currentItemOffset: 0.0
@@ -40,9 +39,15 @@ Item {
40 setCurrentItem(0);
39 setCurrentItem(0);
41 }
40 }
42
41
42+ function setCurrentItemIndex(index) {
43+ itemView.currentIndex = index;
44+ }
45+
43− function setCurrentItem(index) {
46+ function setCurrentItem(item) {
44− if (currentItemIndex !== index) {
47+ if (item && item.hasOwnProperty("ownIndex")) {
45− currentItem = rowRepeater.itemAt(index);
48+ itemView.currentIndex = item.ownIndex;
49+ } else {
50+ itemView.currentIndex = -1;
46 }
51 }
47 }
52 }
48
53
@@ -55,100 +60,75 @@ Item {
55 }
60 }
56 }
61 }
57
62
58− Row {
63+ ListView {
59− id: row
64+ id: itemView
65+ objectName: "indicatorRowItems"
66+ interactive: false
67+ model: indicatorsModel ? indicatorsModel : null
60
68
61− width: children.width
69+ width: childrenRect.width
62− height: parent.height
70+ height: indicatorRow.height
63 anchors.right: parent.right
71 anchors.right: parent.right
72+ orientation: ListView.Horizontal
64
73
65− Repeater {
74+ property int lastCount: 0
66− id: rowRepeater
75+ onCountChanged: {
67− objectName: "rowRepeater"
76+ if (lastCount < count) {
68− model: indicatorsModel ? indicatorsModel : undefined
77+ showAll = true;
78+ allVisible.start();
79+ }
80+ lastCount = count;
81+ }
69
82
83+ delegate: Item {
84+ id: itemWrapper
85+ objectName: "item" + index
86+ height: indicatorRow.height
87+ width: indicatorItem.width
88+ opacity: 1 - indicatorRow.unitProgress
89+ y: 0
90+ state: "standard"
91+
70− property int lastCount: 0
92+ property int ownIndex: index
71− onCountChanged: {
93+ property bool highlighted: indicatorRow.unitProgress > 0 ? ListView.isCurrentItem : false
72− if (lastCount < count) {
94+ property bool dimmed: indicatorRow.unitProgress > 0 ? !ListView.isCurrentItem : false
73− showAll = true;
95+
74− allVisible.start();
96+ property bool hidden: !showAll && !highlighted && (indicatorRow.state == "locked" || indicatorRow.state == "commit")
75− }
97+ property bool overflow: row.width - itemWrapper.x > overFlowWidth
76− lastCount = count;
98+
99+ IndicatorItem {
100+ id: indicatorItem
101+ identifier: model.identifier
102+ height: parent.height
103+
104+ dimmed: itemWrapper.dimmed
105+
106+ widgetSource: model.widgetSource
107+ indicatorProperties : model.indicatorProperties
77 }
108 }
78
109
79− Item {
110+ states: [
80− id: itemWrapper
111+ State {
81− height: indicatorRow.height
82− width: indicatorItem.width
83− visible: indicatorItem.indicatorVisible
84− opacity: 1.0 * opacityMultiplier
85− y: 0
86− state: "standard"
112+ name: "standard"
87−
113+ when: !hidden && !overflow && !highlighted
88− property int ownIndex: index
114+ },
89− property bool highlighted: indicatorRow.state != "initial" ? ownIndex == indicatorRow.currentItemIndex : false
115+ State {
90− property bool dimmed: indicatorRow.state != "initial" ? ownIndex != indicatorRow.currentItemIndex : false
116+ name: "highlighted"
91−
117+ when: highlighted
92− property bool hidden: !showAll && !highlighted && (indicatorRow.state == "locked" || indicatorRow.state == "commit")
118+ PropertyChanges { target: itemWrapper; opacity: 1.0 }
93− property bool overflow: row.width - itemWrapper.x > overFlowWidth
119+ },
94− property real opacityMultiplier: highlighted ? 1 : (1 - indicatorRow.unitProgress)
120+ State {
95−
121+ name: "hidden"
96− IndicatorItem {
122+ when: hidden || overflow
97− id: indicatorItem
123+ PropertyChanges { target: itemWrapper; opacity: 0.0 }
98− identifier: model.identifier
99− height: parent.height
100−
101− dimmed: itemWrapper.dimmed
102−
103− widgetSource: model.widgetSource
104− indicatorProperties : model.indicatorProperties
105−
106− Component.onCompleted: {
107− if (visibleIndicators == undefined) {
108− visibleIndicators = {}
109− }
110− indicatorRow.visibleIndicators[model.identifier] = indicatorVisible;
111− indicatorRow.visibleIndicatorsChanged();
112− }
113− onIndicatorVisibleChanged: {
114− if (visibleIndicators == undefined) {
115− visibleIndicators = {}
116− }
117− indicatorRow.visibleIndicators[model.identifier] = indicatorVisible;
118− indicatorRow.visibleIndicatorsChanged();
119−
120− if (indicatorVisible) {
121− showAll = true;
122− allVisible.start();
123− }
124− }
125 }
124 }
125+ ]
126
126
127− states: [
128− State {
129− name: "standard"
130− when: !hidden && !overflow
131− },
132− State {
133− name: "overflow"
134− when: hidden || overflow
135− PropertyChanges { target: itemWrapper; opacity: 0.0 }
136− }
137− ]
138−
139− transitions: [
140− Transition {
141− UbuntuNumberAnimation {
142− target: itemWrapper
143− property: "opacity"
144− duration: UbuntuAnimation.BriskDuration
127+ Behavior on opacity { UbuntuNumberAnimation { duration: UbuntuAnimation.BriskDuration } }
145− }
146− }
147− ]
148− }
149 }
128 }
150 }
129 }
151
130
131+
152 Rectangle {
132 Rectangle {
153 id: highlight
133 id: highlight
154 color: Theme.palette.selected.foreground
134 color: Theme.palette.selected.foreground
@@ -156,7 +136,9 @@ Item {
156 height: units.dp(2)
136 height: units.dp(2)
157 anchors.top: row.bottom
137 anchors.top: row.bottom
158 visible: indicatorRow.currentItem != null
138 visible: indicatorRow.currentItem != null
139+
159− x: row.x + (indicatorRow.currentItem != null ? indicatorRow.currentItem.x + centerOffset : 0)
140+ property real intendedX: row.x + (indicatorRow.currentItem != null ? indicatorRow.currentItem.x + centerOffset : 0)
141+ x: intendedX >= row.x ? (intendedX + width <= row.x + row.width ? intendedX : row.x + row.width - width) : row.x // listview boundaries
160 width: indicatorRow.currentItem != null ? indicatorRow.currentItem.width : 0
142 width: indicatorRow.currentItem != null ? indicatorRow.currentItem.width : 0
161
143
162 property real centerOffset: {
144 property real centerOffset: {
qml/Panel/Indicators.qml+56−54
@@ -21,6 +21,7 @@ import Unity.Indicators 0.1 as Indicators
21
21
22import "../Components"
22import "../Components"
23import "../Components/ListItems"
23import "../Components/ListItems"
24+import "Indicators"
24
25
25Showable {
26Showable {
26 id: indicators
27 id: indicators
@@ -31,7 +32,7 @@ Showable {
31 property alias overFlowWidth: indicatorRow.overFlowWidth
32 property alias overFlowWidth: indicatorRow.overFlowWidth
32 property alias showAll: indicatorRow.showAll
33 property alias showAll: indicatorRow.showAll
33
34
34− property int hintValue
35+ readonly property real hintValue: panelHeight + menuContent.headerHeight
35 readonly property int lockThreshold: openedHeight / 2
36 readonly property int lockThreshold: openedHeight / 2
36 property bool fullyOpened: height == openedHeight
37 property bool fullyOpened: height == openedHeight
37 property bool partiallyOpened: height > panelHeight && !fullyOpened
38 property bool partiallyOpened: height > panelHeight && !fullyOpened
@@ -39,7 +40,7 @@ Showable {
39 property bool contentEnabled: true
40 property bool contentEnabled: true
40 property bool initalizeItem: true
41 property bool initalizeItem: true
41 readonly property alias content: menuContent
42 readonly property alias content: menuContent
42− property real unitProgress: 0.0
43+ property real unitProgress: (height - panelHeight) / (openedHeight - panelHeight)
43
44
44 // TODO: Perhaps we need a animation standard for showing/hiding? Each showable seems to
45 // TODO: Perhaps we need a animation standard for showing/hiding? Each showable seems to
45 // use its own values. Need to ask design about this.
46 // use its own values. Need to ask design about this.
@@ -128,7 +129,7 @@ Showable {
128
129
129 rowCoordinates = indicatorRow.mapToItem(indicatorRow.row, xValue, 0);
130 rowCoordinates = indicatorRow.mapToItem(indicatorRow.row, xValue, 0);
130 // get the current delegate
131 // get the current delegate
131− currentItem = indicatorRow.row.childAt(rowCoordinates.x, 0);
132+ currentItem = indicatorRow.row.itemAt(rowCoordinates.x, 0);
132 if (currentItem) {
133 if (currentItem) {
133 itemCoordinates = indicatorRow.row.mapToItem(currentItem, rowCoordinates.x, 0);
134 itemCoordinates = indicatorRow.row.mapToItem(currentItem, rowCoordinates.x, 0);
134 distanceFromRightEdge = (currentItem.width - itemCoordinates.x) / (currentItem.width);
135 distanceFromRightEdge = (currentItem.width - itemCoordinates.x) / (currentItem.width);
@@ -143,7 +144,7 @@ Showable {
143 }
144 }
144 }
145 }
145 if ((!useBuffer || (useBuffer && bufferExceeded)) || indicatorRow.currentItemIndex < 0 || indicatorRow.currentItem == null) {
146 if ((!useBuffer || (useBuffer && bufferExceeded)) || indicatorRow.currentItemIndex < 0 || indicatorRow.currentItem == null) {
146− indicatorRow.currentItem = currentItem;
147+ indicatorRow.setCurrentItem(currentItem);
147 }
148 }
148
149
149 // need to re-init the distanceFromRightEdge for offset calculation
150 // need to re-init the distanceFromRightEdge for offset calculation
@@ -151,7 +152,7 @@ Showable {
151 distanceFromRightEdge = (indicatorRow.currentItem.width - itemCoordinates.x) / (indicatorRow.currentItem.width);
152 distanceFromRightEdge = (indicatorRow.currentItem.width - itemCoordinates.x) / (indicatorRow.currentItem.width);
152 }
153 }
153 indicatorRow.currentItemOffset = 1 - (distanceFromRightEdge * 2);
154 indicatorRow.currentItemOffset = 1 - (distanceFromRightEdge * 2);
154− } else {
155+ } else if (initalizeItem) {
155 indicatorRow.setDefaultItem();
156 indicatorRow.setDefaultItem();
156 indicatorRow.currentItemOffset = 0;
157 indicatorRow.currentItemOffset = 0;
157 }
158 }
@@ -179,6 +180,10 @@ Showable {
179 source: "graphics/VerticalDivider.png"
180 source: "graphics/VerticalDivider.png"
180 }
181 }
181
182
183+ VisibleIndicators {
184+ id: visibleIndicators
185+ }
186+
182 MenuContent {
187 MenuContent {
183 id: menuContent
188 id: menuContent
184 objectName: "menuContent"
189 objectName: "menuContent"
@@ -189,25 +194,10 @@ Showable {
189 top: indicatorRow.bottom
194 top: indicatorRow.bottom
190 bottom: handle.top
195 bottom: handle.top
191 }
196 }
192− indicatorsModel: indicatorsModel
197+ indicatorsModel: visibleIndicators.model
193 clip: !indicators.fullyOpened
198 clip: !indicators.fullyOpened
194 activeHeader: indicators.state == "hint" || indicators.state == "reveal"
199 activeHeader: indicators.state == "hint" || indicators.state == "reveal"
195 enabled: contentEnabled
200 enabled: contentEnabled
196− visibleIndicators: indicatorRow.visibleIndicators
197−
198− Connections {
199− property bool enableIndexChangeSignal: true
200−
201− target: enableIndexChangeSignal ? indicatorRow : null
202− onCurrentItemIndexChanged: {
203− var oldActive = enableIndexChangeSignal;
204− enableIndexChangeSignal = false;
205−
206− menuContent.setCurrentMenuIndex(indicatorRow.currentItemIndex);
207−
208− enableIndexChangeSignal = oldActive;
209− }
210− }
211
201
212 //small shadow gradient at bottom of menu
202 //small shadow gradient at bottom of menu
213 Rectangle {
203 Rectangle {
@@ -235,13 +225,9 @@ Showable {
235 right: parent.right
225 right: parent.right
236 bottom: parent.bottom
226 bottom: parent.bottom
237 }
227 }
238− height: get_height()
228+ height: Math.max(Math.min(handleImage.height, indicators.height - handleImage.height), 0)
239 clip: height < handleImage.height
229 clip: height < handleImage.height
240
230
241− function get_height() {
242− return Math.max(Math.min(handleImage.height, indicators.height - handleImage.height), 0);
243− }
244−
245 BorderImage {
231 BorderImage {
246 id: handleImage
232 id: handleImage
247 source: "graphics/handle.sci"
233 source: "graphics/handle.sci"
@@ -261,12 +247,6 @@ Showable {
261 anchors.fill: indicatorRow
247 anchors.fill: indicatorRow
262 }
248 }
263
249
264− Indicators.IndicatorsModel {
265− id: indicatorsModel
266−
267− Component.onCompleted: load()
268− }
269−
270 IndicatorRow {
250 IndicatorRow {
271 id: indicatorRow
251 id: indicatorRow
272 objectName: "indicatorRow"
252 objectName: "indicatorRow"
@@ -275,24 +255,10 @@ Showable {
275 right: parent.right
255 right: parent.right
276 }
256 }
277 height: indicators.panelHeight
257 height: indicators.panelHeight
278− indicatorsModel: indicatorsModel
258+ indicatorsModel: visibleIndicators.model
279 state: indicators.state
259 state: indicators.state
280 unitProgress: indicators.unitProgress
260 unitProgress: indicators.unitProgress
281
261
282− Connections {
283− property bool enableIndexChangeSignal: true
284−
285− target: enableIndexChangeSignal ? menuContent : null
286− onCurrentMenuIndexChanged: {
287− var oldActive = enableIndexChangeSignal;
288− enableIndexChangeSignal = false;
289−
290− indicatorRow.setCurrentItem(menuContent.currentMenuIndex);
291−
292− enableIndexChangeSignal = oldActive;
293− }
294− }
295−
296 EdgeDragArea {
262 EdgeDragArea {
297 id: rowDragArea
263 id: rowDragArea
298 anchors.fill: indicatorRow
264 anchors.fill: indicatorRow
@@ -326,6 +292,7 @@ Showable {
326 onRunningChanged: {
292 onRunningChanged: {
327 if (showAnimation.running) {
293 if (showAnimation.running) {
328 indicators.state = "commit";
294 indicators.state = "commit";
295+ indicatorRow.currentItemOffset = 0;
329 }
296 }
330 }
297 }
331 }
298 }
@@ -336,20 +303,50 @@ Showable {
336 if (hideAnimation.running) {
303 if (hideAnimation.running) {
337 indicators.state = "initial";
304 indicators.state = "initial";
338 initalizeItem = true;
305 initalizeItem = true;
339− menuContent.animateNextMenuChange = false;
306+ indicatorRow.currentItemOffset = 0;
340 }
307 }
341 }
308 }
342 }
309 }
343
310
311+ QtObject {
312+ id: d
313+ property bool enableIndexChangeSignal: true
344− property var activeDragHandle: showDragHandle.dragging ? showDragHandle : hideDragHandle.dragging ? hideDragHandle : null
314+ property var activeDragHandle: showDragHandle.dragging ? showDragHandle : hideDragHandle.dragging ? hideDragHandle : null
315+ }
316+
317+ Connections {
318+ target: menuContent
319+ onCurrentMenuIndexChanged: {
320+ var oldActive = d.enableIndexChangeSignal;
321+ if (!oldActive) return;
322+ d.enableIndexChangeSignal = false;
323+
324+ indicatorRow.setCurrentItemIndex(menuContent.currentMenuIndex);
325+
326+ d.enableIndexChangeSignal = oldActive;
327+ }
328+ }
329+
330+ Connections {
331+ target: indicatorRow
332+ onCurrentItemIndexChanged: {
333+ var oldActive = d.enableIndexChangeSignal;
334+ if (!oldActive) return;
335+ d.enableIndexChangeSignal = false;
336+
337+ menuContent.setCurrentMenuIndex(indicatorRow.currentItemIndex, fullyOpened || partiallyOpened);
338+
339+ d.enableIndexChangeSignal = oldActive;
340+ }
341+ }
345 // connections to the active drag handle
342 // connections to the active drag handle
346 Connections {
343 Connections {
347− target: activeDragHandle
344+ target: d.activeDragHandle
348 onTouchXChanged: {
345 onTouchXChanged: {
349− indicators.calculateCurrentItem(activeDragHandle.touchX, true);
346+ indicators.calculateCurrentItem(d.activeDragHandle.touchX, true);
350 }
347 }
351 onTouchSceneYChanged: {
348 onTouchSceneYChanged: {
352− yVelocityCalculator.trackedPosition = activeDragHandle.touchSceneY;
349+ yVelocityCalculator.trackedPosition = d.activeDragHandle.touchSceneY;
353 }
350 }
354 }
351 }
355
352
@@ -403,8 +400,8 @@ Showable {
403 }
400 }
404 StateChangeScript {
401 StateChangeScript {
405 script: {
402 script: {
406− if (activeDragHandle) {
403+ if (d.activeDragHandle) {
407− calculateCurrentItem(activeDragHandle.touchX, false);
404+ calculateCurrentItem(d.activeDragHandle.touchX, false);
408 }
405 }
409 }
406 }
410 }
407 }
@@ -429,4 +426,9 @@ Showable {
429 NumberAnimation {targets: [indicatorRow, menuContent]; property: "y"; duration: 300; easing.type: Easing.OutCubic}
426 NumberAnimation {targets: [indicatorRow, menuContent]; property: "y"; duration: 300; easing.type: Easing.OutCubic}
430 }
427 }
431 ]
428 ]
429+
430+ Component.onCompleted: initialise();
431+ function initialise() {
432+ visibleIndicators.load();
433+ }
432}
434}
qml/Panel/Indicators/DefaultIndicatorPage.qml+9−5
@@ -138,10 +138,14 @@ Indicators.IndicatorBase {
138 sourceComponent: factory.load(model)
138 sourceComponent: factory.load(model)
139
139
140 onLoaded: {
140 onLoaded: {
141+ if (item.hasOwnProperty("selected")) {
142+ item.selected = mainMenu.selectedIndex == index;
143+ }
141 if (item.hasOwnProperty("menuSelected")) {
144 if (item.hasOwnProperty("menuSelected")) {
142− item.menuSelected = mainMenu.selectedIndex == index;
143− item.selectMenu.connect(function() { mainMenu.selectedIndex = index; });
145+ item.menuSelected.connect(function() { mainMenu.selectedIndex = index; });
146+ }
147+ if (item.hasOwnProperty("menuDeselected")) {
144− item.deselectMenu.connect(function() { mainMenu.selectedIndex = -1; });
148+ item.menuDeselected.connect(function() { mainMenu.selectedIndex = -1; });
145 }
149 }
146 if (item.hasOwnProperty("menuData")) {
150 if (item.hasOwnProperty("menuData")) {
147 item.menuData = Qt.binding(function() { return model; });
151 item.menuData = Qt.binding(function() { return model; });
@@ -162,8 +166,8 @@ Indicators.IndicatorBase {
162 Connections {
166 Connections {
163 target: mainMenu
167 target: mainMenu
164 onSelectedIndexChanged: {
168 onSelectedIndexChanged: {
165− if (loader.item && loader.item.hasOwnProperty("menuSelected")) {
169+ if (loader.item && loader.item.hasOwnProperty("selected")) {
166− loader.item.menuSelected = mainMenu.selectedIndex == index;
170+ loader.item.selected = mainMenu.selectedIndex == index;
167 }
171 }
168 }
172 }
169 }
173 }
plugins/Unity/Indicators/qml/HLine.qml → qml/Panel/Indicators/IndicatorDelegate.qmlrenamed+12−7
@@ -14,16 +14,21 @@
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 * Authors:
16 * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
17+ * Nick Dedekind <nick.dedekind@canonical.com>
18 */
18 */
19
19
20import QtQuick 2.0
20import QtQuick 2.0
21−import Ubuntu.Components 0.1
21+import Unity.Indicators 0.1 as Indicators
22
22
23−Rectangle {
23+Indicators.IndicatorBase {
24− height: units.dp(1)
24+ enabled: false
25− anchors {
25+
26− left: parent.left
26+ onRootActionStateChanged: {
27− right: parent.right
27+ if (rootActionState == undefined) {
28+ enabled = false;
29+ return;
30+ }
31+
32+ enabled = rootActionState.visible;
28 }
33 }
29}
34}
qml/Panel/Indicators/VisibleIndicators.qmlnew file+84
@@ -0,0 +1,84 @@
1+/*
2+ * Copyright 2013 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Authors:
17+ * Nick Dedekind <nick.dedekind@canonical.com>
18+ */
19+
20+import QtQuick 2.0
21+import Unity.Indicators 0.1 as Indicators
22+import Utils 0.1
23+
24+Item {
25+ property SortFilterProxyModel model: filterModel
26+
27+ SortFilterProxyModel {
28+ id: filterModel
29+ filterRole: Indicators.IndicatorsModelRole.IsVisible
30+ filterRegExp: RegExp("^true$")
31+ dynamicSortFilter: true
32+
33+ model: Indicators.VisibleIndicatorsModel {
34+ id: visibleIndicatorsModel
35+ model: indicatorsModel
36+ }
37+ }
38+
39+
40+ Indicators.IndicatorsModel {
41+ id: indicatorsModel
42+ }
43+
44+ Repeater {
45+ id: repeater
46+ model: indicatorsModel
47+
48+ property var visibleIndicators: undefined
49+ onVisibleIndicatorsChanged: {
50+ if (visibleIndicators !== undefined) {
51+ visibleIndicatorsModel.visible = visibleIndicators;
52+ }
53+ }
54+
55+ delegate: IndicatorDelegate {
56+ id: item
57+ objectName: model.identifier + "-delegate"
58+ Component.onCompleted: {
59+ for(var pName in indicatorProperties) {
60+ if (item.hasOwnProperty(pName)) {
61+ item[pName] = indicatorProperties[pName];
62+ }
63+ }
64+ updateVisibility();
65+ }
66+
67+ onEnabledChanged: {
68+ updateVisibility()
69+ }
70+
71+ function updateVisibility() {
72+ if (repeater.visibleIndicators === undefined) {
73+ repeater.visibleIndicators = {}
74+ }
75+ repeater.visibleIndicators[model.identifier] = enabled;
76+ repeater.visibleIndicatorsChanged();
77+ }
78+ }
79+ }
80+
81+ function load() {
82+ indicatorsModel.load();
83+ }
84+}
qml/Panel/Indicators/client/IndicatorsList.qml+14−13
@@ -40,24 +40,25 @@ Page {
40 anchors.fill: parent
40 anchors.fill: parent
41 model: indicatorsModel
41 model: indicatorsModel
42
42
43− delegate: Indicators.FramedMenuItem {
43+ delegate: Rectangle {
44+ color: "#221e1c"
45+
44 anchors.left: parent.left
46 anchors.left: parent.left
45 anchors.right: parent.right
47 anchors.right: parent.right
46− objectName: identifier
48+ height: menuItem.height
47−
48− text: identifier
49
49
50− onClicked: {
50+ ListItem.Standard {
51− var new_page = Qt.createComponent("IndicatorsPage.qml");
51+ id: menuItem
52− page.pageStack.push(new_page.createObject(pages), {"indicatorProperties" : model.indicatorProperties, "pageSource" : model.pageSource});
52+ anchors.left: parent.left
53− }
53+ anchors.right: parent.right
54+ objectName: identifier
54
55
55− Rectangle {
56+ text: identifier
56− id: background
57
57
58− anchors.fill: parent
58+ onClicked: {
59− color: "#221e1c"
59+ var new_page = Qt.createComponent("IndicatorsPage.qml");
60− z: -1
60+ page.pageStack.push(new_page.createObject(pages), {"indicatorProperties" : model.indicatorProperties, "pageSource" : model.pageSource});
61+ }
61 }
62 }
62 }
63 }
63 }
64 }
qml/Panel/MenuContent.qml+13−26
@@ -28,26 +28,22 @@ MainView {
28
28
29 property QtObject indicatorsModel: null
29 property QtObject indicatorsModel: null
30 property bool __contentActive: false
30 property bool __contentActive: false
31− readonly property int currentMenuIndex : filteredIndicators.mapToSource(tabs.selectedTabIndex)
31+ readonly property int currentMenuIndex: tabs.selectedTabIndex
32 backgroundColor: "#221e1c" // FIXME not in palette yet
32 backgroundColor: "#221e1c" // FIXME not in palette yet
33 property int contentReleaseInterval: 20000
33 property int contentReleaseInterval: 20000
34 property bool activeHeader: false
34 property bool activeHeader: false
35− property alias visibleIndicators: visibleIndicatorsModel.visible
35+ property real headerHeight: tabs.tabBar.height
36− property bool animateNextMenuChange: false
37
36
38 width: units.gu(40)
37 width: units.gu(40)
39 height: units.gu(42)
38 height: units.gu(42)
40
39
41− function setCurrentMenuIndex(index) {
40+ function setCurrentMenuIndex(index, animate) {
42− var filteredIndex = filteredIndicators.mapFromSource(index)
43−
44− if (tabs.selectedTabIndex !== filteredIndex) {
41+ if (tabs.selectedTabIndex !== index) {
45− if (tabs.selectedTabIndex == -1 || !animateNextMenuChange) {
42+ if (tabs.selectedTabIndex === -1 || !animate) {
46 tabs.tabBar.animate = false;
43 tabs.tabBar.animate = false;
47 }
44 }
48− tabs.selectedTabIndex = filteredIndex;
45+ tabs.selectedTabIndex = index;
49 tabs.tabBar.animate = true;
46 tabs.tabBar.animate = true;
50− animateNextMenuChange = true;
51 }
47 }
52 }
48 }
53
49
@@ -67,29 +63,14 @@ MainView {
67 tabs.tabBar.alwaysSelectionMode = activeHeader;
63 tabs.tabBar.alwaysSelectionMode = activeHeader;
68 }
64 }
69
65
70− SortFilterProxyModel {
71− id: filteredIndicators
72− model: visibleIndicatorsModel
73− dynamicSortFilter: true
74−
75− filterRole: Indicators.IndicatorsModelRole.IsVisible
76− filterRegExp: RegExp("^true$")
77− }
78−
79− Indicators.VisibleIndicatorsModel {
80− id: visibleIndicatorsModel
81− model: indicatorsModel
82− }
83−
84 Tabs {
66 Tabs {
85 id: tabs
67 id: tabs
86 objectName: "tabs"
68 objectName: "tabs"
87 anchors.fill: parent
69 anchors.fill: parent
88− selectedTabIndex: -1
89
70
90 Repeater {
71 Repeater {
91 id: repeater
72 id: repeater
92− model: filteredIndicators
73+ model: content.indicatorsModel ? content.indicatorsModel : null
93 objectName: "tabsRepeater"
74 objectName: "tabsRepeater"
94
75
95 // FIXME: This is needed because tabs dont handle repeaters well.
76 // FIXME: This is needed because tabs dont handle repeaters well.
@@ -145,6 +126,12 @@ MainView {
145 property: "title"
126 property: "title"
146 value: loader.item && loader.item.hasOwnProperty("title") && loader.item.title !== "" ? loader.item.title : model.identifier
127 value: loader.item && loader.item.hasOwnProperty("title") && loader.item.title !== "" ? loader.item.title : model.identifier
147 }
128 }
129+
130+ Binding {
131+ target: loader.item
132+ property: "objectName"
133+ value: identifier + "-page"
134+ }
148 }
135 }
149 }
136 }
150 }
137 }
qml/Panel/Panel.qml+1−4
@@ -50,7 +50,7 @@ Item {
50
50
51 Connections {
51 Connections {
52 target: indicatorsMenu
52 target: indicatorsMenu
53− onShown: hideTimer.stop()
53+ onShownChanged: hideTimer.stop()
54 }
54 }
55
55
56 PanelBackground {
56 PanelBackground {
@@ -101,13 +101,10 @@ Item {
101 y: panelBackground.y
101 y: panelBackground.y
102 width: root.indicatorsMenuWidth
102 width: root.indicatorsMenuWidth
103 shown: false
103 shown: false
104− hintValue: __panelMinusSeparatorLineHeight * 3
105 panelHeight: __panelMinusSeparatorLineHeight
104 panelHeight: __panelMinusSeparatorLineHeight
106 openedHeight: parent.height + (pinnedMode ? 0 : root.panelHeight)
105 openedHeight: parent.height + (pinnedMode ? 0 : root.panelHeight)
107 pinnedMode: !fullscreenMode
106 pinnedMode: !fullscreenMode
108 overFlowWidth: search.state=="hidden" ? parent.width : parent.width - search.width
107 overFlowWidth: search.state=="hidden" ? parent.width : parent.width - search.width
109−
110− unitProgress: (height - panelHeight) / (openedHeight - panelHeight)
111 }
108 }
112
109
113 PanelSeparatorLine {
110 PanelSeparatorLine {
tests/autopilot/unity8/process_helpers.py+3−3
@@ -55,7 +55,7 @@ def restart_unity(*args):
55 status = _get_unity_status()
55 status = _get_unity_status()
56 if "start/" in status:
56 if "start/" in status:
57 try:
57 try:
58− output = subprocess.check_output(['initctl', 'stop', 'unity8'])
58+ output = subprocess.check_output(['/sbin/initctl', 'stop', 'unity8'])
59 logger.info(output)
59 logger.info(output)
60 except subprocess.CalledProcessError as e:
60 except subprocess.CalledProcessError as e:
61 e.args += (
61 e.args += (
@@ -64,7 +64,7 @@ def restart_unity(*args):
64 raise
64 raise
65
65
66 try:
66 try:
67− command = ['initctl', 'start', 'unity8'] + list(args)
67+ command = ['/sbin/initctl', 'start', 'unity8'] + list(args)
68 output = subprocess.check_output(
68 output = subprocess.check_output(
69 command,
69 command,
70 stderr=subprocess.STDOUT,
70 stderr=subprocess.STDOUT,
@@ -82,7 +82,7 @@ def restart_unity(*args):
82def _get_unity_status():
82def _get_unity_status():
83 try:
83 try:
84 return subprocess.check_output([
84 return subprocess.check_output([
85− 'initctl',
85+ '/sbin/initctl',
86 'status',
86 'status',
87 'unity8'
87 'unity8'
88 ])
88 ])
tests/autopilot/unity8/shell/emulators/__init__.py+1−1
@@ -25,7 +25,7 @@ class UnityEmulatorBase(introspection.CustomEmulatorBase):
25
25
26 def __init__(self, *args):
26 def __init__(self, *args):
27 super(UnityEmulatorBase, self).__init__(*args)
27 super(UnityEmulatorBase, self).__init__(*args)
28− self.pointing_device = input.Touch.create()
28+ self.pointing_device = input.Pointer(device=input.Touch.create())
29
29
30
30
31class UnityEmulatorException(Exception):
31class UnityEmulatorException(Exception):
tests/autopilot/unity8/shell/emulators/create_interactive_notification.py+1−1
@@ -87,7 +87,7 @@ if __name__ == '__main__':
87 action_id,
87 action_id,
88 action_label,
88 action_label,
89 action_callback,
89 action_callback,
90− (None, ),
90+ None,
91 None
91 None
92 )
92 )
93
93
tests/autopilot/unity8/shell/emulators/dash.py+72−3
@@ -137,9 +137,78 @@ class Dash(emulators.UnityEmulatorBase):
137 self.dash_content_list.currentIndex.wait_for(original_index + 1)
137 self.dash_content_list.currentIndex.wait_for(original_index + 1)
138
138
139
139
140+class DashPreview(emulators.UnityEmulatorBase):
141+ """Autopilot emulator for the generic preview."""
142+
143+ def get_details(self):
144+ """Return the details of the open preview."""
145+ title = self.select_single('Label', objectName='titleLabel').text
146+ subtitle = self.select_single(
147+ 'Label', objectName='subtitleLabel').text
148+ description = self.select_single(
149+ 'Label', objectName='descriptionLabel').text
150+ return dict(title=title, subtitle=subtitle, description=description)
151+
152+
140class GenericScopeView(emulators.UnityEmulatorBase):
153class GenericScopeView(emulators.UnityEmulatorBase):
141− """Autopilot emulators for generic scopes."""
154+ """Autopilot emulator for generic scopes."""
155+
156+ preview_class = DashPreview
157+
158+ @autopilot_logging.log_action(logger.info)
159+ def open_preview(self, category, app_name):
160+ """Open the preview of an application.
161+
162+ :parameter category: The name of the category where the application is.
163+ :app_name: The name of the application.
164+
165+ """
166+ category_element = self._get_category_element(category)
167+ icon = category_element.select_single('Tile', text=app_name)
168+ # FIXME some categories need a long press in order to see the preview.
169+ # Some categories do not show previews, like recent apps.
170+ # --elopio - 2014-1-14
171+ self.pointing_device.click_object(icon)
172+ preview = self.get_root_instance().wait_select_single(
173+ self.preview_class, isCurrent=True)
174+ preview.showProcessingAction.wait_for(False)
175+ return preview
176+
177+ def _get_category_element(self, category):
178+ try:
179+ return self.wait_select_single(
180+ 'Base', objectName='dashCategory{}'.format(category))
181+ except dbus.StateNotFoundError:
182+ raise emulators.UnityEmulatorException(
183+ 'No category found with name {}'.format(category))
184+
185+
186+class AppPreview(DashPreview):
187+ """Autopilot emulator for the application preview."""
188+
189+ def get_details(self):
190+ """Return the details of the application showed in its preview."""
191+ details = super(AppPreview, self).get_details()
192+ # TODO return screenshots, icon, rating and reviews.
193+ # --elopio - 2014-1-15
194+ return dict(
195+ title=details.get('title'), publisher=details.get('subtitle'),
196+ description=details.get('description'))
142
197
143
198
144−class DashApps(emulators.UnityEmulatorBase):
199+class DashApps(GenericScopeView):
145− """Autopilot emulators for the applications scope."""
200+ """Autopilot emulator for the applications scope."""
201+
202+ preview_class = AppPreview
203+
204+ def get_applications(self, category):
205+ """Return the list of applications on a category.
206+
207+ :parameter category: The name of the category.
208+
209+ """
210+ category_element = self._get_category_element(category)
211+ application_tiles = category_element.select_many('Tile')
212+ # TODO return them on the same order they are displayed.
213+ # --elopio - 2014-1-15
214+ return [tile.text for tile in application_tiles]
tests/autopilot/unity8/shell/fixture_setup.pynew file+53
@@ -0,0 +1,53 @@
1+# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2+#
3+# Unity Autopilot Test Suite
4+# Copyright (C) 2014 Canonical
5+#
6+# This program is free software: you can redistribute it and/or modify
7+# it under the terms of the GNU General Public License as published by
8+# the Free Software Foundation, either version 3 of the License, or
9+# (at your option) any later version.
10+#
11+# This program is distributed in the hope that it will be useful,
12+# but WITHOUT ANY WARRANTY; without even the implied warranty of
13+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+# GNU General Public License for more details.
15+#
16+# You should have received a copy of the GNU General Public License
17+# along with this program. If not, see <http://www.gnu.org/licenses/>.
18+#
19+
20+"""Set up and clean up fixtures for the Unity acceptance tests."""
21+
22+import os
23+import sysconfig
24+
25+import fixtures
26+
27+import unity8
28+
29+
30+class FakeScopes(fixtures.Fixture):
31+
32+ def setUp(self):
33+ super(FakeScopes, self).setUp()
34+ self.useFixture(
35+ fixtures.EnvironmentVariable(
36+ 'QML2_IMPORT_PATH',
37+ newvalue=self._get_fake_scopes_library_path()))
38+
39+ def _get_fake_scopes_library_path(self):
40+ if unity8.running_installed_tests():
41+ mock_path = 'qml/scopefakes/'
42+ else:
43+ mock_path = os.path.join(
44+ '../lib/', sysconfig.get_config_var('MULTIARCH'),
45+ 'unity8/qml/scopefakes/')
46+ lib_path = unity8.get_lib_path()
47+ ld_library_path = os.path.abspath(os.path.join(lib_path, mock_path))
48+
49+ if not os.path.exists(ld_library_path):
50+ raise RuntimeError(
51+ 'Expected library path does not exists: %s.' % (
52+ ld_library_path))
53+ return ld_library_path
tests/autopilot/unity8/shell/tests/test_emulators.py+98−3
@@ -17,23 +17,38 @@
17# along with this program. If not, see <http://www.gnu.org/licenses/>.
17# along with this program. If not, see <http://www.gnu.org/licenses/>.
18#
18#
19
19
20+"""Tests for the Dash autopilot emulators.
21+
22+The autopilot emulators are helpers for tests that check a user journey that
23+involves the dash. The code for some of those tests will not be inside this
24+branch, but in projects that depend on unity or that test the whole system
25+integration. So, we need to test the helpers in order to make sure that we
26+don't break them for those external projects.
27+
28+"""
29+
20import mock
30import mock
21
31
32+from testtools.matchers import Contains, HasLength
33+
22from unity8 import process_helpers
34from unity8 import process_helpers
23−from unity8.shell import emulators, tests
35+from unity8.shell import emulators, fixture_setup, tests
24from unity8.shell.emulators import dash as dash_emulators
36from unity8.shell.emulators import dash as dash_emulators
25
37
26
38
27−class DashEmulatorTestCase(tests.UnityTestCase):
39+class DashBaseTestCase(tests.UnityTestCase):
28
40
29 scenarios = tests._get_device_emulation_scenarios()
41 scenarios = tests._get_device_emulation_scenarios()
30
42
31 def setUp(self):
43 def setUp(self):
32− super(DashEmulatorTestCase, self).setUp()
44+ super(DashBaseTestCase, self).setUp()
33 unity_proxy = self.launch_unity()
45 unity_proxy = self.launch_unity()
34 process_helpers.unlock_unity(unity_proxy)
46 process_helpers.unlock_unity(unity_proxy)
35 self.dash = self.main_window.get_dash()
47 self.dash = self.main_window.get_dash()
36
48
49+
50+class DashEmulatorTestCase(DashBaseTestCase):
51+
37 def test_open_unexisting_scope(self):
52 def test_open_unexisting_scope(self):
38 scope_name = 'unexisting'
53 scope_name = 'unexisting'
39 with mock.patch.object(self.dash, 'pointing_device') as mock_pointer:
54 with mock.patch.object(self.dash, 'pointing_device') as mock_pointer:
@@ -118,3 +133,83 @@ class DashEmulatorTestCase(tests.UnityTestCase):
118 scope = self.dash.open_scope(self._get_scope_name_from_id(scope_id))
133 scope = self.dash.open_scope(self._get_scope_name_from_id(scope_id))
119 self._assert_scope_is_opened(scope, scope_id)
134 self._assert_scope_is_opened(scope, scope_id)
120 self.assertIsInstance(scope, dash_emulators.DashApps)
135 self.assertIsInstance(scope, dash_emulators.DashApps)
136+
137+
138+class GenericScopeViewEmulatorTestCase(DashBaseTestCase):
139+
140+ def setUp(self):
141+ # Set up the fake scopes before launching unity.
142+ self.useFixture(fixture_setup.FakeScopes())
143+ super(GenericScopeViewEmulatorTestCase, self).setUp()
144+ self.home_scope = self.dash.open_scope('home')
145+
146+ def test_open_preview(self):
147+ preview = self.home_scope.open_preview('0', 'Title.0')
148+ self.assertIsInstance(preview, dash_emulators.DashPreview)
149+ self.assertTrue(preview.isCurrent)
150+ self.assertFalse(preview.showProcessingAction)
151+
152+ def test_get_details(self):
153+ expected_details = dict(
154+ title='Title', subtitle='Subtitle', description='Description')
155+
156+ preview = self.home_scope.open_preview('0', 'Title.0')
157+ details = preview.get_details()
158+
159+ self.assertEqual(expected_details, details)
160+
161+
162+class DashAppsEmulatorTestCase(DashBaseTestCase):
163+
164+ available_applications = [
165+ 'Title.1', 'Title.21', 'Title.41', 'Title.61', 'Title.81',
166+ 'Title.101', 'Title.121', 'Title.141', 'Title.161', 'Title.181',
167+ 'Title.201', 'Title.221', 'Title.241', 'Title.261', 'Title.281']
168+
169+ def setUp(self):
170+ # Set up the fake scopes before launching unity.
171+ self.useFixture(fixture_setup.FakeScopes())
172+ super(DashAppsEmulatorTestCase, self).setUp()
173+ self.applications_scope = self.dash.open_scope('applications')
174+
175+ def test_get_applications_with_unexisting_category(self):
176+ exception = self.assertRaises(
177+ emulators.UnityEmulatorException,
178+ self.applications_scope.get_applications,
179+ 'unexisting category')
180+
181+ self.assertEqual(
182+ 'No category found with name unexisting category', str(exception))
183+
184+ def test_get_applications_should_return_list_with_names(self):
185+ category = 'installed'
186+ expected_apps_count = self._get_number_of_application_slots(category)
187+ expected_applications = self.available_applications[
188+ :expected_apps_count]
189+
190+ applications = self.applications_scope.get_applications(category)
191+
192+ self.assertThat(applications, HasLength(expected_apps_count))
193+ for expected in expected_applications:
194+ self.assertThat(applications, Contains(expected))
195+
196+ def _get_number_of_application_slots(self, category):
197+ category_element = self.applications_scope._get_category_element(
198+ category)
199+ grid = category_element.select_single('GenericFilterGrid')
200+ return grid.columns * grid.rows
201+
202+ def test_open_preview(self):
203+ preview = self.applications_scope.open_preview('installed', 'Title.1')
204+ self.assertIsInstance(preview, dash_emulators.AppPreview)
205+ self.assertTrue(preview.isCurrent)
206+ self.assertFalse(preview.showProcessingAction)
207+
208+ def test_get_details(self):
209+ expected_details = dict(
210+ title='Title', publisher='', description='Description')
211+
212+ preview = self.applications_scope.open_preview('installed', 'Title.1')
213+ details = preview.get_details()
214+
215+ self.assertEqual(expected_details, details)
tests/autopilot/unity8/shell/tests/test_notifications.py+3−6
@@ -57,9 +57,7 @@ class NotificationsBase(UnityTestCase):
57 if os.path.abspath(__file__).startswith('/usr/'):
57 if os.path.abspath(__file__).startswith('/usr/'):
58 return '/usr/share/unity8/graphics/' + icon_name
58 return '/usr/share/unity8/graphics/' + icon_name
59 else:
59 else:
60− return os.path.abspath(
61− os.getcwd() + "/../../graphics/" + icon_name
60+ return os.path.dirname(__file__) + "/../../../../../qml/graphics/" + icon_name
62− )
63
61
64 def _get_notifications_list(self):
62 def _get_notifications_list(self):
65 main_view = self.main_window.get_qml_view()
63 main_view = self.main_window.get_qml_view()
@@ -158,8 +156,6 @@ class InteractiveNotificationBase(NotificationsBase):
158 offer more options."""
156 offer more options."""
159 unity_proxy = self.launch_unity()
157 unity_proxy = self.launch_unity()
160
158
161− notify_list = self._get_notifications_list()
162−
163 summary = "Incoming call"
159 summary = "Incoming call"
164 body = "Frank Zappa\n+44 (0)7736 027340"
160 body = "Frank Zappa\n+44 (0)7736 027340"
165 icon_path = self._get_icon_path('avatars/anna_olsson.png')
161 icon_path = self._get_icon_path('avatars/anna_olsson.png')
@@ -188,8 +184,9 @@ class InteractiveNotificationBase(NotificationsBase):
188 hints
184 hints
189 )
185 )
190
186
187+ notify_list = self._get_notifications_list()
191 get_notification = lambda: notify_list.wait_select_single(
188 get_notification = lambda: notify_list.wait_select_single(
192− 'Notification', objectName='notification1')
189+ 'Notification', objectName='notification0')
193 notification = get_notification()
190 notification = get_notification()
194 self._assert_notification(notification, None, None, True, True, 1.0)
191 self._assert_notification(notification, None, None, True, True, 1.0)
195 initial_height = notification.height
192 initial_height = notification.height
tests/autopilot/unity8/shell/tests/test_system_integration.pynew file+40
@@ -0,0 +1,40 @@
1+# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2+#
3+# Unity Autopilot Test Suite
4+# Copyright (C) 2014 Canonical
5+#
6+# This program is free software: you can redistribute it and/or modify
7+# it under the terms of the GNU General Public License as published by
8+# the Free Software Foundation, either version 3 of the License, or
9+# (at your option) any later version.
10+#
11+# This program is distributed in the hope that it will be useful,
12+# but WITHOUT ANY WARRANTY; without even the implied warranty of
13+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+# GNU General Public License for more details.
15+#
16+# You should have received a copy of the GNU General Public License
17+# along with this program. If not, see <http://www.gnu.org/licenses/>.
18+#
19+
20+"""Tests for system integration."""
21+
22+import subprocess
23+import unittest
24+
25+from unity8.shell.emulators import UnityEmulatorBase
26+from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
27+
28+from testtools.matchers._basic import Equals
29+
30+class SystemIntegrationTests(UnityTestCase):
31+
32+ scenarios = _get_device_emulation_scenarios()
33+
34+ @unittest.skip("Disabled until we can investigate jenkins failure")
35+ def test_networkmanager_integration(self):
36+ self.launch_unity()
37+
38+ # invoke policykit to check permissions
39+ pid = subprocess.check_output("pidof -s unity8", shell=True)
40+ subprocess.check_call("pkcheck --action-id org.freedesktop.NetworkManager.enable-disable-network --process " + pid, shell=True)
tests/mocks/Unity/CMakeLists.txt+9−2
@@ -1,5 +1,7 @@
1add_subdirectory(Application)
1add_subdirectory(Application)
2add_subdirectory(Indicators)
2add_subdirectory(Indicators)
3+add_subdirectory(Launcher)
4+add_subdirectory(Notifications)
3
5
4pkg_search_module(DEE dee-1.0 REQUIRED)
6pkg_search_module(DEE dee-1.0 REQUIRED)
5pkg_search_module(GOBJECT gobject-2.0 REQUIRED)
7pkg_search_module(GOBJECT gobject-2.0 REQUIRED)
@@ -41,5 +43,10 @@ file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/qmldir"
41 DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
43 DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
42 )
44 )
43
45
44−add_subdirectory(Launcher)
46+install(TARGETS FakeUnityQml
45−add_subdirectory(Notifications)
47+ DESTINATION ${SHELL_INSTALL_QML}/scopefakes/Unity
48+ )
49+
50+install(FILES qmldir
51+ DESTINATION ${SHELL_INSTALL_QML}/scopefakes/Unity
52+ )
tests/mocks/Unity/Indicators/IndicatorsModel.qml+7−10
@@ -21,45 +21,42 @@ ListModel {
21
21
22 property var indicatorData : undefined
22 property var indicatorData : undefined
23
23
24− function load() {}
24+ function load() {
25+ clear();
25
26
26− // Need to do this dynamically.
27− // Apparently ListModels dont order roles visually when using ListElement
28− // which throws off the filter for non-visible indicators.
29− Component.onCompleted: {
30 append({ "identifier": "indicator-fake1",
27 append({ "identifier": "indicator-fake1",
31 "position": 0,
28 "position": 0,
32 "widgetSource": "qrc:/tests/indciators/qml/fake_menu_widget1.qml",
29 "widgetSource": "qrc:/tests/indciators/qml/fake_menu_widget1.qml",
33 "pageSource": "qrc:/tests/indciators/qml/fake_menu_page1.qml",
30 "pageSource": "qrc:/tests/indciators/qml/fake_menu_page1.qml",
34− "indicatorProperties": ""
31+ "indicatorProperties": { enabled: true }
35 });
32 });
36
33
37 append({ "identifier": "indicator-fake2",
34 append({ "identifier": "indicator-fake2",
38 "position": 1,
35 "position": 1,
39 "widgetSource": "qrc:/tests/indciators/qml/fake_menu_widget2.qml",
36 "widgetSource": "qrc:/tests/indciators/qml/fake_menu_widget2.qml",
40 "pageSource": "qrc:/tests/indciators/qml/fake_menu_page2.qml",
37 "pageSource": "qrc:/tests/indciators/qml/fake_menu_page2.qml",
41− "indicatorProperties": ""
38+ "indicatorProperties": { enabled: true }
42 });
39 });
43
40
44 append({ "identifier": "indicator-fake3",
41 append({ "identifier": "indicator-fake3",
45 "position": 2,
42 "position": 2,
46 "widgetSource": "qrc:/tests/indciators/qml/fake_menu_widget3.qml",
43 "widgetSource": "qrc:/tests/indciators/qml/fake_menu_widget3.qml",
47 "pageSource": "qrc:/tests/indciators/qml/fake_menu_page3.qml",
44 "pageSource": "qrc:/tests/indciators/qml/fake_menu_page3.qml",
48− "indicatorProperties": ""
45+ "indicatorProperties": { enabled: true }
49 });
46 });
50
47
51 append({ "identifier": "indicator-fake4",
48 append({ "identifier": "indicator-fake4",
52 "position": 3,
49 "position": 3,
53 "widgetSource": "qrc:/tests/indciators/qml/fake_menu_widget4.qml",
50 "widgetSource": "qrc:/tests/indciators/qml/fake_menu_widget4.qml",
54 "pageSource": "qrc:/tests/indciators/qml/fake_menu_page4.qml",
51 "pageSource": "qrc:/tests/indciators/qml/fake_menu_page4.qml",
55− "indicatorProperties": ""
52+ "indicatorProperties": { enabled: true }
56 });
53 });
57
54
58 append({ "identifier": "indicator-fake5",
55 append({ "identifier": "indicator-fake5",
59 "position": 4,
56 "position": 4,
60 "widgetSource": "qrc:/tests/indciators/qml/fake_menu_widget5.qml",
57 "widgetSource": "qrc:/tests/indciators/qml/fake_menu_widget5.qml",
61 "pageSource": "qrc:/tests/indciators/qml/fake_menu_page5.qml",
58 "pageSource": "qrc:/tests/indciators/qml/fake_menu_page5.qml",
62− "indicatorProperties": ""
59+ "indicatorProperties": { enabled: true }
63 });
60 });
64 }
61 }
65}
62}
tests/mocks/Unity/Indicators/qml/fake_menu_page1.qml−1
@@ -19,7 +19,6 @@ import Unity.Indicators 0.1 as Indicators
19
19
20Indicators.FakeMenuPage {
20Indicators.FakeMenuPage {
21 id: menu_plugin1
21 id: menu_plugin1
22− objectName: "menu_page1"
23
22
24 Rectangle {
23 Rectangle {
25 id: contents
24 id: contents
tests/mocks/Unity/Indicators/qml/fake_menu_page2.qml−1
@@ -19,7 +19,6 @@ import Unity.Indicators 0.1 as Indicators
19
19
20Indicators.FakeMenuPage {
20Indicators.FakeMenuPage {
21 id: menu_plugin2
21 id: menu_plugin2
22− objectName: "menu_page2"
23
22
24 Rectangle {
23 Rectangle {
25 id: contents
24 id: contents
tests/mocks/Unity/Indicators/qml/fake_menu_page3.qml−1
@@ -19,7 +19,6 @@ import Unity.Indicators 0.1 as Indicators
19
19
20Indicators.FakeMenuPage {
20Indicators.FakeMenuPage {
21 id: menu_plugin3
21 id: menu_plugin3
22− objectName: "menu_page3"
23
22
24 Rectangle {
23 Rectangle {
25 id: contents
24 id: contents
tests/mocks/Unity/Indicators/qml/fake_menu_page4.qml−1
@@ -19,7 +19,6 @@ import Unity.Indicators 0.1 as Indicators
19
19
20Indicators.FakeMenuPage {
20Indicators.FakeMenuPage {
21 id: menu_plugin4
21 id: menu_plugin4
22− objectName: "menu_page4"
23
22
24 Rectangle {
23 Rectangle {
25 id: contents
24 id: contents
tests/mocks/Unity/Indicators/qml/fake_menu_page5.qml−1
@@ -19,7 +19,6 @@ import Unity.Indicators 0.1 as Indicators
19
19
20Indicators.FakeMenuPage {
20Indicators.FakeMenuPage {
21 id: menu_plugin5
21 id: menu_plugin5
22− objectName: "menu_page5"
23
22
24 Rectangle {
23 Rectangle {
25 id: contents
24 id: contents
tests/mocks/Unity/Indicators/qml/fake_menu_widget2.qml+1−3
@@ -19,7 +19,5 @@ import QtQuick 2.0
19Rectangle {
19Rectangle {
20 width: 40
20 width: 40
21 height: 40
21 height: 40
22− color : "yellow"
22+ color : "blue"
23−
24− enabled: false
25}
23}
tests/mocks/Unity/Indicators/qml/fake_menu_widget3.qml+1−1
@@ -19,5 +19,5 @@ import QtQuick 2.0
19Rectangle {
19Rectangle {
20 width: 40
20 width: 40
21 height: 40
21 height: 40
22− color : "blue"
22+ color : "yellow"
23}
23}
tests/mocks/Unity/fake_applications_scope.cpp+2−1
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2014 Canonical, Ltd.
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
@@ -30,6 +30,7 @@ ApplicationsScope::ApplicationsScope(bool visible, QObject* parent)
30 m_id = "applications.scope";
30 m_id = "applications.scope";
31 m_name = "Applications";
31 m_name = "Applications";
32 m_visible = visible;
32 m_visible = visible;
33+ m_previewRendererName = "preview-application";
33 m_categories->setModel(createCategoriesModel());
34 m_categories->setModel(createCategoriesModel());
34}
35}
35
36
tests/mocks/Unity/fake_preview.cpp+5−3
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2014 Canonical, Ltd.
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
@@ -16,13 +16,15 @@
16
16
17#include "fake_preview.h"
17#include "fake_preview.h"
18
18
19−Preview::Preview(QObject *parent): QObject(parent)
19+Preview::Preview(const QString &rendererName, QObject *parent):
20+ QObject(parent),
21+ m_rendererName(rendererName)
20{
22{
21}
23}
22
24
23QString Preview::rendererName() const
25QString Preview::rendererName() const
24{
26{
25− return "generic-preview";
27+ return m_rendererName;
26}
28}
27
29
28QString Preview::title() const
30QString Preview::title() const
tests/mocks/Unity/fake_preview.h+5−2
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2014 Canonical, Ltd.
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
@@ -38,7 +38,7 @@ class Q_DECL_EXPORT Preview : public QObject
38 Q_PROPERTY(QString image READ image NOTIFY previewChanged)
38 Q_PROPERTY(QString image READ image NOTIFY previewChanged)
39
39
40public:
40public:
41− explicit Preview(QObject *parent = 0);
41+ explicit Preview(const QString &rendererName, QObject *parent = 0);
42
42
43 QString rendererName() const;
43 QString rendererName() const;
44 QString title() const;
44 QString title() const;
@@ -55,6 +55,9 @@ public:
55
55
56Q_SIGNALS:
56Q_SIGNALS:
57 void previewChanged();
57 void previewChanged();
58+
59+private:
60+ QString m_rendererName;
58};
61};
59
62
60Q_DECLARE_METATYPE(Preview *)
63Q_DECLARE_METATYPE(Preview *)
tests/mocks/Unity/fake_scope.cpp+3−2
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2014 Canonical, Ltd.
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
@@ -38,6 +38,7 @@ Scope::Scope(QString const& id, QString const& name, bool visible, QObject* pare
38 , m_isActive(false)
38 , m_isActive(false)
39 , m_categories(new Categories(this))
39 , m_categories(new Categories(this))
40 , m_results(new DeeListModel(this))
40 , m_results(new DeeListModel(this))
41+ , m_previewRendererName("preview-generic")
41{
42{
42 DeeModel* results_model = create_results_model(20, 300);
43 DeeModel* results_model = create_results_model(20, 300);
43 m_categories->setResultModel(results_model);
44 m_categories->setResultModel(results_model);
@@ -47,7 +48,7 @@ Scope::Scope(QString const& id, QString const& name, bool visible, QObject* pare
47 m_timer.setInterval(1000);
48 m_timer.setInterval(1000);
48 m_timer.setSingleShot(true);
49 m_timer.setSingleShot(true);
49 connect(&m_timer, &QTimer::timeout, [this]() {
50 connect(&m_timer, &QTimer::timeout, [this]() {
50− Preview *p = new Preview(this);
51+ Preview *p = new Preview(m_previewRendererName, this);
51 Q_EMIT previewReady(p);
52 Q_EMIT previewReady(p);
52 });
53 });
53}
54}
tests/mocks/Unity/fake_scope.h+3−1
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2014 Canonical, Ltd.
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
@@ -116,6 +116,8 @@ protected:
116 bool m_searching;
116 bool m_searching;
117 bool m_isActive;
117 bool m_isActive;
118
118
119+ QString m_previewRendererName;
120+
119 Categories* m_categories;
121 Categories* m_categories;
120 DeeListModel* m_results;
122 DeeListModel* m_results;
121
123
tests/plugins/DashViews/CMakeLists.txt+12−15
@@ -40,22 +40,17 @@ qt5_use_modules(listviewwithpageheadertestsectionexternalmodelExec Test Core Qml
40target_link_libraries(listviewwithpageheadertestsectionexternalmodelExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
40target_link_libraries(listviewwithpageheadertestsectionexternalmodelExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
41add_custom_target(testlistviewwithpageheadersectionexternalmodel ${CMAKE_CURRENT_BINARY_DIR}/listviewwithpageheadertestsectionexternalmodelExec -o ${CMAKE_BINARY_DIR}/testlistviewwithpageheadersectionexternalmodel.xml,xunitxml -o -,txt)
41add_custom_target(testlistviewwithpageheadersectionexternalmodel ${CMAKE_CURRENT_BINARY_DIR}/listviewwithpageheadertestsectionexternalmodelExec -o ${CMAKE_BINARY_DIR}/testlistviewwithpageheadersectionexternalmodel.xml,xunitxml -o -,txt)
42
42
43−macro(add_journal_try_test FILENAME)
43+macro(add_dashview_try_test FILENAME TESTNAME)
44− # Capitalite the first letter for the test/try name targets
45− string(SUBSTRING ${FILENAME} 0 1 FIRST_LETTER)
46− string(TOUPPER ${FIRST_LETTER} FIRST_LETTER)
47− string(REGEX REPLACE "^.(.*)" "${FIRST_LETTER}\\1" CUSTOM_TARGET_NAME "${FILENAME}")
48−
49 add_executable(${FILENAME}testExec
44 add_executable(${FILENAME}testExec
50 ${FILENAME}test.cpp
45 ${FILENAME}test.cpp
51 ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/${FILENAME}.cpp
46 ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/${FILENAME}.cpp
52− ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/abstractjournal.cpp
47+ ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/abstractdashview.cpp
53 )
48 )
54 qt5_use_modules(${FILENAME}testExec Test Core Qml)
49 qt5_use_modules(${FILENAME}testExec Test Core Qml)
55 target_link_libraries(${FILENAME}testExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
50 target_link_libraries(${FILENAME}testExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
56− add_custom_target(test${CUSTOM_TARGET_NAME}
51+ add_custom_target(test${TESTNAME}
57 ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}testExec
52 ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}testExec
58− -o ${CMAKE_BINARY_DIR}/test${CUSTOM_TARGET_NAME}.xml,xunitxml
53+ -o ${CMAKE_BINARY_DIR}/test${TESTNAME}.xml,xunitxml
59 -o -,txt
54 -o -,txt
60 DEPENDS ${FILENAME}testExec DashViews-qml
55 DEPENDS ${FILENAME}testExec DashViews-qml
61 )
56 )
@@ -63,18 +58,19 @@ macro(add_journal_try_test FILENAME)
63 add_executable(${FILENAME}tryExec
58 add_executable(${FILENAME}tryExec
64 ${FILENAME}try.cpp
59 ${FILENAME}try.cpp
65 ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/${FILENAME}.cpp
60 ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/${FILENAME}.cpp
66− ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/abstractjournal.cpp
61+ ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/abstractdashview.cpp
67 )
62 )
68 qt5_use_modules(${FILENAME}tryExec Test Core Qml)
63 qt5_use_modules(${FILENAME}tryExec Test Core Qml)
69 target_link_libraries(${FILENAME}tryExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
64 target_link_libraries(${FILENAME}tryExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
70− add_custom_target(try${CUSTOM_TARGET_NAME}
65+ add_custom_target(try${TESTNAME}
71 ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}tryExec
66 ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}tryExec
72 DEPENDS ${FILENAME}tryExec DashViews-qml
67 DEPENDS ${FILENAME}tryExec DashViews-qml
73 )
68 )
74endmacro()
69endmacro()
75
70
76−add_journal_try_test(verticaljournal)
71+add_dashview_try_test(verticaljournal VerticalJournal)
77−add_journal_try_test(horizontaljournal)
72+add_dashview_try_test(horizontaljournal HorizontalJournal)
73+add_dashview_try_test(organicgrid OrganicGrid)
78
74
79set(qmltest_DEFAULT_NO_ADD_TEST TRUE)
75set(qmltest_DEFAULT_NO_ADD_TEST TRUE)
80add_qml_test(. listviewwithpageheaderqml IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
76add_qml_test(. listviewwithpageheaderqml IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
@@ -83,5 +79,6 @@ add_dependencies(qmluitests testlistviewwithpageheader)
83add_dependencies(qmluitests testlistviewwithpageheadersection)
79add_dependencies(qmluitests testlistviewwithpageheadersection)
84add_dependencies(qmluitests testlistviewwithpageheadersectionexternalmodel)
80add_dependencies(qmluitests testlistviewwithpageheadersectionexternalmodel)
85add_dependencies(qmluitests testlistviewwithpageheaderqml)
81add_dependencies(qmluitests testlistviewwithpageheaderqml)
86−add_dependencies(qmluitests testVerticaljournal)
82+add_dependencies(qmluitests testVerticalJournal)
87−add_dependencies(qmluitests testHorizontaljournal)
83+add_dependencies(qmluitests testHorizontalJournal)
84+add_dependencies(qmluitests testOrganicGrid)
tests/plugins/DashViews/horizontaljournaltest.cpp+35−9
@@ -126,9 +126,9 @@ private Q_SLOTS:
126 view->engine()->addImportPath(BUILT_PLUGINS_DIR);
126 view->engine()->addImportPath(BUILT_PLUGINS_DIR);
127
127
128 model = new WidthModel();
128 model = new WidthModel();
129− QStringList heightList;
129+ QStringList widthList;
130− heightList << "100" << "50" << "125" << "10" << "40" << "70" << "200" << "110" << "160" << "20" << "20" << "65" << "80" << "200" << "300" << "130" << "400" << "300" << "500" << "10";
130+ widthList << "100" << "50" << "125" << "10" << "40" << "70" << "200" << "110" << "160" << "20" << "20" << "65" << "80" << "200" << "300" << "130" << "400" << "300" << "500" << "10";
131− model->setStringList(heightList);
131+ model->setStringList(widthList);
132
132
133 view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/horizontaljournaltest.qml"));
133 view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/horizontaljournaltest.qml"));
134
134
@@ -336,9 +336,9 @@ private Q_SLOTS:
336
336
337 void testModelReset()
337 void testModelReset()
338 {
338 {
339− QStringList heightList;
339+ QStringList widthList;
340− heightList << "100" << "50" << "125" << "25" << "50" << "50";
340+ widthList << "100" << "50" << "125" << "25" << "50" << "50";
341− model->setStringList(heightList);
341+ model->setStringList(widthList);
342
342
343 QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
343 QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
344 QTRY_COMPARE(hj->m_visibleItems.count(), 6);
344 QTRY_COMPARE(hj->m_visibleItems.count(), 6);
@@ -386,9 +386,9 @@ private Q_SLOTS:
386 void testModelAppendRemoveLast()
386 void testModelAppendRemoveLast()
387 {
387 {
388 WidthModel *model2 = new WidthModel();
388 WidthModel *model2 = new WidthModel();
389− QStringList heightList;
389+ QStringList widthList;
390− heightList << "100" << "50" << "125" << "25" << "50" << "50";
390+ widthList << "100" << "50" << "125" << "25" << "50" << "50";
391− model2->setStringList(heightList);
391+ model2->setStringList(widthList);
392 hj->setModel(model2);
392 hj->setModel(model2);
393 delete model;
393 delete model;
394 model = model2;
394 model = model2;
@@ -454,6 +454,32 @@ private Q_SLOTS:
454 QCOMPARE(hj->implicitHeight(), 310.);
454 QCOMPARE(hj->implicitHeight(), 310.);
455 }
455 }
456
456
457+ void testNegativeHeight()
458+ {
459+ QQuickItemPrivate::get(hj)->anchors()->resetFill();
460+ hj->setHeight(-8);
461+
462+ QStringList widthList;
463+ widthList << "100" << "50" << "125" << "25" << "50" << "50";
464+ model->setStringList(widthList);
465+
466+ QTRY_COMPARE(hj->m_visibleItems.count(), 0);
467+ QTRY_COMPARE(hj->implicitHeight(), 0.);
468+ }
469+
470+ void testNegativeDelegateCreationRange()
471+ {
472+ hj->setDelegateCreationBegin(0);
473+ hj->setDelegateCreationEnd(-100);
474+
475+ QStringList widthList;
476+ widthList << "100" << "50" << "50" << "30";
477+ model->setStringList(widthList);
478+
479+ QTRY_COMPARE(hj->m_visibleItems.count(), 0);
480+ QTRY_COMPARE(hj->implicitHeight(), 0.);
481+ }
482+
457private:
483private:
458 QQuickView *view;
484 QQuickView *view;
459 HorizontalJournal *hj;
485 HorizontalJournal *hj;
tests/plugins/DashViews/organicgridtest.cppnew file+531
@@ -0,0 +1,531 @@
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+#include <QQuickView>
18+#include <QtTestGui>
19+#include <QDebug>
20+#include <QGuiApplication>
21+#include <QQuickView>
22+#include <QtQml/qqml.h>
23+#include <QStringListModel>
24+#include <QQmlContext>
25+#include <QQmlEngine>
26+#pragma GCC diagnostic push
27+#pragma GCC diagnostic ignored "-pedantic"
28+#include <private/qquickitem_p.h>
29+#pragma GCC diagnostic pop
30+
31+#include "organicgrid.h"
32+
33+class DummyModel : public QAbstractListModel {
34+public:
35+ DummyModel() : m_count(0) {}
36+
37+ int rowCount(const QModelIndex & /*parent*/) const
38+ {
39+ return m_count;
40+ }
41+
42+ QVariant data(const QModelIndex & /*index*/, int /*role*/) const
43+ {
44+ return QVariant();
45+ }
46+
47+ void setCount(int count)
48+ {
49+ beginResetModel();
50+ m_count = count;
51+ endResetModel();
52+ }
53+
54+ void addItem()
55+ {
56+ beginInsertRows(QModelIndex(), m_count, m_count);
57+ m_count++;
58+ endInsertRows();
59+ }
60+
61+ void removeLast()
62+ {
63+ beginRemoveRows(QModelIndex(), m_count - 1, m_count - 1);
64+ m_count--;
65+ endRemoveRows();
66+ }
67+
68+private:
69+ int m_count;
70+};
71+
72+class OrganicGridTest : public QObject
73+{
74+ Q_OBJECT
75+
76+private:
77+ void verifyItem(const QQuickItem *item, int modelIndex, qreal x, qreal y, bool visible)
78+ {
79+ QTRY_COMPARE(item->x(), x);
80+ QTRY_COMPARE(item->y(), y);
81+ QTRY_COMPARE(QQuickItemPrivate::get(item)->culled, !visible);
82+ const int inModuleIndex = modelIndex % 6;
83+ if (inModuleIndex == 0 || inModuleIndex == 1 || inModuleIndex == 3 || inModuleIndex == 5) {
84+ QTRY_COMPARE(item->height(), grid->smallDelegateSize().height());
85+ QTRY_COMPARE(item->width(), grid->smallDelegateSize().width());
86+ } else {
87+ QTRY_COMPARE(item->height(), grid->bigDelegateSize().height());
88+ QTRY_COMPARE(item->width(), grid->bigDelegateSize().width());
89+ }
90+ }
91+
92+ void checkInitialPositions()
93+ {
94+ QTRY_COMPARE(grid->m_visibleItems.count(), 18);
95+ QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
96+ QTRY_COMPARE(grid->m_numberOfModulesPerRow, 1);
97+ verifyItem(grid->m_visibleItems[ 0], 0, 0, 0, true);
98+ verifyItem(grid->m_visibleItems[ 1], 1, 100, 0, true);
99+ verifyItem(grid->m_visibleItems[ 2], 2, 0, 100, true);
100+ verifyItem(grid->m_visibleItems[ 3], 3, 190, 190, true);
101+ verifyItem(grid->m_visibleItems[ 4], 4, 200, 0, true);
102+ verifyItem(grid->m_visibleItems[ 5], 5, 290, 190, true);
103+ verifyItem(grid->m_visibleItems[ 6], 6, 0, 290, true);
104+ verifyItem(grid->m_visibleItems[ 7], 7, 100, 290, true);
105+ verifyItem(grid->m_visibleItems[ 8], 8, 0, 390, true);
106+ verifyItem(grid->m_visibleItems[ 9], 9, 190, 480, false);
107+ verifyItem(grid->m_visibleItems[10], 10, 200, 290, true);
108+ verifyItem(grid->m_visibleItems[11], 11, 290, 480, false);
109+ verifyItem(grid->m_visibleItems[12], 12, 0, 580, false);
110+ verifyItem(grid->m_visibleItems[13], 13, 100, 580, false);
111+ verifyItem(grid->m_visibleItems[14], 14, 0, 680, false);
112+ verifyItem(grid->m_visibleItems[15], 15, 190, 770, false);
113+ verifyItem(grid->m_visibleItems[16], 16, 200, 580, false);
114+ verifyItem(grid->m_visibleItems[17], 17, 290, 770, false);
115+ checkImplicitHeight(1150);
116+ }
117+
118+ void checkImplicitHeight(qreal implicitHeight)
119+ {
120+ QTRY_COMPARE(grid->m_implicitHeightDirty, false);
121+ QCOMPARE(grid->implicitHeight(), implicitHeight);
122+ }
123+
124+private Q_SLOTS:
125+ void init()
126+ {
127+ view = new QQuickView();
128+ view->setResizeMode(QQuickView::SizeRootObjectToView);
129+ view->engine()->addImportPath(BUILT_PLUGINS_DIR);
130+
131+ model = new DummyModel();
132+ model->setCount(21);
133+
134+ view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/organicgridtest.qml"));
135+
136+ view->show();
137+ view->resize(470, 400);
138+ QTest::qWaitForWindowExposed(view);
139+
140+ grid = dynamic_cast<OrganicGrid*>(view->rootObject()->findChild<QObject*>("grid"));
141+ grid->setModel(model);
142+
143+ checkInitialPositions();
144+ }
145+
146+ void cleanup()
147+ {
148+ delete view;
149+ delete model;
150+ }
151+
152+ void testInitialPosition()
153+ {
154+ }
155+
156+ void testWidthResize()
157+ {
158+ view->resize(770, 400);
159+ QTRY_COMPARE(grid->width(), 770.);
160+
161+ QTRY_COMPARE(grid->m_visibleItems.count(), 21);
162+ QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
163+ QTRY_COMPARE(grid->m_numberOfModulesPerRow, 2);
164+ verifyItem(grid->m_visibleItems[ 0], 0, 0, 0, true);
165+ verifyItem(grid->m_visibleItems[ 1], 1, 100, 0, true);
166+ verifyItem(grid->m_visibleItems[ 2], 2, 0, 100, true);
167+ verifyItem(grid->m_visibleItems[ 3], 3, 190, 190, true);
168+ verifyItem(grid->m_visibleItems[ 4], 4, 200, 0, true);
169+ verifyItem(grid->m_visibleItems[ 5], 5, 290, 190, true);
170+
171+ verifyItem(grid->m_visibleItems[ 6], 6, 390, 0, true);
172+ verifyItem(grid->m_visibleItems[ 7], 7, 490, 0, true);
173+ verifyItem(grid->m_visibleItems[ 8], 8, 390, 100, true);
174+ verifyItem(grid->m_visibleItems[ 9], 9, 580, 190, true);
175+ verifyItem(grid->m_visibleItems[10], 10, 590, 0, true);
176+ verifyItem(grid->m_visibleItems[11], 11, 680, 190, true);
177+
178+ verifyItem(grid->m_visibleItems[12], 12, 0, 290, true);
179+ verifyItem(grid->m_visibleItems[13], 13, 100, 290, true);
180+ verifyItem(grid->m_visibleItems[14], 14, 0, 390, true);
181+ verifyItem(grid->m_visibleItems[15], 15, 190, 480, false);
182+ verifyItem(grid->m_visibleItems[16], 16, 200, 290, true);
183+ verifyItem(grid->m_visibleItems[17], 17, 290, 480, false);
184+
185+ verifyItem(grid->m_visibleItems[18], 18, 390, 290, true);
186+ verifyItem(grid->m_visibleItems[19], 19, 490, 290, true);
187+ verifyItem(grid->m_visibleItems[20], 20, 390, 390, true);
188+
189+ checkImplicitHeight(570);
190+
191+ view->resize(769, 400);
192+
193+ // This is exactly the same block as the first again
194+ checkInitialPositions();
195+ }
196+
197+ void testColumnSpacing()
198+ {
199+ grid->setColumnSpacing(11);
200+
201+ QTRY_COMPARE(grid->m_needsRelayout, false);
202+ QTRY_COMPARE(grid->m_visibleItems.count(), 18);
203+ QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
204+ QTRY_COMPARE(grid->m_numberOfModulesPerRow, 1);
205+ verifyItem(grid->m_visibleItems[ 0], 0, 0, 0, true);
206+ verifyItem(grid->m_visibleItems[ 1], 1, 101, 0, true);
207+ verifyItem(grid->m_visibleItems[ 2], 2, 0, 100, true);
208+ verifyItem(grid->m_visibleItems[ 3], 3, 191, 190, true);
209+ verifyItem(grid->m_visibleItems[ 4], 4, 202, 0, true);
210+ verifyItem(grid->m_visibleItems[ 5], 5, 292, 190, true);
211+ verifyItem(grid->m_visibleItems[ 6], 6, 0, 290, true);
212+ verifyItem(grid->m_visibleItems[ 7], 7, 101, 290, true);
213+ verifyItem(grid->m_visibleItems[ 8], 8, 0, 390, true);
214+ verifyItem(grid->m_visibleItems[ 9], 9, 191, 480, false);
215+ verifyItem(grid->m_visibleItems[10], 10, 202, 290, true);
216+ verifyItem(grid->m_visibleItems[11], 11, 292, 480, false);
217+ verifyItem(grid->m_visibleItems[12], 12, 0, 580, false);
218+ verifyItem(grid->m_visibleItems[13], 13, 101, 580, false);
219+ verifyItem(grid->m_visibleItems[14], 14, 0, 680, false);
220+ verifyItem(grid->m_visibleItems[15], 15, 191, 770, false);
221+ verifyItem(grid->m_visibleItems[16], 16, 202, 580, false);
222+ verifyItem(grid->m_visibleItems[17], 17, 292, 770, false);
223+ checkImplicitHeight(1150);
224+
225+ grid->setColumnSpacing(10);
226+ QTRY_COMPARE(grid->m_needsRelayout, false);
227+
228+ // This is exactly the same block as the first again
229+ checkInitialPositions();
230+ }
231+
232+ void testRowSpacing()
233+ {
234+ grid->setRowSpacing(11);
235+
236+ QTRY_COMPARE(grid->m_needsRelayout, false);
237+ QTRY_COMPARE(grid->m_visibleItems.count(), 18);
238+ QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
239+ QTRY_COMPARE(grid->m_numberOfModulesPerRow, 1);
240+ verifyItem(grid->m_visibleItems[ 0], 0, 0, 0, true);
241+ verifyItem(grid->m_visibleItems[ 1], 1, 100, 0, true);
242+ verifyItem(grid->m_visibleItems[ 2], 2, 0, 101, true);
243+ verifyItem(grid->m_visibleItems[ 3], 3, 190, 191, true);
244+ verifyItem(grid->m_visibleItems[ 4], 4, 200, 0, true);
245+ verifyItem(grid->m_visibleItems[ 5], 5, 290, 191, true);
246+ verifyItem(grid->m_visibleItems[ 6], 6, 0, 292, true);
247+ verifyItem(grid->m_visibleItems[ 7], 7, 100, 292, true);
248+ verifyItem(grid->m_visibleItems[ 8], 8, 0, 393, true);
249+ verifyItem(grid->m_visibleItems[ 9], 9, 190, 483, false);
250+ verifyItem(grid->m_visibleItems[10], 10, 200, 292, true);
251+ verifyItem(grid->m_visibleItems[11], 11, 290, 483, false);
252+ verifyItem(grid->m_visibleItems[12], 12, 0, 584, false);
253+ verifyItem(grid->m_visibleItems[13], 13, 100, 584, false);
254+ verifyItem(grid->m_visibleItems[14], 14, 0, 685, false);
255+ verifyItem(grid->m_visibleItems[15], 15, 190, 775, false);
256+ verifyItem(grid->m_visibleItems[16], 16, 200, 584, false);
257+ verifyItem(grid->m_visibleItems[17], 17, 290, 775, false);
258+ checkImplicitHeight(1157);
259+
260+ grid->setRowSpacing(10);
261+ QTRY_COMPARE(grid->m_needsRelayout, false);
262+
263+ // This is exactly the same block as the first again
264+ checkInitialPositions();
265+ }
266+
267+ void testDelegateSizeChange()
268+ {
269+ grid->setSmallDelegateSize(QSizeF(30, 30));
270+ grid->setBigDelegateSize(QSizeF(50, 50));
271+ QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
272+ QTRY_COMPARE(grid->m_visibleItems.count(), 21);
273+ verifyItem(grid->m_visibleItems[ 0], 0, 0, 0, true);
274+ verifyItem(grid->m_visibleItems[ 1], 1, 40, 0, true);
275+ verifyItem(grid->m_visibleItems[ 2], 2, 0, 40, true);
276+ verifyItem(grid->m_visibleItems[ 3], 3, 60, 60, true);
277+ verifyItem(grid->m_visibleItems[ 4], 4, 80, 0, true);
278+ verifyItem(grid->m_visibleItems[ 5], 5, 100, 60, true);
279+
280+ verifyItem(grid->m_visibleItems[ 6], 6, 140, 0, true);
281+ verifyItem(grid->m_visibleItems[ 7], 7, 180, 0, true);
282+ verifyItem(grid->m_visibleItems[ 8], 8, 140, 40, true);
283+ verifyItem(grid->m_visibleItems[ 9], 9, 200, 60, true);
284+ verifyItem(grid->m_visibleItems[10], 10, 220, 0, true);
285+ verifyItem(grid->m_visibleItems[11], 11, 240, 60, true);
286+
287+ verifyItem(grid->m_visibleItems[12], 12, 280, 0, true);
288+ verifyItem(grid->m_visibleItems[13], 13, 320, 0, true);
289+ verifyItem(grid->m_visibleItems[14], 14, 280, 40, true);
290+ verifyItem(grid->m_visibleItems[15], 15, 340, 60, true);
291+ verifyItem(grid->m_visibleItems[16], 16, 360, 0, true);
292+ verifyItem(grid->m_visibleItems[17], 17, 380, 60, true);
293+
294+ verifyItem(grid->m_visibleItems[18], 18, 0, 100, true);
295+ verifyItem(grid->m_visibleItems[19], 19, 40, 100, true);
296+ verifyItem(grid->m_visibleItems[20], 20, 0, 140, true);
297+ checkImplicitHeight(190);
298+
299+ grid->setSmallDelegateSize(QSizeF(90, 90));
300+ grid->setBigDelegateSize(QSizeF(180, 180));
301+
302+ // This is exactly the same block as the first again
303+ checkInitialPositions();
304+ }
305+
306+ void testChangeModel()
307+ {
308+ DummyModel *model2 = new DummyModel();
309+ model2->setCount(6);
310+ grid->setModel(model2);
311+ delete model;
312+ model = model2;
313+
314+ QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
315+ QTRY_COMPARE(grid->m_visibleItems.count(), 6);
316+ verifyItem(grid->m_visibleItems[ 0], 0, 0, 0, true);
317+ verifyItem(grid->m_visibleItems[ 1], 1, 100, 0, true);
318+ verifyItem(grid->m_visibleItems[ 2], 2, 0, 100, true);
319+ verifyItem(grid->m_visibleItems[ 3], 3, 190, 190, true);
320+ verifyItem(grid->m_visibleItems[ 4], 4, 200, 0, true);
321+ verifyItem(grid->m_visibleItems[ 5], 5, 290, 190, true);
322+ checkImplicitHeight(280);
323+ }
324+
325+ void testModelReset()
326+ {
327+ model->setCount(6);
328+
329+ QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
330+ QTRY_COMPARE(grid->m_visibleItems.count(), 6);
331+ verifyItem(grid->m_visibleItems[ 0], 0, 0, 0, true);
332+ verifyItem(grid->m_visibleItems[ 1], 1, 100, 0, true);
333+ verifyItem(grid->m_visibleItems[ 2], 2, 0, 100, true);
334+ verifyItem(grid->m_visibleItems[ 3], 3, 190, 190, true);
335+ verifyItem(grid->m_visibleItems[ 4], 4, 200, 0, true);
336+ verifyItem(grid->m_visibleItems[ 5], 5, 290, 190, true);
337+ checkImplicitHeight(280);
338+ }
339+
340+ void testModelRemoveLastNonVisible()
341+ {
342+ model->removeLast();
343+
344+ // This is the same than checkInitialPositions but
345+ // with a different implicitHeight since there's an item less
346+ // in the model
347+ QTRY_COMPARE(grid->m_visibleItems.count(), 18);
348+ QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
349+ QTRY_COMPARE(grid->m_numberOfModulesPerRow, 1);
350+ verifyItem(grid->m_visibleItems[ 0], 0, 0, 0, true);
351+ verifyItem(grid->m_visibleItems[ 1], 1, 100, 0, true);
352+ verifyItem(grid->m_visibleItems[ 2], 2, 0, 100, true);
353+ verifyItem(grid->m_visibleItems[ 3], 3, 190, 190, true);
354+ verifyItem(grid->m_visibleItems[ 4], 4, 200, 0, true);
355+ verifyItem(grid->m_visibleItems[ 5], 5, 290, 190, true);
356+ verifyItem(grid->m_visibleItems[ 6], 6, 0, 290, true);
357+ verifyItem(grid->m_visibleItems[ 7], 7, 100, 290, true);
358+ verifyItem(grid->m_visibleItems[ 8], 8, 0, 390, true);
359+ verifyItem(grid->m_visibleItems[ 9], 9, 190, 480, false);
360+ verifyItem(grid->m_visibleItems[10], 10, 200, 290, true);
361+ verifyItem(grid->m_visibleItems[11], 11, 290, 480, false);
362+ verifyItem(grid->m_visibleItems[12], 12, 0, 580, false);
363+ verifyItem(grid->m_visibleItems[13], 13, 100, 580, false);
364+ verifyItem(grid->m_visibleItems[14], 14, 0, 680, false);
365+ verifyItem(grid->m_visibleItems[15], 15, 190, 770, false);
366+ verifyItem(grid->m_visibleItems[16], 16, 200, 580, false);
367+ verifyItem(grid->m_visibleItems[17], 17, 290, 770, false);
368+ checkImplicitHeight(960);
369+
370+ model->removeLast();
371+
372+ // Removing this one didn't cause any change since it only
373+ // was the second item of a non visible 6-module
374+ QTRY_COMPARE(grid->m_visibleItems.count(), 18);
375+ QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
376+ QTRY_COMPARE(grid->m_numberOfModulesPerRow, 1);
377+ verifyItem(grid->m_visibleItems[ 0], 0, 0, 0, true);
378+ verifyItem(grid->m_visibleItems[ 1], 1, 100, 0, true);
379+ verifyItem(grid->m_visibleItems[ 2], 2, 0, 100, true);
380+ verifyItem(grid->m_visibleItems[ 3], 3, 190, 190, true);
381+ verifyItem(grid->m_visibleItems[ 4], 4, 200, 0, true);
382+ verifyItem(grid->m_visibleItems[ 5], 5, 290, 190, true);
383+ verifyItem(grid->m_visibleItems[ 6], 6, 0, 290, true);
384+ verifyItem(grid->m_visibleItems[ 7], 7, 100, 290, true);
385+ verifyItem(grid->m_visibleItems[ 8], 8, 0, 390, true);
386+ verifyItem(grid->m_visibleItems[ 9], 9, 190, 480, false);
387+ verifyItem(grid->m_visibleItems[10], 10, 200, 290, true);
388+ verifyItem(grid->m_visibleItems[11], 11, 290, 480, false);
389+ verifyItem(grid->m_visibleItems[12], 12, 0, 580, false);
390+ verifyItem(grid->m_visibleItems[13], 13, 100, 580, false);
391+ verifyItem(grid->m_visibleItems[14], 14, 0, 680, false);
392+ verifyItem(grid->m_visibleItems[15], 15, 190, 770, false);
393+ verifyItem(grid->m_visibleItems[16], 16, 200, 580, false);
394+ verifyItem(grid->m_visibleItems[17], 17, 290, 770, false);
395+ checkImplicitHeight(960);
396+
397+ model->removeLast();
398+
399+ // Removing this one removes the first of a 6-module so
400+ // it does change height again
401+ QTRY_COMPARE(grid->m_visibleItems.count(), 18);
402+ QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
403+ QTRY_COMPARE(grid->m_numberOfModulesPerRow, 1);
404+ verifyItem(grid->m_visibleItems[ 0], 0, 0, 0, true);
405+ verifyItem(grid->m_visibleItems[ 1], 1, 100, 0, true);
406+ verifyItem(grid->m_visibleItems[ 2], 2, 0, 100, true);
407+ verifyItem(grid->m_visibleItems[ 3], 3, 190, 190, true);
408+ verifyItem(grid->m_visibleItems[ 4], 4, 200, 0, true);
409+ verifyItem(grid->m_visibleItems[ 5], 5, 290, 190, true);
410+ verifyItem(grid->m_visibleItems[ 6], 6, 0, 290, true);
411+ verifyItem(grid->m_visibleItems[ 7], 7, 100, 290, true);
412+ verifyItem(grid->m_visibleItems[ 8], 8, 0, 390, true);
413+ verifyItem(grid->m_visibleItems[ 9], 9, 190, 480, false);
414+ verifyItem(grid->m_visibleItems[10], 10, 200, 290, true);
415+ verifyItem(grid->m_visibleItems[11], 11, 290, 480, false);
416+ verifyItem(grid->m_visibleItems[12], 12, 0, 580, false);
417+ verifyItem(grid->m_visibleItems[13], 13, 100, 580, false);
418+ verifyItem(grid->m_visibleItems[14], 14, 0, 680, false);
419+ verifyItem(grid->m_visibleItems[15], 15, 190, 770, false);
420+ verifyItem(grid->m_visibleItems[16], 16, 200, 580, false);
421+ verifyItem(grid->m_visibleItems[17], 17, 290, 770, false);
422+ checkImplicitHeight(860);
423+
424+ }
425+
426+ void testModelAppendRemoveLast()
427+ {
428+ DummyModel *model2 = new DummyModel();
429+ model2->setCount(6);
430+ grid->setModel(model2);
431+ delete model;
432+ model = model2;
433+
434+ QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
435+ QTRY_COMPARE(grid->m_visibleItems.count(), 6);
436+ verifyItem(grid->m_visibleItems[0], 0, 0, 0, true);
437+ verifyItem(grid->m_visibleItems[1], 1, 100, 0, true);
438+ verifyItem(grid->m_visibleItems[2], 2, 0, 100, true);
439+ verifyItem(grid->m_visibleItems[3], 3, 190, 190, true);
440+ verifyItem(grid->m_visibleItems[4], 4, 200, 0, true);
441+ verifyItem(grid->m_visibleItems[5], 5, 290, 190, true);
442+ checkImplicitHeight(280);
443+
444+ model2->addItem();
445+
446+ QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
447+ QTRY_COMPARE(grid->m_visibleItems.count(), 7);
448+ verifyItem(grid->m_visibleItems[0], 0, 0, 0, true);
449+ verifyItem(grid->m_visibleItems[1], 1, 100, 0, true);
450+ verifyItem(grid->m_visibleItems[2], 2, 0, 100, true);
451+ verifyItem(grid->m_visibleItems[3], 3, 190, 190, true);
452+ verifyItem(grid->m_visibleItems[4], 4, 200, 0, true);
453+ verifyItem(grid->m_visibleItems[5], 5, 290, 190, true);
454+ verifyItem(grid->m_visibleItems[6], 6, 0, 290, true);
455+ checkImplicitHeight(380);
456+
457+ model2->addItem();
458+ model2->addItem();
459+
460+ QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
461+ QTRY_COMPARE(grid->m_visibleItems.count(), 9);
462+ verifyItem(grid->m_visibleItems[0], 0, 0, 0, true);
463+ verifyItem(grid->m_visibleItems[1], 1, 100, 0, true);
464+ verifyItem(grid->m_visibleItems[2], 2, 0, 100, true);
465+ verifyItem(grid->m_visibleItems[3], 3, 190, 190, true);
466+ verifyItem(grid->m_visibleItems[4], 4, 200, 0, true);
467+ verifyItem(grid->m_visibleItems[5], 5, 290, 190, true);
468+ verifyItem(grid->m_visibleItems[6], 6, 0, 290, true);
469+ verifyItem(grid->m_visibleItems[7], 7, 100, 290, true);
470+ verifyItem(grid->m_visibleItems[8], 8, 0, 390, true);
471+ checkImplicitHeight(570);
472+
473+ model2->removeLast();
474+
475+ QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
476+ QTRY_COMPARE(grid->m_visibleItems.count(), 8);
477+ verifyItem(grid->m_visibleItems[0], 0, 0, 0, true);
478+ verifyItem(grid->m_visibleItems[1], 1, 100, 0, true);
479+ verifyItem(grid->m_visibleItems[2], 2, 0, 100, true);
480+ verifyItem(grid->m_visibleItems[3], 3, 190, 190, true);
481+ verifyItem(grid->m_visibleItems[4], 4, 200, 0, true);
482+ verifyItem(grid->m_visibleItems[5], 5, 290, 190, true);
483+ verifyItem(grid->m_visibleItems[6], 6, 0, 290, true);
484+ verifyItem(grid->m_visibleItems[7], 7, 100, 290, true);
485+ checkImplicitHeight(380);
486+ }
487+
488+ void testDelegateCreationRanges()
489+ {
490+ grid->setSmallDelegateSize(QSizeF(30, 30));
491+ grid->setBigDelegateSize(QSizeF(50, 50));
492+ model->setCount(400);
493+ checkImplicitHeight(2290);
494+
495+ view->resize(470, 700);
496+ QTRY_COMPARE(grid->height(), 700.);
497+ checkImplicitHeight(2290);
498+ QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
499+ QTRY_COMPARE(grid->m_visibleItems.count(), 198);
500+
501+ grid->setDelegateCreationBegin(300);
502+ grid->setDelegateCreationEnd(400);
503+ checkImplicitHeight(2290);
504+
505+ QTRY_COMPARE(grid->m_firstVisibleIndex, 36);
506+ QTRY_COMPARE(grid->m_visibleItems.count(), 54);
507+ checkImplicitHeight(2290);
508+
509+ grid->resetDelegateCreationBegin();
510+ grid->resetDelegateCreationEnd();
511+
512+ view->resize(470, 470);
513+
514+ grid->setSmallDelegateSize(QSizeF(90, 90));
515+ grid->setBigDelegateSize(QSizeF(180, 180));
516+
517+ model->setCount(21);
518+
519+ // This is exactly the same block as the first again
520+ checkInitialPositions();
521+ }
522+
523+private:
524+ QQuickView *view;
525+ OrganicGrid *grid;
526+ DummyModel *model;
527+};
528+
529+QTEST_MAIN(OrganicGridTest)
530+
531+#include "organicgridtest.moc"
tests/plugins/DashViews/organicgridtest.qmlnew file+43
@@ -0,0 +1,43 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.1
18+import DashViews 0.1
19+
20+Item {
21+
22+ OrganicGrid {
23+ id: vj
24+ objectName: "grid"
25+ anchors.fill: parent
26+ columnSpacing: 10
27+ rowSpacing: 10
28+ smallDelegateSize: Qt.size(90, 90)
29+ bigDelegateSize: Qt.size(180, 180)
30+
31+ delegate: Rectangle {
32+ property real randomValue: Math.random()
33+ color: randomValue < 0.3 ? "green" : randomValue < 0.6 ? "blue" : "red";
34+ border.width: 3
35+
36+ Text {
37+ text: index
38+ x: 10
39+ y: 10
40+ }
41+ }
42+ }
43+}
tests/plugins/DashViews/organicgridtry.cppnew file+98
@@ -0,0 +1,98 @@
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+#include <QQuickView>
18+#include <QDebug>
19+#include <QGuiApplication>
20+#include <QQuickView>
21+#include <QtQml/qqml.h>
22+#include <QStringListModel>
23+#include <QQmlContext>
24+#include <QQmlEngine>
25+#include <QGuiApplication>
26+
27+#include "verticaljournal.h"
28+
29+class DummyModel : public QAbstractListModel {
30+ Q_OBJECT
31+public:
32+ DummyModel() : m_count(0) {}
33+
34+ int rowCount(const QModelIndex & /*parent*/) const
35+ {
36+ return m_count;
37+ }
38+
39+ QVariant data(const QModelIndex & /*index*/, int /*role*/) const
40+ {
41+ return QVariant();
42+ }
43+
44+ void setCount(int count)
45+ {
46+ beginResetModel();
47+ m_count = count;
48+ endResetModel();
49+ }
50+
51+public slots:
52+ void addItem()
53+ {
54+ beginInsertRows(QModelIndex(), m_count, m_count);
55+ m_count++;
56+ endInsertRows();
57+ }
58+
59+ void removeLast()
60+ {
61+ beginRemoveRows(QModelIndex(), m_count - 1, m_count - 1);
62+ m_count--;
63+ endRemoveRows();
64+ }
65+
66+private:
67+ int m_count;
68+};
69+
70+int main(int argc, char *argv[])
71+{
72+ QGuiApplication a(argc, argv);
73+
74+ QQuickView *view = new QQuickView();
75+ view->setResizeMode(QQuickView::SizeRootObjectToView);
76+ view->engine()->addImportPath(BUILT_PLUGINS_DIR);
77+
78+ DummyModel model;
79+ model.setCount(3);
80+
81+ QStringListModel listModel;
82+ listModel.setStringList(QStringList() << QString());
83+
84+ view->rootContext()->setContextProperty("listModel", &listModel);
85+ view->rootContext()->setContextProperty("gridModel", &model);
86+
87+ view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/organicgridtry.qml"));
88+
89+ view->show();
90+ view->resize(530, 400);
91+
92+ QObject::connect(view->rootObject(), SIGNAL(add()), &model, SLOT(addItem()));
93+ QObject::connect(view->rootObject(), SIGNAL(remove()), &model, SLOT(removeLast()));
94+
95+ return a.exec();
96+}
97+
98+#include "organicgridtry.moc"
tests/plugins/DashViews/organicgridtry.qmlnew file+94
@@ -0,0 +1,94 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.1
18+import DashViews 0.1
19+
20+Item {
21+ id: root
22+ signal add()
23+ signal remove()
24+
25+ ListViewWithPageHeader {
26+ id: lvwph
27+ model: listModel
28+ height: parent.height
29+ width: parent.width - controls.width
30+
31+ delegate: OrganicGrid {
32+ id: grid
33+ model: gridModel
34+ smallDelegateSize: Qt.size(90, 90)
35+ bigDelegateSize: Qt.size(180, 180)
36+ columnSpacing: 10
37+ rowSpacing: 10
38+ width: parent.width
39+ height: implicitHeight > 100 ? implicitHeight : 100
40+ delegateCreationBegin: lvwph.contentY
41+ delegateCreationEnd: lvwph.contentY + lvwph.height
42+
43+ delegate: Rectangle {
44+ width: 100
45+ color: "red";
46+ border.width: 3
47+
48+ Text {
49+ text: index
50+ x: 10
51+ y: 10
52+ }
53+ }
54+ }
55+ }
56+
57+ Rectangle {
58+ id: controls
59+ height: parent.height
60+ width: 100
61+ anchors.right: parent.right
62+ color: "gray"
63+ opacity: 0.4
64+
65+ Rectangle {
66+ id: addButton
67+ height: 50
68+ width: parent.width
69+ color: "blue"
70+ Text {
71+ text: "Add"
72+ anchors.centerIn: parent
73+ }
74+ MouseArea {
75+ anchors.fill: parent
76+ onClicked: root.add()
77+ }
78+ }
79+ Rectangle {
80+ anchors.top: addButton.bottom
81+ height: 50
82+ width: parent.width
83+ color: "red"
84+ Text {
85+ text: "Remove"
86+ anchors.centerIn: parent
87+ }
88+ MouseArea {
89+ anchors.fill: parent
90+ onClicked: root.remove()
91+ }
92+ }
93+ }
94+}
tests/plugins/DashViews/verticaljournaltest.cpp+32
@@ -459,6 +459,38 @@ private Q_SLOTS:
459 verifyItem(vj->m_columnVisibleItems[1][2], 7, 160, 120, true);
459 verifyItem(vj->m_columnVisibleItems[1][2], 7, 160, 120, true);
460 }
460 }
461
461
462+ void testNegativeHeight()
463+ {
464+ QQuickItemPrivate::get(vj)->anchors()->resetFill();
465+ vj->setHeight(-8);
466+
467+ QStringList heightList;
468+ heightList << "100" << "50" << "50" << "30";
469+ model->setStringList(heightList);
470+
471+ QTRY_COMPARE(vj->m_columnVisibleItems.count(), 3);
472+ QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 0);
473+ QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 0);
474+ QTRY_COMPARE(vj->m_columnVisibleItems[2].count(), 0);
475+ QTRY_COMPARE(vj->implicitHeight(), 0.);
476+ }
477+
478+ void testNegativeDelegateCreationRange()
479+ {
480+ vj->setDelegateCreationBegin(0);
481+ vj->setDelegateCreationEnd(-100);
482+
483+ QStringList heightList;
484+ heightList << "100" << "50" << "50" << "30";
485+ model->setStringList(heightList);
486+
487+ QTRY_COMPARE(vj->m_columnVisibleItems.count(), 3);
488+ QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 0);
489+ QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 0);
490+ QTRY_COMPARE(vj->m_columnVisibleItems[2].count(), 0);
491+ QTRY_COMPARE(vj->implicitHeight(), 0.);
492+ }
493+
462private:
494private:
463 QQuickView *view;
495 QQuickView *view;
464 VerticalJournal *vj;
496 VerticalJournal *vj;
tests/plugins/LightDM/CMakeLists.txt+1
@@ -13,6 +13,7 @@ include_directories(
13 ${LIBLIGHTDM_INCLUDE_DIRS}
13 ${LIBLIGHTDM_INCLUDE_DIRS}
14 )
14 )
15
15
16+add_dependencies(test-lightdm-dbus MockLightDM-full)
16target_link_libraries(test-lightdm-dbus
17target_link_libraries(test-lightdm-dbus
17 ${LIBLIGHTDM_LDFLAGS}
18 ${LIBLIGHTDM_LDFLAGS}
18 )
19 )
tests/qmltests/CMakeLists.txt+1
@@ -39,6 +39,7 @@ add_qml_test(Components Tile)
39add_qml_test(Components PageHeaderLabel)
39add_qml_test(Components PageHeaderLabel)
40add_qml_test(Dash Card)
40add_qml_test(Dash Card)
41add_qml_test(Dash CardHeader)
41add_qml_test(Dash CardHeader)
42+add_qml_test(Dash CardTool)
42add_qml_test(Dash Dash)
43add_qml_test(Dash Dash)
43add_qml_test(Dash DashContent)
44add_qml_test(Dash DashContent)
44add_qml_test(Dash DashPreview)
45add_qml_test(Dash DashPreview)
tests/qmltests/Components/tst_DragHandle.cpp+65−10
@@ -62,9 +62,13 @@ private Q_SLOTS:
62 void stretch_horizontal();
62 void stretch_horizontal();
63 void stretch_vertical();
63 void stretch_vertical();
64 void hintingAnimation();
64 void hintingAnimation();
65+ void hintingAnimation_dontRestartAfterFinishedAndStillPressed();
66+
65
67
66private:
68private:
67 void flickAndHold(DirectionalDragArea *dragHandle, qreal distance);
69 void flickAndHold(DirectionalDragArea *dragHandle, qreal distance);
70+ void drag(QPointF &touchPoint, const QPointF& direction, qreal distance,
71+ int numSteps, qint64 timeMs = 500);
68 DirectionalDragArea *fetchAndSetupDragHandle(const char *objectName);
72 DirectionalDragArea *fetchAndSetupDragHandle(const char *objectName);
69 qreal fetchDragThreshold(DirectionalDragArea *dragHandle);
73 qreal fetchDragThreshold(DirectionalDragArea *dragHandle);
70 void tryCompare(std::function<qreal ()> actualFunc, qreal expectedValue);
74 void tryCompare(std::function<qreal ()> actualFunc, qreal expectedValue);
@@ -161,25 +165,29 @@ void tst_DragHandle::flickAndHold(DirectionalDragArea *dragHandle,
161 QPointF initialTouchPos = dragHandle->mapToScene(
165 QPointF initialTouchPos = dragHandle->mapToScene(
162 QPointF(dragHandle->width() / 2.0, dragHandle->height() / 2.0));
166 QPointF(dragHandle->width() / 2.0, dragHandle->height() / 2.0));
163 QPointF touchPoint = initialTouchPos;
167 QPointF touchPoint = initialTouchPos;
164− int numSteps = 10;
165− qint64 flickTimeMs = 500;
166− qint64 timeStep = flickTimeMs / numSteps;
167
168
169+ QTest::touchEvent(m_view, m_device).press(0, touchPoint.toPoint());
170+
171+ int numSteps = 10;
168 QPointF dragDirectionVector = calculateDirectionVector(dragHandle);
172 QPointF dragDirectionVector = calculateDirectionVector(dragHandle);
169− QPointF touchMovement = dragDirectionVector * (distance / (qreal)numSteps);
173+ drag(touchPoint, dragDirectionVector, distance, numSteps);
170
174
175+ // Wait for quite a bit before finally releasing to make a very low flick/release
176+ // speed.
177+ m_fakeTimeSource->m_msecsSinceReference += 5000;
171− QTest::touchEvent(m_view, m_device).press(0, touchPoint.toPoint());
178+ QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint());
179+}
172
180
181+void tst_DragHandle::drag(QPointF &touchPoint, const QPointF& direction, qreal distance,
182+ int numSteps, qint64 timeMs)
183+{
184+ qint64 timeStep = timeMs / numSteps;
185+ QPointF touchMovement = direction * (distance / (qreal)numSteps);
173 for (int i = 0; i < numSteps; ++i) {
186 for (int i = 0; i < numSteps; ++i) {
174 touchPoint += touchMovement;
187 touchPoint += touchMovement;
175 m_fakeTimeSource->m_msecsSinceReference += timeStep;
188 m_fakeTimeSource->m_msecsSinceReference += timeStep;
176 QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint());
189 QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint());
177 }
190 }
178−
179− // Wait for quite a bit before finally releasing to make a very low flick/release
180− // speed.
181− m_fakeTimeSource->m_msecsSinceReference += 5000;
182− QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint());
183}
191}
184
192
185DirectionalDragArea *tst_DragHandle::fetchAndSetupDragHandle(const char *objectName)
193DirectionalDragArea *tst_DragHandle::fetchAndSetupDragHandle(const char *objectName)
@@ -389,6 +397,53 @@ void tst_DragHandle::hintingAnimation()
389 QCOMPARE(parentItem->property("shown").toBool(), false);
397 QCOMPARE(parentItem->property("shown").toBool(), false);
390}
398}
391
399
400+/*
401+ Regression test for LP#1269022: https://bugs.launchpad.net/unity8/+bug/1269022
402+
403+ 1) Click on handle.
404+ 2) wait for hint portion to appear
405+ 3) slowly drag handle, only a few pixels
406+
407+ Expected outcome:
408+ Nothing happens
409+
410+ Actual outcome:
411+ Handle will momentarily move back to zero position, then back down to the
412+ hint displacement location.
413+ */
414+void tst_DragHandle::hintingAnimation_dontRestartAfterFinishedAndStillPressed()
415+{
416+ DirectionalDragArea *dragHandle = fetchAndSetupDragHandle("downwardsDragHandle");
417+ QQuickItem *parentItem = dragHandle->parentItem();
418+ qreal hintDisplacement = 100.0;
419+
420+ // enable hinting animations
421+ m_view->rootObject()->setProperty("hintDisplacement", QVariant(hintDisplacement));
422+ m_view->rootObject()->setProperty("stretch", QVariant(true));
423+
424+ QCOMPARE(parentItem->height(), 0.0);
425+
426+ QPointF initialTouchPos = dragHandle->mapToScene(
427+ QPointF(dragHandle->width() / 2.0, dragHandle->height() / 2.0));
428+ QPointF touchPoint = initialTouchPos;
429+
430+ // Pressing causes the Showable to be stretched by hintDisplacement pixels
431+ const int touchId = 0;
432+ QTest::touchEvent(m_view, m_device).press(touchId, touchPoint.toPoint());
433+ tryCompare([&](){ return parentItem->height(); }, hintDisplacement);
434+
435+
436+ QSignalSpy parentHeightChangedSpy(parentItem, SIGNAL(heightChanged()));
437+
438+ drag(touchPoint, QPointF(0.0, -1.0) /*dragDirectionVector*/, 15 /*distance*/, 3 /*numSteps*/);
439+
440+ // Give some time for animations to run, if any
441+ QTest::qWait(300);
442+
443+ // parentItem height shouldn't have changed at all
444+ QVERIFY(parentHeightChangedSpy.isEmpty());
445+}
446+
392QTEST_MAIN(tst_DragHandle)
447QTEST_MAIN(tst_DragHandle)
393
448
394#include "tst_DragHandle.moc"
449#include "tst_DragHandle.moc"
tests/qmltests/Components/tst_FilterGrid.qml+44−5
@@ -20,6 +20,7 @@ import "../../../qml/Components"
20import Ubuntu.Components.ListItems 0.1 as ListItem
20import Ubuntu.Components.ListItems 0.1 as ListItem
21import Ubuntu.Components 0.1
21import Ubuntu.Components 0.1
22import Unity.Test 0.1 as UT
22import Unity.Test 0.1 as UT
23+import Utils 0.1
23
24
24/*
25/*
25 You should see 6 green squares (from "A" to "F") and a button "View all (12)".
26 You should see 6 green squares (from "A" to "F") and a button "View all (12)".
@@ -69,6 +70,20 @@ Rectangle {
69 ListElement { name: "L" }
70 ListElement { name: "L" }
70 }
71 }
71
72
73+ ListModel {
74+ id: fakeModelTwoItems
75+ ListElement { name: "A" }
76+ ListElement { name: "B" }
77+ }
78+
79+ ListModel {
80+ id: fakeModelFourItems
81+ ListElement { name: "A" }
82+ ListElement { name: "B" }
83+ ListElement { name: "C" }
84+ ListElement { name: "D" }
85+ }
86+
72 Rectangle {
87 Rectangle {
73 id: gridRect
88 id: gridRect
74 width: units.gu(30)
89 width: units.gu(30)
@@ -109,15 +124,21 @@ Rectangle {
109 name: "FilterGrid"
124 name: "FilterGrid"
110 when: windowShown
125 when: windowShown
111
126
127+ function init() {
128+ filterGrid.model = fakeModel
129+ }
130+
131+ function cleanup() {
132+ filterCheckBox.checked = true
133+ collapsedRowCountSelector.selectedIndex = 1
134+ }
135+
112 function test_turningFilterOffShowsAllElements() {
136 function test_turningFilterOffShowsAllElements() {
113 tryCompareFunction(countVisibleDelegates, 6)
137 tryCompareFunction(countVisibleDelegates, 6)
114
138
115 filterCheckBox.checked = false
139 filterCheckBox.checked = false
116
140
117 tryCompareFunction(countVisibleDelegates, 12)
141 tryCompareFunction(countVisibleDelegates, 12)
118−
119− // back to initial state
120− filterCheckBox.checked = true
121 }
142 }
122
143
123 function test_collapsedRowCount() {
144 function test_collapsedRowCount() {
@@ -127,9 +148,27 @@ Rectangle {
127 // row count == index + 1
148 // row count == index + 1
128 tryCompareFunction(countVisibleDelegates, 3*(i+1))
149 tryCompareFunction(countVisibleDelegates, 3*(i+1))
129 }
150 }
151+ }
130
152
131− // back to initial state
153+ function test_modelSizeAffectsCollapsedRowCount_data() {
154+ return [
155+ { tag: "2 items, collapsedRows 1", model: fakeModelTwoItems, collapsedRowCountIndex: 0,
156+ rowsWhenCollapsed: 1, visibleDelegates: 2 },
157+ { tag: "2 items, collapsedRows 2", model: fakeModelTwoItems, collapsedRowCountIndex: 1,
158+ rowsWhenCollapsed: 1, visibleDelegates: 2 },
159+ { tag: "4 items, collapsedRows 1", model: fakeModelFourItems, collapsedRowCountIndex: 0,
160+ rowsWhenCollapsed: 1, visibleDelegates: 3 },
161+ { tag: "4 items, collapsedRows 2", model: fakeModelFourItems, collapsedRowCountIndex: 1,
162+ rowsWhenCollapsed: 2, visibleDelegates: 4 },
163+ ]
164+ }
165+
166+ function test_modelSizeAffectsCollapsedRowCount(data) {
167+ filterGrid.model = data.model
132− collapsedRowCountSelector.selectedIndex = 1
168+ collapsedRowCountSelector.selectedIndex = data.collapsedRowCountIndex
169+
170+ tryCompare(filterGrid, "rowsWhenCollapsed", data.rowsWhenCollapsed)
171+ tryCompareFunction(countVisibleDelegates, data.visibleDelegates)
133 }
172 }
134
173
135 function countVisibleDelegates() {
174 function countVisibleDelegates() {
tests/qmltests/Components/tst_ResponsiveGridView.qml+1−1
@@ -152,7 +152,7 @@ Item {
152 var data = new Array()
152 var data = new Array()
153
153
154 data.push({selectedIndex: 0, minHSpacing:0, columnCount: 13})
154 data.push({selectedIndex: 0, minHSpacing:0, columnCount: 13})
155− data.push({selectedIndex: 1, minHSpacing:units.gu(2), columnCount: 9})
155+ data.push({selectedIndex: 1, minHSpacing:units.gu(2), columnCount: 10})
156 data.push({selectedIndex: 2, minHSpacing:units.gu(8), columnCount: 5})
156 data.push({selectedIndex: 2, minHSpacing:units.gu(8), columnCount: 5})
157 data.push({selectedIndex: 3, minHSpacing:units.gu(25), columnCount: 2})
157 data.push({selectedIndex: 3, minHSpacing:units.gu(25), columnCount: 2})
158
158
tests/qmltests/Dash/CardHelpers.js+45
@@ -18,6 +18,51 @@
18
18
19var components = ["title", "art", "subtitle", "mascot", "emblem", "old-price", "price", "alt-price", "rating", "alt-rating", "summary"]
19var components = ["title", "art", "subtitle", "mascot", "emblem", "old-price", "price", "alt-price", "rating", "alt-rating", "summary"]
20
20
21+var defaultLayout = ' \
22+{ \
23+ "schema-version": 1, \
24+ "template": { \
25+ "category-layout": "grid", \
26+ "card-layout": "vertical", \
27+ "card-size": "medium", \
28+ "overlay-mode": null, \
29+ "collapsed-rows": 2 \
30+ }, \
31+ "components": { \
32+ "title": null, \
33+ "art": { \
34+ "aspect-ratio": 1.0, \
35+ "fill-mode": "crop" \
36+ }, \
37+ "subtitle": null, \
38+ "mascot": null, \
39+ "emblem": null, \
40+ "old-price": null, \
41+ "price": null, \
42+ "alt-price": null, \
43+ "rating": { \
44+ "type": "stars", \
45+ "range": [0, 5], \
46+ "full": "image://theme/rating-star-full", \
47+ "half": "image://theme/rating-star-half", \
48+ "empty": "image://theme/rating-star-empty" \
49+ }, \
50+ "alt-rating": null, \
51+ "summary": null \
52+ }, \
53+ "resources": {} \
54+}'
55+
56+var fullMapping = ' \
57+{ \
58+ "title": "title", \
59+ "art": "art", \
60+ "subtitle": "subtitle", \
61+ "mascot": "mascot", \
62+ "summary": "summary" \
63+}'
64+
65+
21function tryParse(json, errorLabel) {
66function tryParse(json, errorLabel) {
22 var o = undefined;
67 var o = undefined;
23 if (errorLabel !== undefined) {
68 if (errorLabel !== undefined) {
tests/qmltests/Dash/tst_Card.qml+75−63
@@ -27,41 +27,6 @@ Rectangle {
27 height: units.gu(72)
27 height: units.gu(72)
28 color: "#88FFFFFF"
28 color: "#88FFFFFF"
29
29
30− property string defaultLayout: '
31− {
32− "schema-version": 1,
33− "template": {
34− "category-layout": "grid",
35− "card-layout": "vertical",
36− "card-size": "medium",
37− "overlay-mode": null,
38− "collapsed-rows": 2
39− },
40− "components": {
41− "title": null,
42− "art": {
43− "aspect-ratio": 1.0,
44− "fill-mode": "crop"
45− },
46− "subtitle": null,
47− "mascot": null,
48− "emblem": null,
49− "old-price": null,
50− "price": null,
51− "alt-price": null,
52− "rating": {
53− "type": "stars",
54− "range": [0, 5],
55− "full": "image://theme/rating-star-full",
56− "half": "image://theme/rating-star-half",
57− "empty": "image://theme/rating-star-empty"
58− },
59− "alt-rating": null,
60− "summary": null
61− },
62− "resources": {}
63− }'
64−
65 property string cardData: '
30 property string cardData: '
66 {
31 {
67 "art": "../../tests/qmltests/Dash/artwork/music-player-design.png",
32 "art": "../../tests/qmltests/Dash/artwork/music-player-design.png",
@@ -71,49 +36,61 @@ Rectangle {
71 "summary": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
36 "summary": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
72 }'
37 }'
73
38
74− property string fullMapping: '
75− {
76− "title": "title",
77− "art": "art",
78− "subtitle": "subtitle",
79− "mascot": "mascot",
80− "summary": "summary"
81− }'
82−
83 property var cardsModel: [
39 property var cardsModel: [
84 {
40 {
85− "name": "Art, header, summary - vertical",
41+ "name": "Art, header, summary",
86− "layout": { "components": JSON.parse(fullMapping) }
42+ "layout": { "components": JSON.parse(Helpers.fullMapping) }
87 },
43 },
88 {
44 {
89− "name": "Art, header, summary - vertical, small",
45+ "name": "Art, header, summary - small",
90− "layout": { "template": { "card-size": "small" }, "components": JSON.parse(fullMapping) }
46+ "layout": { "template": { "card-size": "small" }, "components": JSON.parse(Helpers.fullMapping) }
91 },
47 },
92 {
48 {
93− "name": "Art, header, summary - vertical, large",
49+ "name": "Art, header, summary - large",
94− "layout": { "template": { "card-size": "large" }, "components": JSON.parse(fullMapping) }
50+ "layout": { "template": { "card-size": "large" }, "components": JSON.parse(Helpers.fullMapping) }
95 },
51 },
96 {
52 {
97− "name": "Art, header, summary - vertical, wide",
53+ "name": "Art, header, summary - wide",
98− "layout": { "components": Helpers.update(JSON.parse(root.fullMapping), { "art": { "aspect-ratio": 2 } }) }
54+ "layout": { "components": Helpers.update(JSON.parse(Helpers.fullMapping), { "art": { "aspect-ratio": 2 } }) }
99 },
55 },
100 {
56 {
101− "name": "Art, title - vertical, fitted",
57+ "name": "Art, title - fitted",
102− "layout": { "components": Helpers.update(JSON.parse(root.fullMapping), { "art": { "fill-mode": "fit" } }) }
58+ "layout": { "components": Helpers.update(JSON.parse(Helpers.fullMapping), { "art": { "fill-mode": "fit" } }) }
103 },
59 },
104 {
60 {
105 "name": "Art, header, summary - horizontal",
61 "name": "Art, header, summary - horizontal",
106 "layout": { "template": { "card-layout": "horizontal" },
62 "layout": { "template": { "card-layout": "horizontal" },
107− "components": JSON.parse(fullMapping) }
63+ "components": JSON.parse(Helpers.fullMapping) }
64+ },
65+ {
66+ "name": "Art, header",
67+ "layout": { "components": Helpers.update(JSON.parse(Helpers.fullMapping), { "summary": undefined }) }
68+ },
69+ {
70+ "name": "Art, summary",
71+ "layout": { "components": { "art": "art", "summary": "summary" } }
72+ },
73+ {
74+ "name": "Header title only",
75+ "layout": { "components": { "title": "title" } }
108 },
76 },
109 ]
77 ]
110
78
79+ CardTool {
80+ id: cardTool
81+ template: card.template
82+ components: card.components
83+ }
84+
111 Card {
85 Card {
112 id: card
86 id: card
113 anchors { top: parent.top; left: parent.left; margins: units.gu(1) }
87 anchors { top: parent.top; left: parent.left; margins: units.gu(1) }
114
88
89+ width: cardTool.cardWidth || implicitWidth
90+ height: cardTool.cardHeight || implicitHeight
91+
115− template: Helpers.update(JSON.parse(root.defaultLayout), Helpers.tryParse(layoutArea.text, layoutError))['template'];
92+ template: Helpers.update(JSON.parse(Helpers.defaultLayout), Helpers.tryParse(layoutArea.text, layoutError))['template'];
116− components: Helpers.update(JSON.parse(root.defaultLayout), Helpers.tryParse(layoutArea.text, layoutError))['components'];
93+ components: Helpers.update(JSON.parse(Helpers.defaultLayout), Helpers.tryParse(layoutArea.text, layoutError))['components'];
117 cardData: Helpers.mapData(dataArea.text, components, dataError)
94 cardData: Helpers.mapData(dataArea.text, components, dataError)
118 }
95 }
119
96
@@ -189,7 +166,10 @@ Rectangle {
189 property Item summary: findChild(card, "summaryLabel")
166 property Item summary: findChild(card, "summaryLabel")
190
167
191 function initTestCase() {
168 function initTestCase() {
192− verify(testCase.header !== undefined, "Couldn't find header object.");
169+ verify(typeof testCase.header === "object", "Couldn't find header object.");
170+ verify(typeof testCase.art === "object", "Couldn't find art object.");
171+ verify(typeof testCase.artImage === "object", "Couldn't find artImage object.");
172+ verify(typeof testCase.summary === "object", "Couldn't find summary object.");
193 }
173 }
194
174
195 function cleanup() {
175 function cleanup() {
@@ -233,10 +213,13 @@ Rectangle {
233 function test_card_size_data() {
213 function test_card_size_data() {
234 return [
214 return [
235 { tag: "Medium", width: units.gu(18.5), index: 0 },
215 { tag: "Medium", width: units.gu(18.5), index: 0 },
236− { tag: "Small", width: units.gu(12), size: "small", index: 0 },
216+ { tag: "Small", width: units.gu(12), index: 1 },
237− { tag: "Large", width: units.gu(38), size: "large", index: 0 },
217+ { tag: "Large", width: units.gu(38), index: 2 },
238 { tag: "Wide", width: units.gu(18.5), aspect: 0.5, index: 0 },
218 { tag: "Wide", width: units.gu(18.5), aspect: 0.5, index: 0 },
239 { tag: "Horizontal", width: units.gu(38), index: 5 },
219 { tag: "Horizontal", width: units.gu(38), index: 5 },
220+ // Make sure card ends with header when there's no summary
221+ { tag: "NoSummary", height: function() { return header.y + header.height }, index: 6 },
222+ { tag: "HorizontalNoSummary", height: function() { return header.height }, card_layout: "horizontal", index: 6 },
240 ]
223 ]
241 }
224 }
242
225
@@ -248,6 +231,11 @@ Rectangle {
248 card.templateChanged();
231 card.templateChanged();
249 }
232 }
250
233
234+ if (data.hasOwnProperty("card_layout")) {
235+ card.template['card-layout'] = data.card_layout;
236+ card.templateChanged();
237+ }
238+
251 if (data.hasOwnProperty("aspect")) {
239 if (data.hasOwnProperty("aspect")) {
252 card.components['art']['aspect-ratio'] = data.aspect;
240 card.components['art']['aspect-ratio'] = data.aspect;
253 card.componentsChanged();
241 card.componentsChanged();
@@ -257,7 +245,9 @@ Rectangle {
257 tryCompare(card, "width", data.width);
245 tryCompare(card, "width", data.width);
258 }
246 }
259
247
248+ if (typeof data.height === "function") {
249+ tryCompareFunction(function() { return card.height === data.height() }, true);
260− if (data.hasOwnProperty("height")) {
250+ } else if (data.hasOwnProperty("height")) {
261 tryCompare(card, "height", data.height);
251 tryCompare(card, "height", data.height);
262 }
252 }
263 }
253 }
@@ -308,7 +298,7 @@ Rectangle {
308 function test_art_layout_data() {
298 function test_art_layout_data() {
309 return [
299 return [
310 { tag: "Vertical", left: function() { return 0 }, index: 0},
300 { tag: "Vertical", left: function() { return 0 }, index: 0},
311− { tag: "Horizontal", left: function() { return art.width }, index: 5 }
301+ { tag: "Horizontal", left: function() { return art.width }, index: 5 },
312 ];
302 ];
313 }
303 }
314
304
@@ -323,7 +313,7 @@ Rectangle {
323 { tag: "Vertical", top: function() { return art.y + art.height },
313 { tag: "Vertical", top: function() { return art.y + art.height },
324 left: function() { return art.x }, index: 0 },
314 left: function() { return art.x }, index: 0 },
325 { tag: "Horizontal", top: function() { return art.y },
315 { tag: "Horizontal", top: function() { return art.y },
326− left: function() { return art.x + art.width }, index: 5 }
316+ left: function() { return art.x + art.width }, index: 5 },
327 ]
317 ]
328 }
318 }
329
319
@@ -333,5 +323,27 @@ Rectangle {
333 tryCompareFunction(function() { return testCase.header.y === data.top() }, true);
323 tryCompareFunction(function() { return testCase.header.y === data.top() }, true);
334 tryCompareFunction(function() { return testCase.header.x === data.left() }, true);
324 tryCompareFunction(function() { return testCase.header.x === data.left() }, true);
335 }
325 }
326+
327+ function test_summary_layout_data() {
328+ return [
329+ { tag: "With header", top: function() { return header.y + header.height }, index: 0 },
330+ { tag: "Without header", top: function() { return art.y + art.height }, index: 7 },
331+ ]
332+ }
333+
334+ function test_summary_layout(data) {
335+ selector.selectedIndex = data.index;
336+
337+ tryCompareFunction(function() { return testCase.summary.y === data.top() }, true);
338+ }
339+
340+ function test_art_visibility() {
341+ selector.selectedIndex = 8;
342+
343+ tryCompare(testCase.artImage, "source", "");
344+ compare(testCase.art.visible, false);
345+ compare(testCase.art.height, 0);
346+ compare(testCase.art.width, 0);
347+ }
336 }
348 }
337}
349}
tests/qmltests/Dash/tst_CardHeader.qml+14−9
@@ -52,11 +52,11 @@ Rectangle {
52 property Item column: findChild(cardHeader, "column")
52 property Item column: findChild(cardHeader, "column")
53
53
54 function initTestCase() {
54 function initTestCase() {
55− verify(testCase.mascot !== undefined, "Couldn't find mascot object.");
55+ verify(typeof testCase.mascot === "object", "Couldn't find mascot object.");
56− verify(testCase.titleLabel !== undefined, "Couldn't find titleLabel object.");
56+ verify(typeof testCase.titleLabel === "object", "Couldn't find titleLabel object.");
57− verify(testCase.subtitleLabel !== undefined, "Couldn't find subtitleLabel object.");
57+ verify(typeof testCase.subtitleLabel === "object", "Couldn't find subtitleLabel object.");
58− verify(testCase.prices !== undefined, "Couldn't find prices object.");
58+ verify(typeof testCase.prices === "object", "Couldn't find prices object.");
59− verify(testCase.oldPriceLabel !== undefined, "Couldn't find oldPriceLabel object.");
59+ verify(typeof testCase.oldPriceLabel === "object", "Couldn't find oldPriceLabel object.");
60 }
60 }
61
61
62 function cleanup() {
62 function cleanup() {
@@ -86,7 +86,7 @@ Rectangle {
86 { tag: "Empty", visible: false },
86 { tag: "Empty", visible: false },
87 { tag: "Title only", title: "Foo", visible: true },
87 { tag: "Title only", title: "Foo", visible: true },
88 { tag: "Subtitle only", subtitle: "Bar", visible: false },
88 { tag: "Subtitle only", subtitle: "Bar", visible: false },
89− { tag: "Both", title: "Foo", subtitle: "Bar", visible: true }
89+ { tag: "Both", title: "Foo", subtitle: "Bar", visible: true },
90 ]
90 ]
91 }
91 }
92
92
@@ -104,7 +104,7 @@ Rectangle {
104 { tag: "Main and Alt", main: "$1.25", alt: "€1.00", visible: true },
104 { tag: "Main and Alt", main: "$1.25", alt: "€1.00", visible: true },
105 { tag: "Main and Old", main: "$1.25", old: "$2.00", visible: true, oldAlign: Text.AlignRight },
105 { tag: "Main and Old", main: "$1.25", old: "$2.00", visible: true, oldAlign: Text.AlignRight },
106 { tag: "Alt and Old", alt: "€1.00", old: "$2.00", visible: false },
106 { tag: "Alt and Old", alt: "€1.00", old: "$2.00", visible: false },
107− { tag: "All", main: "$1.25", alt: "€1.00", old: "$2.00", visible: true, oldAlign: Text.AlignHCenter }
107+ { tag: "All", main: "$1.25", alt: "€1.00", old: "$2.00", visible: true, oldAlign: Text.AlignHCenter },
108 ]
108 ]
109 }
109 }
110
110
@@ -120,8 +120,9 @@ Rectangle {
120
120
121 function test_dimensions_data() {
121 function test_dimensions_data() {
122 return [
122 return [
123− { tag: "Column width", object: column, width: cardHeader.width - testCase.outerRow.spacing * 2 },
123+ { tag: "Column width", object: column, width: cardHeader.width },
124− { tag: "Column width", object: column, width: cardHeader.width - mascot.width - testCase.outerRow.spacing * 3, mascot: "artwork/avatar.png" }
124+ { tag: "Column width with mascot", object: column, width: cardHeader.width - mascot.width - outerRow.margins * 3, mascot: "artwork/avatar.png" },
125+ { tag: "Header height", object: cardHeader, height: function() { return subtitleLabel.y + subtitleLabel.height + outerRow.margins * 2 } },
125 ]
126 ]
126 }
127 }
127
128
@@ -133,6 +134,10 @@ Rectangle {
133 if (data.hasOwnProperty("width")) {
134 if (data.hasOwnProperty("width")) {
134 tryCompare(data.object, "width", data.width);
135 tryCompare(data.object, "width", data.width);
135 }
136 }
137+
138+ if (data.hasOwnProperty("height")) {
139+ tryCompareFunction(function() { return data.object.height === data.height() }, true);
140+ }
136 }
141 }
137 }
142 }
138}
143}
tests/qmltests/Dash/tst_CardTool.qmlnew file+300
@@ -0,0 +1,300 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import QtTest 1.0
19+import Ubuntu.Components 0.1
20+import Unity.Test 0.1 as UT
21+import "../../../qml/Dash"
22+import "CardHelpers.js" as Helpers
23+
24+Rectangle {
25+ id: root
26+ width: units.gu(80)
27+ height: units.gu(72)
28+ color: "#88FFFFFF"
29+
30+ property var cardsModel: [
31+ {
32+ "name": "Art, header, summary",
33+ "layout": { "components": JSON.parse(Helpers.fullMapping) }
34+ },
35+ {
36+ "name": "Header, summary",
37+ "layout": { "components": Helpers.update(JSON.parse(Helpers.fullMapping), { "art": undefined }) }
38+ },
39+ {
40+ "name": "Art, header",
41+ "layout": { "components": Helpers.update(JSON.parse(Helpers.fullMapping), { "summary": undefined }) }
42+ },
43+ {
44+ "name": "Header only",
45+ "layout": { "components": Helpers.update(JSON.parse(Helpers.fullMapping), { "art": undefined, "summary": undefined }) }
46+ },
47+ {
48+ "name": "Header title only",
49+ "layout": { "components": { "title": "title" } }
50+ },
51+ {
52+ "name": "Header title and subtitle",
53+ "layout": { "components": { "title": "title", "subtitle": "subtitle" } }
54+ },
55+ {
56+ "name": "Header title and mascot",
57+ "layout": { "components": { "title": "title", "mascot": "mascot" } }
58+ },
59+ {
60+ "name": "Art, header, summary - small",
61+ "layout": { "template": { "card-size": "small" }, "components": JSON.parse(Helpers.fullMapping) }
62+ },
63+ {
64+ "name": "Art, header, summary - large",
65+ "layout": { "template": { "card-size": "large" }, "components": JSON.parse(Helpers.fullMapping) }
66+ },
67+ {
68+ "name": "Art, header, summary - horizontal",
69+ "layout": { "template": { "card-layout": "horizontal" }, "components": JSON.parse(Helpers.fullMapping) }
70+ },
71+ {
72+ "name": "Art, header - portrait",
73+ "layout": { "components": Helpers.update(JSON.parse(Helpers.fullMapping), { "art": {"aspect-ratio": 0.5, "summary": undefined }}) }
74+ },
75+ ]
76+
77+ CardTool {
78+ id: cardTool
79+
80+ template: Helpers.update(JSON.parse(Helpers.defaultLayout), Helpers.tryParse(layoutArea.text, layoutError))['template'];
81+ components: Helpers.update(JSON.parse(Helpers.defaultLayout), Helpers.tryParse(layoutArea.text, layoutError))['components'];
82+ viewWidth: units.gu(Math.round(widthSlider.value))
83+ }
84+
85+ Column {
86+ width: units.gu(38)
87+ anchors { left: parent.left; top: parent.top; margins: units.gu(1) }
88+
89+ Repeater {
90+ model: [
91+ { label: "View width", value: cardTool.viewWidth && cardTool.viewWidth / units.gu(1) },
92+ { label: "Card width", value: cardTool.cardWidth && cardTool.cardWidth / units.gu(1) },
93+ { label: "Card height", value: cardTool.cardHeight && cardTool.cardHeight / units.gu(1) },
94+ ]
95+
96+ delegate: Row {
97+ anchors { left: parent.left; right: parent.right; margins: units.gu(3) }
98+
99+ Label {
100+ height: units.gu(5)
101+ width: units.gu(25)
102+ text: modelData.label
103+ verticalAlignment: Text.AlignVCenter
104+ }
105+
106+ Label {
107+ height: units.gu(5)
108+ text: modelData.value || "undefined"
109+ verticalAlignment: Text.AlignVCenter
110+ }
111+ }
112+ }
113+
114+ Card {
115+ id: card
116+ template: cardTool.template;
117+ components: cardTool.components;
118+ cardData: Helpers.mapData(dataArea.text, components, dataError)
119+
120+ width: cardTool.cardWidth || implicitWidth
121+ height: cardTool.cardHeight || implicitHeight
122+
123+ clip: true
124+
125+ Rectangle {
126+ anchors.fill: parent
127+ color: "transparent"
128+ border.width: 1
129+ border.color: "green"
130+ }
131+ }
132+ }
133+
134+ Rectangle {
135+ anchors { top: parent.top; bottom: parent.bottom; right: parent.right}
136+ width: units.gu(40)
137+ color: "lightgrey"
138+
139+ Column {
140+ anchors { fill: parent; margins: units.gu(1) }
141+ spacing: units.gu(1)
142+
143+ OptionSelector {
144+ id: selector
145+ model: cardsModel
146+ delegate: OptionSelectorDelegate { text: modelData.name }
147+ onSelectedIndexChanged: updateAreas()
148+ Component.onCompleted: updateAreas()
149+
150+ function updateAreas() {
151+ var element = cardsModel[selectedIndex];
152+ if (element) {
153+ layoutArea.text = JSON.stringify(element.layout, undefined, 2) || "{}";
154+ } else {
155+ layoutArea.text = "";
156+ }
157+ }
158+ }
159+
160+ OptionSelector {
161+ id: layoutSelector
162+ model: [
163+ { label: "Grid", layout: "grid" },
164+ { label: "Organic Grid", layout: "organic-grid" },
165+ { label: "Horizontal Journal", layout: "journal" },
166+ { label: "Vertical Journal", layout: "vertical-journal" },
167+ { label: "Carousel", layout: "carousel" },
168+ ]
169+ delegate: OptionSelectorDelegate { text: modelData.label }
170+ onSelectedIndexChanged: {
171+ var element = model[selectedIndex];
172+ if (element && cardTool.template["category-layout"] !== element.layout) {
173+ var current = JSON.parse(layoutArea.text);
174+ var update = { "template": { "category-layout": element.layout }}
175+ layoutArea.text = JSON.stringify(Helpers.update(current, update), undefined, 2) || "{}";
176+ }
177+ }
178+ }
179+
180+ Label {
181+ anchors { left: parent.left; right: parent.right }
182+ height: units.gu(3)
183+ verticalAlignment: Text.AlignBottom
184+ text: "View width:"
185+ }
186+
187+ Slider {
188+ id: widthSlider
189+ minimumValue: 30
190+ maximumValue: 140
191+ live: true
192+ value: 40
193+ }
194+
195+ TextArea {
196+ id: layoutArea
197+ anchors { left: parent.left; right: parent.right }
198+ height: units.gu(25)
199+ }
200+
201+ Label {
202+ id: layoutError
203+ anchors { left: parent.left; right: parent.right }
204+ height: units.gu(4)
205+ color: "orange"
206+ }
207+
208+ TextArea {
209+ id: dataArea
210+ anchors { left: parent.left; right: parent.right }
211+ height: units.gu(25)
212+ text: JSON.stringify(cardTool.priv.cardData, undefined, 2)
213+ }
214+
215+ Label {
216+ id: dataError
217+ anchors { left: parent.left; right: parent.right }
218+ height: units.gu(4)
219+ color: "orange"
220+ }
221+ }
222+
223+ Connections {
224+ target: cardTool
225+ onTemplateChanged: {
226+ switch(cardTool.template["category-layout"]) {
227+ case "organic-grid": layoutSelector.selectedIndex = 1; break;
228+ case "journal": layoutSelector.selectedIndex = 2; break;
229+ case "vertical-journal": layoutSelector.selectedIndex = 3; break;
230+ case "carousel": layoutSelector.selectedIndex = 4; break;
231+ case "grid":
232+ default: layoutSelector.selectedIndex = 0; break;
233+ }
234+ }
235+ }
236+ }
237+
238+ UT.UnityTestCase {
239+ id: testCase
240+ name: "Card"
241+
242+ when: windowShown
243+
244+ function cleanup() {
245+ selector.selectedIndex = -1;
246+ layoutSelector.selectedIndex = -1;
247+ }
248+
249+ function test_card_size_data() {
250+ return [
251+ { tag: "Medium", width: units.gu(18.5), height: function() { return card.height }, index: 0 },
252+ { tag: "No art", width: units.gu(18.5), height: function() { return card.height }, index: 1 },
253+ { tag: "No summary", width: units.gu(18.5), height: function() { return card.height }, index: 2 },
254+ { tag: "Just header", width: units.gu(18.5), height: function() { return card.height }, index: 3 },
255+ { tag: "Just title", width: units.gu(18.5), height: function() { return card.height }, index: 4 },
256+ { tag: "Title and subtitle", width: units.gu(18.5), height: function() { return card.height }, index: 5 },
257+ { tag: "Title and mascot", width: units.gu(18.5), height: function() { return card.height }, index: 6 },
258+ { tag: "Small", width: units.gu(12), height: function() { return card.height }, index: 7 },
259+ { tag: "Large", width: units.gu(38), height: function() { return card.height }, index: 8 },
260+ { tag: "Horizontal", width: units.gu(38), height: function() { return card.height }, index: 9 },
261+ { tag: "OrganicGrid", width: undefined, height: undefined, index: 0, layout_index: 1},
262+ { tag: "Journal", width: undefined, height: units.gu(20), size: 20, index: 0, layout_index: 2 },
263+ { tag: "OversizedJournal", width: undefined, height: units.gu(18.5), size: 40, index: 0, layout_index: 2 },
264+ { tag: "VerticalJournal", width: units.gu(18.5), height: undefined, index: 0, layout_index: 3 },
265+ { tag: "SmallCarousel", width: units.gu(18), height: units.gu(18), viewWidth: 30, index: 0, layout_index: 4},
266+ { tag: "MediumCarousel", width: units.gu(22), height: units.gu(22), viewWidth: 84, index: 0, layout_index: 4},
267+ { tag: "LargeCarousel", width: units.gu(26), height: units.gu(26), viewWidth: 140, index: 0, layout_index: 4},
268+ { tag: "PortraitCarousel", width: units.gu(22), height: units.gu(44), viewWidth: 84, index: 10, layout_index: 4},
269+ ]
270+ }
271+
272+ function test_card_size(data) {
273+ selector.selectedIndex = data.index;
274+ if (data.hasOwnProperty("layout_index")) {
275+ layoutSelector.selectedIndex = data.layout_index;
276+ }
277+
278+ if (data.hasOwnProperty("viewWidth")) {
279+ widthSlider.value = data.viewWidth;
280+ }
281+
282+ if (data.hasOwnProperty("size")) {
283+ cardTool.template['card-size'] = data.size;
284+ cardTool.templateChanged();
285+ }
286+
287+ if (data.hasOwnProperty("width")) {
288+ if (typeof data.width === "function") {
289+ tryCompareFunction(function() { return cardTool.cardWidth === data.width() }, true);
290+ } else tryCompare(cardTool, "cardWidth", data.width);
291+ }
292+
293+ if (data.hasOwnProperty("height")) {
294+ if (typeof data.height === "function") {
295+ tryCompareFunction(function() { return cardTool.cardHeight === data.height() }, true);
296+ } else tryCompare(cardTool, "cardHeight", data.height);
297+ }
298+ }
299+ }
300+}
tests/qmltests/Dash/tst_GenericPreview.qml+8
@@ -113,5 +113,13 @@ Item {
113 compare(value.text, dataObject.infoHints[i].value)
113 compare(value.text, dataObject.infoHints[i].value)
114 }
114 }
115 }
115 }
116+
117+ function test_showProcessing() {
118+ var button = findChild(genericPreview, "button1");
119+ mouseClick(button, 1, 1);
120+ tryCompare(genericPreview, "showProcessingAction", true);
121+ genericPreview.previewDataChanged();
122+ tryCompare(genericPreview, "showProcessingAction", false);
123+ }
116 }
124 }
117}
125}
tests/qmltests/Dash/tst_GenericScopeView.qml+49−1
@@ -71,7 +71,13 @@ Item {
71 name: "GenericScopeView"
71 name: "GenericScopeView"
72 when: scopes.loaded
72 when: scopes.loaded
73
73
74+ function init() {
75+ shell.width = units.gu(120)
76+ genericScopeView.categoryView.positionAtBeginning();
77+ tryCompare(genericScopeView.categoryView.contentY, 0)
78+ }
79+
74− function test_isCurrent() {
80+ function test_isCurrent() {
75 genericScopeView.isCurrent = true
81 genericScopeView.isCurrent = true
76 pageHeader.searchQuery = "test"
82 pageHeader.searchQuery = "test"
77 previewListView.open = true
83 previewListView.open = true
@@ -80,6 +86,18 @@ Item {
80 tryCompare(previewListView, "open", false);
86 tryCompare(previewListView, "open", false);
81 }
87 }
82
88
89+ function test_isActive() {
90+ tryCompare(genericScopeView.scope, "isActive", false)
91+ genericScopeView.isCurrent = true
92+ tryCompare(genericScopeView.scope, "isActive", true)
93+ previewListView.open = true
94+ tryCompare(genericScopeView.scope, "isActive", false)
95+ previewListView.open = false
96+ tryCompare(genericScopeView.scope, "isActive", true)
97+ genericScopeView.isCurrent = false
98+ tryCompare(genericScopeView.scope, "isActive", false)
99+ }
100+
83 function test_showDash() {
101 function test_showDash() {
84 previewListView.open = true;
102 previewListView.open = true;
85 tryCompare(openEffect, "live", true);
103 tryCompare(openEffect, "live", true);
@@ -272,6 +290,21 @@ Item {
272 tryCompare(category, "filtered", true);
290 tryCompare(category, "filtered", true);
273 }
291 }
274
292
293+ function test_getRendererCarouselGridFallback() {
294+ var rendererId = "carousel"
295+ var contentType = ""
296+ var rendererHint = ""
297+ var results = new Object()
298+
299+ results.count = 7
300+ var renderer = genericScopeView.getRenderer(rendererId, contentType, rendererHint, results)
301+ compare(renderer, "Generic/GenericCarousel.qml")
302+
303+ results.count = 6
304+ renderer = genericScopeView.getRenderer(rendererId, contentType, rendererHint, results)
305+ compare(renderer, "Generic/GenericFilterGrid.qml")
306+ }
307+
275 function test_showPreviewCarousel() {
308 function test_showPreviewCarousel() {
276 tryCompareFunction(function() { return findChild(genericScopeView, "carouselDelegate") != undefined; }, true);
309 tryCompareFunction(function() { return findChild(genericScopeView, "carouselDelegate") != undefined; }, true);
277 var tile = findChild(genericScopeView, "carouselDelegate");
310 var tile = findChild(genericScopeView, "carouselDelegate");
@@ -336,6 +369,21 @@ Item {
336 tryCompare(category2, "filtered", true);
369 tryCompare(category2, "filtered", true);
337 tryCompare(category2FilterGrid, "filter", true);
370 tryCompare(category2FilterGrid, "filter", true);
338 }
371 }
372+
373+ function test_narrow_delegate_ranges_expand() {
374+ tryCompareFunction(function() { return findChild(genericScopeView, "dashCategory0") != undefined; }, true);
375+ var category = findChild(genericScopeView, "dashCategory0")
376+
377+ shell.width = units.gu(20)
378+ var categoryListView = findChild(genericScopeView, "categoryListView");
379+ categoryListView.contentY = units.gu(20);
380+ var header0 = findChild(genericScopeView, "dashSectionHeader0")
381+ mouseClick(header0, header0.width / 2, header0.height / 2);
382+ tryCompare(category, "filtered", false);
383+ tryCompare(category.item, "delegateCreationEnd", category.item.delegateCreationBegin + genericScopeView.height);
384+ mouseClick(header0, header0.width / 2, header0.height / 2);
385+ tryCompare(category, "filtered", true);
386+ }
339 }
387 }
340 }
388 }
341}
389}
tests/qmltests/Greeter/tst_Lockscreen.qml+1−1
@@ -134,7 +134,7 @@ Rectangle {
134 if (data.pinPadAvailable) {
134 if (data.pinPadAvailable) {
135 compare(findChild(lockscreen, "pinPadButton8").text, "8", "Could not find number 8 on PinPad")
135 compare(findChild(lockscreen, "pinPadButton8").text, "8", "Could not find number 8 on PinPad")
136 } else {
136 } else {
137− compare(findChild(lockscreen, "pinPadButton8"), undefined, "Could find number 8 on PinPad even though it should be only OSK")
137+ compare(findChild(lockscreen, "pinPadButton8"), null, "Could find number 8 on PinPad even though it should be only OSK")
138 }
138 }
139 }
139 }
140
140
tests/qmltests/Panel/Indicators/tst_DefaultIndicatorPage.qml−4
@@ -129,14 +129,10 @@ Item {
129 function test_reloadData() {
129 function test_reloadData() {
130 var mainMenu = findChild(page, "mainMenu");
130 var mainMenu = findChild(page, "mainMenu");
131
131
132− console.log("setting empty data");
133 page.menuModel.modelData = [];
132 page.menuModel.modelData = [];
134 tryCompare(mainMenu, "count", 0);
133 tryCompare(mainMenu, "count", 0);
135− console.log("set empty data");
136
134
137− console.log("setting full data");
138 page.menuModel.modelData = fullMenuData;
135 page.menuModel.modelData = fullMenuData;
139− console.log("set full data");
140 tryCompare(mainMenu, "count", 3);
136 tryCompare(mainMenu, "count", 3);
141
137
142 page.menuModel.modelData = [];
138 page.menuModel.modelData = [];
tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+194−18
@@ -84,11 +84,13 @@ Item {
84 { tag: 'switch1', type: "unity.widgets.systemsettings.tablet.switch", objectName: "switchMenu" },
84 { tag: 'switch1', type: "unity.widgets.systemsettings.tablet.switch", objectName: "switchMenu" },
85
85
86 { tag: 'button', type: "com.canonical.indicator.button", objectName: "buttonMenu" },
86 { tag: 'button', type: "com.canonical.indicator.button", objectName: "buttonMenu" },
87− { tag: 'separator', type: "com.canonical.indicator.div", objectName: "divMenu" },
87+ { tag: 'separator', type: "com.canonical.indicator.div", objectName: "separatorMenu" },
88 { tag: 'section', type: "com.canonical.indicator.section", objectName: "sectionMenu" },
88 { tag: 'section', type: "com.canonical.indicator.section", objectName: "sectionMenu" },
89 { tag: 'progress', type: "com.canonical.indicator.progress", objectName: "progressMenu" },
89 { tag: 'progress', type: "com.canonical.indicator.progress", objectName: "progressMenu" },
90 { tag: 'slider1', type: "com.canonical.indicator.slider", objectName: "sliderMenu" },
90 { tag: 'slider1', type: "com.canonical.indicator.slider", objectName: "sliderMenu" },
91 { tag: 'switch2', type: "com.canonical.indicator.switch", objectName: "switchMenu" },
91 { tag: 'switch2', type: "com.canonical.indicator.switch", objectName: "switchMenu" },
92+ { tag: 'alarm', type: "com.canonical.indicator.alarm", objectName: "alarmMenu" },
93+ { tag: 'appointment', type: "com.canonical.indicator.appointment", objectName: "appointmentMenu" },
92
94
93 { tag: 'messageItem', type: "com.canonical.indicator.messages.messageitem", objectName: "messageItem" },
95 { tag: 'messageItem', type: "com.canonical.indicator.messages.messageitem", objectName: "messageItem" },
94 { tag: 'sourceItem', type: "com.canonical.indicator.messages.sourceitem", objectName: "groupedMessage" },
96 { tag: 'sourceItem', type: "com.canonical.indicator.messages.sourceitem", objectName: "groupedMessage" },
@@ -96,8 +98,8 @@ Item {
96 { tag: 'slider2', type: "com.canonical.unity.slider", objectName: "sliderMenu" },
98 { tag: 'slider2', type: "com.canonical.unity.slider", objectName: "sliderMenu" },
97 { tag: 'switch3', type: "com.canonical.unity.switch", objectName: "switchMenu" },
99 { tag: 'switch3', type: "com.canonical.unity.switch", objectName: "switchMenu" },
98
100
99− { tag: 'mediaplayer', type: "com.canonical.unity.media-player", objectName: "standardMenu" },
101+ { tag: 'mediaplayer', type: "com.canonical.unity.media-player", objectName: "mediaPayerMenu" },
100− { tag: 'playbackitem', type: "com.canonical.unity.playback-item", objectName: "standardMenu" },
102+ { tag: 'playbackitem', type: "com.canonical.unity.playback-item", objectName: "playbackItemMenu" },
101
103
102 { tag: 'wifisection', type: "unity.widgets.systemsettings.tablet.wifisection", objectName: "wifiSection" },
104 { tag: 'wifisection', type: "unity.widgets.systemsettings.tablet.wifisection", objectName: "wifiSection" },
103 { tag: 'accesspoint', type: "unity.widgets.systemsettings.tablet.accesspoint", objectName: "accessPoint" },
105 { tag: 'accesspoint', type: "unity.widgets.systemsettings.tablet.accesspoint", objectName: "accessPoint" },
@@ -115,6 +117,16 @@ Item {
115 compare(loader.item.objectName, data.objectName, "Created object name does not match intended object (" + loader.item.objectName + " != " + data.objectName + ")");
117 compare(loader.item.objectName, data.objectName, "Created object name does not match intended object (" + loader.item.objectName + " != " + data.objectName + ")");
116 }
118 }
117
119
120+ function test_create_checkable() {
121+ var tmpData = menuData;
122+ tmpData.isCheck = true;
123+
124+ loader.data = tmpData;
125+ loader.sourceComponent = factory.load(tmpData);
126+ tryCompareFunction(function() { return loader.item != undefined; }, true);
127+ compare(loader.item.objectName, "checkableMenu", "Should have created a checkable menu");
128+ }
129+
118 function test_create_radio() {
130 function test_create_radio() {
119 skip("No radio component");
131 skip("No radio component");
120 menuData.isRadio = true;
132 menuData.isRadio = true;
@@ -131,7 +143,7 @@ Item {
131 loader.data = menuData;
143 loader.data = menuData;
132 loader.sourceComponent = factory.load(menuData);
144 loader.sourceComponent = factory.load(menuData);
133 tryCompareFunction(function() { return loader.item != undefined; }, true);
145 tryCompareFunction(function() { return loader.item != undefined; }, true);
134− compare(loader.item.objectName, "divMenu", "Should have created a separator menu");
146+ compare(loader.item.objectName, "separatorMenu", "Should have created a separator menu");
135 }
147 }
136
148
137 function test_create_sliderMenu_data() {
149 function test_create_sliderMenu_data() {
@@ -145,13 +157,13 @@ Item {
145 menuData.type = "com.canonical.indicator.slider"
157 menuData.type = "com.canonical.indicator.slider"
146 menuData.label = data.label;
158 menuData.label = data.label;
147 menuData.sensitive = data.enabled;
159 menuData.sensitive = data.enabled;
148− menuData.actionState = data.value;
149 menuData.ext = {
160 menuData.ext = {
150 'minIcon': "file:///testMinIcon",
161 'minIcon': "file:///testMinIcon",
151 'maxIcon': "file:///testMaxIcon",
162 'maxIcon': "file:///testMaxIcon",
152 'minValue': data.minValue,
163 'minValue': data.minValue,
153 'maxValue': data.maxValue
164 'maxValue': data.maxValue
154 };
165 };
166+ menuData.actionState = data.value;
155
167
156 loader.data = menuData;
168 loader.data = menuData;
157 loader.sourceComponent = factory.load(menuData);
169 loader.sourceComponent = factory.load(menuData);
@@ -163,7 +175,7 @@ Item {
163 compare(loader.item.maxIcon, "file:///testMaxIcon", "MaxIcon does not match data");
175 compare(loader.item.maxIcon, "file:///testMaxIcon", "MaxIcon does not match data");
164 compare(loader.item.minimumValue, data.minValue, "MinValue does not match data");
176 compare(loader.item.minimumValue, data.minValue, "MinValue does not match data");
165 compare(loader.item.maximumValue, data.maxValue, "MaxValue does not match data");
177 compare(loader.item.maximumValue, data.maxValue, "MaxValue does not match data");
166− compare(loader.item.value, data.value, "Calue does not match data");
178+ compare(loader.item.value, data.value, "Value does not match data");
167 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
179 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
168 }
180 }
169
181
@@ -232,7 +244,7 @@ Item {
232
244
233 function test_create_standardMenu_data() {
245 function test_create_standardMenu_data() {
234 return [
246 return [
235− {label: "testLabel1", enabled: true, icon: "file:///testIcon" },
247+ {label: "testLabel1", enabled: true, icon: "file:///testIcon1" },
236 {label: "testLabel2", enabled: false, icon: "file:///testIcon2"},
248 {label: "testLabel2", enabled: false, icon: "file:///testIcon2"},
237 ];
249 ];
238 }
250 }
@@ -253,31 +265,101 @@ Item {
253 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
265 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
254 }
266 }
255
267
256− function test_create_switchMenu_data() {
268+ function test_create_checkableMenu_data() {
257 return [
269 return [
258 {label: "testLabel1", enabled: true, checked: false },
270 {label: "testLabel1", enabled: true, checked: false },
259 {label: "testLabel2", enabled: false, checked: true },
271 {label: "testLabel2", enabled: false, checked: true },
260 ];
272 ];
261 }
273 }
262
274
275+ function test_create_checkableMenu(data) {
276+ menuData.type = "";
277+ menuData.label = data.label;
278+ menuData.sensitive = data.enabled;
279+ menuData.isCheck = true;
280+ menuData.isToggled = data.checked;
281+
282+ loader.data = menuData;
283+ loader.sourceComponent = factory.load(menuData);
284+ tryCompareFunction(function() { return loader.item != undefined; }, true);
285+ compare(loader.item.objectName, "checkableMenu", "Should have created a checkable menu");
286+
287+ compare(loader.item.text, data.label, "Label does not match data");
288+ compare(loader.item.checked, data.checked, "Checked does not match data");
289+ compare(loader.item.enabled, data.enabled, "Enabled does not match data");
290+ }
291+
292+ function test_create_switchMenu_data() {
293+ return [
294+ {label: "testLabel1", enabled: true, checked: false, icon: "file:///testIcon1" },
295+ {label: "testLabel2", enabled: false, checked: true, icon: "file:///testIcon2" },
296+ ];
297+ }
298+
263 function test_create_switchMenu(data) {
299 function test_create_switchMenu(data) {
264 menuData.type = "com.canonical.indicator.switch";
300 menuData.type = "com.canonical.indicator.switch";
265 menuData.label = data.label;
301 menuData.label = data.label;
266 menuData.sensitive = data.enabled;
302 menuData.sensitive = data.enabled;
267− menuData.icon = "file:///testIcon";
303+ menuData.icon = data.icon;
268 menuData.isToggled = data.checked;
304 menuData.isToggled = data.checked;
269
305
270 loader.data = menuData;
306 loader.data = menuData;
271 loader.sourceComponent = factory.load(menuData);
307 loader.sourceComponent = factory.load(menuData);
272 tryCompareFunction(function() { return loader.item != undefined; }, true);
308 tryCompareFunction(function() { return loader.item != undefined; }, true);
273− compare(loader.item.objectName, "switchMenu", "Should have created a standard menu");
309+ compare(loader.item.objectName, "switchMenu", "Should have created a switch menu");
274
310
275 compare(loader.item.text, data.label, "Label does not match data");
311 compare(loader.item.text, data.label, "Label does not match data");
276− compare(loader.item.icon, "file:///testIcon", "MaxIcon does not match data");
312+ compare(loader.item.iconSource, data.icon, "Icon does not match data");
277 compare(loader.item.checked, data.checked, "Checked does not match data");
313 compare(loader.item.checked, data.checked, "Checked does not match data");
278 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
314 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
279 }
315 }
280
316
317+ function test_create_alarmMenu_data() {
318+ return [
319+ {label: "testLabel1", enabled: true, icon: "file:///testIcon1" },
320+ {label: "testLabel2", enabled: false, icon: "file:///testIcon2" },
321+ ];
322+ }
323+
324+ function test_create_alarmMenu(data) {
325+ menuData.type = "com.canonical.indicator.alarm";
326+ menuData.label = data.label;
327+ menuData.sensitive = data.enabled;
328+ menuData.icon = data.icon;
329+
330+ loader.data = menuData;
331+ loader.sourceComponent = factory.load(menuData);
332+ tryCompareFunction(function() { return loader.item != undefined; }, true);
333+ compare(loader.item.objectName, "alarmMenu", "Should have created a alarm menu");
334+
335+ compare(loader.item.text, data.label, "Label does not match data");
336+ compare(loader.item.iconSource, data.icon, "Icon does not match data");
337+ compare(loader.item.enabled, data.enabled, "Enabled does not match data");
338+ }
339+
340+ function test_create_appointmentMenu_data() {
341+ return [
342+ {label: "testLabel1", enabled: true, icon: "file:///testIcon1" },
343+ {label: "testLabel2", enabled: false, icon: "file:///testIcon2" },
344+ ];
345+ }
346+
347+ function test_create_appointmentMenu(data) {
348+ menuData.type = "com.canonical.indicator.appointment";
349+ menuData.label = data.label;
350+ menuData.sensitive = data.enabled;
351+ menuData.icon = data.icon;
352+
353+ loader.data = menuData;
354+ loader.sourceComponent = factory.load(menuData);
355+ tryCompareFunction(function() { return loader.item != undefined; }, true);
356+ compare(loader.item.objectName, "appointmentMenu", "Should have created a appointment menu");
357+
358+ compare(loader.item.text, data.label, "Label does not match data");
359+ compare(loader.item.iconSource, data.icon, "Icon does not match data");
360+ compare(loader.item.enabled, data.enabled, "Enabled does not match data");
361+ }
362+
281 function test_create_wifiSection_data() {
363 function test_create_wifiSection_data() {
282 return [
364 return [
283 {label: "testLabel1", busy: false },
365 {label: "testLabel1", busy: false },
@@ -322,7 +404,7 @@ Item {
322 tryCompareFunction(function() { return loader.item != undefined; }, true);
404 tryCompareFunction(function() { return loader.item != undefined; }, true);
323 compare(loader.item.objectName, "accessPoint", "Should have created a access point menu");
405 compare(loader.item.objectName, "accessPoint", "Should have created a access point menu");
324
406
325− compare(loader.item.label, data.label, "Label does not match data");
407+ compare(loader.item.text, data.label, "Label does not match data");
326 compare(loader.item.strengthAction.name, "action::strength", "Strength action incorrect");
408 compare(loader.item.strengthAction.name, "action::strength", "Strength action incorrect");
327 compare(loader.item.secure, data.secure, "Secure does not match data");
409 compare(loader.item.secure, data.secure, "Secure does not match data");
328 compare(loader.item.adHoc, data.adHoc, "AdHoc does not match data");
410 compare(loader.item.adHoc, data.adHoc, "AdHoc does not match data");
@@ -341,8 +423,8 @@ Item {
341
423
342 function test_create_groupedMessage_data() {
424 function test_create_groupedMessage_data() {
343 return [
425 return [
344− {label: "testLabel1", enabled: true, count: "5", appIcon: "file:///testIcon" },
426+ {label: "testLabel1", enabled: true, count: "5", icon: "file:///testIcon" },
345− {label: "testLabel2", enabled: false, count: "10", appIcon: "file:///testIcon2" },
427+ {label: "testLabel2", enabled: false, count: "10", icon: "file:///testIcon2" },
346 ];
428 ];
347 }
429 }
348
430
@@ -350,8 +432,8 @@ Item {
350 menuData.type = "com.canonical.indicator.messages.sourceitem";
432 menuData.type = "com.canonical.indicator.messages.sourceitem";
351 menuData.label = data.label;
433 menuData.label = data.label;
352 menuData.sensitive = data.enabled;
434 menuData.sensitive = data.enabled;
353− menuData.icon = data.appIcon;
435+ menuData.icon = data.icon;
354− menuData.ext = { 'icon': data.appIcon };
436+ menuData.ext = { 'icon': data.icon };
355 menuData.actionState = [data.count];
437 menuData.actionState = [data.count];
356 menuData.isToggled = true;
438 menuData.isToggled = true;
357
439
@@ -360,9 +442,103 @@ Item {
360 tryCompareFunction(function() { return loader.item != undefined; }, true);
442 tryCompareFunction(function() { return loader.item != undefined; }, true);
361 compare(loader.item.objectName, "groupedMessage", "Should have created a group message menu");
443 compare(loader.item.objectName, "groupedMessage", "Should have created a group message menu");
362
444
363− compare(loader.item.title, data.label, "Label does not match data");
445+ compare(loader.item.text, data.label, "Label does not match data");
364 compare(loader.item.count, data.count, "Count does not match data");
446 compare(loader.item.count, data.count, "Count does not match data");
365− compare(loader.item.appIcon, data.appIcon, "App Icon does not match data");
447+ compare(loader.item.iconSource, data.icon, "Icon does not match data");
448+ compare(loader.item.enabled, data.enabled, "Enabled does not match data");
449+ }
450+
451+ function test_create_mediaPayerMenu_data() {
452+ return [{
453+ label: "player1",
454+ icon: "file:://icon1",
455+ albumArt: "file:://art1",
456+ song: "song1",
457+ artist: "artist1",
458+ album: "album1",
459+ running: true,
460+ state: "Playing",
461+ enabled: true
462+ },{
463+ label: "player2",
464+ icon: "file:://icon2",
465+ albumArt: "file:://art2",
466+ song: "song2",
467+ artist: "artist2",
468+ album: "album2",
469+ running: false,
470+ state: "Paused",
471+ enabled: false
472+ }
473+ ];
474+ }
475+
476+ function test_create_mediaPayerMenu(data) {
477+ menuData.type = "com.canonical.unity.media-player";
478+ menuData.label = data.label;
479+ menuData.sensitive = data.enabled;
480+ menuData.icon = data.icon;
481+ menuData.actionState = {
482+ 'art-url': data.albumArt,
483+ 'title': data.song,
484+ 'artist': data.artist,
485+ 'album': data.album,
486+ 'running': data.running,
487+ 'state': data.state,
488+ };
489+
490+ loader.data = menuData;
491+ loader.sourceComponent = factory.load(menuData);
492+ tryCompareFunction(function() { return loader.item != undefined; }, true);
493+ compare(loader.item.objectName, "mediaPayerMenu", "Should have created a media player menu");
494+
495+ compare(loader.item.playerIcon, data.icon, "Album art does not match data");
496+ compare(loader.item.playerName, data.label, "Album art does not match data");
497+ compare(loader.item.albumArt, data.albumArt, "Album art does not match data");
498+ compare(loader.item.song, data.song, "Song does not match data");
499+ compare(loader.item.artist, data.artist, "Artist does not match data");
500+ compare(loader.item.album, data.album, "Album does not match data");
501+ compare(loader.item.running, data.running, "Running does not match data");
502+ compare(loader.item.state, data.state, "State does not match data");
503+ compare(loader.item.enabled, data.enabled, "Enabled does not match data");
504+ }
505+
506+ function test_create_playbackItemMenu_data() {
507+ return [{
508+ playAction: "action::play",
509+ nextAction: "action::next",
510+ previousAction: "action::previous",
511+ enabled: true
512+ },{
513+ playAction: "action::play2",
514+ nextAction: "action::next2",
515+ previousAction: "action::previous2",
516+ enabled: false
517+ }
518+ ];
519+ }
520+
521+ function test_create_playbackItemMenu(data) {
522+ menuData.type = "com.canonical.unity.playback-item";
523+ menuData.sensitive = data.enabled;
524+ menuData.ext = {
525+ 'xCanonicalPlayAction': data.playAction,
526+ 'xCanonicalNextAction': data.nextAction,
527+ 'xCanonicalPreviousAction': data.previousAction
528+ };
529+
530+ loader.data = menuData;
531+ loader.sourceComponent = factory.load(menuData);
532+ tryCompareFunction(function() { return loader.item != undefined; }, true);
533+ compare(loader.item.objectName, "playbackItemMenu", "Should have created a playback menu");
534+
535+ compare(loader.item.playing, false, "Playing does not match data");
536+ compare(loader.item.playAction.name, data.playAction, "Play action incorrect");
537+ compare(loader.item.nextAction.name, data.nextAction, "Next action incorrect");
538+ compare(loader.item.previousAction.name, data.previousAction, "Previous action incorrect");
539+ compare(loader.item.canPlay, false, "CanPlay should be false");
540+ compare(loader.item.canGoNext, false, "CanGoNext should be false");
541+ compare(loader.item.canGoPrevious, false, "CanGoPrevious should be false");
366 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
542 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
367 }
543 }
368 }
544 }
tests/qmltests/Panel/Indicators/tst_MessageMenuItemFactory.qml+13−4
@@ -18,7 +18,8 @@ import QtQuick 2.0
18import QtTest 1.0
18import QtTest 1.0
19import Unity.Test 0.1 as UT
19import Unity.Test 0.1 as UT
20import QMenuModel 0.1
20import QMenuModel 0.1
21−import Unity.Indicators.Messaging 0.1 as Indicators
21+import Unity.Indicators 0.1 as Indicators
22+import Utils 0.1 as Utils
22
23
23Item {
24Item {
24 id: testView
25 id: testView
@@ -31,6 +32,11 @@ Item {
31 menuIndex: 0
32 menuIndex: 0
32 }
33 }
33
34
35+ Utils.TimeFormatter {
36+ id: timeFormatter
37+ format: "hh:mm - MMM dd"
38+ }
39+
34 UT.UnityTestCase {
40 UT.UnityTestCase {
35 name: "MessageMenuItemFactory"
41 name: "MessageMenuItemFactory"
36
42
@@ -82,13 +88,14 @@ Item {
82 'xCanonicalAppIcon': data.appIcon,
88 'xCanonicalAppIcon': data.appIcon,
83 };
89 };
84 factory.menuData = menuData;
90 factory.menuData = menuData;
91+ timeFormatter.time = data.time;
85
92
86 var loader = findChild(factory, "loader");
93 var loader = findChild(factory, "loader");
87 verify(loader !== undefined);
94 verify(loader !== undefined);
88
95
89 tryCompare(loader.item, "objectName", "simpleTextMessage");
96 tryCompare(loader.item, "objectName", "simpleTextMessage");
90 compare(loader.item.title, data.title, "Title does not match data");
97 compare(loader.item.title, data.title, "Title does not match data");
91− compare(loader.item.time, data.time, "Time does not match data");
98+ compare(loader.item.time, timeFormatter.timeString, "Time does not match data");
92 compare(loader.item.message, data.message, "Message does not match data");
99 compare(loader.item.message, data.message, "Message does not match data");
93 compare(loader.item.avatar, data.avatar, "Avatar does not match data");
100 compare(loader.item.avatar, data.avatar, "Avatar does not match data");
94 compare(loader.item.appIcon, data.appIcon, "App icon does not match data");
101 compare(loader.item.appIcon, data.appIcon, "App icon does not match data");
@@ -119,13 +126,14 @@ Item {
119 ]
126 ]
120 };
127 };
121 factory.menuData = menuData;
128 factory.menuData = menuData;
129+ timeFormatter.time = data.time;
122
130
123 var loader = findChild(factory, "loader");
131 var loader = findChild(factory, "loader");
124 verify(loader !== undefined);
132 verify(loader !== undefined);
125
133
126 tryCompare(loader.item, "objectName", "textMessage");
134 tryCompare(loader.item, "objectName", "textMessage");
127 compare(loader.item.title, data.title, "Title does not match data");
135 compare(loader.item.title, data.title, "Title does not match data");
128− compare(loader.item.time, data.time, "Time does not match data");
136+ compare(loader.item.time, timeFormatter.timeString, "Time does not match data");
129 compare(loader.item.message, data.message, "Message does not match data");
137 compare(loader.item.message, data.message, "Message does not match data");
130 compare(loader.item.avatar, data.avatar, "Avatar does not match data");
138 compare(loader.item.avatar, data.avatar, "Avatar does not match data");
131 compare(loader.item.appIcon, data.appIcon, "App icon does not match data");
139 compare(loader.item.appIcon, data.appIcon, "App icon does not match data");
@@ -160,13 +168,14 @@ Item {
160 ]
168 ]
161 };
169 };
162 factory.menuData = menuData;
170 factory.menuData = menuData;
171+ timeFormatter.time = data.time;
163
172
164 var loader = findChild(factory, "loader");
173 var loader = findChild(factory, "loader");
165 verify(loader !== undefined);
174 verify(loader !== undefined);
166
175
167 tryCompare(loader.item, "objectName", "snapDecision");
176 tryCompare(loader.item, "objectName", "snapDecision");
168 compare(loader.item.title, data.title, "Title does not match data");
177 compare(loader.item.title, data.title, "Title does not match data");
169− compare(loader.item.time, data.time, "Time does not match data");
178+ compare(loader.item.time, timeFormatter.timeString, "Time does not match data");
170 compare(loader.item.message, data.message, "Message does not match data");
179 compare(loader.item.message, data.message, "Message does not match data");
171 compare(loader.item.avatar, data.avatar, "Avatar does not match data");
180 compare(loader.item.avatar, data.avatar, "Avatar does not match data");
172 compare(loader.item.appIcon, data.appIcon, "App icon does not match data");
181 compare(loader.item.appIcon, data.appIcon, "App icon does not match data");
tests/qmltests/Panel/tst_IndicatorRow.qml+66−164
@@ -32,8 +32,10 @@ Item {
32
32
33 function init_test()
33 function init_test()
34 {
34 {
35+ indicatorModel.load();
36+
35 indicatorRow.state = "initial";
37 indicatorRow.state = "initial";
36− indicatorRow.currentItem = null;
38+ indicatorRow.setCurrentItemIndex(-1);
37 indicatorRow.unitProgress = 0.0;
39 indicatorRow.unitProgress = 0.0;
38 }
40 }
39
41
@@ -49,210 +51,110 @@ Item {
49 }
51 }
50
52
51 indicatorsModel: indicatorModel
53 indicatorsModel: indicatorModel
54+
55+ Component.onCompleted: indicatorModel.load()
52 }
56 }
53
57
54 Indicators.IndicatorsModel {
58 Indicators.IndicatorsModel {
55 id: indicatorModel
59 id: indicatorModel
56− Component.onCompleted: load()
57 }
60 }
58
61
59 UT.UnityTestCase {
62 UT.UnityTestCase {
60 name: "IndicatorRow"
63 name: "IndicatorRow"
61 when: windowShown
64 when: windowShown
62
65
66+ function get_indicator_item(index) {
67+ return findChild(indicatorRow.row, "item" + index);
68+ }
69+
63 function test_set_current_item() {
70 function test_set_current_item() {
64 init_test();
71 init_test();
65− indicatorRow.setCurrentItem(0);
72+ indicatorRow.setCurrentItemIndex(0);
66 compare(indicatorRow.indicatorsModel.get(indicatorRow.currentItemIndex).identifier, "indicator-fake1", "Incorrect item at position 0");
73 compare(indicatorRow.indicatorsModel.get(indicatorRow.currentItemIndex).identifier, "indicator-fake1", "Incorrect item at position 0");
67
74
68− indicatorRow.setCurrentItem(1);
75+ indicatorRow.setCurrentItemIndex(1);
69 compare(indicatorRow.indicatorsModel.get(indicatorRow.currentItemIndex).identifier, "indicator-fake2", "Incorrect item at position 1");
76 compare(indicatorRow.indicatorsModel.get(indicatorRow.currentItemIndex).identifier, "indicator-fake2", "Incorrect item at position 1");
70
77
71− indicatorRow.setCurrentItem(2);
78+ indicatorRow.setCurrentItemIndex(2);
72 compare(indicatorRow.indicatorsModel.get(indicatorRow.currentItemIndex).identifier, "indicator-fake3", "Incorrect item at position 2");
79 compare(indicatorRow.indicatorsModel.get(indicatorRow.currentItemIndex).identifier, "indicator-fake3", "Incorrect item at position 2");
73 }
80 }
74− }
75−
76− UT.UnityTestCase {
77− name: "IndicatorRow_IconPosition"
78− when: windowShown
79
81
80− function get_indicator_item_at(index) {
82+ function test_highlight_data() {
81− return findChild(indicatorRow, "rowRepeater").itemAt(index);
83+ return [
84+ { index: 0, progress: 0.0, current: false, other: false },
85+ { index: 0, progress: 0.1, current: true, other: false },
86+ { index: 0, progress: 0.5, current: true, other: false },
87+ { index: 0, progress: 1.0, current: true, other: false },
88+ { index: 2, progress: 0.0, current: false, other: false },
89+ { index: 2, progress: 0.1, current: true, other: false },
90+ { index: 2, progress: 0.5, current: true, other: false },
91+ { index: 2, progress: 1.0, current: true, other: false }
92+ ];
82 }
93 }
83
94
84− function test_current_item_commit() {
95+ function test_highlight(data) {
85 init_test();
96 init_test();
86
97
87− indicatorRow.setCurrentItem(2);
98+ indicatorRow.unitProgress = data.progress;
88− indicatorRow.state = "commit";
99+ indicatorRow.setCurrentItemIndex(data.index);
89− tryCompare(get_indicator_item_at(0), "opacity", 0.0);
90− tryCompare(get_indicator_item_at(1), "opacity", 0.0);
91− tryCompare(get_indicator_item_at(2), "opacity", 1.0);
92− tryCompare(get_indicator_item_at(3), "opacity", 0.0);
93− tryCompare(get_indicator_item_at(4), "opacity", 0.0);
94− }
95− }
96
100
97− UT.UnityTestCase {
101+ compare(indicatorRow.currentItem.highlighted, data.current, "Indicator hightlight did not match for current item");
98− name: "IndicatorRow_Highlight"
99− when: windowShown
100
102
101− function get_indicator_item_at(index) {
103+ for (var i = 0; i < indicatorRow.row.count; i++) {
102− return findChild(indicatorRow, "rowRepeater").itemAt(index);
104+ compare(get_indicator_item(i).highlighted, i === data.index ? data.current: data.other, "Indicator hightlight did not match for item iter");
105+ }
103 }
106 }
104
107
105− function test_intial_state() {
108+ function test_opacity_data() {
106− init_test();
109+ return [
107−
110+ { index: 0, progress: 0.0, current: 1.0, other: 1.0 },
108− indicatorRow.state = "initial";
111+ { index: 0, progress: 0.1, current: 1.0, other: 0.9 },
109− indicatorRow.setCurrentItem(0);
112+ { index: 0, progress: 0.5, current: 1.0, other: 0.5 },
110−
113+ { index: 0, progress: 1.0, current: 1.0, other: 0.0 },
111− compare(indicatorRow.currentItem.highlighted, false, "Indicator should not highlight when in initial state");
114+ { index: 2, progress: 0.0, current: 1.0, other: 1.0 },
112− compare(get_indicator_item_at(1).highlighted, false, "Other indicators should not highlight when in initial state");
115+ { index: 2, progress: 0.1, current: 1.0, other: 0.9 },
113− compare(get_indicator_item_at(2).highlighted, false, "Other indicators should not highlight when in initial state");
116+ { index: 2, progress: 0.5, current: 1.0, other: 0.5 },
114− compare(get_indicator_item_at(3).highlighted, false, "Other indicators should not highlight when in initial state");
117+ { index: 2, progress: 1.0, current: 1.0, other: 0.0 }
115− compare(get_indicator_item_at(4).highlighted, false, "Other indicators should not highlight when in initial state");
118+ ];
116 }
119 }
117
120
118− function test_hint_state() {
121+ function test_opacity(data) {
119 init_test();
122 init_test();
120
123
121− indicatorRow.state = "hint";
124+ indicatorRow.unitProgress = data.progress;
122− indicatorRow.setCurrentItem(0);
125+ indicatorRow.setCurrentItemIndex(data.index);
123
126
124− compare(indicatorRow.currentItem.highlighted, true, "Indicator should highlight when in hint state");
127+ tryCompare(indicatorRow.currentItem, "opacity", data.current);
125− compare(get_indicator_item_at(1).highlighted, false, "Other indicators should not highlight when in hint state");
126− compare(get_indicator_item_at(2).highlighted, false, "Other indicators should not highlight when in hint state");
127− compare(get_indicator_item_at(3).highlighted, false, "Other indicators should not highlight when in hint state");
128− compare(get_indicator_item_at(4).highlighted, false, "Other indicators should not highlight when in hint state");
129− }
130−
131− function test_revealed_state() {
132− init_test();
133−
134− indicatorRow.state = "reveal";
135− indicatorRow.setCurrentItem(0);
136−
137− compare(indicatorRow.currentItem.highlighted, true, "Indicator should highlight when in reveal state");
138− compare(get_indicator_item_at(1).highlighted, false, "Other indicators should not highlight when in commit state");
139− compare(get_indicator_item_at(2).highlighted, false, "Other indicators should not highlight when in commit state");
140− compare(get_indicator_item_at(3).highlighted, false, "Other indicators should not highlight when in commit state");
141− compare(get_indicator_item_at(4).highlighted, false, "Other indicators should not highlight when in commit state");
142− }
143−
144− function test_commit_state() {
145− init_test();
146−
147− indicatorRow.state = "commit";
148− indicatorRow.setCurrentItem(0);
149
128
150− compare(indicatorRow.currentItem.highlighted, true, "Indicator should highlight when in commit state");
129+ for (var i = 0; i < indicatorRow.row.count; i++) {
151− compare(get_indicator_item_at(1).highlighted, false, "Other indicators should not highlight when in commit state");
130+ tryCompare(get_indicator_item(i), "opacity", i === data.index ? data.current: data.other);
152− compare(get_indicator_item_at(2).highlighted, false, "Other indicators should not highlight when in commit state");
131+ }
153− compare(get_indicator_item_at(3).highlighted, false, "Other indicators should not highlight when in commit state");
154− compare(get_indicator_item_at(4).highlighted, false, "Other indicators should not highlight when in commit state");
155 }
132 }
156
133
157− function test_locked_state() {
134+ function test_dimmed_data() {
158− init_test();
135+ return [
159−
136+ { index: 0, progress: 0.0, current: false, other: false },
160− indicatorRow.state = "locked";
137+ { index: 0, progress: 0.1, current: false, other: true },
161− indicatorRow.setCurrentItem(0);
138+ { index: 0, progress: 0.5, current: false, other: true },
162−
139+ { index: 0, progress: 1.0, current: false, other: true },
163− compare(indicatorRow.currentItem.highlighted, true, "Indicator should highlight when in locked state");
140+ { index: 2, progress: 0.0, current: false, other: false },
164− compare(get_indicator_item_at(1).highlighted, false, "Other indicators should not highlight when in locked state");
141+ { index: 2, progress: 0.1, current: false, other: true },
165− compare(get_indicator_item_at(2).highlighted, false, "Other indicators should not highlight when in locked state");
142+ { index: 2, progress: 0.5, current: false, other: true },
166− compare(get_indicator_item_at(3).highlighted, false, "Other indicators should not highlight when in locked state");
143+ { index: 2, progress: 1.0, current: false, other: true }
167− compare(get_indicator_item_at(4).highlighted, false, "Other indicators should not highlight when in locked state");
144+ ];
168 }
145 }
169
146
170− function test_opacity() {
147+ function test_dimmed(data) {
171 init_test();
148 init_test();
172
149
173− indicatorRow.state = "reveal";
150+ indicatorRow.unitProgress = data.progress;
174− indicatorRow.unitProgress = 0.5;
151+ indicatorRow.setCurrentItemIndex(data.index);
175− indicatorRow.setCurrentItem(2);
176−
177− compare(get_indicator_item_at(0).opacity, 0.5, "Other indicator opacity should change in response to panel progress");
178− compare(get_indicator_item_at(1).opacity, 0.5, "Other indicator opacity should change in response to panel progress");
179− compare(get_indicator_item_at(2).opacity, 1.0, "Current indicator should not change in response to panel progress");
180− compare(get_indicator_item_at(3).opacity, 0.5, "Other indicator opacity should change in response to panel progress");
181− compare(get_indicator_item_at(4).opacity, 0.5, "Other indicator opacity should change in response to panel progress");
182− }
183− }
184−
185− UT.UnityTestCase {
186− name: "IndicatorRow_Dimmed"
187− when: windowShown
188−
189− function get_indicator_item_at(index) {
190− return findChild(indicatorRow, "rowRepeater").itemAt(index);
191− }
192−
193− function test_intial_state() {
194− init_test();
195−
196− indicatorRow.state = "initial";
197− indicatorRow.setCurrentItem(0);
198−
199− compare(get_indicator_item_at(0).dimmed, false, "Current indicator should not dim when in intiial state");
200− compare(get_indicator_item_at(1).dimmed, false, "Other indicators should not dim when in initial state");
201− compare(get_indicator_item_at(2).dimmed, false, "Other indicators should not dim when in initial state");
202− compare(get_indicator_item_at(3).dimmed, false, "Other indicators should not dim when in initial state");
203− compare(get_indicator_item_at(4).dimmed, false, "Other indicators should not dim when in initial state");
204− }
205−
206− function test_hint_state() {
207− init_test();
208−
209− indicatorRow.state = "hint";
210− indicatorRow.setCurrentItem(0);
211−
212− compare(get_indicator_item_at(0).dimmed, false, "Current indicator should not dim when in hint state");
213− compare(get_indicator_item_at(1).dimmed, true, "Other indicators should dim when in hint state");
214− compare(get_indicator_item_at(2).dimmed, true, "Other indicators should dim when in hint state");
215− compare(get_indicator_item_at(3).dimmed, true, "Other indicators should dim when in hint state");
216− compare(get_indicator_item_at(4).dimmed, true, "Other indicators should dim when in hint state");
217− }
218−
219− function test_revealed_state() {
220− init_test();
221−
222− indicatorRow.state = "reveal";
223− indicatorRow.setCurrentItem(0);
224−
225− compare(get_indicator_item_at(0).dimmed, false, "Current indicator should not dim when in reveal state");
226− compare(get_indicator_item_at(1).dimmed, true, "Other indicators should dim when in reveal state");
227− compare(get_indicator_item_at(2).dimmed, true, "Other indicators should dim when in reveal state");
228− compare(get_indicator_item_at(3).dimmed, true, "Other indicators should dim when in reveal state");
229− compare(get_indicator_item_at(4).dimmed, true, "Other indicators should dim when in reveal state");
230− }
231−
232− function test_commit_state() {
233− init_test();
234−
235− indicatorRow.state = "commit";
236− indicatorRow.setCurrentItem(0);
237−
238− compare(get_indicator_item_at(0).dimmed, false, "Current indicator should not dim when in commit state");
239− compare(get_indicator_item_at(1).dimmed, true, "Other indicators should dim when in commit state");
240− compare(get_indicator_item_at(2).dimmed, true, "Other indicators should dim when in commit state");
241− compare(get_indicator_item_at(3).dimmed, true, "Other indicators should dim when in commit state");
242− compare(get_indicator_item_at(4).dimmed, true, "Other indicators should dim when in commit state");
243− }
244−
245− function test_locked_state() {
246− init_test();
247
152
248− indicatorRow.state = "locked";
153+ compare(indicatorRow.currentItem.dimmed, data.current, "Indicator dim did not match for current item");
249− indicatorRow.setCurrentItem(0);
250
154
251− compare(get_indicator_item_at(0).dimmed, false, "Current indicator should not dim when in locked state");
155+ for (var i = 0; i < indicatorRow.row.count; i++) {
252− compare(get_indicator_item_at(1).dimmed, true, "Other indicators should dim when in locked state");
156+ compare(get_indicator_item(i).dimmed, i === data.index ? data.current: data.other, "Indicator dim did not match for item iter");
253− compare(get_indicator_item_at(2).dimmed, true, "Other indicators should dim when in locked state");
157+ }
254− compare(get_indicator_item_at(3).dimmed, true, "Other indicators should dim when in locked state");
255− compare(get_indicator_item_at(4).dimmed, true, "Other indicators should dim when in locked state");
256 }
158 }
257 }
159 }
258}
160}
tests/qmltests/Panel/tst_Indicators.qml+78−19
@@ -83,6 +83,8 @@ Item {
83 when: windowShown
83 when: windowShown
84
84
85 function init() {
85 function init() {
86+ indicators.initialise();
87+
86 indicators.hide();
88 indicators.hide();
87 tryCompare(indicators.hideAnimation, "running", false);
89 tryCompare(indicators.hideAnimation, "running", false);
88 tryCompare(indicators, "state", "initial");
90 tryCompare(indicators, "state", "initial");
@@ -101,21 +103,23 @@ Item {
101 // tests changing the lateral position of the revealer activates the correct indicator items.
103 // tests changing the lateral position of the revealer activates the correct indicator items.
102
104
103 var indicatorRow = findChild(indicators, "indicatorRow")
105 var indicatorRow = findChild(indicators, "indicatorRow")
104− var rowRepeater = findChild(indicators, "rowRepeater")
106+ verify(indicatorRow !== null);
107+ var indicatorRowItems = findChild(indicatorRow, "indicatorRowItems");
108+ verify(indicatorRowItems !== null);
105
109
106− for (var i = 0; i < rowRepeater.count; i++) {
110+ for (var i = 0; i < indicatorRowItems.count; i++) {
107− var indicatorItem = rowRepeater.itemAt(i);
111+ var indicatorItem = findChild(indicatorRowItems, "item" + i);
108
112
109 if (!indicatorItem.visible)
113 if (!indicatorItem.visible)
110 continue;
114 continue;
111
115
112 var indicatorPosition = indicators.mapFromItem(indicatorItem,
116 var indicatorPosition = indicators.mapFromItem(indicatorItem,
113− indicatorItem.width/2, indicatorItem.height/2)
117+ indicatorItem.width/2, indicatorItem.height/2);
114
118
115 touchFlick(indicators,
119 touchFlick(indicators,
116 indicatorPosition.x, indicatorPosition.y,
120 indicatorPosition.x, indicatorPosition.y,
117 indicatorPosition.x, indicators.openedHeight * 0.4,
121 indicatorPosition.x, indicators.openedHeight * 0.4,
118− true /* beginTouch */, false /* endTouch */)
122+ true /* beginTouch */, false /* endTouch */);
119
123
120 compare(indicatorRow.currentItem, indicatorItem,
124 compare(indicatorRow.currentItem, indicatorItem,
121 "Incorrect item activated at position " + i);
125 "Incorrect item activated at position " + i);
@@ -123,10 +127,10 @@ Item {
123 touchFlick(indicators,
127 touchFlick(indicators,
124 indicatorPosition.x, indicators.openedHeight * 0.4,
128 indicatorPosition.x, indicators.openedHeight * 0.4,
125 indicatorPosition.x, indicatorPosition.y,
129 indicatorPosition.x, indicatorPosition.y,
126− false /* beginTouch */, true /* endTouch */)
130+ false /* beginTouch */, true /* endTouch */);
127
131
128 // wait until fully closed
132 // wait until fully closed
129− tryCompare(indicators, "height", indicators.panelHeight)
133+ tryCompare(indicators, "height", indicators.panelHeight);
130 }
134 }
131 }
135 }
132
136
@@ -139,20 +143,20 @@ Item {
139 function test_progress_changes_state_to_not_initial() {
143 function test_progress_changes_state_to_not_initial() {
140 indicators.height = indicators.openedHeight / 2
144 indicators.height = indicators.openedHeight / 2
141 compare(indicators.state!="initial", true,
145 compare(indicators.state!="initial", true,
142− "Indicators should not be in initial state when partially opened.")
146+ "Indicators should not be in initial state when partially opened.");
143 }
147 }
144
148
145 function test_progress_changes_state_to_locked() {
149 function test_progress_changes_state_to_locked() {
146 indicators.height = indicators.openedHeight - indicators.panelHeight
150 indicators.height = indicators.openedHeight - indicators.panelHeight
147− compare(indicators.state, "locked", "Indicators should be locked when fully opened.")
151+ compare(indicators.state, "locked", "Indicators should be locked when fully opened.");
148 }
152 }
149
153
150 function test_partially_open() {
154 function test_partially_open() {
151 indicators.height = indicators.openedHeight / 2
155 indicators.height = indicators.openedHeight / 2
152 compare(indicators.partiallyOpened, true,
156 compare(indicators.partiallyOpened, true,
153− "Indicator should show as partially opened when height is half of openedHeight")
157+ "Indicator should show as partially opened when height is half of openedHeight");
154 compare(indicators.fullyOpened, false,
158 compare(indicators.fullyOpened, false,
155− "Indicator should not show as fully opened when height is half of openedHeight")
159+ "Indicator should not show as fully opened when height is half of openedHeight");
156 }
160 }
157
161
158 function test_fully_open() {
162 function test_fully_open() {
@@ -161,21 +165,76 @@ Item {
161 compare(indicators.fullyOpened, true);
165 compare(indicators.fullyOpened, true);
162 }
166 }
163
167
168+ function init_invisible_indicator(identifier) {
169+ tryCompareFunction(function() { return findChild(indicators, identifier+"-delegate") !== undefined }, true);
170+ var item = findChild(indicators, identifier+"-delegate");
171+
172+ item.enabled = false;
173+ }
174+
164 function test_row_visible_menuContent_visible_data() { return [
175 function test_row_visible_menuContent_visible_data() { return [
165− {tag: "visible", index: 0, name: "indicator-fake1", visible: true },
176+ {tag: "first", visible: [false, true, true, true, true] },
166− {tag: "invisible", index: 1, name: "indicator-fake2", visible: false }]
177+ {tag: "adjacent", visible: [true, false, false, true, true] },
178+ {tag: "bounds", visible: [false, true, true, true, false] },
179+ {tag: "disjoint", visible: [true, false, true, false, true] },
180+ {tag: "last", visible: [true, true, true, true, false] }];
167 }
181 }
168
182
169 function test_row_visible_menuContent_visible(data) {
183 function test_row_visible_menuContent_visible(data) {
184+ indicators.show();
185+
186+ var indicatorTabs = findChild(indicators, "tabs");
187+ var indicatorRowItems = findChild(indicators, "indicatorRowItems");
188+
189+ var count = data.visible.length
190+ for (var i = 0; i< data.visible.length; i++) {
191+ if (data.visible[i] === false) {
192+ init_invisible_indicator("indicator-fake" + (i + 1));
193+ count--;
194+ }
195+ }
196+
197+ tryCompare(indicatorRowItems, "count", count);
198+
199+ for (i = 0; i < data.visible.length; i++) {
200+ var widgetName = "indicator-fake" + (i + 1 + "-widget");
201+ var pageName = "indicator-fake" + (i + 1 + "-page");
202+
203+ // check for item
204+ tryCompareFunction(function() { return findChild(indicatorRowItems, widgetName) !== null }, data.visible[i]);
205+
206+ // check for tab
207+ tryCompareFunction(function() { return findChild(indicatorTabs, pageName) !== null }, data.visible[i]);
208+ }
209+ }
210+
211+ function test_indicator_visible_correct_tabs_data() { return [
212+ {tag: "current-first", currentIndex: 0, visible: [false, true, true, true, true], expectedIndex: 0, expectedTab: "indicator-fake2" },
213+ {tag: "current-last", currentIndex: 4, visible: [true, true, true, true, false], expectedIndex: 3, expectedTab: "indicator-fake4" },
214+ {tag: "after", currentIndex: 0, visible: [true, false, true, true, true], expectedIndex: 0, expectedTab: "indicator-fake1" },
215+ {tag: "before", currentIndex: 1, visible: [false, true, true, true, true], expectedIndex: 1, expectedTab: "indicator-fake2" }];
216+ }
217+
218+ function test_indicator_visible_correct_tabs(data) {
170 var indicatorTabs = findChild(indicators, "tabs");
219 var indicatorTabs = findChild(indicators, "tabs");
171− var rowRepeater = findChild(indicators, "rowRepeater");
220+ var indicatorRow = findChild(indicators, "indicatorRow");
221+
222+ indicators.show();
223+ indicatorRow.setCurrentItemIndex(data.currentIndex);
224+ tryCompare(indicators, "fullyOpened", true);
225+
226+ for (var i = 0; i< data.visible.length; i++) {
227+ if (data.visible[i] === false) {
228+ init_invisible_indicator("indicator-fake" + (i + 1));
229+ }
230+ }
231+
232+ // check for current selected item
233+ tryCompare(indicatorRow, "currentItemIndex", data.expectedIndex);
172
234
173− var indicatorItem = rowRepeater.itemAt(data.index);
235+ // check for current selected tab
174− tryCompareFunction(function() { return indicatorItem.width > 0}, true);
236+ tryCompareFunction(function() { return findChild(indicatorTabs, data.expectedTab) === indicatorTabs.selectedTab }, true);
175− tryCompare(indicatorItem, "visible", data.visible);
176
237
177− var indicatorTab = findChild(indicatorTabs, data.name)
178− tryCompareFunction(function() { return indicatorTab !== undefined }, data.visible);
179 }
238 }
180 }
239 }
181}
240}
tests/qmltests/Panel/tst_MenuContent.qml+8−16
@@ -27,11 +27,11 @@ Item {
27 height: units.gu(70)
27 height: units.gu(70)
28
28
29 property var indicator_status: {
29 property var indicator_status: {
30− 'menu_page1': { 'started': false, 'reset': 0 },
30+ 'indicator-fake1-page': { 'started': false, 'reset': 0 },
31− 'menu_page2': { 'started': false, 'reset': 0 },
31+ 'indicator-fake2-page': { 'started': false, 'reset': 0 },
32− 'menu_page3': { 'started': false, 'reset': 0 },
32+ 'indicator-fake3-page': { 'started': false, 'reset': 0 },
33− 'menu_page4': { 'started': false, 'reset': 0 },
33+ 'indicator-fake4-page': { 'started': false, 'reset': 0 },
34− 'menu_page5': { 'started': false, 'reset': 0 }
34+ 'indicator-fake5-page': { 'started': false, 'reset': 0 }
35 }
35 }
36
36
37 // Dummy objects
37 // Dummy objects
@@ -49,14 +49,6 @@ Item {
49 indicatorsModel: indicatorsModel
49 indicatorsModel: indicatorsModel
50 contentReleaseInterval: 50
50 contentReleaseInterval: 50
51 height: parent.height - 50
51 height: parent.height - 50
52−
53− visibleIndicators: {
54− 'indicator-fake1': true,
55− 'indicator-fake2': true,
56− 'indicator-fake3': true,
57− 'indicator-fake4': true,
58− 'indicator-fake5': true
59− }
60 }
52 }
61
53
62 Rectangle {
54 Rectangle {
@@ -96,20 +88,20 @@ Item {
96 }
88 }
97
89
98 function get_test_menu_objecName(index) {
90 function get_test_menu_objecName(index) {
99− return "menu_page"+(index+1);
91+ return "indicator-fake" + (index + 1) + "-page";
100 }
92 }
101
93
102 property string testTabObjectName : ""
94 property string testTabObjectName : ""
103
95
104 function selected_tab_equals_test_tab() {
96 function selected_tab_equals_test_tab() {
105 var currentTab = menu_content_test.findChild(menuContent, "tabs").selectedTab
97 var currentTab = menu_content_test.findChild(menuContent, "tabs").selectedTab
106− if (currentTab == undefined) {
98+ if (currentTab === null) {
107 console.log("selected tab undefined");
99 console.log("selected tab undefined");
108 return false;
100 return false;
109 }
101 }
110
102
111 var testTab = menu_content_test.findChild(menuContent, testTabObjectName);
103 var testTab = menu_content_test.findChild(menuContent, testTabObjectName);
112− if (testTab == undefined) {
104+ if (testTab === null) {
113 console.log("test_tab " + testTabObjectName + " undefined");
105 console.log("test_tab " + testTabObjectName + " undefined");
114 return false;
106 return false;
115 }
107 }
tests/qmltests/Panel/tst_Panel.qml+21−21
@@ -56,6 +56,8 @@ Item {
56 }
56 }
57
57
58 function init() {
58 function init() {
59+ panel.indicators.initialise();
60+
59 searchClicked = false;
61 searchClicked = false;
60 panel.indicators.hide();
62 panel.indicators.hide();
61 tryCompare(panel.indicators.hideAnimation, "running", false);
63 tryCompare(panel.indicators.hideAnimation, "running", false);
@@ -63,17 +65,18 @@ Item {
63 }
65 }
64
66
65 function get_indicator_item(index) {
67 function get_indicator_item(index) {
66− var rowRepeater = findChild(panel.indicators, "rowRepeater");
68+ var indicatorRow = findChild(panel.indicators, "indicatorRow");
67− verify(rowRepeater != undefined);
69+ verify(indicatorRow !== null);
68− return rowRepeater.itemAt(index);
70+
71+ return findChild(indicatorRow.row, "item" + index);
69 }
72 }
70
73
71 function get_indicator_item_position(index) {
74 function get_indicator_item_position(index) {
72 var indicatorRow = findChild(panel.indicators, "indicatorRow");
75 var indicatorRow = findChild(panel.indicators, "indicatorRow");
73− verify(indicatorRow != undefined);
76+ verify(indicatorRow !== null);
74
77
75 var indicatorItem = get_indicator_item(index);
78 var indicatorItem = get_indicator_item(index);
76− verify(indicatorItem != undefined);
79+ verify(indicatorItem !== null);
77
80
78 return panel.mapFromItem(indicatorItem, indicatorItem.width/2, indicatorItem.height/2);
81 return panel.mapFromItem(indicatorItem, indicatorItem.width/2, indicatorItem.height/2);
79 }
82 }
@@ -118,7 +121,7 @@ Item {
118 // no hint animation when fullscreen
121 // no hint animation when fullscreen
119 compare(panel.indicators.y, -panel.panelHeight);
122 compare(panel.indicators.y, -panel.panelHeight);
120 var indicatorRow = findChild(panel.indicators, "indicatorRow");
123 var indicatorRow = findChild(panel.indicators, "indicatorRow");
121− verify(indicatorRow != undefined);
124+ verify(indicatorRow !== null);
122 compare(indicatorRow.y, 0);
125 compare(indicatorRow.y, 0);
123 compare(panel.indicators.height, panel.indicators.panelHeight);
126 compare(panel.indicators.height, panel.indicators.panelHeight);
124 compare(panel.indicators.partiallyOpened, false,
127 compare(panel.indicators.partiallyOpened, false,
@@ -142,14 +145,14 @@ Item {
142 tryCompare(panel.indicators, "fullyOpened", true);
145 tryCompare(panel.indicators, "fullyOpened", true);
143 }
146 }
144
147
145− var indicatorRow = findChild(panel.indicators, "indicatorRow");
148+ var indicatorRow = findChild(panel.indicators, "indicatorRow");
146− verify(indicatorRow != undefined);
149+ verify(indicatorRow !== null);
147
150
148− var rowRepeater = findChild(panel.indicators, "rowRepeater");
151+ var menuContent = findChild(panel.indicators, "menuContent");
149− verify(indicatorRow != undefined);
152+ verify(indicatorRow !== null);
150
153
151 var menuContent = findChild(panel.indicators, "menuContent");
154 var menuContent = findChild(panel.indicators, "menuContent");
152− verify(indicatorRow != undefined);
155+ verify(indicatorRow !== null);
153
156
154 // Wait for the indicators to get into position.
157 // Wait for the indicators to get into position.
155 // (switches between normal and fullscreen modes are animated)
158 // (switches between normal and fullscreen modes are animated)
@@ -160,10 +163,10 @@ Item {
160 }
163 }
161
164
162 // do this for each indicator item
165 // do this for each indicator item
163− for (var i = 0; i < rowRepeater.count; i++) {
166+ for (var i = 0; i < indicatorRow.row.count; i++) {
164
167
165 var indicatorItem = get_indicator_item(i);
168 var indicatorItem = get_indicator_item(i);
166− verify(indicatorItem != undefined);
169+ verify(indicatorItem !== null);
167
170
168 if (!indicatorItem.visible)
171 if (!indicatorItem.visible)
169 continue;
172 continue;
@@ -203,7 +206,7 @@ Item {
203 panel.searchVisible = true;
206 panel.searchVisible = true;
204
207
205 var searchIndicator = findChild(panel, "search");
208 var searchIndicator = findChild(panel, "search");
206− verify(searchIndicator != undefined);
209+ verify(searchIndicator !== null);
207
210
208 tap(searchIndicator, 1, 1);
211 tap(searchIndicator, 1, 1);
209
212
@@ -216,7 +219,7 @@ Item {
216 panel.searchVisible = false;
219 panel.searchVisible = false;
217
220
218 var searchIndicator = findChild(panel, "search");
221 var searchIndicator = findChild(panel, "search");
219− verify(searchIndicator != undefined);
222+ verify(searchIndicator !== null);
220
223
221 tap(searchIndicator, 1, 1);
224 tap(searchIndicator, 1, 1);
222
225
@@ -232,17 +235,14 @@ Item {
232 panel.searchVisible = false;
235 panel.searchVisible = false;
233
236
234 var indicatorRow = findChild(panel.indicators, "indicatorRow");
237 var indicatorRow = findChild(panel.indicators, "indicatorRow");
235− verify(indicatorRow != undefined);
238+ verify(indicatorRow !== null);
236−
237− var rowRepeater = findChild(panel.indicators, "rowRepeater");
238− verify(indicatorRow != undefined);
239
239
240 // Get the first indicator
240 // Get the first indicator
241 var indicatorItemFirst = get_indicator_item(0);
241 var indicatorItemFirst = get_indicator_item(0);
242− verify(indicatorItemFirst != undefined);
242+ verify(indicatorItemFirst !== null);
243
243
244 var indicatorItemCoordFirst = get_indicator_item_position(0);
244 var indicatorItemCoordFirst = get_indicator_item_position(0);
245− var indicatorItemCoordNext = get_indicator_item_position(indicatorRow.count - 1);
245+ var indicatorItemCoordNext = get_indicator_item_position(indicatorRow.row.count - 1);
246
246
247 touchPress(panel,
247 touchPress(panel,
248 indicatorItemCoordFirst.x, panel.panelHeight / 2);
248 indicatorItemCoordFirst.x, panel.panelHeight / 2);
tests/qmltests/tst_Shell.qml+3−3
@@ -71,14 +71,14 @@ Item {
71 var dashContentList = findChild(shell, "dashContentList");
71 var dashContentList = findChild(shell, "dashContentList");
72 waitForRendering(dashContentList);
72 waitForRendering(dashContentList);
73 var homeLoader = findChild(dashContentList, "home.scope loader");
73 var homeLoader = findChild(dashContentList, "home.scope loader");
74− ok = homeLoader !== undefined
74+ ok = homeLoader !== null
75 && homeLoader.item !== undefined;
75 && homeLoader.item !== undefined;
76
76
77 var dashHome = findChild(shell, "DashHome");
77 var dashHome = findChild(shell, "DashHome");
78− ok &= dashHome !== undefined;
78+ ok &= dashHome !== null;
79
79
80 var launcherPanel = findChild(shell, "launcherPanel");
80 var launcherPanel = findChild(shell, "launcherPanel");
81− ok &= launcherPanel !== undefined;
81+ ok &= launcherPanel !== null;
82
82
83 attempts++;
83 attempts++;
84 if (!ok) {
84 if (!ok) {
tests/utils/modules/Unity/Test/UnityTestCase.qml+2−2
@@ -83,7 +83,7 @@ TestCase {
83 }
83 }
84 childs.splice(0, 1);
84 childs.splice(0, 1);
85 }
85 }
86− return undefined;
86+ return null;
87 }
87 }
88
88
89 // Find an object with the given name in the children tree of "obj"
89 // Find an object with the given name in the children tree of "obj"
@@ -103,7 +103,7 @@ TestCase {
103 }
103 }
104 childs.splice(0, 1);
104 childs.splice(0, 1);
105 }
105 }
106− return undefined;
106+ return null;
107 }
107 }
108
108
109 // Type a full string instead of keyClick letter by letter
109 // Type a full string instead of keyClick letter by letter