on xenial help sign in
[indicators] Fix positioning on panel resize.

Approved by: Daniel d'Andrada

commitd92457bc50b3c33cc22a2674a364fdcc92365257 authorGerry Boland <gerry.boland@canonical.com> dateThu 11 Dec 2014, 13:23 (12 years ago) parent36fcbc920f4269
2 files changed+55−21
qml/Panel/IndicatorsBar.qml+29−20 tests/qmltests/Panel/tst_IndicatorsBar.qml+26−1
qml/Panel/IndicatorsBar.qml+29−20
@@ -46,13 +46,14 @@ Item {
4646
4747 function addScrollOffset(scrollAmmout) {
4848 if (scrollAmmout < 0) { // left scroll
49− if (flickable.contentX < 0) return; // already off the left.
50− if (flickable.contentX + scrollAmmout < 0) scrollAmmout = -flickable.contentX; // going to be off the left
51− } else { // right scroll
52− if (flickable.contentX + flickable.width > row.width) return; // already off the right.
53− if (flickable.contentX + flickable.width + scrollAmmout > row.width) { // going to be off the right
54− scrollAmmout = row.width - (flickable.contentX + flickable.width);
49+ if (flickable.contentX + flickable.width > row.width) return; // already off the left.
50+
51+ if (flickable.contentX + flickable.width - scrollAmmout > row.width) { // going to be off the right
52+ scrollAmmout = (flickable.contentX + flickable.width) - row.width;
5553 }
54+ } else { // right scroll
55+ if (flickable.contentX < 0) return; // already off the right.
56+ if (flickable.contentX - scrollAmmout < 0) scrollAmmout = flickable.contentX; // going to be off the right
5657 }
5758 d.scrollOffset = d.scrollOffset + scrollAmmout;
5859 }
@@ -91,24 +92,26 @@ Item {
9192 flickable.resetContentXComponents();
9293
9394 if (expanded && !flickable.moving) {
94−
9595 // gap between left and row?
96− if (flickable.contentX < 0) {
97− d.alignmentAdjustment += flickable.contentX;
98− // gap between right and row?
99− } else if (flickable.contentX + flickable.width > row.width) {
96+ if (flickable.contentX + flickable.width > row.width) {
10097 // row width is less than flickable
10198 if (row.width < flickable.width) {
102− d.alignmentAdjustment += flickable.contentX;
99+ d.alignmentAdjustment -= flickable.contentX;
103100 } else {
104− d.alignmentAdjustment += ((flickable.contentX + flickable.width) - row.width);
101+ d.alignmentAdjustment -= ((flickable.contentX + flickable.width) - row.width);
105102 }
103+
104+ // gap between right and row?
105+ } else if (flickable.contentX < 0) {
106+ d.alignmentAdjustment -= flickable.contentX;
107+
106108 // current item overlap on left
107− } else if (row.currentItem && row.currentItem.x < flickable.contentX) {
108− d.alignmentAdjustment -= (row.currentItem.x - flickable.contentX);
109+ } else if (row.currentItem && (flickable.contentX + flickable.width) < (row.width - row.currentItem.x)) {
110+ d.alignmentAdjustment += ((row.width - row.currentItem.x) - (flickable.contentX + flickable.width));
111+
109112 // current item overlap on right
110− } else if (row.currentItem && row.currentItem.x + row.currentItem.width > flickable.contentX + flickable.width) {
111− d.alignmentAdjustment -= ((row.currentItem.x + row.currentItem.width) - (flickable.contentX + flickable.width));
113+ } else if (row.currentItem && flickable.contentX > (row.width - row.currentItem.x - row.currentItem.width)) {
114+ d.alignmentAdjustment -= flickable.contentX - (row.width - row.currentItem.x - row.currentItem.width);
112115 }
113116 }
114117 }
@@ -134,16 +137,19 @@ Item {
134137 id: flickable
135138 objectName: "flickable"
136139
140+ // we rotate it because we want the Flickable to align its content item
141+ // on the right instead of on the left
142+ rotation: 180
143+
137144 anchors.fill: parent
138145 contentWidth: row.width
146+ contentX: d.combinedOffset
139147 interactive: false
140− // align right + offset from row selection + scrolling
141− contentX: row.width - flickable.width - d.combinedOffset
142148
143149 // contentX can change by user interaction as well as user offset changes
144150 // This function re-aligns the offsets so that the offsets match the contentX
145151 function resetContentXComponents() {
146− d.scrollOffset += (flickable.contentX - (row.width - flickable.width - d.combinedOffset));
152+ d.scrollOffset += d.combinedOffset - flickable.contentX;
147153 }
148154
149155 rebound: Transition {
@@ -162,6 +168,9 @@ Item {
162168 bottom: parent.bottom
163169 }
164170
171+ // Compensate for the Flickable rotation (ie, counter-rotate)
172+ rotation: 180
173+
165174 lateralPosition: {
166175 if (root.lateralPosition == -1) return -1;
167176
tests/qmltests/Panel/tst_IndicatorsBar.qml+26−1
@@ -46,7 +46,7 @@ IndicatorTest {
4646 IndicatorsBar {
4747 id: indicatorsBar
4848 height: expanded ? units.gu(7) : units.gu(3)
49− width: units.gu(30)
49+ width: units.gu(widthSlider.value)
5050 anchors.centerIn: parent
5151 indicatorsModel: root.indicatorsModel
5252 interactive: expanded && height === units.gu(7)
@@ -79,6 +79,14 @@ IndicatorTest {
7979 onClicked: indicatorsBar.expanded = !indicatorsBar.expanded
8080 }
8181
82+ Slider {
83+ id: widthSlider
84+ Layout.fillWidth: true
85+ minimumValue: 10
86+ maximumValue: 60
87+ value: 30
88+ }
89+
8290 Rectangle {
8391 Layout.preferredHeight: units.dp(1);
8492 Layout.fillWidth: true;
@@ -114,6 +122,7 @@ IndicatorTest {
114122 when: windowShown
115123
116124 function init() {
125+ widthSlider.value = 30;
117126 indicatorsBar.expanded = false;
118127 wait_for_expansion_to_settle();
119128 }
@@ -220,5 +229,21 @@ IndicatorTest {
220229 tryCompareFunction(function() { return dataItem.width > 0.0; }, true);
221230 }
222231 }
232+
233+ // Rough test that resizing the IndicatorsBar has the items reposition correctly
234+ function test_widthChangeRepositionsItems() {
235+ var lastItemIndex = root.originalModelData.length-1;
236+ var dataItem = findChild(indicatorsBar, root.originalModelData[lastItemIndex]["identifier"] + "-panelItem");
237+ verify(dataItem !== null);
238+
239+ var mappedPosition = indicatorsBar.mapFromItem(dataItem, dataItem.width/2, dataItem.height/2);
240+ var oldDistanceFromRightEdge = indicatorsBar.width - mappedPosition.x;
241+
242+ widthSlider.value = 50;
243+ mappedPosition = indicatorsBar.mapFromItem(dataItem, dataItem.width/2, dataItem.height/2);
244+ var newDistanceFromRightEdge = indicatorsBar.width - mappedPosition.x;
245+
246+ compare(newDistanceFromRightEdge, oldDistanceFromRightEdge);
247+ }
223248 }
224249}