Merge lp:~renatofilho/address-book-app/fix-visuals into lp:address-book-app

Proposed by Renato Araujo Oliveira Filho
Status: Merged
Approved by: Gustavo Pichorim Boiko
Approved revision: 107
Merged at revision: 103
Proposed branch: lp:~renatofilho/address-book-app/fix-visuals
Merge into: lp:address-book-app
Diff against target: 1126 lines (+386/-322)
20 files modified
CMakeLists.txt (+13/-5)
debian/qtdeclarative5-ubuntu-contacts0.1.install (+0/-1)
src/artwork/CMakeLists.txt (+9/-8)
src/artwork/avatar-default.svg (+0/-135)
src/imports/ContactEdit/ContactDetailAvatarEditor.qml (+18/-17)
src/imports/ContactEdit/ContactDetailGroupWithTypeEditor.qml (+5/-6)
src/imports/ContactEdit/ValueSelector.qml (+28/-31)
src/imports/ContactList/ContactListPage.qml (+1/-1)
src/imports/ContactView/ActionButton.qml (+1/-1)
src/imports/ContactView/BasicFieldView.qml (+1/-1)
src/imports/ContactView/ContactDetailAvatarView.qml (+2/-3)
src/imports/ContactView/ContactDetailPhoneNumberView.qml (+1/-1)
src/imports/Ubuntu/Contacts/CMakeLists.txt (+1/-7)
src/imports/Ubuntu/Contacts/ContactDelegate.qml (+43/-78)
src/imports/Ubuntu/Contacts/ContactListView.qml (+24/-0)
src/imports/Ubuntu/Contacts/ContactSimpleListView.qml (+100/-22)
src/imports/Ubuntu/Contacts/Contacts.js (+26/-2)
src/imports/Ubuntu/Contacts/DialogButtons.qml (+1/-0)
src/imports/Ubuntu/Contacts/FavoriteDelegate.qml (+112/-0)
src/imports/Ubuntu/Contacts/MultipleSelectionListView.qml (+0/-3)
To merge this branch: bzr merge lp:~renatofilho/address-book-app/fix-visuals
Reviewer Review Type Date Requested Status
Gustavo Pichorim Boiko (community) Approve
PS Jenkins bot continuous-integration Approve
Bill Filler (community) Approve
Review via email: mp+189999@code.launchpad.net

Commit message

Replaced default avatar image.
Resized contact delegate height.
Replaced ValueSelector images.
Updated contact favorite delegate visuals.

Description of the change

To correct test this branch you need update address book service from this branch: https://code.launchpad.net/~renatofilho/address-book-service/fix-fetch-hint/+merge/190000

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

FAILED: Continuous integration, rev:101
http://jenkins.qa.ubuntu.com/job/address-book-app-ci/267/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/address-book-app-saucy-amd64-ci/267
    SUCCESS: http://jenkins.qa.ubuntu.com/job/address-book-app-saucy-armhf-ci/268
        deb: http://jenkins.qa.ubuntu.com/job/address-book-app-saucy-armhf-ci/268/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/address-book-app-saucy-i386-ci/267
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-saucy/4824
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-touch/2677/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-testrunner-otto-saucy/1002
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-saucy-amd64/699
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-saucy-amd64/699/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-saucy-armhf/2679
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-saucy-armhf/2679/artifact/work/output/*zip*/output.zip
    ABORTED: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-runner-maguro/2218/console
    ABORTED: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-runner-mako/2231/console

Click here to trigger a rebuild:
http://10.97.0.26:8080/job/address-book-app-ci/267/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Bill Filler (bfiller) wrote :

approved

review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Gustavo Pichorim Boiko (boiko) wrote :

Looks good!

review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
105. By Renato Araujo Oliveira Filho

Merged mainline.

106. By Renato Araujo Oliveira Filho

Optimize avatar load for contact list.

107. By Renato Araujo Oliveira Filho

Optimized FavoriteDelegate image loader.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Gustavo Pichorim Boiko (boiko) wrote :

Latest changes look good too!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'CMakeLists.txt'
2--- CMakeLists.txt 2013-07-31 22:24:45 +0000
3+++ CMakeLists.txt 2013-10-11 00:12:33 +0000
4@@ -27,11 +27,6 @@
5 # Tests
6 enable_testing()
7
8-add_subdirectory(data)
9-add_subdirectory(src)
10-add_subdirectory(po)
11-add_subdirectory(tests)
12-
13 # uninstall target
14 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
15 "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
16@@ -43,3 +38,16 @@
17 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/config.h.in"
18 "${CMAKE_CURRENT_BINARY_DIR}/config.h"
19 IMMEDIATE @ONLY)
20+
21+# components PATH
22+execute_process(
23+ COMMAND qmake -query QT_INSTALL_QML
24+ OUTPUT_VARIABLE QT_IMPORTS_DIR
25+ OUTPUT_STRIP_TRAILING_WHITESPACE
26+)
27+set(QMLPLUGIN_INSTALL_PREFIX "${QT_IMPORTS_DIR}/Ubuntu/Contacts.${API_VERSION}/")
28+
29+add_subdirectory(data)
30+add_subdirectory(src)
31+add_subdirectory(po)
32+add_subdirectory(tests)
33
34=== modified file 'debian/qtdeclarative5-ubuntu-contacts0.1.install'
35--- debian/qtdeclarative5-ubuntu-contacts0.1.install 2013-07-26 22:43:21 +0000
36+++ debian/qtdeclarative5-ubuntu-contacts0.1.install 2013-10-11 00:12:33 +0000
37@@ -1,2 +1,1 @@
38 usr/lib/*/qt5/qml/Ubuntu/Contacts*
39-usr/share/icons/hicolor/scalable/emblems/avatar-default.svg
40
41=== modified file 'src/artwork/CMakeLists.txt'
42--- src/artwork/CMakeLists.txt 2013-10-09 17:53:41 +0000
43+++ src/artwork/CMakeLists.txt 2013-10-11 00:12:33 +0000
44@@ -2,16 +2,21 @@
45 address-book-app.png
46 )
47
48+set(ADDRESS_BOOK_COMPONENTS_ARTWORK
49+ contact-default@27.png
50+ tick-dark@30.png
51+)
52+
53 set(ADDRESS_BOOK_APP_ARTWORK
54 action-list.png
55 add-detail.svg
56 add.png
57 address-book-app.png
58 address-book-app-preview.png
59- avatar-default.svg
60 birthday-cake.svg
61 combo-indicator.png
62 contact-call.svg
63+ contact-default-profile.png
64 contact-email.svg
65 contact-location.png
66 contact-message.svg
67@@ -42,15 +47,11 @@
68 DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/48x48/apps
69 )
70
71-install(FILES avatar-default.svg
72- DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/emblems
73-)
74-
75 install(FILES ${ADDRESS_BOOK_APP_ARTWORK}
76 DESTINATION ${ADDRESS_BOOK_APP_DIR}/artwork
77 )
78
79-
80-
81-
82+install(FILES ${ADDRESS_BOOK_COMPONENTS_ARTWORK}
83+ DESTINATION ${QMLPLUGIN_INSTALL_PREFIX}/artwork
84+)
85
86
87=== removed file 'src/artwork/avatar-default.svg'
88--- src/artwork/avatar-default.svg 2013-07-25 20:00:03 +0000
89+++ src/artwork/avatar-default.svg 1970-01-01 00:00:00 +0000
90@@ -1,135 +0,0 @@
91-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
92-<!-- Created with Inkscape (http://www.inkscape.org/) -->
93-
94-<svg
95- xmlns:dc="http://purl.org/dc/elements/1.1/"
96- xmlns:cc="http://creativecommons.org/ns#"
97- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
98- xmlns:svg="http://www.w3.org/2000/svg"
99- xmlns="http://www.w3.org/2000/svg"
100- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
101- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
102- width="90"
103- height="90.000031"
104- id="svg3615"
105- version="1.1"
106- inkscape:version="0.48+devel r12221"
107- sodipodi:docname="contact.svg">
108- <defs
109- id="defs3617">
110- <clipPath
111- clipPathUnits="userSpaceOnUse"
112- id="clipPath2995-6">
113- <path
114- style="color:#000000;fill:#ff00ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
115- d="m 222,818.36215 0,54 126,0 0,-54 -43.875,0 c -0.0316,0.0521 -0.062,0.1043 -0.0937,0.15625 -2.2906,3.75334 -4.87723,7.16686 -7.875,9.875 -2.99777,2.70814 -6.52444,5 -11.125,5 -4.60056,0 -8.12214,-2.29391 -11.125,-5 -3.00286,-2.70609 -5.60728,-6.12218 -7.90625,-9.875 -0.0318,-0.0519 -0.062,-0.1042 -0.0937,-0.15625 L 222.0001,818.36215 Z"
116- id="path2997-4"
117- inkscape:connector-curvature="0" />
118- </clipPath>
119- </defs>
120- <sodipodi:namedview
121- id="base"
122- pagecolor="#ffffff"
123- bordercolor="#666666"
124- borderopacity="1.0"
125- inkscape:pageopacity="0.0"
126- inkscape:pageshadow="2"
127- inkscape:zoom="7.9580786"
128- inkscape:cx="36.190065"
129- inkscape:cy="48.918863"
130- inkscape:document-units="px"
131- inkscape:current-layer="g4271"
132- showgrid="true"
133- fit-margin-top="0"
134- fit-margin-left="0"
135- fit-margin-right="0"
136- fit-margin-bottom="0"
137- inkscape:window-width="1920"
138- inkscape:window-height="1029"
139- inkscape:window-x="0"
140- inkscape:window-y="24"
141- inkscape:window-maximized="1">
142- <inkscape:grid
143- type="xygrid"
144- id="grid2986"
145- empspacing="6"
146- visible="true"
147- enabled="true"
148- snapvisiblegridlinesonly="true"
149- originx="0px"
150- originy="2.6171875e-06px" />
151- </sodipodi:namedview>
152- <metadata
153- id="metadata3620">
154- <rdf:RDF>
155- <cc:Work
156- rdf:about="">
157- <dc:format>image/svg+xml</dc:format>
158- <dc:type
159- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
160- <dc:title />
161- </cc:Work>
162- </rdf:RDF>
163- </metadata>
164- <g
165- inkscape:label="Layer 1"
166- inkscape:groupmode="layer"
167- id="layer1"
168- transform="translate(1978.2857,336.49495)">
169- <g
170- id="g4271"
171- transform="translate(-2218.2857,-1106.8571)">
172- <path
173- style="color:#000000;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
174- clip-path="none"
175- d="M 30.21875 54.15625 C 11.057821 55.125058 6 61.297631 6 75 L 6 81 C 6 90 6 90 18 90 L 72 90 C 84 90 84 90 84 81 L 84 75 C 84 61.305107 78.947539 55.130228 59.8125 54.15625 C 58.661142 55.560765 57.451922 56.86076 56.15625 58.03125 C 53.15848 60.73939 49.63181 63.03125 45.03125 63.03125 C 40.43069 63.03125 36.90911 60.73734 33.90625 58.03125 C 32.605846 56.859364 31.377261 55.564123 30.21875 54.15625 z "
176- transform="translate(240,770.36215)"
177- id="rect3461-3-1" />
178- <rect
179- y="770.36218"
180- x="240"
181- height="90"
182- width="90"
183- id="rect4269"
184- style="color:#000000;fill:none;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
185- <path
186- inkscape:transform-center-y="21.408856"
187- inkscape:transform-center-x="-0.0067782248"
188- id="path3447-0-6"
189- d="m 285.00024,770.36215 c -14.99976,-3e-5 -20.99976,6.00003 -20.99976,21.00003 l 0,3 c 0,12 12.03506,33 21.01729,33 8.98223,0 20.98223,-21 20.98223,-33 l 0,-3 c 0,-15 -6,-21 -20.99976,-21.00003 z"
190- style="color:#000000;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
191- inkscape:connector-curvature="0"
192- sodipodi:nodetypes="zsszssz" />
193- </g>
194- </g>
195- <g
196- inkscape:groupmode="layer"
197- id="layer2"
198- inkscape:label="Clips"
199- sodipodi:insensitive="true"
200- style="display:none">
201- <path
202- transform="translate(-240,-770.36215)"
203- style="color:#000000;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
204- d="m 246,851.36218 c 0,9 0,9 12,9 l 54,0 c 12,0 12,0 12,-9 l 0,-6 c 0,-15 -6,-21 -30,-21 l -18,0 C 252,824.36218 246,830.36218 246,845.36218 Z"
205- id="rect3461-3-1-5"
206- inkscape:connector-curvature="0"
207- sodipodi:nodetypes="csscccccc"
208- clip-path="url(#clipPath2995-6)" />
209- <rect
210- y="3.2134991e-05"
211- x="0"
212- height="90"
213- width="90"
214- id="rect4269-8"
215- style="color:#000000;fill:none;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
216- <path
217- inkscape:transform-center-y="21.408856"
218- inkscape:transform-center-x="-0.0067782248"
219- id="path3447-0-6-9"
220- d="M 45.00024,-4.8230939e-7 C 30.00048,-3.0482196e-5 24.00048,6.0000295 24.00048,21.00003 l 0,3 c 0,12 12.03506,33 21.01729,33 8.98223,0 20.98223,-21 20.98223,-33 l 0,-3 C 66,6.0000295 60,2.9517803e-5 45.00024,-4.8230939e-7 Z"
221- style="color:#000000;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
222- inkscape:connector-curvature="0"
223- sodipodi:nodetypes="zsszssz" />
224- </g>
225-</svg>
226
227=== added file 'src/artwork/contact-default-profile.png'
228Binary files src/artwork/contact-default-profile.png 1970-01-01 00:00:00 +0000 and src/artwork/contact-default-profile.png 2013-10-11 00:12:33 +0000 differ
229=== added file 'src/artwork/contact-default@27.png'
230Binary files src/artwork/contact-default@27.png 1970-01-01 00:00:00 +0000 and src/artwork/contact-default@27.png 2013-10-11 00:12:33 +0000 differ
231=== added file 'src/artwork/tick-dark@30.png'
232Binary files src/artwork/tick-dark@30.png 1970-01-01 00:00:00 +0000 and src/artwork/tick-dark@30.png 2013-10-11 00:12:33 +0000 differ
233=== modified file 'src/imports/ContactEdit/ContactDetailAvatarEditor.qml'
234--- src/imports/ContactEdit/ContactDetailAvatarEditor.qml 2013-10-09 21:48:18 +0000
235+++ src/imports/ContactEdit/ContactDetailAvatarEditor.qml 2013-10-11 00:12:33 +0000
236@@ -25,7 +25,7 @@
237 ContactDetailBase {
238 id: root
239
240- readonly property string defaultAvatar: "image://theme/avatar-default"
241+ readonly property string defaultAvatar: Qt.resolvedUrl("../../artwork/contact-default-profile.png")
242
243 function save() {
244 if (avatarImage.source != root.defaultAvatar) {
245@@ -86,28 +86,29 @@
246 }
247 }
248
249- AbstractButton {
250- id: changeButton
251-
252- property var activeTransfer
253- property var loadingDialog: null
254-
255+ Icon {
256 anchors {
257 right: parent.right
258+ rightMargin: units.gu(1.5)
259 bottom: parent.bottom
260- margins: units.gu(1)
261+ bottomMargin: units.gu(2)
262 }
263-
264 width: units.gu(3)
265- height: units.gu(3)
266-
267- Image {
268- anchors.fill: parent
269- source: "artwork:/import-image.svg"
270- fillMode: Image.PreserveAspectFit
271- }
272-
273+ height: width
274+ name: "import-image"
275+ color: "white"
276+ }
277+
278+ MouseArea {
279+ id: changeButton
280+
281+ property var activeTransfer
282+ property var loadingDialog: null
283+
284+ anchors.fill: parent
285 onClicked: {
286+ // make sure the OSK disappear
287+ root.forceActiveFocus()
288 if (!changeButton.loadingDialog) {
289 changeButton.loadingDialog = PopupUtils.open(loadingDialog, null)
290 changeButton.activeTransfer = ContentHub.importContent(ContentType.Pictures,
291
292=== modified file 'src/imports/ContactEdit/ContactDetailGroupWithTypeEditor.qml'
293--- src/imports/ContactEdit/ContactDetailGroupWithTypeEditor.qml 2013-10-03 22:48:16 +0000
294+++ src/imports/ContactEdit/ContactDetailGroupWithTypeEditor.qml 2013-10-11 00:12:33 +0000
295@@ -88,17 +88,16 @@
296 }
297
298
299- Image {
300+ Icon {
301 anchors {
302 verticalCenter: parent.verticalCenter
303 right: parent.right
304 rightMargin: units.gu(2)
305 }
306- width: units.gu(3)
307- height: units.gu(3)
308-
309- source: "artwork:/add-detail.svg"
310- fillMode: Image.PreserveAspectFit
311+ width: units.gu(2)
312+ height: units.gu(2)
313+ color: "white"
314+ name: "add"
315 MouseArea {
316 anchors.fill: parent
317 onClicked: {
318
319=== modified file 'src/imports/ContactEdit/ValueSelector.qml'
320--- src/imports/ContactEdit/ValueSelector.qml 2013-09-27 11:32:35 +0000
321+++ src/imports/ContactEdit/ValueSelector.qml 2013-10-11 00:12:33 +0000
322@@ -85,21 +85,18 @@
323 color: "#f3f3e7"
324 }
325
326- Label {
327- id: arrowIndicator
328+ Icon {
329+ name: "chevron"
330+ color: "white"
331+ height: units.gu(1)
332+ width: height
333
334 anchors {
335 verticalCenter: parent.verticalCenter
336+ verticalCenterOffset: units.dp(2)
337 left: label.right
338+ leftMargin: units.gu(0.5)
339 }
340- width: units.gu(2)
341- horizontalAlignment: Text.AlignHCenter
342- text: ">"
343-
344- // style
345- fontSize: "medium"
346- color: "#f3f3e7"
347- opacity: 0.2
348 }
349 }
350
351@@ -123,39 +120,22 @@
352 top: parent.top
353 bottom: parent.bottom
354 }
355- width: arrow.width + listLabel.paintedWidth// + units.gu(2)
356+ width: arrow.width + listLabel.paintedWidth + units.gu(1)
357+ opacity: currentIndex == index ? 1.0 : 0.2
358
359 Label {
360- id: arrow
361+ id: listLabel
362
363 anchors {
364 verticalCenter: parent.verticalCenter
365 left: parent.left
366 }
367- width: visible ? units.gu(2) : 0
368- text: ">"
369- horizontalAlignment: Text.AlignHCenter
370- visible: index > 0
371-
372- // style
373- fontSize: "medium"
374- color: "#f3f3e7"
375- opacity: 0.2
376- }
377- Label {
378- id: listLabel
379-
380- anchors {
381- verticalCenter: parent.verticalCenter
382- left: arrow.right
383- right: parent.right
384- }
385+ width: paintedWidth
386 text: modelData
387
388 // style
389 fontSize: "medium"
390 color: "#f3f3e7"
391- opacity: currentIndex == index ? 1.0 : 0.2
392
393 MouseArea {
394 width: parent.width + units.gu(0.5)
395@@ -164,6 +144,23 @@
396 onClicked: currentIndex = index
397 }
398 }
399+
400+ Icon {
401+ id: arrow
402+
403+ name: "chevron"
404+ color: "white"
405+ height: visible ? units.gu(1) : 0
406+ width: height
407+ visible: index < (listView.count - 1)
408+
409+ anchors {
410+ verticalCenter: listLabel.verticalCenter
411+ verticalCenterOffset: units.dp(2)
412+ left: listLabel.right
413+ leftMargin: units.gu(0.5)
414+ }
415+ }
416 }
417 }
418
419
420=== modified file 'src/imports/ContactList/ContactListPage.qml'
421--- src/imports/ContactList/ContactListPage.qml 2013-10-07 21:32:52 +0000
422+++ src/imports/ContactList/ContactListPage.qml 2013-10-11 00:12:33 +0000
423@@ -65,6 +65,7 @@
424 ContactsUI.ContactListView {
425 id: contactList
426
427+ showFavoritePhoneLabel: false
428 multiSelectionEnabled: true
429 anchors {
430 // This extra margin is necessary because the toolbar area overlaps the last item in the view
431@@ -74,7 +75,6 @@
432 fill: parent
433 }
434 onError: PopupUtils.open(dialog, null)
435- defaultAvatarImageUrl: "artwork:/avatar-default.svg"
436 swipeToDelete: true
437
438 ActivityIndicator {
439
440=== modified file 'src/imports/ContactView/ActionButton.qml'
441--- src/imports/ContactView/ActionButton.qml 2013-09-20 12:01:35 +0000
442+++ src/imports/ContactView/ActionButton.qml 2013-10-11 00:12:33 +0000
443@@ -29,6 +29,6 @@
444 anchors.centerIn: parent
445 height: units.gu(3)
446 width: height
447- color: UbuntuColors.warmGrey
448+ color: "white"
449 }
450 }
451
452=== modified file 'src/imports/ContactView/BasicFieldView.qml'
453--- src/imports/ContactView/BasicFieldView.qml 2013-10-03 22:48:16 +0000
454+++ src/imports/ContactView/BasicFieldView.qml 2013-10-11 00:12:33 +0000
455@@ -47,7 +47,7 @@
456 visible: text != ""
457 anchors {
458 left: actionIcon.right
459- leftMargin: actionIcon.visible ? units.gu(1) : 0
460+ leftMargin: actionIcon.visible ? units.gu(2) : 0
461 top: parent.top
462 topMargin: units.gu(1)
463 }
464
465=== modified file 'src/imports/ContactView/ContactDetailAvatarView.qml'
466--- src/imports/ContactView/ContactDetailAvatarView.qml 2013-10-04 19:16:48 +0000
467+++ src/imports/ContactView/ContactDetailAvatarView.qml 2013-10-11 00:12:33 +0000
468@@ -26,9 +26,8 @@
469 function getAvatar(avatarDetail)
470 {
471 // use this verbose mode to avoid problems with binding loops
472- var avatarUrl = "image://theme/avatar-default"
473-
474- if (avatarDetail) {
475+ var avatarUrl = Qt.resolvedUrl("../../artwork/contact-default-profile.png")
476+ if (avatarDetail) {
477 var avatarValue = avatarDetail.value(Avatar.ImageUrl)
478 if (avatarValue != "") {
479 avatarUrl = avatarValue
480
481=== modified file 'src/imports/ContactView/ContactDetailPhoneNumberView.qml'
482--- src/imports/ContactView/ContactDetailPhoneNumberView.qml 2013-10-04 21:52:50 +0000
483+++ src/imports/ContactView/ContactDetailPhoneNumberView.qml 2013-10-11 00:12:33 +0000
484@@ -76,7 +76,7 @@
485 bottom: parent.bottom
486 }
487 width: height
488- iconName: "incoming-call"
489+ iconName: "call-start"
490 onClicked: Qt.openUrlExternally("tel:///" + encodeURIComponent(view.values[0]))
491 }
492
493
494=== modified file 'src/imports/Ubuntu/Contacts/CMakeLists.txt'
495--- src/imports/Ubuntu/Contacts/CMakeLists.txt 2013-10-03 14:30:11 +0000
496+++ src/imports/Ubuntu/Contacts/CMakeLists.txt 2013-10-11 00:12:33 +0000
497@@ -10,6 +10,7 @@
498 ContactSearchListView.qml
499 ContactSimpleListView.qml
500 DialogButtons.qml
501+ FavoriteDelegate.qml
502 MultipleSelectionListView.qml
503 MultipleSelectionVisualModel.qml
504 qmldir
505@@ -21,12 +22,5 @@
506
507 # make the files visible on qtcreator
508 add_custom_target(contact_components_QmlFiles ALL SOURCES ${CONTACT_COMPONENTS_QMLS})
509-
510-execute_process(
511- COMMAND qmake -query QT_INSTALL_QML
512- OUTPUT_VARIABLE QT_IMPORTS_DIR
513- OUTPUT_STRIP_TRAILING_WHITESPACE
514-)
515-set(QMLPLUGIN_INSTALL_PREFIX "${QT_IMPORTS_DIR}/Ubuntu/Contacts.${API_VERSION}/")
516 install(FILES ${CONTACT_COMPONENTS_QMLS} DESTINATION ${QMLPLUGIN_INSTALL_PREFIX})
517
518
519=== modified file 'src/imports/Ubuntu/Contacts/ContactDelegate.qml'
520--- src/imports/Ubuntu/Contacts/ContactDelegate.qml 2013-10-09 12:43:14 +0000
521+++ src/imports/Ubuntu/Contacts/ContactDelegate.qml 2013-10-11 00:12:33 +0000
522@@ -24,76 +24,63 @@
523 id: item
524
525 property int index: -1
526- property variant itemDelegate: null
527-
528- implicitHeight: delegate.height + (delegate.detailsShown ? pickerLoader.item.height : 0)
529+ property bool showAvatar: true
530+ property alias selected: delegate.selected
531+ property alias removable: delegate.removable
532+ property bool selectMode: false
533+ property string defaultAvatarUrl: ""
534+ property int titleDetail: ContactDetail.Name
535+ property variant titleFields: [ Name.FirstName, Name.LastName ]
536+ property bool detailsShown: false
537+
538+ signal contactClicked(var index, var contact)
539+ signal pressAndHold(var index, var contact)
540+
541+ implicitHeight: delegate.height + (item.detailsShown ? pickerLoader.item.height : 0)
542 width: parent ? parent.width : 0
543 clip: true
544
545- Connections {
546- target: contactListView
547- onCurrentContactExpandedChanged: {
548- if (index != currentContactExpanded) {
549- delegate.detailsShown = false
550- }
551- }
552- }
553-
554 ListItem.Empty {
555 id: delegate
556
557- property bool detailsShown: false
558-
559- height: units.gu(10)
560+ height: units.gu(6)
561 showDivider: false
562- selected: contactListView.multiSelectionEnabled &&
563- item.itemDelegate &&
564- contactListView.isSelected &&
565- contactListView.isSelected(item.itemDelegate)
566- removable: contactListView &&
567- contactListView.swipeToDelete &&
568- !detailsShown &&
569- !contactListView.isInSelectionMode
570 confirmRemoval: removable
571 UbuntuShape {
572 id: avatar
573
574- height: units.gu(7)
575- width: contactListView.showAvatar ? units.gu(7) : 0
576+ height: units.gu(4)
577+ width: item.showAvatar ? units.gu(4) : 0
578 visible: width > 0
579+ radius: "medium"
580 anchors {
581 left: parent.left
582 leftMargin: units.gu(2)
583 verticalCenter: parent.verticalCenter
584 }
585 image: Image {
586+ property bool isDefaultAvatar: (source == item.defaultAvatarUrl)
587 fillMode: Image.PreserveAspectCrop
588 asynchronous: true
589- source: ContactsJS.getAvatar(contact)
590+ source: ContactsJS.getAvatar(contact, item.defaultAvatarUrl)
591+ sourceSize.width: isDefaultAvatar ? undefined : width * 1.5
592+ sourceSize.height: isDefaultAvatar ? undefined : height * 1.5
593 }
594 }
595
596- Row {
597- spacing: units.gu(1)
598+ Label {
599+ id: name
600+
601 anchors {
602 left: avatar.right
603 leftMargin: units.gu(2)
604 verticalCenter: parent.verticalCenter
605 right: selectionMark.left
606 }
607- Label {
608- id: name
609- height: paintedHeight
610- text: ContactsJS.formatToDisplay(contact, contactListView.titleDetail, contactListView.titleFields)
611- fontSize: "large"
612- }
613- Label {
614- id: company
615- height: paintedHeight
616- text: ContactsJS.formatToDisplay(contact, contactListView.subTitleDetail, contactListView.subTitleFields)
617- fontSize: "medium"
618- opacity: 0.2
619- }
620+
621+ height: paintedHeight
622+ text: ContactsJS.formatToDisplay(contact, item.titleDetail, item.titleFields)
623+ fontSize: "medium"
624 }
625
626 Rectangle {
627@@ -106,46 +93,24 @@
628 }
629
630 color: "black"
631- width: delegate.selected ? units.gu(5) : 0
632+ width: item.selectMode ? units.gu(5) : 0
633 visible: width > 0
634- Icon {
635- name: "select"
636+
637+ Behavior on width {
638+ UbuntuNumberAnimation { }
639+ }
640+
641+ Image {
642 height: units.gu(3)
643 width: height
644 anchors.centerIn: parent
645- }
646- }
647-
648- onClicked: {
649- if (contactListView.isInSelectionMode) {
650- if (!contactListView.selectItem(item.itemDelegate)) {
651- contactListView.deselectItem(item.itemDelegate)
652- }
653- return
654- }
655- if (currentContactExpanded == index) {
656- currentContactExpanded = -1
657- detailsShown = false
658- return
659- // check if we should expand and display the details picker
660- } else if (detailToPick !== 0){
661- currentContactExpanded = index
662- detailsShown = !detailsShown
663- return
664- }
665- if (priv.currentOperation !== -1) {
666- return
667- }
668- contactListView.currentIndex = index
669- priv.currentOperation = contactsModel.fetchContacts(contact.contactId)
670- }
671-
672- onPressAndHold: {
673- if (contactListView.multiSelectionEnabled) {
674- contactListView.startSelection()
675- contactListView.selectItem(itemDelegate)
676- }
677- }
678+ source: Qt.resolvedUrl("./artwork/tick-dark.png")
679+ opacity: item.selected ? 1.0 : 0.2
680+ }
681+ }
682+
683+ onClicked: item.contactClicked(index, contact)
684+ onPressAndHold: item.pressAndHold(index, contact)
685
686 onItemRemoved: {
687 contactsModel.removeContact(contact.contactId)
688@@ -155,7 +120,7 @@
689 Loader {
690 id: pickerLoader
691
692- source: delegate.detailsShown ? Qt.resolvedUrl("ContactDetailPickerDelegate.qml") : ""
693+ source: item.detailsShown ? Qt.resolvedUrl("ContactDetailPickerDelegate.qml") : ""
694 anchors {
695 top: delegate.bottom
696 left: parent.left
697
698=== modified file 'src/imports/Ubuntu/Contacts/ContactListView.qml'
699--- src/imports/Ubuntu/Contacts/ContactListView.qml 2013-10-01 18:42:19 +0000
700+++ src/imports/Ubuntu/Contacts/ContactListView.qml 2013-10-11 00:12:33 +0000
701@@ -41,6 +41,14 @@
702 ContactSimpleListView {
703 id: root
704
705+ /*!
706+ \qmlproperty bool showFavoritePhoneLabel
707+
708+ This property holds if the phone label should appear on favorite contact or not
709+ By default this is set to true.
710+ */
711+ property bool showFavoritePhoneLabel: true
712+
713 header: Column {
714 width: parent.width
715 height: favouritesList.count > 0 ? childrenRect.height : 0
716@@ -57,12 +65,22 @@
717 left: parent.left
718 right: parent.right
719 }
720+
721 height: (count > 0 && !root.isInSelectionMode) ? contentHeight : 0
722 onContactClicked: root.contactClicked(contact)
723 defaultAvatarImageUrl: root.defaultAvatarImageUrl
724 multiSelectionEnabled: false
725 interactive: false
726 showSections: false
727+
728+ fetchHint: FetchHint {
729+ optimizationHints: FetchHint.AllRequired
730+ detailTypesHint: [ ContactDetail.Avatar,
731+ ContactDetail.Favorite,
732+ ContactDetail.Name,
733+ ContactDetail.PhoneNumber ]
734+ }
735+
736 filter: DetailFilter {
737 detail: ContactDetail.Favorite
738 field: Favorite.Favorite
739@@ -70,6 +88,12 @@
740 matchFlags: DetailFilter.MatchExactly
741 }
742
743+ listDelegate: FavoriteDelegate {
744+ showPhoneLabel: root.showFavoritePhoneLabel
745+ defaultAvatarUrl: favouritesList.defaultAvatarImageUrl
746+ onContactClicked: _fetchContact(index, contact)
747+ }
748+
749 Behavior on height {
750 UbuntuNumberAnimation {}
751 }
752
753=== modified file 'src/imports/Ubuntu/Contacts/ContactSimpleListView.qml'
754--- src/imports/Ubuntu/Contacts/ContactSimpleListView.qml 2013-10-09 18:01:00 +0000
755+++ src/imports/Ubuntu/Contacts/ContactSimpleListView.qml 2013-10-11 00:12:33 +0000
756@@ -80,20 +80,6 @@
757 */
758 property variant titleFields: [ Name.FirstName, Name.LastName ]
759 /*!
760- \qmlproperty int subTitleDetail
761-
762- This property holds the contact detail which will be used to display the contact subtitle in the delegate
763- By default this is set to ContactDetail.Organization
764- */
765- property int subTitleDetail: ContactDetail.Organization
766- /*!
767- \qmlproperty list<int> subTitleFields
768-
769- This property holds the list of all fields which will be used to display the contact subtitle in the delegate
770- By default this is set to [ Organization.Name ]
771- */
772- property variant subTitleFields: [ Organization.Name ]
773- /*!
774 \qmlproperty list<SortOrder> sortOrders
775
776 This property holds a list of sort orders used by the contacts model.
777@@ -129,7 +115,7 @@
778 This property holds the default image url to be used when the current contact does
779 not contains a photo
780 */
781- property string defaultAvatarImageUrl: "image://theme/avatar-default"
782+ property string defaultAvatarImageUrl: Qt.resolvedUrl("./artwork/contact-default.png")
783 /*!
784 \qmlproperty bool loading
785
786@@ -208,6 +194,19 @@
787 }
788 }
789
790+ /*!
791+ private
792+ Fetch contact and emit contact clicked signal
793+ */
794+ function _fetchContact(index, contact)
795+ {
796+ if (priv.currentOperation !== -1) {
797+ return
798+ }
799+ contactListView.currentIndex = index
800+ priv.currentOperation = contactsModel.fetchContacts(contact.contactId)
801+ }
802+
803 clip: true
804 snapMode: ListView.SnapToItem
805 section {
806@@ -217,6 +216,7 @@
807 delegate: ListItem.Header {
808 id: listHeader
809 text: section
810+ height: units.gu(4)
811
812 Rectangle {
813 z: -1
814@@ -250,9 +250,9 @@
815 property bool loaded: false
816 property var contact: model.contact
817 property int _index: index
818- property variant loaderDelegate: loaderDelegate
819 property int delegateHeight: item ? item.implicitHeight : 0
820- property int targetHeight: ((currentContactExpanded == index) && detailToPick != 0) ? delegateHeight : units.gu(10)
821+ property int targetHeight: ((currentContactExpanded == index) && detailToPick != 0) ? delegateHeight : units.gu(6)
822+ property bool detailsShown: false
823
824 source: Qt.resolvedUrl("ContactDelegate.qml")
825 active: true
826@@ -261,6 +261,15 @@
827 visible: loaderDelegate.status == Loader.Ready
828 state: contactListView.expanded ? "" : "collapsed"
829
830+ Connections {
831+ target: contactListView
832+ onCurrentContactExpandedChanged: {
833+ if (index != currentContactExpanded) {
834+ loaderDelegate.detailsShown = false
835+ }
836+ }
837+ }
838+
839 Binding {
840 target: loaderDelegate.item
841 property: "index"
842@@ -270,9 +279,72 @@
843
844 Binding {
845 target: loaderDelegate.item
846- property: "itemDelegate"
847- value: loaderDelegate.loaderDelegate
848- when: (loaderDelegate.status == Loader.Ready)
849+ property: "selected"
850+ value: contactListView.multiSelectionEnabled &&
851+ contactListView.isSelected &&
852+ contactListView.isSelected(loaderDelegate)
853+ when: (loaderDelegate.status == Loader.Ready)
854+ }
855+
856+ Binding {
857+ target: loaderDelegate.item
858+ property: "removable"
859+ value: contactListView &&
860+ contactListView.swipeToDelete &&
861+ !detailsShown &&
862+ !contactListView.isInSelectionMode
863+ when: (loaderDelegate.status == Loader.Ready)
864+ }
865+
866+ Binding {
867+ target: loaderDelegate.item
868+ property: "defaultAvatarUrl"
869+ value: contactListView.defaultAvatarImageUrl
870+ when: (loaderDelegate.status == Loader.Ready)
871+ }
872+
873+ Binding {
874+ target: loaderDelegate.item
875+ property: "detailsShown"
876+ value: loaderDelegate.detailsShown
877+ when: (loaderDelegate.status == Loader.Ready)
878+ }
879+
880+ Binding {
881+ target: loaderDelegate.item
882+ property: "selectMode"
883+ value: contactListView.isInSelectionMode
884+ when: (loaderDelegate.status == Loader.Ready)
885+ }
886+
887+ Connections {
888+ target: loaderDelegate.item
889+ onContactClicked: {
890+ if (contactListView.isInSelectionMode) {
891+ if (!contactListView.selectItem(loaderDelegate)) {
892+ contactListView.deselectItem(loaderDelegate)
893+ }
894+ return
895+ }
896+ if (contactListView.currentContactExpanded == index) {
897+ contactListView.currentContactExpanded = -1
898+ loaderDelegate.detailsShown = false
899+ return
900+ // check if we should expand and display the details picker
901+ } else if (detailToPick !== 0) {
902+ contactListView.currentContactExpanded = index
903+ loaderDelegate.detailsShown = !detailsShown
904+ return
905+ }
906+
907+ contactListView._fetchContact(index, contact)
908+ }
909+ onPressAndHold: {
910+ if (contactListView.multiSelectionEnabled) {
911+ contactListView.startSelection()
912+ contactListView.selectItem(loaderDelegate)
913+ }
914+ }
915 }
916
917 Timer {
918@@ -341,8 +413,14 @@
919 ]
920
921 fetchHint: FetchHint {
922- detailTypesHint: root.showAvatar ? [contactListView.titleDetail, contactListView.subTitleDetail, ContactDetail.DisplayLabel, ContactDetail.Avatar] :
923- [contactListView.titleDetail, contactListView.subTitleDetail, ContactDetail.DisplayLabel]
924+ detailTypesHint: {
925+ var hints = [ contactListView.titleDetail, ContactDetail.Tag, ContactDetail.DisplayLabel ]
926+
927+ if (contactListView.showAvatar) {
928+ hints.push(ContactDetail.Avatar)
929+ }
930+ return hints
931+ }
932 }
933
934 onErrorChanged: {
935
936=== modified file 'src/imports/Ubuntu/Contacts/Contacts.js'
937--- src/imports/Ubuntu/Contacts/Contacts.js 2013-10-05 00:09:51 +0000
938+++ src/imports/Ubuntu/Contacts/Contacts.js 2013-10-11 00:12:33 +0000
939@@ -1,3 +1,6 @@
940+
941+var phoneTypeModel = null
942+
943 // Format contact name to be displayed
944 function formatToDisplay(contact, contactDetail, detailFields, detail) {
945 if (!contact) {
946@@ -24,10 +27,10 @@
947 return values
948 }
949
950-function getAvatar(contact)
951+function getAvatar(contact, defaultValue)
952 {
953 // use this verbose mode to avoid problems with binding loops
954- var avatarUrl = contactListView.defaultAvatarImageUrl
955+ var avatarUrl = defaultValue
956
957 if (!contact) {
958 return avatarUrl
959@@ -42,3 +45,24 @@
960 }
961 return avatarUrl
962 }
963+
964+function getFavoritePhoneLabel(contact, defaultValue)
965+{
966+ var phoneLabel = defaultValue
967+ if (!contact) {
968+ return phoneLabel
969+ }
970+
971+ if (!phoneTypeModel) {
972+ phoneTypeModel = Qt.createQmlObject("import Ubuntu.Contacts 0.1; ContactDetailPhoneNumberTypeModel {}",
973+ parent,
974+ "getFavoritePhoneLabel")
975+
976+ }
977+
978+ var prefDetail = contact.preferredDetail("TEL")
979+ if (prefDetail) {
980+ phoneLabel = phoneTypeModel.get(phoneTypeModel.getTypeIndex(prefDetail)).label
981+ }
982+ return phoneLabel
983+}
984
985=== modified file 'src/imports/Ubuntu/Contacts/DialogButtons.qml'
986--- src/imports/Ubuntu/Contacts/DialogButtons.qml 2013-07-26 18:09:18 +0000
987+++ src/imports/Ubuntu/Contacts/DialogButtons.qml 2013-10-11 00:12:33 +0000
988@@ -40,6 +40,7 @@
989 leftMargin: units.gu(1)
990 verticalCenter: parent.verticalCenter
991 }
992+ color: UbuntuColors.warmGrey
993 onClicked: root.reject()
994 }
995
996
997=== added file 'src/imports/Ubuntu/Contacts/FavoriteDelegate.qml'
998--- src/imports/Ubuntu/Contacts/FavoriteDelegate.qml 1970-01-01 00:00:00 +0000
999+++ src/imports/Ubuntu/Contacts/FavoriteDelegate.qml 2013-10-11 00:12:33 +0000
1000@@ -0,0 +1,112 @@
1001+/*
1002+ * Copyright (C) 2012-2013 Canonical, Ltd.
1003+ *
1004+ * This program is free software; you can redistribute it and/or modify
1005+ * it under the terms of the GNU General Public License as published by
1006+ * the Free Software Foundation; version 3.
1007+ *
1008+ * This program is distributed in the hope that it will be useful,
1009+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
1010+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1011+ * GNU General Public License for more details.
1012+ *
1013+ * You should have received a copy of the GNU General Public License
1014+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
1015+ */
1016+
1017+import QtQuick 2.0
1018+import Ubuntu.Components 0.1
1019+import Ubuntu.Components.ListItems 0.1 as ListItem
1020+import QtContacts 5.0
1021+import "Contacts.js" as ContactsJS
1022+
1023+ListItem.Empty {
1024+ id: favoriteItem
1025+
1026+ property int index: -1
1027+ property bool showAvatar: true
1028+ property string defaultAvatarUrl: ""
1029+ property int titleDetail: ContactDetail.Name
1030+ property variant titleFields: [ Name.FirstName, Name.LastName ]
1031+ property bool showPhoneLabel: true
1032+
1033+ signal contactClicked(var index, var contact)
1034+
1035+ implicitHeight: units.gu(8)
1036+ width: parent ? parent.width : 0
1037+
1038+ Rectangle {
1039+ anchors {
1040+ fill: parent
1041+ bottomMargin: units.dp(1)
1042+ }
1043+ color: UbuntuColors.warmGrey
1044+ opacity: 0.07
1045+ }
1046+
1047+ UbuntuShape {
1048+ id: avatar
1049+
1050+ anchors {
1051+ left: parent.left
1052+ leftMargin: units.gu(2)
1053+ top: parent.top
1054+ topMargin: units.gu(1)
1055+ bottom: parent.bottom
1056+ bottomMargin: units.gu(1)
1057+ }
1058+ width: favoriteItem.showAvatar ? height : 0
1059+ visible: favoriteItem.showAvatar
1060+ radius: "medium"
1061+ image: Image {
1062+ property bool isDefaultAvatar: (source == favoriteItem.defaultAvatarUrl)
1063+
1064+ fillMode: Image.PreserveAspectCrop
1065+ asynchronous: true
1066+ source: ContactsJS.getAvatar(contact, favoriteItem.defaultAvatarUrl)
1067+ sourceSize.width: isDefaultAvatar ? undefined : width * 1.5
1068+ sourceSize.height: isDefaultAvatar ? undefined : height * 1.5
1069+ }
1070+ }
1071+
1072+ Column {
1073+ anchors {
1074+ top: parent.top
1075+ topMargin: units.gu(2)
1076+ left: avatar.right
1077+ leftMargin: units.gu(2)
1078+ right: parent.right
1079+ bottom: parent.bottom
1080+ }
1081+
1082+ Label {
1083+ id: name
1084+
1085+ anchors {
1086+ left: parent.left
1087+ right: parent.right
1088+ }
1089+
1090+ height: favoriteItem.showPhoneLabel ? paintedHeight : paintedHeight * 2
1091+ verticalAlignment: Text.AlignVCenter
1092+ text: ContactsJS.formatToDisplay(contact, favoriteItem.titleDetail, favoriteItem.titleFields)
1093+ fontSize: "medium"
1094+ }
1095+
1096+ Label {
1097+ id: label
1098+
1099+ anchors {
1100+ left: parent.left
1101+ right: parent.right
1102+ }
1103+
1104+ opacity: 0.2
1105+ height: favoriteItem.showPhoneLabel ? paintedHeight : 0
1106+ text: favoriteItem.showPhoneLabel && contact.phoneNumbers ? ContactsJS.getFavoritePhoneLabel(contact, "") : ""
1107+ fontSize: "medium"
1108+ }
1109+ }
1110+
1111+ onClicked: favoriteItem.contactClicked(index, contact)
1112+}
1113
1114=== modified file 'src/imports/Ubuntu/Contacts/MultipleSelectionListView.qml'
1115--- src/imports/Ubuntu/Contacts/MultipleSelectionListView.qml 2013-10-04 19:16:48 +0000
1116+++ src/imports/Ubuntu/Contacts/MultipleSelectionListView.qml 2013-10-11 00:12:33 +0000
1117@@ -148,9 +148,6 @@
1118 item.VisualDataModel.inSelected = false
1119 result = true
1120 }
1121- if (selectedItems.count == 0) {
1122- cancelSelection()
1123- }
1124 return result
1125 }
1126 /*!

Subscribers

People subscribed via source and target branches