2023-08-21 01:51:35 -04:00
|
|
|
<script setup lang="ts">
|
|
|
|
|
import { computed } from "vue";
|
|
|
|
|
import TooltippedLabel from "@/components/common/cv-tooltipped-label.vue";
|
|
|
|
|
|
2023-08-31 16:56:58 -04:00
|
|
|
const props = withDefaults(
|
|
|
|
|
defineProps<{
|
|
|
|
|
label?: string;
|
|
|
|
|
tooltip?: string;
|
|
|
|
|
// TODO fully update v-model usage in custom components on Vue3 update
|
|
|
|
|
// value: [number, number] | WebsocketNumberPair, // Vue doesnt like Union types for the value prop for some reason.
|
|
|
|
|
value: [number, number];
|
|
|
|
|
min: number;
|
|
|
|
|
max: number;
|
|
|
|
|
step?: number;
|
|
|
|
|
sliderCols?: number;
|
|
|
|
|
disabled?: boolean;
|
|
|
|
|
inverted?: boolean;
|
|
|
|
|
}>(),
|
|
|
|
|
{
|
|
|
|
|
step: 1,
|
|
|
|
|
disabled: false,
|
|
|
|
|
inverted: false,
|
|
|
|
|
sliderCols: 10
|
|
|
|
|
}
|
|
|
|
|
);
|
2023-08-21 01:51:35 -04:00
|
|
|
|
|
|
|
|
const emit = defineEmits<{
|
2023-08-31 16:56:58 -04:00
|
|
|
(e: "input", value: [number, number]): void;
|
2023-08-21 01:51:35 -04:00
|
|
|
}>();
|
|
|
|
|
|
|
|
|
|
const localValue = computed<[number, number]>({
|
2023-08-31 16:56:58 -04:00
|
|
|
get: (): [number, number] => {
|
2023-08-21 01:51:35 -04:00
|
|
|
return Object.values(props.value) as [number, number];
|
|
|
|
|
},
|
2023-08-31 16:56:58 -04:00
|
|
|
set: (v) => emit("input", v)
|
2023-08-21 01:51:35 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const changeFromSlot = (v: number, i: number) => {
|
|
|
|
|
// localValue.value must be replaced for a reactive change to take place
|
|
|
|
|
const temp = localValue.value;
|
|
|
|
|
temp[i] = v;
|
|
|
|
|
localValue.value = temp;
|
|
|
|
|
};
|
|
|
|
|
</script>
|
|
|
|
|
|
2019-09-28 02:17:18 +03:00
|
|
|
<template>
|
2020-06-26 04:39:14 -07:00
|
|
|
<div>
|
2023-08-31 16:56:58 -04:00
|
|
|
<v-row dense align="center">
|
2023-08-21 01:51:35 -04:00
|
|
|
<v-col :cols="12 - sliderCols">
|
2023-08-31 16:56:58 -04:00
|
|
|
<tooltipped-label :tooltip="tooltip" :label="label" />
|
2020-06-26 04:39:14 -07:00
|
|
|
</v-col>
|
2023-08-21 01:51:35 -04:00
|
|
|
<v-col :cols="sliderCols">
|
2020-06-26 04:39:14 -07:00
|
|
|
<v-range-slider
|
2023-08-21 01:51:35 -04:00
|
|
|
v-model="localValue"
|
2020-06-26 04:39:14 -07:00
|
|
|
:max="max"
|
|
|
|
|
:min="min"
|
2021-09-03 19:20:55 -07:00
|
|
|
:disabled="disabled"
|
2020-06-26 04:39:14 -07:00
|
|
|
hide-details
|
|
|
|
|
class="align-center"
|
|
|
|
|
dark
|
2022-02-21 22:41:51 -05:00
|
|
|
:color="inverted ? 'rgba(255, 255, 255, 0.2)' : 'accent'"
|
|
|
|
|
:track-color="inverted ? 'accent' : undefined"
|
|
|
|
|
thumb-color="accent"
|
2020-06-26 04:39:14 -07:00
|
|
|
:step="step"
|
|
|
|
|
>
|
2023-08-21 01:51:35 -04:00
|
|
|
<template #prepend>
|
2020-06-26 04:39:14 -07:00
|
|
|
<v-text-field
|
2023-08-21 01:51:35 -04:00
|
|
|
:value="localValue[0]"
|
2020-06-26 04:39:14 -07:00
|
|
|
dark
|
2020-07-31 13:50:50 -07:00
|
|
|
color="accent"
|
2020-06-26 04:39:14 -07:00
|
|
|
class="mt-0 pt-0"
|
|
|
|
|
hide-details
|
|
|
|
|
single-line
|
2023-08-21 01:51:35 -04:00
|
|
|
:max="max"
|
|
|
|
|
:min="min"
|
|
|
|
|
:step="step"
|
2020-06-26 04:39:14 -07:00
|
|
|
type="number"
|
2021-09-03 19:20:55 -07:00
|
|
|
style="width: 60px"
|
2023-08-31 16:56:58 -04:00
|
|
|
@input="(v) => changeFromSlot(v, 0)"
|
2020-06-26 04:39:14 -07:00
|
|
|
/>
|
|
|
|
|
</template>
|
2023-08-21 01:51:35 -04:00
|
|
|
<template #append>
|
2020-06-26 04:39:14 -07:00
|
|
|
<v-text-field
|
2023-08-21 01:51:35 -04:00
|
|
|
:value="localValue[1]"
|
2020-06-26 04:39:14 -07:00
|
|
|
dark
|
2020-07-31 13:50:50 -07:00
|
|
|
color="accent"
|
2020-06-26 04:39:14 -07:00
|
|
|
class="mt-0 pt-0"
|
|
|
|
|
hide-details
|
|
|
|
|
single-line
|
2023-08-21 01:51:35 -04:00
|
|
|
:max="max"
|
|
|
|
|
:min="min"
|
|
|
|
|
:step="step"
|
2020-06-26 04:39:14 -07:00
|
|
|
type="number"
|
2021-09-03 19:20:55 -07:00
|
|
|
style="width: 60px"
|
2023-08-31 16:56:58 -04:00
|
|
|
@input="(v) => changeFromSlot(v, 1)"
|
2020-06-26 04:39:14 -07:00
|
|
|
/>
|
|
|
|
|
</template>
|
|
|
|
|
</v-range-slider>
|
|
|
|
|
</v-col>
|
|
|
|
|
</v-row>
|
|
|
|
|
</div>
|
2019-09-28 02:17:18 +03:00
|
|
|
</template>
|