Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
giswqs
GitHub Repository: giswqs/geemap
Path: blob/master/js/inspector.ts
2313 views
1
import type { RenderProps } from '@anywidget/types';
2
import { css, html, nothing, TemplateResult } from 'lit';
3
import { property } from 'lit/decorators.js';
4
5
import { legacyStyles } from './ipywidgets_styles';
6
import { LitWidget } from "./lit_widget";
7
import type { Node } from './tree_node';
8
9
import './container';
10
import './tree_node';
11
12
export interface InspectorModel {
13
hide_close_button: boolean;
14
expand_points: boolean;
15
expand_pixels: boolean;
16
expand_objects: boolean;
17
point_info: { [key: string]: any };
18
pixel_info: { [key: string]: any };
19
object_info: { [key: string]: any };
20
}
21
22
export class Inspector extends LitWidget<InspectorModel, Inspector> {
23
static get componentName(): string {
24
return `inspector-widget`;
25
}
26
27
static override styles = [
28
legacyStyles,
29
css`
30
.checkbox-container {
31
align-items: center;
32
display: flex;
33
gap: 8px;
34
height: 32px;
35
}
36
37
.spacer {
38
width: 8px;
39
}
40
41
.object-browser {
42
max-height: 300px;
43
overflow: auto;
44
width: 290px;
45
}
46
47
input[type='checkbox'] {
48
vertical-align: middle;
49
}
50
`,
51
];
52
53
@property({ type: Boolean }) hideCloseButton: boolean = false;
54
@property({ type: Boolean }) expandPoints: boolean = false;
55
@property({ type: Boolean }) expandPixels: boolean = true;
56
@property({ type: Boolean }) expandObjects: boolean = false;
57
@property() pointInfo: Node = {};
58
@property() pixelInfo: Node = {};
59
@property() objectInfo: Node = {};
60
61
modelNameToViewName(): Map<keyof InspectorModel, keyof Inspector | null> {
62
return new Map([
63
['hide_close_button', 'hideCloseButton'],
64
['expand_points', 'expandPoints'],
65
['expand_pixels', 'expandPixels'],
66
['expand_objects', 'expandObjects'],
67
['point_info', 'pointInfo'],
68
['pixel_info', 'pixelInfo'],
69
['object_info', 'objectInfo'],
70
]);
71
}
72
73
override render() {
74
return html`
75
<widget-container
76
icon="point_scan"
77
title="Inspector"
78
.hideCloseButton="${this.hideCloseButton}"
79
@close-clicked="${this.onCloseButtonClicked}"
80
>
81
<div class="checkbox-container">
82
<span class="legacy-text">Expand</span>
83
<div>
84
<input
85
type="checkbox"
86
.checked="${this.expandPoints}"
87
@change="${this.onPointCheckboxEvent}"
88
/>
89
<span class="legacy-text">Point</span>
90
</div>
91
<div>
92
<input
93
type="checkbox"
94
.checked="${this.expandPixels}"
95
@change="${this.onPixelCheckboxEvent}"
96
/>
97
<span class="legacy-text">Pixels</span>
98
</div>
99
<div>
100
<input
101
type="checkbox"
102
.checked="${this.expandObjects}"
103
@change="${this.onFeatureCheckboxEvent}"
104
/>
105
<span class="legacy-text">Objects</span>
106
</div>
107
</div>
108
<div class="object-browser">
109
${this.renderNode(this.pointInfo)}
110
${this.renderNode(this.pixelInfo)}
111
${this.renderNode(this.objectInfo)}
112
</div>
113
</widget-container>
114
`;
115
}
116
117
private renderNode(node: Node): TemplateResult | typeof nothing {
118
if (node.children?.length) {
119
return html`<tree-node .node="${node}"></tree-node> `;
120
}
121
return nothing;
122
}
123
124
private onPointCheckboxEvent(event: Event) {
125
const target = event.target as HTMLInputElement;
126
this.expandPoints = target.checked;
127
}
128
129
private onPixelCheckboxEvent(event: Event) {
130
const target = event.target as HTMLInputElement;
131
this.expandPixels = target.checked;
132
}
133
134
private onFeatureCheckboxEvent(event: Event) {
135
const target = event.target as HTMLInputElement;
136
this.expandObjects = target.checked;
137
}
138
139
private onCloseButtonClicked(_: Event) {
140
this.model?.send({ "type": "click", "id": "close" });
141
}
142
}
143
144
// Without this check, there's a component registry issue when developing locally.
145
if (!customElements.get(Inspector.componentName)) {
146
customElements.define(Inspector.componentName, Inspector);
147
}
148
149
async function render({ model, el }: RenderProps<InspectorModel>) {
150
const widget = document.createElement(Inspector.componentName) as Inspector;
151
widget.model = model;
152
el.appendChild(widget);
153
}
154
155
export default { render };
156