//---Dragabble Helper Funcs--------------------------------------
-// Update xShort or yShort value.
+// Calculate distance to nearest side.
+// Could be enhanced to take into account side.
+
+
function calcSideProximity (elementX: number, winW: number) {
- let short = winW - elementX
- if (short > winW / 2) {
- short = elementX
+ // Calc right short.
+ let short = winW - elementX - 40;
+
+ // See if it's left short.
+ if (elementX + 20 < winW / 2) {
+ short = elementX
+ }
+
+ return short
+}
+
+
+function calcPositionXDrag (elementId: string, short: number, mouse: number) {
+ let elementPosition = 0;
+ const element = document.getElementById(elementId);
+
+ if (element) {
+
+ const elementRect = element.getBoundingClientRect();
+
+ // If we are close to a side...
+ if (short <= 15) {
+
+ elementPosition = elementRect.left // no change
+
+ } else {
+
+ elementPosition = elementRect.left + mouse;
+
+ }
+
+ console.log(`leftSide: ${elementRect.left}`)
+
}
- return short
+ return elementPosition;
}
-// Update elementX or elementY value.
-function calcPosition (elementPosition: number, percent: number,
+function calcPositionYDrag (elementId: string, short: number, mouse: number) {
+ let elementPosition = 0;
+ const element = document.getElementById(elementId);
+
+ if (element) {
+
+ const elementRect = element.getBoundingClientRect();
+
+ if (short <= 15 && !xTouch) {
+
+ elementPosition = elementRect.top // no change
+ xTouch = true
+
+ } else {
+ elementPosition = elementRect.top + mouse;
+ }
+
+ }
+
+ return elementPosition;
+}
+
+// Update elementX or elementY value on window resize.
+function calcPositionResize (elementPosition: number, percent: number,
short: number, win: number) {
// Is it close to the right/left side?
return elementPosition
}
-export default function draggify(input: { elementId: string }, initPosition: { x: number; y: number}) {
+export default function draggify(elementId: string, xStart: number,
+ yStart: number) {
let element: HTMLElement | null;
const elementX = ref(0);
const elementY = ref(0);
+ // Is inputItem touching the side?
+ let xTouch = true;
+ let yTouch = false;
+
// Position of inputItem on terms of percentage of window.
let percentX: number;
let percentY: number;
let xShort: number;
let yShort: number;
+ // Keep track of window size;
+ let winW = window.innerWidth;
+ let winH = window.innerHeight;
+
//---Event Handlers-----------------------------------------------
// Update the position of inputItem on mouse dragging.
const onMouseMove = (e: any) => {
- element = document.getElementById(input.elementId);
- if (element) {
- const inputItemRect = element.getBoundingClientRect();
- elementX.value = inputItemRect.left + e.movementX;
- elementY.value = inputItemRect.top + e.movementY;
- }
+ xShort = calcSideProximity(elementX.value, winW);
+ yShort = calcSideProximity(elementY.value, winH);
+
+
+ elementX.value = calcPositionXDrag(elementId, xShort, e.movementX)
+ elementY.value = calcPositionYDrag(elementId, yShort, e.movementY)
}
const onMouseUp = (_e: any) => {
window.removeEventListener('mousemove', onMouseMove, true);
- const winW = window.innerWidth;
- const winH = window.innerHeight;
-
- xShort = calcSideProximity(elementX.value, winW);
- yShort = calcSideProximity(elementY.value, winH);
+ // Reposition of outside window.
+ // Update percentages.
percentX = elementX.value / winW;
percentY = elementY.value / winH;
// Update position of targetEl on windowResize.
const onWindowResize = (_e: any) => {
- const winW = window.innerWidth;
- const winH = window.innerHeight;
- elementX.value = calcPosition(elementX.value, percentX, xShort, winW);
- elementY.value = calcPosition(elementY.value, percentY, yShort, winH);
+ // Update window dimensions.
+ winW = window.innerWidth;
+ winH = window.innerHeight;
+
+ elementX.value = calcPositionResize(elementX.value, percentX, xShort, winW);
+
+ elementY.value = calcPositionResize(elementY.value, percentY, yShort, winH);
}
//---------------------------------------------------------------
onMounted(() => {
- element = document.getElementById(input.elementId);
+ element = document.getElementById(elementId);
if (element) {
element.addEventListener('mousedown', onMouseDown, false);
});
// Initialize the coordinants.
- elementX.value = initPosition.x;
- elementY.value = initPosition.y;
+ elementX.value = xStart;
+ elementY.value = yStart;
// remove event listeners on component dismount.
onUnmounted(() => {