UNPKG

kui-vue

Version:

A lightweight desktop UI component library suitable for Vue.js 2.

169 lines (161 loc) 4.44 kB
import Tooltip from "../tooltip"; import { defineComponent, ref } from "vue"; export default defineComponent({ props: { vertical: Boolean, disabled: Boolean, reverse: Boolean, max: Number, min: Number, size: String, step: Number, value: [Number, String], tipFormatter: [Function, Object], type: String, tooltipVisible: Boolean, }, emits: ["thumbMove", "keydown-update"], setup(ps, { slots, emit }) { const isMousePressed = ref(false); const refThumb = ref(); const index = ref(1); const showTip = ref(ps.tooltipVisible); const touch = !!( "ontouchstart" in window || (window.DocumentTouch && document instanceof window.DocumentTouch) ); const mouseMove = (e) => { if (isMousePressed.value) { e.preventDefault(); emit("thumbMove", e, ps.type); } }; const onKeydown = (e) => { if (ps.disabled) return; if (e.key.includes("Arrow")) { emit("keydownUpdate", e, ps.type); e.preventDefault(); } }; const mouseUp = (e) => { isMousePressed.value = false; index.value = 1; if (ps.tooltipVisible === true) { showTip.value = true; } else { if (e.target.contains(refThumb.value?.$el)) { showTip.value = false; } } let [e1, e2] = touch ? ["touchmove", "touchend"] : ["mousemove", "mouseup"]; document.removeEventListener(e1, mouseMove); document.removeEventListener(e2, mouseUp); }; const onMouseDown = (e) => { e.preventDefault(); e.stopPropagation(); // console.log(123); // emit("updatePos", 123123123); if (ps.disabled) return; isMousePressed.value = true; showTip.value = true; index.value = 2; let [e1, e2] = touch ? ["touchmove", "touchend"] : ["mousemove", "mouseup"]; document.addEventListener(e1, mouseMove); document.addEventListener(e2, mouseUp); }; return () => { let { vertical, value, disabled, max, min, size, tipFormatter, reverse, tooltipVisible, } = ps; const props = { attrs: { tabindex: "0" }, class: ["k-slider-thumb", { "k-slider-thumb-sm": size == "small" }], style: { // left: `${percent}%`, zIndex: index.value, }, on: { keydown: onKeydown, mousedown: onMouseDown, touchstart: onMouseDown, mouseenter: () => { if (!disabled) showTip.value = true; }, mouseleave: (e) => { if (ps.tooltipVisible == true) { showTip.value = true; return; } if (!isMousePressed.value) { showTip.value = false; } }, }, // onKeydown: onKeydown, //for 3 // onMousedown: onMouseDown, // onTouchstart: onMouseDown, // onMouseenter: () => { // if (!disabled) showTip.value = true; // }, // onMouseleave: (e) => { // if (ps.tooltipVisible == true) { // showTip.value = true; // return; // } // if (!isMousePressed.value) { // showTip.value = false; // } // }, }; let percent, diff = max - min; percent = ((value - min) / diff) * 100; let sty = {}; if (vertical) { sty = reverse ? { bottom: `${percent}%`, transform: "translateY(50%)" } : { top: `${percent}%` }; } else { sty = reverse ? { right: `${percent}%`, transform: "translateX(50%) translateY(-50%)", } : { left: `${percent}%` }; } props.style = Object.assign(props.style, sty); if (tipFormatter === null || tooltipVisible === null) return <div {...props}></div>; let tip = value?.toString(); if (tipFormatter !== undefined) { tip = tipFormatter(tip); } const tipProps = { ref: refThumb, props: { title: tip, show: showTip.value, disabled: ps.disabled, }, }; return ( <Tooltip {...tipProps}> <div {...props} tabindex={0}></div> </Tooltip> ); }; }, });