on xenial help sign in
Merge from trunk
commit4f2dddb4906aa20f2edbde6695649f95f0cede87 authorMichael Terry <michael.terry@canonical.com> dateMon 10 Feb 2014, 15:28 (13 years ago) parentb98b649c87b241
156 files changed+8419−2682
CMakeLists.txt+5 build+1 data/unity8.conf+3 data/unity8.desktop.in−1 data/unity8.override−1 debian/changelog+177 debian/control+17−3 debian/rules+4 debian/unity8-autopilot.install−1 debian/unity8-doc.install+1 debian/unity8-fake-env.install+1 doc/CMakeLists.txt+38 doc/Doxyfile.in+2317 plugins/DashViews/CMakeLists.txt+2−1 plugins/DashViews/abstractjournal.cpp → plugins/DashViews/abstractdashview.cpp+34−34 plugins/DashViews/abstractjournal.h → plugins/DashViews/abstractdashview.h+7−6 plugins/DashViews/horizontaljournal.cpp+4−3 plugins/DashViews/horizontaljournal.h+3−3 plugins/DashViews/organicgrid.cpp+268 plugins/DashViews/organicgrid.h+95 plugins/DashViews/plugin.cpp+2 plugins/DashViews/verticaljournal.cpp+4−3 plugins/DashViews/verticaljournal.h+3−3 plugins/Unity/Indicators/CMakeLists.txt−2 plugins/Unity/Indicators/Messaging/CMakeLists.txt−1 plugins/Unity/Indicators/Messaging/qml/ActionTextField.qml−69 plugins/Unity/Indicators/Messaging/qml/CMakeLists.txt−5 plugins/Unity/Indicators/Messaging/qml/GroupedMessage.qml−91 plugins/Unity/Indicators/Messaging/qml/HeroMessage.qml−123 plugins/Unity/Indicators/Messaging/qml/HeroMessageHeader.qml−161 plugins/Unity/Indicators/Messaging/qml/QuickReply.qml−165 plugins/Unity/Indicators/Messaging/qml/SimpleTextMessage.qml−108 plugins/Unity/Indicators/Messaging/qml/SnapDecision.qml−167 plugins/Unity/Indicators/Messaging/qml/TextMessage.qml−43 plugins/Unity/Indicators/Messaging/qml/qmldir−12 plugins/Unity/Indicators/Network/CMakeLists.txt−1 plugins/Unity/Indicators/Network/qml/AccessPoint.qml−117 plugins/Unity/Indicators/Network/qml/CMakeLists.txt−5 plugins/Unity/Indicators/Network/qml/qmldir−3 plugins/Unity/Indicators/qml/BaseMenuItem.qml−38 plugins/Unity/Indicators/qml/ButtonMenuItem.qml−44 plugins/Unity/Indicators/qml/DivMenuItem.qml−26 plugins/Unity/Indicators/qml/FramedMenuItem.qml−39 plugins/Unity/Indicators/qml/MenuItemFactory.qml+226−42 plugins/Unity/Indicators/Messaging/qml/MessageMenuItemFactory.qml → plugins/Unity/Indicators/qml/MessageMenuItemFactory.qml+69−28 plugins/Unity/Indicators/qml/ProgressMenuItem.qml−38 plugins/Unity/Indicators/qml/SectionMenuItem.qml−54 plugins/Unity/Indicators/qml/SliderMenuItem.qml−106 plugins/Unity/Indicators/qml/StandardMenuItem.qml−71 plugins/Unity/Indicators/qml/SwitchMenuItem.qml−53 plugins/Unity/Indicators/qml/qmldir+1−12 plugins/Unity/Indicators/resources/artwork/messaging/message_sms01_54px.png plugins/Unity/Indicators/resources/artwork/network/secure.svg−71 plugins/Unity/Indicators/resources/indicators.qrc−2 po/am.po+158 po/az.po+34−31 po/bg.po+39−31 po/bs.po+159 po/ckb.po+160 po/da.po+158 po/de.po+8−8 po/el.po+32−28 po/en_GB.po+28−26 po/es.po+7−6 po/eu.po+160 po/fo.po+5−5 po/fr.po+29−29 po/hi.po+158 po/hu.po+5−5 po/it.po+7−7 po/ja.po+20−20 po/lt.po+165 po/mr.po+158 po/ms.po+160 po/nl.po+29−27 po/pt.po+158 po/pt_BR.po+9−7 po/ru.po+9−6 po/sq.po+159 po/sw.po+158 po/tr.po+6−4 po/ug.po+7−7 po/vi.po+158 po/zh_HK.po+157 po/zh_TW.po+24−25 qml/Components/DragHandle.qml+7−7 qml/Components/FilterGrid.qml+6−8 qml/Components/PageHeader.qml+1 qml/Components/ResponsiveGridView.qml+1−1 qml/Dash/Apps/AppPreview.qml+1 qml/Dash/Card.qml+17−15 qml/Dash/CardHeader.qml+28−7 qml/Dash/CardTool.qml+136 qml/Dash/DashPreview.qml+2 qml/Dash/Generic/GenericPreview.qml+2−1 qml/Dash/GenericScopeView.qml+8−2 qml/Dash/graphics/checkers.png qml/Panel/IndicatorItem.qml+1−1 qml/Panel/IndicatorRow.qml+73−91 qml/Panel/Indicators.qml+56−54 qml/Panel/Indicators/DefaultIndicatorPage.qml+9−5 plugins/Unity/Indicators/qml/HLine.qml → qml/Panel/Indicators/IndicatorDelegate.qml+12−7 qml/Panel/Indicators/VisibleIndicators.qml+84 qml/Panel/Indicators/client/IndicatorsList.qml+14−13 qml/Panel/MenuContent.qml+13−26 qml/Panel/Panel.qml+1−4 tests/autopilot/unity8/process_helpers.py+3−3 tests/autopilot/unity8/shell/emulators/__init__.py+1−1 tests/autopilot/unity8/shell/emulators/create_interactive_notification.py+1−1 tests/autopilot/unity8/shell/emulators/dash.py+72−3 tests/autopilot/unity8/shell/fixture_setup.py+53 tests/autopilot/unity8/shell/tests/test_emulators.py+98−3 tests/autopilot/unity8/shell/tests/test_notifications.py+3−6 tests/autopilot/unity8/shell/tests/test_system_integration.py+40 tests/mocks/Unity/CMakeLists.txt+9−2 tests/mocks/Unity/Indicators/IndicatorsModel.qml+7−10 tests/mocks/Unity/Indicators/qml/fake_menu_page1.qml−1 tests/mocks/Unity/Indicators/qml/fake_menu_page2.qml−1 tests/mocks/Unity/Indicators/qml/fake_menu_page3.qml−1 tests/mocks/Unity/Indicators/qml/fake_menu_page4.qml−1 tests/mocks/Unity/Indicators/qml/fake_menu_page5.qml−1 tests/mocks/Unity/Indicators/qml/fake_menu_widget2.qml+1−3 tests/mocks/Unity/Indicators/qml/fake_menu_widget3.qml+1−1 tests/mocks/Unity/fake_applications_scope.cpp+2−1 tests/mocks/Unity/fake_preview.cpp+5−3 tests/mocks/Unity/fake_preview.h+5−2 tests/mocks/Unity/fake_scope.cpp+3−2 tests/mocks/Unity/fake_scope.h+3−1 tests/plugins/DashViews/CMakeLists.txt+12−15 tests/plugins/DashViews/horizontaljournaltest.cpp+35−9 tests/plugins/DashViews/organicgridtest.cpp+531 tests/plugins/DashViews/organicgridtest.qml+43 tests/plugins/DashViews/organicgridtry.cpp+98 tests/plugins/DashViews/organicgridtry.qml+94 tests/plugins/DashViews/verticaljournaltest.cpp+32 tests/plugins/LightDM/CMakeLists.txt+1 tests/qmltests/CMakeLists.txt+1 tests/qmltests/Components/tst_DragHandle.cpp+65−10 tests/qmltests/Components/tst_FilterGrid.qml+44−5 tests/qmltests/Components/tst_ResponsiveGridView.qml+1−1 tests/qmltests/Dash/CardHelpers.js+45 tests/qmltests/Dash/tst_Card.qml+75−63 tests/qmltests/Dash/tst_CardHeader.qml+14−9 tests/qmltests/Dash/tst_CardTool.qml+300 tests/qmltests/Dash/tst_GenericPreview.qml+8 tests/qmltests/Dash/tst_GenericScopeView.qml+49−1 tests/qmltests/Greeter/tst_Lockscreen.qml+1−1 tests/qmltests/Panel/Indicators/tst_DefaultIndicatorPage.qml−4 tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+194−18 tests/qmltests/Panel/Indicators/tst_MessageMenuItemFactory.qml+13−4 tests/qmltests/Panel/tst_IndicatorRow.qml+66−164 tests/qmltests/Panel/tst_Indicators.qml+78−19 tests/qmltests/Panel/tst_MenuContent.qml+8−16 tests/qmltests/Panel/tst_Panel.qml+21−21 tests/qmltests/tst_Shell.qml+3−3 tests/utils/modules/Unity/Test/UnityTestCase.qml+2−2
CMakeLists.txt+5
@@ -121,3 +121,8 @@ add_subdirectory(data)
121121# Translation
122122#
123123add_subdirectory(po)
124+
125+#
126+# Documentation
127+#
128+add_subdirectory(doc)
build+1
@@ -45,6 +45,7 @@ install_dependencies() {
4545 qtdeclarative5-dee-plugin \
4646 qtdeclarative5-gsettings1.0 \
4747 qtdeclarative5-ubuntu-ui-toolkit-plugin \
48+ qtdeclarative5-ubuntu-settings-components \
4849 unity-notifications-impl \
4950 qtdeclarative5-xmllistmodel-plugin \
5051 ubuntu-mobile-icons \
data/unity8.conf+3
@@ -4,6 +4,8 @@ author "Ricardo Mendoza <ricmm@ubuntu.com>"
44start on ((xsession SESSION=ubuntu-touch) or (xsession SESSION=ubuntu-touch-surfaceflinger)) and started dbus
55stop on desktop-end
66
7+kill timeout 30
8+
79respawn
810expect stop
911
@@ -24,6 +26,7 @@ pre-start script
2426 # Point all future jobs in this session to our Mir socket instead of
2527 # unity-system-compositor's socket.
2628 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'}"
2730 fi
2831end script
2932
data/unity8.desktop.in−1
@@ -1,7 +1,6 @@
11[Desktop Entry]
22Type=Application
33Name=Unity 8
4−GenericName=unity8
54Comment=The converged Unity shell
65Exec=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@/unity8
76Terminal=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+
1178unity8 (7.84+14.04.20131220-0ubuntu1) trusty; urgency=low
2179
3180 [ Michał Sawicz ]
debian/control+17−3
@@ -5,6 +5,8 @@ Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
55Build-Depends: cmake,
66 dbus-test-runner,
77 debhelper (>= 9),
8+ doxyqml,
9+ graphviz,
810 libdee-qt5-dev (>= 3.2),
911 libgl1-mesa-dev[!armhf] | libgl-dev[!armhf],
1012 libgl1-mesa-dri,
@@ -38,6 +40,7 @@ Build-Depends: cmake,
3840 qtdeclarative5-private-dev,
3941 qtdeclarative5-qtquick2-plugin,
4042 qtdeclarative5-test-plugin,
43+ qtdeclarative5-ubuntu-settings-components,
4144 qtdeclarative5-ubuntu-ui-toolkit-plugin,
4245 qtdeclarative5-xmllistmodel-plugin,
4346 libqt5xmlpatterns5-dev,
@@ -53,7 +56,7 @@ Vcs-Browser: https://bazaar.launchpad.net/~unity-team/unity8/trunk
5356Package: indicators-client
5457Architecture: amd64 armhf i386
5558Depends: 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,
5760 unity8 (= ${binary:Version}),
5861 ${misc:Depends},
5962 ${shlibs:Depends},
@@ -73,11 +76,13 @@ Package: unity8
7376Architecture: any
7477Provides: indicator-renderer,
7578Depends: gsettings-desktop-schemas,
76− libunity-mir1 (>= 0.2),
79+ libglib2.0-bin,
80+ libunity-mir1,
7781 qmenumodel-qml (>= 0.2.7),
7882 qtdeclarative5-dee-plugin,
7983 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,
8186 qtdeclarative5-unity-notifications-plugin | unity-notifications-impl,
8287 qtdeclarative5-xmllistmodel-plugin,
8388 unity-greeter-session-broadcast,
@@ -118,6 +123,7 @@ Depends: gir1.2-glib-2.0,
118123 libqt5test5,
119124 libqt5widgets5,
120125 python-evdev,
126+ python-fixtures,
121127 python-gi,
122128 python-mock,
123129 unity8 (>= ${source:Version}),
@@ -153,3 +159,11 @@ Description: Unity 8 private libs
153159 .
154160 This package contains the private libraries for QML and other components
155161 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:
2121 # So until Debian bug 719148 is fixed, do it ourselves.
2222 dh_auto_configure -- -DCMAKE_INSTALL_LOCALSTATEDIR="/var"
2323
24+override_dh_auto_build:
25+ # doc is not a default target
26+ dh_auto_build -- all doc
27+
2428override_dh_install:
2529 # install autopilot tests
2630 cd tests/autopilot; \
debian/unity8-autopilot.install−1
@@ -1,2 +1 @@
11usr/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 @@
11usr/lib/*/unity8/qml/mocks
2+usr/lib/*/unity8/qml/scopefakes
23usr/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)
2424set(QMLPLUGIN_SRC
2525 plugin.cpp
2626 listviewwithpageheader.cpp
27− abstractjournal.cpp
27+ abstractdashview.cpp
2828 verticaljournal.cpp
2929 horizontaljournal.cpp
30+ organicgrid.cpp
3031 )
3132
3233add_library(DashViews-qml MODULE
plugins/DashViews/abstractjournal.cpp → plugins/DashViews/abstractdashview.cpprenamed+34−34
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -14,11 +14,11 @@
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 */
1616
17−#include "abstractjournal.h"
17+#include "abstractdashview.h"
1818
1919static const qreal bufferRatio = 0.5;
2020
21−AbstractJournal::AbstractJournal()
21+AbstractDashView::AbstractDashView()
2222 : m_delegateModel(nullptr)
2323 , m_asyncRequestedIndex(-1)
2424 , m_columnSpacing(0)
@@ -35,12 +35,12 @@ AbstractJournal::AbstractJournal()
3535 connect(this, SIGNAL(heightChanged()), this, SLOT(onHeightChanged()));
3636}
3737
38−QAbstractItemModel *AbstractJournal::model() const
38+QAbstractItemModel *AbstractDashView::model() const
3939{
4040 return m_delegateModel ? m_delegateModel->model().value<QAbstractItemModel *>() : nullptr;
4141}
4242
43−void AbstractJournal::setModel(QAbstractItemModel *model)
43+void AbstractDashView::setModel(QAbstractItemModel *model)
4444{
4545 if (model != this->model()) {
4646 if (!m_delegateModel) {
@@ -65,12 +65,12 @@ void AbstractJournal::setModel(QAbstractItemModel *model)
6565 }
6666}
6767
68−QQmlComponent *AbstractJournal::delegate() const
68+QQmlComponent *AbstractDashView::delegate() const
6969{
7070 return m_delegateModel ? m_delegateModel->delegate() : nullptr;
7171}
7272
73−void AbstractJournal::setDelegate(QQmlComponent *delegate)
73+void AbstractDashView::setDelegate(QQmlComponent *delegate)
7474{
7575 if (delegate != this->delegate()) {
7676 if (!m_delegateModel) {
@@ -87,12 +87,12 @@ void AbstractJournal::setDelegate(QQmlComponent *delegate)
8787 }
8888}
8989
90−qreal AbstractJournal::columnSpacing() const
90+qreal AbstractDashView::columnSpacing() const
9191{
9292 return m_columnSpacing;
9393}
9494
95−void AbstractJournal::setColumnSpacing(qreal columnSpacing)
95+void AbstractDashView::setColumnSpacing(qreal columnSpacing)
9696{
9797 if (columnSpacing != m_columnSpacing) {
9898 m_columnSpacing = columnSpacing;
@@ -104,12 +104,12 @@ void AbstractJournal::setColumnSpacing(qreal columnSpacing)
104104 }
105105}
106106
107−qreal AbstractJournal::rowSpacing() const
107+qreal AbstractDashView::rowSpacing() const
108108{
109109 return m_rowSpacing;
110110}
111111
112−void AbstractJournal::setRowSpacing(qreal rowSpacing)
112+void AbstractDashView::setRowSpacing(qreal rowSpacing)
113113{
114114 if (rowSpacing != m_rowSpacing) {
115115 m_rowSpacing = rowSpacing;
@@ -121,12 +121,12 @@ void AbstractJournal::setRowSpacing(qreal rowSpacing)
121121 }
122122}
123123
124−qreal AbstractJournal::delegateCreationBegin() const
124+qreal AbstractDashView::delegateCreationBegin() const
125125{
126126 return m_delegateCreationBegin;
127127}
128128
129−void AbstractJournal::setDelegateCreationBegin(qreal begin)
129+void AbstractDashView::setDelegateCreationBegin(qreal begin)
130130{
131131 m_delegateCreationBeginValid = true;
132132 if (m_delegateCreationBegin == begin)
@@ -138,7 +138,7 @@ void AbstractJournal::setDelegateCreationBegin(qreal begin)
138138 emit delegateCreationBeginChanged();
139139}
140140
141−void AbstractJournal::resetDelegateCreationBegin()
141+void AbstractDashView::resetDelegateCreationBegin()
142142{
143143 m_delegateCreationBeginValid = false;
144144 if (m_delegateCreationBegin == 0)
@@ -150,12 +150,12 @@ void AbstractJournal::resetDelegateCreationBegin()
150150 emit delegateCreationBeginChanged();
151151}
152152
153−qreal AbstractJournal::delegateCreationEnd() const
153+qreal AbstractDashView::delegateCreationEnd() const
154154{
155155 return m_delegateCreationEnd;
156156}
157157
158−void AbstractJournal::setDelegateCreationEnd(qreal end)
158+void AbstractDashView::setDelegateCreationEnd(qreal end)
159159{
160160 m_delegateCreationEndValid = true;
161161 if (m_delegateCreationEnd == end)
@@ -167,7 +167,7 @@ void AbstractJournal::setDelegateCreationEnd(qreal end)
167167 emit delegateCreationEndChanged();
168168}
169169
170−void AbstractJournal::resetDelegateCreationEnd()
170+void AbstractDashView::resetDelegateCreationEnd()
171171{
172172 m_delegateCreationEndValid = false;
173173 if (m_delegateCreationEnd == 0)
@@ -179,7 +179,7 @@ void AbstractJournal::resetDelegateCreationEnd()
179179 emit delegateCreationEndChanged();
180180}
181181
182−void AbstractJournal::createDelegateModel()
182+void AbstractDashView::createDelegateModel()
183183{
184184#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
185185 m_delegateModel = new QQuickVisualDataModel(qmlContext(this), this);
@@ -192,9 +192,9 @@ void AbstractJournal::createDelegateModel()
192192 m_delegateModel->componentComplete();
193193}
194194
195−void AbstractJournal::refill()
195+void AbstractDashView::refill()
196196{
197− if (!isComponentComplete()) {
197+ if (!isComponentComplete() || height() < 0) {
198198 return;
199199 }
200200
@@ -215,7 +215,7 @@ void AbstractJournal::refill()
215215 }
216216}
217217
218−bool AbstractJournal::addVisibleItems(qreal fillFromY, qreal fillToY, bool asynchronous)
218+bool AbstractDashView::addVisibleItems(qreal fillFromY, qreal fillToY, bool asynchronous)
219219{
220220 if (!delegate())
221221 return false;
@@ -247,7 +247,7 @@ bool AbstractJournal::addVisibleItems(qreal fillFromY, qreal fillToY, bool async
247247 return changed;
248248}
249249
250−QQuickItem *AbstractJournal::createItem(int modelIndex, bool asynchronous)
250+QQuickItem *AbstractDashView::createItem(int modelIndex, bool asynchronous)
251251{
252252 if (asynchronous && m_asyncRequestedIndex != -1)
253253 return nullptr;
@@ -276,12 +276,12 @@ QQuickItem *AbstractJournal::createItem(int modelIndex, bool asynchronous)
276276#endif
277277 return nullptr;
278278 } else {
279− positionItem(modelIndex, item);
279+ addItemToView(modelIndex, item);
280280 return item;
281281 }
282282}
283283
284−void AbstractJournal::releaseItem(QQuickItem *item)
284+void AbstractDashView::releaseItem(QQuickItem *item)
285285{
286286#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
287287 QQuickVisualModel::ReleaseFlags flags = m_delegateModel->release(item);
@@ -294,20 +294,20 @@ void AbstractJournal::releaseItem(QQuickItem *item)
294294 }
295295}
296296
297−void AbstractJournal::setImplicitHeightDirty()
297+void AbstractDashView::setImplicitHeightDirty()
298298{
299299 m_implicitHeightDirty = true;
300300}
301301
302302#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)
304304{
305305#else
306−void AbstractJournal::itemCreated(int modelIndex, QObject *object)
306+void AbstractDashView::itemCreated(int modelIndex, QObject *object)
307307{
308308 QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
309309 if (!item) {
310− qWarning() << "AbstractJournal::itemCreated got a non item for index" << modelIndex;
310+ qWarning() << "AbstractDashView::itemCreated got a non item for index" << modelIndex;
311311 return;
312312 }
313313#endif
@@ -326,9 +326,9 @@ void AbstractJournal::itemCreated(int modelIndex, QObject *object)
326326}
327327
328328#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)
330330#else
331−void AbstractJournal::onModelUpdated(const QQmlChangeSet &changeSet, bool reset)
331+void AbstractDashView::onModelUpdated(const QQmlChangeSet &changeSet, bool reset)
332332#endif
333333{
334334 if (reset) {
@@ -340,18 +340,18 @@ void AbstractJournal::onModelUpdated(const QQmlChangeSet &changeSet, bool reset)
340340}
341341
342342
343−void AbstractJournal::relayout()
343+void AbstractDashView::relayout()
344344{
345345 m_needsRelayout = true;
346346 polish();
347347}
348348
349−void AbstractJournal::onHeightChanged()
349+void AbstractDashView::onHeightChanged()
350350{
351351 polish();
352352}
353353
354−void AbstractJournal::updatePolish()
354+void AbstractDashView::updatePolish()
355355{
356356 if (!model())
357357 return;
@@ -375,7 +375,7 @@ void AbstractJournal::updatePolish()
375375 }
376376}
377377
378−void AbstractJournal::componentComplete()
378+void AbstractDashView::componentComplete()
379379{
380380 if (m_delegateModel)
381381 m_delegateModel->componentComplete();
plugins/DashViews/abstractjournal.h → plugins/DashViews/abstractdashview.hrenamed+7−6
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -14,8 +14,8 @@
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 */
1616
17−#ifndef ABSTRACTJOURNAL_H
18−#define ABSTRACTJOURNAL_H
17+#ifndef ABSTRACTDASHVIEW_H
18+#define ABSTRACTDASHVIEW_H
1919
2020#include <QQuickItem>
2121
@@ -31,7 +31,7 @@ class QQmlComponent;
3131#endif
3232#pragma GCC diagnostic pop
3333
34−class AbstractJournal : public QQuickItem
34+class AbstractDashView : public QQuickItem
3535{
3636 Q_OBJECT
3737
@@ -50,9 +50,10 @@ class AbstractJournal : public QQuickItem
5050
5151friend class VerticalJournalTest;
5252friend class HorizontalJournalTest;
53+friend class OrganicGridTest;
5354
5455public:
55− AbstractJournal();
56+ AbstractDashView();
5657
5758 QAbstractItemModel *model() const;
5859 void setModel(QAbstractItemModel *model);
@@ -110,7 +111,7 @@ private:
110111
111112 virtual void findBottomModelIndexToAdd(int *modelIndex, qreal *yPos) = 0;
112113 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;
114115 virtual bool removeNonVisibleItems(qreal bufferFromY, qreal bufferToY) = 0;
115116 virtual void cleanupExistingItems() = 0;
116117 virtual void doRelayout() = 0;
plugins/DashViews/horizontaljournal.cpp+4−3
@@ -118,7 +118,7 @@ bool HorizontalJournal::removeNonVisibleItems(qreal bufferFromY, qreal bufferToY
118118 return changed;
119119}
120120
121−void HorizontalJournal::positionItem(int modelIndex, QQuickItem *item)
121+void HorizontalJournal::addItemToView(int modelIndex, QQuickItem *item)
122122{
123123 if (item->height() != m_rowHeight) {
124124 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)
159159 m_firstVisibleIndex = modelIndex;
160160 m_visibleItems.prepend(item);
161161 } else {
162− qWarning() << "HorizontalJournal::positionItem - Got unexpected modelIndex"
162+ qWarning() << "HorizontalJournal::addItemToView - Got unexpected modelIndex"
163163 << modelIndex << m_firstVisibleIndex << m_visibleItems.count();
164164 }
165165 }
@@ -173,6 +173,7 @@ void HorizontalJournal::cleanupExistingItems()
173173 m_visibleItems.clear();
174174 m_lastInRowIndexPosition.clear();
175175 m_firstVisibleIndex = -1;
176+ setImplicitHeightDirty();
176177}
177178
178179void HorizontalJournal::calculateImplicitHeight()
@@ -232,7 +233,7 @@ void HorizontalJournal::doRelayout()
232233 m_visibleItems.clear();
233234 m_lastInRowIndexPosition.clear();
234235 Q_FOREACH(QQuickItem *item, allItems) {
235− positionItem(i, item);
236+ addItemToView(i, item);
236237 ++i;
237238 }
238239 } else {
plugins/DashViews/horizontaljournal.h+3−3
@@ -17,7 +17,7 @@
1717#ifndef HORIZONTALJOURNAL_H
1818#define HORIZONTALJOURNAL_H
1919
20−#include "abstractjournal.h"
20+#include "abstractdashview.h"
2121
2222 /** A horizontal journal is a view that creates delegates
2323 * based on a model and layouts them one after the other
@@ -26,7 +26,7 @@
2626 *
2727 * All delegates are forced to rowHeight if they don't have it.
2828 */
29− class HorizontalJournal : public AbstractJournal
29+ class HorizontalJournal : public AbstractDashView
3030{
3131 Q_OBJECT
3232
@@ -47,7 +47,7 @@ private:
4747 void findBottomModelIndexToAdd(int *modelIndex, qreal *yPos) override;
4848 void findTopModelIndexToAdd(int *modelIndex, qreal *yPos) override;
4949 bool removeNonVisibleItems(qreal bufferFromY, qreal bufferToY) override;
50− void positionItem(int modelIndex, QQuickItem *item) override;
50+ void addItemToView(int modelIndex, QQuickItem *item) override;
5151 void cleanupExistingItems() override;
5252 void calculateImplicitHeight() override;
5353 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 @@
1919
2020#include "horizontaljournal.h"
2121#include "listviewwithpageheader.h"
22+#include "organicgrid.h"
2223#include "verticaljournal.h"
2324
2425#include <QAbstractItemModel>
@@ -29,5 +30,6 @@ void DashViewsPlugin::registerTypes(const char *uri)
2930 qmlRegisterType<QAbstractItemModel>();
3031 qmlRegisterType<HorizontalJournal>(uri, 0, 1, "HorizontalJournal");
3132 qmlRegisterType<ListViewWithPageHeader>(uri, 0, 1, "ListViewWithPageHeader");
33+ qmlRegisterType<OrganicGrid>(uri, 0, 1, "OrganicGrid");
3234 qmlRegisterType<VerticalJournal>(uri, 0, 1, "VerticalJournal");
3335}
plugins/DashViews/verticaljournal.cpp+4−3
@@ -79,7 +79,7 @@ void VerticalJournal::findBottomModelIndexToAdd(int *modelIndex, qreal *yPos)
7979
8080void VerticalJournal::findTopModelIndexToAdd(int *modelIndex, qreal *yPos)
8181{
82− *modelIndex = INT_MAX;
82+ *modelIndex = 0;
8383 *yPos = std::numeric_limits<qreal>::lowest();
8484 int columnToAddTo = -1;
8585
@@ -130,7 +130,7 @@ bool VerticalJournal::removeNonVisibleItems(qreal bufferFromY, qreal bufferToY)
130130 return changed;
131131}
132132
133−void VerticalJournal::positionItem(int modelIndex, QQuickItem *item)
133+void VerticalJournal::addItemToView(int modelIndex, QQuickItem *item)
134134{
135135 if (item->width() != m_columnWidth) {
136136 qWarning() << "Item" << modelIndex << "width is not the one that the columnWidth mandates, resetting it";
@@ -179,6 +179,7 @@ void VerticalJournal::cleanupExistingItems()
179179 column.clear();
180180 }
181181 m_indexColumnMap.clear();
182+ setImplicitHeightDirty();
182183}
183184
184185void VerticalJournal::calculateImplicitHeight()
@@ -220,7 +221,7 @@ void VerticalJournal::doRelayout()
220221 if (!allItems.isEmpty()) {
221222 if (allItems.first().m_modelIndex == 0) {
222223 Q_FOREACH(const ViewItem &item, allItems)
223− positionItem(item.m_modelIndex, item.m_item);
224+ addItemToView(item.m_modelIndex, item.m_item);
224225 } else {
225226 Q_FOREACH(const ViewItem &item, allItems)
226227 releaseItem(item.m_item);
plugins/DashViews/verticaljournal.h+3−3
@@ -17,7 +17,7 @@
1717#ifndef VERTICALJOURNAL_H
1818#define VERTICALJOURNAL_H
1919
20−#include "abstractjournal.h"
20+#include "abstractdashview.h"
2121
2222 /** A vertical journal is a view that creates delegates
2323 * based on a model and layouts them in columns following
@@ -51,7 +51,7 @@
5151 *
5252 */
5353
54−class VerticalJournal : public AbstractJournal
54+class VerticalJournal : public AbstractDashView
5555{
5656 Q_OBJECT
5757
@@ -85,7 +85,7 @@ private:
8585 void findBottomModelIndexToAdd(int *modelIndex, qreal *yPos) override;
8686 void findTopModelIndexToAdd(int *modelIndex, qreal *yPos) override;
8787 bool removeNonVisibleItems(qreal bufferFromY, qreal bufferToY) override;
88− void positionItem(int modelIndex, QQuickItem *item) override;
88+ void addItemToView(int modelIndex, QQuickItem *item) override;
8989 void cleanupExistingItems() override;
9090 void calculateImplicitHeight() override;
9191 void doRelayout() override;
plugins/Unity/Indicators/CMakeLists.txt−2
@@ -12,8 +12,6 @@ find_package(Qt5Core REQUIRED)
1212find_package(Qt5Quick REQUIRED)
1313
1414add_subdirectory(qml)
15−add_subdirectory(Messaging)
16−add_subdirectory(Network)
1715
1816include_directories(
1917 ${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 @@
1818 */
1919
2020import QtQuick 2.0
21−import Unity.Indicators 0.1 as Indicators
22−import Unity.Indicators.Network 0.1 as ICNetwork
23−import Unity.Indicators.Messaging 0.1 as ICMessaging
21+import Ubuntu.Settings.Menus 0.1 as Menus
2422import QMenuModel 0.1 as QMenuModel
25−import Ubuntu.Components 0.1
23+import Utils 0.1 as Utils
24+import Ubuntu.Components.ListItems 0.1 as ListItems
2625
2726Item {
2827 id: menuFactory
@@ -33,12 +32,14 @@ Item {
3332 "unity.widgets.systemsettings.tablet.volumecontrol" : sliderMenu,
3433 "unity.widgets.systemsettings.tablet.switch" : switchMenu,
3534
36− "com.canonical.indicator.button" : buttonMenu,
37− "com.canonical.indicator.div" : divMenu,
38− "com.canonical.indicator.section" : sectionMenu,
39− "com.canonical.indicator.progress" : progressMenu,
40− "com.canonical.indicator.slider" : sliderMenu,
41− "com.canonical.indicator.switch" : switchMenu,
35+ "com.canonical.indicator.button" : buttonMenu,
36+ "com.canonical.indicator.div" : separatorMenu,
37+ "com.canonical.indicator.section" : sectionMenu,
38+ "com.canonical.indicator.progress" : progressMenu,
39+ "com.canonical.indicator.slider" : sliderMenu,
40+ "com.canonical.indicator.switch" : switchMenu,
41+ "com.canonical.indicator.alarm" : alarmMenu,
42+ "com.canonical.indicator.appointment" : appointmentMenu,
4243
4344 "com.canonical.indicator.messages.messageitem" : messageItem,
4445 "com.canonical.indicator.messages.sourceitem" : groupedMessage,
@@ -46,6 +47,9 @@ Item {
4647 "com.canonical.unity.slider" : sliderMenu,
4748 "com.canonical.unity.switch" : switchMenu,
4849
50+ "com.canonical.unity.media-player" : mediaPayerMenu,
51+ "com.canonical.unity.playback-item" : playbackItemMenu,
52+
4953 "unity.widgets.systemsettings.tablet.wifisection" : wifiSection,
5054 "unity.widgets.systemsettings.tablet.accesspoint" : accessPoint,
5155 }
@@ -58,15 +62,15 @@ Item {
5862 }
5963
6064 Component {
61− id: divMenu;
62− Indicators.DivMenuItem {
63− objectName: "divMenu"
65+ id: separatorMenu;
66+ Menus.SeparatorMenu {
67+ objectName: "separatorMenu"
6468 }
6569 }
6670
6771 Component {
6872 id: sliderMenu;
69− Indicators.SliderMenuItem {
73+ Menus.SliderMenu {
7074 objectName: "sliderMenu"
7175 property QtObject menuData: null
7276 property var menuModel: menuFactory.menuModel
@@ -95,12 +99,12 @@ Item {
9599 onMenuIndexChanged: {
96100 loadAttributes();
97101 }
98− onChangeState: {
102+ onUpdated: {
99103 menuModel.changeState(menuIndex, value);
100104 }
101105
102106 function loadAttributes() {
103− if (!menuModel || menuIndex == undefined) return;
107+ if (!menuModel || menuIndex == -1) return;
104108 menuModel.loadExtendedAttributes(menuIndex, {'min-value': 'double',
105109 'max-value': 'double',
106110 'min-icon': 'icon',
@@ -111,7 +115,7 @@ Item {
111115
112116 Component {
113117 id: buttonMenu;
114− Indicators.ButtonMenuItem {
118+ Menus.ButtonMenu {
115119 objectName: "buttonMenu"
116120 property QtObject menuData: null
117121 property var menuModel: menuFactory.menuModel
@@ -120,7 +124,7 @@ Item {
120124 buttonText: menuData && menuData.label || ""
121125 enabled: menuData && menuData.sensitive || false
122126
123− onActivate: {
127+ onTriggered: {
124128 menuModel.activate(menuIndex);
125129 shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
126130 }
@@ -128,18 +132,19 @@ Item {
128132 }
129133 Component {
130134 id: sectionMenu;
131− Indicators.SectionMenuItem {
135+ Menus.SectionMenu {
132136 objectName: "sectionMenu"
133137 property QtObject menuData: null
134138 property var menuIndex: undefined
135139
136140 text: menuData && menuData.label || ""
141+ busy: false
137142 }
138143 }
139144
140145 Component {
141146 id: progressMenu;
142− Indicators.ProgressMenuItem {
147+ Menus.ProgressValueMenu {
143148 objectName: "progressMenu"
144149 property QtObject menuData: null
145150 property int menuIndex: -1
@@ -153,7 +158,7 @@ Item {
153158
154159 Component {
155160 id: standardMenu;
156− Indicators.StandardMenuItem {
161+ ListItems.Standard {
157162 objectName: "standardMenu"
158163 property QtObject menuData: null
159164 property int menuIndex: -1
@@ -161,19 +166,36 @@ Item {
161166 text: menuData && menuData.label || ""
162167 iconSource: menuData && menuData.icon || ""
163168 enabled: menuData && menuData.sensitive || false
164− checkable: menuData ? (menuData.isCheck || menuData.isRadio) : false
165− checked: checkable ? menuData.isToggled : false
166169
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: {
168189 menuModel.activate(menuIndex);
169190 shell.hideIndicatorMenu(UbuntuAnimation.BriskDuration);
170191 }
171192 }
172193 }
173194
195+
174196 Component {
175197 id: switchMenu;
176− Indicators.SwitchMenuItem {
198+ Menus.SwitchMenu {
177199 objectName: "switchMenu"
178200 property QtObject menuData: null
179201 property int menuIndex: -1
@@ -181,18 +203,94 @@ Item {
181203 text: menuData && menuData.label || ""
182204 iconSource: menuData && menuData.icon || ""
183205 enabled: menuData && menuData.sensitive || false
184− checked: menuData ? menuData.isToggled : false
206+ checked: menuData && menuData.isToggled || false
185207
186− onActivate: {
208+ onTriggered: {
187209 menuModel.activate(menuIndex);
188210 shell.hideIndicatorMenu(UbuntuAnimation.BriskDuration);
189211 }
190212 }
191213 }
192214
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+
193291 Component {
194292 id: wifiSection;
195− Indicators.SectionMenuItem {
293+ Menus.SectionMenu {
196294 objectName: "wifiSection"
197295 property QtObject menuData: null
198296 property var menuModel: menuFactory.menuModel
@@ -210,7 +308,7 @@ Item {
210308 }
211309
212310 function loadAttributes() {
213− if (!menuModel || menuIndex == undefined) return;
311+ if (!menuModel || menuIndex == -1) return;
214312 menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-busy-action': 'bool'})
215313 }
216314 }
@@ -218,7 +316,7 @@ Item {
218316
219317 Component {
220318 id: accessPoint;
221− ICNetwork.AccessPoint {
319+ Menus.AccessPointMenu {
222320 objectName: "accessPoint"
223321 property QtObject menuData: null
224322 property var menuModel: menuFactory.menuModel
@@ -231,11 +329,11 @@ Item {
231329 name: getExtendedProperty(extendedData, "xCanonicalWifiApStrengthAction", "")
232330 }
233331
234− label: menuData && menuData.label || ""
332+ text: menuData && menuData.label || ""
235333 enabled: menuData && menuData.sensitive || false
334+ checked: menuData && menuData.isToggled || false
236335 secure: getExtendedProperty(extendedData, "xCanonicalWifiApIsSecure", false)
237336 adHoc: getExtendedProperty(extendedData, "xCanonicalWifiApIsAdhoc", false)
238− checked: menuData ? menuData.isToggled : false
239337 signalStrength: strengthAction.valid ? strengthAction.state : 0
240338
241339 onMenuModelChanged: {
@@ -244,13 +342,13 @@ Item {
244342 onMenuIndexChanged: {
245343 loadAttributes();
246344 }
247− onActivate: {
345+ onTriggered: {
248346 menuModel.activate(menuIndex);
249347 shell.hideIndicatorMenu(UbuntuAnimation.BriskDuration);
250348 }
251349
252350 function loadAttributes() {
253− if (!menuModel || menuIndex == undefined) return;
351+ if (!menuModel || menuIndex == -1) return;
254352 menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-wifi-ap-is-adhoc': 'bool',
255353 'x-canonical-wifi-ap-is-secure': 'bool',
256354 'x-canonical-wifi-ap-strength-action': 'string'});
@@ -260,7 +358,7 @@ Item {
260358
261359 Component {
262360 id: messageItem
263− ICMessaging.MessageMenuItemFactory {
361+ MessageMenuItemFactory {
264362 objectName: "messageItem"
265363 menuModel: menuFactory.menuModel
266364 }
@@ -268,17 +366,18 @@ Item {
268366
269367 Component {
270368 id: groupedMessage
271− ICMessaging.GroupedMessage {
369+ Menus.GroupedMessageMenu {
272370 objectName: "groupedMessage"
273371 property QtObject menuData: null
274372 property var menuModel: menuFactory.menuModel
275373 property int menuIndex: -1
276374 property var extendedData: menuData && menuData.ext || undefined
277375
278− title: menuData && menuData.label || ""
279− appIcon: getExtendedProperty(extendedData, "icon", "qrc:/indicators/artwork/messaging/default_app.svg")
376+ text: menuData && menuData.label || ""
377+ iconSource: getExtendedProperty(extendedData, "icon", "qrc:/indicators/artwork/messaging/default_app.svg")
280378 count: menuData && menuData.actionState.length > 0 ? menuData.actionState[0] : "0"
281379 enabled: menuData && menuData.sensitive || false
380+ removable: true
282381
283382 onMenuModelChanged: {
284383 loadAttributes();
@@ -286,21 +385,103 @@ Item {
286385 onMenuIndexChanged: {
287386 loadAttributes();
288387 }
289− onActivateApp: {
388+ onClicked: {
290389 menuModel.activate(menuIndex, true);
291390 shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
292391 }
293− onDismiss: {
392+ onDismissed: {
294393 menuModel.activate(menuIndex, false);
295394 }
296395
297396 function loadAttributes() {
298− if (!menuModel || menuIndex == undefined) return;
397+ if (!menuModel || menuIndex == -1) return;
299398 menuModel.loadExtendedAttributes(modelIndex, {'icon': 'icon'});
300399 }
301400 }
302401 }
303402
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+
304485 function load(modelData) {
305486 if (modelData.type !== undefined) {
306487 var component = _map[modelData.type];
@@ -308,8 +489,11 @@ Item {
308489 return component;
309490 }
310491 }
492+ if (modelData.isCheck || modelData.isRadio) {
493+ return checkableMenu;
494+ }
311495 if (modelData.isSeparator) {
312− return divMenu;
496+ return separatorMenu;
313497 }
314498 return standardMenu;
315499 }
plugins/Unity/Indicators/Messaging/qml/MessageMenuItemFactory.qml → plugins/Unity/Indicators/qml/MessageMenuItemFactory.qmlrenamed+69−28
@@ -20,18 +20,29 @@
2020
2121import QtQuick 2.0
2222import Ubuntu.Components 0.1
23−import Unity.Indicators 0.1 as Indicators
23+import Ubuntu.Settings.Menus 0.1 as Menus
2424import QMenuModel 0.1 as QMenuModel
25+import Utils 0.1 as Utils
2526
26−Indicators.BaseMenuItem {
27+Item {
2728 id: messageFactoryItem
2829 property var menuModel: null
2930 property QtObject menuData: null
3031 property int menuIndex: -1
3132
33+ property bool selected: false
34+ signal menuSelected
35+ signal menuDeselected
36+
3237 property var extendedData: menuData && menuData.ext || undefined
3338 property var actionsDescription: getExtendedProperty(extendedData, "xCanonicalMessageActions", undefined)
3439
40+ // TODO - bug #1260728
41+ property var timeFormatter: Utils.TimeFormatter {
42+ time: getExtendedProperty(extendedData, "xCanonicalTime", 0)
43+ format: "hh:mm - MMM dd"
44+ }
45+
3546 onMenuModelChanged: {
3647 loadAttributes();
3748 }
@@ -40,8 +51,7 @@ Indicators.BaseMenuItem {
4051 }
4152
4253 function loadAttributes() {
43− if (!menuModel || menuIndex == undefined) return;
44−
54+ if (!menuModel || menuIndex == -1) return;
4555 menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-time': 'int64',
4656 'x-canonical-text': 'string',
4757 'x-canonical-message-actions': 'variant',
@@ -67,34 +77,46 @@ Indicators.BaseMenuItem {
6777
6878 Component {
6979 id: simpleTextMessage
70− SimpleTextMessage {
80+ Menus.SimpleTextMessageMenu {
81+ id: message
7182 objectName: "simpleTextMessage"
7283 // text
7384 title: menuData && menuData.label || ""
74− time: getExtendedProperty(extendedData, "xCanonicalTime", 0)
85+ time: timeFormatter.timeString
7586 message: getExtendedProperty(extendedData, "xCanonicalText", "")
7687 // icons
7788 avatar: getExtendedProperty(extendedData, "icon", "qrc:/indicators/artwork/messaging/default_contact.png")
7889 appIcon: getExtendedProperty(extendedData, "xCanonicalAppIcon", "qrc:/indicators/artwork/messaging/default_app.svg")
7990 // actions
8091 enabled: menuData && menuData.sensitive || false
92+ removable: !selected
93+ selected: messageFactoryItem.selected
8194
82− onActivateApp: {
95+ onAppActivated: {
8396 menuModel.activate(menuIndex, true);
8497 shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
8598 }
86− onDismiss: {
99+ onDismissed: {
87100 menuModel.activate(menuIndex, false);
88101 }
102+ onClicked: {
103+ if (selected) {
104+ menuDeselected();
105+ } else {
106+ menuSelected();
107+ }
108+ }
89109
90− menuSelected: messageFactoryItem.menuSelected
91− onSelectMenu: messageFactoryItem.selectMenu()
92− onDeselectMenu: messageFactoryItem.deselectMenu()
110+ backgroundIndicator: RemoveBackground {
111+ state: message.swipingState
112+ }
93113 }
94114 }
115+
95116 Component {
96117 id: textMessage
97− TextMessage {
118+ Menus.TextMessageMenu {
119+ id: message
98120 objectName: "textMessage"
99121 property var replyActionDescription: actionsDescription && actionsDescription.length > 0 ? actionsDescription[0] : undefined
100122
@@ -106,7 +128,7 @@ Indicators.BaseMenuItem {
106128
107129 // text
108130 title: menuData && menuData.label || ""
109− time: getExtendedProperty(extendedData, "xCanonicalTime", 0)
131+ time: timeFormatter.timeString
110132 message: getExtendedProperty(extendedData, "xCanonicalText", "")
111133 replyButtonText: getExtendedProperty(replyActionDescription, "label", "Send")
112134 // icons
@@ -115,26 +137,36 @@ Indicators.BaseMenuItem {
115137 // actions
116138 replyEnabled: replyAction.valid && replyAction.enabled
117139 enabled: menuData && menuData.sensitive || false
140+ removable: !selected
141+ selected: messageFactoryItem.selected
118142
119− onActivateApp: {
143+ onAppActivated: {
120144 menuModel.activate(menuIndex, true);
121145 shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
122146 }
123− onDismiss: {
147+ onDismissed: {
124148 menuModel.activate(menuIndex, false);
125149 }
126− onReply: {
150+ onReplied: {
127151 replyAction.activate(value);
128152 }
153+ onClicked: {
154+ if (selected) {
155+ menuDeselected();
156+ } else {
157+ menuSelected();
158+ }
159+ }
129160
130− menuSelected: messageFactoryItem.menuSelected
131− onSelectMenu: messageFactoryItem.selectMenu()
132− onDeselectMenu: messageFactoryItem.deselectMenu()
161+ backgroundIndicator: RemoveBackground {
162+ state: message.swipingState
163+ }
133164 }
134165 }
135166 Component {
136167 id: snapDecision
137− SnapDecision {
168+ Menus.SnapDecisionMenu {
169+ id: message
138170 objectName: "snapDecision"
139171 property var activateActionDescription: actionsDescription && actionsDescription.length > 0 ? actionsDescription[0] : undefined
140172 property var replyActionDescription: actionsDescription && actionsDescription.length > 1 ? actionsDescription[1] : undefined
@@ -152,7 +184,7 @@ Indicators.BaseMenuItem {
152184
153185 // text
154186 title: menuData && menuData.label || ""
155− time: getExtendedProperty(extendedData, "xCanonicalTime", 0)
187+ time: timeFormatter.timeString
156188 message: getExtendedProperty(extendedData, "xCanonicalText", "")
157189 actionButtonText: getExtendedProperty(activateActionDescription, "label", "Call back")
158190 replyButtonText: getExtendedProperty(replyActionDescription, "label", "Send")
@@ -164,24 +196,33 @@ Indicators.BaseMenuItem {
164196 activateEnabled: activateAction.valid && activateAction.enabled
165197 replyEnabled: replyAction.valid && replyAction.enabled
166198 enabled: menuData && menuData.sensitive || false
199+ removable: !selected
200+ selected: messageFactoryItem.selected
167201
168− onActivateApp: {
202+ onAppActivated: {
169203 menuModel.activate(menuIndex, true);
170204 shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
171205 }
172− onDismiss: {
206+ onDismissed: {
173207 menuModel.activate(menuIndex, false);
174208 }
175− onActivate: {
209+ onActivated: {
176210 activateAction.activate();
177211 }
178− onReply: {
212+ onReplied: {
179213 replyAction.activate(value);
180214 }
215+ onClicked: {
216+ if (selected) {
217+ menuDeselected();
218+ } else {
219+ menuSelected();
220+ }
221+ }
181222
182− menuSelected: messageFactoryItem.menuSelected
183− onSelectMenu: messageFactoryItem.selectMenu()
184− onDeselectMenu: messageFactoryItem.deselectMenu()
223+ backgroundIndicator: RemoveBackground {
224+ state: message.swipingState
225+ }
185226 }
186227 }
187228 }
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
22plugin IndicatorsQml
33typeinfo plugin.qmltypes
44
5−BaseMenuItem 0.1 BaseMenuItem.qml
6−ButtonMenuItem 0.1 ButtonMenuItem.qml
75CachedUnityMenuModel 0.1 CachedUnityMenuModel.qml
8−DivMenuItem 0.1 DivMenuItem.qml
9−FramedMenuItem 0.1 FramedMenuItem.qml
10−HLine 0.1 HLine.qml
116IndicatorBase 0.1 IndicatorBase.qml
12−MenuActionBinding 0.1 MenuActionBinding.qml
137MenuItemFactory 0.1 MenuItemFactory.qml
14−ProgressMenuItem 0.1 ProgressMenuItem.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−
8+MessageMenuItemFactory 0.1 MessageMenuItemFactory.qml
209
2110internal 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 @@
11<RCC>
22 <qresource prefix="/indicators">
3− <file>artwork/network/secure.svg</file>
43 <file>artwork/messaging/default_contact.png</file>
54 <file>artwork/messaging/default_app.svg</file>
6− <file>artwork/messaging/message_sms01_54px.png</file>
75 </qresource>
86</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 ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-06-26 23:48+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
11+"PO-Revision-Date: 2014-01-15 09:50+0000\n"
12+"Last-Translator: Turan Mahmudov <turan.mahmudov@gmail.com>\n"
1313"Language-Team: Azerbaijani <az@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
18+"X-Launchpad-Export-Date: 2014-01-16 06:09+0000\n"
19+"X-Generator: Launchpad (build 16901)\n"
2020
2121#: Components/EdgeDemoOverlay.qml:151
2222msgid "Skip intro"
23−msgstr ""
23+msgstr "Intro -nu keç"
2424
2525#: Components/EdgeDemo.qml:112
2626msgid "Right edge"
27−msgstr ""
27+msgstr "Sağ Künc"
2828
2929#: Components/EdgeDemo.qml:113
3030msgid "Try swiping from the right edge to unlock the phone"
31−msgstr ""
31+msgstr "Kilidi açmaq üçün sağ küncdən çəkin"
3232
3333#: Components/EdgeDemo.qml:144
3434msgid "Top edge"
35−msgstr ""
35+msgstr "Yuxarı künc"
3636
3737#: Components/EdgeDemo.qml:145
3838msgid "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"
4040
4141#: Components/EdgeDemo.qml:170
4242msgid "Close"
43−msgstr ""
43+msgstr "Bağla"
4444
4545#: Components/EdgeDemo.qml:171
4646msgid "Swipe up again to close the settings screen"
47−msgstr ""
47+msgstr "Nizamlamalar ekranını bağlamaq üçün yenidən yuxarı çəkin"
4848
4949#: Components/EdgeDemo.qml:198
5050msgid "Left edge"
51−msgstr ""
51+msgstr "Sol künc"
5252
5353#: Components/EdgeDemo.qml:199
5454msgid "Swipe from the left to reveal the launcher for quick access to apps"
5555msgstr ""
56+"Applikasiyalara sürətli keçid üçün paneli açmaq üçün sol küncdən çəkin"
5657
5758#: Components/EdgeDemo.qml:226
5859msgid "Well done"
59−msgstr ""
60+msgstr "Təbriklər"
6061
6162#: Components/EdgeDemo.qml:227
6263msgid ""
6364"You have now mastered the edge gestures and can start using the "
6465"phone<br><br>Tap anywhere to start"
6566msgstr ""
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"
6669
6770#: Components/PageHeader.qml:364
6871msgid "Recent searches"
@@ -70,50 +73,50 @@ msgstr "Son axtarışlar"
7073
7174#: Dash/Apps/AppPreview.qml:135
7275msgid "Rate this"
73−msgstr ""
76+msgstr "Qiymət ver"
7477
7578#. TRANSLATORS: Number of persons who rated this app/video/whatever
7679#: Dash/Previews/Header.qml:93
7780#, qt-format
7881msgid "(%1)"
79−msgstr ""
82+msgstr "(%1)"
8083
8184#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
8285#: Dash/Previews/Header.qml:105
8386#, qt-format
8487msgid "%1 review"
8588msgid_plural "%1 reviews"
86−msgstr[0] ""
87−msgstr[1] ""
89+msgstr[0] "%1 rəy"
90+msgstr[1] "%1 rəy"
8891
8992#: Dash/Previews/Reviews.qml:74
9093msgid "Add a review"
91−msgstr ""
94+msgstr "Rəy yaz"
9295
9396#: Dash/Previews/Reviews.qml:86
9497msgid "Review"
95−msgstr ""
98+msgstr "Rəy"
9699
97100#: Dash/Previews/Reviews.qml:121
98101msgid "Send"
99−msgstr ""
102+msgstr "Göndər"
100103
101104#: Dash/Previews/Reviews.qml:139
102105msgid "Comments:"
103−msgstr ""
106+msgstr "Şərhlər:"
104107
105108#: Greeter/Lockscreen.qml:149
106109msgid "Emergency Call"
107−msgstr ""
110+msgstr "Zərurət zəngi"
108111
109112#: Greeter/PassphraseLockscreen.qml:59
110113#, qt-format
111114msgid "Hello %1"
112−msgstr ""
115+msgstr "Xoş gördük %1"
113116
114117#: Greeter/PassphraseLockscreen.qml:59
115118msgid "Hello"
116−msgstr ""
119+msgstr "Xoş gördük"
117120
118121#: Hud/HudParametrizedActionsPage.qml:132
119122msgid "Confirm"
@@ -125,19 +128,19 @@ msgstr "Əmri söyləyin və ya yazın"
125128
126129#: Hud/Hud.qml:84
127130msgid "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..."
129132
130133#: Hud/Hud.qml:89
131134msgid "Speak Now..."
132−msgstr "Söyləyin..."
135+msgstr "Danışın..."
133136
134137#: Hud/Hud.qml:94
135138msgid "Speaking..."
136−msgstr "Söylənilir..."
139+msgstr "Danışır..."
137140
138141#: Notifications/NotificationMenuItemFactory.qml:89
139142msgid "Show password"
140−msgstr ""
143+msgstr "Parolu göstər"
141144
142145#: Panel/SearchIndicator.qml:27
143146msgid "Search"
@@ -146,13 +149,13 @@ msgstr "Axtar"
146149#: plugins/Unity/Launcher/launcheritem.cpp:43
147150#: plugins/Unity/Launcher/launcheritem.cpp:73
148151msgid "Lock to Launcher"
149−msgstr ""
152+msgstr "Panelə Bərkit"
150153
151154#: plugins/Unity/Launcher/launcheritem.cpp:73
152155msgid "Unlock from Launcher"
153−msgstr ""
156+msgstr "Paneldən Qaldır"
154157
155158#: Shell.qml:439
156159#, qt-format
157160msgid "Please enter %1"
158−msgstr ""
161+msgstr "Xahiş edirik daxil edin: %1"
po/bg.po+39−31
@@ -8,113 +8,121 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-06-27 00:06+0000\n"
12−"Last-Translator: Miroslav E. Hadzhiev (Хаджиев) "
13−"<miroslav.hadzhiev@gmail.com>\n"
11+"PO-Revision-Date: 2014-01-28 19:22+0000\n"
12+"Last-Translator: Atanas Kovachki <Unknown>\n"
1413"Language-Team: Bulgarian <bg@li.org>\n"
1514"MIME-Version: 1.0\n"
1615"Content-Type: text/plain; charset=UTF-8\n"
1716"Content-Transfer-Encoding: 8bit\n"
1817"Plural-Forms: nplurals=2; plural=n != 1;\n"
19−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
20−"X-Generator: Launchpad (build 16877)\n"
18+"X-Launchpad-Export-Date: 2014-01-30 06:07+0000\n"
19+"X-Generator: Launchpad (build 16916)\n"
2120
2221#: Components/EdgeDemoOverlay.qml:151
2322msgid "Skip intro"
24−msgstr ""
23+msgstr "Пропусни интрото"
2524
2625#: Components/EdgeDemo.qml:112
2726msgid "Right edge"
28−msgstr ""
27+msgstr "Десен край"
2928
3029#: Components/EdgeDemo.qml:113
3130msgid "Try swiping from the right edge to unlock the phone"
3231msgstr ""
32+"Опитайте се да приплъзнете пръста си от десния край към левия, за да "
33+"отключите телефона"
3334
3435#: Components/EdgeDemo.qml:144
3536msgid "Top edge"
36−msgstr ""
37+msgstr "Горен край"
3738
3839#: Components/EdgeDemo.qml:145
3940msgid "Try swiping from the top edge to access the indicators"
4041msgstr ""
42+"Опитайте се да приплъзнете пръста си от горния край към долния, за да "
43+"получите достъп до индикаторите"
4144
4245#: Components/EdgeDemo.qml:170
4346msgid "Close"
44−msgstr ""
47+msgstr "Затвори"
4548
4649#: Components/EdgeDemo.qml:171
4750msgid "Swipe up again to close the settings screen"
4851msgstr ""
52+"Отново приплъзнете пръста си нагоре за да затворите екрана с настройките"
4953
5054#: Components/EdgeDemo.qml:198
5155msgid "Left edge"
52−msgstr ""
56+msgstr "Ляв край"
5357
5458#: Components/EdgeDemo.qml:199
5559msgid "Swipe from the left to reveal the launcher for quick access to apps"
5660msgstr ""
61+"Приплъзнете пръста си от левия край към десния, за да отворите стартера за "
62+"бърз достъп до приложенията"
5763
5864#: Components/EdgeDemo.qml:226
5965msgid "Well done"
60−msgstr ""
66+msgstr "Великолепно"
6167
6268#: Components/EdgeDemo.qml:227
6369msgid ""
6470"You have now mastered the edge gestures and can start using the "
6571"phone<br><br>Tap anywhere to start"
6672msgstr ""
73+"Сега, когато сте научили основните движения, можете да започнете да "
74+"използвате телефона си.<br><br>Натиснете някъде за да започнете"
6775
6876#: Components/PageHeader.qml:364
6977msgid "Recent searches"
70−msgstr "Скорошни търсения"
78+msgstr "Последни търсения"
7179
7280#: Dash/Apps/AppPreview.qml:135
7381msgid "Rate this"
74−msgstr ""
82+msgstr "Оценете това"
7583
7684#. TRANSLATORS: Number of persons who rated this app/video/whatever
7785#: Dash/Previews/Header.qml:93
7886#, qt-format
7987msgid "(%1)"
80−msgstr ""
88+msgstr "(%1)"
8189
8290#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
8391#: Dash/Previews/Header.qml:105
8492#, qt-format
8593msgid "%1 review"
8694msgid_plural "%1 reviews"
87−msgstr[0] ""
88−msgstr[1] ""
95+msgstr[0] "%1 отзив"
96+msgstr[1] "%1 отзива"
8997
9098#: Dash/Previews/Reviews.qml:74
9199msgid "Add a review"
92−msgstr ""
100+msgstr "Добави отзив"
93101
94102#: Dash/Previews/Reviews.qml:86
95103msgid "Review"
96−msgstr ""
104+msgstr "Отзив"
97105
98106#: Dash/Previews/Reviews.qml:121
99107msgid "Send"
100−msgstr ""
108+msgstr "Изпрати"
101109
102110#: Dash/Previews/Reviews.qml:139
103111msgid "Comments:"
104−msgstr ""
112+msgstr "Коментари:"
105113
106114#: Greeter/Lockscreen.qml:149
107115msgid "Emergency Call"
108−msgstr ""
116+msgstr "Спешно повикване"
109117
110118#: Greeter/PassphraseLockscreen.qml:59
111119#, qt-format
112120msgid "Hello %1"
113−msgstr ""
121+msgstr "Здравей, %1"
114122
115123#: Greeter/PassphraseLockscreen.qml:59
116124msgid "Hello"
117−msgstr ""
125+msgstr "Здравей"
118126
119127#: Hud/HudParametrizedActionsPage.qml:132
120128msgid "Confirm"
@@ -122,23 +130,23 @@ msgstr "Потвърди"
122130
123131#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
124132msgid "Type or say a command"
125−msgstr ""
133+msgstr "Въведете или кажете команда"
126134
127135#: Hud/Hud.qml:84
128136msgid "Loading. Please Wait..."
129−msgstr ""
137+msgstr "Зарежда се. Моля, почакайте..."
130138
131139#: Hud/Hud.qml:89
132140msgid "Speak Now..."
133−msgstr ""
141+msgstr "Говорете сега..."
134142
135143#: Hud/Hud.qml:94
136144msgid "Speaking..."
137−msgstr ""
145+msgstr "Говорете..."
138146
139147#: Notifications/NotificationMenuItemFactory.qml:89
140148msgid "Show password"
141−msgstr ""
149+msgstr "Покажи паролата"
142150
143151#: Panel/SearchIndicator.qml:27
144152msgid "Search"
@@ -147,13 +155,13 @@ msgstr "Търсене"
147155#: plugins/Unity/Launcher/launcheritem.cpp:43
148156#: plugins/Unity/Launcher/launcheritem.cpp:73
149157msgid "Lock to Launcher"
150−msgstr ""
158+msgstr "Заключване към панела"
151159
152160#: plugins/Unity/Launcher/launcheritem.cpp:73
153161msgid "Unlock from Launcher"
154−msgstr ""
162+msgstr "Отключи от панела за стартиране"
155163
156164#: Shell.qml:439
157165#, qt-format
158166msgid "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 ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-10-18 12:26+0000\n"
12−"Last-Translator: Phillip Sz <Unknown>\n"
11+"PO-Revision-Date: 2014-01-15 11:01+0000\n"
12+"Last-Translator: Dennis Baudys <Unknown>\n"
1313"Language-Team: German <de@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
18+"X-Launchpad-Export-Date: 2014-01-16 06:09+0000\n"
19+"X-Generator: Launchpad (build 16901)\n"
2020
2121#: Components/EdgeDemoOverlay.qml:151
2222msgid "Skip intro"
23−msgstr "Überspringe Einführung"
23+msgstr "Einführung überspringen"
2424
2525#: Components/EdgeDemo.qml:112
2626msgid "Right edge"
@@ -125,7 +125,7 @@ msgstr "Bestätigen"
125125
126126#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
127127msgid "Type or say a command"
128−msgstr "Geben Sie einen Befehl ein oder sprechen Sie ihn"
128+msgstr "Befehl eingeben oder sprechen"
129129
130130#: Hud/Hud.qml:84
131131msgid "Loading. Please Wait..."
@@ -137,11 +137,11 @@ msgstr "Sprechen Sie jetzt …"
137137
138138#: Hud/Hud.qml:94
139139msgid "Speaking..."
140−msgstr "Sie sprechen …"
140+msgstr "Sprechen Sie …"
141141
142142#: Notifications/NotificationMenuItemFactory.qml:89
143143msgid "Show password"
144−msgstr ""
144+msgstr "Passwort anzeigen"
145145
146146#: Panel/SearchIndicator.qml:27
147147msgid "Search"
po/el.po+32−28
@@ -8,61 +8,65 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-06-27 00:53+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
11+"PO-Revision-Date: 2014-01-15 16:34+0000\n"
12+"Last-Translator: Filippos Kolyvas <Unknown>\n"
1313"Language-Team: Greek <el@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
18+"X-Launchpad-Export-Date: 2014-01-16 06:09+0000\n"
19+"X-Generator: Launchpad (build 16901)\n"
2020
2121#: Components/EdgeDemoOverlay.qml:151
2222msgid "Skip intro"
23−msgstr ""
23+msgstr "Παράλειψη εισαγωγής"
2424
2525#: Components/EdgeDemo.qml:112
2626msgid "Right edge"
27−msgstr ""
27+msgstr "Δεξί άκρο"
2828
2929#: Components/EdgeDemo.qml:113
3030msgid "Try swiping from the right edge to unlock the phone"
31−msgstr ""
31+msgstr "Σύρετε από το δεξί άκρο για ξεκλείδωμα του τηλεφώνου"
3232
3333#: Components/EdgeDemo.qml:144
3434msgid "Top edge"
35−msgstr ""
35+msgstr "Πάνω άκρο"
3636
3737#: Components/EdgeDemo.qml:145
3838msgid "Try swiping from the top edge to access the indicators"
39−msgstr ""
39+msgstr "Σύρετε από το πάνω άκρο για πρόσβαση στις ρυθμίσεις"
4040
4141#: Components/EdgeDemo.qml:170
4242msgid "Close"
43−msgstr ""
43+msgstr "Κλείσιμο"
4444
4545#: Components/EdgeDemo.qml:171
4646msgid "Swipe up again to close the settings screen"
47−msgstr ""
47+msgstr "Σύρετε προς τα επάνω για κλείσιμο των ρυθμίσεων"
4848
4949#: Components/EdgeDemo.qml:198
5050msgid "Left edge"
51−msgstr ""
51+msgstr "Αριστερό άκρο"
5252
5353#: Components/EdgeDemo.qml:199
5454msgid "Swipe from the left to reveal the launcher for quick access to apps"
5555msgstr ""
56+"Σύρετε από τα αριστερό άκρο για εμφάνιση του εκκινητή για άμεση πρόσβαση "
57+"στις εφαρμογές"
5658
5759#: Components/EdgeDemo.qml:226
5860msgid "Well done"
59−msgstr ""
61+msgstr "Συγχαρητήρια"
6062
6163#: Components/EdgeDemo.qml:227
6264msgid ""
6365"You have now mastered the edge gestures and can start using the "
6466"phone<br><br>Tap anywhere to start"
6567msgstr ""
68+"Τώρα γνωρίζετε τις χειρονομίες άκρων και μπορείτε να αρχίσετε να "
69+"χρησιμοποιείτε το τηλέφωνο<br><br>Πατήστε οπουδήποτε για να ξεκινήσετε"
6670
6771#: Components/PageHeader.qml:364
6872msgid "Recent searches"
@@ -70,50 +74,50 @@ msgstr "Πρόσφατες αναζητήσεις"
7074
7175#: Dash/Apps/AppPreview.qml:135
7276msgid "Rate this"
73−msgstr ""
77+msgstr "Βαθμολογήστε το"
7478
7579#. TRANSLATORS: Number of persons who rated this app/video/whatever
7680#: Dash/Previews/Header.qml:93
7781#, qt-format
7882msgid "(%1)"
79−msgstr ""
83+msgstr "(%1)"
8084
8185#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
8286#: Dash/Previews/Header.qml:105
8387#, qt-format
8488msgid "%1 review"
8589msgid_plural "%1 reviews"
86−msgstr[0] ""
87−msgstr[1] ""
90+msgstr[0] "%1 αξιολόγηση"
91+msgstr[1] "%1 αξιολογήσεις"
8892
8993#: Dash/Previews/Reviews.qml:74
9094msgid "Add a review"
91−msgstr ""
95+msgstr "Προσθέστε την αξιολόγησή σας"
9296
9397#: Dash/Previews/Reviews.qml:86
9498msgid "Review"
95−msgstr ""
99+msgstr "Αξιολόγηση"
96100
97101#: Dash/Previews/Reviews.qml:121
98102msgid "Send"
99−msgstr ""
103+msgstr "Αποστολή"
100104
101105#: Dash/Previews/Reviews.qml:139
102106msgid "Comments:"
103−msgstr ""
107+msgstr "Σχόλια:"
104108
105109#: Greeter/Lockscreen.qml:149
106110msgid "Emergency Call"
107−msgstr ""
111+msgstr "Κλήση έκτακτης ανάγκης"
108112
109113#: Greeter/PassphraseLockscreen.qml:59
110114#, qt-format
111115msgid "Hello %1"
112−msgstr ""
116+msgstr "Γεια σας %1"
113117
114118#: Greeter/PassphraseLockscreen.qml:59
115119msgid "Hello"
116−msgstr ""
120+msgstr "Γεια σας"
117121
118122#: Hud/HudParametrizedActionsPage.qml:132
119123msgid "Confirm"
@@ -137,7 +141,7 @@ msgstr "Ομιλία..."
137141
138142#: Notifications/NotificationMenuItemFactory.qml:89
139143msgid "Show password"
140−msgstr ""
144+msgstr "Εμφάνιση κωδικού"
141145
142146#: Panel/SearchIndicator.qml:27
143147msgid "Search"
@@ -146,13 +150,13 @@ msgstr "Αναζήτηση"
146150#: plugins/Unity/Launcher/launcheritem.cpp:43
147151#: plugins/Unity/Launcher/launcheritem.cpp:73
148152msgid "Lock to Launcher"
149−msgstr ""
153+msgstr "Διατήρηση στον εκκινητή"
150154
151155#: plugins/Unity/Launcher/launcheritem.cpp:73
152156msgid "Unlock from Launcher"
153−msgstr ""
157+msgstr "Απομάκρυνση από τον εκκινητή"
154158
155159#: Shell.qml:439
156160#, qt-format
157161msgid "Please enter %1"
158−msgstr ""
162+msgstr "Πληκτρολογήστε %1"
po/en_GB.po+28−26
@@ -8,61 +8,63 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-06-27 08:53+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
11+"PO-Revision-Date: 2014-01-14 20:46+0000\n"
12+"Last-Translator: Dan Bishop <dan@danbishop.org>\n"
1313"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
18+"X-Launchpad-Export-Date: 2014-01-15 06:35+0000\n"
19+"X-Generator: Launchpad (build 16890)\n"
2020
2121#: Components/EdgeDemoOverlay.qml:151
2222msgid "Skip intro"
23−msgstr ""
23+msgstr "Skip intro"
2424
2525#: Components/EdgeDemo.qml:112
2626msgid "Right edge"
27−msgstr ""
27+msgstr "Right edge"
2828
2929#: Components/EdgeDemo.qml:113
3030msgid "Try swiping from the right edge to unlock the phone"
31−msgstr ""
31+msgstr "Try swiping from the right edge to unlock the phone"
3232
3333#: Components/EdgeDemo.qml:144
3434msgid "Top edge"
35−msgstr ""
35+msgstr "Top edge"
3636
3737#: Components/EdgeDemo.qml:145
3838msgid "Try swiping from the top edge to access the indicators"
39−msgstr ""
39+msgstr "Try swiping from the top edge to access the indicators"
4040
4141#: Components/EdgeDemo.qml:170
4242msgid "Close"
43−msgstr ""
43+msgstr "Close"
4444
4545#: Components/EdgeDemo.qml:171
4646msgid "Swipe up again to close the settings screen"
47−msgstr ""
47+msgstr "Swipe up again to close the settings screen"
4848
4949#: Components/EdgeDemo.qml:198
5050msgid "Left edge"
51−msgstr ""
51+msgstr "Left edge"
5252
5353#: Components/EdgeDemo.qml:199
5454msgid "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"
5656
5757#: Components/EdgeDemo.qml:226
5858msgid "Well done"
59−msgstr ""
59+msgstr "Well done"
6060
6161#: Components/EdgeDemo.qml:227
6262msgid ""
6363"You have now mastered the edge gestures and can start using the "
6464"phone<br><br>Tap anywhere to start"
6565msgstr ""
66+"You have now mastered the edge gestures and can start using the "
67+"phone<br><br>Tap anywhere to start"
6668
6769#: Components/PageHeader.qml:364
6870msgid "Recent searches"
@@ -70,41 +72,41 @@ msgstr "Recent searches"
7072
7173#: Dash/Apps/AppPreview.qml:135
7274msgid "Rate this"
73−msgstr ""
75+msgstr "Rate this"
7476
7577#. TRANSLATORS: Number of persons who rated this app/video/whatever
7678#: Dash/Previews/Header.qml:93
7779#, qt-format
7880msgid "(%1)"
79−msgstr ""
81+msgstr "(%1)"
8082
8183#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
8284#: Dash/Previews/Header.qml:105
8385#, qt-format
8486msgid "%1 review"
8587msgid_plural "%1 reviews"
86−msgstr[0] ""
87−msgstr[1] ""
88+msgstr[0] "%1 review"
89+msgstr[1] "%1 reviews"
8890
8991#: Dash/Previews/Reviews.qml:74
9092msgid "Add a review"
91−msgstr ""
93+msgstr "Add a review"
9294
9395#: Dash/Previews/Reviews.qml:86
9496msgid "Review"
95−msgstr ""
97+msgstr "Review"
9698
9799#: Dash/Previews/Reviews.qml:121
98100msgid "Send"
99−msgstr ""
101+msgstr "Send"
100102
101103#: Dash/Previews/Reviews.qml:139
102104msgid "Comments:"
103−msgstr ""
105+msgstr "Comments:"
104106
105107#: Greeter/Lockscreen.qml:149
106108msgid "Emergency Call"
107−msgstr ""
109+msgstr "Emergency Call"
108110
109111#: Greeter/PassphraseLockscreen.qml:59
110112#, qt-format
@@ -137,7 +139,7 @@ msgstr "Speaking..."
137139
138140#: Notifications/NotificationMenuItemFactory.qml:89
139141msgid "Show password"
140−msgstr ""
142+msgstr "Show password"
141143
142144#: Panel/SearchIndicator.qml:27
143145msgid "Search"
@@ -146,11 +148,11 @@ msgstr "Search"
146148#: plugins/Unity/Launcher/launcheritem.cpp:43
147149#: plugins/Unity/Launcher/launcheritem.cpp:73
148150msgid "Lock to Launcher"
149−msgstr ""
151+msgstr "Lock to Launcher"
150152
151153#: plugins/Unity/Launcher/launcheritem.cpp:73
152154msgid "Unlock from Launcher"
153−msgstr ""
155+msgstr "Unlock from Launcher"
154156
155157#: Shell.qml:439
156158#, qt-format
po/es.po+7−6
@@ -8,15 +8,15 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-11-20 08:46+0000\n"
12−"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
11+"PO-Revision-Date: 2014-01-15 18:49+0000\n"
12+"Last-Translator: Paco Molinero <paco@byasl.com>\n"
1313"Language-Team: Spanish <es@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
18+"X-Launchpad-Export-Date: 2014-01-16 06:09+0000\n"
19+"X-Generator: Launchpad (build 16901)\n"
2020
2121#: Components/EdgeDemoOverlay.qml:151
2222msgid "Skip intro"
@@ -36,7 +36,8 @@ msgstr "Borde superior"
3636
3737#: Components/EdgeDemo.qml:145
3838msgid "Try swiping from the top edge to access the indicators"
39−msgstr "Deslice el dedo desde el borde superior para acceder a los menús"
39+msgstr ""
40+"Deslice el dedo desde el borde superior para acceder a los indicadores"
4041
4142#: Components/EdgeDemo.qml:170
4243msgid "Close"
@@ -113,7 +114,7 @@ msgstr "Llamada de emergencia"
113114#: Greeter/PassphraseLockscreen.qml:59
114115#, qt-format
115116msgid "Hello %1"
116−msgstr "Hola %1"
117+msgstr "Hola, %1"
117118
118119#: Greeter/PassphraseLockscreen.qml:59
119120msgid "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 ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"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"
1212"Last-Translator: Jógvan Olsen <jeggy@jebster.net>\n"
1313"Language-Team: Faroese <fo@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
18+"X-Launchpad-Export-Date: 2014-01-15 06:35+0000\n"
19+"X-Generator: Launchpad (build 16890)\n"
2020
2121#: Components/EdgeDemoOverlay.qml:151
2222msgid "Skip intro"
@@ -24,7 +24,7 @@ msgstr ""
2424
2525#: Components/EdgeDemo.qml:112
2626msgid "Right edge"
27−msgstr ""
27+msgstr "Høgra kant"
2828
2929#: Components/EdgeDemo.qml:113
3030msgid "Try swiping from the right edge to unlock the phone"
@@ -32,7 +32,7 @@ msgstr ""
3232
3333#: Components/EdgeDemo.qml:144
3434msgid "Top edge"
35−msgstr ""
35+msgstr "Topp kantur"
3636
3737#: Components/EdgeDemo.qml:145
3838msgid "Try swiping from the top edge to access the indicators"
po/fr.po+29−29
@@ -8,23 +8,23 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-06-27 03:21+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
11+"PO-Revision-Date: 2014-01-28 00:34+0000\n"
12+"Last-Translator: Pierre <Unknown>\n"
1313"Language-Team: French <fr@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
18+"X-Launchpad-Export-Date: 2014-01-28 07:06+0000\n"
19+"X-Generator: Launchpad (build 16914)\n"
2020
2121#: Components/EdgeDemoOverlay.qml:151
2222msgid "Skip intro"
23−msgstr ""
23+msgstr "Passer l'intro"
2424
2525#: Components/EdgeDemo.qml:112
2626msgid "Right edge"
27−msgstr ""
27+msgstr "Bord droit"
2828
2929#: Components/EdgeDemo.qml:113
3030msgid "Try swiping from the right edge to unlock the phone"
@@ -32,7 +32,7 @@ msgstr ""
3232
3333#: Components/EdgeDemo.qml:144
3434msgid "Top edge"
35−msgstr ""
35+msgstr "Bord supérieur"
3636
3737#: Components/EdgeDemo.qml:145
3838msgid "Try swiping from the top edge to access the indicators"
@@ -40,7 +40,7 @@ msgstr ""
4040
4141#: Components/EdgeDemo.qml:170
4242msgid "Close"
43−msgstr ""
43+msgstr "Fermer"
4444
4545#: Components/EdgeDemo.qml:171
4646msgid "Swipe up again to close the settings screen"
@@ -48,7 +48,7 @@ msgstr ""
4848
4949#: Components/EdgeDemo.qml:198
5050msgid "Left edge"
51−msgstr ""
51+msgstr "Bord gauche"
5252
5353#: Components/EdgeDemo.qml:199
5454msgid "Swipe from the left to reveal the launcher for quick access to apps"
@@ -66,70 +66,70 @@ msgstr ""
6666
6767#: Components/PageHeader.qml:364
6868msgid "Recent searches"
69−msgstr ""
69+msgstr "Recherches récentes"
7070
7171#: Dash/Apps/AppPreview.qml:135
7272msgid "Rate this"
73−msgstr ""
73+msgstr "Evaluez ceci"
7474
7575#. TRANSLATORS: Number of persons who rated this app/video/whatever
7676#: Dash/Previews/Header.qml:93
7777#, qt-format
7878msgid "(%1)"
79−msgstr ""
79+msgstr "(%1)"
8080
8181#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
8282#: Dash/Previews/Header.qml:105
8383#, qt-format
8484msgid "%1 review"
8585msgid_plural "%1 reviews"
86−msgstr[0] ""
87−msgstr[1] ""
86+msgstr[0] "%1 avis"
87+msgstr[1] "%1 avis"
8888
8989#: Dash/Previews/Reviews.qml:74
9090msgid "Add a review"
91−msgstr ""
91+msgstr "Ajouter un avis"
9292
9393#: Dash/Previews/Reviews.qml:86
9494msgid "Review"
95−msgstr ""
95+msgstr "Avis"
9696
9797#: Dash/Previews/Reviews.qml:121
9898msgid "Send"
99−msgstr ""
99+msgstr "Envoyer"
100100
101101#: Dash/Previews/Reviews.qml:139
102102msgid "Comments:"
103−msgstr ""
103+msgstr "Commentaires :"
104104
105105#: Greeter/Lockscreen.qml:149
106106msgid "Emergency Call"
107−msgstr ""
107+msgstr "Appel d'urgence"
108108
109109#: Greeter/PassphraseLockscreen.qml:59
110110#, qt-format
111111msgid "Hello %1"
112−msgstr ""
112+msgstr "Bonjour %1"
113113
114114#: Greeter/PassphraseLockscreen.qml:59
115115msgid "Hello"
116−msgstr ""
116+msgstr "Bonjour"
117117
118118#: Hud/HudParametrizedActionsPage.qml:132
119119msgid "Confirm"
120−msgstr ""
120+msgstr "Confirmez"
121121
122122#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
123123msgid "Type or say a command"
124−msgstr ""
124+msgstr "Rédigez ou dictez une commande"
125125
126126#: Hud/Hud.qml:84
127127msgid "Loading. Please Wait..."
128−msgstr ""
128+msgstr "Chargement. Veuillez patienter…"
129129
130130#: Hud/Hud.qml:89
131131msgid "Speak Now..."
132−msgstr ""
132+msgstr "Parlez maintenant…"
133133
134134#: Hud/Hud.qml:94
135135msgid "Speaking..."
@@ -137,16 +137,16 @@ msgstr ""
137137
138138#: Notifications/NotificationMenuItemFactory.qml:89
139139msgid "Show password"
140−msgstr ""
140+msgstr "Afficher le mot de passe"
141141
142142#: Panel/SearchIndicator.qml:27
143143msgid "Search"
144−msgstr ""
144+msgstr "Rechercher"
145145
146146#: plugins/Unity/Launcher/launcheritem.cpp:43
147147#: plugins/Unity/Launcher/launcheritem.cpp:73
148148msgid "Lock to Launcher"
149−msgstr ""
149+msgstr "Conserver dans le lanceur"
150150
151151#: plugins/Unity/Launcher/launcheritem.cpp:73
152152msgid "Unlock from Launcher"
@@ -155,4 +155,4 @@ msgstr ""
155155#: Shell.qml:439
156156#, qt-format
157157msgid "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 ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2014-01-07 18:02+0000\n"
12−"Last-Translator: Gabor Kelemen <kelemeng@gnome.hu>\n"
11+"PO-Revision-Date: 2014-01-14 23:02+0000\n"
12+"Last-Translator: Kristóf Kiszel <Unknown>\n"
1313"Language-Team: Hungarian <hu@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-01-08 05:43+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
18+"X-Launchpad-Export-Date: 2014-01-15 06:35+0000\n"
19+"X-Generator: Launchpad (build 16890)\n"
2020
2121#: Components/EdgeDemoOverlay.qml:151
2222msgid "Skip intro"
@@ -133,7 +133,7 @@ msgstr "Betöltés, kis türelmet…"
133133
134134#: Hud/Hud.qml:89
135135msgid "Speak Now..."
136−msgstr "Beszéljen most…"
136+msgstr "Most beszéljen…"
137137
138138#: Hud/Hud.qml:94
139139msgid "Speaking..."
po/it.po+7−7
@@ -8,15 +8,15 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-10-07 09:34+0000\n"
12−"Last-Translator: Claudio Arseni <claudio.arseni@gmail.com>\n"
11+"PO-Revision-Date: 2014-01-22 09:15+0000\n"
12+"Last-Translator: Domenico <domenico.verde125@live.it>\n"
1313"Language-Team: Italian <it@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
18+"X-Launchpad-Export-Date: 2014-01-23 06:00+0000\n"
19+"X-Generator: Launchpad (build 16901)\n"
2020
2121#: Components/EdgeDemoOverlay.qml:151
2222msgid "Skip intro"
@@ -144,7 +144,7 @@ msgstr "Sto parlando..."
144144
145145#: Notifications/NotificationMenuItemFactory.qml:89
146146msgid "Show password"
147−msgstr ""
147+msgstr "Mostra password"
148148
149149#: Panel/SearchIndicator.qml:27
150150msgid "Search"
@@ -153,11 +153,11 @@ msgstr "Cerca"
153153#: plugins/Unity/Launcher/launcheritem.cpp:43
154154#: plugins/Unity/Launcher/launcheritem.cpp:73
155155msgid "Lock to Launcher"
156−msgstr ""
156+msgstr "Blocca nel Launcher"
157157
158158#: plugins/Unity/Launcher/launcheritem.cpp:73
159159msgid "Unlock from Launcher"
160−msgstr ""
160+msgstr "Sblocca dal Launcher"
161161
162162#: Shell.qml:439
163163#, qt-format
po/ja.po+20−20
@@ -8,15 +8,15 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-06-26 22:36+0000\n"
12−"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
11+"PO-Revision-Date: 2014-01-18 07:01+0000\n"
12+"Last-Translator: Shushi Kurose <md81bird@hitaki.net>\n"
1313"Language-Team: Japanese <ja@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
18+"X-Launchpad-Export-Date: 2014-01-19 06:02+0000\n"
19+"X-Generator: Launchpad (build 16901)\n"
2020
2121#: Components/EdgeDemoOverlay.qml:151
2222msgid "Skip intro"
@@ -24,7 +24,7 @@ msgstr ""
2424
2525#: Components/EdgeDemo.qml:112
2626msgid "Right edge"
27−msgstr ""
27+msgstr "右端"
2828
2929#: Components/EdgeDemo.qml:113
3030msgid "Try swiping from the right edge to unlock the phone"
@@ -32,7 +32,7 @@ msgstr ""
3232
3333#: Components/EdgeDemo.qml:144
3434msgid "Top edge"
35−msgstr ""
35+msgstr "上端"
3636
3737#: Components/EdgeDemo.qml:145
3838msgid "Try swiping from the top edge to access the indicators"
@@ -40,7 +40,7 @@ msgstr ""
4040
4141#: Components/EdgeDemo.qml:170
4242msgid "Close"
43−msgstr ""
43+msgstr "閉じる"
4444
4545#: Components/EdgeDemo.qml:171
4646msgid "Swipe up again to close the settings screen"
@@ -48,7 +48,7 @@ msgstr ""
4848
4949#: Components/EdgeDemo.qml:198
5050msgid "Left edge"
51−msgstr ""
51+msgstr "左端"
5252
5353#: Components/EdgeDemo.qml:199
5454msgid "Swipe from the left to reveal the launcher for quick access to apps"
@@ -66,7 +66,7 @@ msgstr ""
6666
6767#: Components/PageHeader.qml:364
6868msgid "Recent searches"
69−msgstr ""
69+msgstr "最近の検索"
7070
7171#: Dash/Apps/AppPreview.qml:135
7272msgid "Rate this"
@@ -76,7 +76,7 @@ msgstr ""
7676#: Dash/Previews/Header.qml:93
7777#, qt-format
7878msgid "(%1)"
79−msgstr ""
79+msgstr "(%1)"
8080
8181#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
8282#: Dash/Previews/Header.qml:105
@@ -96,11 +96,11 @@ msgstr ""
9696
9797#: Dash/Previews/Reviews.qml:121
9898msgid "Send"
99−msgstr ""
99+msgstr "送信"
100100
101101#: Dash/Previews/Reviews.qml:139
102102msgid "Comments:"
103−msgstr ""
103+msgstr "コメント:"
104104
105105#: Greeter/Lockscreen.qml:149
106106msgid "Emergency Call"
@@ -113,11 +113,11 @@ msgstr ""
113113
114114#: Greeter/PassphraseLockscreen.qml:59
115115msgid "Hello"
116−msgstr ""
116+msgstr "こんにちは"
117117
118118#: Hud/HudParametrizedActionsPage.qml:132
119119msgid "Confirm"
120−msgstr ""
120+msgstr "確認"
121121
122122#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
123123msgid "Type or say a command"
@@ -125,11 +125,11 @@ msgstr ""
125125
126126#: Hud/Hud.qml:84
127127msgid "Loading. Please Wait..."
128−msgstr ""
128+msgstr "読み込み中です。お待ちください..."
129129
130130#: Hud/Hud.qml:89
131131msgid "Speak Now..."
132−msgstr ""
132+msgstr "音声入力を開始..."
133133
134134#: Hud/Hud.qml:94
135135msgid "Speaking..."
@@ -137,20 +137,20 @@ msgstr ""
137137
138138#: Notifications/NotificationMenuItemFactory.qml:89
139139msgid "Show password"
140−msgstr ""
140+msgstr "パスワードを表示"
141141
142142#: Panel/SearchIndicator.qml:27
143143msgid "Search"
144−msgstr ""
144+msgstr "検索"
145145
146146#: plugins/Unity/Launcher/launcheritem.cpp:43
147147#: plugins/Unity/Launcher/launcheritem.cpp:73
148148msgid "Lock to Launcher"
149−msgstr ""
149+msgstr "Launcherに登録"
150150
151151#: plugins/Unity/Launcher/launcheritem.cpp:73
152152msgid "Unlock from Launcher"
153−msgstr ""
153+msgstr "Launcherへの登録を解除"
154154
155155#: Shell.qml:439
156156#, 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 ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-06-27 07:19+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
11+"PO-Revision-Date: 2014-01-15 16:42+0000\n"
12+"Last-Translator: Hannie Dumoleyn <Unknown>\n"
1313"Language-Team: Dutch <nl@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
18+"X-Launchpad-Export-Date: 2014-01-16 06:09+0000\n"
19+"X-Generator: Launchpad (build 16901)\n"
2020
2121#: Components/EdgeDemoOverlay.qml:151
2222msgid "Skip intro"
23−msgstr ""
23+msgstr "Intro overslaan"
2424
2525#: Components/EdgeDemo.qml:112
2626msgid "Right edge"
27−msgstr ""
27+msgstr "Rechterrand"
2828
2929#: Components/EdgeDemo.qml:113
3030msgid "Try swiping from the right edge to unlock the phone"
@@ -32,7 +32,7 @@ msgstr ""
3232
3333#: Components/EdgeDemo.qml:144
3434msgid "Top edge"
35−msgstr ""
35+msgstr "Bovenrand"
3636
3737#: Components/EdgeDemo.qml:145
3838msgid "Try swiping from the top edge to access the indicators"
@@ -40,29 +40,31 @@ msgstr ""
4040
4141#: Components/EdgeDemo.qml:170
4242msgid "Close"
43−msgstr ""
43+msgstr "Sluiten"
4444
4545#: Components/EdgeDemo.qml:171
4646msgid "Swipe up again to close the settings screen"
47−msgstr ""
47+msgstr "Veeg nogmaals omhoog om het instellingenscherm te sluiten"
4848
4949#: Components/EdgeDemo.qml:198
5050msgid "Left edge"
51−msgstr ""
51+msgstr "Linkerrand"
5252
5353#: Components/EdgeDemo.qml:199
5454msgid "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"
5656
5757#: Components/EdgeDemo.qml:226
5858msgid "Well done"
59−msgstr ""
59+msgstr "Goed gedaan"
6060
6161#: Components/EdgeDemo.qml:227
6262msgid ""
6363"You have now mastered the edge gestures and can start using the "
6464"phone<br><br>Tap anywhere to start"
6565msgstr ""
66+"Nu je het vegen onder de knie hebt, kun je de telefoon gebruiken<br><br>Tik "
67+"ergens om te beginnen"
6668
6769#: Components/PageHeader.qml:364
6870msgid "Recent searches"
@@ -70,50 +72,50 @@ msgstr "Recente zoekopdrachten"
7072
7173#: Dash/Apps/AppPreview.qml:135
7274msgid "Rate this"
73−msgstr ""
75+msgstr "Beoordeel dit"
7476
7577#. TRANSLATORS: Number of persons who rated this app/video/whatever
7678#: Dash/Previews/Header.qml:93
7779#, qt-format
7880msgid "(%1)"
79−msgstr ""
81+msgstr "(%1)"
8082
8183#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
8284#: Dash/Previews/Header.qml:105
8385#, qt-format
8486msgid "%1 review"
8587msgid_plural "%1 reviews"
86−msgstr[0] ""
87−msgstr[1] ""
88+msgstr[0] "%1 recensie"
89+msgstr[1] "%1 recensies"
8890
8991#: Dash/Previews/Reviews.qml:74
9092msgid "Add a review"
91−msgstr ""
93+msgstr "Voeg recensie toe"
9294
9395#: Dash/Previews/Reviews.qml:86
9496msgid "Review"
95−msgstr ""
97+msgstr "Recensie"
9698
9799#: Dash/Previews/Reviews.qml:121
98100msgid "Send"
99−msgstr ""
101+msgstr "Versturen"
100102
101103#: Dash/Previews/Reviews.qml:139
102104msgid "Comments:"
103−msgstr ""
105+msgstr "Reacties:"
104106
105107#: Greeter/Lockscreen.qml:149
106108msgid "Emergency Call"
107−msgstr ""
109+msgstr "Noodoproep"
108110
109111#: Greeter/PassphraseLockscreen.qml:59
110112#, qt-format
111113msgid "Hello %1"
112−msgstr ""
114+msgstr "Hallo %1"
113115
114116#: Greeter/PassphraseLockscreen.qml:59
115117msgid "Hello"
116−msgstr ""
118+msgstr "Hallo"
117119
118120#: Hud/HudParametrizedActionsPage.qml:132
119121msgid "Confirm"
@@ -137,7 +139,7 @@ msgstr "Inspreken…"
137139
138140#: Notifications/NotificationMenuItemFactory.qml:89
139141msgid "Show password"
140−msgstr ""
142+msgstr "Wachtwoord tonen"
141143
142144#: Panel/SearchIndicator.qml:27
143145msgid "Search"
@@ -146,13 +148,13 @@ msgstr "Zoeken"
146148#: plugins/Unity/Launcher/launcheritem.cpp:43
147149#: plugins/Unity/Launcher/launcheritem.cpp:73
148150msgid "Lock to Launcher"
149−msgstr ""
151+msgstr "In Starter vastzetten"
150152
151153#: plugins/Unity/Launcher/launcheritem.cpp:73
152154msgid "Unlock from Launcher"
153−msgstr ""
155+msgstr "Uit Starter verwijderen"
154156
155157#: Shell.qml:439
156158#, qt-format
157159msgid "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 ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-10-01 13:05+0000\n"
12−"Last-Translator: Rafael Neri <Unknown>\n"
11+"PO-Revision-Date: 2014-01-18 23:24+0000\n"
12+"Last-Translator: Fábio Nogueira <deb-user-ba@ubuntu.com>\n"
1313"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
18+"X-Launchpad-Export-Date: 2014-01-19 06:02+0000\n"
19+"X-Generator: Launchpad (build 16901)\n"
2020
2121#: Components/EdgeDemoOverlay.qml:151
2222msgid "Skip intro"
@@ -65,6 +65,8 @@ msgid ""
6565"You have now mastered the edge gestures and can start using the "
6666"phone<br><br>Tap anywhere to start"
6767msgstr ""
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"
6870
6971#: Components/PageHeader.qml:364
7072msgid "Recent searches"
@@ -139,7 +141,7 @@ msgstr "Falando..."
139141
140142#: Notifications/NotificationMenuItemFactory.qml:89
141143msgid "Show password"
142−msgstr ""
144+msgstr "Exibir senha"
143145
144146#: Panel/SearchIndicator.qml:27
145147msgid "Search"
@@ -148,11 +150,11 @@ msgstr "Pesquisar"
148150#: plugins/Unity/Launcher/launcheritem.cpp:43
149151#: plugins/Unity/Launcher/launcheritem.cpp:73
150152msgid "Lock to Launcher"
151−msgstr ""
153+msgstr "Bloquear no lançador"
152154
153155#: plugins/Unity/Launcher/launcheritem.cpp:73
154156msgid "Unlock from Launcher"
155−msgstr ""
157+msgstr "Desbloquear do lançador"
156158
157159#: Shell.qml:439
158160#, qt-format
po/ru.po+9−6
@@ -8,16 +8,16 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2014-01-07 05:21+0000\n"
12−"Last-Translator: Ivlev Denis <Unknown>\n"
11+"PO-Revision-Date: 2014-01-26 15:56+0000\n"
12+"Last-Translator: Zonov Roman <Unknown>\n"
1313"Language-Team: Russian <ru@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-01-08 05:43+0000\n"
20−"X-Generator: Launchpad (build 16877)\n"
19+"X-Launchpad-Export-Date: 2014-01-27 05:48+0000\n"
20+"X-Generator: Launchpad (build 16914)\n"
2121
2222#: Components/EdgeDemoOverlay.qml:151
2323msgid "Skip intro"
@@ -69,6 +69,8 @@ msgid ""
6969"You have now mastered the edge gestures and can start using the "
7070"phone<br><br>Tap anywhere to start"
7171msgstr ""
72+"Теперь, когда вы изучили основные движения, вы можете начать использовать "
73+"телефон.<br><br>Нажмите, чтобы начать"
7274
7375#: Components/PageHeader.qml:364
7476msgid "Recent searches"
@@ -89,8 +91,9 @@ msgstr "(%1)"
8991#, qt-format
9092msgid "%1 review"
9193msgid_plural "%1 reviews"
92−msgstr[0] "%1 отзыва"
93−msgstr[1] "%1 отзывов"
94+msgstr[0] "%1 отзыв"
95+msgstr[1] "%1 отзыва"
96+msgstr[2] "%1 отзывов"
9497
9598#: Dash/Previews/Reviews.qml:74
9699msgid "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 ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-12-12 16:06+0000\n"
12−"Last-Translator: Arda Ünlü <aarda.uunlu@gmail.com>\n"
11+"PO-Revision-Date: 2014-01-14 19:05+0000\n"
12+"Last-Translator: Osman Coşkun <Unknown>\n"
1313"Language-Team: Turkish <tr@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
18+"X-Launchpad-Export-Date: 2014-01-15 06:35+0000\n"
19+"X-Generator: Launchpad (build 16890)\n"
2020
2121#: Components/EdgeDemoOverlay.qml:151
2222msgid "Skip intro"
@@ -64,6 +64,8 @@ msgid ""
6464"You have now mastered the edge gestures and can start using the "
6565"phone<br><br>Tap anywhere to start"
6666msgstr ""
67+"Kenar hareketlerini öğrendiniz ve herhangi bir yere dokunarak telefonunuzu "
68+"<br><br> kullanmaya başlayabilirsiniz"
6769
6870#: Components/PageHeader.qml:364
6971msgid "Recent searches"
po/ug.po+7−7
@@ -8,15 +8,15 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"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"
1212"Last-Translator: Gheyret T.Kenji <Unknown>\n"
1313"Language-Team: Uyghur <ug@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
18+"X-Launchpad-Export-Date: 2014-01-18 07:11+0000\n"
19+"X-Generator: Launchpad (build 16901)\n"
2020
2121#: Components/EdgeDemoOverlay.qml:151
2222msgid "Skip intro"
@@ -91,7 +91,7 @@ msgstr ""
9191
9292#: Dash/Previews/Reviews.qml:86
9393msgid "Review"
94−msgstr ""
94+msgstr "تەكشۈر"
9595
9696#: Dash/Previews/Reviews.qml:121
9797msgid "Send"
@@ -136,7 +136,7 @@ msgstr "سۆزلەۋاتىسىز…"
136136
137137#: Notifications/NotificationMenuItemFactory.qml:89
138138msgid "Show password"
139−msgstr ""
139+msgstr "ئىم كۆرسەت"
140140
141141#: Panel/SearchIndicator.qml:27
142142msgid "Search"
@@ -145,11 +145,11 @@ msgstr "ئىزدە"
145145#: plugins/Unity/Launcher/launcheritem.cpp:43
146146#: plugins/Unity/Launcher/launcheritem.cpp:73
147147msgid "Lock to Launcher"
148−msgstr ""
148+msgstr "ئىجراچىغا سولىۋەت"
149149
150150#: plugins/Unity/Launcher/launcheritem.cpp:73
151151msgid "Unlock from Launcher"
152−msgstr ""
152+msgstr "ئىجراچىدىن چىقار"
153153
154154#: Shell.qml:439
155155#, 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 ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2013-11-29 09:21+0100\n"
11−"PO-Revision-Date: 2013-06-27 10:24+0000\n"
12−"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
11+"PO-Revision-Date: 2014-01-16 06:04+0000\n"
12+"Last-Translator: Henry Yang <henry9846@hotmail.com>\n"
1313"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2013-12-29 06:04+0000\n"
19−"X-Generator: Launchpad (build 16877)\n"
18+"X-Launchpad-Export-Date: 2014-01-17 07:08+0000\n"
19+"X-Generator: Launchpad (build 16901)\n"
2020
2121#: Components/EdgeDemoOverlay.qml:151
2222msgid "Skip intro"
23−msgstr ""
23+msgstr "略過導覽"
2424
2525#: Components/EdgeDemo.qml:112
2626msgid "Right edge"
27−msgstr ""
27+msgstr "右方邊界"
2828
2929#: Components/EdgeDemo.qml:113
3030msgid "Try swiping from the right edge to unlock the phone"
31−msgstr ""
31+msgstr "向左滑動以解鎖手機"
3232
3333#: Components/EdgeDemo.qml:144
3434msgid "Top edge"
35−msgstr ""
35+msgstr "頂部邊界"
3636
3737#: Components/EdgeDemo.qml:145
3838msgid "Try swiping from the top edge to access the indicators"
39−msgstr ""
39+msgstr "向下滑動以開啟指引"
4040
4141#: Components/EdgeDemo.qml:170
4242msgid "Close"
43−msgstr ""
43+msgstr "關閉"
4444
4545#: Components/EdgeDemo.qml:171
4646msgid "Swipe up again to close the settings screen"
47−msgstr ""
47+msgstr "再次向上滑動以關財設定頁面"
4848
4949#: Components/EdgeDemo.qml:198
5050msgid "Left edge"
51−msgstr ""
51+msgstr "左方邊界"
5252
5353#: Components/EdgeDemo.qml:199
5454msgid "Swipe from the left to reveal the launcher for quick access to apps"
@@ -70,50 +70,49 @@ msgstr "最近搜尋"
7070
7171#: Dash/Apps/AppPreview.qml:135
7272msgid "Rate this"
73−msgstr ""
73+msgstr "對此評比"
7474
7575#. TRANSLATORS: Number of persons who rated this app/video/whatever
7676#: Dash/Previews/Header.qml:93
7777#, qt-format
7878msgid "(%1)"
79−msgstr ""
79+msgstr "(%1)"
8080
8181#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
8282#: Dash/Previews/Header.qml:105
8383#, qt-format
8484msgid "%1 review"
8585msgid_plural "%1 reviews"
86−msgstr[0] ""
87−msgstr[1] ""
86+msgstr[0] "%1 回覆"
8887
8988#: Dash/Previews/Reviews.qml:74
9089msgid "Add a review"
91−msgstr ""
90+msgstr "新增回覆"
9291
9392#: Dash/Previews/Reviews.qml:86
9493msgid "Review"
95−msgstr ""
94+msgstr "回覆"
9695
9796#: Dash/Previews/Reviews.qml:121
9897msgid "Send"
99−msgstr ""
98+msgstr "發送"
10099
101100#: Dash/Previews/Reviews.qml:139
102101msgid "Comments:"
103−msgstr ""
102+msgstr "備註:"
104103
105104#: Greeter/Lockscreen.qml:149
106105msgid "Emergency Call"
107−msgstr ""
106+msgstr "緊急連絡"
108107
109108#: Greeter/PassphraseLockscreen.qml:59
110109#, qt-format
111110msgid "Hello %1"
112−msgstr ""
111+msgstr "%1 您好"
113112
114113#: Greeter/PassphraseLockscreen.qml:59
115114msgid "Hello"
116−msgstr ""
115+msgstr "您好"
117116
118117#: Hud/HudParametrizedActionsPage.qml:132
119118msgid "Confirm"
@@ -137,7 +136,7 @@ msgstr "說話中..."
137136
138137#: Notifications/NotificationMenuItemFactory.qml:89
139138msgid "Show password"
140−msgstr ""
139+msgstr "顯示密碼"
141140
142141#: Panel/SearchIndicator.qml:27
143142msgid "Search"
@@ -146,7 +145,7 @@ msgstr "搜尋"
146145#: plugins/Unity/Launcher/launcheritem.cpp:43
147146#: plugins/Unity/Launcher/launcheritem.cpp:73
148147msgid "Lock to Launcher"
149−msgstr ""
148+msgstr "鎖定至啟動欄"
150149
151150#: plugins/Unity/Launcher/launcheritem.cpp:73
152151msgid "Unlock from Launcher"
qml/Components/DragHandle.qml+7−7
@@ -97,7 +97,7 @@ EdgeDragArea {
9797 // Private stuff
9898 QtObject {
9999 id: d
100− property var previousStatus: undefined
100+ property var previousStatus: DirectionalDragArea.WaitingForTouch
101101 property real startValue
102102 property real minValue: Direction.isPositive(direction) ? startValue
103103 : startValue - maxTotalDragDistance
@@ -193,14 +193,14 @@ EdgeDragArea {
193193 d.rollbackDrag();
194194 }
195195 } else /* Undecided || Recognized */ {
196− if (d.previousStatus === DirectionalDragArea.WaitingForTouch ||
197− d.previousStatus === undefined) {
196+ if (d.previousStatus === DirectionalDragArea.WaitingForTouch) {
198197 dragEvaluator.reset();
199198 d.startValue = parent[d.targetProp];
200− }
201− if (hintDisplacement > 0) {
202− hintingAnimation.targetValue = d.startValue;
203− hintingAnimation.start();
199+
200+ if (hintDisplacement > 0) {
201+ hintingAnimation.targetValue = d.startValue;
202+ hintingAnimation.start();
203+ }
204204 }
205205 }
206206
qml/Components/FilterGrid.qml+6−8
@@ -35,19 +35,17 @@ Item {
3535
3636 /* Whether, when collapsed, a button should be displayed enabling the user to expand
3737 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
3939
4040 property var model: null
4141
4242 /* Maximum number of rows to be show when filter=true. */
4343 property int collapsedRowCount: 2
4444 property int uncollapsedRowCount: Math.ceil(model.count / columns)
45− readonly property int collapsedHeight: {
46− return iconTileGrid.contentHeightForRows(Math.min(collapsedRowCount, Math.ceil(model.count / columns)))
47− }
48− readonly property int uncollapsedHeight: {
49− return iconTileGrid.contentHeightForRows(uncollapsedRowCount)
50− }
45+ /* Never show more rows than model would fill up. */
46+ readonly property int rowsWhenCollapsed: Math.min(collapsedRowCount, uncollapsedRowCount)
47+ readonly property int collapsedHeight: iconTileGrid.contentHeightForRows(rowsWhenCollapsed)
48+ readonly property int uncollapsedHeight: iconTileGrid.contentHeightForRows(uncollapsedRowCount)
5149
5250 property alias minimumHorizontalSpacing: iconTileGrid.minimumHorizontalSpacing
5351 property alias maximumNumberOfColumns: iconTileGrid.maximumNumberOfColumns
@@ -106,7 +104,7 @@ Item {
106104
107105 model: LimitProxyModel {
108106 model: root.model
109− limit: (filter && !filterAnimation.running) ? collapsedRowCount * iconTileGrid.columns : -1
107+ limit: (filter && !filterAnimation.running) ? rowsWhenCollapsed * iconTileGrid.columns : -1
110108 }
111109 }
112110}
qml/Components/PageHeader.qml+1
@@ -146,6 +146,7 @@ Item {
146146 anchors.fill: parent
147147 anchors.margins: units.gu(1)
148148
149+ inputMethodHints: Qt.ImhNoPredictiveText
149150 hasClearButton: false
150151
151152 primaryItem: AbstractButton {
qml/Components/ResponsiveGridView.qml+1−1
@@ -72,7 +72,7 @@ Item {
7272
7373 function columnsForSpacing(spacing) {
7474 // 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)));
7676 }
7777
7878 property real allocatableHorizontalSpace: parent.width - columns * delegateWidth
qml/Dash/Apps/AppPreview.qml+1
@@ -97,6 +97,7 @@ GenericPreview {
9797 spacing: units.gu(1)
9898
9999 Label {
100+ objectName: "descriptionLabel"
100101 anchors { left: parent.left; right: parent.right }
101102 text: root.previewData.description
102103 fontSize: "medium"
qml/Dash/Card.qml+17−15
@@ -23,24 +23,24 @@ Item {
2323 property var components
2424 property var cardData
2525
26− width: {
27− if (template !== undefined) {
28− if (template["card-layout"] === "horizontal") return units.gu(38);
29− switch (template['card-size']) {
30− case "small": return units.gu(12);
31− case "large": return units.gu(38);
32− }
33− }
34− return units.gu(18.5);
35− }
36− height: childrenRect.height
26+ implicitWidth: childrenRect.width
27+ implicitHeight: childrenRect.height
3728
3829 UbuntuShape {
3930 id: artShape
31+ radius: "medium"
4032 objectName: "artShape"
41− width: image.fillMode === Image.PreserveAspectCrop || aspect < image.aspect ? image.width : height * image.aspect
42− height: image.fillMode === Image.PreserveAspectCrop || aspect > image.aspect ? image.height : width / image.aspect
33+ width: {
34+ if (!visible) return 0
35+ return image.fillMode === Image.PreserveAspectCrop || aspect < image.aspect ? image.width : height * image.aspect
36+ }
37+ height: {
38+ if (!visible) return 0
39+ return image.fillMode === Image.PreserveAspectCrop || aspect > image.aspect ? image.height : width / image.aspect
40+ }
4341 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
4444
4545 property real aspect: components !== undefined ? components["art"]["aspect-ratio"] : 1
4646
@@ -52,7 +52,7 @@ Item {
5252 // FIXME uncomment when having investigated / fixed the crash
5353 //sourceSize.width: width > height ? width : 0
5454 //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
5656
5757 property real aspect: implicitWidth / implicitHeight
5858 }
@@ -74,10 +74,12 @@ Item {
7474
7575 Label {
7676 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 }
7878 wrapMode: Text.Wrap
7979 maximumLineCount: 5
8080 elide: Text.ElideRight
8181 text: cardData && cardData["summary"] || ""
82+ height: text ? implicitHeight : 0
83+ fontSize: "small"
8284 }
8385}
qml/Dash/CardHeader.qml+28−7
@@ -27,48 +27,66 @@ Item {
2727 property alias altPrice: altPriceLabel.text
2828
2929 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
3131
3232 Row {
3333 id: row
3434 objectName: "outerRow"
3535
36− anchors { top: parent.top; left: parent.left; right: parent.right; margins: spacing }
37− spacing: units.gu(1)
36+ property real margins: 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
3845
3946 UbuntuShape {
4047 id: mascotShape
4148 objectName: "mascotShape"
4249
43− width: units.gu(8)
44− height: units.gu(8)
50+ // TODO karni: Icon aspect-ratio is 8:7.5. Revisit these values to avoid fraction of pixels.
51+ width: units.gu(6)
52+ height: units.gu(5.625)
4553 visible: image.status === Image.Ready
54+ readonly property int maxSize: Math.max(width, height)
4655
4756 image: Image {
4857 id: mascotImage
49− sourceSize { width: mascotShape.width; height: mascotShape.height }
58+
59+ sourceSize { width: mascotShape.maxSize; height: mascotShape.maxSize }
60+ fillMode: Image.PreserveAspectCrop
61+ horizontalAlignment: Image.AlignHCenter
62+ verticalAlignment: Image.AlignVCenter
5063 }
5164 }
5265
5366 Column {
5467 objectName: "column"
5568 width: parent.width - x
69+ spacing: units.gu(0.5)
5670
5771 Label {
5872 id: titleLabel
73+ objectName: "titleLabel"
5974 anchors { left: parent.left; right: parent.right }
6075 elide: Text.ElideRight
61− objectName: "titleLabel"
6276 font.weight: Font.DemiBold
6377 wrapMode: Text.Wrap
6478 maximumLineCount: 2
79+ fontSize: "small"
6580 }
6681
6782 Label {
6883 id: subtitleLabel
84+ objectName: "subtitleLabel"
6985 anchors { left: parent.left; right: parent.right }
7086 elide: Text.ElideRight
87+ font.weight: Font.Light
7188 visible: titleLabel.text && text
89+ fontSize: "x-small"
7290 }
7391
7492 Row {
@@ -90,6 +108,7 @@ Item {
90108 elide: Text.ElideRight
91109 font.weight: Font.DemiBold
92110 color: Theme.palette.selected.foreground
111+ visible: text
93112 }
94113
95114 Label {
@@ -98,6 +117,7 @@ Item {
98117 width: parent.labelWidth
99118 elide: Text.ElideRight
100119 horizontalAlignment: parent.labels === 3 ? Text.AlignHCenter : Text.AlignRight
120+ visible: text
101121 }
102122
103123 Label {
@@ -105,6 +125,7 @@ Item {
105125 width: parent.labelWidth
106126 elide: Text.ElideRight
107127 horizontalAlignment: Text.AlignRight
128+ visible: text
108129 }
109130 }
110131 }
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 {
5757 }
5858 }
5959
60+ onPreviewDataChanged: showProcessingAction = false
61+
6062 MouseArea {
6163 anchors.fill: parent
6264 }
qml/Dash/Generic/GenericPreview.qml+2−1
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -120,6 +120,7 @@ DashPreview {
120120
121121 Label {
122122 id: descriptionLabel
123+ objectName: "descriptionLabel"
123124 anchors { left: parent.left; right: parent.right }
124125 visible: text != ""
125126 fontSize: "small"
qml/Dash/GenericScopeView.qml+8−2
@@ -56,7 +56,7 @@ FocusScope {
5656 Binding {
5757 target: scope
5858 property: "isActive"
59− value: isCurrent
59+ value: isCurrent && !previewListView.onScreen
6060 }
6161
6262 Timer {
@@ -141,6 +141,7 @@ FocusScope {
141141 readonly property bool expandable: rendererLoader.item ? rendererLoader.item.expandable : false
142142 readonly property bool filtered: rendererLoader.item ? rendererLoader.item.filter : true
143143 readonly property string category: categoryId
144+ readonly property var item: rendererLoader.item
144145
145146 Loader {
146147 id: rendererLoader
@@ -248,8 +249,10 @@ FocusScope {
248249 }
249250 }
250251 }
252+ onOriginYChanged: rendererLoader.updateDelegateCreationRange();
251253 onContentYChanged: rendererLoader.updateDelegateCreationRange();
252254 onHeightChanged: rendererLoader.updateDelegateCreationRange();
255+ onContentHeightChanged: rendererLoader.updateDelegateCreationRange();
253256 }
254257
255258 function updateDelegateCreationRange() {
@@ -261,7 +264,7 @@ FocusScope {
261264 return;
262265 }
263266
264− if (item.hasOwnProperty("delegateCreationBegin")) {
267+ if (item && item.hasOwnProperty("delegateCreationBegin")) {
265268 if (baseItem.y + baseItem.height <= 0) {
266269 // Not visible (item at top of the list)
267270 item.delegateCreationBegin = baseItem.height
@@ -277,6 +280,9 @@ FocusScope {
277280 }
278281 }
279282 }
283+
284+ onHeightChanged: rendererLoader.updateDelegateCreationRange();
285+ onYChanged: rendererLoader.updateDelegateCreationRange();
280286 }
281287
282288 sectionProperty: "name"
qml/Dash/graphics/checkers.pngnew file

Binary file not shown.

qml/Panel/IndicatorItem.qml+1−1
@@ -29,7 +29,7 @@ Item {
2929 property string identifier
3030
3131 opacity: dimmed ? 0.4 : 1
32− Behavior on opacity { StandardAnimation {} }
32+ Behavior on opacity { UbuntuNumberAnimation { duration: UbuntuAnimation.BriskDuration } }
3333
3434 width: loader.item ? loader.item.width : 0
3535
qml/Panel/IndicatorRow.qml+73−91
@@ -22,11 +22,10 @@ import "../Components"
2222Item {
2323 id: indicatorRow
2424
25− property QtObject currentItem : null
26− readonly property int currentItemIndex: currentItem ? currentItem.ownIndex : -1
27− property alias row: row
25+ readonly property alias currentItem : itemView.currentItem
26+ readonly property alias currentItemIndex: itemView.currentIndex
27+ readonly property alias row: itemView
2828 property QtObject indicatorsModel: null
29− property var visibleIndicators: defined
3029 property int overFlowWidth: width
3130 property bool showAll: false
3231 property real currentItemOffset: 0.0
@@ -40,9 +39,15 @@ Item {
4039 setCurrentItem(0);
4140 }
4241
43− function setCurrentItem(index) {
44− if (currentItemIndex !== index) {
45− currentItem = rowRepeater.itemAt(index);
42+ function setCurrentItemIndex(index) {
43+ itemView.currentIndex = index;
44+ }
45+
46+ function setCurrentItem(item) {
47+ if (item && item.hasOwnProperty("ownIndex")) {
48+ itemView.currentIndex = item.ownIndex;
49+ } else {
50+ itemView.currentIndex = -1;
4651 }
4752 }
4853
@@ -55,100 +60,75 @@ Item {
5560 }
5661 }
5762
58− Row {
59− id: row
63+ ListView {
64+ id: itemView
65+ objectName: "indicatorRowItems"
66+ interactive: false
67+ model: indicatorsModel ? indicatorsModel : null
6068
61− width: children.width
62− height: parent.height
69+ width: childrenRect.width
70+ height: indicatorRow.height
6371 anchors.right: parent.right
72+ orientation: ListView.Horizontal
6473
65− Repeater {
66− id: rowRepeater
67− objectName: "rowRepeater"
68− model: indicatorsModel ? indicatorsModel : undefined
74+ property int lastCount: 0
75+ onCountChanged: {
76+ if (lastCount < count) {
77+ showAll = true;
78+ allVisible.start();
79+ }
80+ lastCount = count;
81+ }
6982
70− property int lastCount: 0
71− onCountChanged: {
72− if (lastCount < count) {
73− showAll = true;
74− allVisible.start();
75− }
76− lastCount = count;
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+
92+ property int ownIndex: index
93+ property bool highlighted: indicatorRow.unitProgress > 0 ? ListView.isCurrentItem : false
94+ property bool dimmed: indicatorRow.unitProgress > 0 ? !ListView.isCurrentItem : false
95+
96+ property bool hidden: !showAll && !highlighted && (indicatorRow.state == "locked" || indicatorRow.state == "commit")
97+ property bool overflow: row.width - itemWrapper.x > overFlowWidth
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
77108 }
78109
79− Item {
80− id: itemWrapper
81− height: indicatorRow.height
82− width: indicatorItem.width
83− visible: indicatorItem.indicatorVisible
84− opacity: 1.0 * opacityMultiplier
85− y: 0
86− state: "standard"
87−
88− property int ownIndex: index
89− property bool highlighted: indicatorRow.state != "initial" ? ownIndex == indicatorRow.currentItemIndex : false
90− property bool dimmed: indicatorRow.state != "initial" ? ownIndex != indicatorRow.currentItemIndex : false
91−
92− property bool hidden: !showAll && !highlighted && (indicatorRow.state == "locked" || indicatorRow.state == "commit")
93− property bool overflow: row.width - itemWrapper.x > overFlowWidth
94− property real opacityMultiplier: highlighted ? 1 : (1 - indicatorRow.unitProgress)
95−
96− IndicatorItem {
97− id: indicatorItem
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− }
110+ states: [
111+ State {
112+ name: "standard"
113+ when: !hidden && !overflow && !highlighted
114+ },
115+ State {
116+ name: "highlighted"
117+ when: highlighted
118+ PropertyChanges { target: itemWrapper; opacity: 1.0 }
119+ },
120+ State {
121+ name: "hidden"
122+ when: hidden || overflow
123+ PropertyChanges { target: itemWrapper; opacity: 0.0 }
125124 }
125+ ]
126126
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
145− }
146− }
147− ]
148− }
127+ Behavior on opacity { UbuntuNumberAnimation { duration: UbuntuAnimation.BriskDuration } }
149128 }
150129 }
151130
131+
152132 Rectangle {
153133 id: highlight
154134 color: Theme.palette.selected.foreground
@@ -156,7 +136,9 @@ Item {
156136 height: units.dp(2)
157137 anchors.top: row.bottom
158138 visible: indicatorRow.currentItem != null
159− x: row.x + (indicatorRow.currentItem != null ? indicatorRow.currentItem.x + centerOffset : 0)
139+
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
160142 width: indicatorRow.currentItem != null ? indicatorRow.currentItem.width : 0
161143
162144 property real centerOffset: {
qml/Panel/Indicators.qml+56−54
@@ -21,6 +21,7 @@ import Unity.Indicators 0.1 as Indicators
2121
2222import "../Components"
2323import "../Components/ListItems"
24+import "Indicators"
2425
2526Showable {
2627 id: indicators
@@ -31,7 +32,7 @@ Showable {
3132 property alias overFlowWidth: indicatorRow.overFlowWidth
3233 property alias showAll: indicatorRow.showAll
3334
34− property int hintValue
35+ readonly property real hintValue: panelHeight + menuContent.headerHeight
3536 readonly property int lockThreshold: openedHeight / 2
3637 property bool fullyOpened: height == openedHeight
3738 property bool partiallyOpened: height > panelHeight && !fullyOpened
@@ -39,7 +40,7 @@ Showable {
3940 property bool contentEnabled: true
4041 property bool initalizeItem: true
4142 readonly property alias content: menuContent
42− property real unitProgress: 0.0
43+ property real unitProgress: (height - panelHeight) / (openedHeight - panelHeight)
4344
4445 // TODO: Perhaps we need a animation standard for showing/hiding? Each showable seems to
4546 // use its own values. Need to ask design about this.
@@ -128,7 +129,7 @@ Showable {
128129
129130 rowCoordinates = indicatorRow.mapToItem(indicatorRow.row, xValue, 0);
130131 // get the current delegate
131− currentItem = indicatorRow.row.childAt(rowCoordinates.x, 0);
132+ currentItem = indicatorRow.row.itemAt(rowCoordinates.x, 0);
132133 if (currentItem) {
133134 itemCoordinates = indicatorRow.row.mapToItem(currentItem, rowCoordinates.x, 0);
134135 distanceFromRightEdge = (currentItem.width - itemCoordinates.x) / (currentItem.width);
@@ -143,7 +144,7 @@ Showable {
143144 }
144145 }
145146 if ((!useBuffer || (useBuffer && bufferExceeded)) || indicatorRow.currentItemIndex < 0 || indicatorRow.currentItem == null) {
146− indicatorRow.currentItem = currentItem;
147+ indicatorRow.setCurrentItem(currentItem);
147148 }
148149
149150 // need to re-init the distanceFromRightEdge for offset calculation
@@ -151,7 +152,7 @@ Showable {
151152 distanceFromRightEdge = (indicatorRow.currentItem.width - itemCoordinates.x) / (indicatorRow.currentItem.width);
152153 }
153154 indicatorRow.currentItemOffset = 1 - (distanceFromRightEdge * 2);
154− } else {
155+ } else if (initalizeItem) {
155156 indicatorRow.setDefaultItem();
156157 indicatorRow.currentItemOffset = 0;
157158 }
@@ -179,6 +180,10 @@ Showable {
179180 source: "graphics/VerticalDivider.png"
180181 }
181182
183+ VisibleIndicators {
184+ id: visibleIndicators
185+ }
186+
182187 MenuContent {
183188 id: menuContent
184189 objectName: "menuContent"
@@ -189,25 +194,10 @@ Showable {
189194 top: indicatorRow.bottom
190195 bottom: handle.top
191196 }
192− indicatorsModel: indicatorsModel
197+ indicatorsModel: visibleIndicators.model
193198 clip: !indicators.fullyOpened
194199 activeHeader: indicators.state == "hint" || indicators.state == "reveal"
195200 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− }
211201
212202 //small shadow gradient at bottom of menu
213203 Rectangle {
@@ -235,13 +225,9 @@ Showable {
235225 right: parent.right
236226 bottom: parent.bottom
237227 }
238− height: get_height()
228+ height: Math.max(Math.min(handleImage.height, indicators.height - handleImage.height), 0)
239229 clip: height < handleImage.height
240230
241− function get_height() {
242− return Math.max(Math.min(handleImage.height, indicators.height - handleImage.height), 0);
243− }
244−
245231 BorderImage {
246232 id: handleImage
247233 source: "graphics/handle.sci"
@@ -261,12 +247,6 @@ Showable {
261247 anchors.fill: indicatorRow
262248 }
263249
264− Indicators.IndicatorsModel {
265− id: indicatorsModel
266−
267− Component.onCompleted: load()
268− }
269−
270250 IndicatorRow {
271251 id: indicatorRow
272252 objectName: "indicatorRow"
@@ -275,24 +255,10 @@ Showable {
275255 right: parent.right
276256 }
277257 height: indicators.panelHeight
278− indicatorsModel: indicatorsModel
258+ indicatorsModel: visibleIndicators.model
279259 state: indicators.state
280260 unitProgress: indicators.unitProgress
281261
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−
296262 EdgeDragArea {
297263 id: rowDragArea
298264 anchors.fill: indicatorRow
@@ -326,6 +292,7 @@ Showable {
326292 onRunningChanged: {
327293 if (showAnimation.running) {
328294 indicators.state = "commit";
295+ indicatorRow.currentItemOffset = 0;
329296 }
330297 }
331298 }
@@ -336,20 +303,50 @@ Showable {
336303 if (hideAnimation.running) {
337304 indicators.state = "initial";
338305 initalizeItem = true;
339− menuContent.animateNextMenuChange = false;
306+ indicatorRow.currentItemOffset = 0;
340307 }
341308 }
342309 }
343310
344− property var activeDragHandle: showDragHandle.dragging ? showDragHandle : hideDragHandle.dragging ? hideDragHandle : null
311+ QtObject {
312+ id: d
313+ property bool enableIndexChangeSignal: true
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+ }
345342 // connections to the active drag handle
346343 Connections {
347− target: activeDragHandle
344+ target: d.activeDragHandle
348345 onTouchXChanged: {
349− indicators.calculateCurrentItem(activeDragHandle.touchX, true);
346+ indicators.calculateCurrentItem(d.activeDragHandle.touchX, true);
350347 }
351348 onTouchSceneYChanged: {
352− yVelocityCalculator.trackedPosition = activeDragHandle.touchSceneY;
349+ yVelocityCalculator.trackedPosition = d.activeDragHandle.touchSceneY;
353350 }
354351 }
355352
@@ -403,8 +400,8 @@ Showable {
403400 }
404401 StateChangeScript {
405402 script: {
406− if (activeDragHandle) {
407− calculateCurrentItem(activeDragHandle.touchX, false);
403+ if (d.activeDragHandle) {
404+ calculateCurrentItem(d.activeDragHandle.touchX, false);
408405 }
409406 }
410407 }
@@ -429,4 +426,9 @@ Showable {
429426 NumberAnimation {targets: [indicatorRow, menuContent]; property: "y"; duration: 300; easing.type: Easing.OutCubic}
430427 }
431428 ]
429+
430+ Component.onCompleted: initialise();
431+ function initialise() {
432+ visibleIndicators.load();
433+ }
432434}
qml/Panel/Indicators/DefaultIndicatorPage.qml+9−5
@@ -138,10 +138,14 @@ Indicators.IndicatorBase {
138138 sourceComponent: factory.load(model)
139139
140140 onLoaded: {
141+ if (item.hasOwnProperty("selected")) {
142+ item.selected = mainMenu.selectedIndex == index;
143+ }
141144 if (item.hasOwnProperty("menuSelected")) {
142− item.menuSelected = mainMenu.selectedIndex == index;
143− item.selectMenu.connect(function() { mainMenu.selectedIndex = index; });
144− item.deselectMenu.connect(function() { mainMenu.selectedIndex = -1; });
145+ item.menuSelected.connect(function() { mainMenu.selectedIndex = index; });
146+ }
147+ if (item.hasOwnProperty("menuDeselected")) {
148+ item.menuDeselected.connect(function() { mainMenu.selectedIndex = -1; });
145149 }
146150 if (item.hasOwnProperty("menuData")) {
147151 item.menuData = Qt.binding(function() { return model; });
@@ -162,8 +166,8 @@ Indicators.IndicatorBase {
162166 Connections {
163167 target: mainMenu
164168 onSelectedIndexChanged: {
165− if (loader.item && loader.item.hasOwnProperty("menuSelected")) {
166− loader.item.menuSelected = mainMenu.selectedIndex == index;
169+ if (loader.item && loader.item.hasOwnProperty("selected")) {
170+ loader.item.selected = mainMenu.selectedIndex == index;
167171 }
168172 }
169173 }
plugins/Unity/Indicators/qml/HLine.qml → qml/Panel/Indicators/IndicatorDelegate.qmlrenamed+12−7
@@ -14,16 +14,21 @@
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 *
1616 * Authors:
17− * Renato Araujo Oliveira Filho <renato@canonical.com>
17+ * Nick Dedekind <nick.dedekind@canonical.com>
1818 */
1919
2020import QtQuick 2.0
21−import Ubuntu.Components 0.1
21+import Unity.Indicators 0.1 as Indicators
2222
23−Rectangle {
24− height: units.dp(1)
25− anchors {
26− left: parent.left
27− right: parent.right
23+Indicators.IndicatorBase {
24+ enabled: false
25+
26+ onRootActionStateChanged: {
27+ if (rootActionState == undefined) {
28+ enabled = false;
29+ return;
30+ }
31+
32+ enabled = rootActionState.visible;
2833 }
2934}
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 {
4040 anchors.fill: parent
4141 model: indicatorsModel
4242
43− delegate: Indicators.FramedMenuItem {
43+ delegate: Rectangle {
44+ color: "#221e1c"
45+
4446 anchors.left: parent.left
4547 anchors.right: parent.right
46− objectName: identifier
47−
48− text: identifier
48+ height: menuItem.height
4949
50− onClicked: {
51− var new_page = Qt.createComponent("IndicatorsPage.qml");
52− page.pageStack.push(new_page.createObject(pages), {"indicatorProperties" : model.indicatorProperties, "pageSource" : model.pageSource});
53− }
50+ ListItem.Standard {
51+ id: menuItem
52+ anchors.left: parent.left
53+ anchors.right: parent.right
54+ objectName: identifier
5455
55− Rectangle {
56− id: background
56+ text: identifier
5757
58− anchors.fill: parent
59− color: "#221e1c"
60− z: -1
58+ onClicked: {
59+ var new_page = Qt.createComponent("IndicatorsPage.qml");
60+ page.pageStack.push(new_page.createObject(pages), {"indicatorProperties" : model.indicatorProperties, "pageSource" : model.pageSource});
61+ }
6162 }
6263 }
6364 }
qml/Panel/MenuContent.qml+13−26
@@ -28,26 +28,22 @@ MainView {
2828
2929 property QtObject indicatorsModel: null
3030 property bool __contentActive: false
31− readonly property int currentMenuIndex : filteredIndicators.mapToSource(tabs.selectedTabIndex)
31+ readonly property int currentMenuIndex: tabs.selectedTabIndex
3232 backgroundColor: "#221e1c" // FIXME not in palette yet
3333 property int contentReleaseInterval: 20000
3434 property bool activeHeader: false
35− property alias visibleIndicators: visibleIndicatorsModel.visible
36− property bool animateNextMenuChange: false
35+ property real headerHeight: tabs.tabBar.height
3736
3837 width: units.gu(40)
3938 height: units.gu(42)
4039
41− function setCurrentMenuIndex(index) {
42− var filteredIndex = filteredIndicators.mapFromSource(index)
43−
44− if (tabs.selectedTabIndex !== filteredIndex) {
45− if (tabs.selectedTabIndex == -1 || !animateNextMenuChange) {
40+ function setCurrentMenuIndex(index, animate) {
41+ if (tabs.selectedTabIndex !== index) {
42+ if (tabs.selectedTabIndex === -1 || !animate) {
4643 tabs.tabBar.animate = false;
4744 }
48− tabs.selectedTabIndex = filteredIndex;
45+ tabs.selectedTabIndex = index;
4946 tabs.tabBar.animate = true;
50− animateNextMenuChange = true;
5147 }
5248 }
5349
@@ -67,29 +63,14 @@ MainView {
6763 tabs.tabBar.alwaysSelectionMode = activeHeader;
6864 }
6965
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−
8466 Tabs {
8567 id: tabs
8668 objectName: "tabs"
8769 anchors.fill: parent
88− selectedTabIndex: -1
8970
9071 Repeater {
9172 id: repeater
92− model: filteredIndicators
73+ model: content.indicatorsModel ? content.indicatorsModel : null
9374 objectName: "tabsRepeater"
9475
9576 // FIXME: This is needed because tabs dont handle repeaters well.
@@ -145,6 +126,12 @@ MainView {
145126 property: "title"
146127 value: loader.item && loader.item.hasOwnProperty("title") && loader.item.title !== "" ? loader.item.title : model.identifier
147128 }
129+
130+ Binding {
131+ target: loader.item
132+ property: "objectName"
133+ value: identifier + "-page"
134+ }
148135 }
149136 }
150137 }
qml/Panel/Panel.qml+1−4
@@ -50,7 +50,7 @@ Item {
5050
5151 Connections {
5252 target: indicatorsMenu
53− onShown: hideTimer.stop()
53+ onShownChanged: hideTimer.stop()
5454 }
5555
5656 PanelBackground {
@@ -101,13 +101,10 @@ Item {
101101 y: panelBackground.y
102102 width: root.indicatorsMenuWidth
103103 shown: false
104− hintValue: __panelMinusSeparatorLineHeight * 3
105104 panelHeight: __panelMinusSeparatorLineHeight
106105 openedHeight: parent.height + (pinnedMode ? 0 : root.panelHeight)
107106 pinnedMode: !fullscreenMode
108107 overFlowWidth: search.state=="hidden" ? parent.width : parent.width - search.width
109−
110− unitProgress: (height - panelHeight) / (openedHeight - panelHeight)
111108 }
112109
113110 PanelSeparatorLine {
tests/autopilot/unity8/process_helpers.py+3−3
@@ -55,7 +55,7 @@ def restart_unity(*args):
5555 status = _get_unity_status()
5656 if "start/" in status:
5757 try:
58− output = subprocess.check_output(['initctl', 'stop', 'unity8'])
58+ output = subprocess.check_output(['/sbin/initctl', 'stop', 'unity8'])
5959 logger.info(output)
6060 except subprocess.CalledProcessError as e:
6161 e.args += (
@@ -64,7 +64,7 @@ def restart_unity(*args):
6464 raise
6565
6666 try:
67− command = ['initctl', 'start', 'unity8'] + list(args)
67+ command = ['/sbin/initctl', 'start', 'unity8'] + list(args)
6868 output = subprocess.check_output(
6969 command,
7070 stderr=subprocess.STDOUT,
@@ -82,7 +82,7 @@ def restart_unity(*args):
8282def _get_unity_status():
8383 try:
8484 return subprocess.check_output([
85− 'initctl',
85+ '/sbin/initctl',
8686 'status',
8787 'unity8'
8888 ])
tests/autopilot/unity8/shell/emulators/__init__.py+1−1
@@ -25,7 +25,7 @@ class UnityEmulatorBase(introspection.CustomEmulatorBase):
2525
2626 def __init__(self, *args):
2727 super(UnityEmulatorBase, self).__init__(*args)
28− self.pointing_device = input.Touch.create()
28+ self.pointing_device = input.Pointer(device=input.Touch.create())
2929
3030
3131class UnityEmulatorException(Exception):
tests/autopilot/unity8/shell/emulators/create_interactive_notification.py+1−1
@@ -87,7 +87,7 @@ if __name__ == '__main__':
8787 action_id,
8888 action_label,
8989 action_callback,
90− (None, ),
90+ None,
9191 None
9292 )
9393
tests/autopilot/unity8/shell/emulators/dash.py+72−3
@@ -137,9 +137,78 @@ class Dash(emulators.UnityEmulatorBase):
137137 self.dash_content_list.currentIndex.wait_for(original_index + 1)
138138
139139
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+
140153class 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'))
142197
143198
144−class DashApps(emulators.UnityEmulatorBase):
145− """Autopilot emulators for the applications scope."""
199+class DashApps(GenericScopeView):
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 @@
1717# along with this program. If not, see <http://www.gnu.org/licenses/>.
1818#
1919
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+
2030import mock
2131
32+from testtools.matchers import Contains, HasLength
33+
2234from unity8 import process_helpers
23−from unity8.shell import emulators, tests
35+from unity8.shell import emulators, fixture_setup, tests
2436from unity8.shell.emulators import dash as dash_emulators
2537
2638
27−class DashEmulatorTestCase(tests.UnityTestCase):
39+class DashBaseTestCase(tests.UnityTestCase):
2840
2941 scenarios = tests._get_device_emulation_scenarios()
3042
3143 def setUp(self):
32− super(DashEmulatorTestCase, self).setUp()
44+ super(DashBaseTestCase, self).setUp()
3345 unity_proxy = self.launch_unity()
3446 process_helpers.unlock_unity(unity_proxy)
3547 self.dash = self.main_window.get_dash()
3648
49+
50+class DashEmulatorTestCase(DashBaseTestCase):
51+
3752 def test_open_unexisting_scope(self):
3853 scope_name = 'unexisting'
3954 with mock.patch.object(self.dash, 'pointing_device') as mock_pointer:
@@ -118,3 +133,83 @@ class DashEmulatorTestCase(tests.UnityTestCase):
118133 scope = self.dash.open_scope(self._get_scope_name_from_id(scope_id))
119134 self._assert_scope_is_opened(scope, scope_id)
120135 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):
5757 if os.path.abspath(__file__).startswith('/usr/'):
5858 return '/usr/share/unity8/graphics/' + icon_name
5959 else:
60− return os.path.abspath(
61− os.getcwd() + "/../../graphics/" + icon_name
62− )
60+ return os.path.dirname(__file__) + "/../../../../../qml/graphics/" + icon_name
6361
6462 def _get_notifications_list(self):
6563 main_view = self.main_window.get_qml_view()
@@ -158,8 +156,6 @@ class InteractiveNotificationBase(NotificationsBase):
158156 offer more options."""
159157 unity_proxy = self.launch_unity()
160158
161− notify_list = self._get_notifications_list()
162−
163159 summary = "Incoming call"
164160 body = "Frank Zappa\n+44 (0)7736 027340"
165161 icon_path = self._get_icon_path('avatars/anna_olsson.png')
@@ -188,8 +184,9 @@ class InteractiveNotificationBase(NotificationsBase):
188184 hints
189185 )
190186
187+ notify_list = self._get_notifications_list()
191188 get_notification = lambda: notify_list.wait_select_single(
192− 'Notification', objectName='notification1')
189+ 'Notification', objectName='notification0')
193190 notification = get_notification()
194191 self._assert_notification(notification, None, None, True, True, 1.0)
195192 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 @@
11add_subdirectory(Application)
22add_subdirectory(Indicators)
3+add_subdirectory(Launcher)
4+add_subdirectory(Notifications)
35
46pkg_search_module(DEE dee-1.0 REQUIRED)
57pkg_search_module(GOBJECT gobject-2.0 REQUIRED)
@@ -41,5 +43,10 @@ file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/qmldir"
4143 DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
4244 )
4345
44−add_subdirectory(Launcher)
45−add_subdirectory(Notifications)
46+install(TARGETS FakeUnityQml
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 {
2121
2222 property var indicatorData : undefined
2323
24− function load() {}
24+ function load() {
25+ clear();
2526
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: {
3027 append({ "identifier": "indicator-fake1",
3128 "position": 0,
3229 "widgetSource": "qrc:/tests/indciators/qml/fake_menu_widget1.qml",
3330 "pageSource": "qrc:/tests/indciators/qml/fake_menu_page1.qml",
34− "indicatorProperties": ""
31+ "indicatorProperties": { enabled: true }
3532 });
3633
3734 append({ "identifier": "indicator-fake2",
3835 "position": 1,
3936 "widgetSource": "qrc:/tests/indciators/qml/fake_menu_widget2.qml",
4037 "pageSource": "qrc:/tests/indciators/qml/fake_menu_page2.qml",
41− "indicatorProperties": ""
38+ "indicatorProperties": { enabled: true }
4239 });
4340
4441 append({ "identifier": "indicator-fake3",
4542 "position": 2,
4643 "widgetSource": "qrc:/tests/indciators/qml/fake_menu_widget3.qml",
4744 "pageSource": "qrc:/tests/indciators/qml/fake_menu_page3.qml",
48− "indicatorProperties": ""
45+ "indicatorProperties": { enabled: true }
4946 });
5047
5148 append({ "identifier": "indicator-fake4",
5249 "position": 3,
5350 "widgetSource": "qrc:/tests/indciators/qml/fake_menu_widget4.qml",
5451 "pageSource": "qrc:/tests/indciators/qml/fake_menu_page4.qml",
55− "indicatorProperties": ""
52+ "indicatorProperties": { enabled: true }
5653 });
5754
5855 append({ "identifier": "indicator-fake5",
5956 "position": 4,
6057 "widgetSource": "qrc:/tests/indciators/qml/fake_menu_widget5.qml",
6158 "pageSource": "qrc:/tests/indciators/qml/fake_menu_page5.qml",
62− "indicatorProperties": ""
59+ "indicatorProperties": { enabled: true }
6360 });
6461 }
6562}
tests/mocks/Unity/Indicators/qml/fake_menu_page1.qml−1
@@ -19,7 +19,6 @@ import Unity.Indicators 0.1 as Indicators
1919
2020Indicators.FakeMenuPage {
2121 id: menu_plugin1
22− objectName: "menu_page1"
2322
2423 Rectangle {
2524 id: contents
tests/mocks/Unity/Indicators/qml/fake_menu_page2.qml−1
@@ -19,7 +19,6 @@ import Unity.Indicators 0.1 as Indicators
1919
2020Indicators.FakeMenuPage {
2121 id: menu_plugin2
22− objectName: "menu_page2"
2322
2423 Rectangle {
2524 id: contents
tests/mocks/Unity/Indicators/qml/fake_menu_page3.qml−1
@@ -19,7 +19,6 @@ import Unity.Indicators 0.1 as Indicators
1919
2020Indicators.FakeMenuPage {
2121 id: menu_plugin3
22− objectName: "menu_page3"
2322
2423 Rectangle {
2524 id: contents
tests/mocks/Unity/Indicators/qml/fake_menu_page4.qml−1
@@ -19,7 +19,6 @@ import Unity.Indicators 0.1 as Indicators
1919
2020Indicators.FakeMenuPage {
2121 id: menu_plugin4
22− objectName: "menu_page4"
2322
2423 Rectangle {
2524 id: contents
tests/mocks/Unity/Indicators/qml/fake_menu_page5.qml−1
@@ -19,7 +19,6 @@ import Unity.Indicators 0.1 as Indicators
1919
2020Indicators.FakeMenuPage {
2121 id: menu_plugin5
22− objectName: "menu_page5"
2322
2423 Rectangle {
2524 id: contents
tests/mocks/Unity/Indicators/qml/fake_menu_widget2.qml+1−3
@@ -19,7 +19,5 @@ import QtQuick 2.0
1919Rectangle {
2020 width: 40
2121 height: 40
22− color : "yellow"
23−
24− enabled: false
22+ color : "blue"
2523}
tests/mocks/Unity/Indicators/qml/fake_menu_widget3.qml+1−1
@@ -19,5 +19,5 @@ import QtQuick 2.0
1919Rectangle {
2020 width: 40
2121 height: 40
22− color : "blue"
22+ color : "yellow"
2323}
tests/mocks/Unity/fake_applications_scope.cpp+2−1
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -30,6 +30,7 @@ ApplicationsScope::ApplicationsScope(bool visible, QObject* parent)
3030 m_id = "applications.scope";
3131 m_name = "Applications";
3232 m_visible = visible;
33+ m_previewRendererName = "preview-application";
3334 m_categories->setModel(createCategoriesModel());
3435}
3536
tests/mocks/Unity/fake_preview.cpp+5−3
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -16,13 +16,15 @@
1616
1717#include "fake_preview.h"
1818
19−Preview::Preview(QObject *parent): QObject(parent)
19+Preview::Preview(const QString &rendererName, QObject *parent):
20+ QObject(parent),
21+ m_rendererName(rendererName)
2022{
2123}
2224
2325QString Preview::rendererName() const
2426{
25− return "generic-preview";
27+ return m_rendererName;
2628}
2729
2830QString Preview::title() const
tests/mocks/Unity/fake_preview.h+5−2
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -38,7 +38,7 @@ class Q_DECL_EXPORT Preview : public QObject
3838 Q_PROPERTY(QString image READ image NOTIFY previewChanged)
3939
4040public:
41− explicit Preview(QObject *parent = 0);
41+ explicit Preview(const QString &rendererName, QObject *parent = 0);
4242
4343 QString rendererName() const;
4444 QString title() const;
@@ -55,6 +55,9 @@ public:
5555
5656Q_SIGNALS:
5757 void previewChanged();
58+
59+private:
60+ QString m_rendererName;
5861};
5962
6063Q_DECLARE_METATYPE(Preview *)
tests/mocks/Unity/fake_scope.cpp+3−2
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -38,6 +38,7 @@ Scope::Scope(QString const& id, QString const& name, bool visible, QObject* pare
3838 , m_isActive(false)
3939 , m_categories(new Categories(this))
4040 , m_results(new DeeListModel(this))
41+ , m_previewRendererName("preview-generic")
4142{
4243 DeeModel* results_model = create_results_model(20, 300);
4344 m_categories->setResultModel(results_model);
@@ -47,7 +48,7 @@ Scope::Scope(QString const& id, QString const& name, bool visible, QObject* pare
4748 m_timer.setInterval(1000);
4849 m_timer.setSingleShot(true);
4950 connect(&m_timer, &QTimer::timeout, [this]() {
50− Preview *p = new Preview(this);
51+ Preview *p = new Preview(m_previewRendererName, this);
5152 Q_EMIT previewReady(p);
5253 });
5354}
tests/mocks/Unity/fake_scope.h+3−1
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -116,6 +116,8 @@ protected:
116116 bool m_searching;
117117 bool m_isActive;
118118
119+ QString m_previewRendererName;
120+
119121 Categories* m_categories;
120122 DeeListModel* m_results;
121123
tests/plugins/DashViews/CMakeLists.txt+12−15
@@ -40,22 +40,17 @@ qt5_use_modules(listviewwithpageheadertestsectionexternalmodelExec Test Core Qml
4040target_link_libraries(listviewwithpageheadertestsectionexternalmodelExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
4141add_custom_target(testlistviewwithpageheadersectionexternalmodel ${CMAKE_CURRENT_BINARY_DIR}/listviewwithpageheadertestsectionexternalmodelExec -o ${CMAKE_BINARY_DIR}/testlistviewwithpageheadersectionexternalmodel.xml,xunitxml -o -,txt)
4242
43−macro(add_journal_try_test FILENAME)
44− # Capitalite the first letter for the test/try name targets
45− string(SUBSTRING ${FILENAME} 0 1 FIRST_LETTER)
46− string(TOUPPER ${FIRST_LETTER} FIRST_LETTER)
47− string(REGEX REPLACE "^.(.*)" "${FIRST_LETTER}\\1" CUSTOM_TARGET_NAME "${FILENAME}")
48−
43+macro(add_dashview_try_test FILENAME TESTNAME)
4944 add_executable(${FILENAME}testExec
5045 ${FILENAME}test.cpp
5146 ${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
5348 )
5449 qt5_use_modules(${FILENAME}testExec Test Core Qml)
5550 target_link_libraries(${FILENAME}testExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
56− add_custom_target(test${CUSTOM_TARGET_NAME}
51+ add_custom_target(test${TESTNAME}
5752 ${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
5954 -o -,txt
6055 DEPENDS ${FILENAME}testExec DashViews-qml
6156 )
@@ -63,18 +58,19 @@ macro(add_journal_try_test FILENAME)
6358 add_executable(${FILENAME}tryExec
6459 ${FILENAME}try.cpp
6560 ${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
6762 )
6863 qt5_use_modules(${FILENAME}tryExec Test Core Qml)
6964 target_link_libraries(${FILENAME}tryExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
70− add_custom_target(try${CUSTOM_TARGET_NAME}
65+ add_custom_target(try${TESTNAME}
7166 ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}tryExec
7267 DEPENDS ${FILENAME}tryExec DashViews-qml
7368 )
7469endmacro()
7570
76−add_journal_try_test(verticaljournal)
77−add_journal_try_test(horizontaljournal)
71+add_dashview_try_test(verticaljournal VerticalJournal)
72+add_dashview_try_test(horizontaljournal HorizontalJournal)
73+add_dashview_try_test(organicgrid OrganicGrid)
7874
7975set(qmltest_DEFAULT_NO_ADD_TEST TRUE)
8076add_qml_test(. listviewwithpageheaderqml IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
@@ -83,5 +79,6 @@ add_dependencies(qmluitests testlistviewwithpageheader)
8379add_dependencies(qmluitests testlistviewwithpageheadersection)
8480add_dependencies(qmluitests testlistviewwithpageheadersectionexternalmodel)
8581add_dependencies(qmluitests testlistviewwithpageheaderqml)
86−add_dependencies(qmluitests testVerticaljournal)
87−add_dependencies(qmluitests testHorizontaljournal)
82+add_dependencies(qmluitests testVerticalJournal)
83+add_dependencies(qmluitests testHorizontalJournal)
84+add_dependencies(qmluitests testOrganicGrid)
tests/plugins/DashViews/horizontaljournaltest.cpp+35−9
@@ -126,9 +126,9 @@ private Q_SLOTS:
126126 view->engine()->addImportPath(BUILT_PLUGINS_DIR);
127127
128128 model = new WidthModel();
129− QStringList heightList;
130− heightList << "100" << "50" << "125" << "10" << "40" << "70" << "200" << "110" << "160" << "20" << "20" << "65" << "80" << "200" << "300" << "130" << "400" << "300" << "500" << "10";
131− model->setStringList(heightList);
129+ QStringList widthList;
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(widthList);
132132
133133 view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/horizontaljournaltest.qml"));
134134
@@ -336,9 +336,9 @@ private Q_SLOTS:
336336
337337 void testModelReset()
338338 {
339− QStringList heightList;
340− heightList << "100" << "50" << "125" << "25" << "50" << "50";
341− model->setStringList(heightList);
339+ QStringList widthList;
340+ widthList << "100" << "50" << "125" << "25" << "50" << "50";
341+ model->setStringList(widthList);
342342
343343 QTRY_COMPARE(hj->m_firstVisibleIndex, 0);
344344 QTRY_COMPARE(hj->m_visibleItems.count(), 6);
@@ -386,9 +386,9 @@ private Q_SLOTS:
386386 void testModelAppendRemoveLast()
387387 {
388388 WidthModel *model2 = new WidthModel();
389− QStringList heightList;
390− heightList << "100" << "50" << "125" << "25" << "50" << "50";
391− model2->setStringList(heightList);
389+ QStringList widthList;
390+ widthList << "100" << "50" << "125" << "25" << "50" << "50";
391+ model2->setStringList(widthList);
392392 hj->setModel(model2);
393393 delete model;
394394 model = model2;
@@ -454,6 +454,32 @@ private Q_SLOTS:
454454 QCOMPARE(hj->implicitHeight(), 310.);
455455 }
456456
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+
457483private:
458484 QQuickView *view;
459485 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:
459459 verifyItem(vj->m_columnVisibleItems[1][2], 7, 160, 120, true);
460460 }
461461
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+
462494private:
463495 QQuickView *view;
464496 VerticalJournal *vj;
tests/plugins/LightDM/CMakeLists.txt+1
@@ -13,6 +13,7 @@ include_directories(
1313 ${LIBLIGHTDM_INCLUDE_DIRS}
1414 )
1515
16+add_dependencies(test-lightdm-dbus MockLightDM-full)
1617target_link_libraries(test-lightdm-dbus
1718 ${LIBLIGHTDM_LDFLAGS}
1819 )
tests/qmltests/CMakeLists.txt+1
@@ -39,6 +39,7 @@ add_qml_test(Components Tile)
3939add_qml_test(Components PageHeaderLabel)
4040add_qml_test(Dash Card)
4141add_qml_test(Dash CardHeader)
42+add_qml_test(Dash CardTool)
4243add_qml_test(Dash Dash)
4344add_qml_test(Dash DashContent)
4445add_qml_test(Dash DashPreview)
tests/qmltests/Components/tst_DragHandle.cpp+65−10
@@ -62,9 +62,13 @@ private Q_SLOTS:
6262 void stretch_horizontal();
6363 void stretch_vertical();
6464 void hintingAnimation();
65+ void hintingAnimation_dontRestartAfterFinishedAndStillPressed();
66+
6567
6668private:
6769 void flickAndHold(DirectionalDragArea *dragHandle, qreal distance);
70+ void drag(QPointF &touchPoint, const QPointF& direction, qreal distance,
71+ int numSteps, qint64 timeMs = 500);
6872 DirectionalDragArea *fetchAndSetupDragHandle(const char *objectName);
6973 qreal fetchDragThreshold(DirectionalDragArea *dragHandle);
7074 void tryCompare(std::function<qreal ()> actualFunc, qreal expectedValue);
@@ -161,25 +165,29 @@ void tst_DragHandle::flickAndHold(DirectionalDragArea *dragHandle,
161165 QPointF initialTouchPos = dragHandle->mapToScene(
162166 QPointF(dragHandle->width() / 2.0, dragHandle->height() / 2.0));
163167 QPointF touchPoint = initialTouchPos;
164− int numSteps = 10;
165− qint64 flickTimeMs = 500;
166− qint64 timeStep = flickTimeMs / numSteps;
167168
169+ QTest::touchEvent(m_view, m_device).press(0, touchPoint.toPoint());
170+
171+ int numSteps = 10;
168172 QPointF dragDirectionVector = calculateDirectionVector(dragHandle);
169− QPointF touchMovement = dragDirectionVector * (distance / (qreal)numSteps);
173+ drag(touchPoint, dragDirectionVector, distance, numSteps);
170174
171− QTest::touchEvent(m_view, m_device).press(0, touchPoint.toPoint());
175+ // Wait for quite a bit before finally releasing to make a very low flick/release
176+ // speed.
177+ m_fakeTimeSource->m_msecsSinceReference += 5000;
178+ QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint());
179+}
172180
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);
173186 for (int i = 0; i < numSteps; ++i) {
174187 touchPoint += touchMovement;
175188 m_fakeTimeSource->m_msecsSinceReference += timeStep;
176189 QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint());
177190 }
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());
183191}
184192
185193DirectionalDragArea *tst_DragHandle::fetchAndSetupDragHandle(const char *objectName)
@@ -389,6 +397,53 @@ void tst_DragHandle::hintingAnimation()
389397 QCOMPARE(parentItem->property("shown").toBool(), false);
390398}
391399
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+
392447QTEST_MAIN(tst_DragHandle)
393448
394449#include "tst_DragHandle.moc"
tests/qmltests/Components/tst_FilterGrid.qml+44−5
@@ -20,6 +20,7 @@ import "../../../qml/Components"
2020import Ubuntu.Components.ListItems 0.1 as ListItem
2121import Ubuntu.Components 0.1
2222import Unity.Test 0.1 as UT
23+import Utils 0.1
2324
2425/*
2526 You should see 6 green squares (from "A" to "F") and a button "View all (12)".
@@ -69,6 +70,20 @@ Rectangle {
6970 ListElement { name: "L" }
7071 }
7172
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+
7287 Rectangle {
7388 id: gridRect
7489 width: units.gu(30)
@@ -109,15 +124,21 @@ Rectangle {
109124 name: "FilterGrid"
110125 when: windowShown
111126
127+ function init() {
128+ filterGrid.model = fakeModel
129+ }
130+
131+ function cleanup() {
132+ filterCheckBox.checked = true
133+ collapsedRowCountSelector.selectedIndex = 1
134+ }
135+
112136 function test_turningFilterOffShowsAllElements() {
113137 tryCompareFunction(countVisibleDelegates, 6)
114138
115139 filterCheckBox.checked = false
116140
117141 tryCompareFunction(countVisibleDelegates, 12)
118−
119− // back to initial state
120− filterCheckBox.checked = true
121142 }
122143
123144 function test_collapsedRowCount() {
@@ -127,9 +148,27 @@ Rectangle {
127148 // row count == index + 1
128149 tryCompareFunction(countVisibleDelegates, 3*(i+1))
129150 }
151+ }
130152
131− // back to initial state
132− collapsedRowCountSelector.selectedIndex = 1
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
168+ collapsedRowCountSelector.selectedIndex = data.collapsedRowCountIndex
169+
170+ tryCompare(filterGrid, "rowsWhenCollapsed", data.rowsWhenCollapsed)
171+ tryCompareFunction(countVisibleDelegates, data.visibleDelegates)
133172 }
134173
135174 function countVisibleDelegates() {
tests/qmltests/Components/tst_ResponsiveGridView.qml+1−1
@@ -152,7 +152,7 @@ Item {
152152 var data = new Array()
153153
154154 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})
156156 data.push({selectedIndex: 2, minHSpacing:units.gu(8), columnCount: 5})
157157 data.push({selectedIndex: 3, minHSpacing:units.gu(25), columnCount: 2})
158158
tests/qmltests/Dash/CardHelpers.js+45
@@ -18,6 +18,51 @@
1818
1919var components = ["title", "art", "subtitle", "mascot", "emblem", "old-price", "price", "alt-price", "rating", "alt-rating", "summary"]
2020
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+
2166function tryParse(json, errorLabel) {
2267 var o = undefined;
2368 if (errorLabel !== undefined) {
tests/qmltests/Dash/tst_Card.qml+75−63
@@ -27,41 +27,6 @@ Rectangle {
2727 height: units.gu(72)
2828 color: "#88FFFFFF"
2929
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−
6530 property string cardData: '
6631 {
6732 "art": "../../tests/qmltests/Dash/artwork/music-player-design.png",
@@ -71,49 +36,61 @@ Rectangle {
7136 "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."
7237 }'
7338
74− property string fullMapping: '
75− {
76− "title": "title",
77− "art": "art",
78− "subtitle": "subtitle",
79− "mascot": "mascot",
80− "summary": "summary"
81− }'
82−
8339 property var cardsModel: [
8440 {
85− "name": "Art, header, summary - vertical",
86− "layout": { "components": JSON.parse(fullMapping) }
41+ "name": "Art, header, summary",
42+ "layout": { "components": JSON.parse(Helpers.fullMapping) }
8743 },
8844 {
89− "name": "Art, header, summary - vertical, small",
90− "layout": { "template": { "card-size": "small" }, "components": JSON.parse(fullMapping) }
45+ "name": "Art, header, summary - small",
46+ "layout": { "template": { "card-size": "small" }, "components": JSON.parse(Helpers.fullMapping) }
9147 },
9248 {
93− "name": "Art, header, summary - vertical, large",
94− "layout": { "template": { "card-size": "large" }, "components": JSON.parse(fullMapping) }
49+ "name": "Art, header, summary - large",
50+ "layout": { "template": { "card-size": "large" }, "components": JSON.parse(Helpers.fullMapping) }
9551 },
9652 {
97− "name": "Art, header, summary - vertical, wide",
98− "layout": { "components": Helpers.update(JSON.parse(root.fullMapping), { "art": { "aspect-ratio": 2 } }) }
53+ "name": "Art, header, summary - wide",
54+ "layout": { "components": Helpers.update(JSON.parse(Helpers.fullMapping), { "art": { "aspect-ratio": 2 } }) }
9955 },
10056 {
101− "name": "Art, title - vertical, fitted",
102− "layout": { "components": Helpers.update(JSON.parse(root.fullMapping), { "art": { "fill-mode": "fit" } }) }
57+ "name": "Art, title - fitted",
58+ "layout": { "components": Helpers.update(JSON.parse(Helpers.fullMapping), { "art": { "fill-mode": "fit" } }) }
10359 },
10460 {
10561 "name": "Art, header, summary - horizontal",
10662 "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" } }
10876 },
10977 ]
11078
79+ CardTool {
80+ id: cardTool
81+ template: card.template
82+ components: card.components
83+ }
84+
11185 Card {
11286 id: card
11387 anchors { top: parent.top; left: parent.left; margins: units.gu(1) }
11488
115− template: Helpers.update(JSON.parse(root.defaultLayout), Helpers.tryParse(layoutArea.text, layoutError))['template'];
116− components: Helpers.update(JSON.parse(root.defaultLayout), Helpers.tryParse(layoutArea.text, layoutError))['components'];
89+ width: cardTool.cardWidth || implicitWidth
90+ height: cardTool.cardHeight || implicitHeight
91+
92+ template: Helpers.update(JSON.parse(Helpers.defaultLayout), Helpers.tryParse(layoutArea.text, layoutError))['template'];
93+ components: Helpers.update(JSON.parse(Helpers.defaultLayout), Helpers.tryParse(layoutArea.text, layoutError))['components'];
11794 cardData: Helpers.mapData(dataArea.text, components, dataError)
11895 }
11996
@@ -189,7 +166,10 @@ Rectangle {
189166 property Item summary: findChild(card, "summaryLabel")
190167
191168 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.");
193173 }
194174
195175 function cleanup() {
@@ -233,10 +213,13 @@ Rectangle {
233213 function test_card_size_data() {
234214 return [
235215 { tag: "Medium", width: units.gu(18.5), index: 0 },
236− { tag: "Small", width: units.gu(12), size: "small", index: 0 },
237− { tag: "Large", width: units.gu(38), size: "large", index: 0 },
216+ { tag: "Small", width: units.gu(12), index: 1 },
217+ { tag: "Large", width: units.gu(38), index: 2 },
238218 { tag: "Wide", width: units.gu(18.5), aspect: 0.5, index: 0 },
239219 { 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 },
240223 ]
241224 }
242225
@@ -248,6 +231,11 @@ Rectangle {
248231 card.templateChanged();
249232 }
250233
234+ if (data.hasOwnProperty("card_layout")) {
235+ card.template['card-layout'] = data.card_layout;
236+ card.templateChanged();
237+ }
238+
251239 if (data.hasOwnProperty("aspect")) {
252240 card.components['art']['aspect-ratio'] = data.aspect;
253241 card.componentsChanged();
@@ -257,7 +245,9 @@ Rectangle {
257245 tryCompare(card, "width", data.width);
258246 }
259247
260− if (data.hasOwnProperty("height")) {
248+ if (typeof data.height === "function") {
249+ tryCompareFunction(function() { return card.height === data.height() }, true);
250+ } else if (data.hasOwnProperty("height")) {
261251 tryCompare(card, "height", data.height);
262252 }
263253 }
@@ -308,7 +298,7 @@ Rectangle {
308298 function test_art_layout_data() {
309299 return [
310300 { 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 },
312302 ];
313303 }
314304
@@ -323,7 +313,7 @@ Rectangle {
323313 { tag: "Vertical", top: function() { return art.y + art.height },
324314 left: function() { return art.x }, index: 0 },
325315 { 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 },
327317 ]
328318 }
329319
@@ -333,5 +323,27 @@ Rectangle {
333323 tryCompareFunction(function() { return testCase.header.y === data.top() }, true);
334324 tryCompareFunction(function() { return testCase.header.x === data.left() }, true);
335325 }
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+ }
336348 }
337349}
tests/qmltests/Dash/tst_CardHeader.qml+14−9
@@ -52,11 +52,11 @@ Rectangle {
5252 property Item column: findChild(cardHeader, "column")
5353
5454 function initTestCase() {
55− verify(testCase.mascot !== undefined, "Couldn't find mascot object.");
56− verify(testCase.titleLabel !== undefined, "Couldn't find titleLabel object.");
57− verify(testCase.subtitleLabel !== undefined, "Couldn't find subtitleLabel object.");
58− verify(testCase.prices !== undefined, "Couldn't find prices object.");
59− verify(testCase.oldPriceLabel !== undefined, "Couldn't find oldPriceLabel object.");
55+ verify(typeof testCase.mascot === "object", "Couldn't find mascot object.");
56+ verify(typeof testCase.titleLabel === "object", "Couldn't find titleLabel object.");
57+ verify(typeof testCase.subtitleLabel === "object", "Couldn't find subtitleLabel object.");
58+ verify(typeof testCase.prices === "object", "Couldn't find prices object.");
59+ verify(typeof testCase.oldPriceLabel === "object", "Couldn't find oldPriceLabel object.");
6060 }
6161
6262 function cleanup() {
@@ -86,7 +86,7 @@ Rectangle {
8686 { tag: "Empty", visible: false },
8787 { tag: "Title only", title: "Foo", visible: true },
8888 { 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 },
9090 ]
9191 }
9292
@@ -104,7 +104,7 @@ Rectangle {
104104 { tag: "Main and Alt", main: "$1.25", alt: "€1.00", visible: true },
105105 { tag: "Main and Old", main: "$1.25", old: "$2.00", visible: true, oldAlign: Text.AlignRight },
106106 { 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 },
108108 ]
109109 }
110110
@@ -120,8 +120,9 @@ Rectangle {
120120
121121 function test_dimensions_data() {
122122 return [
123− { tag: "Column width", object: column, width: cardHeader.width - testCase.outerRow.spacing * 2 },
124− { tag: "Column width", object: column, width: cardHeader.width - mascot.width - testCase.outerRow.spacing * 3, mascot: "artwork/avatar.png" }
123+ { tag: "Column width", object: column, width: cardHeader.width },
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 } },
125126 ]
126127 }
127128
@@ -133,6 +134,10 @@ Rectangle {
133134 if (data.hasOwnProperty("width")) {
134135 tryCompare(data.object, "width", data.width);
135136 }
137+
138+ if (data.hasOwnProperty("height")) {
139+ tryCompareFunction(function() { return data.object.height === data.height() }, true);
140+ }
136141 }
137142 }
138143}
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 {
113113 compare(value.text, dataObject.infoHints[i].value)
114114 }
115115 }
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+ }
116124 }
117125}
tests/qmltests/Dash/tst_GenericScopeView.qml+49−1
@@ -71,7 +71,13 @@ Item {
7171 name: "GenericScopeView"
7272 when: scopes.loaded
7373
74− function test_isCurrent() {
74+ function init() {
75+ shell.width = units.gu(120)
76+ genericScopeView.categoryView.positionAtBeginning();
77+ tryCompare(genericScopeView.categoryView.contentY, 0)
78+ }
79+
80+ function test_isCurrent() {
7581 genericScopeView.isCurrent = true
7682 pageHeader.searchQuery = "test"
7783 previewListView.open = true
@@ -80,6 +86,18 @@ Item {
8086 tryCompare(previewListView, "open", false);
8187 }
8288
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+
83101 function test_showDash() {
84102 previewListView.open = true;
85103 tryCompare(openEffect, "live", true);
@@ -272,6 +290,21 @@ Item {
272290 tryCompare(category, "filtered", true);
273291 }
274292
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+
275308 function test_showPreviewCarousel() {
276309 tryCompareFunction(function() { return findChild(genericScopeView, "carouselDelegate") != undefined; }, true);
277310 var tile = findChild(genericScopeView, "carouselDelegate");
@@ -336,6 +369,21 @@ Item {
336369 tryCompare(category2, "filtered", true);
337370 tryCompare(category2FilterGrid, "filter", true);
338371 }
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+ }
339387 }
340388 }
341389}
tests/qmltests/Greeter/tst_Lockscreen.qml+1−1
@@ -134,7 +134,7 @@ Rectangle {
134134 if (data.pinPadAvailable) {
135135 compare(findChild(lockscreen, "pinPadButton8").text, "8", "Could not find number 8 on PinPad")
136136 } 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")
138138 }
139139 }
140140
tests/qmltests/Panel/Indicators/tst_DefaultIndicatorPage.qml−4
@@ -129,14 +129,10 @@ Item {
129129 function test_reloadData() {
130130 var mainMenu = findChild(page, "mainMenu");
131131
132− console.log("setting empty data");
133132 page.menuModel.modelData = [];
134133 tryCompare(mainMenu, "count", 0);
135− console.log("set empty data");
136134
137− console.log("setting full data");
138135 page.menuModel.modelData = fullMenuData;
139− console.log("set full data");
140136 tryCompare(mainMenu, "count", 3);
141137
142138 page.menuModel.modelData = [];
tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+194−18
@@ -84,11 +84,13 @@ Item {
8484 { tag: 'switch1', type: "unity.widgets.systemsettings.tablet.switch", objectName: "switchMenu" },
8585
8686 { 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" },
8888 { tag: 'section', type: "com.canonical.indicator.section", objectName: "sectionMenu" },
8989 { tag: 'progress', type: "com.canonical.indicator.progress", objectName: "progressMenu" },
9090 { tag: 'slider1', type: "com.canonical.indicator.slider", objectName: "sliderMenu" },
9191 { 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" },
9294
9395 { tag: 'messageItem', type: "com.canonical.indicator.messages.messageitem", objectName: "messageItem" },
9496 { tag: 'sourceItem', type: "com.canonical.indicator.messages.sourceitem", objectName: "groupedMessage" },
@@ -96,8 +98,8 @@ Item {
9698 { tag: 'slider2', type: "com.canonical.unity.slider", objectName: "sliderMenu" },
9799 { tag: 'switch3', type: "com.canonical.unity.switch", objectName: "switchMenu" },
98100
99− { tag: 'mediaplayer', type: "com.canonical.unity.media-player", objectName: "standardMenu" },
100− { tag: 'playbackitem', type: "com.canonical.unity.playback-item", objectName: "standardMenu" },
101+ { tag: 'mediaplayer', type: "com.canonical.unity.media-player", objectName: "mediaPayerMenu" },
102+ { tag: 'playbackitem', type: "com.canonical.unity.playback-item", objectName: "playbackItemMenu" },
101103
102104 { tag: 'wifisection', type: "unity.widgets.systemsettings.tablet.wifisection", objectName: "wifiSection" },
103105 { tag: 'accesspoint', type: "unity.widgets.systemsettings.tablet.accesspoint", objectName: "accessPoint" },
@@ -115,6 +117,16 @@ Item {
115117 compare(loader.item.objectName, data.objectName, "Created object name does not match intended object (" + loader.item.objectName + " != " + data.objectName + ")");
116118 }
117119
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+
118130 function test_create_radio() {
119131 skip("No radio component");
120132 menuData.isRadio = true;
@@ -131,7 +143,7 @@ Item {
131143 loader.data = menuData;
132144 loader.sourceComponent = factory.load(menuData);
133145 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");
135147 }
136148
137149 function test_create_sliderMenu_data() {
@@ -145,13 +157,13 @@ Item {
145157 menuData.type = "com.canonical.indicator.slider"
146158 menuData.label = data.label;
147159 menuData.sensitive = data.enabled;
148− menuData.actionState = data.value;
149160 menuData.ext = {
150161 'minIcon': "file:///testMinIcon",
151162 'maxIcon': "file:///testMaxIcon",
152163 'minValue': data.minValue,
153164 'maxValue': data.maxValue
154165 };
166+ menuData.actionState = data.value;
155167
156168 loader.data = menuData;
157169 loader.sourceComponent = factory.load(menuData);
@@ -163,7 +175,7 @@ Item {
163175 compare(loader.item.maxIcon, "file:///testMaxIcon", "MaxIcon does not match data");
164176 compare(loader.item.minimumValue, data.minValue, "MinValue does not match data");
165177 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");
167179 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
168180 }
169181
@@ -232,7 +244,7 @@ Item {
232244
233245 function test_create_standardMenu_data() {
234246 return [
235− {label: "testLabel1", enabled: true, icon: "file:///testIcon" },
247+ {label: "testLabel1", enabled: true, icon: "file:///testIcon1" },
236248 {label: "testLabel2", enabled: false, icon: "file:///testIcon2"},
237249 ];
238250 }
@@ -253,31 +265,101 @@ Item {
253265 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
254266 }
255267
256− function test_create_switchMenu_data() {
268+ function test_create_checkableMenu_data() {
257269 return [
258270 {label: "testLabel1", enabled: true, checked: false },
259271 {label: "testLabel2", enabled: false, checked: true },
260272 ];
261273 }
262274
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+
263299 function test_create_switchMenu(data) {
264300 menuData.type = "com.canonical.indicator.switch";
265301 menuData.label = data.label;
266302 menuData.sensitive = data.enabled;
267− menuData.icon = "file:///testIcon";
303+ menuData.icon = data.icon;
268304 menuData.isToggled = data.checked;
269305
270306 loader.data = menuData;
271307 loader.sourceComponent = factory.load(menuData);
272308 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");
274310
275311 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");
277313 compare(loader.item.checked, data.checked, "Checked does not match data");
278314 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
279315 }
280316
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+
281363 function test_create_wifiSection_data() {
282364 return [
283365 {label: "testLabel1", busy: false },
@@ -322,7 +404,7 @@ Item {
322404 tryCompareFunction(function() { return loader.item != undefined; }, true);
323405 compare(loader.item.objectName, "accessPoint", "Should have created a access point menu");
324406
325− compare(loader.item.label, data.label, "Label does not match data");
407+ compare(loader.item.text, data.label, "Label does not match data");
326408 compare(loader.item.strengthAction.name, "action::strength", "Strength action incorrect");
327409 compare(loader.item.secure, data.secure, "Secure does not match data");
328410 compare(loader.item.adHoc, data.adHoc, "AdHoc does not match data");
@@ -341,8 +423,8 @@ Item {
341423
342424 function test_create_groupedMessage_data() {
343425 return [
344− {label: "testLabel1", enabled: true, count: "5", appIcon: "file:///testIcon" },
345− {label: "testLabel2", enabled: false, count: "10", appIcon: "file:///testIcon2" },
426+ {label: "testLabel1", enabled: true, count: "5", icon: "file:///testIcon" },
427+ {label: "testLabel2", enabled: false, count: "10", icon: "file:///testIcon2" },
346428 ];
347429 }
348430
@@ -350,8 +432,8 @@ Item {
350432 menuData.type = "com.canonical.indicator.messages.sourceitem";
351433 menuData.label = data.label;
352434 menuData.sensitive = data.enabled;
353− menuData.icon = data.appIcon;
354− menuData.ext = { 'icon': data.appIcon };
435+ menuData.icon = data.icon;
436+ menuData.ext = { 'icon': data.icon };
355437 menuData.actionState = [data.count];
356438 menuData.isToggled = true;
357439
@@ -360,9 +442,103 @@ Item {
360442 tryCompareFunction(function() { return loader.item != undefined; }, true);
361443 compare(loader.item.objectName, "groupedMessage", "Should have created a group message menu");
362444
363− compare(loader.item.title, data.label, "Label does not match data");
445+ compare(loader.item.text, data.label, "Label does not match data");
364446 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");
366542 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
367543 }
368544 }
tests/qmltests/Panel/Indicators/tst_MessageMenuItemFactory.qml+13−4
@@ -18,7 +18,8 @@ import QtQuick 2.0
1818import QtTest 1.0
1919import Unity.Test 0.1 as UT
2020import 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
2223
2324Item {
2425 id: testView
@@ -31,6 +32,11 @@ Item {
3132 menuIndex: 0
3233 }
3334
35+ Utils.TimeFormatter {
36+ id: timeFormatter
37+ format: "hh:mm - MMM dd"
38+ }
39+
3440 UT.UnityTestCase {
3541 name: "MessageMenuItemFactory"
3642
@@ -82,13 +88,14 @@ Item {
8288 'xCanonicalAppIcon': data.appIcon,
8389 };
8490 factory.menuData = menuData;
91+ timeFormatter.time = data.time;
8592
8693 var loader = findChild(factory, "loader");
8794 verify(loader !== undefined);
8895
8996 tryCompare(loader.item, "objectName", "simpleTextMessage");
9097 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");
9299 compare(loader.item.message, data.message, "Message does not match data");
93100 compare(loader.item.avatar, data.avatar, "Avatar does not match data");
94101 compare(loader.item.appIcon, data.appIcon, "App icon does not match data");
@@ -119,13 +126,14 @@ Item {
119126 ]
120127 };
121128 factory.menuData = menuData;
129+ timeFormatter.time = data.time;
122130
123131 var loader = findChild(factory, "loader");
124132 verify(loader !== undefined);
125133
126134 tryCompare(loader.item, "objectName", "textMessage");
127135 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");
129137 compare(loader.item.message, data.message, "Message does not match data");
130138 compare(loader.item.avatar, data.avatar, "Avatar does not match data");
131139 compare(loader.item.appIcon, data.appIcon, "App icon does not match data");
@@ -160,13 +168,14 @@ Item {
160168 ]
161169 };
162170 factory.menuData = menuData;
171+ timeFormatter.time = data.time;
163172
164173 var loader = findChild(factory, "loader");
165174 verify(loader !== undefined);
166175
167176 tryCompare(loader.item, "objectName", "snapDecision");
168177 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");
170179 compare(loader.item.message, data.message, "Message does not match data");
171180 compare(loader.item.avatar, data.avatar, "Avatar does not match data");
172181 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 {
3232
3333 function init_test()
3434 {
35+ indicatorModel.load();
36+
3537 indicatorRow.state = "initial";
36− indicatorRow.currentItem = null;
38+ indicatorRow.setCurrentItemIndex(-1);
3739 indicatorRow.unitProgress = 0.0;
3840 }
3941
@@ -49,210 +51,110 @@ Item {
4951 }
5052
5153 indicatorsModel: indicatorModel
54+
55+ Component.onCompleted: indicatorModel.load()
5256 }
5357
5458 Indicators.IndicatorsModel {
5559 id: indicatorModel
56− Component.onCompleted: load()
5760 }
5861
5962 UT.UnityTestCase {
6063 name: "IndicatorRow"
6164 when: windowShown
6265
66+ function get_indicator_item(index) {
67+ return findChild(indicatorRow.row, "item" + index);
68+ }
69+
6370 function test_set_current_item() {
6471 init_test();
65− indicatorRow.setCurrentItem(0);
72+ indicatorRow.setCurrentItemIndex(0);
6673 compare(indicatorRow.indicatorsModel.get(indicatorRow.currentItemIndex).identifier, "indicator-fake1", "Incorrect item at position 0");
6774
68− indicatorRow.setCurrentItem(1);
75+ indicatorRow.setCurrentItemIndex(1);
6976 compare(indicatorRow.indicatorsModel.get(indicatorRow.currentItemIndex).identifier, "indicator-fake2", "Incorrect item at position 1");
7077
71− indicatorRow.setCurrentItem(2);
78+ indicatorRow.setCurrentItemIndex(2);
7279 compare(indicatorRow.indicatorsModel.get(indicatorRow.currentItemIndex).identifier, "indicator-fake3", "Incorrect item at position 2");
7380 }
74− }
75−
76− UT.UnityTestCase {
77− name: "IndicatorRow_IconPosition"
78− when: windowShown
7981
80− function get_indicator_item_at(index) {
81− return findChild(indicatorRow, "rowRepeater").itemAt(index);
82+ function test_highlight_data() {
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+ ];
8293 }
8394
84− function test_current_item_commit() {
95+ function test_highlight(data) {
8596 init_test();
8697
87− indicatorRow.setCurrentItem(2);
88− indicatorRow.state = "commit";
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− }
98+ indicatorRow.unitProgress = data.progress;
99+ indicatorRow.setCurrentItemIndex(data.index);
96100
97− UT.UnityTestCase {
98− name: "IndicatorRow_Highlight"
99− when: windowShown
101+ compare(indicatorRow.currentItem.highlighted, data.current, "Indicator hightlight did not match for current item");
100102
101− function get_indicator_item_at(index) {
102− return findChild(indicatorRow, "rowRepeater").itemAt(index);
103+ for (var i = 0; i < indicatorRow.row.count; i++) {
104+ compare(get_indicator_item(i).highlighted, i === data.index ? data.current: data.other, "Indicator hightlight did not match for item iter");
105+ }
103106 }
104107
105− function test_intial_state() {
106− init_test();
107−
108− indicatorRow.state = "initial";
109− indicatorRow.setCurrentItem(0);
110−
111− compare(indicatorRow.currentItem.highlighted, false, "Indicator should not highlight when in initial state");
112− compare(get_indicator_item_at(1).highlighted, false, "Other indicators should not highlight when in initial state");
113− compare(get_indicator_item_at(2).highlighted, false, "Other indicators should not highlight when in initial state");
114− compare(get_indicator_item_at(3).highlighted, false, "Other indicators should not highlight when in initial state");
115− compare(get_indicator_item_at(4).highlighted, false, "Other indicators should not highlight when in initial state");
108+ function test_opacity_data() {
109+ return [
110+ { index: 0, progress: 0.0, current: 1.0, other: 1.0 },
111+ { index: 0, progress: 0.1, current: 1.0, other: 0.9 },
112+ { index: 0, progress: 0.5, current: 1.0, other: 0.5 },
113+ { index: 0, progress: 1.0, current: 1.0, other: 0.0 },
114+ { index: 2, progress: 0.0, current: 1.0, other: 1.0 },
115+ { index: 2, progress: 0.1, current: 1.0, other: 0.9 },
116+ { index: 2, progress: 0.5, current: 1.0, other: 0.5 },
117+ { index: 2, progress: 1.0, current: 1.0, other: 0.0 }
118+ ];
116119 }
117120
118− function test_hint_state() {
121+ function test_opacity(data) {
119122 init_test();
120123
121− indicatorRow.state = "hint";
122− indicatorRow.setCurrentItem(0);
124+ indicatorRow.unitProgress = data.progress;
125+ indicatorRow.setCurrentItemIndex(data.index);
123126
124− compare(indicatorRow.currentItem.highlighted, true, "Indicator should highlight when in hint state");
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);
127+ tryCompare(indicatorRow.currentItem, "opacity", data.current);
149128
150− compare(indicatorRow.currentItem.highlighted, true, "Indicator should highlight when in commit state");
151− compare(get_indicator_item_at(1).highlighted, false, "Other indicators should not highlight when in commit state");
152− compare(get_indicator_item_at(2).highlighted, false, "Other indicators should not highlight when in commit state");
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");
129+ for (var i = 0; i < indicatorRow.row.count; i++) {
130+ tryCompare(get_indicator_item(i), "opacity", i === data.index ? data.current: data.other);
131+ }
155132 }
156133
157− function test_locked_state() {
158− init_test();
159−
160− indicatorRow.state = "locked";
161− indicatorRow.setCurrentItem(0);
162−
163− compare(indicatorRow.currentItem.highlighted, true, "Indicator should highlight when in locked state");
164− compare(get_indicator_item_at(1).highlighted, false, "Other indicators should not highlight when in locked state");
165− compare(get_indicator_item_at(2).highlighted, false, "Other indicators should not highlight when in locked state");
166− compare(get_indicator_item_at(3).highlighted, false, "Other indicators should not highlight when in locked state");
167− compare(get_indicator_item_at(4).highlighted, false, "Other indicators should not highlight when in locked state");
134+ function test_dimmed_data() {
135+ return [
136+ { index: 0, progress: 0.0, current: false, other: false },
137+ { index: 0, progress: 0.1, current: false, other: true },
138+ { index: 0, progress: 0.5, current: false, other: true },
139+ { index: 0, progress: 1.0, current: false, other: true },
140+ { index: 2, progress: 0.0, current: false, other: false },
141+ { index: 2, progress: 0.1, current: false, other: true },
142+ { index: 2, progress: 0.5, current: false, other: true },
143+ { index: 2, progress: 1.0, current: false, other: true }
144+ ];
168145 }
169146
170− function test_opacity() {
147+ function test_dimmed(data) {
171148 init_test();
172149
173− indicatorRow.state = "reveal";
174− indicatorRow.unitProgress = 0.5;
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();
150+ indicatorRow.unitProgress = data.progress;
151+ indicatorRow.setCurrentItemIndex(data.index);
247152
248− indicatorRow.state = "locked";
249− indicatorRow.setCurrentItem(0);
153+ compare(indicatorRow.currentItem.dimmed, data.current, "Indicator dim did not match for current item");
250154
251− compare(get_indicator_item_at(0).dimmed, false, "Current indicator should not dim when in locked state");
252− compare(get_indicator_item_at(1).dimmed, true, "Other indicators should dim when in locked state");
253− compare(get_indicator_item_at(2).dimmed, true, "Other indicators should dim when in locked state");
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");
155+ for (var i = 0; i < indicatorRow.row.count; i++) {
156+ compare(get_indicator_item(i).dimmed, i === data.index ? data.current: data.other, "Indicator dim did not match for item iter");
157+ }
256158 }
257159 }
258160}
tests/qmltests/Panel/tst_Indicators.qml+78−19
@@ -83,6 +83,8 @@ Item {
8383 when: windowShown
8484
8585 function init() {
86+ indicators.initialise();
87+
8688 indicators.hide();
8789 tryCompare(indicators.hideAnimation, "running", false);
8890 tryCompare(indicators, "state", "initial");
@@ -101,21 +103,23 @@ Item {
101103 // tests changing the lateral position of the revealer activates the correct indicator items.
102104
103105 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);
105109
106− for (var i = 0; i < rowRepeater.count; i++) {
107− var indicatorItem = rowRepeater.itemAt(i);
110+ for (var i = 0; i < indicatorRowItems.count; i++) {
111+ var indicatorItem = findChild(indicatorRowItems, "item" + i);
108112
109113 if (!indicatorItem.visible)
110114 continue;
111115
112116 var indicatorPosition = indicators.mapFromItem(indicatorItem,
113− indicatorItem.width/2, indicatorItem.height/2)
117+ indicatorItem.width/2, indicatorItem.height/2);
114118
115119 touchFlick(indicators,
116120 indicatorPosition.x, indicatorPosition.y,
117121 indicatorPosition.x, indicators.openedHeight * 0.4,
118− true /* beginTouch */, false /* endTouch */)
122+ true /* beginTouch */, false /* endTouch */);
119123
120124 compare(indicatorRow.currentItem, indicatorItem,
121125 "Incorrect item activated at position " + i);
@@ -123,10 +127,10 @@ Item {
123127 touchFlick(indicators,
124128 indicatorPosition.x, indicators.openedHeight * 0.4,
125129 indicatorPosition.x, indicatorPosition.y,
126− false /* beginTouch */, true /* endTouch */)
130+ false /* beginTouch */, true /* endTouch */);
127131
128132 // wait until fully closed
129− tryCompare(indicators, "height", indicators.panelHeight)
133+ tryCompare(indicators, "height", indicators.panelHeight);
130134 }
131135 }
132136
@@ -139,20 +143,20 @@ Item {
139143 function test_progress_changes_state_to_not_initial() {
140144 indicators.height = indicators.openedHeight / 2
141145 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.");
143147 }
144148
145149 function test_progress_changes_state_to_locked() {
146150 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.");
148152 }
149153
150154 function test_partially_open() {
151155 indicators.height = indicators.openedHeight / 2
152156 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");
154158 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");
156160 }
157161
158162 function test_fully_open() {
@@ -161,21 +165,76 @@ Item {
161165 compare(indicators.fullyOpened, true);
162166 }
163167
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+
164175 function test_row_visible_menuContent_visible_data() { return [
165− {tag: "visible", index: 0, name: "indicator-fake1", visible: true },
166− {tag: "invisible", index: 1, name: "indicator-fake2", visible: false }]
176+ {tag: "first", visible: [false, true, true, true, true] },
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] }];
167181 }
168182
169183 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) {
170219 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);
172234
173− var indicatorItem = rowRepeater.itemAt(data.index);
174− tryCompareFunction(function() { return indicatorItem.width > 0}, true);
175− tryCompare(indicatorItem, "visible", data.visible);
235+ // check for current selected tab
236+ tryCompareFunction(function() { return findChild(indicatorTabs, data.expectedTab) === indicatorTabs.selectedTab }, true);
176237
177− var indicatorTab = findChild(indicatorTabs, data.name)
178− tryCompareFunction(function() { return indicatorTab !== undefined }, data.visible);
179238 }
180239 }
181240}
tests/qmltests/Panel/tst_MenuContent.qml+8−16
@@ -27,11 +27,11 @@ Item {
2727 height: units.gu(70)
2828
2929 property var indicator_status: {
30− 'menu_page1': { 'started': false, 'reset': 0 },
31− 'menu_page2': { 'started': false, 'reset': 0 },
32− 'menu_page3': { 'started': false, 'reset': 0 },
33− 'menu_page4': { 'started': false, 'reset': 0 },
34− 'menu_page5': { 'started': false, 'reset': 0 }
30+ 'indicator-fake1-page': { 'started': false, 'reset': 0 },
31+ 'indicator-fake2-page': { 'started': false, 'reset': 0 },
32+ 'indicator-fake3-page': { 'started': false, 'reset': 0 },
33+ 'indicator-fake4-page': { 'started': false, 'reset': 0 },
34+ 'indicator-fake5-page': { 'started': false, 'reset': 0 }
3535 }
3636
3737 // Dummy objects
@@ -49,14 +49,6 @@ Item {
4949 indicatorsModel: indicatorsModel
5050 contentReleaseInterval: 50
5151 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− }
6052 }
6153
6254 Rectangle {
@@ -96,20 +88,20 @@ Item {
9688 }
9789
9890 function get_test_menu_objecName(index) {
99− return "menu_page"+(index+1);
91+ return "indicator-fake" + (index + 1) + "-page";
10092 }
10193
10294 property string testTabObjectName : ""
10395
10496 function selected_tab_equals_test_tab() {
10597 var currentTab = menu_content_test.findChild(menuContent, "tabs").selectedTab
106− if (currentTab == undefined) {
98+ if (currentTab === null) {
10799 console.log("selected tab undefined");
108100 return false;
109101 }
110102
111103 var testTab = menu_content_test.findChild(menuContent, testTabObjectName);
112− if (testTab == undefined) {
104+ if (testTab === null) {
113105 console.log("test_tab " + testTabObjectName + " undefined");
114106 return false;
115107 }
tests/qmltests/Panel/tst_Panel.qml+21−21
@@ -56,6 +56,8 @@ Item {
5656 }
5757
5858 function init() {
59+ panel.indicators.initialise();
60+
5961 searchClicked = false;
6062 panel.indicators.hide();
6163 tryCompare(panel.indicators.hideAnimation, "running", false);
@@ -63,17 +65,18 @@ Item {
6365 }
6466
6567 function get_indicator_item(index) {
66− var rowRepeater = findChild(panel.indicators, "rowRepeater");
67− verify(rowRepeater != undefined);
68− return rowRepeater.itemAt(index);
68+ var indicatorRow = findChild(panel.indicators, "indicatorRow");
69+ verify(indicatorRow !== null);
70+
71+ return findChild(indicatorRow.row, "item" + index);
6972 }
7073
7174 function get_indicator_item_position(index) {
7275 var indicatorRow = findChild(panel.indicators, "indicatorRow");
73− verify(indicatorRow != undefined);
76+ verify(indicatorRow !== null);
7477
7578 var indicatorItem = get_indicator_item(index);
76− verify(indicatorItem != undefined);
79+ verify(indicatorItem !== null);
7780
7881 return panel.mapFromItem(indicatorItem, indicatorItem.width/2, indicatorItem.height/2);
7982 }
@@ -118,7 +121,7 @@ Item {
118121 // no hint animation when fullscreen
119122 compare(panel.indicators.y, -panel.panelHeight);
120123 var indicatorRow = findChild(panel.indicators, "indicatorRow");
121− verify(indicatorRow != undefined);
124+ verify(indicatorRow !== null);
122125 compare(indicatorRow.y, 0);
123126 compare(panel.indicators.height, panel.indicators.panelHeight);
124127 compare(panel.indicators.partiallyOpened, false,
@@ -142,14 +145,14 @@ Item {
142145 tryCompare(panel.indicators, "fullyOpened", true);
143146 }
144147
145− var indicatorRow = findChild(panel.indicators, "indicatorRow");
146− verify(indicatorRow != undefined);
148+ var indicatorRow = findChild(panel.indicators, "indicatorRow");
149+ verify(indicatorRow !== null);
147150
148− var rowRepeater = findChild(panel.indicators, "rowRepeater");
149− verify(indicatorRow != undefined);
151+ var menuContent = findChild(panel.indicators, "menuContent");
152+ verify(indicatorRow !== null);
150153
151154 var menuContent = findChild(panel.indicators, "menuContent");
152− verify(indicatorRow != undefined);
155+ verify(indicatorRow !== null);
153156
154157 // Wait for the indicators to get into position.
155158 // (switches between normal and fullscreen modes are animated)
@@ -160,10 +163,10 @@ Item {
160163 }
161164
162165 // 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++) {
164167
165168 var indicatorItem = get_indicator_item(i);
166− verify(indicatorItem != undefined);
169+ verify(indicatorItem !== null);
167170
168171 if (!indicatorItem.visible)
169172 continue;
@@ -203,7 +206,7 @@ Item {
203206 panel.searchVisible = true;
204207
205208 var searchIndicator = findChild(panel, "search");
206− verify(searchIndicator != undefined);
209+ verify(searchIndicator !== null);
207210
208211 tap(searchIndicator, 1, 1);
209212
@@ -216,7 +219,7 @@ Item {
216219 panel.searchVisible = false;
217220
218221 var searchIndicator = findChild(panel, "search");
219− verify(searchIndicator != undefined);
222+ verify(searchIndicator !== null);
220223
221224 tap(searchIndicator, 1, 1);
222225
@@ -232,17 +235,14 @@ Item {
232235 panel.searchVisible = false;
233236
234237 var indicatorRow = findChild(panel.indicators, "indicatorRow");
235− verify(indicatorRow != undefined);
236−
237− var rowRepeater = findChild(panel.indicators, "rowRepeater");
238− verify(indicatorRow != undefined);
238+ verify(indicatorRow !== null);
239239
240240 // Get the first indicator
241241 var indicatorItemFirst = get_indicator_item(0);
242− verify(indicatorItemFirst != undefined);
242+ verify(indicatorItemFirst !== null);
243243
244244 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);
246246
247247 touchPress(panel,
248248 indicatorItemCoordFirst.x, panel.panelHeight / 2);
tests/qmltests/tst_Shell.qml+3−3
@@ -71,14 +71,14 @@ Item {
7171 var dashContentList = findChild(shell, "dashContentList");
7272 waitForRendering(dashContentList);
7373 var homeLoader = findChild(dashContentList, "home.scope loader");
74− ok = homeLoader !== undefined
74+ ok = homeLoader !== null
7575 && homeLoader.item !== undefined;
7676
7777 var dashHome = findChild(shell, "DashHome");
78− ok &= dashHome !== undefined;
78+ ok &= dashHome !== null;
7979
8080 var launcherPanel = findChild(shell, "launcherPanel");
81− ok &= launcherPanel !== undefined;
81+ ok &= launcherPanel !== null;
8282
8383 attempts++;
8484 if (!ok) {
tests/utils/modules/Unity/Test/UnityTestCase.qml+2−2
@@ -83,7 +83,7 @@ TestCase {
8383 }
8484 childs.splice(0, 1);
8585 }
86− return undefined;
86+ return null;
8787 }
8888
8989 // Find an object with the given name in the children tree of "obj"
@@ -103,7 +103,7 @@ TestCase {
103103 }
104104 childs.splice(0, 1);
105105 }
106− return undefined;
106+ return null;
107107 }
108108
109109 // Type a full string instead of keyClick letter by letter