Files
labelmain/components/label/useTopToolsStore.ts
2026-02-03 18:05:47 +08:00

241 lines
7.7 KiB
TypeScript

import { Project } from "./api/project/typing"
import { create } from "zustand"
import { persist } from "zustand/middleware"
import { usePaperStore } from "./usePaperStore"
import { useObjectStore } from "./store"
import { useBottomToolsStore } from "./useBottomToolsStore"
interface TopToolsState {
// 标注页面是否仅查看
isView: boolean
setIsView: (val: boolean) => void
// 绘制模式
editMode: boolean
setEditMode: (val: boolean) => void
// 是否在相交模式下press A键
pressA: boolean
setPressA: (val: boolean) => void
// 亮度 饱和度 对比度
imageFilter: {
saturate: number
contrast: number
brightness: number
}
setImageFilter: (
key: "saturate" | "contrast" | "brightness",
val: number
) => void
crosshairStatus: "hidden" | "line" | "carve"
setCrosshairStatus: (val: "hidden" | "line" | "carve") => void
showTags: boolean
setShowTags: (val: boolean) => void
showTagsConfigs: string[]
setShowTagsConfigs: (val: string[]) => void
// drawOption 图形叠加选项
drawOption: "default" | "intersect" | "unite"
setDrawOption: (val: "default" | "intersect" | "unite") => void
magnetFlag: boolean
setMagnetFlag: (val: boolean) => void
saveCurrentScale: boolean
setSaveCurrentScale: (val: boolean) => void
scale: number
setScale: (val: number) => void
activeOperation: string
setActiveOperation: (val: string) => void
showObjectList: boolean
setShowObjectList: (val: boolean) => void
showDescList: boolean
setShowDescList: (val: boolean) => void
showGroupList: boolean
setShowGroupList: (val: boolean) => void
showTaskList: boolean
setShowTaskList: (val: boolean) => void
showMultiFrame: boolean
setShowMultiFrame: (val: boolean) => void
currentTimeKey: "label" | "review1" | "review2"
setCurrentTimeKey: (val: "label" | "review1" | "review2") => void
subAttrPresetShow: boolean
setSubAttrPresetShow: (val: boolean) => void
subAttributes: {
// key: label_class
[key: string]: {
[key: string]: string
}
}
setsubAttributes: (key: string, val: { [key: string]: string }) => void
objectOperations: Project.LabelSchemaList[]
setObjectOperations: (val: Project.LabelSchemaList[]) => void
needBackup: boolean
setNeedBackup: (flag: boolean) => void
checkSize: number
setCheckSize: (v: number) => void
}
const initialTopToolsState = {
isView: false,
editMode: false,
pressA: false,
imageFilter: {
saturate: 0,
contrast: 0,
brightness: 0,
},
crosshairStatus: "hidden" as "hidden" | "line" | "carve",
drawOption: "default" as "default" | "intersect" | "unite",
saveCurrentScale: false,
scale: 1,
activeOperation: "",
showObjectList: false,
showGroupList: false,
showTaskList: false,
showMultiFrame: true,
currentTimeKey: "label" as "label" | "review1" | "review2",
subAttrPresetShow: false,
subAttributes: {},
objectOperations: [],
}
export const useTopToolsStore = create<TopToolsState>()(
persist<TopToolsState>(
(set) => ({
isView: initialTopToolsState.isView,
setIsView: (val: boolean) =>
set((state: TopToolsState) => ({
...state,
isView: val,
})),
editMode: initialTopToolsState.editMode,
setEditMode: (val: boolean) =>
set((state: TopToolsState) => ({
...state,
editMode: val,
})),
pressA: initialTopToolsState.pressA,
setPressA: (val: boolean) => {
if (!val) {
set((state: TopToolsState) => ({
...state,
pressA: false,
}))
return
}
let ids =
useObjectStore.getState().selectedPath[
useBottomToolsStore.getState().activeImage
]
if (!ids || ids.length !== 1) {
set((state: TopToolsState) => ({
...state,
pressA: false,
}))
return
}
let path = usePaperStore.getState().getItemById(ids[0])
if (path && path.data.type !== "rectangle") {
let flag = val && usePaperStore.getState().mode !== "rectangle"
set((state: TopToolsState) => ({
...state,
pressA: flag ? true : false,
}))
}
},
imageFilter: initialTopToolsState.imageFilter,
setImageFilter: (key, val) =>
set((state: TopToolsState) => ({
...state,
imageFilter: Object.assign(state.imageFilter, { [key]: val }),
})),
crosshairStatus: initialTopToolsState.crosshairStatus,
setCrosshairStatus: (val) =>
set((state: TopToolsState) => ({
...state,
crosshairStatus: val,
})),
showTags: false,
setShowTags: (val) =>
set((state: TopToolsState) => ({
...state,
showTags: val,
})),
showTagsConfigs: [],
setShowTagsConfigs: (val) =>
set((state: TopToolsState) => ({
...state,
showTagsConfigs: val,
})),
drawOption: initialTopToolsState.drawOption,
setDrawOption: (val) =>
set((state: TopToolsState) => ({
...state,
drawOption: val,
})),
magnetFlag: false,
setMagnetFlag: (val) =>
set((state: TopToolsState) => ({
...state,
magnetFlag: val,
})),
saveCurrentScale: initialTopToolsState.saveCurrentScale,
setSaveCurrentScale: (val: boolean) =>
set((state: TopToolsState) => ({
...state,
saveCurrentScale: val,
})),
scale: initialTopToolsState.scale,
setScale: (val: number) =>
set((state: TopToolsState) => ({
...state,
scale: val,
})),
activeOperation: initialTopToolsState.activeOperation,
setActiveOperation: (val: string) =>
set((state: TopToolsState) => ({
...state,
activeOperation: val,
})),
showObjectList: initialTopToolsState.showObjectList,
setShowObjectList: (val: boolean) =>
set((state: TopToolsState) => ({ ...state, showObjectList: val })),
showDescList: false,
setShowDescList: (val: boolean) =>
set((state: TopToolsState) => ({ ...state, showDescList: val })),
showGroupList: initialTopToolsState.showGroupList,
setShowGroupList: (val: boolean) =>
set((state: TopToolsState) => ({ ...state, showGroupList: val })),
showTaskList: initialTopToolsState.showTaskList,
setShowTaskList: (val: boolean) =>
set((state: TopToolsState) => ({ ...state, showTaskList: val })),
showMultiFrame: initialTopToolsState.showMultiFrame,
setShowMultiFrame: (val: boolean) =>
set((state: TopToolsState) => ({ ...state, showMultiFrame: val })),
currentTimeKey: initialTopToolsState.currentTimeKey,
setCurrentTimeKey: (val) =>
set((state: TopToolsState) => ({ ...state, currentTimeKey: val })),
subAttrPresetShow: initialTopToolsState.subAttrPresetShow,
setSubAttrPresetShow: (val) =>
set((state: TopToolsState) => ({ ...state, subAttrPresetShow: val })),
subAttributes: initialTopToolsState.subAttributes,
setsubAttributes: (key, val) =>
set((state: TopToolsState) => ({
...state,
subAttributes: Object.assign(
useTopToolsStore.getState().subAttributes,
{ [key]: val }
),
})),
objectOperations: initialTopToolsState.objectOperations,
setObjectOperations: (val) =>
set((state: TopToolsState) => ({ ...state, objectOperations: val })),
needBackup: false,
setNeedBackup: (val) =>
set((state: TopToolsState) => ({ ...state, needBackup: val })),
checkSize: 5,
setCheckSize: (v) => set((state) => ({ ...state, checkSize: v })),
}),
{
name: "top-tools",
}
)
)