@deck.gl/widgets 9.3.0-alpha.1 → 9.3.0-alpha.2
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/dist/context-menu-widget.d.ts +7 -5
- package/dist/context-menu-widget.d.ts.map +1 -1
- package/dist/context-menu-widget.js +2 -1
- package/dist/context-menu-widget.js.map +1 -1
- package/dist/dist.dev.js +687 -555
- package/dist/icon-widget.d.ts +28 -0
- package/dist/icon-widget.d.ts.map +1 -0
- package/dist/icon-widget.js +35 -0
- package/dist/icon-widget.js.map +1 -0
- package/dist/index.cjs +468 -309
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +11 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -7
- package/dist/index.js.map +1 -1
- package/dist/info-widget.d.ts +1 -0
- package/dist/info-widget.d.ts.map +1 -1
- package/dist/info-widget.js +6 -0
- package/dist/info-widget.js.map +1 -1
- package/dist/lib/components/dropdown-menu.d.ts +3 -2
- package/dist/lib/components/dropdown-menu.d.ts.map +1 -1
- package/dist/lib/components/dropdown-menu.js +12 -8
- package/dist/lib/components/dropdown-menu.js.map +1 -1
- package/dist/lib/components/icon-button.d.ts +3 -0
- package/dist/lib/components/icon-button.d.ts.map +1 -1
- package/dist/lib/components/icon-button.js +10 -2
- package/dist/lib/components/icon-button.js.map +1 -1
- package/dist/lib/components/popover.js +1 -1
- package/dist/lib/components/popover.js.map +1 -1
- package/dist/lib/data-url.d.ts +5 -0
- package/dist/lib/data-url.d.ts.map +1 -0
- package/dist/lib/data-url.js +7 -0
- package/dist/lib/data-url.js.map +1 -0
- package/dist/popup-widget.d.ts +1 -0
- package/dist/popup-widget.d.ts.map +1 -1
- package/dist/popup-widget.js +6 -0
- package/dist/popup-widget.js.map +1 -1
- package/dist/selector-widget.d.ts +44 -0
- package/dist/selector-widget.d.ts.map +1 -0
- package/dist/selector-widget.js +64 -0
- package/dist/selector-widget.js.map +1 -0
- package/dist/splitter-widget.d.ts +52 -11
- package/dist/splitter-widget.d.ts.map +1 -1
- package/dist/splitter-widget.js +177 -76
- package/dist/splitter-widget.js.map +1 -1
- package/dist/stats-widget.d.ts +2 -1
- package/dist/stats-widget.d.ts.map +1 -1
- package/dist/stats-widget.js +37 -8
- package/dist/stats-widget.js.map +1 -1
- package/dist/stylesheet.css +50 -13
- package/dist/timeline-widget.d.ts.map +1 -1
- package/dist/timeline-widget.js +6 -1
- package/dist/timeline-widget.js.map +1 -1
- package/dist/toggle-widget.d.ts +38 -0
- package/dist/toggle-widget.d.ts.map +1 -0
- package/dist/toggle-widget.js +47 -0
- package/dist/toggle-widget.js.map +1 -0
- package/dist.min.js +2 -2
- package/package.json +3 -3
- package/src/context-menu-widget.tsx +9 -9
- package/src/icon-widget.tsx +69 -0
- package/src/index.ts +11 -9
- package/src/info-widget.tsx +7 -0
- package/src/lib/components/dropdown-menu.tsx +22 -15
- package/src/lib/components/icon-button.tsx +15 -3
- package/src/lib/components/popover.tsx +1 -1
- package/src/lib/data-url.ts +5 -0
- package/src/popup-widget.tsx +7 -0
- package/src/selector-widget.tsx +111 -0
- package/src/splitter-widget.tsx +281 -96
- package/src/stats-widget.tsx +50 -9
- package/src/stylesheet.css +50 -13
- package/src/timeline-widget.tsx +8 -1
- package/src/toggle-widget.tsx +101 -0
- package/dist/fps-widget.d.ts +0 -28
- package/dist/fps-widget.d.ts.map +0 -1
- package/dist/fps-widget.js +0 -51
- package/dist/fps-widget.js.map +0 -1
- package/dist/lib/components/icon-menu.d.ts +0 -16
- package/dist/lib/components/icon-menu.d.ts.map +0 -1
- package/dist/lib/components/icon-menu.js +0 -33
- package/dist/lib/components/icon-menu.js.map +0 -1
- package/dist/view-selector-widget.d.ts +0 -35
- package/dist/view-selector-widget.d.ts.map +0 -1
- package/dist/view-selector-widget.js +0 -63
- package/dist/view-selector-widget.js.map +0 -1
- package/src/fps-widget.tsx +0 -77
- package/src/lib/components/icon-menu.tsx +0 -70
- package/src/view-selector-widget.tsx +0 -151
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// deck.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
5
|
+
import type {WidgetPlacement, WidgetProps} from '@deck.gl/core';
|
|
6
|
+
import {render, type JSX} from 'preact';
|
|
7
|
+
import {Widget} from '@deck.gl/core';
|
|
8
|
+
import {IconButton} from './lib/components/icon-button';
|
|
9
|
+
|
|
10
|
+
export type ToggleWidgetProps = WidgetProps & {
|
|
11
|
+
/** Widget positioning within the view. Default 'bottom-left'. */
|
|
12
|
+
placement?: WidgetPlacement;
|
|
13
|
+
/** View to attach to and interact with. Required when using multiple views. */
|
|
14
|
+
viewId?: string | null;
|
|
15
|
+
/** If the toggle is checked when first added */
|
|
16
|
+
initialChecked?: boolean;
|
|
17
|
+
/** Data url to display as icon */
|
|
18
|
+
icon: string;
|
|
19
|
+
/** Data url to display as icon when it is checked */
|
|
20
|
+
onIcon?: string;
|
|
21
|
+
/** Tooltip label */
|
|
22
|
+
label?: string;
|
|
23
|
+
/** Tooltip label when it is checked */
|
|
24
|
+
onLabel?: string;
|
|
25
|
+
/** Icon color, a CSS Color string */
|
|
26
|
+
color?: string;
|
|
27
|
+
/** Icon color when it is checked, a CSS Color string */
|
|
28
|
+
onColor?: string;
|
|
29
|
+
/** Callback when the widget is clicked */
|
|
30
|
+
onChange?: (checked: boolean) => void;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* A generic widget that displays a button with icon or text content.
|
|
35
|
+
*/
|
|
36
|
+
export class ToggleWidget extends Widget<ToggleWidgetProps> {
|
|
37
|
+
static defaultProps: Required<ToggleWidgetProps> = {
|
|
38
|
+
...Widget.defaultProps,
|
|
39
|
+
id: 'icon',
|
|
40
|
+
placement: 'top-left',
|
|
41
|
+
viewId: null,
|
|
42
|
+
initialChecked: false,
|
|
43
|
+
icon: '',
|
|
44
|
+
onIcon: undefined!,
|
|
45
|
+
label: '',
|
|
46
|
+
onLabel: undefined!,
|
|
47
|
+
color: '',
|
|
48
|
+
onColor: undefined!,
|
|
49
|
+
onChange: undefined!
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
className = 'deck-widget-toggle';
|
|
53
|
+
placement: WidgetPlacement = 'top-left';
|
|
54
|
+
checked: boolean;
|
|
55
|
+
|
|
56
|
+
constructor(props: ToggleWidgetProps) {
|
|
57
|
+
super(props);
|
|
58
|
+
this.checked = this.props.initialChecked;
|
|
59
|
+
this.setProps(this.props);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
setProps(props: Partial<ToggleWidgetProps>) {
|
|
63
|
+
this.placement = props.placement ?? this.placement;
|
|
64
|
+
this.viewId = props.viewId;
|
|
65
|
+
super.setProps(props);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
onRenderHTML(rootElement: HTMLElement): void {
|
|
69
|
+
const {
|
|
70
|
+
className,
|
|
71
|
+
style,
|
|
72
|
+
icon,
|
|
73
|
+
label,
|
|
74
|
+
color,
|
|
75
|
+
onIcon = icon,
|
|
76
|
+
onLabel = label,
|
|
77
|
+
onColor = color
|
|
78
|
+
} = this.props;
|
|
79
|
+
const on = this.checked;
|
|
80
|
+
|
|
81
|
+
rootElement.dataset.checked = String(on);
|
|
82
|
+
|
|
83
|
+
render(
|
|
84
|
+
<IconButton
|
|
85
|
+
className={className}
|
|
86
|
+
style={style as JSX.CSSProperties}
|
|
87
|
+
icon={on ? onIcon : icon}
|
|
88
|
+
label={on ? onLabel : label}
|
|
89
|
+
color={on ? onColor : color}
|
|
90
|
+
onClick={this._toggle}
|
|
91
|
+
/>,
|
|
92
|
+
rootElement
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
private _toggle = () => {
|
|
97
|
+
this.checked = !this.checked;
|
|
98
|
+
this.props.onChange?.(this.checked);
|
|
99
|
+
this.updateHTML();
|
|
100
|
+
};
|
|
101
|
+
}
|
package/dist/fps-widget.d.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { Widget } from '@deck.gl/core';
|
|
2
|
-
import type { WidgetPlacement, Deck, WidgetProps } from '@deck.gl/core';
|
|
3
|
-
/** Properties for the FpsWidget. */
|
|
4
|
-
export type FpsWidgetProps = WidgetProps & {
|
|
5
|
-
/** Widget positioning within the view. Default 'top-left'. */
|
|
6
|
-
placement?: WidgetPlacement;
|
|
7
|
-
/** View to attach to and interact with. Required when using multiple views. */
|
|
8
|
-
viewId?: string | null;
|
|
9
|
-
};
|
|
10
|
-
/**
|
|
11
|
-
* Displays the average frames per second reported by the Deck instance.
|
|
12
|
-
*/
|
|
13
|
-
export declare class FpsWidget extends Widget<FpsWidgetProps> {
|
|
14
|
-
static defaultProps: Required<FpsWidgetProps>;
|
|
15
|
-
className: string;
|
|
16
|
-
placement: WidgetPlacement;
|
|
17
|
-
private _lastFps;
|
|
18
|
-
constructor(props?: FpsWidgetProps);
|
|
19
|
-
setProps(props: Partial<FpsWidgetProps>): void;
|
|
20
|
-
onAdd({}: {
|
|
21
|
-
deck: Deck<any>;
|
|
22
|
-
viewId: string | null;
|
|
23
|
-
}): void;
|
|
24
|
-
onRenderHTML(rootElement: HTMLElement): void;
|
|
25
|
-
_animate(): void;
|
|
26
|
-
_getFps(): number;
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=fps-widget.d.ts.map
|
package/dist/fps-widget.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fps-widget.d.ts","sourceRoot":"","sources":["../src/fps-widget.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAC,MAAM,EAAC,MAAM,eAAe,CAAC;AAErC,OAAO,KAAK,EAAC,eAAe,EAAE,IAAI,EAAE,WAAW,EAAC,MAAM,eAAe,CAAC;AAGtE,oCAAoC;AACpC,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG;IACzC,8DAA8D;IAC9D,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAC;AAEF;;GAEG;AACH,qBAAa,SAAU,SAAQ,MAAM,CAAC,cAAc,CAAC;IACnD,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,cAAc,CAAC,CAK3C;IAEF,SAAS,SAAqB;IAC9B,SAAS,EAAE,eAAe,CAAc;IAExC,OAAO,CAAC,QAAQ,CAAc;gBAElB,KAAK,GAAE,cAAmB;IAKtC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI;IAM9C,KAAK,CAAC,EAAE,EAAE;QAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAC,GAAG,IAAI;IAKzD,YAAY,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAc5C,QAAQ,IAAI,IAAI;IAShB,OAAO,IAAI,MAAM;CAIlB"}
|
package/dist/fps-widget.js
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
|
|
2
|
-
// deck.gl
|
|
3
|
-
// SPDX-License-Identifier: MIT
|
|
4
|
-
// Copyright (c) vis.gl contributors
|
|
5
|
-
import { Widget } from '@deck.gl/core';
|
|
6
|
-
import { render } from 'preact';
|
|
7
|
-
import { IconButton } from "./lib/components/icon-button.js";
|
|
8
|
-
/**
|
|
9
|
-
* Displays the average frames per second reported by the Deck instance.
|
|
10
|
-
*/
|
|
11
|
-
export class FpsWidget extends Widget {
|
|
12
|
-
constructor(props = {}) {
|
|
13
|
-
super(props);
|
|
14
|
-
this.className = 'deck-widget-fps';
|
|
15
|
-
this.placement = 'top-left';
|
|
16
|
-
this._lastFps = -1;
|
|
17
|
-
this.setProps(this.props);
|
|
18
|
-
}
|
|
19
|
-
setProps(props) {
|
|
20
|
-
this.placement = props.placement ?? this.placement;
|
|
21
|
-
this.viewId = props.viewId ?? this.viewId;
|
|
22
|
-
super.setProps(props);
|
|
23
|
-
}
|
|
24
|
-
onAdd({}) {
|
|
25
|
-
this._lastFps = this._getFps();
|
|
26
|
-
requestAnimationFrame(() => this._animate());
|
|
27
|
-
}
|
|
28
|
-
onRenderHTML(rootElement) {
|
|
29
|
-
const fps = this._getFps();
|
|
30
|
-
render(_jsx(IconButton, { children: _jsxs("div", { className: "text", children: ["FPS", _jsx("br", {}), fps] }) }), rootElement);
|
|
31
|
-
}
|
|
32
|
-
_animate() {
|
|
33
|
-
const fps = this._getFps();
|
|
34
|
-
if (this._lastFps !== fps) {
|
|
35
|
-
this._lastFps = fps;
|
|
36
|
-
this.updateHTML();
|
|
37
|
-
}
|
|
38
|
-
requestAnimationFrame(() => this._animate());
|
|
39
|
-
}
|
|
40
|
-
_getFps() {
|
|
41
|
-
// @ts-expect-error protected
|
|
42
|
-
return Math.round(this.deck?.metrics.fps ?? 0);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
FpsWidget.defaultProps = {
|
|
46
|
-
...Widget.defaultProps,
|
|
47
|
-
id: 'fps',
|
|
48
|
-
placement: 'top-left',
|
|
49
|
-
viewId: null
|
|
50
|
-
};
|
|
51
|
-
//# sourceMappingURL=fps-widget.js.map
|
package/dist/fps-widget.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fps-widget.js","sourceRoot":"","sources":["../src/fps-widget.tsx"],"names":[],"mappings":";AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAEpC,OAAO,EAAC,MAAM,EAAC,MAAM,eAAe,CAAC;AACrC,OAAO,EAAC,MAAM,EAAC,MAAM,QAAQ,CAAC;AAE9B,OAAO,EAAC,UAAU,EAAC,wCAAqC;AAUxD;;GAEG;AACH,MAAM,OAAO,SAAU,SAAQ,MAAsB;IAanD,YAAY,QAAwB,EAAE;QACpC,KAAK,CAAC,KAAK,CAAC,CAAC;QANf,cAAS,GAAG,iBAAiB,CAAC;QAC9B,cAAS,GAAoB,UAAU,CAAC;QAEhC,aAAQ,GAAW,CAAC,CAAC,CAAC;QAI5B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,QAAQ,CAAC,KAA8B;QACrC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC;QACnD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;QAC1C,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,EAA4C;QAChD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/B,qBAAqB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,YAAY,CAAC,WAAwB;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC3B,MAAM,CACJ,KAAC,UAAU,cACT,eAAK,SAAS,EAAC,MAAM,oBAEnB,cAAM,EACL,GAAG,IACA,GACK,EACb,WAAW,CACZ,CAAC;IACJ,CAAC;IAED,QAAQ;QACN,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;YAC1B,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;YACpB,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;QACD,qBAAqB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO;QACL,6BAA6B;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACjD,CAAC;;AAtDM,sBAAY,GAA6B;IAC9C,GAAG,MAAM,CAAC,YAAY;IACtB,EAAE,EAAE,KAAK;IACT,SAAS,EAAE,UAAU;IACrB,MAAM,EAAE,IAAI;CACb,AALkB,CAKjB"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { JSX } from 'preact';
|
|
2
|
-
export type IconMenuProps<KeyType = string> = {
|
|
3
|
-
className: string;
|
|
4
|
-
icon?: JSX.Element;
|
|
5
|
-
label?: string;
|
|
6
|
-
menuItems: {
|
|
7
|
-
value: KeyType;
|
|
8
|
-
icon: JSX.Element;
|
|
9
|
-
label: string;
|
|
10
|
-
}[];
|
|
11
|
-
initialItem: KeyType;
|
|
12
|
-
onItemSelected: (item: KeyType) => void;
|
|
13
|
-
};
|
|
14
|
-
/** A component that renders an icon popup menu */
|
|
15
|
-
export declare function IconMenu<KeyType extends string>(props: IconMenuProps<KeyType>): JSX.Element;
|
|
16
|
-
//# sourceMappingURL=icon-menu.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"icon-menu.d.ts","sourceRoot":"","sources":["../../../src/lib/components/icon-menu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,QAAQ,CAAC;AAKhC,MAAM,MAAM,aAAa,CAAC,OAAO,GAAG,MAAM,IAAI;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,EAAE,CAAC;IAChE,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACzC,CAAC;AAEF,kDAAkD;AAClD,wBAAgB,QAAQ,CAAC,OAAO,SAAS,MAAM,EAAE,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,eAsD7E"}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
|
|
2
|
-
import { useState, useRef, useEffect } from 'preact/hooks';
|
|
3
|
-
import { ButtonGroup } from "./button-group.js";
|
|
4
|
-
import { IconButton } from "./icon-button.js";
|
|
5
|
-
/** A component that renders an icon popup menu */
|
|
6
|
-
export function IconMenu(props) {
|
|
7
|
-
const [menuOpen, setMenuOpen] = useState(false);
|
|
8
|
-
const containerRef = useRef(null);
|
|
9
|
-
// Close the menu when clicking outside.
|
|
10
|
-
const handleClickOutside = (event) => {
|
|
11
|
-
if (containerRef.current && !containerRef.current.contains(event.target)) {
|
|
12
|
-
setMenuOpen(false);
|
|
13
|
-
}
|
|
14
|
-
};
|
|
15
|
-
useEffect(() => {
|
|
16
|
-
document.addEventListener('mousedown', handleClickOutside);
|
|
17
|
-
return () => {
|
|
18
|
-
document.removeEventListener('mousedown', handleClickOutside);
|
|
19
|
-
};
|
|
20
|
-
}, [containerRef]);
|
|
21
|
-
const [selectedItem, setSelectedItem] = useState(props.initialItem);
|
|
22
|
-
const handleSelectItem = (item) => {
|
|
23
|
-
setSelectedItem(item);
|
|
24
|
-
setMenuOpen(false);
|
|
25
|
-
props.onItemSelected(item);
|
|
26
|
-
};
|
|
27
|
-
const handleButtonClick = () => setMenuOpen(!menuOpen);
|
|
28
|
-
const selectedMenuItem = props.menuItems.find(item => item.value === selectedItem);
|
|
29
|
-
const label = props.label || selectedMenuItem?.label || '';
|
|
30
|
-
const icon = (props.icon || selectedMenuItem?.icon);
|
|
31
|
-
return (_jsxs("div", { style: { position: 'relative', display: 'inline-block' }, ref: containerRef, children: [_jsx(IconButton, { className: props.className, label: label, onClick: handleButtonClick, children: icon }), menuOpen && (_jsx("div", { className: "deck-widget-icon-menu", children: _jsx(ButtonGroup, { orientation: "vertical", children: props.menuItems.map(item => (_jsx(IconButton, { label: item.label, onClick: () => handleSelectItem(item.value), children: item.icon }, item.value))) }) }))] }));
|
|
32
|
-
}
|
|
33
|
-
//# sourceMappingURL=icon-menu.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"icon-menu.js","sourceRoot":"","sources":["../../../src/lib/components/icon-menu.tsx"],"names":[],"mappings":";AACA,OAAO,EAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAC,MAAM,cAAc,CAAC;AACzD,OAAO,EAAC,WAAW,EAAC,0BAAuB;AAC3C,OAAO,EAAC,UAAU,EAAC,yBAAsB;AAWzC,kDAAkD;AAClD,MAAM,UAAU,QAAQ,CAAyB,KAA6B;IAC5E,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAElD,wCAAwC;IACxC,MAAM,kBAAkB,GAAG,CAAC,KAAiB,EAAE,EAAE;QAC/C,IAAI,YAAY,CAAC,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC,EAAE,CAAC;YACjF,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAC3D,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAChE,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,WAAW,CAAC,CAAC;IAE7E,MAAM,gBAAgB,GAAG,CAAC,IAAa,EAAE,EAAE;QACzC,eAAe,CAAC,IAAI,CAAC,CAAC;QACtB,WAAW,CAAC,KAAK,CAAC,CAAC;QACnB,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC;IAEvD,MAAM,gBAAgB,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,YAAY,CAAC,CAAC;IACnF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,gBAAgB,EAAE,KAAK,IAAI,EAAE,CAAC;IAC3D,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,gBAAgB,EAAE,IAAI,CAAE,CAAC;IAErD,OAAO,CACL,eAAK,KAAK,EAAE,EAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAC,EAAE,GAAG,EAAE,YAAY,aAC5E,KAAC,UAAU,IAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,YAC7E,IAAI,GACM,EACZ,QAAQ,IAAI,CACX,cAAK,SAAS,EAAC,uBAAuB,YACpC,KAAC,WAAW,IAAC,WAAW,EAAC,UAAU,YAChC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAC3B,KAAC,UAAU,IAET,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,YAE1C,IAAI,CAAC,IAAI,IAJL,IAAI,CAAC,KAAK,CAKJ,CACd,CAAC,GACU,GACV,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { Widget, type WidgetProps, type WidgetPlacement } from '@deck.gl/core';
|
|
2
|
-
/** The available view modes */
|
|
3
|
-
export type ViewMode = 'single' | 'split-horizontal' | 'split-vertical';
|
|
4
|
-
/** Properties for the ViewSelectorWidget */
|
|
5
|
-
export type ViewSelectorWidgetProps = WidgetProps & {
|
|
6
|
-
/** Widget positioning within the view. Default 'top-left'. */
|
|
7
|
-
placement?: WidgetPlacement;
|
|
8
|
-
/** View to attach to and interact with. Required when using multiple views. */
|
|
9
|
-
viewId?: string | null;
|
|
10
|
-
/** Tooltip label */
|
|
11
|
-
label?: string;
|
|
12
|
-
/** The initial view mode. Defaults to 'single'. */
|
|
13
|
-
initialViewMode?: ViewMode;
|
|
14
|
-
/** Callback invoked when the view mode changes */
|
|
15
|
-
onViewModeChange?: (mode: ViewMode) => void;
|
|
16
|
-
};
|
|
17
|
-
/**
|
|
18
|
-
* A widget that renders a popup menu for selecting a view mode.
|
|
19
|
-
* It displays a button with the current view mode icon. Clicking the button
|
|
20
|
-
* toggles a popup that shows three icons for:
|
|
21
|
-
* - Single view
|
|
22
|
-
* - Two views, split horizontally
|
|
23
|
-
* - Two views, split vertically
|
|
24
|
-
*/
|
|
25
|
-
export declare class ViewSelectorWidget extends Widget<ViewSelectorWidgetProps> {
|
|
26
|
-
static defaultProps: Required<ViewSelectorWidgetProps>;
|
|
27
|
-
className: string;
|
|
28
|
-
placement: WidgetPlacement;
|
|
29
|
-
viewMode: ViewMode;
|
|
30
|
-
constructor(props?: ViewSelectorWidgetProps);
|
|
31
|
-
setProps(props: Partial<ViewSelectorWidgetProps>): void;
|
|
32
|
-
onRenderHTML(rootElement: HTMLElement): void;
|
|
33
|
-
handleSelectMode: (viewMode: ViewMode) => void;
|
|
34
|
-
}
|
|
35
|
-
//# sourceMappingURL=view-selector-widget.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"view-selector-widget.d.ts","sourceRoot":"","sources":["../src/view-selector-widget.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAC,MAAM,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAC,MAAM,eAAe,CAAC;AAG7E,+BAA+B;AAC/B,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,kBAAkB,GAAG,gBAAgB,CAAC;AAExE,4CAA4C;AAC5C,MAAM,MAAM,uBAAuB,GAAG,WAAW,GAAG;IAClD,8DAA8D;IAC9D,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,eAAe,CAAC,EAAE,QAAQ,CAAC;IAC3B,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;CAC7C,CAAC;AAEF;;;;;;;GAOG;AACH,qBAAa,kBAAmB,SAAQ,MAAM,CAAC,uBAAuB,CAAC;IACrE,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,uBAAuB,CAAC,CAQpD;IAEF,SAAS,SAA+B;IACxC,SAAS,EAAE,eAAe,CAAc;IACxC,QAAQ,EAAE,QAAQ,CAAC;gBAEP,KAAK,GAAE,uBAA4B;IAM/C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,uBAAuB,CAAC;IAMhD,YAAY,CAAC,WAAW,EAAE,WAAW;IAerC,gBAAgB,aAAc,QAAQ,UAIpC;CACH"}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
|
|
2
|
-
// deck.gl
|
|
3
|
-
// SPDX-License-Identifier: MIT
|
|
4
|
-
// Copyright (c) vis.gl contributors
|
|
5
|
-
import { render } from 'preact';
|
|
6
|
-
import { Widget } from '@deck.gl/core';
|
|
7
|
-
import { IconMenu } from "./lib/components/icon-menu.js";
|
|
8
|
-
/**
|
|
9
|
-
* A widget that renders a popup menu for selecting a view mode.
|
|
10
|
-
* It displays a button with the current view mode icon. Clicking the button
|
|
11
|
-
* toggles a popup that shows three icons for:
|
|
12
|
-
* - Single view
|
|
13
|
-
* - Two views, split horizontally
|
|
14
|
-
* - Two views, split vertically
|
|
15
|
-
*/
|
|
16
|
-
export class ViewSelectorWidget extends Widget {
|
|
17
|
-
constructor(props = {}) {
|
|
18
|
-
super(props);
|
|
19
|
-
this.className = 'deck-widget-view-selector';
|
|
20
|
-
this.placement = 'top-left';
|
|
21
|
-
this.handleSelectMode = (viewMode) => {
|
|
22
|
-
this.viewMode = viewMode;
|
|
23
|
-
this.updateHTML();
|
|
24
|
-
this.props.onViewModeChange(viewMode);
|
|
25
|
-
};
|
|
26
|
-
this.viewMode = this.props.initialViewMode;
|
|
27
|
-
this.setProps(this.props);
|
|
28
|
-
}
|
|
29
|
-
setProps(props) {
|
|
30
|
-
this.placement = props.placement ?? this.placement;
|
|
31
|
-
this.viewId = props.viewId ?? this.viewId;
|
|
32
|
-
super.setProps(props);
|
|
33
|
-
}
|
|
34
|
-
onRenderHTML(rootElement) {
|
|
35
|
-
render(_jsx(IconMenu, { className: "deck-widget-view-selector", menuItems: MENU_ITEMS.map(item => ({
|
|
36
|
-
...item,
|
|
37
|
-
icon: item.icon()
|
|
38
|
-
})), initialItem: this.props.initialViewMode, onItemSelected: this.handleSelectMode }), rootElement);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
ViewSelectorWidget.defaultProps = {
|
|
42
|
-
...Widget.defaultProps,
|
|
43
|
-
id: 'view-selector',
|
|
44
|
-
placement: 'top-left',
|
|
45
|
-
viewId: null,
|
|
46
|
-
label: 'Split View',
|
|
47
|
-
initialViewMode: 'single',
|
|
48
|
-
onViewModeChange: () => { }
|
|
49
|
-
};
|
|
50
|
-
const ICON_STYLE = { width: '24px', height: '24px' };
|
|
51
|
-
// JSX wrapped in a function to fix deck's Node tests
|
|
52
|
-
const ICONS = {
|
|
53
|
-
single: () => (_jsx("svg", { width: "24", height: "24", style: ICON_STYLE, children: _jsx("rect", { x: "4", y: "4", width: "16", height: "16", stroke: "var(--button-icon-hover, rgb(24, 24, 26))", fill: "none", strokeWidth: "2" }) })),
|
|
54
|
-
'split-horizontal': () => (_jsxs("svg", { width: "24", height: "24", style: ICON_STYLE, children: [_jsx("rect", { x: "4", y: "4", width: "16", height: "7", stroke: "var(--button-icon-hover, rgb(24, 24, 26))", fill: "none", strokeWidth: "2" }), _jsx("rect", { x: "4", y: "13", width: "16", height: "7", stroke: "var(--button-icon-hover, rgb(24, 24, 26))", fill: "none", strokeWidth: "2" })] })),
|
|
55
|
-
'split-vertical': () => (_jsxs("svg", { width: "24", height: "24", style: ICON_STYLE, children: [_jsx("rect", { x: "4", y: "4", width: "7", height: "16", stroke: "var(--button-icon-hover, rgb(24, 24, 26))", fill: "none", strokeWidth: "2" }), _jsx("rect", { x: "13", y: "4", width: "7", height: "16", stroke: "var(--button-icon-hover, rgb(24, 24, 26))", fill: "none", strokeWidth: "2" })] }))
|
|
56
|
-
};
|
|
57
|
-
// Define menu items for the popup menu.
|
|
58
|
-
const MENU_ITEMS = [
|
|
59
|
-
{ value: 'single', icon: ICONS.single, label: 'Single View' },
|
|
60
|
-
{ value: 'split-horizontal', icon: ICONS['split-horizontal'], label: 'Split Horizontal' },
|
|
61
|
-
{ value: 'split-vertical', icon: ICONS['split-vertical'], label: 'Split Vertical' }
|
|
62
|
-
];
|
|
63
|
-
//# sourceMappingURL=view-selector-widget.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"view-selector-widget.js","sourceRoot":"","sources":["../src/view-selector-widget.tsx"],"names":[],"mappings":"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"}
|
package/src/fps-widget.tsx
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
// deck.gl
|
|
2
|
-
// SPDX-License-Identifier: MIT
|
|
3
|
-
// Copyright (c) vis.gl contributors
|
|
4
|
-
|
|
5
|
-
import {Widget} from '@deck.gl/core';
|
|
6
|
-
import {render} from 'preact';
|
|
7
|
-
import type {WidgetPlacement, Deck, WidgetProps} from '@deck.gl/core';
|
|
8
|
-
import {IconButton} from './lib/components/icon-button';
|
|
9
|
-
|
|
10
|
-
/** Properties for the FpsWidget. */
|
|
11
|
-
export type FpsWidgetProps = WidgetProps & {
|
|
12
|
-
/** Widget positioning within the view. Default 'top-left'. */
|
|
13
|
-
placement?: WidgetPlacement;
|
|
14
|
-
/** View to attach to and interact with. Required when using multiple views. */
|
|
15
|
-
viewId?: string | null;
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Displays the average frames per second reported by the Deck instance.
|
|
20
|
-
*/
|
|
21
|
-
export class FpsWidget extends Widget<FpsWidgetProps> {
|
|
22
|
-
static defaultProps: Required<FpsWidgetProps> = {
|
|
23
|
-
...Widget.defaultProps,
|
|
24
|
-
id: 'fps',
|
|
25
|
-
placement: 'top-left',
|
|
26
|
-
viewId: null
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
className = 'deck-widget-fps';
|
|
30
|
-
placement: WidgetPlacement = 'top-left';
|
|
31
|
-
|
|
32
|
-
private _lastFps: number = -1;
|
|
33
|
-
|
|
34
|
-
constructor(props: FpsWidgetProps = {}) {
|
|
35
|
-
super(props);
|
|
36
|
-
this.setProps(this.props);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
setProps(props: Partial<FpsWidgetProps>): void {
|
|
40
|
-
this.placement = props.placement ?? this.placement;
|
|
41
|
-
this.viewId = props.viewId ?? this.viewId;
|
|
42
|
-
super.setProps(props);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
onAdd({}: {deck: Deck<any>; viewId: string | null}): void {
|
|
46
|
-
this._lastFps = this._getFps();
|
|
47
|
-
requestAnimationFrame(() => this._animate());
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
onRenderHTML(rootElement: HTMLElement): void {
|
|
51
|
-
const fps = this._getFps();
|
|
52
|
-
render(
|
|
53
|
-
<IconButton>
|
|
54
|
-
<div className="text">
|
|
55
|
-
FPS
|
|
56
|
-
<br />
|
|
57
|
-
{fps}
|
|
58
|
-
</div>
|
|
59
|
-
</IconButton>,
|
|
60
|
-
rootElement
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
_animate(): void {
|
|
65
|
-
const fps = this._getFps();
|
|
66
|
-
if (this._lastFps !== fps) {
|
|
67
|
-
this._lastFps = fps;
|
|
68
|
-
this.updateHTML();
|
|
69
|
-
}
|
|
70
|
-
requestAnimationFrame(() => this._animate());
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
_getFps(): number {
|
|
74
|
-
// @ts-expect-error protected
|
|
75
|
-
return Math.round(this.deck?.metrics.fps ?? 0);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import type {JSX} from 'preact';
|
|
2
|
-
import {useState, useRef, useEffect} from 'preact/hooks';
|
|
3
|
-
import {ButtonGroup} from './button-group';
|
|
4
|
-
import {IconButton} from './icon-button';
|
|
5
|
-
|
|
6
|
-
export type IconMenuProps<KeyType = string> = {
|
|
7
|
-
className: string;
|
|
8
|
-
icon?: JSX.Element;
|
|
9
|
-
label?: string;
|
|
10
|
-
menuItems: {value: KeyType; icon: JSX.Element; label: string}[];
|
|
11
|
-
initialItem: KeyType;
|
|
12
|
-
onItemSelected: (item: KeyType) => void;
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
/** A component that renders an icon popup menu */
|
|
16
|
-
export function IconMenu<KeyType extends string>(props: IconMenuProps<KeyType>) {
|
|
17
|
-
const [menuOpen, setMenuOpen] = useState(false);
|
|
18
|
-
const containerRef = useRef<HTMLDivElement>(null);
|
|
19
|
-
|
|
20
|
-
// Close the menu when clicking outside.
|
|
21
|
-
const handleClickOutside = (event: MouseEvent) => {
|
|
22
|
-
if (containerRef.current && !containerRef.current.contains(event.target as Node)) {
|
|
23
|
-
setMenuOpen(false);
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
useEffect(() => {
|
|
28
|
-
document.addEventListener('mousedown', handleClickOutside);
|
|
29
|
-
return () => {
|
|
30
|
-
document.removeEventListener('mousedown', handleClickOutside);
|
|
31
|
-
};
|
|
32
|
-
}, [containerRef]);
|
|
33
|
-
|
|
34
|
-
const [selectedItem, setSelectedItem] = useState<KeyType>(props.initialItem);
|
|
35
|
-
|
|
36
|
-
const handleSelectItem = (item: KeyType) => {
|
|
37
|
-
setSelectedItem(item);
|
|
38
|
-
setMenuOpen(false);
|
|
39
|
-
props.onItemSelected(item);
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
const handleButtonClick = () => setMenuOpen(!menuOpen);
|
|
43
|
-
|
|
44
|
-
const selectedMenuItem = props.menuItems.find(item => item.value === selectedItem);
|
|
45
|
-
const label = props.label || selectedMenuItem?.label || '';
|
|
46
|
-
const icon = (props.icon || selectedMenuItem?.icon)!;
|
|
47
|
-
|
|
48
|
-
return (
|
|
49
|
-
<div style={{position: 'relative', display: 'inline-block'}} ref={containerRef}>
|
|
50
|
-
<IconButton className={props.className} label={label} onClick={handleButtonClick}>
|
|
51
|
-
{icon}
|
|
52
|
-
</IconButton>
|
|
53
|
-
{menuOpen && (
|
|
54
|
-
<div className="deck-widget-icon-menu">
|
|
55
|
-
<ButtonGroup orientation="vertical">
|
|
56
|
-
{props.menuItems.map(item => (
|
|
57
|
-
<IconButton
|
|
58
|
-
key={item.value}
|
|
59
|
-
label={item.label}
|
|
60
|
-
onClick={() => handleSelectItem(item.value)}
|
|
61
|
-
>
|
|
62
|
-
{item.icon}
|
|
63
|
-
</IconButton>
|
|
64
|
-
))}
|
|
65
|
-
</ButtonGroup>
|
|
66
|
-
</div>
|
|
67
|
-
)}
|
|
68
|
-
</div>
|
|
69
|
-
);
|
|
70
|
-
}
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
// deck.gl
|
|
2
|
-
// SPDX-License-Identifier: MIT
|
|
3
|
-
// Copyright (c) vis.gl contributors
|
|
4
|
-
|
|
5
|
-
import {render, JSX} from 'preact';
|
|
6
|
-
import {Widget, type WidgetProps, type WidgetPlacement} from '@deck.gl/core';
|
|
7
|
-
import {IconMenu} from './lib/components/icon-menu';
|
|
8
|
-
|
|
9
|
-
/** The available view modes */
|
|
10
|
-
export type ViewMode = 'single' | 'split-horizontal' | 'split-vertical';
|
|
11
|
-
|
|
12
|
-
/** Properties for the ViewSelectorWidget */
|
|
13
|
-
export type ViewSelectorWidgetProps = WidgetProps & {
|
|
14
|
-
/** Widget positioning within the view. Default 'top-left'. */
|
|
15
|
-
placement?: WidgetPlacement;
|
|
16
|
-
/** View to attach to and interact with. Required when using multiple views. */
|
|
17
|
-
viewId?: string | null;
|
|
18
|
-
/** Tooltip label */
|
|
19
|
-
label?: string;
|
|
20
|
-
/** The initial view mode. Defaults to 'single'. */
|
|
21
|
-
initialViewMode?: ViewMode;
|
|
22
|
-
/** Callback invoked when the view mode changes */
|
|
23
|
-
onViewModeChange?: (mode: ViewMode) => void;
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* A widget that renders a popup menu for selecting a view mode.
|
|
28
|
-
* It displays a button with the current view mode icon. Clicking the button
|
|
29
|
-
* toggles a popup that shows three icons for:
|
|
30
|
-
* - Single view
|
|
31
|
-
* - Two views, split horizontally
|
|
32
|
-
* - Two views, split vertically
|
|
33
|
-
*/
|
|
34
|
-
export class ViewSelectorWidget extends Widget<ViewSelectorWidgetProps> {
|
|
35
|
-
static defaultProps: Required<ViewSelectorWidgetProps> = {
|
|
36
|
-
...Widget.defaultProps,
|
|
37
|
-
id: 'view-selector',
|
|
38
|
-
placement: 'top-left',
|
|
39
|
-
viewId: null,
|
|
40
|
-
label: 'Split View',
|
|
41
|
-
initialViewMode: 'single',
|
|
42
|
-
onViewModeChange: () => {}
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
className = 'deck-widget-view-selector';
|
|
46
|
-
placement: WidgetPlacement = 'top-left';
|
|
47
|
-
viewMode: ViewMode;
|
|
48
|
-
|
|
49
|
-
constructor(props: ViewSelectorWidgetProps = {}) {
|
|
50
|
-
super(props);
|
|
51
|
-
this.viewMode = this.props.initialViewMode;
|
|
52
|
-
this.setProps(this.props);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
setProps(props: Partial<ViewSelectorWidgetProps>) {
|
|
56
|
-
this.placement = props.placement ?? this.placement;
|
|
57
|
-
this.viewId = props.viewId ?? this.viewId;
|
|
58
|
-
super.setProps(props);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
onRenderHTML(rootElement: HTMLElement) {
|
|
62
|
-
render(
|
|
63
|
-
<IconMenu<ViewMode>
|
|
64
|
-
className="deck-widget-view-selector"
|
|
65
|
-
menuItems={MENU_ITEMS.map(item => ({
|
|
66
|
-
...item,
|
|
67
|
-
icon: item.icon()
|
|
68
|
-
}))}
|
|
69
|
-
initialItem={this.props.initialViewMode}
|
|
70
|
-
onItemSelected={this.handleSelectMode}
|
|
71
|
-
/>,
|
|
72
|
-
rootElement
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
handleSelectMode = (viewMode: ViewMode) => {
|
|
77
|
-
this.viewMode = viewMode;
|
|
78
|
-
this.updateHTML();
|
|
79
|
-
this.props.onViewModeChange(viewMode);
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const ICON_STYLE = {width: '24px', height: '24px'};
|
|
84
|
-
|
|
85
|
-
// JSX wrapped in a function to fix deck's Node tests
|
|
86
|
-
const ICONS: Record<ViewMode, () => JSX.Element> = {
|
|
87
|
-
single: () => (
|
|
88
|
-
<svg width="24" height="24" style={ICON_STYLE}>
|
|
89
|
-
<rect
|
|
90
|
-
x="4"
|
|
91
|
-
y="4"
|
|
92
|
-
width="16"
|
|
93
|
-
height="16"
|
|
94
|
-
stroke="var(--button-icon-hover, rgb(24, 24, 26))"
|
|
95
|
-
fill="none"
|
|
96
|
-
strokeWidth="2"
|
|
97
|
-
/>
|
|
98
|
-
</svg>
|
|
99
|
-
),
|
|
100
|
-
'split-horizontal': () => (
|
|
101
|
-
<svg width="24" height="24" style={ICON_STYLE}>
|
|
102
|
-
<rect
|
|
103
|
-
x="4"
|
|
104
|
-
y="4"
|
|
105
|
-
width="16"
|
|
106
|
-
height="7"
|
|
107
|
-
stroke="var(--button-icon-hover, rgb(24, 24, 26))"
|
|
108
|
-
fill="none"
|
|
109
|
-
strokeWidth="2"
|
|
110
|
-
/>
|
|
111
|
-
<rect
|
|
112
|
-
x="4"
|
|
113
|
-
y="13"
|
|
114
|
-
width="16"
|
|
115
|
-
height="7"
|
|
116
|
-
stroke="var(--button-icon-hover, rgb(24, 24, 26))"
|
|
117
|
-
fill="none"
|
|
118
|
-
strokeWidth="2"
|
|
119
|
-
/>
|
|
120
|
-
</svg>
|
|
121
|
-
),
|
|
122
|
-
'split-vertical': () => (
|
|
123
|
-
<svg width="24" height="24" style={ICON_STYLE}>
|
|
124
|
-
<rect
|
|
125
|
-
x="4"
|
|
126
|
-
y="4"
|
|
127
|
-
width="7"
|
|
128
|
-
height="16"
|
|
129
|
-
stroke="var(--button-icon-hover, rgb(24, 24, 26))"
|
|
130
|
-
fill="none"
|
|
131
|
-
strokeWidth="2"
|
|
132
|
-
/>
|
|
133
|
-
<rect
|
|
134
|
-
x="13"
|
|
135
|
-
y="4"
|
|
136
|
-
width="7"
|
|
137
|
-
height="16"
|
|
138
|
-
stroke="var(--button-icon-hover, rgb(24, 24, 26))"
|
|
139
|
-
fill="none"
|
|
140
|
-
strokeWidth="2"
|
|
141
|
-
/>
|
|
142
|
-
</svg>
|
|
143
|
-
)
|
|
144
|
-
};
|
|
145
|
-
|
|
146
|
-
// Define menu items for the popup menu.
|
|
147
|
-
const MENU_ITEMS: Array<{value: ViewMode; icon: () => JSX.Element; label: string}> = [
|
|
148
|
-
{value: 'single', icon: ICONS.single, label: 'Single View'},
|
|
149
|
-
{value: 'split-horizontal', icon: ICONS['split-horizontal'], label: 'Split Horizontal'},
|
|
150
|
-
{value: 'split-vertical', icon: ICONS['split-vertical'], label: 'Split Vertical'}
|
|
151
|
-
];
|