Merge lp:~fboucault/ubuntu-ui-toolkit/list_item_swipe_position into lp:ubuntu-ui-toolkit/staging

Proposed by Florian Boucault
Status: Needs review
Proposed branch: lp:~fboucault/ubuntu-ui-toolkit/list_item_swipe_position
Merge into: lp:ubuntu-ui-toolkit/staging
Diff against target: 277 lines (+108/-20)
5 files modified
components.api (+1/-0)
src/UbuntuToolkit/uclistitem.cpp (+54/-0)
src/UbuntuToolkit/uclistitem_p.h (+4/-0)
tests/unit/visual/tst_listitem.13.qml (+21/-8)
tests/unit/visual/tst_listitem_extras.13.qml (+28/-12)
To merge this branch: bzr merge lp:~fboucault/ubuntu-ui-toolkit/list_item_swipe_position
Reviewer Review Type Date Requested Status
ubuntu-sdk-build-bot continuous-integration Needs Fixing
Zsombor Egri Approve
Review via email: mp+308495@code.launchpad.net

Commit message

Added new property to ListItem: real swipePosition

Description of the change

Added new property to ListItem: real swipePosition

To post a comment you must log in.
Revision history for this message
ubuntu-sdk-build-bot (ubuntu-sdk-build-bot) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
ubuntu-sdk-build-bot (ubuntu-sdk-build-bot) wrote :
review: Approve (continuous-integration)
Revision history for this message
ubuntu-sdk-build-bot (ubuntu-sdk-build-bot) wrote :
review: Approve (continuous-integration)
Revision history for this message
ubuntu-sdk-build-bot (ubuntu-sdk-build-bot) wrote :
review: Approve (continuous-integration)
Revision history for this message
ubuntu-sdk-build-bot (ubuntu-sdk-build-bot) wrote :
review: Approve (continuous-integration)
Revision history for this message
ubuntu-sdk-build-bot (ubuntu-sdk-build-bot) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Zsombor Egri (zsombi) wrote :

Looks good, krillin is again OoO :/ Hopefully autolanding will get it.

review: Approve
Revision history for this message
ubuntu-sdk-build-bot (ubuntu-sdk-build-bot) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
ubuntu-sdk-build-bot (ubuntu-sdk-build-bot) wrote :
review: Approve (continuous-integration)
Revision history for this message
ubuntu-sdk-build-bot (ubuntu-sdk-build-bot) wrote :
review: Approve (continuous-integration)
Revision history for this message
ubuntu-sdk-build-bot (ubuntu-sdk-build-bot) wrote :
review: Approve (continuous-integration)
Revision history for this message
ubuntu-sdk-build-bot (ubuntu-sdk-build-bot) wrote :
review: Approve (continuous-integration)
Revision history for this message
ubuntu-sdk-build-bot (ubuntu-sdk-build-bot) wrote :
review: Needs Fixing (continuous-integration)

Unmerged revisions

2144. By Florian Boucault

Fix some unit tests

2143. By Florian Boucault

Added basic unit tests for ListItem.swipePosition

2142. By Florian Boucault

Added more unit tests for ListItem.swipePosition

2141. By Florian Boucault

Added new property to API

2140. By Florian Boucault

Preliminary implementation of ListItem::swipePosition

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'components.api'
--- components.api 2016-09-17 05:48:25 +0000
+++ components.api 2016-10-14 12:12:03 +0000
@@ -612,6 +612,7 @@
612 property bool selectMode612 property bool selectMode
613 property bool selected613 property bool selected
614 property bool swipeEnabled 1.3614 property bool swipeEnabled 1.3
615 property double swipePosition 1.3
615 readonly property bool swiped 1.3616 readonly property bool swiped 1.3
616 property ListItemActions trailingActions617 property ListItemActions trailingActions
617Ubuntu.Components.ListItemActions 1.2 UCListItemActions: QtObject618Ubuntu.Components.ListItemActions 1.2 UCListItemActions: QtObject
618619
=== modified file 'src/UbuntuToolkit/uclistitem.cpp'
--- src/UbuntuToolkit/uclistitem.cpp 2016-09-20 06:24:44 +0000
+++ src/UbuntuToolkit/uclistitem.cpp 2016-10-14 12:12:03 +0000
@@ -509,6 +509,8 @@
509 if (event.m_contentPos != contentItem->position()) {509 if (event.m_contentPos != contentItem->position()) {
510 contentItem->setPosition(event.m_contentPos);510 contentItem->setPosition(event.m_contentPos);
511 lastPos = localPos;511 lastPos = localPos;
512 Q_Q(UCListItem);
513 q->swipePositionChanged();
512 if (status == UCSwipeEvent::Updated) {514 if (status == UCSwipeEvent::Updated) {
513 setContentMoving(true);515 setContentMoving(true);
514 setSwiped(true);516 setSwiped(true);
@@ -2009,6 +2011,58 @@
2009}2011}
20102012
2011/*!2013/*!
2014 * \qmlproperty bool ListItem::swipePosition
2015 * \since Ubuntu.Components 1.3
2016 * The property controls the swiping of the leading- or trailing actions. This
2017 * is useful when swiping needs to be triggered programatically, for example
2018 * when demonstrating that actions are present and can be swiped.
2019 * \qml
2020 * import QtQuick 2.4
2021 * import Ubuntu.Components 1.3
2022 *
2023 * ListItem {
2024 * id: listItem
2025 *
2026 * leadingActions: ListItemActions {
2027 * actions: [
2028 * Action {
2029 * iconName: "delete"
2030 * }
2031 * ]
2032 * }
2033 *
2034 * UbuntuNumberAnimation {
2035 * target: listItem
2036 * property: "swipePosition"
2037 * to: units.gu(8)
2038 * }
2039 * }
2040 * \endqml
2041 */
2042qreal UCListItem::swipePosition() const
2043{
2044 Q_D(const UCListItem);
2045 return d->contentItem->position().x();
2046}
2047void UCListItem::setSwipePosition(qreal swipePosition)
2048{
2049 Q_D(UCListItem);
2050 if (!d->leadingActions || !d->trailingActions) {
2051 return;
2052 }
2053 if (d->contentItem->position().x() == swipePosition) {
2054 return;
2055 }
2056
2057 d->setSwiped(true);
2058 d->lockContentItem(false);
2059 d->loadStyleItem();
2060 d->lastPos = QPointF(0.0, 0.0);
2061 QPointF localPos(swipePosition, 0.0);
2062 d->swipeEvent(localPos, UCSwipeEvent::Updated);
2063}
2064
2065/*!
2012 * \qmlproperty bool ListItem::swiped2066 * \qmlproperty bool ListItem::swiped
2013 * \readonly2067 * \readonly
2014 * \since Ubuntu.Components 1.32068 * \since Ubuntu.Components 1.3
20152069
=== modified file 'src/UbuntuToolkit/uclistitem_p.h'
--- src/UbuntuToolkit/uclistitem_p.h 2016-09-16 05:01:13 +0000
+++ src/UbuntuToolkit/uclistitem_p.h 2016-10-14 12:12:03 +0000
@@ -66,6 +66,7 @@
66#endif66#endif
67 Q_PROPERTY(bool swipeEnabled READ isSwipeEnabled WRITE setSwipeEnabled NOTIFY swipeEnabledChanged FINAL REVISION 1)67 Q_PROPERTY(bool swipeEnabled READ isSwipeEnabled WRITE setSwipeEnabled NOTIFY swipeEnabledChanged FINAL REVISION 1)
68 Q_PROPERTY(bool swiped READ isSwiped NOTIFY swipedChanged FINAL REVISION 1)68 Q_PROPERTY(bool swiped READ isSwiped NOTIFY swipedChanged FINAL REVISION 1)
69 Q_PROPERTY(qreal swipePosition READ swipePosition WRITE setSwipePosition NOTIFY swipePositionChanged FINAL REVISION 1)
69public:70public:
70 explicit UCListItem(QQuickItem *parent = 0);71 explicit UCListItem(QQuickItem *parent = 0);
71 ~UCListItem();72 ~UCListItem();
@@ -89,6 +90,8 @@
89 UCListItemExpansion *expansion();90 UCListItemExpansion *expansion();
90 bool isSwipeEnabled() const;91 bool isSwipeEnabled() const;
91 void setSwipeEnabled(bool swipeEnabled);92 void setSwipeEnabled(bool swipeEnabled);
93 qreal swipePosition() const;
94 void setSwipePosition(qreal swipePosition);
92 bool isSwiped();95 bool isSwiped();
9396
94protected:97protected:
@@ -123,6 +126,7 @@
123 void listItemChildrenChanged();126 void listItemChildrenChanged();
124 Q_REVISION(1) void swipeEnabledChanged();127 Q_REVISION(1) void swipeEnabledChanged();
125 Q_REVISION(1) void swipedChanged();128 Q_REVISION(1) void swipedChanged();
129 Q_REVISION(1) void swipePositionChanged();
126130
127 void clicked();131 void clicked();
128 void pressAndHold();132 void pressAndHold();
129133
=== modified file 'tests/unit/visual/tst_listitem.13.qml'
--- tests/unit/visual/tst_listitem.13.qml 2016-10-06 11:22:26 +0000
+++ tests/unit/visual/tst_listitem.13.qml 2016-10-14 12:12:03 +0000
@@ -263,6 +263,7 @@
263 compare(defaults.__styleInstance, null, "__styleInstance must be null.");263 compare(defaults.__styleInstance, null, "__styleInstance must be null.");
264 compare(defaults.selected, false, "Not selected by default");264 compare(defaults.selected, false, "Not selected by default");
265 compare(defaults.selectMode, false, "Not selectable by default");265 compare(defaults.selectMode, false, "Not selectable by default");
266 compare(defaults.swipePosition, 0, "swipePosition must be 0 by default");
266 compare(testColumn.ViewItems.selectMode, false, "The parent attached property is not selectable by default");267 compare(testColumn.ViewItems.selectMode, false, "The parent attached property is not selectable by default");
267 compare(testColumn.ViewItems.selectedIndices.length, 0, "No item is selected by default");268 compare(testColumn.ViewItems.selectedIndices.length, 0, "No item is selected by default");
268 compare(listView.ViewItems.dragMode, false, "Drag mode is off on ListView");269 compare(listView.ViewItems.dragMode, false, "Drag mode is off on ListView");
@@ -423,16 +424,20 @@
423 function test_tug_actions_data() {424 function test_tug_actions_data() {
424 var item = findChild(listView, "listItem0");425 var item = findChild(listView, "listItem0");
425 return [426 return [
426 {tag: "Trailing, mouse", item: item, pos: centerOf(item), dx: -units.gu(20), positiveDirection: false, mouse: true},427 {tag: "Trailing, mouse", item: item, pos: centerOf(item), dx: -units.gu(20), positiveDirection: false, mouse: true, swipePosition: false},
427 {tag: "Leading, mouse", item: item, pos: centerOf(item), dx: units.gu(20), positiveDirection: true, mouse: true},428 {tag: "Leading, mouse", item: item, pos: centerOf(item), dx: units.gu(20), positiveDirection: true, mouse: true, swipePosition: false},
428 {tag: "Trailing, touch", item: item, pos: centerOf(item), dx: -units.gu(20), positiveDirection: false, mouse: false},429 {tag: "Trailing, touch", item: item, pos: centerOf(item), dx: -units.gu(20), positiveDirection: false, mouse: false, swipePosition: false},
429 {tag: "Leading, touch", item: item, pos: centerOf(item), dx: units.gu(20), positiveDirection: true, mouse: false},430 {tag: "Leading, touch", item: item, pos: centerOf(item), dx: units.gu(20), positiveDirection: true, mouse: false, swipePosition: false},
431 {tag: "Trailing, swipePosition", item: item, pos: centerOf(item), dx: -units.gu(20), positiveDirection: false, mouse: false, swipePosition: true},
432 {tag: "Leading, swipePosition", item: item, pos: centerOf(item), dx: units.gu(20), positiveDirection: true, mouse: false, swipePosition: true},
430 ];433 ];
431 }434 }
432 function test_tug_actions(data) {435 function test_tug_actions(data) {
433 listView.positionViewAtBeginning();436 listView.positionViewAtBeginning();
434 if (data.mouse) {437 if (data.mouse) {
435 swipe(data.item, data.pos.x, data.pos.y, data.dx, 0);438 swipe(data.item, data.pos.x, data.pos.y, data.dx, 0);
439 } else if (data.swipePosition) {
440 data.item.swipePosition = data.dx;
436 } else {441 } else {
437 tug(data.item, data.pos.x, data.pos.y, data.dx, 0);442 tug(data.item, data.pos.x, data.pos.y, data.dx, 0);
438 }443 }
@@ -458,16 +463,20 @@
458 var item0 = findChild(listView, "listItem0");463 var item0 = findChild(listView, "listItem0");
459 var item1 = findChild(listView, "listItem1");464 var item1 = findChild(listView, "listItem1");
460 return [465 return [
461 {tag: "Click on an other Item", item: item0, pos: centerOf(item0), dx: -units.gu(20), clickOn: item1, mouse: true},466 {tag: "Click on an other Item", item: item0, pos: centerOf(item0), dx: -units.gu(20), clickOn: item1, mouse: true, swipePosition: false},
462 {tag: "Click on the same Item", item: item0, pos: centerOf(item0), dx: -units.gu(20), clickOn: item0, mouse: true},467 {tag: "Click on the same Item", item: item0, pos: centerOf(item0), dx: -units.gu(20), clickOn: item0, mouse: true, swipePosition: false},
463 {tag: "Tap on an other Item", item: item0, pos: centerOf(item0), dx: -units.gu(20), clickOn: item1, mouse: false},468 {tag: "Tap on an other Item", item: item0, pos: centerOf(item0), dx: -units.gu(20), clickOn: item1, mouse: false, swipePosition: false},
464 {tag: "Tap on the same Item", item: item0, pos: centerOf(item0), dx: -units.gu(20), clickOn: item0, mouse: false},469 {tag: "Tap on the same Item", item: item0, pos: centerOf(item0), dx: -units.gu(20), clickOn: item0, mouse: false, swipePosition: false},
470 {tag: "Set swipePosition then click on an other Item", item: item0, pos: centerOf(item0), dx: -units.gu(20), clickOn: item1, mouse: false, swipePosition: true},
471 {tag: "Set swipePosition then click on the same Item", item: item0, pos: centerOf(item0), dx: -units.gu(20), clickOn: item0, mouse: false, swipePosition: true},
465 ];472 ];
466 }473 }
467 function test_rebound_when_pressed_outside_or_clicked(data) {474 function test_rebound_when_pressed_outside_or_clicked(data) {
468 listView.positionViewAtBeginning();475 listView.positionViewAtBeginning();
469 if (data.mouse) {476 if (data.mouse) {
470 swipe(data.item, data.pos.x, data.pos.y, data.dx, 0);477 swipe(data.item, data.pos.x, data.pos.y, data.dx, 0);
478 } else if (data.swipePosition) {
479 data.item.swipePosition = data.dx;
471 } else {480 } else {
472 tug(data.item, data.pos.x, data.pos.y, data.dx, 0);481 tug(data.item, data.pos.x, data.pos.y, data.dx, 0);
473 }482 }
@@ -484,6 +493,8 @@
484 {tag: "Leading", item: item0, pos: centerOf(item0), dx: units.gu(20), clickOn: item0.contentItem, mouse: true},493 {tag: "Leading", item: item0, pos: centerOf(item0), dx: units.gu(20), clickOn: item0.contentItem, mouse: true},
485 {tag: "Trailing", item: item0, pos: centerOf(item0), dx: -units.gu(20), clickOn: item1, mouse: false},494 {tag: "Trailing", item: item0, pos: centerOf(item0), dx: -units.gu(20), clickOn: item1, mouse: false},
486 {tag: "Leading", item: item0, pos: centerOf(item0), dx: units.gu(20), clickOn: item0.contentItem, mouse: false},495 {tag: "Leading", item: item0, pos: centerOf(item0), dx: units.gu(20), clickOn: item0.contentItem, mouse: false},
496 {tag: "Trailing, swipePosition", item: item0, pos: centerOf(item0), dx: -units.gu(10), clickOn: item1, mouse: false, swipePosition: true},
497 {tag: "Leading, swipePosition", item: item0, pos: centerOf(item0), dx: units.gu(10), clickOn: item0.contentItem, mouse: false, swipePosition: true},
487 ];498 ];
488 }499 }
489 function test_listview_not_interactive_while_tugged(data) {500 function test_listview_not_interactive_while_tugged(data) {
@@ -492,6 +503,8 @@
492 compare(listView.interactive, true, "ListView is not interactive");503 compare(listView.interactive, true, "ListView is not interactive");
493 if (data.mouse) {504 if (data.mouse) {
494 swipe(data.item, data.pos.x, data.pos.y, data.dx, units.gu(5));505 swipe(data.item, data.pos.x, data.pos.y, data.dx, units.gu(5));
506 } else if (data.swipePosition) {
507 data.item.swipePosition = data.dx;
495 } else {508 } else {
496 tug(data.item, data.pos.x, data.pos.y, data.dx, units.gu(5));509 tug(data.item, data.pos.x, data.pos.y, data.dx, units.gu(5));
497 }510 }
498511
=== modified file 'tests/unit/visual/tst_listitem_extras.13.qml'
--- tests/unit/visual/tst_listitem_extras.13.qml 2016-06-15 13:46:51 +0000
+++ tests/unit/visual/tst_listitem_extras.13.qml 2016-10-14 12:12:03 +0000
@@ -215,17 +215,25 @@
215215
216 function test_button_inactive_while_swiped_data() {216 function test_button_inactive_while_swiped_data() {
217 return [217 return [
218 {tag: "mouse", touch: false, dx: units.gu(20)},218 {tag: "mouse", touch: false, swipePosition: false, dx: units.gu(20)},
219 {tag: "touch", touch: true, dx: units.gu(20)},219 {tag: "touch", touch: true, swipePosition: false, dx: units.gu(20)},
220 {tag: "swipePosition", touch: false, swipePosition: true, dx: units.gu(20)},
221 {tag: "swipePosition", touch: true, swipePosition: true, dx: units.gu(20)},
220 ];222 ];
221 }223 }
222 function test_button_inactive_while_swiped(data) {224 function test_button_inactive_while_swiped(data) {
223 clickSpy.target = activeItem;225 clickSpy.target = activeItem;
226 if (data.swipePosition) {
227 testWithActiveItem.swipePosition = data.dx;
228 } else if (data.touch) {
229 tug(testWithActiveItem, centerOf(testWithActiveItem).x, centerOf(testWithActiveItem).y, data.dx, 0);
230 } else {
231 swipe(testWithActiveItem, centerOf(testWithActiveItem).x, centerOf(testWithActiveItem).y, data.dx, 0);
232 }
233
224 if (data.touch) {234 if (data.touch) {
225 tug(testWithActiveItem, centerOf(testWithActiveItem).x, centerOf(testWithActiveItem).y, data.dx, 0);
226 TestExtras.touchClick(0, activeItem, centerOf(activeItem));235 TestExtras.touchClick(0, activeItem, centerOf(activeItem));
227 } else {236 } else {
228 swipe(testWithActiveItem, centerOf(testWithActiveItem).x, centerOf(testWithActiveItem).y, data.dx, 0);
229 mouseClick(activeItem, centerOf(activeItem).x, centerOf(activeItem).y);237 mouseClick(activeItem, centerOf(activeItem).x, centerOf(activeItem).y);
230 }238 }
231 expectFail(data.tag, "Button is inactive while swiped");239 expectFail(data.tag, "Button is inactive while swiped");
@@ -271,16 +279,20 @@
271279
272 function test_swipe_on_empty_actions_bug1500416_data() {280 function test_swipe_on_empty_actions_bug1500416_data() {
273 return [281 return [
274 {tag: "swipe leading, touch", item: emptyActionList, dx: units.gu(5), touch: true},282 {tag: "swipe leading, touch", item: emptyActionList, dx: units.gu(5), touch: true, swipePosition: false},
275 {tag: "swipe trailing, touch", item: emptyActionList, dx: -units.gu(5), touch: true},283 {tag: "swipe trailing, touch", item: emptyActionList, dx: -units.gu(5), touch: true, swipePosition: false},
276 {tag: "swipe leading, mouse", item: emptyActionList, dx: units.gu(5), touch: false},284 {tag: "swipe leading, mouse", item: emptyActionList, dx: units.gu(5), touch: false, swipePosition: false},
277 {tag: "swipe trailing, mouse", item: emptyActionList, dx: -units.gu(5), touch: false}285 {tag: "swipe trailing, mouse", item: emptyActionList, dx: -units.gu(5), touch: false, swipePosition: false},
286 {tag: "swipe leading, swipePosition", item: emptyActionList, dx: units.gu(5), touch: false, swipePosition: true},
287 {tag: "swipe trailing, swipePosition", item: emptyActionList, dx: -units.gu(5), touch: false, swipePosition: true}
278 ];288 ];
279 }289 }
280 function test_swipe_on_empty_actions_bug1500416(data) {290 function test_swipe_on_empty_actions_bug1500416(data) {
281 setupSpy(data.item, "contentMovementEnded");291 setupSpy(data.item, "contentMovementEnded");
282 if (data.touch) {292 if (data.touch) {
283 tugNoWait(data.item, centerOf(data.item).x, centerOf(data.item).y, data.dx, 0);293 tugNoWait(data.item, centerOf(data.item).x, centerOf(data.item).y, data.dx, 0);
294 } else if (data.swipePosition) {
295 data.item.swipePosition = data.dx;
284 } else {296 } else {
285 swipeNoWait(data.item, centerOf(data.item).x, centerOf(data.item).y, data.dx, 0);297 swipeNoWait(data.item, centerOf(data.item).x, centerOf(data.item).y, data.dx, 0);
286 }298 }
@@ -291,10 +303,12 @@
291 function test_swipe_not_possible_when_swipe_disabled_data() {303 function test_swipe_not_possible_when_swipe_disabled_data() {
292 listView.positionViewAtBeginning();304 listView.positionViewAtBeginning();
293 return [305 return [
294 {tag: "leading, touch", item: findChild(listView, "listItem0"), dx: units.gu(10), touch: true},306 {tag: "leading, touch", item: findChild(listView, "listItem0"), dx: units.gu(10), touch: true, swipePosition: false},
295 {tag: "trailing, touch", item: findChild(listView, "listItem0"), dx: -units.gu(10), touch: true},307 {tag: "trailing, touch", item: findChild(listView, "listItem0"), dx: -units.gu(10), touch: true, swipePosition: false},
296 {tag: "leading, mouse", item: findChild(listView, "listItem0"), dx: units.gu(10), touch: false},308 {tag: "leading, mouse", item: findChild(listView, "listItem0"), dx: units.gu(10), touch: false, swipePosition: false},
297 {tag: "trailing, mouse", item: findChild(listView, "listItem0"), dx: -units.gu(10), touch: false},309 {tag: "trailing, mouse", item: findChild(listView, "listItem0"), dx: -units.gu(10), touch: false, swipePosition: false},
310 {tag: "leading, swipePosition", item: findChild(listView, "listItem0"), dx: units.gu(10), touch: false, swipePosition: true},
311 {tag: "trailing, swipePosition", item: findChild(listView, "listItem0"), dx: -units.gu(10), touch: false, swipePosition: true},
298 ];312 ];
299 }313 }
300 function test_swipe_not_possible_when_swipe_disabled(data) {314 function test_swipe_not_possible_when_swipe_disabled(data) {
@@ -303,6 +317,8 @@
303 setupSpy(data.item, "contentMovementEnded");317 setupSpy(data.item, "contentMovementEnded");
304 if (data.touch) {318 if (data.touch) {
305 tugNoWait(data.item, centerOf(data.item).x, centerOf(data.item).y, data.dx, 0);319 tugNoWait(data.item, centerOf(data.item).x, centerOf(data.item).y, data.dx, 0);
320 } else if (data.swipePosition) {
321 data.item.swipePosition = data.dx;
306 } else {322 } else {
307 swipeNoWait(data.item, centerOf(data.item).x, centerOf(data.item).y, data.dx, 0);323 swipeNoWait(data.item, centerOf(data.item).x, centerOf(data.item).y, data.dx, 0);
308 }324 }

Subscribers

People subscribed via source and target branches