@@ -21,6 +21,7 @@ import "../Components"
2121Item {
2222 id: root
2323 property alias expanded: row.expanded
24+ property alias interactive: flickable.interactive
2425 property alias indicatorsModel: row.indicatorsModel
2526 property alias unitProgress: row.unitProgress
2627 property alias enableLateralChanges: row.enableLateralChanges
@@ -43,10 +44,6 @@ Item {
4344 row.setCurrentItemIndex(index);
4445 }
4546
46− function alignIndicators() {
47− alignmentTimer.start();
48− }
49−
5047 function addScrollOffset(scrollAmmout) {
5148 if (scrollAmmout < 0) { // left scroll
5249 if (flickable.contentX < 0) return; // already off the left.
@@ -89,6 +86,23 @@ Item {
8986 Behavior on alignmentAdjustment {
9087 NumberAnimation { duration: UbuntuAnimation.BriskDuration; easing: UbuntuAnimation.StandardEasing}
9188 }
89+
90+ function alignIndicators() {
91+ flickable.resetContentXComponents();
92+
93+ if (expanded && !flickable.moving) {
94+ // gap between left and row?
95+ if (row.width > flickable.width && flickable.contentX < 0) {
96+ d.alignmentAdjustment += flickable.contentX;
97+ // current item overlap on left
98+ } else if (row.currentItem.x < flickable.contentX) {
99+ d.alignmentAdjustment -= (row.currentItem.x - flickable.contentX);
100+ // current item overlap on right
101+ } else if (row.currentItem.x + row.currentItem.width > flickable.contentX + flickable.width) {
102+ d.alignmentAdjustment -= ((row.currentItem.x + row.currentItem.width) - (flickable.contentX + flickable.width));
103+ }
104+ }
105+ }
92106 }
93107
94108 Rectangle {
@@ -113,10 +127,16 @@ Item {
113127
114128 anchors.fill: parent
115129 contentWidth: row.width
116− interactive: root.expanded
130+ interactive: false
117131 // align right + offset from row selection + scrolling
118132 contentX: row.width - flickable.width - d.combinedOffset
119133
134+ // contentX can change by user interaction as well as user offset changes
135+ // This function re-aligns the offsets so that the offsets match the contentX
136+ function resetContentXComponents() {
137+ d.scrollOffset += (flickable.contentX - (row.width - flickable.width - d.combinedOffset));
138+ }
139+
120140 rebound: Transition {
121141 NumberAnimation {
122142 properties: "x"
@@ -150,7 +170,7 @@ Item {
150170 enabled: root.expanded
151171 onClicked: {
152172 row.selectItemAt(mouse.x);
153− alignIndicators();
173+ d.alignIndicators();
154174 }
155175 }
156176 }
@@ -162,11 +182,8 @@ Item {
162182 id: alignmentTimer
163183 interval: UbuntuAnimation.FastDuration // enough for row animation.
164184 repeat: false
165− onTriggered: {
166− if (expanded && !flickable.moving && row.width > flickable.width && flickable.contentX < 0) { // off the left.
167− d.alignmentAdjustment += flickable.contentX;
168− }
169− }
185+
186+ onTriggered: d.alignIndicators();
170187 }
171188
172189 states: [
@@ -178,18 +195,18 @@ Item {
178195 rowOffset: 0
179196 scrollOffset: 0
180197 alignmentAdjustment: 0
198+ combinedOffset: 0
181199 restoreEntryValues: false
182200 }
183201 },
184202 State {
185203 name: "expanded"
186− when: expanded
204+ when: expanded && !interactive
187205
188206 PropertyChanges {
189207 target: d
190208 combinedOffset: rowOffset + alignmentAdjustment - scrollOffset
191209 }
192−
193210 PropertyChanges {
194211 target: d
195212 rowOffset: {
@@ -202,6 +219,25 @@ Item {
202219 restoreEntryValues: false
203220 }
204221 }
222+ , State {
223+ name: "interactive"
224+ when: expanded && interactive
225+
226+ StateChangeScript {
227+ script: {
228+ // don't use row offset anymore.
229+ d.scrollOffset -= d.rowOffset;
230+ d.rowOffset = 0;
231+ d.initialItem = undefined;
232+ alignmentTimer.start();
233+ }
234+ }
235+ PropertyChanges {
236+ target: d
237+ combinedOffset: rowOffset + alignmentAdjustment - scrollOffset
238+ restoreEntryValues: false
239+ }
240+ }
205241 ]
206242
207243 transitions: [