|
|
@@ -0,0 +1,82 @@
|
|
|
+import type { BaseWidget } from '@/types/baseWidget'
|
|
|
+import type { Page } from '@/types/page'
|
|
|
+import type { BezierSegment } from '@/types/resource'
|
|
|
+
|
|
|
+import { computed, unref, type MaybeRef } from 'vue'
|
|
|
+import { get } from 'lodash-es'
|
|
|
+import { useProjectStore } from '@/store/modules/project'
|
|
|
+import { getAllVariables, resolveVariableBoundValue } from '@/utils/variableBinding'
|
|
|
+
|
|
|
+export type BezierTrack = {
|
|
|
+ id: string
|
|
|
+ segments: BezierSegment[]
|
|
|
+ rect: {
|
|
|
+ x: number
|
|
|
+ y: number
|
|
|
+ width: number
|
|
|
+ height: number
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const normalizeSegments = (segments?: BezierSegment[]) => {
|
|
|
+ return Array.isArray(segments) ? segments : []
|
|
|
+}
|
|
|
+
|
|
|
+export const useBezierTrack = (page?: MaybeRef<Page | undefined>) => {
|
|
|
+ const projectStore = useProjectStore()
|
|
|
+
|
|
|
+ const tracks = computed<BezierTrack[]>(() => {
|
|
|
+ const result: BezierTrack[] = []
|
|
|
+ const currentPage = unref(page)
|
|
|
+ if (!currentPage?.children?.length) return result
|
|
|
+
|
|
|
+ const allVariables = getAllVariables(
|
|
|
+ projectStore.project?.variables || [],
|
|
|
+ projectStore.activePage?.variables
|
|
|
+ )
|
|
|
+
|
|
|
+ const walkWidgets = (widgets: BaseWidget[], offset = { x: 0, y: 0 }) => {
|
|
|
+ widgets.forEach((widget) => {
|
|
|
+ const resolvedProps = resolveVariableBoundValue(widget.props || {}, allVariables)
|
|
|
+ const widgetX = offset.x + Number(resolvedProps?.x ?? 0)
|
|
|
+ const widgetY = offset.y + Number(resolvedProps?.y ?? 0)
|
|
|
+ const bezierConfig = get(resolvedProps, 'bezierConfig')
|
|
|
+
|
|
|
+ if (bezierConfig?.enabled && bezierConfig.showTrack) {
|
|
|
+ const segments =
|
|
|
+ bezierConfig.path?.source === 'resource'
|
|
|
+ ? projectStore.project?.resources.bezierAnimations.find(
|
|
|
+ (item) => item.id === bezierConfig.path.resourceId
|
|
|
+ )?.segments
|
|
|
+ : bezierConfig.path?.segments
|
|
|
+
|
|
|
+ const normalizedSegments = normalizeSegments(segments)
|
|
|
+ if (normalizedSegments.length) {
|
|
|
+ result.push({
|
|
|
+ id: widget.id,
|
|
|
+ segments: normalizedSegments,
|
|
|
+ rect: {
|
|
|
+ x: widgetX,
|
|
|
+ y: widgetY,
|
|
|
+ width: Number(resolvedProps?.width ?? 0),
|
|
|
+ height: Number(resolvedProps?.height ?? 0)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (widget.children?.length) {
|
|
|
+ walkWidgets(widget.children, { x: widgetX, y: widgetY })
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ walkWidgets(currentPage.children)
|
|
|
+
|
|
|
+ return result
|
|
|
+ })
|
|
|
+
|
|
|
+ return {
|
|
|
+ tracks
|
|
|
+ }
|
|
|
+}
|