@zhangqingcq/vgce 0.0.13 → 0.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/README.md +16 -2
  2. package/dist/style.css +1 -1
  3. package/dist/vgce.js +28 -34
  4. package/dist/vgce.umd.cjs +5 -5
  5. package/package.json +3 -2
  6. package/src/App.vue +11 -0
  7. package/src/assets/base.less +49 -0
  8. package/src/assets/icons/add.svg +1 -0
  9. package/src/assets/icons/delete.svg +12 -0
  10. package/src/assets/icons/export.svg +1 -0
  11. package/src/assets/icons/group.svg +13 -0
  12. package/src/assets/icons/import.svg +1 -0
  13. package/src/assets/icons/lock.svg +7 -0
  14. package/src/assets/icons/menu-fold.svg +9 -0
  15. package/src/assets/icons/menu-unfold.svg +9 -0
  16. package/src/assets/icons/preview.svg +6 -0
  17. package/src/assets/icons/redo.svg +8 -0
  18. package/src/assets/icons/return.svg +8 -0
  19. package/src/assets/icons/rotate.svg +1 -0
  20. package/src/assets/icons/save.svg +9 -0
  21. package/src/assets/icons/setting.svg +6 -0
  22. package/src/assets/icons/undo.svg +7 -0
  23. package/src/assets/icons/ungroup.svg +16 -0
  24. package/src/assets/icons/unlock.svg +7 -0
  25. package/src/assets/main.less +6 -0
  26. package/src/assets/svgs/alternator.svg +8 -0
  27. package/src/assets/svgs/bot-12.svg +1 -0
  28. package/src/assets/svgs/bot-2.svg +1 -0
  29. package/src/assets/svgs/bot-3.svg +1 -0
  30. package/src/assets/svgs/bot-7.svg +1 -0
  31. package/src/assets/svgs/bot-9.svg +94 -0
  32. package/src/assets/svgs/car.svg +1 -0
  33. package/src/assets/svgs/circuit-breaker.svg +11 -0
  34. package/src/assets/svgs/clock-a.svg +23 -0
  35. package/src/assets/svgs/common-table.svg +7 -0
  36. package/src/assets/svgs/el-button.svg +10 -0
  37. package/src/assets/svgs/el-tag.svg +13 -0
  38. package/src/assets/svgs/hospital.svg +1 -0
  39. package/src/assets/svgs/house.svg +1 -0
  40. package/src/assets/svgs/light.svg +24 -0
  41. package/src/assets/svgs/now-time.svg +9 -0
  42. package/src/assets/svgs/package.svg +1 -0
  43. package/src/assets/svgs/pie-charts.svg +10 -0
  44. package/src/assets/svgs/progress-a.svg +1 -0
  45. package/src/assets/svgs/reservoir.svg +10 -0
  46. package/src/assets/svgs/svg-text.svg +5 -0
  47. package/src/assets/svgs/switch-a.svg +5 -0
  48. package/src/assets/svgs/traction-transformer.svg +11 -0
  49. package/src/components/ace-edit/index.ts +27 -0
  50. package/src/components/config/index.ts +450 -0
  51. package/src/components/config/types.ts +25 -0
  52. package/src/components/svg-analysis/index.vue +11 -0
  53. package/src/components/svg-editor/center-panel/index.vue +867 -0
  54. package/src/components/svg-editor/center-panel/types.ts +11 -0
  55. package/src/components/svg-editor/component-tree/index.vue +33 -0
  56. package/src/components/svg-editor/connection-line/index.vue +125 -0
  57. package/src/components/svg-editor/connection-panel/index.vue +198 -0
  58. package/src/components/svg-editor/export-json/index.vue +37 -0
  59. package/src/components/svg-editor/handle-panel/index.vue +342 -0
  60. package/src/components/svg-editor/import-json/index.vue +37 -0
  61. package/src/components/svg-editor/index.vue +280 -0
  62. package/src/components/svg-editor/left-panel/index.vue +83 -0
  63. package/src/components/svg-editor/right-panel/code-edit-modal.vue +50 -0
  64. package/src/components/svg-editor/right-panel/common-animate.vue +96 -0
  65. package/src/components/svg-editor/right-panel/condition.vue +101 -0
  66. package/src/components/svg-editor/right-panel/dynamic-el-form-item.vue +97 -0
  67. package/src/components/svg-editor/right-panel/index.vue +304 -0
  68. package/src/components/svg-editor/right-panel/list.vue +86 -0
  69. package/src/components/svg-editor/top-panel/index.vue +139 -0
  70. package/src/components/svg-editor/types.ts +22 -0
  71. package/src/components/svg-viewer/index.vue +340 -0
  72. package/src/components/vue3-ruler-tool/index.vue +506 -0
  73. package/src/config/files/clock-a.vue +66 -0
  74. package/src/config/files/common-table.vue +49 -0
  75. package/src/config/files/light-a.vue +72 -0
  76. package/src/config/files/now-time.vue +53 -0
  77. package/src/config/files/pie-charts.vue +72 -0
  78. package/src/config/files/progress.vue +40 -0
  79. package/src/config/files/svg-text.vue +39 -0
  80. package/src/config/files/switch-a.vue +45 -0
  81. package/src/config/index.ts +28 -0
  82. package/src/config/svg/animation/index.ts +8 -0
  83. package/src/config/svg/animation/reservoir.ts +32 -0
  84. package/src/config/svg/custom/clock-a.ts +23 -0
  85. package/src/config/svg/custom/index.ts +11 -0
  86. package/src/config/svg/custom/light.ts +29 -0
  87. package/src/config/svg/custom/svg-text.ts +54 -0
  88. package/src/config/svg/custom/switch-a.ts +29 -0
  89. package/src/config/svg/index.ts +12 -0
  90. package/src/config/svg/stateful/circuit-breaker.ts +38 -0
  91. package/src/config/svg/stateful/index.ts +8 -0
  92. package/src/config/svg/stateless/alternator.ts +28 -0
  93. package/src/config/svg/stateless/bot-12.ts +22 -0
  94. package/src/config/svg/stateless/bot-2.ts +22 -0
  95. package/src/config/svg/stateless/bot-3.ts +22 -0
  96. package/src/config/svg/stateless/bot-7.ts +22 -0
  97. package/src/config/svg/stateless/bot-9.ts +22 -0
  98. package/src/config/svg/stateless/car.ts +22 -0
  99. package/src/config/svg/stateless/hospital.ts +22 -0
  100. package/src/config/svg/stateless/house.ts +22 -0
  101. package/src/config/svg/stateless/index.ts +30 -0
  102. package/src/config/svg/stateless/package.ts +22 -0
  103. package/src/config/svg/stateless/traction-transformer.ts +28 -0
  104. package/src/config/types.ts +126 -0
  105. package/src/config/vue/component/button.ts +57 -0
  106. package/src/config/vue/component/common-table.ts +124 -0
  107. package/src/config/vue/component/index.ts +13 -0
  108. package/src/config/vue/component/now-time.ts +29 -0
  109. package/src/config/vue/component/progress.ts +29 -0
  110. package/src/config/vue/component/tag.ts +46 -0
  111. package/src/config/vue/echarts/index.ts +8 -0
  112. package/src/config/vue/echarts/pie-charts.ts +60 -0
  113. package/src/config/vue/index.ts +5 -0
  114. package/src/hooks.ts +47 -0
  115. package/src/index.ts +14 -0
  116. package/src/main.ts +15 -0
  117. package/src/router.ts +24 -0
  118. package/src/stores/config/index.ts +44 -0
  119. package/src/stores/config/types.ts +27 -0
  120. package/src/stores/global/index.ts +109 -0
  121. package/src/stores/global/types.ts +115 -0
  122. package/src/stores/main.ts +10 -0
  123. package/src/stores/svg-edit-layout/index.ts +17 -0
  124. package/src/stores/svg-edit-layout/types.ts +8 -0
  125. package/src/stores/system/index.ts +174 -0
  126. package/src/stores/system/types.ts +43 -0
  127. package/src/utils/fetch.ts +351 -0
  128. package/src/utils/file-read-write.ts +26 -0
  129. package/src/utils/index.ts +397 -0
  130. package/src/utils/mqtt-net.ts +48 -0
  131. package/src/utils/proxy.ts +7 -0
  132. package/src/utils/scale-core.ts +214 -0
  133. package/src/utils/types.ts +13 -0
  134. package/src/views/EditorS.vue +18 -0
  135. package/src/views/Preview.vue +12 -0
@@ -0,0 +1,304 @@
1
+ <script setup lang="ts">
2
+ import {
3
+ ElCollapse,
4
+ ElCollapseItem,
5
+ ElColorPicker,
6
+ ElForm,
7
+ ElFormItem,
8
+ ElIcon,
9
+ ElInput,
10
+ ElInputNumber,
11
+ ElOption,
12
+ ElSelect,
13
+ ElSwitch,
14
+ ElTabPane,
15
+ ElTabs
16
+ } from 'element-plus'
17
+ import { ref } from 'vue'
18
+ import { pinia } from '@/hooks'
19
+ import { useConfigStore } from '@/stores/config'
20
+ import { useGlobalStore } from '@/stores/global'
21
+ import { numberArray } from '@/utils'
22
+ import { EGlobalStoreIntention } from '@/stores/global/types'
23
+ import type { IDoneJson } from '@/stores/global/types'
24
+ import DynamicElFormItem from './dynamic-el-form-item.vue'
25
+ import CommonAnimate from './common-animate.vue'
26
+ import ComponentTree from '@/components/svg-editor/component-tree/index.vue'
27
+ import SvgAnalysis from '@/components/svg-analysis/index.vue'
28
+ import List from '@/components/svg-editor/right-panel/list.vue'
29
+ import Condition from '@/components/svg-editor/right-panel/condition.vue'
30
+ import { ElButton } from 'element-plus'
31
+ import CodeEditModal from '@/components/svg-editor/right-panel/code-edit-modal.vue'
32
+ import { EConditionType, EEventAction, EEventType } from '@/config/types'
33
+ import type { IEventsItem } from '@/config/types'
34
+
35
+ const configStore = useConfigStore(pinia)
36
+ const globalStore = useGlobalStore(pinia)
37
+
38
+ const activeName = ref('page')
39
+ const activeNameB = ref('style')
40
+
41
+ const updateCommonAniVal = (item: IDoneJson | undefined, val: string) => {
42
+ if (item?.common_animations) {
43
+ item.common_animations.val = val
44
+ }
45
+ }
46
+
47
+ configStore.$subscribe((mutation, state) => {
48
+ if (mutation.storeId === 'config-store') {
49
+ localStorage.setItem('svg-editor-config', JSON.stringify(state))
50
+ }
51
+ })
52
+
53
+ const eventsActive = ref(numberArray(20))
54
+ const netActive = ref(['MQTT'])
55
+ const addEvent = ref()
56
+ addEvent.value = () => {
57
+ let a: IEventsItem = {
58
+ type: EEventType.Null,
59
+ action: EEventAction.Null,
60
+ target: '',
61
+ scripts: '',
62
+ condition: { type: EConditionType.None }
63
+ }
64
+
65
+ globalStore.handle_svg_info?.info?.events!.push(a)
66
+ }
67
+
68
+ const addEventList = (e: string, item: IEventsItem) => {
69
+ if (e === 'ChangeAttr') {
70
+ item.attrs = [
71
+ {
72
+ key: '',
73
+ val: ''
74
+ }
75
+ ]
76
+ } else {
77
+ delete item.attrs
78
+ }
79
+ }
80
+
81
+ const deleteE = (i: number) => {
82
+ globalStore.handle_svg_info?.info?.events!.splice(i, 1)
83
+ }
84
+ </script>
85
+
86
+ <template>
87
+ <el-tabs class="mx-2 rightTabs" v-if="globalStore.intention != EGlobalStoreIntention.Select" v-model="activeName">
88
+ <el-tab-pane label="图纸" name="page">
89
+ <el-form label-width="60px" label-position="left">
90
+ <el-form-item label="背景色" size="small">
91
+ <el-color-picker v-model="configStore.svg.background_color" />
92
+ </el-form-item>
93
+ <el-form-item label="x原点" size="small">
94
+ <el-input-number v-model="configStore.svg.position_center.x" />
95
+ </el-form-item>
96
+ <el-form-item label="y原点" size="small">
97
+ <el-input-number v-model="configStore.svg.position_center.y" />
98
+ </el-form-item>
99
+ <el-form-item label="网格" size="small">
100
+ <el-switch v-model="configStore.svg.grid" />
101
+ </el-form-item>
102
+ <el-form-item label="标尺" size="small">
103
+ <el-switch v-model="configStore.svg.ruler" />
104
+ </el-form-item>
105
+ <el-form-item label="缩放" size="small">
106
+ <el-input-number v-model="configStore.svg.scale" :step="0.1" step-strictly />
107
+ </el-form-item>
108
+ </el-form>
109
+ </el-tab-pane>
110
+ <el-tab-pane label="通信" name="net">
111
+ <el-collapse v-model="netActive">
112
+ <el-collapse-item name="MQTT">
113
+ <template #title>
114
+ <span style="font-weight: bold">MQTT</span>
115
+ </template>
116
+ <el-form label-width="60px" label-position="left">
117
+ <el-form-item label="URL" size="small">
118
+ <el-input v-model="configStore.net.mqtt.url" placeholder="如 ws://127.0.0.1:4500" />
119
+ </el-form-item>
120
+ <el-form-item label="用户名" size="small">
121
+ <el-input v-model="configStore.net.mqtt.user" placeholder="username" />
122
+ </el-form-item>
123
+ <el-form-item label="密码" size="small">
124
+ <el-input v-model="configStore.net.mqtt.pwd" placeholder="password" />
125
+ </el-form-item>
126
+ <el-form-item label="Topics" size="small">
127
+ <el-input v-model="configStore.net.mqtt.topics" placeholder="topics" />
128
+ </el-form-item>
129
+ </el-form>
130
+ </el-collapse-item>
131
+ </el-collapse>
132
+ </el-tab-pane>
133
+ <el-tab-pane label="连线" name="line">
134
+ <el-form label-width="60px" label-position="left" v-if="configStore.connection_line.props">
135
+ <dynamic-el-form-item :obj-info="configStore.connection_line.props" :hide="['point_position']" />
136
+ </el-form>
137
+ <el-form label-width="60px" label-position="left" v-if="configStore.connection_line.animations">
138
+ <dynamic-el-form-item :obj-info="configStore.connection_line.animations" />
139
+ </el-form>
140
+ </el-tab-pane>
141
+ <el-tab-pane label="结构" name="tree">
142
+ <component-tree />
143
+ </el-tab-pane>
144
+ </el-tabs>
145
+ <el-tabs
146
+ class="mx-2 rightTabs"
147
+ v-else-if="globalStore.intention == EGlobalStoreIntention.Select && globalStore.handle_svg_info"
148
+ v-model="activeNameB"
149
+ >
150
+ <el-tab-pane label="外观" name="style">
151
+ <el-form label-width="60px" label-position="left">
152
+ <el-form-item label="标题" size="small">
153
+ <el-input v-model="globalStore.handle_svg_info!.info.title" />
154
+ </el-form-item>
155
+ <el-form-item label="x坐标" size="small">
156
+ <el-input-number v-model="globalStore.handle_svg_info!.info.x" />
157
+ </el-form-item>
158
+ <el-form-item label="y坐标" size="small">
159
+ <el-input-number v-model="globalStore.handle_svg_info!.info.y" />
160
+ </el-form-item>
161
+ <el-form-item label="显示" size="small">
162
+ <el-switch v-model="globalStore.handle_svg_info!.info.display" />
163
+ </el-form-item>
164
+ </el-form>
165
+ </el-tab-pane>
166
+ <el-tab-pane label="事件" name="event">
167
+ <el-button type="primary" style="width: 100%" @click="addEvent">添加事件</el-button>
168
+ <el-collapse v-model="eventsActive">
169
+ <el-collapse-item :name="i" v-for="(item, i) in globalStore.handle_svg_info!.info!.events" :key="'event' + i">
170
+ <template #title>
171
+ <div class="events-title">
172
+ <span>事件{{ i + 1 }}</span>
173
+ <el-icon :size="16" class="bt-Icon" @click.stop="deleteE(i)">
174
+ <svg-analysis name="delete" />
175
+ </el-icon>
176
+ </div>
177
+ </template>
178
+ <el-form label-width="90px" label-position="left">
179
+ <el-form-item label="类型" size="small">
180
+ <el-select v-model="item.type">
181
+ <el-option value="Click" label="点击" />
182
+ <el-option value="Change" label="值改变" />
183
+ </el-select>
184
+ </el-form-item>
185
+ <el-form-item label="行为" size="small">
186
+ <el-select v-model="item.action" @change="addEventList($event, item)">
187
+ <el-option value="ChangeAttr" label="改变属性" />
188
+ <el-option value="JavaScript" label="执行JavaScript" />
189
+ </el-select>
190
+ </el-form-item>
191
+
192
+ <el-form-item label="目标" size="small" v-if="item.action === 'ChangeAttr'">
193
+ <el-input v-model="item.target" placeholder="默认自身" />
194
+ </el-form-item>
195
+ <list v-if="item.action === 'ChangeAttr'" v-model="item.attrs" />
196
+
197
+ <el-form-item label="JavaScript" size="small" v-if="item.action === 'JavaScript'">
198
+ <code-edit-modal v-model="item.scripts" lang="javascript" />
199
+ </el-form-item>
200
+ <condition v-model="item.condition" />
201
+ </el-form>
202
+ </el-collapse-item>
203
+ </el-collapse>
204
+ </el-tab-pane>
205
+ <el-tab-pane label="动效" name="animation">
206
+ <el-form label-width="60px" label-position="left" v-if="globalStore.handle_svg_info?.info.animations">
207
+ <dynamic-el-form-item :obj-info="globalStore.handle_svg_info!.info.animations"></dynamic-el-form-item>
208
+ </el-form>
209
+ <el-form label-width="60px" label-position="left" v-else-if="globalStore.handle_svg_info!.info.common_animations">
210
+ <el-form-item label="动画效果" size="small">
211
+ <common-animate
212
+ @update-common-ani-val="(val: string) => updateCommonAniVal(globalStore.handle_svg_info?.info, val)"
213
+ :val="globalStore.handle_svg_info!.info.common_animations.val"
214
+ ></common-animate>
215
+ </el-form-item>
216
+ <el-form-item label="延迟" size="small">
217
+ <el-select v-model="globalStore.handle_svg_info!.info.common_animations.delay">
218
+ <el-option value="delay-0s" label="无" />
219
+ <el-option value="delay-1s" label="1秒" />
220
+ <el-option value="delay-2s" label="2秒" />
221
+ <el-option value="delay-3s" label="3秒" />
222
+ <el-option value="delay-4s" label="4秒" />
223
+ <el-option value="delay-5s" label="5秒" />
224
+ </el-select>
225
+ </el-form-item>
226
+ <el-form-item label="动画速度" size="small">
227
+ <el-select v-model="globalStore.handle_svg_info!.info.common_animations.speed">
228
+ <el-option value="slow" label="慢" />
229
+ <el-option value="slower" label="最慢" />
230
+ <el-option value="fast" label="快" />
231
+ <el-option value="faster" label="最快" />
232
+ </el-select>
233
+ </el-form-item>
234
+ <el-form-item label="循环次数" size="small">
235
+ <el-select v-model="globalStore.handle_svg_info!.info.common_animations.repeat">
236
+ <el-option value="repeat-1" label="一次" />
237
+ <el-option value="repeat-2" label="两次" />
238
+ <el-option value="repeat-3" label="三次" />
239
+ <el-option value="infinite" label="无限次" />
240
+ </el-select>
241
+ </el-form-item>
242
+ </el-form>
243
+ </el-tab-pane>
244
+ <el-tab-pane label="数据" name="data">
245
+ <el-form label-width="90px" label-position="left">
246
+ <el-form-item label="ID" size="small">
247
+ <el-input v-model="globalStore.handle_svg_info!.info.id" />
248
+ </el-form-item>
249
+ <div
250
+ v-for="(e, k) in globalStore.handle_svg_info!.info.state"
251
+ :key="'state' + k"
252
+ v-if="globalStore.handle_svg_info!.info.state"
253
+ >
254
+ <el-form-item class="props-row" :label="String(k)" size="small"> {{ e?.default }}</el-form-item>
255
+
256
+ <el-form-item
257
+ v-if="k === 'OnOff'"
258
+ :label="globalStore.handle_svg_info!.info.state?.OnOff!.title"
259
+ size="small"
260
+ >
261
+ <el-switch v-model="globalStore.handle_svg_info!.info.state!.OnOff!.default"></el-switch>
262
+ </el-form-item>
263
+ </div>
264
+
265
+ <div v-if="globalStore.handle_svg_info!.info?.hasOwnProperty('tag_slot')">
266
+ <el-form-item class="props-row" label="tag_slot" size="small">
267
+ {{ globalStore.handle_svg_info!.info.tag_slot }}
268
+ </el-form-item>
269
+ <el-form-item label="文字插槽" size="small">
270
+ <el-input v-model="globalStore.handle_svg_info!.info.tag_slot" />
271
+ </el-form-item>
272
+ </div>
273
+ <dynamic-el-form-item :obj-info="globalStore.handle_svg_info!.info.props" code />
274
+ </el-form>
275
+ </el-tab-pane>
276
+ <el-tab-pane label="结构" name="tree">
277
+ <component-tree />
278
+ </el-tab-pane>
279
+ </el-tabs>
280
+ </template>
281
+
282
+ <style scoped lang="less">
283
+ .events-title {
284
+ width: calc(~'100% - 28px');
285
+ display: flex;
286
+ align-items: center;
287
+
288
+ > span {
289
+ font-weight: bold;
290
+ }
291
+
292
+ > i {
293
+ margin-left: 15px;
294
+ }
295
+ }
296
+ </style>
297
+
298
+ <style lang="less">
299
+ .rightTabs {
300
+ .el-tabs__item {
301
+ padding: 0 10px;
302
+ }
303
+ }
304
+ </style>
@@ -0,0 +1,86 @@
1
+ <script setup lang="ts">
2
+ import type { IAttrItem } from '@/config/types'
3
+ import { ElIcon, ElInput } from 'element-plus'
4
+ import SvgAnalysis from '@/components/svg-analysis/index.vue'
5
+ import { computed } from 'vue'
6
+
7
+ const props = withDefaults(defineProps<{ modelValue: IAttrItem[] }>(), {
8
+ modelValue: () => [
9
+ {
10
+ key: '',
11
+ val: ''
12
+ }
13
+ ]
14
+ })
15
+ const emit = defineEmits(['update:modelValue'])
16
+
17
+ const value = computed({
18
+ get() {
19
+ return props.modelValue
20
+ },
21
+ set(val) {
22
+ emit('update:modelValue', val)
23
+ }
24
+ })
25
+
26
+ const addL = () => {
27
+ value.value.push({
28
+ key: '',
29
+ val: ''
30
+ })
31
+ }
32
+
33
+ const deleteL = (i: number) => {
34
+ value.value.splice(i, 1)
35
+ }
36
+ </script>
37
+
38
+ <template>
39
+ <div class="wall-l">
40
+ <div class="head-l">
41
+ <span>key</span>
42
+ <span>value</span>
43
+
44
+ <el-icon :size="16" class="bt-Icon" @click="addL">
45
+ <svg-analysis name="add" />
46
+ </el-icon>
47
+ </div>
48
+ <div class="row-l" v-for="(item, i) of value">
49
+ <el-input class="content-l" v-model="item.key" size="small" placeholder="key" />
50
+ <el-input class="content-l" v-model="item.val" size="small" placeholder="value" />
51
+
52
+ <el-icon :size="16" class="bt-Icon" @click="deleteL(i)">
53
+ <svg-analysis name="delete" />
54
+ </el-icon>
55
+ </div>
56
+ </div>
57
+ </template>
58
+
59
+ <style lang="less" scoped>
60
+ .wall-l {
61
+ background-color: #f3f6f9;
62
+ padding: 4px 5px 2px 5px;
63
+ border-radius: 4px;
64
+ .head-l {
65
+ display: flex;
66
+ align-items: center;
67
+
68
+ span {
69
+ display: inline-block;
70
+ width: 42%;
71
+ margin-right: 10px;
72
+ color: #666;
73
+ }
74
+ }
75
+
76
+ .row-l {
77
+ display: flex;
78
+ align-items: center;
79
+ padding-bottom: 6px;
80
+ .content-l {
81
+ width: 42%;
82
+ margin-right: 10px;
83
+ }
84
+ }
85
+ }
86
+ </style>
@@ -0,0 +1,139 @@
1
+ <script setup lang="ts">
2
+ import { pinia } from '@/hooks'
3
+ import { useConfigStore } from '@/stores/config'
4
+ import { useGlobalStore } from '@/stores/global'
5
+ import { useEditPrivateStore } from '@/stores/system'
6
+ import { ElIcon, ElDivider } from 'element-plus'
7
+ import SvgAnalysis from '../../svg-analysis/index.vue'
8
+ import { useSvgEditLayoutStore } from '@/stores/svg-edit-layout'
9
+ import { EVisibleConfKey } from '../types'
10
+ import type { IDataModel } from '../types'
11
+ import { EGlobalStoreIntention } from '@/stores/global/types'
12
+
13
+ const svgEditLayoutStore = useSvgEditLayoutStore(pinia)
14
+ const globalStore = useGlobalStore(pinia)
15
+ const editPrivateStore = useEditPrivateStore(pinia)
16
+ const configStore = useConfigStore(pinia)
17
+ const emits = defineEmits(['changeVisible', 'onReturn', 'onPreview', 'onSave'])
18
+ const onDeleteBtnClick = () => {
19
+ globalStore.done_json.length <= 0 || globalStore.setDoneJson([])
20
+ globalStore.intention = EGlobalStoreIntention.None
21
+ }
22
+ const onPreviewClick = () => {
23
+ const data_model: IDataModel = {
24
+ layout_center: svgEditLayoutStore.center_offset,
25
+ config: configStore.$state,
26
+ done_json: globalStore.done_json
27
+ }
28
+ emits('onPreview', data_model)
29
+ }
30
+ const onSaveClick = () => {
31
+ const data_model: IDataModel = {
32
+ layout_center: svgEditLayoutStore.center_offset,
33
+ config: configStore.$state,
34
+ done_json: globalStore.done_json
35
+ }
36
+ emits('onSave', data_model)
37
+ }
38
+ </script>
39
+
40
+ <template>
41
+ <div class="flex justify-between" style="width: 100%">
42
+ <div class="flex items-center justify-between" style="width: 220px">
43
+ <div class="flex items-center"><span class="logo-title">组态编辑器</span></div>
44
+ <el-icon :size="24" class="bt-Icon" @click="svgEditLayoutStore.left_nav = !svgEditLayoutStore.left_nav">
45
+ <svg-analysis v-if="svgEditLayoutStore.left_nav" name="menu-unfold" />
46
+ <svg-analysis v-else name="menu-fold" />
47
+ </el-icon>
48
+ </div>
49
+ <div class="flex justify-between" style="width: calc(100% - 440px)">
50
+ <div class="flex items-center">
51
+ <el-icon
52
+ title="撤销 ctrl+z"
53
+ :size="20"
54
+ :class="`${editPrivateStore.getTopBtnUndoStatus ? 'bt-Icon' : 'icon-disable'} ml-20px`"
55
+ @click="() => editPrivateStore.topUndoBtnClick()"
56
+ >
57
+ <svg-analysis name="undo" />
58
+ </el-icon>
59
+ <el-icon
60
+ title="重做 ctrl+shift+z"
61
+ :class="`${editPrivateStore.getTopBtnRedoStatus ? 'bt-Icon' : 'icon-disable'} ml-5px`"
62
+ :size="20"
63
+ @click="() => editPrivateStore.topRedoBtnClick()"
64
+ >
65
+ <svg-analysis name="redo" />
66
+ </el-icon>
67
+ <el-divider direction="vertical"></el-divider>
68
+ <el-icon
69
+ title="清空 ctrl+delete"
70
+ :class="`${globalStore.done_json.length > 0 ? 'bt-Icon' : 'icon-disable'}`"
71
+ :size="20"
72
+ @click="onDeleteBtnClick"
73
+ >
74
+ <svg-analysis name="delete" />
75
+ </el-icon>
76
+ <el-divider direction="vertical" />
77
+ <el-icon
78
+ title="导入数据模型"
79
+ class="bt-Icon"
80
+ :size="20"
81
+ @click="emits('changeVisible', EVisibleConfKey.ImportJson, true)"
82
+ >
83
+ <svg-analysis name="import" />
84
+ </el-icon>
85
+ <el-icon
86
+ title="导出数据模型"
87
+ :size="20"
88
+ class="bt-Icon ml-5px"
89
+ @click="emits('changeVisible', EVisibleConfKey.ExportJson, true)"
90
+ >
91
+ <svg-analysis name="export" />
92
+ </el-icon>
93
+ <!-- <el-divider direction="vertical"></el-divider>
94
+ <el-icon title="组合" class="bt-Icon" :size="20">
95
+ <svg-analysis name="group"/>
96
+ </el-icon>
97
+ <el-divider direction="vertical"></el-divider>
98
+ <el-icon title="取消组合" class="bt-Icon" :size="20">
99
+ <svg-analysis name="ungroup"/>
100
+ </el-icon>
101
+ <el-divider direction="vertical"></el-divider>
102
+ <el-icon title="锁定" class="bt-Icon" :size="20">
103
+ <svg-analysis name="lock"/>
104
+ </el-icon> -->
105
+ </div>
106
+ <div class="flex items-center mr-20px">
107
+ <el-icon title="返回" class="bt-Icon" :size="20" @click="emits('onReturn')">
108
+ <svg-analysis name="return" />
109
+ </el-icon>
110
+ <el-divider direction="vertical"></el-divider>
111
+ <el-icon title="保存" class="bt-Icon" :size="20" @click="onSaveClick">
112
+ <svg-analysis name="save" />
113
+ </el-icon>
114
+ <el-divider direction="vertical"></el-divider>
115
+ <el-icon title="预览" class="bt-Icon" :size="22" @click="onPreviewClick">
116
+ <svg-analysis name="preview" />
117
+ </el-icon>
118
+ </div>
119
+ </div>
120
+ <div class="flex items-center" style="width: 220px">
121
+ <el-icon :size="24" class="bt-Icon" @click="svgEditLayoutStore.right_nav = !svgEditLayoutStore.right_nav">
122
+ <svg-analysis v-if="svgEditLayoutStore.right_nav" name="menu-fold" />
123
+ <svg-analysis v-else name="menu-unfold" />
124
+ </el-icon>
125
+ </div>
126
+ </div>
127
+ </template>
128
+
129
+ <style scoped lang="less">
130
+ .logo-title {
131
+ font-size: 15px;
132
+ font-weight: 600;
133
+ }
134
+
135
+ .icon-disable {
136
+ cursor: not-allowed;
137
+ color: #ccc;
138
+ }
139
+ </style>
@@ -0,0 +1,22 @@
1
+ import type { IPositionCenterSvg, INet } from '@/stores/config/types'
2
+ import type { IDoneJson } from '@/stores/global/types'
3
+ import type { ISystemStraightLine } from '@/components/config/types'
4
+
5
+ export type IVisibleConf = {
6
+ [key in EVisibleConfKey]: boolean
7
+ }
8
+
9
+ export enum EVisibleConfKey {
10
+ ImportJson = 'ImportJson',
11
+ ExportJson = 'ExportJson',
12
+ ImportFile = 'ImportFile'
13
+ }
14
+
15
+ export interface IDataModel {
16
+ layout_center: {
17
+ x: number
18
+ y: number
19
+ }
20
+ config: { svg: IPositionCenterSvg; connection_line: ISystemStraightLine; net: INet }
21
+ done_json: IDoneJson[]
22
+ }