@gedit/editor-2d 0.1.102 → 0.1.106

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 (40) hide show
  1. package/lib/browser/editor2d-contribution.d.ts.map +1 -1
  2. package/lib/browser/editor2d-contribution.js +3 -2
  3. package/lib/browser/editor2d-contribution.js.map +1 -1
  4. package/lib/browser/model/editor2d-document.d.ts +3 -2
  5. package/lib/browser/model/editor2d-document.d.ts.map +1 -1
  6. package/lib/browser/model/editor2d-document.js +21 -9
  7. package/lib/browser/model/editor2d-document.js.map +1 -1
  8. package/lib/browser/model/editor2d.d.ts +3 -3
  9. package/lib/browser/model/editor2d.d.ts.map +1 -1
  10. package/lib/browser/model/editor2d.js +13 -6
  11. package/lib/browser/model/editor2d.js.map +1 -1
  12. package/lib/browser/model/utils/anim.utils.d.ts.map +1 -1
  13. package/lib/browser/model/utils/anim.utils.js +2 -0
  14. package/lib/browser/model/utils/anim.utils.js.map +1 -1
  15. package/lib/browser/playground/index.d.ts +2 -0
  16. package/lib/browser/playground/index.d.ts.map +1 -1
  17. package/lib/browser/playground/index.js +4 -0
  18. package/lib/browser/playground/index.js.map +1 -1
  19. package/lib/browser/playground/selection-entity-manager.d.ts.map +1 -1
  20. package/lib/browser/playground/selection-entity-manager.js +8 -5
  21. package/lib/browser/playground/selection-entity-manager.js.map +1 -1
  22. package/lib/browser/playground/selector-extend-icons.d.ts +8 -0
  23. package/lib/browser/playground/selector-extend-icons.d.ts.map +1 -0
  24. package/lib/browser/playground/selector-extend-icons.js +42 -0
  25. package/lib/browser/playground/selector-extend-icons.js.map +1 -0
  26. package/lib/browser/playground/selector-extend-renderer.d.ts +9 -0
  27. package/lib/browser/playground/selector-extend-renderer.d.ts.map +1 -0
  28. package/lib/browser/playground/selector-extend-renderer.js +150 -0
  29. package/lib/browser/playground/selector-extend-renderer.js.map +1 -0
  30. package/package.json +9 -8
  31. package/src/browser/editor2d-contribution.ts +4 -3
  32. package/src/browser/model/editor2d-document.ts +25 -10
  33. package/src/browser/model/editor2d.ts +14 -6
  34. package/src/browser/model/utils/anim.utils.ts +2 -1
  35. package/src/browser/playground/index.ts +3 -0
  36. package/src/browser/playground/selection-entity-manager.tsx +10 -6
  37. package/src/browser/playground/selector-extend-icons.tsx +82 -0
  38. package/src/browser/playground/selector-extend-renderer.tsx +212 -0
  39. package/src/browser/style/index.less +1 -0
  40. package/src/browser/style/selector-extend.less +47 -0
@@ -0,0 +1,212 @@
1
+ import * as React from 'react';
2
+
3
+ import clsx from 'clsx';
4
+ import { Form, Popover, Tooltip } from '@gedit/ui';
5
+
6
+ import { selectIcon, SelectorExtendType } from './selector-extend-icons';
7
+ import { GameObjectIDERegister, GameObjectSelectorExtend as SelectorExtend } from '@gedit/render-engine-ide';
8
+ import { PlaygroundContext, SelectorEntityRendererProps, } from '@gedit/playground';
9
+ import type { Editor2dEntity } from './entities/editor2d-entity';
10
+ import { Editor2dNode } from '../model';
11
+
12
+ const getClassName = (str: string) => `gedit-selector-extend-${str}`;
13
+
14
+ export interface SelectorExtendProps extends SelectorEntityRendererProps {
15
+ register?: GameObjectIDERegister;
16
+ context?: PlaygroundContext;
17
+ }
18
+
19
+ const defaultExtends: SelectorExtend[] = [
20
+ {
21
+ type: SelectorExtendType.LINK,
22
+ title: '配置链接',
23
+ category: 1,
24
+ order: 0,
25
+ visible: (node: Editor2dNode, register: GameObjectIDERegister) => register?.getDisableKeys().indexOf('link') === -1,
26
+ event: {
27
+ title: '跳转链接配置',
28
+ type: 'selectorExtendAttr',
29
+ children: [
30
+ {
31
+ type: 'text',
32
+ key: 'link',
33
+ label: '链接',
34
+ placeholder: '请输出 url 地址',
35
+ },
36
+ ],
37
+ },
38
+ },
39
+ {
40
+ type: SelectorExtendType.TO_TOP,
41
+ title: '前置一层',
42
+ category: 2,
43
+ order: 0,
44
+ },
45
+ {
46
+ type: SelectorExtendType.TO_BOTTOM,
47
+ title: '后置一层',
48
+ category: 2,
49
+ order: 1,
50
+ },
51
+ {
52
+ type: SelectorExtendType.FLIP_X,
53
+ title: 'X 轴镜像',
54
+ category: 2,
55
+ order: 2,
56
+ visible: (node: Editor2dNode, register: GameObjectIDERegister) => register?.getDisableKeys().indexOf('flip.x') === -1,
57
+ },
58
+ {
59
+ type: SelectorExtendType.FLIP_Y,
60
+ title: 'Y 轴镜像',
61
+ category: 2,
62
+ order: 3,
63
+ visible: (node: Editor2dNode, register: GameObjectIDERegister) => register?.getDisableKeys().indexOf('flip.y') === -1,
64
+ },
65
+ {
66
+ type: SelectorExtendType.DELETE,
67
+ title: '删除图层',
68
+ parentClassName: getClassName('delete'),
69
+ category: 3,
70
+ order: 0,
71
+ },
72
+ ];
73
+
74
+ const sortData = (data: SelectorExtend[]) => {
75
+ const states: { [key: string | number]: SelectorExtend[] } = {};
76
+ data.forEach(c => {
77
+ const {category = 'empty'} = c;
78
+ states[category] = states[category] || [];
79
+ states[category].push(c);
80
+ states[category] = states[category].sort(
81
+ (a, b) => (a.order || 0) - (b.order || 0)
82
+ );
83
+ });
84
+ return Object.keys(states)
85
+ .sort((a, b) => parseFloat(a || '0') - parseFloat(b || '0'))
86
+ .map(k => states[parseFloat(k)]);
87
+ };
88
+
89
+ const SelectorIcon = (props: {
90
+ item: SelectorExtend;
91
+ onChange: (type: SelectorExtendType | 'updateData', value?: any) => void;
92
+ node: any;
93
+ }) => {
94
+ const {item, onChange, node} = props;
95
+ const child = (
96
+ <div
97
+ className={clsx(getClassName('icon'), item.className)}
98
+ onMouseDown={(e: React.MouseEvent) => {
99
+ e.stopPropagation();
100
+ e.preventDefault();
101
+ if (item.event) {
102
+ return;
103
+ }
104
+ onChange?.(item.type);
105
+ }}
106
+ >
107
+ {selectIcon[item.type]}
108
+ </div>
109
+ );
110
+ if (item.event) {
111
+ return (
112
+ <Popover
113
+ content={Form.renderBySchema({
114
+ ...item.event,
115
+ context: {
116
+ node,
117
+ },
118
+ onChange: (key: string, value: any) => {
119
+ onChange?.('updateData', {
120
+ [key]: value,
121
+ });
122
+ },
123
+ values: node,
124
+ size: 'middle',
125
+ })}
126
+ title={item.event.title || item.title}
127
+ placement="right"
128
+ >
129
+ {child}
130
+ </Popover>
131
+ );
132
+ }
133
+ if (item.title) {
134
+ return (
135
+ <Tooltip title={item.title} placement="right">
136
+ {child}
137
+ </Tooltip>
138
+ );
139
+ }
140
+ return child;
141
+ };
142
+
143
+ export const SelectorExtendRender = (props: SelectorExtendProps) => {
144
+ const {entity, register, context} = props;
145
+ const {node} = entity as Editor2dEntity;
146
+ const {selectorExtends = []} = register?.decoration || {};
147
+
148
+ const childData = sortData(
149
+ ([] as SelectorExtend[])
150
+ .concat(defaultExtends, selectorExtends)
151
+ .filter(c => (c.visible ? c.visible(node, register) : true))
152
+ );
153
+ const onChange = (type: SelectorExtendType | 'updateData', value?: any) => {
154
+ const {document} = context;
155
+ switch (type) {
156
+ case SelectorExtendType.TO_TOP:
157
+ document.moveUp(node);
158
+ break;
159
+ case SelectorExtendType.TO_BOTTOM:
160
+ document.moveDown(node);
161
+ break;
162
+ case SelectorExtendType.FLIP_X:
163
+ document.updateNode(
164
+ node,
165
+ {flip: {...node?.flip, x: !node?.flip?.x}},
166
+ true
167
+ );
168
+ break;
169
+ case SelectorExtendType.FLIP_Y:
170
+ document.updateNode(
171
+ node,
172
+ {flip: {...node?.flip, y: !node?.flip?.y}},
173
+ true
174
+ );
175
+ break;
176
+ case SelectorExtendType.DELETE:
177
+ document.delNodes(node);
178
+ break;
179
+ case 'updateData':
180
+ console.log(value);
181
+ document.updateNode(node, value, true);
182
+ break;
183
+ default:
184
+ console.warn(`无效类型: ${type}.`);
185
+ break;
186
+ }
187
+ };
188
+ return (
189
+ <div className={getClassName('wrapper')}>
190
+ <div>
191
+ {childData.map((c, i) => (
192
+ <div
193
+ className={clsx(
194
+ getClassName('icon-wrapper'),
195
+ c.map(d => d.parentClassName).join(' ')
196
+ )}
197
+ key={i.toString()}
198
+ >
199
+ {c.map(item => (
200
+ <SelectorIcon
201
+ item={item}
202
+ onChange={onChange}
203
+ node={node}
204
+ key={item.type}
205
+ />
206
+ ))}
207
+ </div>
208
+ ))}
209
+ </div>
210
+ </div>
211
+ );
212
+ };
@@ -1,6 +1,7 @@
1
1
  @import './engine2d.css';
2
2
  @import './canvas-layer.css';
3
3
  @import './canvas-draw-layer.less';
4
+ @import './selector-extend.less';
4
5
 
5
6
  :root {
6
7
  --g-mask-transparent: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAADKADAAQAAAABAAAADAAAAAATDPpdAAAAfUlEQVQoFbVQQQ7AIAgD7Sf8/8s8+gd1s0vIptMlHkZiUGyBVmOMRwux4B2AhBDEOWflK6uqgICRYLVn3Zh9C6t+5G3CcqXVkKYPnQYCvfdSSpFaa8ejaM05N223S0QQmFJ6NeIfaN1I4JtnNmFb9L8Ergm6MWrg7jP36NIJC0BbmAiDWGoAAAAASUVORK5CYII=');;
@@ -0,0 +1,47 @@
1
+ @selectExtend: gedit-selector-extend;
2
+
3
+ @extendLineColor: #0F0F11;
4
+
5
+ .@{selectExtend} {
6
+ &-wrapper {
7
+ position: absolute;
8
+ top: 50%;
9
+ right: -40px;
10
+ z-index: 50;
11
+ display: flex;
12
+ align-items: center;
13
+ justify-content: center;
14
+ width: 30px;
15
+ height: 0;
16
+ }
17
+ &-icon {
18
+ width: 30px;
19
+ height: 30px;
20
+ line-height: 30px;
21
+ text-align: center;
22
+ border-bottom: var(--g-border-width) solid @extendLineColor;
23
+ cursor: pointer;
24
+ color: #979797;
25
+ font-size: 16px;
26
+ &:last-child {
27
+ border-bottom: none;
28
+ }
29
+ &-wrapper {
30
+ border-radius: 8px;
31
+ border: var(--g-border-width) solid @extendLineColor;
32
+ background-color: var(--g-panelTitle-activeBackground);
33
+ margin-bottom: 6px;
34
+ overflow: hidden;
35
+ &:last-child {
36
+ margin-bottom: 0;
37
+ }
38
+ }
39
+ }
40
+ &-delete {
41
+ background-color: #EF4E4D;
42
+ border-color: #C42F2F;
43
+ .@{selectExtend}-icon {
44
+ color: #FFC4C4;
45
+ }
46
+ }
47
+ }