@hatiolab/things-scene 9.0.0-beta.2 → 9.0.0-beta.21
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.
- package/db.sqlite +0 -0
- package/dist/animation/animate.d.ts +4 -0
- package/dist/animation/animations/animation.d.ts +14 -0
- package/dist/animation/animations/fade.d.ts +4 -0
- package/dist/animation/animations/heartbeat.d.ts +4 -0
- package/dist/animation/animations/moving.d.ts +4 -0
- package/dist/animation/animations/outline.d.ts +10 -0
- package/dist/animation/animations/rotation.d.ts +4 -0
- package/dist/animation/animations/vibration.d.ts +4 -0
- package/dist/animation/compile.d.ts +1 -0
- package/dist/animation/delta.d.ts +19 -0
- package/dist/animation/index.d.ts +1 -0
- package/dist/command/command-change.d.ts +7 -0
- package/dist/command/command-migrate.d.ts +4 -0
- package/dist/command/command-migrate.js +85 -0
- package/dist/command/command-migrate.js.map +1 -0
- package/dist/command/command.d.ts +5 -0
- package/dist/command/snapshot-commander.d.ts +15 -0
- package/dist/components/anchor/anchor.d.ts +128 -0
- package/dist/components/anchor/ellipse-anchors.d.ts +2 -0
- package/dist/components/anchor/ellipse-anchors.js +38 -0
- package/dist/components/anchor/ellipse-anchors.js.map +1 -0
- package/dist/components/anchor/rect-anchors.d.ts +10 -0
- package/dist/components/audio.d.ts +25 -0
- package/dist/components/audio.js +141 -0
- package/dist/components/audio.js.map +1 -0
- package/dist/components/cloud.d.ts +13 -0
- package/dist/components/cloud.js +31 -0
- package/dist/components/cloud.js.map +1 -0
- package/dist/components/component.d.ts +227 -0
- package/dist/components/component.js +912 -0
- package/dist/components/component.js.map +1 -0
- package/dist/components/container-abstract.d.ts +51 -0
- package/dist/components/container-abstract.js +372 -0
- package/dist/components/container-abstract.js.map +1 -0
- package/dist/components/container.d.ts +38 -0
- package/dist/components/container.js +75 -0
- package/dist/components/container.js.map +1 -0
- package/dist/components/data/data-mapping.d.ts +16 -0
- package/dist/components/data/data.d.ts +8 -0
- package/dist/components/data/evaluator.d.ts +1 -0
- package/dist/components/donut.d.ts +15 -0
- package/dist/components/donut.js +74 -0
- package/dist/components/donut.js.map +1 -0
- package/dist/components/drawer/draw-image-pendable.d.ts +1 -0
- package/dist/components/drawer/effect.d.ts +1 -0
- package/dist/components/drawer/fill.d.ts +14 -0
- package/dist/components/drawer/format.d.ts +1 -0
- package/dist/components/drawer/line.d.ts +3 -0
- package/dist/components/drawer/stroke.d.ts +1 -0
- package/dist/components/drawer/text-wrapper.d.ts +10 -0
- package/dist/components/drawer/text.d.ts +3 -0
- package/dist/components/ellipse.d.ts +35 -0
- package/dist/components/ellipse.js +99 -0
- package/dist/components/ellipse.js.map +1 -0
- package/dist/components/file/ondropfile.d.ts +1 -0
- package/dist/components/fit/fit.d.ts +15 -0
- package/dist/components/geometry/transcoord.d.ts +41 -0
- package/dist/components/geometry/union.d.ts +6 -0
- package/dist/components/gif-view.d.ts +18 -0
- package/dist/components/gif-view.js +116 -0
- package/dist/components/gif-view.js.map +1 -0
- package/dist/components/global-ref.d.ts +36 -0
- package/dist/components/global-ref.js +128 -0
- package/dist/components/global-ref.js.map +1 -0
- package/dist/components/group.d.ts +15 -0
- package/dist/components/group.js +145 -0
- package/dist/components/group.js.map +1 -0
- package/dist/components/html/elements.d.ts +2 -0
- package/dist/components/html/fill.d.ts +1 -0
- package/dist/components/html/reposition.d.ts +1 -0
- package/dist/components/html/shadow.d.ts +1 -0
- package/dist/components/html-overlay-container.d.ts +27 -0
- package/dist/components/html-overlay-container.js +14 -0
- package/dist/components/html-overlay-container.js.map +1 -0
- package/dist/components/html-overlay-element.d.ts +25 -0
- package/dist/components/html-overlay-element.js +9 -0
- package/dist/components/html-overlay-element.js.map +1 -0
- package/dist/components/image-view.d.ts +19 -0
- package/dist/components/image-view.js +180 -0
- package/dist/components/image-view.js.map +1 -0
- package/dist/components/index.d.ts +32 -0
- package/dist/components/index.js +39 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/info-window.d.ts +41 -0
- package/dist/components/info-window.js +425 -0
- package/dist/components/info-window.js.map +1 -0
- package/dist/components/line.d.ts +91 -0
- package/dist/components/line.js +303 -0
- package/dist/components/line.js.map +1 -0
- package/dist/components/local-ref.d.ts +47 -0
- package/dist/components/local-ref.js +103 -0
- package/dist/components/local-ref.js.map +1 -0
- package/dist/components/mixins/connectable.d.ts +45 -0
- package/dist/components/mixins/data-source.d.ts +9 -0
- package/dist/components/mixins/html-element.d.ts +24 -0
- package/dist/components/mixins/move-handle.d.ts +11 -0
- package/dist/components/mixins/rect-path.d.ts +13 -0
- package/dist/components/mixins/value-holder.d.ts +18 -0
- package/dist/components/mutater/bounds.d.ts +10 -0
- package/dist/components/mutater/path.d.ts +5 -0
- package/dist/components/ortholine.d.ts +21 -0
- package/dist/components/ortholine.js +814 -0
- package/dist/components/ortholine.js.map +1 -0
- package/dist/components/outline/ellipse-outline.d.ts +4 -0
- package/dist/components/outline/ellipse-outline.js +11 -0
- package/dist/components/outline/ellipse-outline.js.map +1 -0
- package/dist/components/outline/path-outline.d.ts +1 -0
- package/dist/components/path.d.ts +5 -0
- package/dist/components/path.js +40 -0
- package/dist/components/path.js.map +1 -0
- package/dist/components/polygon.d.ts +40 -0
- package/dist/components/polygon.js +157 -0
- package/dist/components/polygon.js.map +1 -0
- package/dist/components/polyline.d.ts +18 -0
- package/dist/components/polyline.js +102 -0
- package/dist/components/polyline.js.map +1 -0
- package/dist/components/popup.d.ts +48 -0
- package/dist/components/popup.js +138 -0
- package/dist/components/popup.js.map +1 -0
- package/dist/components/rect.d.ts +26 -0
- package/dist/components/rect.js +91 -0
- package/dist/components/rect.js.map +1 -0
- package/dist/components/retention/retention-manager.d.ts +8 -0
- package/dist/components/root-container.d.ts +90 -0
- package/dist/components/root-container.js +478 -0
- package/dist/components/root-container.js.map +1 -0
- package/dist/components/ruler.d.ts +16 -0
- package/dist/components/ruler.js +77 -0
- package/dist/components/ruler.js.map +1 -0
- package/dist/components/shape.d.ts +25 -0
- package/dist/components/shape.js +80 -0
- package/dist/components/shape.js.map +1 -0
- package/dist/components/star.d.ts +13 -0
- package/dist/components/star.js +80 -0
- package/dist/components/star.js.map +1 -0
- package/dist/components/text/substitutor.d.ts +3 -0
- package/dist/components/text.d.ts +8 -0
- package/dist/components/text.js +15 -0
- package/dist/components/text.js.map +1 -0
- package/dist/components/three-container.d.ts +60 -0
- package/dist/components/three-container.js +515 -0
- package/dist/components/three-container.js.map +1 -0
- package/dist/components/triangle.d.ts +15 -0
- package/dist/components/triangle.js +76 -0
- package/dist/components/triangle.js.map +1 -0
- package/dist/const.d.ts +39 -0
- package/dist/core/collection.d.ts +8 -0
- package/dist/core/debug.d.ts +1 -0
- package/dist/core/deep-equals.d.ts +1 -0
- package/dist/core/dom-to-image.d.ts +127 -0
- package/dist/core/event.d.ts +92 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/list.d.ts +32 -0
- package/dist/core/logger.d.ts +3 -0
- package/dist/core/memoize.d.ts +6 -0
- package/dist/core/mixin.d.ts +1 -0
- package/dist/core/obj-accessor.d.ts +1 -0
- package/dist/core/reference-map.d.ts +14 -0
- package/dist/core/round-rect.d.ts +19 -0
- package/dist/core/script-loader.d.ts +3 -0
- package/dist/core/snapshot-taker.d.ts +12 -0
- package/dist/core/stack.d.ts +2 -0
- package/dist/core/timecapsule.d.ts +18 -0
- package/dist/core/utils.d.ts +9 -0
- package/dist/decorator/anchors-decorator.d.ts +31 -0
- package/dist/decorator/data-spread-decorator.d.ts +1 -0
- package/dist/decorator/decotag-decorator.d.ts +1 -0
- package/dist/decorator/index.d.ts +2 -0
- package/dist/decorator/link-decorator.d.ts +1 -0
- package/dist/effect/gradation.d.ts +1 -0
- package/dist/effect/index.d.ts +1 -0
- package/dist/effect/shadow.d.ts +2 -0
- package/dist/effect/turn.d.ts +1 -0
- package/dist/event/event-engine.d.ts +12 -0
- package/dist/event/event-pump.d.ts +11 -0
- package/dist/event/event-tracker.d.ts +21 -0
- package/dist/event/index.d.ts +2 -0
- package/dist/event/ua-event-handler.d.ts +32 -0
- package/dist/event-map/event-map.d.ts +9 -0
- package/dist/event-map/index.d.ts +1 -0
- package/dist/event-map/move-handler.d.ts +1 -0
- package/dist/event-map/text-editor-lite.d.ts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/layer/action/emphasize.d.ts +2 -0
- package/dist/layer/action/popup.d.ts +5 -0
- package/dist/layer/action/pressed.d.ts +2 -0
- package/dist/layer/add-layer.d.ts +42 -0
- package/dist/layer/add-layer.js +142 -0
- package/dist/layer/add-layer.js.map +1 -0
- package/dist/layer/decotag-layer.d.ts +27 -0
- package/dist/layer/decotag-layer.js +105 -0
- package/dist/layer/decotag-layer.js.map +1 -0
- package/dist/layer/guide-layer.d.ts +44 -0
- package/dist/layer/guide-layer.js +261 -0
- package/dist/layer/guide-layer.js.map +1 -0
- package/dist/layer/index.d.ts +7 -0
- package/dist/layer/index.js +11 -0
- package/dist/layer/index.js.map +1 -0
- package/dist/layer/layer.d.ts +32 -0
- package/dist/layer/layer.js +155 -0
- package/dist/layer/layer.js.map +1 -0
- package/dist/layer/model-layer.d.ts +46 -0
- package/dist/layer/model-layer.js +402 -0
- package/dist/layer/model-layer.js.map +1 -0
- package/dist/layer/modeler/anchor-handler.d.ts +36 -0
- package/dist/layer/modeler/control-handler.d.ts +18 -0
- package/dist/layer/modeler/focus-outline.d.ts +5 -0
- package/dist/layer/modeler/group-outline.d.ts +5 -0
- package/dist/layer/modeler/index.d.ts +7 -0
- package/dist/layer/modeler/path-handler.d.ts +22 -0
- package/dist/layer/modeler/resizer.d.ts +13 -0
- package/dist/layer/modeler/rotator.d.ts +15 -0
- package/dist/layer/modeler/rotator.js +120 -0
- package/dist/layer/modeler/rotator.js.map +1 -0
- package/dist/layer/modeling-layer.d.ts +66 -0
- package/dist/layer/modeling-layer.js +451 -0
- package/dist/layer/modeling-layer.js.map +1 -0
- package/dist/layer/selection/selected-finder.d.ts +1 -0
- package/dist/layer/selection-layer.d.ts +42 -0
- package/dist/layer/selection-layer.js +307 -0
- package/dist/layer/selection-layer.js.map +1 -0
- package/dist/layer/shift-layer.d.ts +18 -0
- package/dist/layer/shift-layer.js +61 -0
- package/dist/layer/shift-layer.js.map +1 -0
- package/dist/layout/absolute.d.ts +8 -0
- package/dist/layout/card.d.ts +7 -0
- package/dist/layout/html-absolute.d.ts +8 -0
- package/dist/layout/index.d.ts +8 -0
- package/dist/layout/index.js +12 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/layout/layout.d.ts +11 -0
- package/dist/layout/linear-horizontal.d.ts +7 -0
- package/dist/layout/linear-vertical.d.ts +7 -0
- package/dist/layout/table.d.ts +9 -0
- package/dist/layout/three.d.ts +8 -0
- package/dist/layout/three.js +20 -0
- package/dist/layout/three.js.map +1 -0
- package/dist/license/license.d.ts +18 -0
- package/dist/model/compile.d.ts +1 -0
- package/dist/model/compile.js +28 -0
- package/dist/model/compile.js.map +1 -0
- package/dist/model/duplicate.d.ts +1 -0
- package/dist/model/index.d.ts +3 -0
- package/dist/model/selector.d.ts +2 -0
- package/dist/style/compile.d.ts +1 -0
- package/dist/style/index.d.ts +1 -0
- package/dist/things-scene/api/add-start.d.ts +1 -0
- package/dist/things-scene/api/add.d.ts +5 -0
- package/dist/things-scene/api/align.d.ts +1 -0
- package/dist/things-scene/api/change.d.ts +2 -0
- package/dist/things-scene/api/clipboard.d.ts +3 -0
- package/dist/things-scene/api/distribute.d.ts +1 -0
- package/dist/things-scene/api/duplicate.d.ts +4 -0
- package/dist/things-scene/api/fullscreen.d.ts +1 -0
- package/dist/things-scene/api/group.d.ts +8 -0
- package/dist/things-scene/api/group.js +78 -0
- package/dist/things-scene/api/group.js.map +1 -0
- package/dist/things-scene/api/ids.d.ts +4 -0
- package/dist/things-scene/api/index.d.ts +15 -0
- package/dist/things-scene/api/listener.d.ts +3 -0
- package/dist/things-scene/api/remove.d.ts +4 -0
- package/dist/things-scene/api/symmetry.d.ts +2 -0
- package/dist/things-scene/api/symmetry.js +39 -0
- package/dist/things-scene/api/symmetry.js.map +1 -0
- package/dist/things-scene/api/to-data-url.d.ts +1 -0
- package/dist/things-scene/api/to-data-url.js +69 -0
- package/dist/things-scene/api/to-data-url.js.map +1 -0
- package/dist/things-scene/api/zorder.d.ts +2 -0
- package/dist/things-scene/application-context.d.ts +40 -0
- package/dist/things-scene/config.d.ts +4 -0
- package/dist/things-scene/create.d.ts +20 -0
- package/dist/things-scene/fps.d.ts +1 -0
- package/dist/things-scene/index.d.ts +17 -0
- package/dist/things-scene/index.js +23 -0
- package/dist/things-scene/index.js.map +1 -0
- package/dist/things-scene/polyfill.d.ts +2 -0
- package/dist/things-scene/scene.d.ts +155 -0
- package/dist/things-scene/version.d.ts +2 -0
- package/dist/threed/common.d.ts +22 -0
- package/dist/threed/control/three-controls.d.ts +11 -0
- package/dist/threed/control/three-controls.js +620 -0
- package/dist/threed/control/three-controls.js.map +1 -0
- package/dist/threed/html/elements.d.ts +2 -0
- package/dist/threed/real-object-camera-meshed.d.ts +12 -0
- package/dist/threed/real-object-camera-meshed.js +49 -0
- package/dist/threed/real-object-camera-meshed.js.map +1 -0
- package/dist/threed/real-object-camera.d.ts +9 -0
- package/dist/threed/real-object-camera.js +31 -0
- package/dist/threed/real-object-camera.js.map +1 -0
- package/dist/threed/real-object-dom-element.d.ts +20 -0
- package/dist/threed/real-object-dom-element.js +78 -0
- package/dist/threed/real-object-dom-element.js.map +1 -0
- package/dist/threed/real-object-dummy.d.ts +6 -0
- package/dist/threed/real-object-dummy.js +11 -0
- package/dist/threed/real-object-dummy.js.map +1 -0
- package/dist/threed/real-object-extrude.d.ts +19 -0
- package/dist/threed/real-object-extrude.js +171 -0
- package/dist/threed/real-object-extrude.js.map +1 -0
- package/dist/threed/real-object-gltf.d.ts +15 -0
- package/dist/threed/real-object-gltf.js +97 -0
- package/dist/threed/real-object-gltf.js.map +1 -0
- package/dist/threed/real-object-group.d.ts +5 -0
- package/dist/threed/real-object-group.js +11 -0
- package/dist/threed/real-object-group.js.map +1 -0
- package/dist/threed/real-object-mesh.d.ts +11 -0
- package/dist/threed/real-object-mesh.js +55 -0
- package/dist/threed/real-object-mesh.js.map +1 -0
- package/dist/threed/real-object-plane.d.ts +6 -0
- package/dist/threed/real-object-plane.js +23 -0
- package/dist/threed/real-object-plane.js.map +1 -0
- package/dist/threed/real-object-scene.d.ts +21 -0
- package/dist/threed/real-object-scene.js +89 -0
- package/dist/threed/real-object-scene.js.map +1 -0
- package/dist/threed/real-object-sprite.d.ts +12 -0
- package/dist/threed/real-object-sprite.js +35 -0
- package/dist/threed/real-object-sprite.js.map +1 -0
- package/dist/threed/real-object-text.d.ts +16 -0
- package/dist/threed/real-object-text.js +70 -0
- package/dist/threed/real-object-text.js.map +1 -0
- package/dist/threed/real-object.d.ts +48 -0
- package/dist/threed/real-object.js +199 -0
- package/dist/threed/real-object.js.map +1 -0
- package/dist/threed/texture/text-texture.d.ts +8 -0
- package/dist/threed/three-dimensional-container.d.ts +7 -0
- package/dist/threed/three-dimensional-container.js +2 -0
- package/dist/threed/three-dimensional-container.js.map +1 -0
- package/dist/threed/utils/bound-uv-generator.d.ts +16 -0
- package/dist/types.d.ts +53 -0
- package/dist/types.js +368 -0
- package/dist/types.js.map +1 -0
- package/package.json +5 -2
- package/schema.graphql +5 -0
- package/things-scene-ie.js +1 -1
- package/things-scene-ie.js.LICENSE.txt +22 -0
- package/things-scene-min.js +1 -1
- package/things-scene-min.js.LICENSE.txt +22 -0
- package/things-scene.d.ts +13 -1
- package/things-scene.mjs +34 -14
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export default class GlobalRef extends HTMLOverlayContainer {
|
|
2
|
+
get nature(): {
|
|
3
|
+
mutable: boolean;
|
|
4
|
+
resizable: boolean;
|
|
5
|
+
rotatable: boolean;
|
|
6
|
+
properties: ({
|
|
7
|
+
type: string;
|
|
8
|
+
label: string;
|
|
9
|
+
name: string;
|
|
10
|
+
placeholder: string;
|
|
11
|
+
property?: undefined;
|
|
12
|
+
} | {
|
|
13
|
+
type: string;
|
|
14
|
+
label: string;
|
|
15
|
+
name: string;
|
|
16
|
+
property: {
|
|
17
|
+
options: string[];
|
|
18
|
+
};
|
|
19
|
+
placeholder?: undefined;
|
|
20
|
+
})[];
|
|
21
|
+
'value-property': string;
|
|
22
|
+
help: string;
|
|
23
|
+
};
|
|
24
|
+
get tagName(): string;
|
|
25
|
+
_element_bounds: {
|
|
26
|
+
offsetWidth: any;
|
|
27
|
+
offsetHeight: any;
|
|
28
|
+
} | undefined;
|
|
29
|
+
fetchRef(): Promise<void>;
|
|
30
|
+
__ref: any;
|
|
31
|
+
set ref(arg: any);
|
|
32
|
+
get ref(): any;
|
|
33
|
+
_releaseRef(): void;
|
|
34
|
+
onchange(after: any, before: any, hint: any): void;
|
|
35
|
+
}
|
|
36
|
+
import HTMLOverlayContainer from "./html-overlay-container";
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright © HatioLab Inc. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import Component from './component';
|
|
5
|
+
import HTMLOverlayContainer from './html-overlay-container';
|
|
6
|
+
import { error } from '../core/logger';
|
|
7
|
+
const NATURE = {
|
|
8
|
+
mutable: false,
|
|
9
|
+
resizable: true,
|
|
10
|
+
rotatable: true,
|
|
11
|
+
properties: [
|
|
12
|
+
{
|
|
13
|
+
type: 'board-selector',
|
|
14
|
+
label: 'scene-number',
|
|
15
|
+
name: 'ref',
|
|
16
|
+
placeholder: 'SCENE-1'
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
type: 'select',
|
|
20
|
+
label: 'fit',
|
|
21
|
+
name: 'fit',
|
|
22
|
+
property: {
|
|
23
|
+
options: ['both', 'ratio']
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
type: 'select',
|
|
28
|
+
label: 'mode',
|
|
29
|
+
name: 'mode',
|
|
30
|
+
property: {
|
|
31
|
+
options: ['view', 'interaction']
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
'value-property': 'ref',
|
|
36
|
+
help: 'scene/component/global-ref'
|
|
37
|
+
};
|
|
38
|
+
export default class GlobalRef extends HTMLOverlayContainer {
|
|
39
|
+
dispose() {
|
|
40
|
+
this._releaseRef();
|
|
41
|
+
super.dispose();
|
|
42
|
+
}
|
|
43
|
+
get nature() {
|
|
44
|
+
return NATURE;
|
|
45
|
+
}
|
|
46
|
+
get hasTextProperty() {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
get tagName() {
|
|
50
|
+
return 'div';
|
|
51
|
+
}
|
|
52
|
+
setElementProperties(element) {
|
|
53
|
+
var { mode = 'view' } = this.state;
|
|
54
|
+
if (mode == 'view') {
|
|
55
|
+
element.style.pointerEvents = 'none';
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
element.style.pointerEvents = 'inherit';
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
ready() {
|
|
62
|
+
super.ready();
|
|
63
|
+
this.fetchRef();
|
|
64
|
+
}
|
|
65
|
+
reposition() {
|
|
66
|
+
if (!this.element)
|
|
67
|
+
return;
|
|
68
|
+
super.reposition();
|
|
69
|
+
/* 컴포넌트 자신의 bound가 변화했다면, reference 를 다시 맞춘다. */
|
|
70
|
+
let oldBounds = this._element_bounds;
|
|
71
|
+
let { offsetWidth, offsetHeight } = this.element;
|
|
72
|
+
this._element_bounds = { offsetWidth, offsetHeight };
|
|
73
|
+
if (oldBounds && oldBounds.offsetWidth == offsetWidth && oldBounds.offsetHeight == offsetHeight) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (this.ref && this.root.target_element) {
|
|
77
|
+
let { fit = 'ratio' } = this.state;
|
|
78
|
+
this.ref.fit(fit);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async fetchRef() {
|
|
82
|
+
this._releaseRef();
|
|
83
|
+
var { ref, fit = 'ratio' } = this.state;
|
|
84
|
+
if (!ref)
|
|
85
|
+
return;
|
|
86
|
+
var provider = this.app.refProvider;
|
|
87
|
+
if (provider && ref) {
|
|
88
|
+
try {
|
|
89
|
+
this.__ref = await provider.get(ref, true);
|
|
90
|
+
this.__ref.target = this.element;
|
|
91
|
+
this.__ref.fit(fit);
|
|
92
|
+
this.__ref.data = this.data;
|
|
93
|
+
}
|
|
94
|
+
catch (e) {
|
|
95
|
+
error(e);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
get ref() {
|
|
100
|
+
return this.__ref;
|
|
101
|
+
}
|
|
102
|
+
set ref(ref) {
|
|
103
|
+
this.setState('ref', ref);
|
|
104
|
+
}
|
|
105
|
+
_releaseRef() {
|
|
106
|
+
if (this.__ref && this.__ref.release) {
|
|
107
|
+
this.__ref.release();
|
|
108
|
+
}
|
|
109
|
+
delete this.__ref;
|
|
110
|
+
}
|
|
111
|
+
onchange(after, before, hint) {
|
|
112
|
+
super.onchange(after, before, hint);
|
|
113
|
+
'ref' in after && this.fetchRef();
|
|
114
|
+
if ('fit' in after && this.ref) {
|
|
115
|
+
requestAnimationFrame(() => {
|
|
116
|
+
let { fit } = this.state;
|
|
117
|
+
this.ref.fit(fit);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
if ('data' in after && this.ref) {
|
|
121
|
+
requestAnimationFrame(() => {
|
|
122
|
+
this.ref.data = after.data;
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
Component.register('global-ref', GlobalRef);
|
|
128
|
+
//# sourceMappingURL=global-ref.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-ref.js","sourceRoot":"","sources":["../../src/components/global-ref.js"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport Component from './component'\nimport HTMLOverlayContainer from './html-overlay-container'\nimport { error } from '../core/logger'\n\nconst NATURE = {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: [\n {\n type: 'board-selector',\n label: 'scene-number',\n name: 'ref',\n placeholder: 'SCENE-1'\n },\n {\n type: 'select',\n label: 'fit',\n name: 'fit',\n property: {\n options: ['both', 'ratio']\n }\n },\n {\n type: 'select',\n label: 'mode',\n name: 'mode',\n property: {\n options: ['view', 'interaction']\n }\n }\n ],\n 'value-property': 'ref',\n help: 'scene/component/global-ref'\n}\n\nexport default class GlobalRef extends HTMLOverlayContainer {\n dispose() {\n this._releaseRef()\n super.dispose()\n }\n\n get nature() {\n return NATURE\n }\n\n get hasTextProperty() {\n return false\n }\n\n get tagName() {\n return 'div'\n }\n\n setElementProperties(element) {\n var { mode = 'view' } = this.state\n\n if (mode == 'view') {\n element.style.pointerEvents = 'none'\n } else {\n element.style.pointerEvents = 'inherit'\n }\n }\n\n ready() {\n super.ready()\n this.fetchRef()\n }\n\n reposition() {\n if (!this.element) return\n\n super.reposition()\n\n /* 컴포넌트 자신의 bound가 변화했다면, reference 를 다시 맞춘다. */\n let oldBounds = this._element_bounds\n let { offsetWidth, offsetHeight } = this.element\n this._element_bounds = { offsetWidth, offsetHeight }\n\n if (oldBounds && oldBounds.offsetWidth == offsetWidth && oldBounds.offsetHeight == offsetHeight) {\n return\n }\n\n if (this.ref && this.root.target_element) {\n let { fit = 'ratio' } = this.state\n\n this.ref.fit(fit)\n }\n }\n\n async fetchRef() {\n this._releaseRef()\n\n var { ref, fit = 'ratio' } = this.state\n\n if (!ref) return\n\n var provider = this.app.refProvider\n\n if (provider && ref) {\n try {\n this.__ref = await provider.get(ref, true)\n this.__ref.target = this.element\n this.__ref.fit(fit)\n this.__ref.data = this.data\n } catch (e) {\n error(e)\n }\n }\n }\n\n get ref() {\n return this.__ref\n }\n\n set ref(ref) {\n this.setState('ref', ref)\n }\n\n _releaseRef() {\n if (this.__ref && this.__ref.release) {\n this.__ref.release()\n }\n delete this.__ref\n }\n\n onchange(after, before, hint) {\n super.onchange(after, before, hint)\n\n 'ref' in after && this.fetchRef()\n if ('fit' in after && this.ref) {\n requestAnimationFrame(() => {\n let { fit } = this.state\n this.ref.fit(fit)\n })\n }\n\n if ('data' in after && this.ref) {\n requestAnimationFrame(() => {\n this.ref.data = after.data\n })\n }\n }\n}\n\nComponent.register('global-ref', GlobalRef)\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export default class Group extends Container {
|
|
2
|
+
isGroup(): boolean;
|
|
3
|
+
get(property: any): any;
|
|
4
|
+
set(props: any, propval: any): any;
|
|
5
|
+
capture(x: any, y: any, except: any): any;
|
|
6
|
+
set bounds(arg: any);
|
|
7
|
+
get bounds(): any;
|
|
8
|
+
path: any;
|
|
9
|
+
get focusible(): boolean;
|
|
10
|
+
calculateBounds(): void;
|
|
11
|
+
__MUTATING__: boolean | undefined;
|
|
12
|
+
render(context: any): void;
|
|
13
|
+
postrender(context: any): void;
|
|
14
|
+
}
|
|
15
|
+
import Container from "../components/container";
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright © HatioLab Inc. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import Container from '../components/container';
|
|
5
|
+
import Component from './component';
|
|
6
|
+
const GROUP_PROPS = ['refid', 'left', 'top', 'width', 'height', 'rotation', 'animation'];
|
|
7
|
+
export default class Group extends Container {
|
|
8
|
+
isGroup() {
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
/*
|
|
12
|
+
* 컴포넌트의 모델 속성값을 가져오는 메쏘드.
|
|
13
|
+
*/
|
|
14
|
+
get(property) {
|
|
15
|
+
return this._model[property];
|
|
16
|
+
}
|
|
17
|
+
/*
|
|
18
|
+
* 컴포넌트의 모델 속성값을 바꾸는 메쏘드. 그룹은 5개의 속성만을 가진다.
|
|
19
|
+
*
|
|
20
|
+
* - 하나의 속성을 변경하는 경우.
|
|
21
|
+
* component.set('top', 10)
|
|
22
|
+
* - 여러개의 속성을 변경하는 경우.
|
|
23
|
+
* component.set({top:10, left:50})
|
|
24
|
+
*/
|
|
25
|
+
set(props, propval) {
|
|
26
|
+
if (typeof props === 'string')
|
|
27
|
+
return this.set({ [props]: propval });
|
|
28
|
+
var filtered = GROUP_PROPS.reduce((filtered, prop) => {
|
|
29
|
+
if (props.hasOwnProperty(prop))
|
|
30
|
+
filtered[prop] = props[prop];
|
|
31
|
+
return filtered;
|
|
32
|
+
}, {});
|
|
33
|
+
return super.set(filtered);
|
|
34
|
+
}
|
|
35
|
+
capture(x, y, except) {
|
|
36
|
+
var captured = super.capture(x, y, except);
|
|
37
|
+
// 그룹 자신은 capture를 받을 수 없다.
|
|
38
|
+
if (captured === this)
|
|
39
|
+
return;
|
|
40
|
+
return captured;
|
|
41
|
+
}
|
|
42
|
+
set bounds(bounds) {
|
|
43
|
+
if (this.__MUTATING__) {
|
|
44
|
+
super.bounds = bounds;
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
// 1. left, top의 변화만큼 translate 한다.
|
|
48
|
+
var old_bounds = this.bounds;
|
|
49
|
+
// 2. width, height의 변화비율을 scale-x, scale-y 에 보관한다.
|
|
50
|
+
var scale = {
|
|
51
|
+
x: bounds.width / old_bounds.width,
|
|
52
|
+
y: bounds.height / old_bounds.height
|
|
53
|
+
};
|
|
54
|
+
// 3. 기존 포인트들을 기존 거리에 scale-x, scale-y 만큼 조정된 위치로 새로운 bounds의 left-top으로부터 설정한다.
|
|
55
|
+
this.path = this.path.map(point => {
|
|
56
|
+
return {
|
|
57
|
+
x: bounds.left + (point.x - old_bounds.left) * scale.x,
|
|
58
|
+
y: bounds.top + (point.y - old_bounds.top) * scale.y
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
// 4. PATH스타일(mutable)의 도형은 mutatePath를 사용하고,
|
|
62
|
+
// Bounds 스타일 도형은 기존 포인트들을 기존 거리에 scale-x, scale-y 만큼 조정된 center 위치로부터
|
|
63
|
+
// 새로운 bounds를 설정한다.
|
|
64
|
+
this.components &&
|
|
65
|
+
this.components.forEach(comp => {
|
|
66
|
+
if (comp.mutable) {
|
|
67
|
+
comp.mutatePath(null, function (path_in_parent) {
|
|
68
|
+
return path_in_parent.map(function (point) {
|
|
69
|
+
return {
|
|
70
|
+
x: point.x * scale.x,
|
|
71
|
+
y: point.y * scale.y
|
|
72
|
+
};
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
let bounds = comp.bounds;
|
|
78
|
+
let center = comp.center;
|
|
79
|
+
let delta_center = {
|
|
80
|
+
x: center.x * (1 - scale.x),
|
|
81
|
+
y: center.y * (1 - scale.y)
|
|
82
|
+
};
|
|
83
|
+
let delta_width = bounds.width * (1 - scale.x);
|
|
84
|
+
let delta_height = bounds.height * (1 - scale.y);
|
|
85
|
+
let delta_left = -(delta_center.x - delta_width / 2);
|
|
86
|
+
let delta_top = -(delta_center.y - delta_height / 2);
|
|
87
|
+
comp.bounds = {
|
|
88
|
+
left: bounds.left + delta_left,
|
|
89
|
+
top: bounds.top + delta_top,
|
|
90
|
+
width: bounds.width * scale.x,
|
|
91
|
+
height: bounds.height * scale.y
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
get focusible() {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
get bounds() {
|
|
100
|
+
return super.bounds;
|
|
101
|
+
}
|
|
102
|
+
get hasTextProperty() {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
calculateBounds() {
|
|
106
|
+
this.clearCache();
|
|
107
|
+
this.__MUTATING__ = true;
|
|
108
|
+
this.mutateBounds(function (bounds) {
|
|
109
|
+
var union = Component.union(this.components.map(component => {
|
|
110
|
+
return component.bounds;
|
|
111
|
+
}));
|
|
112
|
+
this.components.forEach(component => {
|
|
113
|
+
let cbounds = component.bounds;
|
|
114
|
+
component.bounds = {
|
|
115
|
+
left: cbounds.left - union.left,
|
|
116
|
+
top: cbounds.top - union.top,
|
|
117
|
+
width: cbounds.width,
|
|
118
|
+
height: cbounds.height
|
|
119
|
+
};
|
|
120
|
+
});
|
|
121
|
+
return {
|
|
122
|
+
left: bounds.left + union.left,
|
|
123
|
+
top: bounds.top + union.top,
|
|
124
|
+
width: union.width,
|
|
125
|
+
height: union.height
|
|
126
|
+
};
|
|
127
|
+
}, this);
|
|
128
|
+
this.__MUTATING__ = false;
|
|
129
|
+
if (this.parent.isGroup())
|
|
130
|
+
this.parent.calculateBounds();
|
|
131
|
+
}
|
|
132
|
+
/* 그룹은 자체적으로는 아무것도 그리지 않는다. */
|
|
133
|
+
render(context) { }
|
|
134
|
+
postrender(context) {
|
|
135
|
+
/* 자식 컴포넌트들 그리기 */
|
|
136
|
+
var { top, left, scale } = this.state;
|
|
137
|
+
context.translate(left, top);
|
|
138
|
+
this.layout.drawables(this).forEach(m => {
|
|
139
|
+
m.draw(context);
|
|
140
|
+
});
|
|
141
|
+
context.translate(-left, -top);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
Component.register('group', Group);
|
|
145
|
+
//# sourceMappingURL=group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group.js","sourceRoot":"","sources":["../../src/components/group.js"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport Container from '../components/container'\nimport Component from './component'\n\nconst GROUP_PROPS = ['refid', 'left', 'top', 'width', 'height', 'rotation', 'animation']\n\nexport default class Group extends Container {\n isGroup() {\n return true\n }\n\n /*\n * 컴포넌트의 모델 속성값을 가져오는 메쏘드.\n */\n get(property) {\n return this._model[property]\n }\n\n /*\n * 컴포넌트의 모델 속성값을 바꾸는 메쏘드. 그룹은 5개의 속성만을 가진다.\n *\n * - 하나의 속성을 변경하는 경우.\n * component.set('top', 10)\n * - 여러개의 속성을 변경하는 경우.\n * component.set({top:10, left:50})\n */\n\n set(props, propval) {\n if (typeof props === 'string') return this.set({ [props]: propval })\n\n var filtered = GROUP_PROPS.reduce((filtered, prop) => {\n if (props.hasOwnProperty(prop)) filtered[prop] = props[prop]\n return filtered\n }, {})\n\n return super.set(filtered)\n }\n\n capture(x, y, except) {\n var captured = super.capture(x, y, except)\n\n // 그룹 자신은 capture를 받을 수 없다.\n if (captured === this) return\n\n return captured\n }\n\n set bounds(bounds) {\n if (this.__MUTATING__) {\n super.bounds = bounds\n return\n }\n\n // 1. left, top의 변화만큼 translate 한다.\n\n var old_bounds = this.bounds\n\n // 2. width, height의 변화비율을 scale-x, scale-y 에 보관한다.\n\n var scale = {\n x: bounds.width / old_bounds.width,\n y: bounds.height / old_bounds.height\n }\n\n // 3. 기존 포인트들을 기존 거리에 scale-x, scale-y 만큼 조정된 위치로 새로운 bounds의 left-top으로부터 설정한다.\n\n this.path = this.path.map(point => {\n return {\n x: bounds.left + (point.x - old_bounds.left) * scale.x,\n y: bounds.top + (point.y - old_bounds.top) * scale.y\n }\n })\n\n // 4. PATH스타일(mutable)의 도형은 mutatePath를 사용하고,\n // Bounds 스타일 도형은 기존 포인트들을 기존 거리에 scale-x, scale-y 만큼 조정된 center 위치로부터\n // 새로운 bounds를 설정한다.\n\n this.components &&\n this.components.forEach(comp => {\n if (comp.mutable) {\n comp.mutatePath(null, function (path_in_parent) {\n return path_in_parent.map(function (point) {\n return {\n x: point.x * scale.x,\n y: point.y * scale.y\n }\n })\n })\n } else {\n let bounds = comp.bounds\n let center = comp.center\n\n let delta_center = {\n x: center.x * (1 - scale.x),\n y: center.y * (1 - scale.y)\n }\n\n let delta_width = bounds.width * (1 - scale.x)\n let delta_height = bounds.height * (1 - scale.y)\n\n let delta_left = -(delta_center.x - delta_width / 2)\n let delta_top = -(delta_center.y - delta_height / 2)\n\n comp.bounds = {\n left: bounds.left + delta_left,\n top: bounds.top + delta_top,\n width: bounds.width * scale.x,\n height: bounds.height * scale.y\n }\n }\n })\n }\n\n get focusible() {\n return false\n }\n\n get bounds() {\n return super.bounds\n }\n\n get hasTextProperty() {\n return false\n }\n\n calculateBounds() {\n this.clearCache()\n\n this.__MUTATING__ = true\n\n this.mutateBounds(function (bounds) {\n var union = Component.union(\n this.components.map(component => {\n return component.bounds\n })\n )\n\n this.components.forEach(component => {\n let cbounds = component.bounds\n\n component.bounds = {\n left: cbounds.left - union.left,\n top: cbounds.top - union.top,\n width: cbounds.width,\n height: cbounds.height\n }\n })\n\n return {\n left: bounds.left + union.left,\n top: bounds.top + union.top,\n width: union.width,\n height: union.height\n }\n }, this)\n\n this.__MUTATING__ = false\n\n if (this.parent.isGroup()) this.parent.calculateBounds()\n }\n\n /* 그룹은 자체적으로는 아무것도 그리지 않는다. */\n\n render(context) {}\n\n postrender(context) {\n /* 자식 컴포넌트들 그리기 */\n var { top, left, scale } = this.state\n context.translate(left, top)\n\n this.layout.drawables(this).forEach(m => {\n m.draw(context)\n })\n\n context.translate(-left, -top)\n }\n}\n\nComponent.register('group', Group)\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function fill(component: any): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function reposition(component: any): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function shadow(component: any): void;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
declare const HTMLOverlayContainer_base: {
|
|
2
|
+
new (): {
|
|
3
|
+
[x: string]: any;
|
|
4
|
+
isHTMLElement(): boolean;
|
|
5
|
+
isShadowable(): boolean;
|
|
6
|
+
element: any;
|
|
7
|
+
_element: any;
|
|
8
|
+
readonly tagName: any;
|
|
9
|
+
setElementProperties(element: any): void;
|
|
10
|
+
createElement(): void;
|
|
11
|
+
userInputEventHandler(e: any): void;
|
|
12
|
+
reposition(): void;
|
|
13
|
+
disposeElement(): void;
|
|
14
|
+
ready(): void;
|
|
15
|
+
dispose(): void;
|
|
16
|
+
readonly hasTextProperty: boolean;
|
|
17
|
+
readonly textHidden: boolean;
|
|
18
|
+
onchange(after: any, before: any): void;
|
|
19
|
+
isDescendible(container: any): any;
|
|
20
|
+
};
|
|
21
|
+
[x: string]: any;
|
|
22
|
+
};
|
|
23
|
+
export default class HTMLOverlayContainer extends HTMLOverlayContainer_base {
|
|
24
|
+
render(context: any): void;
|
|
25
|
+
get layout(): any;
|
|
26
|
+
}
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright © HatioLab Inc. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import ContainerAbstract from './container-abstract';
|
|
5
|
+
import MixinHTMLElement from './mixins/html-element';
|
|
6
|
+
import { Layout, HTMLAbsoluteLayout } from '../layout';
|
|
7
|
+
export default class HTMLOverlayContainer extends MixinHTMLElement(ContainerAbstract) {
|
|
8
|
+
/* render .. */
|
|
9
|
+
render(context) { }
|
|
10
|
+
get layout() {
|
|
11
|
+
return Layout.get(this.get('layout')) || HTMLAbsoluteLayout;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=html-overlay-container.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-overlay-container.js","sourceRoot":"","sources":["../../src/components/html-overlay-container.js"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,iBAAiB,MAAM,sBAAsB,CAAA;AACpD,OAAO,gBAAgB,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAEtD,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,gBAAgB,CAAC,iBAAiB,CAAC;IACnF,eAAe;IAEf,MAAM,CAAC,OAAO,IAAG,CAAC;IAElB,IAAI,MAAM;QACR,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,kBAAkB,CAAA;IAC7D,CAAC;CACF","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport ContainerAbstract from './container-abstract'\nimport MixinHTMLElement from './mixins/html-element'\nimport { Layout, HTMLAbsoluteLayout } from '../layout'\n\nexport default class HTMLOverlayContainer extends MixinHTMLElement(ContainerAbstract) {\n /* render .. */\n\n render(context) {}\n\n get layout() {\n return Layout.get(this.get('layout')) || HTMLAbsoluteLayout\n }\n}\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
declare const HTMLOverlayElement_base: {
|
|
2
|
+
new (): {
|
|
3
|
+
[x: string]: any;
|
|
4
|
+
isHTMLElement(): boolean;
|
|
5
|
+
isShadowable(): boolean;
|
|
6
|
+
element: any;
|
|
7
|
+
_element: any;
|
|
8
|
+
readonly tagName: any;
|
|
9
|
+
setElementProperties(element: any): void;
|
|
10
|
+
createElement(): void;
|
|
11
|
+
userInputEventHandler(e: any): void;
|
|
12
|
+
reposition(): void;
|
|
13
|
+
disposeElement(): void;
|
|
14
|
+
ready(): void;
|
|
15
|
+
dispose(): void;
|
|
16
|
+
readonly hasTextProperty: boolean;
|
|
17
|
+
readonly textHidden: boolean;
|
|
18
|
+
onchange(after: any, before: any): void;
|
|
19
|
+
isDescendible(container: any): any;
|
|
20
|
+
};
|
|
21
|
+
[x: string]: any;
|
|
22
|
+
};
|
|
23
|
+
export default class HTMLOverlayElement extends HTMLOverlayElement_base {
|
|
24
|
+
}
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright © HatioLab Inc. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import Component from './component';
|
|
5
|
+
import RectPath from './mixins/rect-path';
|
|
6
|
+
import MixinHTMLElement from './mixins/html-element';
|
|
7
|
+
export default class HTMLOverlayElement extends MixinHTMLElement(RectPath(Component)) {
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=html-overlay-element.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-overlay-element.js","sourceRoot":"","sources":["../../src/components/html-overlay-element.js"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,SAAS,MAAM,aAAa,CAAA;AACnC,OAAO,QAAQ,MAAM,oBAAoB,CAAA;AACzC,OAAO,gBAAgB,MAAM,uBAAuB,CAAA;AAEpD,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;CAAG","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport Component from './component'\nimport RectPath from './mixins/rect-path'\nimport MixinHTMLElement from './mixins/html-element'\n\nexport default class HTMLOverlayElement extends MixinHTMLElement(RectPath(Component)) {}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ComponentNature, Properties, Shape } from '@hatiolab/things-scene';
|
|
2
|
+
declare const ImageView_base: typeof Shape;
|
|
3
|
+
export default class ImageView extends ImageView_base {
|
|
4
|
+
static NOIMAGE?: any;
|
|
5
|
+
static get noimage(): any;
|
|
6
|
+
_offcanvas?: HTMLCanvasElement;
|
|
7
|
+
_image?: any;
|
|
8
|
+
dispose(): void;
|
|
9
|
+
render(ctx: CanvasRenderingContext2D): void;
|
|
10
|
+
get nature(): ComponentNature;
|
|
11
|
+
get hasTextProperty(): boolean;
|
|
12
|
+
ready(): void;
|
|
13
|
+
prepare(resolve: (ret?: any) => void, reject: (e?: any) => void): void;
|
|
14
|
+
get src(): any;
|
|
15
|
+
set src(src: any);
|
|
16
|
+
onchange(after: Properties, before: Properties): void;
|
|
17
|
+
ondropfile(transfered: DataTransferItemList, files: FileList): void;
|
|
18
|
+
}
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright © HatioLab Inc. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import { error, Component, RectPath, Shape } from '@hatiolab/things-scene';
|
|
5
|
+
const NATURE = {
|
|
6
|
+
mutable: false,
|
|
7
|
+
resizable: true,
|
|
8
|
+
rotatable: true,
|
|
9
|
+
properties: [
|
|
10
|
+
{
|
|
11
|
+
type: 'image-selector',
|
|
12
|
+
label: 'image-src',
|
|
13
|
+
name: 'src',
|
|
14
|
+
property: {
|
|
15
|
+
displayField: 'id',
|
|
16
|
+
displayFullUrl: true,
|
|
17
|
+
baseUrlAlias: '$base_url',
|
|
18
|
+
defaultStorage: 'scene-image',
|
|
19
|
+
storageFilters: {
|
|
20
|
+
type: Array,
|
|
21
|
+
value: [
|
|
22
|
+
{
|
|
23
|
+
name: 'category',
|
|
24
|
+
value: 'image'
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
},
|
|
28
|
+
useUpload: true
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
type: 'select',
|
|
33
|
+
label: 'cross-origin',
|
|
34
|
+
name: 'crossOrigin',
|
|
35
|
+
property: {
|
|
36
|
+
options: ['', 'anonymous', 'use-credentials']
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
],
|
|
40
|
+
'value-property': 'src',
|
|
41
|
+
help: 'scene/component/image-view'
|
|
42
|
+
};
|
|
43
|
+
const NOIMAGE_DATA_URI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABIBAMAAAD7Se1QAAAAIVBMVEUAAABHcEwBAQEREREBAQEEBAQGBgYLCwsDAwMDAwMICAi6HF9tAAAAC3RSTlNNAEAERiMYCS41Eac10lYAAAEgSURBVHhe7dY9asQwEAXgh7DNertNiJy48pIitY3SB7bYdk0ukL1BDDmA9gZecoH4pmFQ3MQayUMguPBrNPD4wD9TCMvJmt3M/AtYwXOlXiWgqADVCUBD46MAnGhMBaCiUQmAm8VA/Eh/eWl9Fn5WcxD+OLuRrUYJDKLluwH2InACUgkoACSdADxQc50Bytadb9RkM0CT13TcvlCT1HFg8UTHvasuUVACCa3El6u2UdD8LFTlKhUFFgA+d3dj10aABkUN72N3jAADCrJq7PIIsPidcxBoTHIIAjMFmyCwmGYIAA1P9gFgfCANAOsDSccCDW+uLDB+kLGg94OkZoAGkwsDDAe2DOg5oPxAg03rBR88OHpBz4N8UVeHFSwma74BTW6Ge4rIRa4AAAAASUVORK5CYII=';
|
|
44
|
+
export default class ImageView extends RectPath(Shape) {
|
|
45
|
+
static get noimage() {
|
|
46
|
+
if (!ImageView.NOIMAGE) {
|
|
47
|
+
ImageView.NOIMAGE = new Image();
|
|
48
|
+
ImageView.NOIMAGE.src = NOIMAGE_DATA_URI;
|
|
49
|
+
}
|
|
50
|
+
return ImageView.NOIMAGE;
|
|
51
|
+
}
|
|
52
|
+
dispose() {
|
|
53
|
+
super.dispose();
|
|
54
|
+
delete this._offcanvas;
|
|
55
|
+
delete this._image;
|
|
56
|
+
}
|
|
57
|
+
render(ctx) {
|
|
58
|
+
var { left, top, width, height, isGray = false, alpha = 1, src } = this.state;
|
|
59
|
+
this.prepareIf(!this._image && src);
|
|
60
|
+
// 박스 그리기
|
|
61
|
+
ctx.beginPath();
|
|
62
|
+
ctx.globalAlpha *= alpha;
|
|
63
|
+
if (this._image && this._image.complete) {
|
|
64
|
+
if (isGray && this._offcanvas) {
|
|
65
|
+
ctx.drawImage(this._offcanvas, left, top, width, height);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
try {
|
|
69
|
+
ctx.drawImage(this._image, left, top, width, height);
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
ctx.drawImage(ImageView.noimage, left, top, width, height);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
!this.app.isViewMode && ctx.drawImage(ImageView.noimage, left, top, width, height);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
get nature() {
|
|
81
|
+
return NATURE;
|
|
82
|
+
}
|
|
83
|
+
get hasTextProperty() {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
ready() {
|
|
87
|
+
super.ready();
|
|
88
|
+
this.prepareIf(!this._image && this.state.src);
|
|
89
|
+
}
|
|
90
|
+
prepare(resolve, reject) {
|
|
91
|
+
var { src, crossOrigin } = this.state;
|
|
92
|
+
if (!src) {
|
|
93
|
+
resolve(this);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
this._image = new Image();
|
|
97
|
+
try {
|
|
98
|
+
if (crossOrigin) {
|
|
99
|
+
this._image.crossOrigin = crossOrigin;
|
|
100
|
+
}
|
|
101
|
+
this._image.src = this.app.url(src) || '';
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
reject(e);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
this._image.onload = () => {
|
|
108
|
+
if (this.get('isGray')) {
|
|
109
|
+
let width = this._image.width;
|
|
110
|
+
let height = this._image.height;
|
|
111
|
+
this._offcanvas = Component.createCanvas(width, height);
|
|
112
|
+
let offcontext = this._offcanvas.getContext('2d');
|
|
113
|
+
offcontext.drawImage(this._image, 0, 0);
|
|
114
|
+
let imageData = makeGrayImage(offcontext, width, height);
|
|
115
|
+
offcontext.putImageData(imageData, 0, 0);
|
|
116
|
+
}
|
|
117
|
+
resolve(this);
|
|
118
|
+
};
|
|
119
|
+
this._image.onerror = (e) => {
|
|
120
|
+
if (this._image && !this._image.currentSrc)
|
|
121
|
+
this._image = null;
|
|
122
|
+
reject(e);
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
get src() {
|
|
126
|
+
return this.get('src');
|
|
127
|
+
}
|
|
128
|
+
set src(src) {
|
|
129
|
+
this.set('src', src);
|
|
130
|
+
}
|
|
131
|
+
onchange(after, before) {
|
|
132
|
+
if (after.hasOwnProperty('src') || after.hasOwnProperty('isGray')) {
|
|
133
|
+
delete this._offcanvas;
|
|
134
|
+
delete this._image;
|
|
135
|
+
this.prepareIf(after.src);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
ondropfile(transfered, files) {
|
|
139
|
+
for (let i = 0; i < transfered.length; i++) {
|
|
140
|
+
if (transfered[i].type.startsWith('image/')) {
|
|
141
|
+
this.src = files[i];
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function makeGrayImage(ctx, width, height) {
|
|
148
|
+
try {
|
|
149
|
+
var img = ctx.getImageData(0, 0, width, height);
|
|
150
|
+
}
|
|
151
|
+
catch (e) {
|
|
152
|
+
error('Get Image Data Error: ' + e.message);
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
var data = img.data;
|
|
156
|
+
// Loop through data.
|
|
157
|
+
for (let i = 0; i < width * height * 4; i += 4) {
|
|
158
|
+
// First bytes are red bytes.
|
|
159
|
+
// Get red value.
|
|
160
|
+
let red = data[i];
|
|
161
|
+
// Second bytes are green bytes.
|
|
162
|
+
// Get green value.
|
|
163
|
+
let green = data[i + 1];
|
|
164
|
+
// Third bytes are blue bytes.
|
|
165
|
+
// Get blue value.
|
|
166
|
+
let blue = data[i + 2];
|
|
167
|
+
// Fourth bytes are alpha bytes
|
|
168
|
+
// We don't care about alpha here.
|
|
169
|
+
// Add the three values and divide by three.
|
|
170
|
+
// Make it an integer.
|
|
171
|
+
let gray = parseInt(String((red + green + blue) / 3));
|
|
172
|
+
// Assign average to red, green, and blue.
|
|
173
|
+
img.data[i] = gray;
|
|
174
|
+
img.data[i + 1] = gray;
|
|
175
|
+
img.data[i + 2] = gray;
|
|
176
|
+
}
|
|
177
|
+
return img;
|
|
178
|
+
}
|
|
179
|
+
Component.register('image-view', ImageView);
|
|
180
|
+
//# sourceMappingURL=image-view.js.map
|