|
@@ -20,13 +20,14 @@
|
|
|
@add-action="(preset) => add('actions', preset)"
|
|
|
@apply-global="k => ams.forEach((am: any) => (am[k] = focusAM![k]))"
|
|
|
/>
|
|
|
- <Bottom
|
|
|
- :am="focusAM"
|
|
|
- v-model:follow="follow"
|
|
|
- v-model:current-time="currentTime"
|
|
|
- class="animation-toolbar"
|
|
|
- v-model:active="activeAttrib"
|
|
|
- />
|
|
|
+ <BottomPano>
|
|
|
+ <Bottom
|
|
|
+ :am="focusAM"
|
|
|
+ v-model:follow="follow"
|
|
|
+ v-model:current-time="currentTime"
|
|
|
+ v-model:active="activeAttrib"
|
|
|
+ />
|
|
|
+ </BottomPano>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
@@ -34,6 +35,7 @@
|
|
|
import Left from "./left.vue";
|
|
|
import Right from "./right/index.vue";
|
|
|
import Bottom from "./bottom.vue";
|
|
|
+import BottomPano from "@/layout/bottom-pano.vue";
|
|
|
import router from "@/router";
|
|
|
import { enterEdit } from "@/store";
|
|
|
import { useViewStack } from "@/hook";
|
|
@@ -52,11 +54,13 @@ import { mergeFuns, uuid } from "@/components/drawing/hook";
|
|
|
import { title } from "./type";
|
|
|
import { amMap, getAMKey, currentTime } from "@/sdk/association/animation";
|
|
|
import { AnimationModel3D } from "@/sdk";
|
|
|
+import { bottomBarHeightStack, showBottomBarStack } from "@/env";
|
|
|
|
|
|
enterEdit(() => router.back());
|
|
|
initialAnimationModels();
|
|
|
initAnimationActions();
|
|
|
useViewStack(autoSaveAnimationModel);
|
|
|
+useViewStack(() => showBottomBarStack.push(ref(true)));
|
|
|
|
|
|
const focusAM = ref<AnimationModel>();
|
|
|
const activeAttrib = ref<Active>();
|
|
@@ -66,6 +70,21 @@ const frameAction = ref<string>();
|
|
|
|
|
|
const amM = computed(() => focusAM.value && amMap[getAMKey(focusAM.value)]);
|
|
|
|
|
|
+const asyncOper = (item: AnimationModel, oper: (obj: AnimationModel3D) => void) => {
|
|
|
+ let onCleanup = () => {};
|
|
|
+ if (amMap[getAMKey(item)]?.am) {
|
|
|
+ oper(amMap[getAMKey(item)]!.am!);
|
|
|
+ } else {
|
|
|
+ onCleanup = watchEffect(() => {
|
|
|
+ if (amMap[getAMKey(item)]?.am!) {
|
|
|
+ oper(amMap[getAMKey(item)]!.am!);
|
|
|
+ onCleanup && onCleanup();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return onCleanup;
|
|
|
+};
|
|
|
+
|
|
|
watchEffect((onCleanup) => {
|
|
|
if (!amM.value || activeAttrib.value?.key !== "frames") return;
|
|
|
const frame = focusAM.value!.frames[activeAttrib.value.ndx];
|
|
@@ -91,10 +110,34 @@ watchEffect((onCleanup) => {
|
|
|
});
|
|
|
|
|
|
const updateFocus = (am?: AnimationModel) => {
|
|
|
+ if (focusAM.value) {
|
|
|
+ asyncOper(focusAM.value, (item) => {
|
|
|
+ item.changeSelect(false);
|
|
|
+ });
|
|
|
+ }
|
|
|
activeAttrib.value = undefined;
|
|
|
focusAM.value = am;
|
|
|
+ am && asyncOper(am, (item) => item.changeSelect(true));
|
|
|
};
|
|
|
|
|
|
+watchEffect((onCleanup) => {
|
|
|
+ onCleanup(
|
|
|
+ mergeFuns(
|
|
|
+ ams.value.map((item) => {
|
|
|
+ return asyncOper(item, (s) =>
|
|
|
+ s.bus.on("changeSelect", (f) => {
|
|
|
+ if (f) {
|
|
|
+ focusAM.value = item;
|
|
|
+ } else if (focusAM.value === item) {
|
|
|
+ focusAM.value = undefined;
|
|
|
+ }
|
|
|
+ })
|
|
|
+ );
|
|
|
+ })
|
|
|
+ )
|
|
|
+ );
|
|
|
+});
|
|
|
+
|
|
|
watch(activeAttrib, (_a, _b, onCleanup) => {
|
|
|
if (!activeAttrib.value) return;
|
|
|
const cur = focusAM.value![activeAttrib.value.key][activeAttrib.value.ndx];
|
|
@@ -139,27 +182,19 @@ const add = <T extends Active["key"]>(
|
|
|
}
|
|
|
};
|
|
|
|
|
|
-const asyncOper = (item: AnimationModel, oper: (obj: AnimationModel3D) => void) => {
|
|
|
- let onCleanup = () => {};
|
|
|
- if (amMap[getAMKey(item)]?.am) {
|
|
|
- oper(amMap[getAMKey(item)]!.am!);
|
|
|
- } else {
|
|
|
- onCleanup = watchEffect(() => {
|
|
|
- if (amMap[getAMKey(item)]?.am!) {
|
|
|
- oper(amMap[getAMKey(item)]!.am!);
|
|
|
- onCleanup && onCleanup();
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
- return onCleanup;
|
|
|
-};
|
|
|
-
|
|
|
let cleanSelect: (() => void) | null = null;
|
|
|
const changeSelect = ({ select, unSelect }: Record<string, AnimationModel[]>) => {
|
|
|
cleanSelect && cleanSelect();
|
|
|
cleanSelect = mergeFuns(
|
|
|
- ...select.map((item) => asyncOper(item, (am) => am.changeSelect(true))),
|
|
|
- ...unSelect.map((item) => asyncOper(item, (am) => am.changeSelect(false)))
|
|
|
+ ...select.map((item) => asyncOper(item, (am) => am.changeShow(true))),
|
|
|
+ ...unSelect.map((item) =>
|
|
|
+ asyncOper(item, (am) => {
|
|
|
+ if (item === focusAM.value) {
|
|
|
+ focusAM.value = undefined;
|
|
|
+ }
|
|
|
+ am.changeShow(false);
|
|
|
+ })
|
|
|
+ )
|
|
|
);
|
|
|
};
|
|
|
|
|
@@ -194,10 +229,9 @@ const deleteAm = (am: AnimationModel) => {
|
|
|
right: 0;
|
|
|
top: 0;
|
|
|
}
|
|
|
-
|
|
|
-.animation-toolbar {
|
|
|
- height: var(--bottom-height);
|
|
|
- width: 100vw;
|
|
|
- display: block;
|
|
|
+</style>
|
|
|
+<style>
|
|
|
+.animation-left .left-pano {
|
|
|
+ bottom: 0 !important;
|
|
|
}
|
|
|
</style>
|