@operato/board 10.0.0-beta.1 → 10.0.0-beta.10
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/CHANGELOG.md +98 -0
- package/dist/src/graphql/playback-subscription.d.ts +74 -0
- package/dist/src/graphql/playback-subscription.js +191 -0
- package/dist/src/graphql/playback-subscription.js.map +1 -0
- package/dist/src/modeller/edit-toolbar-style.js +38 -1
- package/dist/src/modeller/edit-toolbar-style.js.map +1 -1
- package/dist/src/modeller/edit-toolbar.d.ts +5 -0
- package/dist/src/modeller/edit-toolbar.js +168 -47
- package/dist/src/modeller/edit-toolbar.js.map +1 -1
- package/dist/src/modeller/scene-viewer/ox-scene-viewer.js +1 -10
- package/dist/src/modeller/scene-viewer/ox-scene-viewer.js.map +1 -1
- package/dist/src/ox-board-viewer.d.ts +42 -0
- package/dist/src/ox-board-viewer.js +199 -23
- package/dist/src/ox-board-viewer.js.map +1 -1
- package/dist/src/ox-playback-controls.d.ts +48 -0
- package/dist/src/ox-playback-controls.js +419 -0
- package/dist/src/ox-playback-controls.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +15 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ox-scene-viewer.js","sourceRoot":"","sources":["../../../../src/modeller/scene-viewer/ox-scene-viewer.ts"],"names":[],"mappings":"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","sourcesContent":["import './confidential-overlay.js'\nimport './ox-scene-layer.js'\nimport './ox-scene-handler.js'\n\nimport { css, html, LitElement, PropertyValues } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { Component, create as createScene, FITMODE, Model, Properties, Scene, SCENE_MODE, SceneMode } from '@hatiolab/things-scene'\n\nimport OxSceneLayer from './ox-scene-layer.js'\n\n@customElement('ox-scene-viewer')\nexport default class OxSceneViewer extends LitElement {\n static styles = css`\n :host {\n outline: none;\n }\n `\n\n @property({ type: Object }) scene: Scene | null = null\n @property({ type: Object }) model?: Model\n /* Scene Mode - mode 0 : view mode, mode 1 : edit mode, mode 2 : shift mode */\n @property({ type: Number }) mode: SceneMode = SCENE_MODE.VIEW\n @property({ type: Number }) screenSize: number = 13.3\n @property({ type: Object }) variables: Properties = {}\n @property({ type: Object }) data: any\n /*\n * 캔바스에 모델을 어떻게 적절하게 보여줄 것인지를 설정한다.\n *\n * @none 가로, 세로 스케일을 1로 고정하고, {0, 0}좌표로 translate시킨다.\n * @both 캔바스에 모델을 꼭 채우도록 가로, 세로 스케일을 조정하고, {0, 0}좌표로 translate시킨다.\n * @width 캔바스의 폭에 모델의 폭을 일치하도록 가로, 세로 스케일을 동일하게 조정하고, {0, 0}좌표로 translate시킨다.\n * @height 캔바스의 높이에 모델의 높이를 일치하도록 가로, 세로 스케일을 동일하게 조정하고, {0, 0}좌표로 translate시킨다.\n * @center 가로, 세로 스케일을 1로 고정하고 모델이 화면의 중앙에 위치하도록 translate시킨다.\n * @ratio 모델의 모든 부분이 캔바스에 최대 크기로 표현될 수 있도록 가로, 세로 동일한 스케일로 조정하고, {0, 0}좌표로 translate시킨다.\n */\n @property({ type: String }) fit: FITMODE = 'none'\n @property({ type: Array }) selected: Component[] = []\n @property({ type: Boolean }) disposeWhenDetached: boolean = false\n @property({ type: String }) baseUrl: string = ''\n @property({ type: Object }) provider: any\n @property({ type: String }) name: string = 'noname'\n @property({ type: Boolean }) enableInspector: boolean = true\n @property({ type: Boolean }) showInspector: boolean = false\n\n private lastOffsetWidth?: number\n\n disconnectedCallback() {\n super.disconnectedCallback()\n\n if (this.scene && this.disposeWhenDetached) {\n this._disposeScene()\n }\n }\n\n render() {\n return html` <slot></slot> `\n }\n\n updated(change: PropertyValues<this>) {\n change.has('model') && this._onModelChanged(this.model)\n change.has('mode') && this._onModeChanged(this.mode)\n change.has('screenSize') && this._onDisplayChanged(this.screenSize)\n change.has('data') && this._onDataChanged(this.data)\n change.has('baseUrl') && this._onBaseUrlChanged(this.baseUrl)\n }\n\n _setScene(scene: Scene | null) {\n this.scene = scene\n this.dispatchEvent(\n new CustomEvent('scene-changed', {\n bubbles: true,\n composed: true,\n detail: { value: scene }\n })\n )\n }\n\n _setMode(mode: SceneMode) {\n this.mode = mode\n this.dispatchEvent(\n new CustomEvent('mode-changed', {\n bubbles: true,\n composed: true,\n detail: { value: mode }\n })\n )\n }\n\n _setVariables(variables: Properties) {\n this.variables = variables\n this.dispatchEvent(\n new CustomEvent('variables-changed', {\n bubbles: true,\n composed: true,\n detail: { value: variables }\n })\n )\n }\n\n _setSelected(selected: Component[]) {\n this.selected = selected\n this.dispatchEvent(\n new CustomEvent('selected-changed', {\n bubbles: true,\n composed: true,\n detail: { value: selected }\n })\n )\n }\n\n _disposeScene() {\n if (this.scene) {\n this.scene.off('selected', this._onSelectedChanged, this)\n this.scene.off('mode', this._onSceneModeChanged, this)\n\n if (this.provider) {\n this.scene.release && this.scene.release()\n } else {\n this.scene.dispose()\n }\n\n this._setScene(null)\n this._setSelected([])\n }\n }\n\n resize(force: boolean) {\n if (typeof this.scene == 'object') {\n if (force || this.fit === 'both' || Math.abs(this.offsetWidth - (this.lastOffsetWidth || 0)) >= 1) {\n requestAnimationFrame(() => {\n if (this.scene) {\n this.scene.resize()\n this.scene.fit(this.fit)\n }\n })\n }\n\n this.lastOffsetWidth = this.offsetWidth\n }\n }\n\n _onModelChanged(model?: Model) {\n this._disposeScene()\n\n if (!model) {\n return\n }\n\n const layers: any[] = Array.from(this.querySelectorAll('ox-scene-layer')).map(layer => (layer as OxSceneLayer).getModel())\n\n const handlers: any[] = Array.from(this.querySelectorAll('ox-scene-handler')).map(handler => handler.getAttribute('type'))\n\n this._setScene(\n createScene({\n target: this,\n model: JSON.parse(JSON.stringify(model)),\n layers,\n handlers,\n mode: this.mode,\n refProvider: this.provider\n })\n )\n\n if (this.provider) {\n this.provider.add(this.name, this.scene)\n }\n\n this.scene!.screen = this.screenSize\n\n /* 이 컴포넌트의 폭이 값을 가지고 있으면 - 화면상에 자리를 잡고 보여지고 있음을 의미한다.\n * 이 때는 정상적으로 그려주고,\n * 그렇지 않으면, 다음 Resize Handling시에 처리하도록 한다.\n */\n this.resize(true)\n\n this._setVariables(model.variables || (this.scene! as any).variables)\n\n this.scene!.on('selected', this._onSelectedChanged, this)\n this.scene!.on('mode', this._onSceneModeChanged, this)\n\n this._onModeChanged(this.mode)\n this._onDisplayChanged(this.screenSize)\n this._onBaseUrlChanged(this.baseUrl)\n\n this.focus()\n }\n\n _onDisplayChanged(screenSize: string | number) {\n if (!this.scene) {\n return\n }\n\n if (screenSize) {\n this.scene.screen = parseFloat(String(screenSize))\n }\n }\n\n _onModeChanged(mode: SceneMode) {\n if (!this.scene) {\n return\n }\n this.scene.mode = Number(mode)\n }\n\n _onDataChanged(data: any) {\n if (!this.scene || !data) {\n return\n }\n\n this.scene.data = data\n }\n\n _onSelectedChanged(after: Component[]) {\n /*\n scene 컴포넌트의 속성을 속성 에디터(input box등)에서 변경하다가,\n scene의 다른 컴포넌트를 클릭해서 포커스(선택) 컴포넌트를 변경하게되면,\n 속성 에디터(input box등)의 value change 이벤트의 처리와 충돌(레이스)하게된다.\n \n 기대하는 순서는 먼저 속성 에디터의 value change 이벤트를 처리한 후에,\n selected 이벤트를 처리할 수 있도록 requestAnimationFrame으로 한 프레임을 지연하도록 하였다.\n */\n requestAnimationFrame(() => {\n this._setSelected(after)\n })\n }\n\n _onSceneModeChanged(after: SceneMode) {\n if (!this.scene) {\n return\n }\n\n if (this.mode !== after) {\n this._setMode(after)\n }\n\n switch (after) {\n case 1:\n this.style.cursor = 'default'\n break\n case 2:\n this.style.cursor = 'all-scroll'\n break\n case 3:\n this.style.cursor = 'crosshair'\n break\n case 4:\n this.style.cursor = 'copy'\n break\n case 5:\n this.style.cursor = 'context-menu'\n break\n }\n }\n\n _onBaseUrlChanged(after: string) {\n if (!this.scene) {\n return\n }\n\n this.scene.baseUrl = after\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ox-scene-viewer.js","sourceRoot":"","sources":["../../../../src/modeller/scene-viewer/ox-scene-viewer.ts"],"names":[],"mappings":"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","sourcesContent":["import './confidential-overlay.js'\nimport './ox-scene-layer.js'\nimport './ox-scene-handler.js'\n\nimport { css, html, LitElement, PropertyValues } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { Component, create as createScene, FITMODE, Model, Properties, Scene, SCENE_MODE, SceneMode } from '@hatiolab/things-scene'\n\nimport OxSceneLayer from './ox-scene-layer.js'\n\n@customElement('ox-scene-viewer')\nexport default class OxSceneViewer extends LitElement {\n static styles = css`\n :host {\n outline: none;\n }\n `\n\n scene: Scene | null = null\n @property({ type: Object }) model?: Model\n /* Scene Mode - mode 0 : view mode, mode 1 : edit mode, mode 2 : shift mode */\n @property({ type: Number }) mode: SceneMode = SCENE_MODE.VIEW\n @property({ type: Number }) screenSize: number = 13.3\n variables: Properties = {}\n @property({ type: Object }) data: any\n /*\n * 캔바스에 모델을 어떻게 적절하게 보여줄 것인지를 설정한다.\n *\n * @none 가로, 세로 스케일을 1로 고정하고, {0, 0}좌표로 translate시킨다.\n * @both 캔바스에 모델을 꼭 채우도록 가로, 세로 스케일을 조정하고, {0, 0}좌표로 translate시킨다.\n * @width 캔바스의 폭에 모델의 폭을 일치하도록 가로, 세로 스케일을 동일하게 조정하고, {0, 0}좌표로 translate시킨다.\n * @height 캔바스의 높이에 모델의 높이를 일치하도록 가로, 세로 스케일을 동일하게 조정하고, {0, 0}좌표로 translate시킨다.\n * @center 가로, 세로 스케일을 1로 고정하고 모델이 화면의 중앙에 위치하도록 translate시킨다.\n * @ratio 모델의 모든 부분이 캔바스에 최대 크기로 표현될 수 있도록 가로, 세로 동일한 스케일로 조정하고, {0, 0}좌표로 translate시킨다.\n */\n @property({ type: String }) fit: FITMODE = 'none'\n selected: Component[] = []\n @property({ type: Boolean }) disposeWhenDetached: boolean = false\n @property({ type: String }) baseUrl: string = ''\n @property({ type: Object }) provider: any\n @property({ type: String }) name: string = 'noname'\n @property({ type: Boolean }) enableInspector: boolean = true\n @property({ type: Boolean }) showInspector: boolean = false\n\n private lastOffsetWidth?: number\n\n disconnectedCallback() {\n super.disconnectedCallback()\n\n if (this.scene && this.disposeWhenDetached) {\n this._disposeScene()\n }\n }\n\n render() {\n return html` <slot></slot> `\n }\n\n updated(change: PropertyValues<this>) {\n change.has('model') && this._onModelChanged(this.model)\n change.has('mode') && this._onModeChanged(this.mode)\n change.has('screenSize') && this._onDisplayChanged(this.screenSize)\n change.has('data') && this._onDataChanged(this.data)\n change.has('baseUrl') && this._onBaseUrlChanged(this.baseUrl)\n }\n\n _setScene(scene: Scene | null) {\n this.scene = scene\n this.dispatchEvent(\n new CustomEvent('scene-changed', {\n bubbles: true,\n composed: true,\n detail: { value: scene }\n })\n )\n }\n\n _setMode(mode: SceneMode) {\n this.mode = mode\n this.dispatchEvent(\n new CustomEvent('mode-changed', {\n bubbles: true,\n composed: true,\n detail: { value: mode }\n })\n )\n }\n\n _setVariables(variables: Properties) {\n this.variables = variables\n this.dispatchEvent(\n new CustomEvent('variables-changed', {\n bubbles: true,\n composed: true,\n detail: { value: variables }\n })\n )\n }\n\n _setSelected(selected: Component[]) {\n this.selected = selected\n this.dispatchEvent(\n new CustomEvent('selected-changed', {\n bubbles: true,\n composed: true,\n detail: { value: selected }\n })\n )\n }\n\n _disposeScene() {\n if (this.scene) {\n this.scene.off('selected', this._onSelectedChanged, this)\n this.scene.off('mode', this._onSceneModeChanged, this)\n\n if (this.provider) {\n this.scene.release && this.scene.release()\n } else {\n this.scene.dispose()\n }\n\n this._setScene(null)\n this._setSelected([])\n }\n }\n\n resize(force: boolean) {\n if (typeof this.scene == 'object') {\n if (force || this.fit === 'both' || Math.abs(this.offsetWidth - (this.lastOffsetWidth || 0)) >= 1) {\n requestAnimationFrame(() => {\n if (this.scene) {\n this.scene.resize()\n this.scene.fit(this.fit)\n }\n })\n }\n\n this.lastOffsetWidth = this.offsetWidth\n }\n }\n\n _onModelChanged(model?: Model) {\n this._disposeScene()\n\n if (!model) {\n return\n }\n\n const layers: any[] = Array.from(this.querySelectorAll('ox-scene-layer')).map(layer => (layer as OxSceneLayer).getModel())\n\n const handlers: any[] = Array.from(this.querySelectorAll('ox-scene-handler')).map(handler => handler.getAttribute('type'))\n\n this._setScene(\n createScene({\n target: this,\n model: JSON.parse(JSON.stringify(model)),\n layers,\n handlers,\n mode: this.mode,\n refProvider: this.provider\n })\n )\n\n if (this.provider) {\n this.provider.add(this.name, this.scene)\n }\n\n this.scene!.screen = this.screenSize\n\n /* 이 컴포넌트의 폭이 값을 가지고 있으면 - 화면상에 자리를 잡고 보여지고 있음을 의미한다.\n * 이 때는 정상적으로 그려주고,\n * 그렇지 않으면, 다음 Resize Handling시에 처리하도록 한다.\n */\n this.resize(true)\n\n this._setVariables(model.variables || (this.scene! as any).variables)\n\n this.scene!.on('selected', this._onSelectedChanged, this)\n this.scene!.on('mode', this._onSceneModeChanged, this)\n\n this._onModeChanged(this.mode)\n this._onDisplayChanged(this.screenSize)\n this._onBaseUrlChanged(this.baseUrl)\n\n this.focus()\n }\n\n _onDisplayChanged(screenSize: string | number) {\n if (!this.scene) {\n return\n }\n\n if (screenSize) {\n this.scene.screen = parseFloat(String(screenSize))\n }\n }\n\n _onModeChanged(mode: SceneMode) {\n if (!this.scene) {\n return\n }\n this.scene.mode = Number(mode)\n }\n\n _onDataChanged(data: any) {\n if (!this.scene || !data) {\n return\n }\n\n this.scene.data = data\n }\n\n _onSelectedChanged(after: Component[]) {\n /*\n scene 컴포넌트의 속성을 속성 에디터(input box등)에서 변경하다가,\n scene의 다른 컴포넌트를 클릭해서 포커스(선택) 컴포넌트를 변경하게되면,\n 속성 에디터(input box등)의 value change 이벤트의 처리와 충돌(레이스)하게된다.\n \n 기대하는 순서는 먼저 속성 에디터의 value change 이벤트를 처리한 후에,\n selected 이벤트를 처리할 수 있도록 requestAnimationFrame으로 한 프레임을 지연하도록 하였다.\n */\n requestAnimationFrame(() => {\n this._setSelected(after)\n })\n }\n\n _onSceneModeChanged(after: SceneMode) {\n if (!this.scene) {\n return\n }\n\n if (this.mode !== after) {\n this._setMode(after)\n }\n\n switch (after) {\n case 1:\n this.style.cursor = 'default'\n break\n case 2:\n this.style.cursor = 'grab'\n break\n case 3:\n this.style.cursor = 'crosshair'\n break\n case 4:\n this.style.cursor = 'copy'\n break\n case 5:\n this.style.cursor = 'context-menu'\n break\n }\n }\n\n _onBaseUrlChanged(after: string) {\n if (!this.scene) {\n return\n }\n\n this.scene.baseUrl = after\n }\n}\n"]}
|
|
@@ -2,6 +2,7 @@ import '@material/web/icon/icon.js';
|
|
|
2
2
|
import '@material/web/fab/fab.js';
|
|
3
3
|
import { LitElement, PropertyValues } from 'lit';
|
|
4
4
|
import { Component, ReferenceProvider } from '@hatiolab/things-scene';
|
|
5
|
+
import './ox-playback-controls.js';
|
|
5
6
|
export declare class BoardViewer extends LitElement {
|
|
6
7
|
static styles: import("lit").CSSResult[];
|
|
7
8
|
baseUrl: string;
|
|
@@ -12,6 +13,17 @@ export declare class BoardViewer extends LitElement {
|
|
|
12
13
|
history: boolean;
|
|
13
14
|
hideFullscreen: boolean;
|
|
14
15
|
hideNavigation: boolean;
|
|
16
|
+
playbackEnabled: boolean;
|
|
17
|
+
playbackTimeRange?: {
|
|
18
|
+
from: Date;
|
|
19
|
+
to: Date;
|
|
20
|
+
};
|
|
21
|
+
private _playbackState;
|
|
22
|
+
private _playbackActive;
|
|
23
|
+
private _playbackSpeed;
|
|
24
|
+
private _playbackCurrentTime;
|
|
25
|
+
private _playbackProvider;
|
|
26
|
+
private _savedRealProvider;
|
|
15
27
|
_scene: any;
|
|
16
28
|
_forward: {
|
|
17
29
|
id: string;
|
|
@@ -29,6 +41,7 @@ export declare class BoardViewer extends LitElement {
|
|
|
29
41
|
_prev: HTMLElement;
|
|
30
42
|
_next: HTMLElement;
|
|
31
43
|
_fullscreen: HTMLElement;
|
|
44
|
+
_fabGroup: HTMLElement;
|
|
32
45
|
render(): import("lit-html").TemplateResult<1>;
|
|
33
46
|
private resizeHandler;
|
|
34
47
|
connectedCallback(): void;
|
|
@@ -61,6 +74,35 @@ export declare class BoardViewer extends LitElement {
|
|
|
61
74
|
onExportData(filename: string, value: string | number | object, component: Component): Promise<void>;
|
|
62
75
|
onImportData(_: string, value: string | number | object, component: Component): Promise<void>;
|
|
63
76
|
onClickEvent(e: MouseEvent, hint: any): void;
|
|
77
|
+
/**
|
|
78
|
+
* 외부에서 플레이백을 활성화한다.
|
|
79
|
+
* playback-enabled 속성을 설정하면 컨트롤바가 나타나고,
|
|
80
|
+
* 이 메서드로 시간 범위 등 상세 설정을 할 수 있다.
|
|
81
|
+
*/
|
|
82
|
+
enablePlayback(config?: {
|
|
83
|
+
timeRange?: {
|
|
84
|
+
from: Date;
|
|
85
|
+
to: Date;
|
|
86
|
+
};
|
|
87
|
+
}): void;
|
|
88
|
+
disablePlayback(): void;
|
|
89
|
+
private _onTogglePlaybackPanel;
|
|
90
|
+
private _onPlaybackStart;
|
|
91
|
+
private _onPlaybackPause;
|
|
92
|
+
private _onPlaybackResume;
|
|
93
|
+
private _onPlaybackStop;
|
|
94
|
+
private _onPlaybackSeek;
|
|
95
|
+
private _onPlaybackSpeed;
|
|
96
|
+
private _startPlayback;
|
|
97
|
+
private _stopPlayback;
|
|
98
|
+
/**
|
|
99
|
+
* 모든 tag 컴포넌트의 기존 구독을 해제한다.
|
|
100
|
+
*/
|
|
101
|
+
private _unsubscribeAll;
|
|
102
|
+
/**
|
|
103
|
+
* 모든 tag 컴포넌트를 현재 provider로 재구독한다.
|
|
104
|
+
*/
|
|
105
|
+
private _resubscribeAll;
|
|
64
106
|
hidePopup(): void;
|
|
65
107
|
getSceneData(): any;
|
|
66
108
|
getSceneValues(): any;
|
|
@@ -9,6 +9,8 @@ import { isIOS, togglefullscreen } from '@operato/utils';
|
|
|
9
9
|
import { ScrollbarStyles } from '@operato/styles';
|
|
10
10
|
import { BoardDataStorage } from './data-storage/data-storage.js';
|
|
11
11
|
import { DataSubscriptionProviderImpl } from './graphql/data-subscription.js';
|
|
12
|
+
import { PlaybackProvider } from './graphql/playback-subscription.js';
|
|
13
|
+
import './ox-playback-controls.js';
|
|
12
14
|
import { runScenario, startScenario } from './graphql/scenario.js';
|
|
13
15
|
import { fetchPlayGroupByName } from './graphql/play-group.js';
|
|
14
16
|
function objectToQueryString(obj) {
|
|
@@ -36,6 +38,13 @@ let BoardViewer = class BoardViewer extends LitElement {
|
|
|
36
38
|
this.history = false;
|
|
37
39
|
this.hideFullscreen = false;
|
|
38
40
|
this.hideNavigation = false;
|
|
41
|
+
this.playbackEnabled = false;
|
|
42
|
+
this._playbackState = 'idle';
|
|
43
|
+
this._playbackActive = false;
|
|
44
|
+
this._playbackSpeed = 1;
|
|
45
|
+
this._playbackCurrentTime = '';
|
|
46
|
+
this._playbackProvider = null;
|
|
47
|
+
this._savedRealProvider = null;
|
|
39
48
|
this._scene = null;
|
|
40
49
|
this._forward = [];
|
|
41
50
|
this._backward = [];
|
|
@@ -45,19 +54,6 @@ let BoardViewer = class BoardViewer extends LitElement {
|
|
|
45
54
|
};
|
|
46
55
|
}
|
|
47
56
|
render() {
|
|
48
|
-
var fullscreen = !isIOS() && !this.hideFullscreen
|
|
49
|
-
? html `
|
|
50
|
-
<md-fab
|
|
51
|
-
id="fullscreen"
|
|
52
|
-
@click=${(e) => this.onTapFullscreen()}
|
|
53
|
-
@mouseover=${(e) => this.transientShowButtons(true)}
|
|
54
|
-
@mouseout=${(e) => this.transientShowButtons()}
|
|
55
|
-
title="fullscreen"
|
|
56
|
-
>
|
|
57
|
-
<md-icon slot="icon">${document.fullscreenElement ? 'fullscreen_exit' : 'fullscreen'}</md-icon>
|
|
58
|
-
</md-fab>
|
|
59
|
-
`
|
|
60
|
-
: html ``;
|
|
61
57
|
var prev = !this.hideNavigation
|
|
62
58
|
? html `
|
|
63
59
|
<md-icon
|
|
@@ -92,7 +88,49 @@ let BoardViewer = class BoardViewer extends LitElement {
|
|
|
92
88
|
></div>
|
|
93
89
|
|
|
94
90
|
<slot></slot>
|
|
95
|
-
${next}
|
|
91
|
+
${next}
|
|
92
|
+
|
|
93
|
+
<div
|
|
94
|
+
class="fab-group"
|
|
95
|
+
@mouseover=${(e) => this.transientShowButtons(true)}
|
|
96
|
+
@mouseout=${(e) => this.transientShowButtons()}
|
|
97
|
+
>
|
|
98
|
+
${!isIOS() && !this.hideFullscreen
|
|
99
|
+
? html `
|
|
100
|
+
<md-fab id="fullscreen" @click=${() => this.onTapFullscreen()} title="fullscreen">
|
|
101
|
+
<md-icon slot="icon">${document.fullscreenElement ? 'fullscreen_exit' : 'fullscreen'}</md-icon>
|
|
102
|
+
</md-fab>
|
|
103
|
+
`
|
|
104
|
+
: html ``}
|
|
105
|
+
${this.playbackEnabled
|
|
106
|
+
? html `
|
|
107
|
+
<md-fab
|
|
108
|
+
id="playback"
|
|
109
|
+
@click=${() => this._onTogglePlaybackPanel()}
|
|
110
|
+
title="playback"
|
|
111
|
+
>
|
|
112
|
+
<md-icon slot="icon">${this._playbackActive ? 'stop' : 'history'}</md-icon>
|
|
113
|
+
</md-fab>
|
|
114
|
+
`
|
|
115
|
+
: html ``}
|
|
116
|
+
</div>
|
|
117
|
+
|
|
118
|
+
${this._playbackActive
|
|
119
|
+
? html `
|
|
120
|
+
<ox-playback-controls
|
|
121
|
+
.playbackState=${this._playbackState}
|
|
122
|
+
.speed=${this._playbackSpeed}
|
|
123
|
+
.currentTime=${this._playbackCurrentTime}
|
|
124
|
+
.timeRange=${this.playbackTimeRange || { from: new Date(Date.now() - 3600000), to: new Date() }}
|
|
125
|
+
@playback-start=${this._onPlaybackStart}
|
|
126
|
+
@playback-pause=${this._onPlaybackPause}
|
|
127
|
+
@playback-resume=${this._onPlaybackResume}
|
|
128
|
+
@playback-stop=${this._onPlaybackStop}
|
|
129
|
+
@playback-seek=${this._onPlaybackSeek}
|
|
130
|
+
@playback-speed=${this._onPlaybackSpeed}
|
|
131
|
+
></ox-playback-controls>
|
|
132
|
+
`
|
|
133
|
+
: html ``}
|
|
96
134
|
`;
|
|
97
135
|
}
|
|
98
136
|
connectedCallback() {
|
|
@@ -156,6 +194,13 @@ let BoardViewer = class BoardViewer extends LitElement {
|
|
|
156
194
|
this.setupScene({ id: this.board.id, scene: this._scene });
|
|
157
195
|
}
|
|
158
196
|
closeScene() {
|
|
197
|
+
// 플레이백 중이면 정리
|
|
198
|
+
if (this._playbackProvider) {
|
|
199
|
+
this._playbackProvider.dispose();
|
|
200
|
+
this._playbackProvider = null;
|
|
201
|
+
this._savedRealProvider = null;
|
|
202
|
+
this._playbackState = 'idle';
|
|
203
|
+
}
|
|
159
204
|
if (this._scene) {
|
|
160
205
|
this.unbindSceneEvents(this._scene);
|
|
161
206
|
this._scene.target = null;
|
|
@@ -285,7 +330,8 @@ let BoardViewer = class BoardViewer extends LitElement {
|
|
|
285
330
|
transientShowButtons(stop) {
|
|
286
331
|
var buttons = [];
|
|
287
332
|
!this.hideNavigation && buttons.push(this._next, this._prev);
|
|
288
|
-
|
|
333
|
+
if (this._fabGroup)
|
|
334
|
+
buttons.push(this._fabGroup);
|
|
289
335
|
if (buttons.length == 0) {
|
|
290
336
|
return;
|
|
291
337
|
}
|
|
@@ -308,7 +354,7 @@ let BoardViewer = class BoardViewer extends LitElement {
|
|
|
308
354
|
}
|
|
309
355
|
this._forward.length <= 0 ? this._next.setAttribute('hidden', '') : this._next.removeAttribute('hidden');
|
|
310
356
|
this._backward.length <= 0 ? this._prev.setAttribute('hidden', '') : this._prev.removeAttribute('hidden');
|
|
311
|
-
this.
|
|
357
|
+
this._fabGroup && this._fabGroup.removeAttribute('hidden');
|
|
312
358
|
this._fade_animations.forEach(animation => {
|
|
313
359
|
animation.cancel();
|
|
314
360
|
if (stop)
|
|
@@ -452,6 +498,122 @@ let BoardViewer = class BoardViewer extends LitElement {
|
|
|
452
498
|
// clickComponent 이벤트만 발생시킨다.
|
|
453
499
|
window.dispatchEvent(new CustomEvent('clickComponent', { detail: component }));
|
|
454
500
|
}
|
|
501
|
+
/* playback */
|
|
502
|
+
/**
|
|
503
|
+
* 외부에서 플레이백을 활성화한다.
|
|
504
|
+
* playback-enabled 속성을 설정하면 컨트롤바가 나타나고,
|
|
505
|
+
* 이 메서드로 시간 범위 등 상세 설정을 할 수 있다.
|
|
506
|
+
*/
|
|
507
|
+
enablePlayback(config) {
|
|
508
|
+
this.playbackEnabled = true;
|
|
509
|
+
if (config === null || config === void 0 ? void 0 : config.timeRange) {
|
|
510
|
+
this.playbackTimeRange = config.timeRange;
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
disablePlayback() {
|
|
514
|
+
this._stopPlayback();
|
|
515
|
+
this._playbackActive = false;
|
|
516
|
+
this.playbackEnabled = false;
|
|
517
|
+
}
|
|
518
|
+
_onTogglePlaybackPanel() {
|
|
519
|
+
if (this._playbackActive) {
|
|
520
|
+
// 패널 닫기 — 재생 중이면 중지
|
|
521
|
+
this._stopPlayback();
|
|
522
|
+
this._playbackActive = false;
|
|
523
|
+
}
|
|
524
|
+
else {
|
|
525
|
+
this._playbackActive = true;
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
async _onPlaybackStart(e) {
|
|
529
|
+
const { fromTime, speed } = e.detail;
|
|
530
|
+
await this._startPlayback(fromTime, speed);
|
|
531
|
+
}
|
|
532
|
+
async _onPlaybackPause() {
|
|
533
|
+
var _a;
|
|
534
|
+
await ((_a = this._playbackProvider) === null || _a === void 0 ? void 0 : _a.pause());
|
|
535
|
+
}
|
|
536
|
+
async _onPlaybackResume() {
|
|
537
|
+
var _a;
|
|
538
|
+
await ((_a = this._playbackProvider) === null || _a === void 0 ? void 0 : _a.resume());
|
|
539
|
+
}
|
|
540
|
+
_onPlaybackStop() {
|
|
541
|
+
this._stopPlayback();
|
|
542
|
+
this._playbackActive = false;
|
|
543
|
+
}
|
|
544
|
+
async _onPlaybackSeek(e) {
|
|
545
|
+
var _a;
|
|
546
|
+
await ((_a = this._playbackProvider) === null || _a === void 0 ? void 0 : _a.seek(e.detail.toTime));
|
|
547
|
+
}
|
|
548
|
+
async _onPlaybackSpeed(e) {
|
|
549
|
+
var _a;
|
|
550
|
+
await ((_a = this._playbackProvider) === null || _a === void 0 ? void 0 : _a.setSpeed(e.detail.speed));
|
|
551
|
+
}
|
|
552
|
+
async _startPlayback(fromTime, speed) {
|
|
553
|
+
if (!this._scene)
|
|
554
|
+
return;
|
|
555
|
+
const rootContainer = this._scene.rootContainer;
|
|
556
|
+
// 실시간 provider 보관 및 구독 해제
|
|
557
|
+
if (!this._savedRealProvider) {
|
|
558
|
+
this._savedRealProvider = rootContainer.app.dataSubscriptionProvider;
|
|
559
|
+
await this._unsubscribeAll(rootContainer);
|
|
560
|
+
}
|
|
561
|
+
// PlaybackProvider 생성
|
|
562
|
+
this._playbackProvider = new PlaybackProvider((status) => {
|
|
563
|
+
this._playbackState = status.state;
|
|
564
|
+
this._playbackSpeed = status.speed;
|
|
565
|
+
this._playbackCurrentTime = status.currentTime;
|
|
566
|
+
});
|
|
567
|
+
// provider 교체 및 재구독
|
|
568
|
+
rootContainer.app.dataSubscriptionProvider = this._playbackProvider;
|
|
569
|
+
await this._resubscribeAll(rootContainer);
|
|
570
|
+
// 플레이백 시작
|
|
571
|
+
await this._playbackProvider.start(fromTime, speed);
|
|
572
|
+
}
|
|
573
|
+
async _stopPlayback() {
|
|
574
|
+
if (!this._scene || !this._playbackProvider)
|
|
575
|
+
return;
|
|
576
|
+
const rootContainer = this._scene.rootContainer;
|
|
577
|
+
// 플레이백 구독 해제
|
|
578
|
+
this._playbackProvider.dispose();
|
|
579
|
+
await this._unsubscribeAll(rootContainer);
|
|
580
|
+
// 실시간 provider 복귀
|
|
581
|
+
if (this._savedRealProvider) {
|
|
582
|
+
rootContainer.app.dataSubscriptionProvider = this._savedRealProvider;
|
|
583
|
+
await this._resubscribeAll(rootContainer);
|
|
584
|
+
this._savedRealProvider = null;
|
|
585
|
+
}
|
|
586
|
+
this._playbackProvider = null;
|
|
587
|
+
this._playbackState = 'idle';
|
|
588
|
+
this._playbackCurrentTime = '';
|
|
589
|
+
this._playbackSpeed = 1;
|
|
590
|
+
}
|
|
591
|
+
/**
|
|
592
|
+
* 모든 tag 컴포넌트의 기존 구독을 해제한다.
|
|
593
|
+
*/
|
|
594
|
+
async _unsubscribeAll(rootContainer) {
|
|
595
|
+
const promises = [];
|
|
596
|
+
rootContainer.model_layer.traverse((component) => {
|
|
597
|
+
var _a;
|
|
598
|
+
if ((_a = component.model) === null || _a === void 0 ? void 0 : _a.tag) {
|
|
599
|
+
promises.push(rootContainer.unsubscribe(component.model.tag, component));
|
|
600
|
+
}
|
|
601
|
+
});
|
|
602
|
+
await Promise.all(promises);
|
|
603
|
+
}
|
|
604
|
+
/**
|
|
605
|
+
* 모든 tag 컴포넌트를 현재 provider로 재구독한다.
|
|
606
|
+
*/
|
|
607
|
+
async _resubscribeAll(rootContainer) {
|
|
608
|
+
const promises = [];
|
|
609
|
+
rootContainer.model_layer.traverse((component) => {
|
|
610
|
+
var _a;
|
|
611
|
+
if ((_a = component.model) === null || _a === void 0 ? void 0 : _a.tag) {
|
|
612
|
+
promises.push(rootContainer.subscribe(component.model.tag, component));
|
|
613
|
+
}
|
|
614
|
+
});
|
|
615
|
+
await Promise.all(promises);
|
|
616
|
+
}
|
|
455
617
|
hidePopup() {
|
|
456
618
|
if (this.popup) {
|
|
457
619
|
this.removeChild(this.popup);
|
|
@@ -584,11 +746,19 @@ BoardViewer.styles = [
|
|
|
584
746
|
z-index: 1000;
|
|
585
747
|
}
|
|
586
748
|
|
|
587
|
-
|
|
749
|
+
.fab-group {
|
|
588
750
|
position: absolute;
|
|
589
751
|
bottom: 15px;
|
|
590
752
|
right: 16px;
|
|
591
753
|
z-index: 1000;
|
|
754
|
+
display: flex;
|
|
755
|
+
flex-direction: column-reverse;
|
|
756
|
+
gap: 8px;
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
.fab-group md-fab {
|
|
760
|
+
--md-fab-container-width: 48px;
|
|
761
|
+
--md-fab-container-height: 48px;
|
|
592
762
|
}
|
|
593
763
|
|
|
594
764
|
[hidden] {
|
|
@@ -628,20 +798,23 @@ __decorate([
|
|
|
628
798
|
property({ type: Boolean, reflect: true, attribute: 'hide-navigation' })
|
|
629
799
|
], BoardViewer.prototype, "hideNavigation", void 0);
|
|
630
800
|
__decorate([
|
|
631
|
-
|
|
632
|
-
], BoardViewer.prototype, "
|
|
801
|
+
property({ type: Boolean, reflect: true, attribute: 'playback-enabled' })
|
|
802
|
+
], BoardViewer.prototype, "playbackEnabled", void 0);
|
|
803
|
+
__decorate([
|
|
804
|
+
property({ type: Object, attribute: 'playback-time-range' })
|
|
805
|
+
], BoardViewer.prototype, "playbackTimeRange", void 0);
|
|
633
806
|
__decorate([
|
|
634
807
|
state()
|
|
635
|
-
], BoardViewer.prototype, "
|
|
808
|
+
], BoardViewer.prototype, "_playbackState", void 0);
|
|
636
809
|
__decorate([
|
|
637
810
|
state()
|
|
638
|
-
], BoardViewer.prototype, "
|
|
811
|
+
], BoardViewer.prototype, "_playbackActive", void 0);
|
|
639
812
|
__decorate([
|
|
640
813
|
state()
|
|
641
|
-
], BoardViewer.prototype, "
|
|
814
|
+
], BoardViewer.prototype, "_playbackSpeed", void 0);
|
|
642
815
|
__decorate([
|
|
643
816
|
state()
|
|
644
|
-
], BoardViewer.prototype, "
|
|
817
|
+
], BoardViewer.prototype, "_playbackCurrentTime", void 0);
|
|
645
818
|
__decorate([
|
|
646
819
|
query('#target')
|
|
647
820
|
], BoardViewer.prototype, "_target", void 0);
|
|
@@ -654,6 +827,9 @@ __decorate([
|
|
|
654
827
|
__decorate([
|
|
655
828
|
query('#fullscreen')
|
|
656
829
|
], BoardViewer.prototype, "_fullscreen", void 0);
|
|
830
|
+
__decorate([
|
|
831
|
+
query('.fab-group')
|
|
832
|
+
], BoardViewer.prototype, "_fabGroup", void 0);
|
|
657
833
|
BoardViewer = __decorate([
|
|
658
834
|
customElement('ox-board-viewer')
|
|
659
835
|
], BoardViewer);
|