main.ts 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. import {Object as FabricObject} from 'fabric'
  2. import {customAlphabet} from 'nanoid'
  3. import {defineStore} from 'pinia'
  4. import {SYS_FONTS} from '@/configs/fonts'
  5. import {ImageCategoryInfo} from '@/configs/images'
  6. import {getSupportFonts} from '@/utils/fonts'
  7. import {CanvasElement} from '@/types/canvas'
  8. import {RightStates, PointElement, ImageCategoryData} from '@/types/elements'
  9. import {ExportTypes, PoolType, SystemFont} from '@/types/common'
  10. import {getDesignFonts} from '@/api/static/font'
  11. import useCanvas from '@/views/Canvas/useCanvas'
  12. export interface MainState {
  13. canvasObject: FabricObject | undefined
  14. hoveredObject: FabricObject | undefined
  15. leavedObject: FabricObject | undefined
  16. clonedObject: FabricObject | undefined
  17. currentPoint: PointElement | null
  18. rightState: RightStates
  19. imageCategoryType: string[]
  20. imageCategoryData: ImageCategoryData[]
  21. illustrationCategoryType: string[]
  22. illustrationCategoryData: ImageCategoryData[]
  23. handleElementId: string
  24. sizeMode: number
  25. unitMode: number
  26. gridColorSelf: [string[]]
  27. databaseId: string
  28. selectedTemplatesIndex: number[]
  29. thumbnailsFocus: boolean
  30. drawAreaFocus: boolean
  31. systemFonts: SystemFont[]
  32. onlineFonts: any[]
  33. disableHotkeys: boolean
  34. exportType: ExportTypes
  35. lastHelp: PoolType
  36. lastEdit: PoolType
  37. poolType: PoolType
  38. poolShow: boolean
  39. runMode: number
  40. }
  41. const nanoid = customAlphabet('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz')
  42. export const databaseId = nanoid(10)
  43. export const useMainStore = defineStore('main', {
  44. state: (): MainState => ({
  45. canvasObject: undefined,
  46. clonedObject: undefined,
  47. hoveredObject: undefined,
  48. leavedObject: undefined,
  49. currentPoint: null,
  50. rightState: RightStates.ELEMENT_CANVAS,
  51. imageCategoryType: [],
  52. imageCategoryData: ImageCategoryInfo,
  53. illustrationCategoryType: [],
  54. illustrationCategoryData: ImageCategoryInfo,
  55. handleElementId: '', // 正在操作的元素ID
  56. sizeMode: 0, // 模板样式
  57. unitMode: 0, // 单位
  58. gridColorSelf: [[]], // 自定义颜色
  59. databaseId, // 标识当前应用的indexedDB数据库ID
  60. selectedTemplatesIndex: [],
  61. thumbnailsFocus: false, // 左侧导航缩略图区域聚焦
  62. drawAreaFocus: false, // 编辑区聚焦
  63. systemFonts: SYS_FONTS, // 系统字体
  64. onlineFonts: [], // 在线字体
  65. disableHotkeys: false, // 禁用快捷键
  66. exportType: 'image', // 导出面板
  67. lastEdit: 'editor', // 左边栏
  68. lastHelp: 'editor', // 左边栏
  69. poolType: 'editor', // 左边栏
  70. poolShow: false, // 显示左边栏
  71. runMode: 0 //运行方式, 0客户端展示/1模板编辑
  72. }),
  73. getters: {
  74. activeElementList() {
  75. // const slidesStore = useSlidesStore()
  76. // const currentSlide = slidesStore.currentSlide
  77. // if (!currentSlide || !currentSlide.elements) return []
  78. },
  79. handleElement() {
  80. // const slidesStore = useSlidesStore()
  81. // const currentSlide = slidesStore.currentSlide
  82. // if (!currentSlide || !currentSlide.elements) return null
  83. // return currentSlide.elements.find(element => state.handleElementId === element.id) || null
  84. },
  85. },
  86. actions: {
  87. setCanvasObject(canvasObject: FabricObject | undefined) {
  88. this.canvasObject = canvasObject
  89. // this.getFonts()
  90. },
  91. setHoveredObject(hoveredObject: FabricObject | undefined) {
  92. this.hoveredObject = hoveredObject
  93. },
  94. setLeaveddObject(leavedObject: FabricObject | undefined) {
  95. this.leavedObject = leavedObject
  96. },
  97. setActiveObject() {
  98. const [canvas] = useCanvas()
  99. if (!canvas) return
  100. const activeObject = canvas._activeObject as CanvasElement | null
  101. },
  102. // setHandleElementId(handleElementId: string) {
  103. // this.handleElementId = handleElementId
  104. // },
  105. // setActiveGroupElementId(activeGroupElementId: string) {
  106. // this.activeGroupElementId = activeGroupElementId
  107. // },
  108. // setHiddenElementIdList(hiddenElementIdList: string[]) {
  109. // this.hiddenElementIdList = hiddenElementIdList
  110. // },
  111. // setCanvasDragged(isDragged: boolean) {
  112. // this.canvasDragged = isDragged
  113. // },
  114. setPoolType(poolType: PoolType) {
  115. if (poolType === 'help') this.lastHelp = this.poolType
  116. // if (poolType === 'editor') this.lastEdit = this.poolType
  117. this.poolType = poolType
  118. },
  119. setRightState(rightState: RightStates) {
  120. this.rightState = rightState
  121. },
  122. setThumbnailsFocus(isFocus: boolean) {
  123. this.thumbnailsFocus = isFocus
  124. },
  125. getFonts() {
  126. this.getSystemFonts()
  127. this.getOnlineFonts()
  128. },
  129. getSystemFonts() {
  130. this.systemFonts = getSupportFonts(SYS_FONTS)
  131. },
  132. async getOnlineFonts() {
  133. // const res = await getFontInfo()
  134. // if (res.data.code === 200) {
  135. // // this.onlineFonts = res.data.data
  136. // const style = document.createElement("style");
  137. // style.type = "text/css";
  138. // res.data.data.forEach(fontInfo => {
  139. // this.onlineFonts.push({label: fontInfo.fontname, value: fontInfo.fontname})
  140. // style.appendChild(document.createTextNode(
  141. // `@font-face {font-family: '${fontInfo.fontname}'; src: url(${fontInfo.url}) format('truetype');}`
  142. // ));
  143. // })
  144. // document.head.appendChild(style);
  145. // }
  146. getDesignFonts({}).then((response: any) => {
  147. if (response.httpCode == 200) {
  148. this.onlineFonts = response.data
  149. const style = document.createElement("style");
  150. style.type = "text/css";
  151. response.data.forEach(fontInfo => {
  152. style.appendChild(document.createTextNode(
  153. `@font-face {font-family: '${fontInfo.fontFamily}'; src: url(${fontInfo.fontFilePath}) format('truetype');}`
  154. ));
  155. })
  156. document.head.appendChild(style);
  157. }
  158. });
  159. },
  160. setExportType(type: ExportTypes) {
  161. this.exportType = type
  162. },
  163. setDrawAreaFocus(status: boolean) {
  164. this.drawAreaFocus = status
  165. },
  166. // setDisableHotkeysState(disable: boolean) {
  167. // this.disableHotkeys = disable
  168. // },
  169. // setGridLineSize(size: number) {
  170. // this.gridLineSize = size
  171. // },
  172. // setRulerState(show: boolean) {
  173. // this.showRuler = show
  174. // },
  175. // setClipingImageElementId(elId: string) {
  176. // this.clipingImageElementId = elId
  177. // },
  178. // setSelectedTableCells(cells: string[]) {
  179. // this.selectedTableCells = cells
  180. // },
  181. // setScalingState(isScaling: boolean) {
  182. // this.isScaling = isScaling
  183. // },
  184. updateSelectedTemplatesIndex(selectedTemplatesIndex: number[]) {
  185. this.selectedTemplatesIndex = selectedTemplatesIndex
  186. },
  187. // setDialogForColor(show: boolean) {
  188. // this.dialogForColor = show
  189. // },
  190. // saveDialogForColor(colors: string[]) {
  191. // this.dialogForColor = false
  192. // this.colorSelfStore.push(colors)
  193. // },
  194. // setDialogForTemplate(show: boolean) {
  195. // this.dialogForTemplate = show
  196. // },
  197. // setSelectPanelState(show: boolean) {
  198. // this.showSelectPanel = show
  199. // },
  200. setRunMode(runMode: number) {
  201. this.runMode = runMode
  202. },
  203. getRunMode() {
  204. return this.runMode
  205. }
  206. },
  207. })