|
@@ -1,31 +1,32 @@
|
|
|
<template>
|
|
|
<template v-if="model && sceneModel">
|
|
|
- <ControlPanl
|
|
|
- :group="[{ items: options }]"
|
|
|
- v-model="selectOptions"
|
|
|
+ <ControlPanl
|
|
|
+ :group="[{ items: options }]"
|
|
|
+ v-model="selectOptions"
|
|
|
ref="selectExpose"
|
|
|
/>
|
|
|
<ui-floating
|
|
|
- v-if="selectOptions.some(({key}) => key === 'opacity')"
|
|
|
+ v-if="selectOptions.some(({ key }) => key === 'opacity')"
|
|
|
:refer="opacityOptionEl"
|
|
|
class="opacity-range"
|
|
|
isTransform
|
|
|
dire="right-center"
|
|
|
>
|
|
|
-
|
|
|
- <div class="right-range floating-range strengthen ">
|
|
|
+ <div class="right-range floating-range strengthen">
|
|
|
<div class="range-content">
|
|
|
<div class="range-layout">
|
|
|
- <ui-input
|
|
|
- type="range"
|
|
|
+ <ui-input
|
|
|
+ type="range"
|
|
|
v-model="model.opacity"
|
|
|
- v-bind="modelRange.opacityRange"
|
|
|
+ v-bind="modelRange.opacityRange"
|
|
|
:moveCallback="changeRange"
|
|
|
- :ctrl="false"
|
|
|
+ :ctrl="false"
|
|
|
:input="false"
|
|
|
width="100%"
|
|
|
/>
|
|
|
- <span class="num" :style="{left: `${model.opacity}%`}">{{parseInt(model.opacity.toString())}}%</span>
|
|
|
+ <span class="num" :style="{ left: `${model.opacity}%` }"
|
|
|
+ >{{ parseInt(model.opacity.toString()) }}%</span
|
|
|
+ >
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -66,90 +67,100 @@
|
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
-import { ref, computed, watch, watchEffect } from 'vue'
|
|
|
-import { ControlPanl } from '@/components/control-panl/'
|
|
|
-import { modelRange, getSceneModel, sdk } from '@/sdk'
|
|
|
-import { diffArrayChange } from '@/utils'
|
|
|
-import { useViewStack } from '@/hook'
|
|
|
-import { autoSaveFuseModels, getFuseModel, leave } from '@/store'
|
|
|
-import { router, RoutesName } from '@/router'
|
|
|
-import { currentModelStack, custom, showMeasuresStack } from '@/env'
|
|
|
+import { ref, computed, watch, watchEffect } from "vue";
|
|
|
+import { ControlPanl } from "@/components/control-panl/";
|
|
|
+import { modelRange, getSceneModel, sdk } from "@/sdk";
|
|
|
+import { diffArrayChange } from "@/utils";
|
|
|
+import { useViewStack } from "@/hook";
|
|
|
+import { autoSaveFuseModels, getFuseModel, leave } from "@/store";
|
|
|
+import { router, RoutesName } from "@/router";
|
|
|
+import { currentModelStack, custom, showMeasuresStack } from "@/env";
|
|
|
|
|
|
-import type { ControlExpose } from '@/components/control-panl'
|
|
|
+import type { ControlExpose } from "@/components/control-panl";
|
|
|
|
|
|
-const isCurrent = computed(() => router.currentRoute.value.name === RoutesName.registration)
|
|
|
+const isCurrent = computed(
|
|
|
+ () => router.currentRoute.value.name === RoutesName.registration
|
|
|
+);
|
|
|
|
|
|
const model = computed(() => {
|
|
|
- const modelId = router.currentRoute.value.params.id as string
|
|
|
+ const modelId = router.currentRoute.value.params.id as string;
|
|
|
if (isCurrent.value && modelId) {
|
|
|
- return getFuseModel(modelId)
|
|
|
+ return getFuseModel(modelId);
|
|
|
}
|
|
|
-})
|
|
|
+});
|
|
|
|
|
|
-const sceneModel = computed(() => model.value && getSceneModel(model.value))
|
|
|
+const sceneModel = computed(() => model.value && getSceneModel(model.value));
|
|
|
const options = [
|
|
|
- { desc: '移动', icon: 'move', key: 'move' },
|
|
|
- { desc: '旋转', icon: 'flip', key: 'rotate' },
|
|
|
- { desc: '透明度', icon: 'transparency', key: 'opacity' },
|
|
|
-]
|
|
|
-const selectOptions = ref<typeof options>([])
|
|
|
-const selectExpose = ref<ControlExpose>()
|
|
|
-const opacityOptionEl = computed(
|
|
|
- () => selectExpose.value?.dom?.querySelector('div[data-key="opacity"]')
|
|
|
-)
|
|
|
-
|
|
|
-const changeRange = (sp: ScreenLocalPos, cp: ScreenLocalPos, info: { start: number, locusWidth: number }) =>
|
|
|
- info.start + ((sp.y - cp.y) / info.locusWidth)
|
|
|
-
|
|
|
-watch(selectOptions, (nOptions, oOptions = []) => {
|
|
|
- const { added, deleted } = diffArrayChange(nOptions, oOptions)
|
|
|
- const setKeys = ['move', 'rotate']
|
|
|
- const addOptions = added.filter(option => setKeys.includes(option.key))
|
|
|
- const delOptions = deleted.filter(option => setKeys.includes(option.key))
|
|
|
-
|
|
|
- if (sceneModel.value) {
|
|
|
- if (!addOptions.length && delOptions.length) {
|
|
|
- sceneModel.value.leaveTransform()
|
|
|
- } else if (addOptions.length) {
|
|
|
- if (addOptions[0].key === 'move') {
|
|
|
- sceneModel.value.enterMoveMode()
|
|
|
- } else {
|
|
|
- sceneModel.value.enterRotateMode()
|
|
|
+ { desc: "移动", icon: "move", key: "move" },
|
|
|
+ { desc: "旋转", icon: "flip", key: "rotate" },
|
|
|
+ { desc: "透明度", icon: "transparency", key: "opacity" },
|
|
|
+];
|
|
|
+const selectOptions = ref<typeof options>([]);
|
|
|
+const selectExpose = ref<ControlExpose>();
|
|
|
+const opacityOptionEl = computed(() =>
|
|
|
+ selectExpose.value?.dom?.querySelector('div[data-key="opacity"]')
|
|
|
+);
|
|
|
+
|
|
|
+const changeRange = (
|
|
|
+ sp: ScreenLocalPos,
|
|
|
+ cp: ScreenLocalPos,
|
|
|
+ info: { start: number; locusWidth: number }
|
|
|
+) => info.start + (sp.y - cp.y) / info.locusWidth;
|
|
|
+
|
|
|
+watch(
|
|
|
+ selectOptions,
|
|
|
+ (nOptions, oOptions = []) => {
|
|
|
+ const { added, deleted } = diffArrayChange(nOptions, oOptions);
|
|
|
+ const setKeys = ["move", "rotate"];
|
|
|
+ const addOptions = added.filter((option) => setKeys.includes(option.key));
|
|
|
+ const delOptions = deleted.filter((option) => setKeys.includes(option.key));
|
|
|
+
|
|
|
+ if (sceneModel.value) {
|
|
|
+ if (!addOptions.length && delOptions.length) {
|
|
|
+ sceneModel.value.leaveTransform();
|
|
|
+ } else if (addOptions.length) {
|
|
|
+ if (addOptions[0].key === "move") {
|
|
|
+ sceneModel.value.enterMoveMode();
|
|
|
+ } else {
|
|
|
+ sceneModel.value.enterRotateMode();
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
-}, { immediate: true })
|
|
|
+ },
|
|
|
+ { immediate: true }
|
|
|
+);
|
|
|
|
|
|
watchEffect((onCleanup) => {
|
|
|
- const smodel = sceneModel.value
|
|
|
+ const smodel = sceneModel.value;
|
|
|
if (smodel) {
|
|
|
- smodel.enterAlignment()
|
|
|
- const pop = currentModelStack.push(model as any)
|
|
|
+ smodel.enterAlignment();
|
|
|
+ const pop = currentModelStack.push(model as any);
|
|
|
+
|
|
|
+ selectOptions.value = [options[0]];
|
|
|
|
|
|
onCleanup(() => {
|
|
|
- smodel.leaveTransform()
|
|
|
- smodel.leaveAlignment()
|
|
|
- pop()
|
|
|
- })
|
|
|
+ smodel.leaveTransform();
|
|
|
+ smodel.leaveAlignment();
|
|
|
+ pop();
|
|
|
+ });
|
|
|
} else if (isCurrent.value) {
|
|
|
- leave()
|
|
|
+ leave();
|
|
|
}
|
|
|
-})
|
|
|
+});
|
|
|
|
|
|
useViewStack(() => {
|
|
|
showMeasuresStack.push(ref(false));
|
|
|
- sdk.showGrid()
|
|
|
+ sdk.showGrid();
|
|
|
|
|
|
return () => {
|
|
|
- showMeasuresStack.pop()
|
|
|
+ showMeasuresStack.pop();
|
|
|
if (selectOptions.value.length) {
|
|
|
- selectOptions.value = []
|
|
|
+ selectOptions.value = [];
|
|
|
}
|
|
|
- sdk.hideGrid()
|
|
|
- }
|
|
|
-})
|
|
|
-useViewStack(autoSaveFuseModels)
|
|
|
-
|
|
|
+ sdk.hideGrid();
|
|
|
+ };
|
|
|
+});
|
|
|
+useViewStack(autoSaveFuseModels);
|
|
|
</script>
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
@@ -158,8 +169,8 @@ useViewStack(autoSaveFuseModels)
|
|
|
transform: translateY(-50%);
|
|
|
width: 162px;
|
|
|
height: 32px;
|
|
|
- background: rgba(27,27,28,0.8);
|
|
|
- box-shadow: inset 0px 0px 0px 2px rgba(255,255,255,0.1);
|
|
|
+ background: rgba(27, 27, 28, 0.8);
|
|
|
+ box-shadow: inset 0px 0px 0px 2px rgba(255, 255, 255, 0.1);
|
|
|
border-radius: 16px;
|
|
|
padding: 0 10px;
|
|
|
.range-content {
|
|
@@ -213,7 +224,8 @@ useViewStack(autoSaveFuseModels)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-.tip-left,.tip-right {
|
|
|
+.tip-left,
|
|
|
+.tip-right {
|
|
|
top: calc(var(--editor-head-height) + var(--header-top) + 11px);
|
|
|
z-index: 2;
|
|
|
}
|
|
@@ -226,7 +238,6 @@ useViewStack(autoSaveFuseModels)
|
|
|
left: 75%;
|
|
|
transform: translateX(-50%);
|
|
|
}
|
|
|
-
|
|
|
</style>
|
|
|
|
|
|
<style>
|
|
@@ -236,4 +247,4 @@ useViewStack(autoSaveFuseModels)
|
|
|
.opacity-range {
|
|
|
margin-left: 70px;
|
|
|
}
|
|
|
-</style>
|
|
|
+</style>
|