@zhangqingcq/vgce 0.0.14 → 0.0.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. package/README.md +38 -3
  2. package/dist/vgce.js +5040 -5305
  3. package/dist/vgce.umd.cjs +43 -143
  4. package/package.json +3 -2
  5. package/src/App.vue +11 -0
  6. package/src/assets/base.less +49 -0
  7. package/src/assets/icons/add.svg +1 -0
  8. package/src/assets/icons/delete.svg +12 -0
  9. package/src/assets/icons/export.svg +1 -0
  10. package/src/assets/icons/group.svg +13 -0
  11. package/src/assets/icons/import.svg +1 -0
  12. package/src/assets/icons/lock.svg +7 -0
  13. package/src/assets/icons/menu-fold.svg +9 -0
  14. package/src/assets/icons/menu-unfold.svg +9 -0
  15. package/src/assets/icons/preview.svg +6 -0
  16. package/src/assets/icons/redo.svg +8 -0
  17. package/src/assets/icons/return.svg +8 -0
  18. package/src/assets/icons/rotate.svg +1 -0
  19. package/src/assets/icons/save.svg +9 -0
  20. package/src/assets/icons/setting.svg +6 -0
  21. package/src/assets/icons/undo.svg +7 -0
  22. package/src/assets/icons/ungroup.svg +16 -0
  23. package/src/assets/icons/unlock.svg +7 -0
  24. package/src/assets/main.less +6 -0
  25. package/src/assets/svgs/alternator.svg +8 -0
  26. package/src/assets/svgs/bot-2.svg +1 -0
  27. package/src/assets/svgs/circuit-breaker.svg +11 -0
  28. package/src/assets/svgs/clock-a.svg +23 -0
  29. package/src/assets/svgs/common-table.svg +7 -0
  30. package/src/assets/svgs/el-button.svg +10 -0
  31. package/src/assets/svgs/el-tag.svg +13 -0
  32. package/src/assets/svgs/house.svg +1 -0
  33. package/src/assets/svgs/light.svg +24 -0
  34. package/src/assets/svgs/now-time.svg +9 -0
  35. package/src/assets/svgs/package.svg +1 -0
  36. package/src/assets/svgs/pie-charts.svg +10 -0
  37. package/src/assets/svgs/progress-a.svg +1 -0
  38. package/src/assets/svgs/reservoir.svg +10 -0
  39. package/src/assets/svgs/svg-text.svg +5 -0
  40. package/src/assets/svgs/switch-a.svg +5 -0
  41. package/src/components/ace-edit/index.ts +27 -0
  42. package/src/components/config/index.ts +450 -0
  43. package/src/components/config/types.ts +25 -0
  44. package/src/components/svg-analysis/index.vue +11 -0
  45. package/src/components/svg-editor/center-panel/index.vue +867 -0
  46. package/src/components/svg-editor/center-panel/types.ts +11 -0
  47. package/src/components/svg-editor/component-tree/index.vue +33 -0
  48. package/src/components/svg-editor/connection-line/index.vue +125 -0
  49. package/src/components/svg-editor/connection-panel/index.vue +198 -0
  50. package/src/components/svg-editor/export-json/index.vue +37 -0
  51. package/src/components/svg-editor/handle-panel/index.vue +342 -0
  52. package/src/components/svg-editor/import-json/index.vue +37 -0
  53. package/src/components/svg-editor/index.vue +280 -0
  54. package/src/components/svg-editor/left-panel/index.vue +83 -0
  55. package/src/components/svg-editor/right-panel/code-edit-modal.vue +50 -0
  56. package/src/components/svg-editor/right-panel/common-animate.vue +96 -0
  57. package/src/components/svg-editor/right-panel/condition.vue +101 -0
  58. package/src/components/svg-editor/right-panel/dynamic-el-form-item.vue +97 -0
  59. package/src/components/svg-editor/right-panel/index.vue +304 -0
  60. package/src/components/svg-editor/right-panel/list.vue +86 -0
  61. package/src/components/svg-editor/top-panel/index.vue +139 -0
  62. package/src/components/svg-editor/types.ts +22 -0
  63. package/src/components/svg-viewer/index.vue +340 -0
  64. package/src/components/vue3-ruler-tool/index.vue +506 -0
  65. package/src/config/files/clock-a.vue +66 -0
  66. package/src/config/files/common-table.vue +49 -0
  67. package/src/config/files/light-a.vue +72 -0
  68. package/src/config/files/now-time.vue +53 -0
  69. package/src/config/files/pie-charts.vue +72 -0
  70. package/src/config/files/progress.vue +40 -0
  71. package/src/config/files/svg-text.vue +39 -0
  72. package/src/config/files/switch-a.vue +45 -0
  73. package/src/config/index.ts +28 -0
  74. package/src/config/svg/animation/index.ts +8 -0
  75. package/src/config/svg/animation/reservoir.ts +32 -0
  76. package/src/config/svg/custom/clock-a.ts +23 -0
  77. package/src/config/svg/custom/index.ts +11 -0
  78. package/src/config/svg/custom/light.ts +29 -0
  79. package/src/config/svg/custom/svg-text.ts +54 -0
  80. package/src/config/svg/custom/switch-a.ts +29 -0
  81. package/src/config/svg/index.ts +12 -0
  82. package/src/config/svg/stateful/circuit-breaker.ts +38 -0
  83. package/src/config/svg/stateful/index.ts +8 -0
  84. package/src/config/svg/stateless/alternator.ts +28 -0
  85. package/src/config/svg/stateless/bot-2.ts +22 -0
  86. package/src/config/svg/stateless/house.ts +22 -0
  87. package/src/config/svg/stateless/index.ts +14 -0
  88. package/src/config/types.ts +126 -0
  89. package/src/config/vue/component/button.ts +57 -0
  90. package/src/config/vue/component/common-table.ts +124 -0
  91. package/src/config/vue/component/index.ts +13 -0
  92. package/src/config/vue/component/now-time.ts +29 -0
  93. package/src/config/vue/component/progress.ts +29 -0
  94. package/src/config/vue/component/tag.ts +46 -0
  95. package/src/config/vue/echarts/index.ts +8 -0
  96. package/src/config/vue/echarts/pie-charts.ts +60 -0
  97. package/src/config/vue/index.ts +5 -0
  98. package/src/hooks.ts +47 -0
  99. package/src/index.ts +14 -0
  100. package/src/main.ts +15 -0
  101. package/src/router.ts +24 -0
  102. package/src/stores/config/index.ts +44 -0
  103. package/src/stores/config/types.ts +27 -0
  104. package/src/stores/global/index.ts +109 -0
  105. package/src/stores/global/types.ts +115 -0
  106. package/src/stores/main.ts +10 -0
  107. package/src/stores/svg-edit-layout/index.ts +17 -0
  108. package/src/stores/svg-edit-layout/types.ts +8 -0
  109. package/src/stores/system/index.ts +174 -0
  110. package/src/stores/system/types.ts +43 -0
  111. package/src/utils/fetch.ts +351 -0
  112. package/src/utils/file-read-write.ts +26 -0
  113. package/src/utils/index.ts +397 -0
  114. package/src/utils/mqtt-net.ts +48 -0
  115. package/src/utils/proxy.ts +7 -0
  116. package/src/utils/scale-core.ts +214 -0
  117. package/src/utils/types.ts +13 -0
  118. package/src/views/EditorS.vue +18 -0
  119. package/src/views/Preview.vue +12 -0
@@ -0,0 +1,109 @@
1
+ import { defineStore } from 'pinia'
2
+ import { nextTick } from 'vue'
3
+ import { config } from '@/config'
4
+ import type { IConfigItem } from '@/config/types'
5
+ import { isOfType, objectDeepClone, setSvgActualInfo } from '@/utils'
6
+ import { EGlobalStoreIntention, EMouseInfoState, EScaleInfoType } from './types'
7
+ import type { IDoneJson, IGlobalStore, IMouseInfo, IScaleInfo } from './types'
8
+ import { useHistoryRecord } from '@/hooks'
9
+
10
+ /**
11
+ * 全局共享状态
12
+ */
13
+ export const useGlobalStore = defineStore('global-store', {
14
+ state: (): IGlobalStore => {
15
+ return {
16
+ config_center: config,
17
+ intention: EGlobalStoreIntention.None,
18
+ create_svg_info: null,
19
+ done_json: [],
20
+ mouse_info: {
21
+ state: EMouseInfoState.Up,
22
+ position_x: 0,
23
+ position_y: 0,
24
+ now_position_x: 0,
25
+ now_position_y: 0,
26
+ new_position_x: 0,
27
+ new_position_y: 0
28
+ },
29
+ handle_svg_info: null,
30
+ scale_info: {
31
+ type: EScaleInfoType.None,
32
+ scale_times: {
33
+ x: 1,
34
+ y: 1
35
+ },
36
+ scale_item_info: {
37
+ x: 0,
38
+ y: 0
39
+ },
40
+ symmetric_point: {
41
+ x: 0,
42
+ y: 0
43
+ }
44
+ },
45
+ rotate_info: {
46
+ angle: 0
47
+ },
48
+ connection_line_node_info: {
49
+ init_pos: {
50
+ x: 0,
51
+ y: 0
52
+ },
53
+ point_index: 0
54
+ }
55
+ }
56
+ },
57
+ getters: {},
58
+ actions: {
59
+ setCreateInfo(create_svg_info: IConfigItem | null) {
60
+ this.intention = EGlobalStoreIntention.Create
61
+ this.create_svg_info = create_svg_info
62
+ },
63
+ setDoneJson(done_json: IDoneJson[] | IDoneJson) {
64
+ // 有id的组件
65
+ if (isOfType(done_json, 'id')) {
66
+ this.done_json.push(done_json)
67
+ nextTick(() => {
68
+ // 设置组件在画布中的属性(位置和宽高)
69
+ setSvgActualInfo(done_json)
70
+ })
71
+ } else {
72
+ this.done_json = objectDeepClone<IDoneJson[]>(done_json)
73
+ }
74
+ nextTick(() => {
75
+ //压入历史操作记录
76
+ useHistoryRecord(objectDeepClone<IDoneJson[]>(this.done_json))
77
+ })
78
+ },
79
+ setMouseInfo(mouse_info: IMouseInfo) {
80
+ this.mouse_info = mouse_info
81
+ },
82
+ setHandleSvgInfo(info: IDoneJson | null, index?: number) {
83
+ let current_index = index
84
+ if (info) {
85
+ if (!current_index && current_index != 0) {
86
+ //如果索引没传 在这根据id查出索引
87
+ current_index = this.done_json.findIndex((f) => f.id === info.id) ?? -1
88
+ }
89
+ this.handle_svg_info = {
90
+ info: info,
91
+ index: current_index
92
+ }
93
+ } else {
94
+ this.handle_svg_info = info
95
+ }
96
+ },
97
+ setScaleInfo(info: IScaleInfo) {
98
+ this.scale_info = info
99
+ },
100
+ spliceDoneJson(index: number) {
101
+ const globalStore = useGlobalStore()
102
+ globalStore.done_json.splice(index, 1)
103
+ useHistoryRecord(globalStore.done_json)
104
+ }
105
+ }
106
+ })
107
+ // useGlobalStore().$subscribe((mutation, state) => {
108
+ // console.log(mutation, state, 102);
109
+ // });
@@ -0,0 +1,115 @@
1
+ import type { IConfig, IConfigItem } from '@/config/types'
2
+
3
+ export interface IGlobalStore {
4
+ config_center: IConfig
5
+ intention: EGlobalStoreIntention
6
+ create_svg_info: IConfigItem | null
7
+ done_json: IDoneJson[]
8
+ mouse_info: IMouseInfo
9
+ handle_svg_info: IHandleSvgInfo | null
10
+ scale_info: IScaleInfo
11
+ rotate_info: IRotateInfo
12
+ connection_line_node_info: IConnectionLineNodeInfo
13
+ }
14
+ export interface IDoneJson extends IConfigItem {
15
+ id: string
16
+ x: number
17
+ y: number
18
+ client: ICoordinate
19
+ scale_x: number
20
+ scale_y: number
21
+ rotate: number
22
+ actual_bound: {
23
+ x: number
24
+ y: number
25
+ width: number
26
+ height: number
27
+ }
28
+ point_coordinate: {
29
+ tl: ICoordinate
30
+ tc: ICoordinate
31
+ tr: ICoordinate
32
+ l: ICoordinate
33
+ r: ICoordinate
34
+ bl: ICoordinate
35
+ bc: ICoordinate
36
+ br: ICoordinate
37
+ }
38
+ }
39
+ export enum EGlobalStoreIntention {
40
+ None = 'None',
41
+ Create = 'Create',
42
+ Move = 'Move',
43
+ MoveCanvas = 'MoveCanvas',
44
+ Select = 'Select',
45
+ Zoom = 'Zoom',
46
+ Rotate = 'Rotate',
47
+ Connection = 'Connection',
48
+ SetConnectionLineNode = 'SetConnectionLineNode',
49
+ ContextMenu = 'ContextMenu'
50
+ }
51
+ export interface IMouseInfo {
52
+ state: EMouseInfoState
53
+ position_x: number //鼠标指针坐标
54
+ position_y: number
55
+ now_position_x: number //当前目标的坐标
56
+ now_position_y: number
57
+ new_position_x: number //移动之后目标的坐标
58
+ new_position_y: number
59
+ }
60
+ export enum EMouseInfoState {
61
+ Down = 'Down',
62
+ Up = 'Up'
63
+ }
64
+ export interface IHandleSvgInfo {
65
+ info: IDoneJson
66
+ index: number
67
+ }
68
+ /**
69
+ * 缩放信息
70
+ */
71
+ export interface IScaleInfo {
72
+ type: EScaleInfoType
73
+ scale_times: {
74
+ //点击缩放时当前组件的缩放倍数
75
+ x: number
76
+ y: number
77
+ }
78
+ scale_item_info: {
79
+ x: number
80
+ y: number
81
+ }
82
+ symmetric_point: {
83
+ //缩放前缩放手柄对应组件中心坐标的对称点坐标
84
+ x: number
85
+ y: number
86
+ }
87
+ }
88
+ /**
89
+ * 旋转信息
90
+ */
91
+ export interface IRotateInfo {
92
+ angle: number
93
+ }
94
+ export enum EScaleInfoType {
95
+ None = '',
96
+ TopLeft = 'TopLeft',
97
+ TopCenter = 'TopCenter',
98
+ TopRight = 'TopRight',
99
+ Left = 'Left',
100
+ Right = 'Right',
101
+ BottomLeft = 'BottomLeft',
102
+ BottomCenter = 'BottomCenter',
103
+ BottomRight = 'BottomRight'
104
+ }
105
+ export interface ICoordinate {
106
+ x: number
107
+ y: number
108
+ }
109
+ export interface IConnectionLineNodeInfo {
110
+ init_pos: {
111
+ x: number
112
+ y: number
113
+ }
114
+ point_index: number
115
+ }
@@ -0,0 +1,10 @@
1
+ import { defineStore } from 'pinia'
2
+ import { ref } from 'vue'
3
+
4
+ export const useStore = defineStore('main', () => {
5
+ const data = ref()
6
+
7
+ return {
8
+ data
9
+ }
10
+ })
@@ -0,0 +1,17 @@
1
+ import { defineStore } from 'pinia'
2
+ import type { ISvgEditLayoutStore } from './types'
3
+ /**
4
+ * 编辑器布局状态
5
+ */
6
+ export const useSvgEditLayoutStore = defineStore('svg-edit-layout-store', {
7
+ state: (): ISvgEditLayoutStore => {
8
+ return {
9
+ left_nav: true,
10
+ right_nav: true,
11
+ center_offset: {
12
+ x: 0,
13
+ y: 0
14
+ }
15
+ }
16
+ }
17
+ })
@@ -0,0 +1,8 @@
1
+ export interface ISvgEditLayoutStore {
2
+ left_nav: boolean
3
+ right_nav: boolean
4
+ center_offset: {
5
+ x: number
6
+ y: number
7
+ }
8
+ }
@@ -0,0 +1,174 @@
1
+ import { objectDeepClone, randomString } from '@/utils'
2
+ import { defineStore } from 'pinia'
3
+ import { useGlobalStore } from '../global'
4
+ import type { IDoneJson } from '../global/types'
5
+ import { EGlobalStoreIntention } from '../global/types'
6
+ import type { ContextMenuStoreState, EditPrivateStoreState } from './types'
7
+ import { EContextMenuInfoType } from './types'
8
+ import { useHistoryRecord } from '@/hooks'
9
+
10
+ /**
11
+ * 编辑器私有状态
12
+ */
13
+ export const useEditPrivateStore = defineStore('edit-private-store', {
14
+ state: (): EditPrivateStoreState => {
15
+ return {
16
+ old_done_components: [], //记录预览之前的组件数据
17
+ history_doneComponent: [],
18
+ history_now_index: 0,
19
+ is_record_history: true, //是否需要记录当前状态,如果是操作的历史记录,则不需要记录
20
+ max_record_times: 10
21
+ }
22
+ },
23
+ getters: {
24
+ getTopBtnUndoStatus(state) {
25
+ return state.history_now_index >= 1
26
+ },
27
+ getTopBtnRedoStatus(state) {
28
+ return state.history_now_index + 1 != state.history_doneComponent.length
29
+ }
30
+ },
31
+ actions: {
32
+ topUndoBtnClick() {
33
+ console.log('撤销')
34
+ if (this.history_now_index < 1) {
35
+ return
36
+ }
37
+ const global_store = useGlobalStore()
38
+ // select_component_info.value = {};
39
+ this.is_record_history = false
40
+ this.history_now_index -= 1
41
+ global_store.setDoneJson(this.history_doneComponent[this.history_now_index])
42
+ },
43
+ topRedoBtnClick() {
44
+ console.log('重做')
45
+ if (this.history_now_index + 1 == this.history_doneComponent.length) {
46
+ return
47
+ }
48
+ const global_store = useGlobalStore()
49
+ this.is_record_history = false
50
+ this.history_now_index += 1
51
+ global_store.setDoneJson(this.history_doneComponent[this.history_now_index])
52
+ }
53
+ }
54
+ })
55
+ export const useContextMenuStore = defineStore('context-menu-store', {
56
+ state: (): ContextMenuStoreState => {
57
+ return {
58
+ display: false,
59
+ info: {
60
+ [EContextMenuInfoType.Copy]: {
61
+ title: '复制',
62
+ hot_key: 'Ctrl+C',
63
+ enable: true
64
+ },
65
+ [EContextMenuInfoType.Delete]: {
66
+ title: '删除',
67
+ hot_key: 'Delete',
68
+ enable: true
69
+ },
70
+ [EContextMenuInfoType.MoveUpTopLevel]: {
71
+ title: '置于顶层',
72
+ hot_key: 'Ctrl+→',
73
+ enable: true
74
+ },
75
+ [EContextMenuInfoType.MoveDownTopLevel]: {
76
+ title: '置于底层',
77
+ hot_key: 'Ctrl+←',
78
+ enable: true
79
+ },
80
+ [EContextMenuInfoType.MoveUpOneLevel]: {
81
+ title: '置于上一层',
82
+ hot_key: 'Ctrl+↑',
83
+ enable: true
84
+ },
85
+ [EContextMenuInfoType.MoveDownOneLevel]: {
86
+ title: '置于下一层',
87
+ hot_key: 'Ctrl+↓',
88
+ enable: true
89
+ }
90
+ }
91
+ }
92
+ },
93
+ actions: {
94
+ onContextMenuClick(type: keyof typeof EContextMenuInfoType) {
95
+ const globalStore = useGlobalStore()
96
+ if (!globalStore.handle_svg_info) {
97
+ return
98
+ }
99
+ globalStore.intention = EGlobalStoreIntention.Select
100
+ switch (type) {
101
+ case EContextMenuInfoType.Copy:
102
+ const temp_item = objectDeepClone<IDoneJson>(globalStore.handle_svg_info.info)
103
+ temp_item.id = temp_item.name + randomString()
104
+ temp_item.title += '-copy'
105
+ temp_item.x += 10
106
+ temp_item.y += 10
107
+ globalStore.setDoneJson(temp_item)
108
+ this.display = false
109
+ globalStore.setHandleSvgInfo(temp_item, globalStore.done_json.length)
110
+ break
111
+ case EContextMenuInfoType.Delete:
112
+ globalStore.spliceDoneJson(globalStore.handle_svg_info.index)
113
+ this.display = false
114
+ globalStore.setHandleSvgInfo(null)
115
+ globalStore.intention = EGlobalStoreIntention.None
116
+ break
117
+ case EContextMenuInfoType.MoveUpOneLevel:
118
+ if (
119
+ globalStore.done_json.length === 1 ||
120
+ globalStore.handle_svg_info.index === globalStore.done_json.length - 1
121
+ ) {
122
+ return
123
+ }
124
+ const temp_up_one = globalStore.handle_svg_info.info
125
+ globalStore.done_json[globalStore.handle_svg_info.index] =
126
+ globalStore.done_json[globalStore.handle_svg_info.index + 1]
127
+ globalStore.done_json[globalStore.handle_svg_info.index + 1] = temp_up_one
128
+ useHistoryRecord(globalStore.done_json)
129
+ this.display = false
130
+ globalStore.setHandleSvgInfo(temp_up_one, globalStore.handle_svg_info.index + 1)
131
+ break
132
+ case EContextMenuInfoType.MoveDownOneLevel:
133
+ if (globalStore.done_json.length === 1 || globalStore.handle_svg_info.index === 0) {
134
+ return
135
+ }
136
+ const temp_down_one = globalStore.handle_svg_info.info
137
+ globalStore.done_json[globalStore.handle_svg_info.index] =
138
+ globalStore.done_json[globalStore.handle_svg_info.index - 1]
139
+ globalStore.done_json[globalStore.handle_svg_info.index - 1] = temp_down_one
140
+ useHistoryRecord(globalStore.done_json)
141
+ this.display = false
142
+ globalStore.setHandleSvgInfo(temp_down_one, globalStore.handle_svg_info.index - 1)
143
+ break
144
+ case EContextMenuInfoType.MoveDownTopLevel:
145
+ if (globalStore.done_json.length === 1 || globalStore.handle_svg_info.index === 0) {
146
+ return
147
+ }
148
+ const temp_down_top = globalStore.handle_svg_info.info
149
+ globalStore.done_json.splice(globalStore.handle_svg_info.index, 1)
150
+ globalStore.done_json.unshift(temp_down_top)
151
+ useHistoryRecord(globalStore.done_json)
152
+ this.display = false
153
+ globalStore.setHandleSvgInfo(temp_down_top, 0)
154
+ break
155
+ case EContextMenuInfoType.MoveUpTopLevel:
156
+ if (
157
+ globalStore.done_json.length === 1 ||
158
+ globalStore.handle_svg_info.index === globalStore.done_json.length
159
+ ) {
160
+ return
161
+ }
162
+ const temp_up_top = globalStore.handle_svg_info.info
163
+ globalStore.done_json.splice(globalStore.handle_svg_info.index, 1)
164
+ globalStore.done_json.push(temp_up_top)
165
+ useHistoryRecord(globalStore.done_json)
166
+ this.display = false
167
+ globalStore.setHandleSvgInfo(temp_up_top, globalStore.done_json.length - 1)
168
+ break
169
+ default:
170
+ break
171
+ }
172
+ }
173
+ }
174
+ })
@@ -0,0 +1,43 @@
1
+ import type { IDoneJson } from '../global/types'
2
+
3
+ export interface EditPrivateStoreState {
4
+ old_done_components: IDoneJson[]
5
+ history_doneComponent: IDoneJson[][]
6
+ history_now_index: number
7
+ is_record_history: boolean
8
+ max_record_times: number
9
+ }
10
+ export interface ContextMenuStoreState {
11
+ display: boolean
12
+ info: {
13
+ [key in EContextMenuInfoType]: IContextMenuInfo
14
+ }
15
+ }
16
+ export interface IContextMenuInfo {
17
+ title: string
18
+ hot_key: string
19
+ enable: boolean
20
+ }
21
+ export enum EContextMenuInfoType {
22
+ Copy = 'Copy',
23
+ Delete = 'Delete',
24
+ MoveUpOneLevel = 'MoveUpOneLevel',
25
+ MoveDownOneLevel = 'MoveDownOneLevel',
26
+ MoveUpTopLevel = 'MoveUpTopLevel',
27
+ MoveDownTopLevel = 'MoveDownTopLevel'
28
+ }
29
+
30
+ export enum EShortcutKeyType {
31
+ Copy = 'Copy',
32
+ Delete = 'Delete',
33
+ MoveUpOneLevel = 'MoveUpOneLevel',
34
+ MoveDownOneLevel = 'MoveDownOneLevel',
35
+ MoveUpTopLevel = 'MoveUpTopLevel',
36
+ MoveDownTopLevel = 'MoveDownTopLevel',
37
+ Redo = 'Redo',
38
+ Undo = 'Undo',
39
+ MoveUp = 'MoveUp',
40
+ MoveDown = 'MoveDown',
41
+ MoveLeft = 'MoveLeft',
42
+ MoveRight = 'MoveRight'
43
+ }