Skip to content

Commit b8d9511

Browse files
authored
Rework custom raster layer creation (#32)
* Rework raster layer creation * Add TODO comment * Fix build * Add icon for custom layer * Fix missing parameters when creating source * Bring back removed id * Fix test * Use PromiseDelegate * Fix readonly property editing while creating layer * Rework dialog buttons
1 parent bf72850 commit b8d9511

File tree

14 files changed

+300
-249
lines changed

14 files changed

+300
-249
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,5 +130,6 @@ jupytergis/_version.py
130130
python/jupytergis_lab/jupytergis_lab/labextension/
131131
python/jupytergis_lab/jupytergis_lab/notebook/objects/_schema
132132
packages/base/rasterlayer_gallery/*
133+
!packages/base/rasterlayer_gallery/custom_raster.png
133134

134135
untitled*
432 KB
Loading

packages/base/src/commands.ts

Lines changed: 13 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,12 @@
11
import { JupyterFrontEnd } from '@jupyterlab/application';
2-
import { Dialog, WidgetTracker } from '@jupyterlab/apputils';
2+
import { WidgetTracker } from '@jupyterlab/apputils';
33
import { ITranslator } from '@jupyterlab/translation';
44
import { redoIcon, undoIcon } from '@jupyterlab/ui-components';
55

66
import {
7-
IDict,
87
IJGISFormSchemaRegistry,
9-
IJGISLayer,
10-
IJGISLayerBrowserRegistry,
11-
IJGISSource,
12-
IJupyterGISModel
8+
IJGISLayerBrowserRegistry
139
} from '@jupytergis/schema';
14-
import { UUID } from '@lumino/coreutils';
15-
import { FormDialog } from './formdialog';
1610

1711
import { LayerBrowserWidget } from './layerBrowser/layerBrowserDialog';
1812
import { JupyterGISWidget } from './widget';
@@ -65,17 +59,6 @@ export function addCommands(
6559
icon: undoIcon
6660
});
6761

68-
commands.addCommand(CommandIDs.newRasterLayer, {
69-
label: trans.__('New Tile Layer'),
70-
isEnabled: () => {
71-
return tracker.currentWidget
72-
? tracker.currentWidget.context.model.sharedModel.editable
73-
: false;
74-
},
75-
iconClass: 'fa fa-map',
76-
execute: Private.createRasterSourceAndLayer(tracker)
77-
});
78-
7962
commands.addCommand(CommandIDs.openLayerBrowser, {
8063
label: trans.__('Open Layer Browser'),
8164
isEnabled: () => {
@@ -84,7 +67,11 @@ export function addCommands(
8467
: false;
8568
},
8669
iconClass: 'fa fa-book-open',
87-
execute: Private.createLayerBrowser(tracker, layerBrowserRegistry)
70+
execute: Private.createLayerBrowser(
71+
tracker,
72+
layerBrowserRegistry,
73+
formSchemaRegistry
74+
)
8875
});
8976
}
9077

@@ -95,7 +82,6 @@ export namespace CommandIDs {
9582
export const redo = 'jupytergis:redo';
9683
export const undo = 'jupytergis:undo';
9784

98-
export const newRasterLayer = 'jupytergis:newRasterLayer';
9985
export const openLayerBrowser = 'jupytergis:openLayerBrowser';
10086
}
10187

@@ -121,7 +107,8 @@ namespace Private {
121107

122108
export function createLayerBrowser(
123109
tracker: WidgetTracker<JupyterGISWidget>,
124-
layerBrowserRegistry: IJGISLayerBrowserRegistry
110+
layerBrowserRegistry: IJGISLayerBrowserRegistry,
111+
formSchemaRegistry: IJGISFormSchemaRegistry
125112
) {
126113
return async () => {
127114
const current = tracker.currentWidget;
@@ -130,83 +117,10 @@ namespace Private {
130117
return;
131118
}
132119

133-
const dialog = new Dialog({
134-
body: new LayerBrowserWidget(
135-
current.context.model,
136-
layerBrowserRegistry.getRegistryLayers()
137-
),
138-
buttons: [Dialog.cancelButton(), Dialog.okButton()]
139-
});
140-
await dialog.launch();
141-
};
142-
}
143-
144-
// TODO Allow for creating only a source (e.g. loading a CSV file)
145-
// TODO Allow for creating only a layer (e.g. creating a vector layer given a source selected from a dropdown)
146-
export function createRasterSourceAndLayer(
147-
tracker: WidgetTracker<JupyterGISWidget>
148-
) {
149-
return async (args: any) => {
150-
const current = tracker.currentWidget;
151-
152-
if (!current) {
153-
return;
154-
}
155-
156-
const form = {
157-
title: 'Raster Layer parameters',
158-
default: (model: IJupyterGISModel) => {
159-
return {
160-
name: 'RasterSource',
161-
url: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
162-
maxZoom: 24,
163-
minZoom: 0
164-
};
165-
}
166-
};
167-
168-
current.context.model.syncFormData(form);
169-
170-
const dialog = new FormDialog({
171-
context: current.context,
172-
title: form.title,
173-
sourceData: form.default(current.context.model),
174-
schema: FORM_SCHEMA['RasterSource'],
175-
syncData: (props: IDict) => {
176-
const sharedModel = current.context.model.sharedModel;
177-
if (!sharedModel) {
178-
return;
179-
}
180-
181-
const { name, ...parameters } = props;
182-
183-
const sourceId = UUID.uuid4();
184-
185-
const sourceModel: IJGISSource = {
186-
type: 'RasterSource',
187-
name,
188-
parameters: {
189-
url: parameters.url,
190-
minZoom: parameters.minZoom,
191-
maxZoom: parameters.maxZoom
192-
}
193-
};
194-
195-
const layerModel: IJGISLayer = {
196-
type: 'RasterLayer',
197-
parameters: {
198-
source: sourceId
199-
},
200-
visible: true,
201-
name: name + ' Layer'
202-
};
203-
204-
sharedModel.addSource(sourceId, sourceModel);
205-
current.context.model.addLayer(UUID.uuid4(), layerModel);
206-
},
207-
cancelButton: () => {
208-
current.context.model.syncFormData(undefined);
209-
}
120+
const dialog = new LayerBrowserWidget({
121+
model: current.context.model,
122+
registry: layerBrowserRegistry.getRegistryLayers(),
123+
formSchemaRegistry
210124
});
211125
await dialog.launch();
212126
};

packages/base/src/svg.d.ts renamed to packages/base/src/declaration.d.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,8 @@ declare module "*.svg" {
22
const value: string; // @ts-ignore
33
export default value;
44
}
5+
6+
declare module '*.png'{
7+
const value: string; // @ts-ignore
8+
export default value;
9+
}

packages/base/src/formdialog.tsx

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,33 +9,24 @@ export interface IFormDialogOptions {
99
schema: IDict;
1010
sourceData: IDict;
1111
title: string;
12-
cancelButton: (() => void) | boolean;
1312
syncData: (props: IDict) => void;
1413
context: DocumentRegistry.IContext<IJupyterGISModel>;
1514
}
1615

16+
// TODO This is currently not used, shall we remove it or will we need it later?
1717
export class FormDialog extends Dialog<IDict> {
1818
constructor(options: IFormDialogOptions) {
19-
let cancelCallback: (() => void) | undefined = undefined;
20-
if (options.cancelButton) {
21-
cancelCallback = () => {
22-
if (options.cancelButton !== true && options.cancelButton !== false) {
23-
options.cancelButton();
24-
}
25-
this.resolve(0);
26-
};
27-
}
2819
const filePath = options.context.path;
2920
const jGISModel = options.context.model;
3021
const body = (
3122
<div style={{ overflow: 'hidden' }}>
3223
<ObjectPropertiesForm
24+
formContext="create"
3325
model={jGISModel}
3426
filePath={`${filePath}::dialog`}
3527
sourceData={options.sourceData}
3628
schema={options.schema}
3729
syncData={options.syncData}
38-
cancel={cancelCallback}
3930
/>
4031
</div>
4132
);

0 commit comments

Comments
 (0)