Skip to content

Commit

Permalink
combine useDragEnd, useDraggin, calcSliderValue
Browse files Browse the repository at this point in the history
  • Loading branch information
freddie-nelson committed Apr 6, 2021
1 parent 1a04e6a commit 6215eb2
Show file tree
Hide file tree
Showing 5 changed files with 163 additions and 178 deletions.
17 changes: 0 additions & 17 deletions src/hooks/useDragEnd.ts

This file was deleted.

149 changes: 149 additions & 0 deletions src/hooks/useDragHandler.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
import { Props } from "@/props";
import { Store } from "@/store";
import { SetupContext } from "@vue/runtime-core";

export default function(
store: Store,
props: Props,
emit: SetupContext["emit"],
updateModelValue: (val: number) => void
) {
const calcSliderValue = (mouseX: number, mouseY: number, dragging: boolean): number => {
const rect = store.slider.value.getBoundingClientRect();
let value = 0;

if (props.orientation === "horizontal") {
value = (mouseX - rect.x) / store.pixelsPerStep.value;
} else if (props.orientation === "vertical") {
value = (rect.y + rect.height - mouseY) / store.pixelsPerStep.value;
} else {
const sliderX = mouseX - rect.x;
const sliderY = mouseY - rect.y;
const centerX = rect.width / 2;
const centerY = rect.height / 2;

const gradient = (sliderY - centerY) / (sliderX - centerX);
let angle = (Math.atan(gradient) * 180) / Math.PI;

// correct angle in circle quadrants
// right
if (sliderX >= centerX) {
// top
if (sliderY < centerY) {
if (Math.ceil(angle) === 180) {
angle = 0;
} else {
angle = 90 - Math.abs(angle);
}
} else {
// bottom
angle += 90;
}

// left
} else {
// top
if (sliderY < centerY) {
angle = 270 + angle;
} else {
// bottom
angle = 270 + angle;
}
}

value = angle * (store.sliderRange.value / 360);

// stop value from going to 0 when at max
if (!props.repeat && dragging) {
const diff = Math.abs(angle - store.sliderValueDegrees.value);
if (diff > 30) {
return store.modelValueUnrounded.value;
}
}
}

return value;
};

// dragging handlers
// ------------------------------------------------------------------------
const draggingHandler = (e: MouseEvent | TouchEvent) => {
// check what event has been triggered
let tap;
if (e.type === "mousemove") {
e = <MouseEvent>e;

tap = e;
} else {
e = <TouchEvent>e;
if (e.touches.length > 1) return;

tap = e.touches[0];
}

if (store.holding.value) {
const rect = store.slider.value.getBoundingClientRect();
const tapPosInsideSlider =
props.orientation === "vertical" ? rect.y + rect.height - tap.pageY : tap.pageX - rect.x;

if (
props.orientation === "circular" ||
(tapPosInsideSlider >= 0 && tapPosInsideSlider <= store.sliderWidth.value)
) {
updateModelValue(calcSliderValue(tap.pageX, tap.pageY, true));
}

emit("dragging", store.formattedSliderValue.value, tap);
}
};

const releaseDragHandler = (e: MouseEvent | TouchEvent) => {
if (store.holding.value) store.holding.value = false;

if (e.type === "mouseup") {
window.onmouseup = null;
window.onmousemove = null;
} else {
window.ontouchend = null;
window.ontouchmove = null;
}

emit("drag-end", store.formattedSliderValue.value, e);
};
// ------------------------------------------------------------------------

const clickHandler = (e: MouseEvent | TouchEvent) => {
e.preventDefault();

store.holding.value = true;
emit("drag-start", store.formattedSliderValue.value, e);

if (e.type === "touchstart") {
e = <TouchEvent>e;
if (e.touches.length > 1) return;
const t = e.touches[0];

// do initial slider calculation
updateModelValue(calcSliderValue(t.pageX, t.pageY, false));

// add event listeners
window.addEventListener("touchend", releaseDragHandler);

window.addEventListener("touchmove", draggingHandler);
} else {
e = <MouseEvent>e;

// do initial slider calculation
updateModelValue(calcSliderValue(e.pageX, e.pageY, false));

// add event listeners
window.addEventListener("mouseup", releaseDragHandler);

window.addEventListener("mousemove", draggingHandler);
}
};

return {
clickHandler,
};
}
41 changes: 0 additions & 41 deletions src/hooks/useDragging.ts

This file was deleted.

65 changes: 0 additions & 65 deletions src/utils/calcSliderValue.ts

This file was deleted.

69 changes: 14 additions & 55 deletions src/vue3-slider.vue
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,10 @@ import props from "./props";
import { useStore } from "@/store";
import useDragEnd from "@/hooks/useDragEnd";
import useDragging from "@/hooks/useDragging";
import { useFilledWidthObserver, useTooltipObserver } from "@/hooks/observers";
import useKeyBoardControls from "@/hooks/useKeyboardControls";
import useModelValue from "@/hooks/useModelValue";
import calcSliderValue from "@/utils/calcSliderValue";
import useDragHandler from "@/hooks/useDragHandler";
export default defineComponent({
name: "vue3-slider",
Expand Down Expand Up @@ -39,50 +36,12 @@ export default defineComponent({
emit
);
const { handleFocus } = useKeyBoardControls(store, props, updateModelValue);
// Handle dragging slider
const startSlide = (e: MouseEvent | TouchEvent) => {
e.preventDefault();
store.holding.value = true;
emit("drag-start", store.formattedSliderValue.value, e);
if (e.type === "touchstart") {
e = <TouchEvent>e;
if (e.touches.length > 1) return;
const t = e.touches[0];
// do initial slider calculation
updateModelValue(
calcSliderValue(store, props, t.pageX, t.pageY, false)
);
// add event listeners
window.addEventListener("touchend", (e: TouchEvent) =>
useDragEnd(store, e, emit)
);
window.addEventListener("touchmove", (e: TouchEvent) =>
useDragging(store, props, e, emit, updateModelValue)
);
} else {
e = <MouseEvent>e;
// do initial slider calculation
updateModelValue(
calcSliderValue(store, props, e.pageX, e.pageY, false)
);
// add event listeners
window.addEventListener("mouseup", (e: MouseEvent) =>
useDragEnd(store, e, emit)
);
window.addEventListener("mousemove", (e: MouseEvent) =>
useDragging(store, props, e, emit, updateModelValue)
);
}
};
const { clickHandler } = useDragHandler(
store,
props,
emit,
updateModelValue
);
// Apply hover styles to handle
const hovering = ref(false);
Expand Down Expand Up @@ -187,7 +146,7 @@ export default defineComponent({
filledWidth: store.filledWidth,
slider: store.slider,
holding: store.holding,
startSlide,
clickHandler,
handleFocus,
applyHandleHoverClass,
hovering,
Expand All @@ -212,8 +171,8 @@ export default defineComponent({
class="vue3-slider"
tabindex="0"
ref="slider"
@touchstart="startSlide"
@mousedown="startSlide"
@touchstart="clickHandler"
@mousedown="clickHandler"
@mouseenter="hovering = true"
@mouseleave="hovering = false"
@focus="handleFocus"
Expand Down Expand Up @@ -248,8 +207,8 @@ export default defineComponent({
class="vue3-slider vertical"
tabindex="0"
ref="slider"
@touchstart="startSlide"
@mousedown="startSlide"
@touchstart="clickHandler"
@mousedown="clickHandler"
@mouseenter="hovering = true"
@mouseleave="hovering = false"
@focus="handleFocus"
Expand Down Expand Up @@ -284,8 +243,8 @@ export default defineComponent({
tabindex="0"
ref="slider"
:style="{ ...vars }"
@touchstart="startSlide"
@mousedown="startSlide"
@touchstart="clickHandler"
@mousedown="clickHandler"
@mouseenter="hovering = true"
@mouseleave="hovering = false"
@focus="handleFocus"
Expand Down

0 comments on commit 6215eb2

Please sign in to comment.