Skip to content

Commit f68d38f

Browse files
committed
Prevent thumb container from jumping around.
1 parent aa2b98c commit f68d38f

File tree

1 file changed

+26
-26
lines changed

1 file changed

+26
-26
lines changed

src/components/slide-toggle/slide-toggle.ts

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,10 @@ export class MdSlideToggle implements AfterContentInit, ControlValueAccessor {
5959
private _hasFocus: boolean = false;
6060
private _isMousedown: boolean = false;
6161
private _isInitialized: boolean = false;
62-
private _domRenderer: MdSlideToggleRenderer = null;
62+
private _slideRenderer: MdSlideToggleRenderer = null;
6363

64-
// Drag pointer, which holds information about the current drag.
65-
private _dragPointer: {
64+
// State of the current drag, which holds required variables for the drag.
65+
private _dragState: {
6666
barWidth: number;
6767
percentage?: number;
6868
};
@@ -82,7 +82,7 @@ export class MdSlideToggle implements AfterContentInit, ControlValueAccessor {
8282

8383
constructor(private _elementRef: ElementRef,
8484
private _renderer: Renderer) {
85-
this._domRenderer = new MdSlideToggleRenderer(this._elementRef);
85+
this._slideRenderer = new MdSlideToggleRenderer(this._elementRef);
8686
}
8787

8888
/** TODO: internal */
@@ -105,7 +105,7 @@ export class MdSlideToggle implements AfterContentInit, ControlValueAccessor {
105105
event.stopPropagation();
106106

107107
// Once a drag is currently in progress, we do not want to toggle the slide-toggle on a click.
108-
if (!this.disabled && !this._dragPointer) {
108+
if (!this.disabled && !this._dragState) {
109109
this.toggle();
110110
}
111111
}
@@ -221,55 +221,55 @@ export class MdSlideToggle implements AfterContentInit, ControlValueAccessor {
221221
}
222222

223223

224-
/** @internal */
224+
/** TODO: internal */
225225
_onDragStart() {
226-
if (this._dragPointer) {
226+
if (this._dragState) {
227227
return;
228228
}
229229

230-
let thumbBarRect = this._domRenderer.getThumbBarClientRect();
231-
let thumbRect = this._domRenderer.getThumbClientRect();
230+
let thumbBarRect = this._slideRenderer.getThumbBarClientRect();
231+
let thumbRect = this._slideRenderer.getThumbClientRect();
232232

233-
this._dragPointer = {
233+
this._dragState = {
234234
barWidth: thumbBarRect.width - thumbRect.width
235235
};
236236

237-
this._domRenderer.toggleDragging(true);
237+
this._slideRenderer.toggleDragging(true);
238238
}
239239

240-
/** @internal */
240+
/** TODO: internal */
241241
_onDrag(event: HammerInput) {
242-
if (!this._dragPointer) {
242+
if (!this._dragState) {
243243
return;
244244
}
245245

246-
let barWidth = this._dragPointer.barWidth;
247-
let distance = Math.max(-barWidth, Math.min(event.deltaX, barWidth));
248-
249-
let percentage = (distance / barWidth) * 100;
246+
let percentage = (event.deltaX / this._dragState.barWidth) * 100;
250247

251-
if (percentage < 0) {
248+
// When the slide-toggle was initially checked, then we have to start the drag at 100%
249+
if (this.checked) {
252250
percentage += 100;
253251
}
254252

255-
this._domRenderer.updateThumbPosition(percentage);
256-
this._dragPointer.percentage = percentage;
253+
percentage = Math.max(0, Math.min(percentage, 100));
254+
255+
this._slideRenderer.updateThumbPosition(percentage);
256+
this._dragState.percentage = percentage;
257257
}
258258

259-
/** @internal */
259+
/** TODO: internal */
260260
_onDragEnd() {
261-
if (!this._dragPointer) {
261+
if (!this._dragState) {
262262
return;
263263
}
264264

265-
this.checked = this._dragPointer.percentage > 50;
265+
this.checked = this._dragState.percentage > 50;
266266

267-
this._domRenderer.updateThumbPosition(null);
268-
this._domRenderer.toggleDragging(false);
267+
this._slideRenderer.updateThumbPosition(null);
268+
this._slideRenderer.toggleDragging(false);
269269

270270
// We have to clear the drag after one tick, because otherwise
271271
// the click event will fire and toggle the slide-toggle again.
272-
setTimeout(() => { this._dragPointer = null; }, 0);
272+
setTimeout(() => { this._dragState = null; }, 0);
273273
}
274274

275275
}

0 commit comments

Comments
 (0)