qwc2 2026.8.13 → 2026.8.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.
Files changed (46) hide show
  1. package/README.md +1 -1
  2. package/components/AttributeTableWidget.js +121 -285
  3. package/components/BookmarkPanel.js +3 -2
  4. package/components/IdentifyViewer.js +39 -20
  5. package/components/ImportLayer.js +6 -392
  6. package/components/QtDesignerForm.js +1 -1
  7. package/components/ResizeableWindow.js +10 -0
  8. package/components/map3d/style/Map3D.css +1 -0
  9. package/components/style/AttributeTableWidget.css +1 -140
  10. package/components/widgets/FeaturesTable.js +30 -31
  11. package/components/widgets/MenuButton.js +10 -10
  12. package/components/widgets/TextInput.js +0 -10
  13. package/components/widgets/style/FeaturesTable.css +46 -19
  14. package/icons/public.svg +63 -0
  15. package/package.json +1 -1
  16. package/plugins/BottomBar.js +123 -111
  17. package/plugins/MapDropImport.js +135 -0
  18. package/plugins/map3d/Viewshed3D.js +171 -52
  19. package/plugins/map3d/style/Viewshed3D.css +4 -0
  20. package/plugins/style/BottomBar.css +10 -3
  21. package/plugins/style/MapDropImport.css +19 -0
  22. package/static/translations/bg-BG.json +8 -0
  23. package/static/translations/ca-ES.json +8 -0
  24. package/static/translations/cs-CZ.json +8 -0
  25. package/static/translations/de-CH.json +8 -0
  26. package/static/translations/de-DE.json +8 -0
  27. package/static/translations/en-US.json +8 -0
  28. package/static/translations/es-ES.json +8 -0
  29. package/static/translations/fi-FI.json +8 -0
  30. package/static/translations/fr-FR.json +8 -0
  31. package/static/translations/hu-HU.json +8 -0
  32. package/static/translations/it-IT.json +8 -0
  33. package/static/translations/ja-JP.json +8 -0
  34. package/static/translations/nl-NL.json +8 -0
  35. package/static/translations/no-NO.json +8 -0
  36. package/static/translations/pl-PL.json +8 -0
  37. package/static/translations/pt-BR.json +8 -0
  38. package/static/translations/pt-PT.json +8 -0
  39. package/static/translations/ro-RO.json +8 -0
  40. package/static/translations/ru-RU.json +8 -0
  41. package/static/translations/sv-SE.json +8 -0
  42. package/static/translations/tr-TR.json +8 -0
  43. package/static/translations/tsconfig.json +4 -0
  44. package/static/translations/uk-UA.json +8 -0
  45. package/utils/FileImportUtils.js +390 -0
  46. package/utils/LayerUtils.js +2 -2
@@ -27,10 +27,13 @@ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e
27
27
 
28
28
  import React from 'react';
29
29
  import PropTypes from 'prop-types';
30
- import { Color, CubeCamera, DoubleSide, HalfFloatType, LinearFilter, Mesh, MeshStandardMaterial, ShaderMaterial, SphereGeometry, Vector3, WebGLCubeRenderTarget } from 'three';
30
+ import { Color, CubeCamera, DoubleSide, HalfFloatType, LinearFilter, Mesh, MeshStandardMaterial, ShaderMaterial, SphereGeometry, Vector4, WebGLCubeRenderTarget } from 'three';
31
31
  import { TransformControls } from 'three/addons/controls/TransformControls';
32
+ import { v4 as uuidv4 } from 'uuid';
33
+ import Icon from '../../components/Icon';
32
34
  import SideBar from '../../components/SideBar';
33
35
  import ColorButton from '../../components/widgets/ColorButton';
36
+ import MenuButton from '../../components/widgets/MenuButton';
34
37
  import NumberInput from '../../components/widgets/NumberInput';
35
38
  import CoordinatesUtils from '../../utils/CoordinatesUtils';
36
39
  import LocaleUtils from '../../utils/LocaleUtils';
@@ -49,6 +52,8 @@ var Viewshed3D = /*#__PURE__*/function (_React$Component) {
49
52
  _classCallCheck(this, Viewshed3D);
50
53
  _this = _callSuper(this, Viewshed3D, [props]);
51
54
  _defineProperty(_this, "state", {
55
+ mode: 'off',
56
+ panelVisible: false,
52
57
  maxDistance: 500,
53
58
  cubeTextureSize: 2048,
54
59
  observerPos: {
@@ -56,11 +61,13 @@ var Viewshed3D = /*#__PURE__*/function (_React$Component) {
56
61
  y: 0,
57
62
  z: 0
58
63
  },
59
- visibleColor: [51, 255, 51],
60
- occludedColor: [255, 51, 51],
64
+ inputHeight: 0,
65
+ zMode: 'terrain',
66
+ visibleColor: [51, 255, 51, 0.9],
67
+ occludedColor: [255, 51, 51, 0.9],
61
68
  gizmoVisible: true
62
69
  });
63
- _defineProperty(_this, "onShow", function () {
70
+ _defineProperty(_this, "setupCubemapViewshed", function () {
64
71
  _this.overriddenMaterials = [];
65
72
  var scene = _this.props.sceneContext.scene;
66
73
  var camera = _this.props.sceneContext.scene.view.camera;
@@ -129,33 +136,50 @@ var Viewshed3D = /*#__PURE__*/function (_React$Component) {
129
136
  _this.props.sceneContext.eventDispatcher.addEventListener('cameraChanged', _this.updateTransformHelper);
130
137
  _this.props.sceneContext.scene.notifyChange();
131
138
  });
132
- _defineProperty(_this, "onHide", function () {
139
+ _defineProperty(_this, "reset", function () {
133
140
  _this.props.sceneContext.removeObjectAddedListener(_this.overrideMaterial);
134
- _this.transformControls.removeEventListener('dragging-changed', _this.onControlDrag);
135
- _this.transformControls.removeEventListener('objectChange', _this.onControlChange);
136
- _this.transformControls.removeEventListener('change', _this.onControlChange);
137
- _this.props.sceneContext.eventDispatcher.removeEventListener('cameraChanged', _this.updateTransformHelper);
141
+ if (_this.transformControls) {
142
+ _this.transformControls.removeEventListener('dragging-changed', _this.onControlDrag);
143
+ _this.transformControls.removeEventListener('objectChange', _this.onControlChange);
144
+ _this.transformControls.removeEventListener('change', _this.onControlChange);
145
+ _this.props.sceneContext.eventDispatcher.removeEventListener('cameraChanged', _this.updateTransformHelper);
146
+ _this.props.sceneContext.scene.remove(_this.transformControls.getHelper());
147
+ _this.transformControls.detach();
148
+ _this.transformControls = null;
149
+ }
138
150
  _this.overriddenMaterials.forEach(function (material) {
139
151
  material.onBeforeCompile = material.userData.originalOnBeforeCompile;
140
152
  delete material.userData.originalOnBeforeCompile;
153
+ material.customProgramCacheKey = material.userData.originalCustomProgramCacheKey;
154
+ delete material.userData.originalCustomProgramCacheKey;
141
155
  material.needsUpdate = true;
142
156
  });
143
157
  _this.overriddenMaterials = [];
144
- _this.transformControls.detach();
145
- _this.props.sceneContext.scene.remove(_this.cubeCamera);
146
- _this.props.sceneContext.scene.remove(_this.transformControls.getHelper());
147
- _this.props.sceneContext.scene.remove(_this.observerMesh);
148
- _this.cubeCamera = null;
149
- _this.cubemapTarget = null;
150
- _this.transformControls = null;
151
- _this.observerMesh = null;
158
+ if (_this.cubeCamera) {
159
+ _this.props.sceneContext.scene.remove(_this.cubeCamera);
160
+ _this.cubeCamera = null;
161
+ }
162
+ if (_this.cubemapTarget) {
163
+ _this.cubemapTarget.dispose();
164
+ _this.cubemapTarget = null;
165
+ }
166
+ if (_this.observerMesh) {
167
+ _this.props.sceneContext.scene.remove(_this.observerMesh);
168
+ _this.observerMesh = null;
169
+ }
170
+ if (_this.distanceMaterial) {
171
+ _this.distanceMaterial.dispose();
172
+ _this.distanceMaterial = null;
173
+ }
174
+ _this.props.sceneContext.scene.notifyChange();
152
175
  });
153
176
  _defineProperty(_this, "updateObserverPos", function (diff) {
154
177
  _this.setState(function (state) {
155
178
  var newPos = _objectSpread(_objectSpread({}, state.observerPos), diff);
156
- if (diff.z !== undefined) {
179
+ newPos.z = state.inputHeight;
180
+ if (state.zMode === 'terrain') {
157
181
  var _this$props$sceneCont2;
158
- newPos.z = Math.max(newPos.z, (_this$props$sceneCont2 = _this.props.sceneContext.getTerrainHeightFromMap([newPos.x, newPos.y])) !== null && _this$props$sceneCont2 !== void 0 ? _this$props$sceneCont2 : 0);
182
+ newPos.z += (_this$props$sceneCont2 = _this.props.sceneContext.getTerrainHeightFromMap([newPos.x, newPos.y])) !== null && _this$props$sceneCont2 !== void 0 ? _this$props$sceneCont2 : 0;
159
183
  }
160
184
  if (_this.observerMesh) {
161
185
  _this.observerMesh.position.setX(newPos.x);
@@ -172,6 +196,34 @@ var Viewshed3D = /*#__PURE__*/function (_React$Component) {
172
196
  };
173
197
  });
174
198
  });
199
+ _defineProperty(_this, "updateObserverHeight", function (z) {
200
+ if (_this.state.zMode === 'absolute') {
201
+ var _this$props$sceneCont3;
202
+ var p = _this.state.observerPos;
203
+ var terrH = (_this$props$sceneCont3 = _this.props.sceneContext.getTerrainHeightFromMap([p.x, p.y])) !== null && _this$props$sceneCont3 !== void 0 ? _this$props$sceneCont3 : 0;
204
+ z = Math.max(z, terrH);
205
+ } else {
206
+ z = Math.max(z, 0);
207
+ }
208
+ _this.setState({
209
+ inputHeight: z
210
+ }, _this.updateObserverPos);
211
+ });
212
+ _defineProperty(_this, "setZMode", function (mode) {
213
+ _this.setState(function (state) {
214
+ if (state.zMode !== mode) {
215
+ var _this$props$sceneCont4;
216
+ var p = state.observerPos;
217
+ var terrH = (_this$props$sceneCont4 = _this.props.sceneContext.getTerrainHeightFromMap([p.x, p.y])) !== null && _this$props$sceneCont4 !== void 0 ? _this$props$sceneCont4 : 0;
218
+ return {
219
+ zMode: mode,
220
+ inputHeight: mode === 'absolute' ? state.inputHeight + terrH : state.inputHeight - terrH
221
+ };
222
+ } else {
223
+ return {};
224
+ }
225
+ });
226
+ });
175
227
  _defineProperty(_this, "updateTransformHelper", function () {
176
228
  _this.transformControls.getHelper().updateMatrixWorld();
177
229
  _this.props.sceneContext.scene.notifyChange();
@@ -180,15 +232,19 @@ var Viewshed3D = /*#__PURE__*/function (_React$Component) {
180
232
  _this.props.sceneContext.scene.view.controls.enabled = !event.value;
181
233
  });
182
234
  _defineProperty(_this, "onControlChange", function () {
183
- var _this$props$sceneCont3;
235
+ var _this$props$sceneCont5;
184
236
  var p = _this.observerMesh.position;
185
- p.z = Math.max(p.z, (_this$props$sceneCont3 = _this.props.sceneContext.getTerrainHeightFromMap([p.x, p.y])) !== null && _this$props$sceneCont3 !== void 0 ? _this$props$sceneCont3 : 0);
186
- _this.setState({
187
- observerPos: {
188
- x: p.x,
189
- y: p.y,
190
- z: p.z
191
- }
237
+ var terrH = (_this$props$sceneCont5 = _this.props.sceneContext.getTerrainHeightFromMap([p.x, p.y])) !== null && _this$props$sceneCont5 !== void 0 ? _this$props$sceneCont5 : 0;
238
+ p.z = Math.max(p.z, terrH);
239
+ _this.setState(function (state) {
240
+ return {
241
+ observerPos: {
242
+ x: p.x,
243
+ y: p.y,
244
+ z: p.z
245
+ },
246
+ inputHeight: state.zMode === 'terrain' ? p.z - terrH : p.z
247
+ };
192
248
  });
193
249
  _this.observerMesh.updateMatrixWorld(true);
194
250
  _this.transformControls.getHelper().updateMatrixWorld();
@@ -212,7 +268,7 @@ var Viewshed3D = /*#__PURE__*/function (_React$Component) {
212
268
  _this.cubeCamera.renderTarget.clear(renderer, true, true, true);
213
269
  _this.cubeCamera.update(renderer, scene);
214
270
  _this.observerMesh.visible = true;
215
- _this.transformControls.getHelper().visible = _this.state.gizmoVisible;
271
+ _this.transformControls.getHelper().visible = _this.state.panelVisible && _this.state.gizmoVisible;
216
272
  scene.overrideMaterial = prevOverrideMaterial;
217
273
  _this.overrideMaterial(scene);
218
274
  _this.recomputing = false;
@@ -230,36 +286,46 @@ var Viewshed3D = /*#__PURE__*/function (_React$Component) {
230
286
  (_obj$children = obj.children) === null || _obj$children === void 0 || (_obj$children$forEach = _obj$children.forEach) === null || _obj$children$forEach === void 0 || _obj$children$forEach.call(_obj$children, _this.overrideMaterial);
231
287
  if (obj.material && obj.material.onBeforeCompile !== _this.injectShader) {
232
288
  obj.material.userData.originalOnBeforeCompile = obj.material.onBeforeCompile;
289
+ obj.material.userData.originalCustomProgramCacheKey = obj.material.customProgramCacheKey;
233
290
  obj.material.onBeforeCompile = _this.injectShader;
291
+ obj.material.customProgramCacheKey = function () {
292
+ return uuidv4();
293
+ };
234
294
  obj.material.needsUpdate = true;
235
295
  _this.overriddenMaterials.push(obj.material);
236
296
  }
237
297
  });
238
298
  _defineProperty(_this, "injectShader", function (shader) {
239
- shader.uniforms.visibilityMap = {
299
+ shader.uniforms.viewshedVisibilityMap = {
240
300
  value: _this.cubemapTarget.texture
241
301
  };
242
- shader.uniforms.observerPos = {
302
+ shader.uniforms.viewshedObserverPos = {
243
303
  value: _this.observerMesh.position
244
304
  };
245
- shader.uniforms.maxDist = {
305
+ shader.uniforms.viewshedMaxDist = {
246
306
  value: _this.maxDistance
247
307
  };
248
- shader.uniforms.visibleColor = {
308
+ shader.uniforms.viewshedVisibleColor = {
249
309
  value: _this.visibleColor
250
310
  };
251
- shader.uniforms.occludedColor = {
311
+ shader.uniforms.viewshedOccludedColor = {
252
312
  value: _this.occludedColor
253
313
  };
254
314
  shader.vertexShader = 'varying vec3 vVisWorld;\n' + shader.vertexShader;
255
315
  shader.vertexShader = shader.vertexShader.replace('#include <begin_vertex>', "\n #include <begin_vertex>\n\n vec4 worldPos = modelMatrix * vec4(transformed, 1.0);\n vVisWorld = worldPos.xyz;\n ");
256
- shader.fragmentShader = 'varying vec3 vVisWorld;\n' + 'uniform samplerCube visibilityMap;\n' + 'uniform vec3 observerPos;\n' + 'uniform vec2 maxDist;\n' + 'uniform vec3 visibleColor;\n' + 'uniform vec3 occludedColor;\n' + shader.fragmentShader;
257
- shader.fragmentShader = shader.fragmentShader.replace('#include <dithering_fragment>', "\n vec3 dir = vVisWorld - observerPos;\n float dist = length(dir);\n vec3 ray = normalize(dir);\n\n float enc = textureCube(visibilityMap, ray).r;\n float stored = enc * maxDist.x;\n\n bool visible = dist <= stored + 0.5;\n vec3 tint = visible ? visibleColor : occludedColor;\n\n gl_FragColor.rgb = mix(gl_FragColor.rgb, tint / 255.0, 0.8);\n\n #include <dithering_fragment>\n ");
316
+ shader.fragmentShader = 'varying vec3 vVisWorld;\n' + 'uniform samplerCube viewshedVisibilityMap;\n' + 'uniform vec3 viewshedObserverPos;\n' + 'uniform vec2 viewshedMaxDist;\n' + 'uniform vec4 viewshedVisibleColor;\n' + 'uniform vec4 viewshedOccludedColor;\n' + shader.fragmentShader;
317
+ shader.fragmentShader = shader.fragmentShader.replace('#include <dithering_fragment>', "\n vec3 dir = vVisWorld - viewshedObserverPos;\n float dist = length(dir);\n vec3 ray = normalize(dir);\n\n float enc = textureCube(viewshedVisibilityMap, ray).r;\n float stored = enc * viewshedMaxDist.x;\n\n bool visible = dist <= stored + 0.5;\n vec4 tint = visible ? viewshedVisibleColor : viewshedOccludedColor;\n\n gl_FragColor.rgb = mix(gl_FragColor.rgb, tint.rgb / 255.0, tint.a);\n\n #include <dithering_fragment>\n ");
258
318
  });
259
319
  _this.recomputing = false;
260
- _this.visibleColor = new Vector3().fromArray(_this.state.visibleColor);
261
- _this.occludedColor = new Vector3().fromArray(_this.state.occludedColor);
320
+ _this.visibleColor = new Vector4().fromArray(_this.state.visibleColor);
321
+ _this.occludedColor = new Vector4().fromArray(_this.state.occludedColor);
262
322
  _this.maxDistance = [_this.state.maxDistance, 0];
323
+ _this.overriddenMaterials = [];
324
+ _this.observerMesh = null;
325
+ _this.cubemapTarget = null;
326
+ _this.cubeCamera = null;
327
+ _this.distanceMaterial = null;
328
+ _this.transformControls = null;
263
329
  return _this;
264
330
  }
265
331
  _inherits(Viewshed3D, _React$Component);
@@ -288,6 +354,16 @@ var Viewshed3D = /*#__PURE__*/function (_React$Component) {
288
354
  this.maxDistance[0] = this.state.maxDistance;
289
355
  this.recompute();
290
356
  }
357
+ if (this.state.panelVisible !== prevState.panelVisible && this.transformControls) {
358
+ this.transformControls.getHelper().visible = this.state.panelVisible && this.state.gizmoVisible;
359
+ this.props.sceneContext.scene.notifyChange(this.transformControls.getHelper());
360
+ }
361
+ if (this.state.mode !== prevState.mode) {
362
+ this.reset();
363
+ if (this.state.mode === "cubemap") {
364
+ this.setupCubemapViewshed();
365
+ }
366
+ }
291
367
  }
292
368
  }, {
293
369
  key: "render",
@@ -296,8 +372,16 @@ var Viewshed3D = /*#__PURE__*/function (_React$Component) {
296
372
  return /*#__PURE__*/React.createElement(SideBar, {
297
373
  icon: "eye",
298
374
  id: "Viewshed3D",
299
- onHide: this.onHide,
300
- onShow: this.onShow,
375
+ onHide: function onHide() {
376
+ return _this2.setState({
377
+ panelVisible: false
378
+ });
379
+ },
380
+ onShow: function onShow() {
381
+ return _this2.setState({
382
+ panelVisible: true
383
+ });
384
+ },
301
385
  title: LocaleUtils.tr("appmenu.items.Viewshed3D"),
302
386
  width: "20em"
303
387
  }, function () {
@@ -315,9 +399,24 @@ var Viewshed3D = /*#__PURE__*/function (_React$Component) {
315
399
  className: "viewshed3d-body"
316
400
  }, /*#__PURE__*/React.createElement("table", {
317
401
  className: "viewshed3d-optionstable"
318
- }, /*#__PURE__*/React.createElement("tbody", null, /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", {
402
+ }, /*#__PURE__*/React.createElement("tbody", null, /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, LocaleUtils.tr("common.mode")), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement("select", {
403
+ onChange: function onChange(ev) {
404
+ return _this3.setState({
405
+ mode: ev.target.value
406
+ });
407
+ },
408
+ value: this.state.mode
409
+ }, /*#__PURE__*/React.createElement("option", {
410
+ value: "off"
411
+ }, LocaleUtils.tr("common.disabled")), /*#__PURE__*/React.createElement("option", {
412
+ value: "cubemap"
413
+ }, LocaleUtils.tr("viewshed.cubemap"))))), this.state.mode === "cubemap" ? [/*#__PURE__*/React.createElement("tr", {
414
+ key: "observerpos"
415
+ }, /*#__PURE__*/React.createElement("td", {
319
416
  colSpan: "2"
320
- }, LocaleUtils.tr("viewshed3d.observerpos"))), /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", {
417
+ }, LocaleUtils.tr("viewshed3d.observerpos"))), /*#__PURE__*/React.createElement("tr", {
418
+ key: "observerposinput"
419
+ }, /*#__PURE__*/React.createElement("td", {
321
420
  colSpan: "2"
322
421
  }, /*#__PURE__*/React.createElement("div", {
323
422
  className: "viewshed3d-posinputs"
@@ -337,28 +436,46 @@ var Viewshed3D = /*#__PURE__*/function (_React$Component) {
337
436
  value: this.state.observerPos.y
338
437
  }), /*#__PURE__*/React.createElement(NumberInput, {
339
438
  onChange: function onChange(z) {
340
- return _this3.updateObserverPos({
341
- z: z
342
- });
439
+ return _this3.updateObserverHeight(z);
343
440
  },
344
- value: this.state.observerPos.z
345
- })))), /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, LocaleUtils.tr("viewshed3d.visiblecolor")), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement(ColorButton, {
346
- alpha: false,
441
+ value: this.state.inputHeight
442
+ }), /*#__PURE__*/React.createElement(MenuButton, {
443
+ menuIcon: this.state.zMode === 'absolute' ? 'above_zero' : 'above_terr'
444
+ }, /*#__PURE__*/React.createElement("div", {
445
+ onClick: function onClick() {
446
+ return _this3.setZMode('absolute');
447
+ }
448
+ }, /*#__PURE__*/React.createElement(Icon, {
449
+ icon: "above_zero"
450
+ })), /*#__PURE__*/React.createElement("div", {
451
+ onClick: function onClick() {
452
+ return _this3.setZMode('terrain');
453
+ }
454
+ }, /*#__PURE__*/React.createElement(Icon, {
455
+ icon: "above_terr"
456
+ })))))), /*#__PURE__*/React.createElement("tr", {
457
+ key: "visiblecolor"
458
+ }, /*#__PURE__*/React.createElement("td", null, LocaleUtils.tr("viewshed3d.visiblecolor")), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement(ColorButton, {
459
+ alpha: true,
347
460
  color: this.state.visibleColor,
348
461
  onColorChanged: function onColorChanged(color) {
349
462
  return _this3.setState({
350
463
  visibleColor: color
351
464
  });
352
465
  }
353
- }))), /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, LocaleUtils.tr("viewshed3d.occludedcolor")), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement(ColorButton, {
354
- alpha: false,
466
+ }))), /*#__PURE__*/React.createElement("tr", {
467
+ key: "occludedcolor"
468
+ }, /*#__PURE__*/React.createElement("td", null, LocaleUtils.tr("viewshed3d.occludedcolor")), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement(ColorButton, {
469
+ alpha: true,
355
470
  color: this.state.occludedColor,
356
471
  onColorChanged: function onColorChanged(color) {
357
472
  return _this3.setState({
358
473
  occludedColor: color
359
474
  });
360
475
  }
361
- }))), /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, LocaleUtils.tr("viewshed3d.maxDistance")), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement(NumberInput, {
476
+ }))), /*#__PURE__*/React.createElement("tr", {
477
+ key: "maxdist"
478
+ }, /*#__PURE__*/React.createElement("td", null, LocaleUtils.tr("viewshed3d.maxDistance")), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement(NumberInput, {
362
479
  min: 10,
363
480
  onChange: function onChange(d) {
364
481
  return _this3.setState({
@@ -367,7 +484,9 @@ var Viewshed3D = /*#__PURE__*/function (_React$Component) {
367
484
  },
368
485
  suffix: " " + units,
369
486
  value: this.state.maxDistance
370
- }))), /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", {
487
+ }))), /*#__PURE__*/React.createElement("tr", {
488
+ key: "gizmo"
489
+ }, /*#__PURE__*/React.createElement("td", {
371
490
  colSpan: "2"
372
491
  }, /*#__PURE__*/React.createElement("label", null, /*#__PURE__*/React.createElement("input", {
373
492
  checked: this.state.gizmoVisible,
@@ -377,7 +496,7 @@ var Viewshed3D = /*#__PURE__*/function (_React$Component) {
377
496
  });
378
497
  },
379
498
  type: "checkbox"
380
- }), ' ', LocaleUtils.tr("viewshed3d.showgizmo")))))));
499
+ }), ' ', LocaleUtils.tr("viewshed3d.showgizmo"))))] : null)));
381
500
  }
382
501
  }]);
383
502
  }(React.Component);
@@ -6,6 +6,10 @@ table.viewshed3d-optionstable {
6
6
  width: 100%;
7
7
  }
8
8
 
9
+ table.viewshed3d-optionstable td > select {
10
+ width: 100%
11
+ }
12
+
9
13
  div.viewshed3d-posinputs {
10
14
  display: flex;
11
15
  }
@@ -5,13 +5,20 @@
5
5
  bottom: 0;
6
6
  height: 3em;
7
7
  z-index: 100;
8
+ font-size: 75%;
9
+ display: flex;
10
+ align-items: center;
11
+ }
12
+
13
+ #BottomBar:not(.bottombar-fullscreen) {
8
14
  color: var(--panel-text-color);
9
15
  background-color: var(--panel-bg-color);
10
16
  box-shadow: 0 -2px 4px rgba(136, 136, 136, 0.5);
11
17
  backdrop-filter: blur(3px);
12
- font-size: 75%;
13
- display: flex;
14
- align-items: center;
18
+ }
19
+
20
+ #BottomBar.bottombar-fullscreen {
21
+ pointer-events: none;
15
22
  }
16
23
 
17
24
  #BottomBar > * {
@@ -0,0 +1,19 @@
1
+ div.map-drop-import-overlay {
2
+ position: fixed;
3
+ inset: 0;
4
+ z-index: 100;
5
+ pointer-events: none;
6
+ display: flex;
7
+ align-items: center;
8
+ justify-content: center;
9
+ background-color: rgba(0, 0, 0, 0.25);
10
+ }
11
+
12
+ div.map-drop-import-overlay > span {
13
+ background-color: var(--panel-bg-color);
14
+ color: var(--panel-text-color);
15
+ border: 2px dashed var(--panel-text-color);
16
+ border-radius: 0.25em;
17
+ padding: 1em 2em;
18
+ font-size: large;
19
+ }
@@ -133,6 +133,7 @@
133
133
  "dataloadfailed": "",
134
134
  "date": "",
135
135
  "delete": "Изтриване на",
136
+ "disabled": "",
136
137
  "download": "Изтегляне",
137
138
  "ellipse": "Елипса",
138
139
  "export": "Експорт",
@@ -142,6 +143,7 @@
142
143
  "line": "Линия",
143
144
  "loading": "Зареждане...",
144
145
  "lock2dview": "",
146
+ "mode": "",
145
147
  "noresults": "Няма резултати",
146
148
  "pick": "Изберете",
147
149
  "point": "Точка",
@@ -417,6 +419,9 @@
417
419
  "terrain": "Земя",
418
420
  "title": "3D изглед"
419
421
  },
422
+ "mapdropimport": {
423
+ "dropfiles": ""
424
+ },
420
425
  "mapexport": {
421
426
  "configuration": "Конфигурация",
422
427
  "projection": "",
@@ -912,6 +917,9 @@
912
917
  "view3d": {
913
918
  "storingstate": ""
914
919
  },
920
+ "viewshed": {
921
+ "cubemap": ""
922
+ },
915
923
  "viewshed3d": {
916
924
  "maxDistance": "",
917
925
  "observerpos": "",
@@ -133,6 +133,7 @@
133
133
  "dataloadfailed": "Error en carregar les dades",
134
134
  "date": "",
135
135
  "delete": "Eliminar",
136
+ "disabled": "",
136
137
  "download": "Descarregar",
137
138
  "ellipse": "El·lipse",
138
139
  "export": "Exportar",
@@ -142,6 +143,7 @@
142
143
  "line": "Línia",
143
144
  "loading": "Carregant",
144
145
  "lock2dview": "Moure amb la vista 2D",
146
+ "mode": "",
145
147
  "noresults": "Cap resultat",
146
148
  "pick": "Escollir",
147
149
  "point": "Punt",
@@ -417,6 +419,9 @@
417
419
  "terrain": "Terreny",
418
420
  "title": "Vista 3D"
419
421
  },
422
+ "mapdropimport": {
423
+ "dropfiles": ""
424
+ },
420
425
  "mapexport": {
421
426
  "configuration": "Configuració",
422
427
  "projection": "Projecció",
@@ -912,6 +917,9 @@
912
917
  "view3d": {
913
918
  "storingstate": "Desant l'estat 3D..."
914
919
  },
920
+ "viewshed": {
921
+ "cubemap": ""
922
+ },
915
923
  "viewshed3d": {
916
924
  "maxDistance": "",
917
925
  "observerpos": "",
@@ -133,6 +133,7 @@
133
133
  "dataloadfailed": "",
134
134
  "date": "",
135
135
  "delete": "",
136
+ "disabled": "",
136
137
  "download": "",
137
138
  "ellipse": "",
138
139
  "export": "Export",
@@ -142,6 +143,7 @@
142
143
  "line": "Linie",
143
144
  "loading": "Načítání...",
144
145
  "lock2dview": "",
146
+ "mode": "",
145
147
  "noresults": "Nenalezeno",
146
148
  "pick": "",
147
149
  "point": "Bod",
@@ -417,6 +419,9 @@
417
419
  "terrain": "",
418
420
  "title": ""
419
421
  },
422
+ "mapdropimport": {
423
+ "dropfiles": ""
424
+ },
420
425
  "mapexport": {
421
426
  "configuration": "",
422
427
  "projection": "",
@@ -912,6 +917,9 @@
912
917
  "view3d": {
913
918
  "storingstate": ""
914
919
  },
920
+ "viewshed": {
921
+ "cubemap": ""
922
+ },
915
923
  "viewshed3d": {
916
924
  "maxDistance": "",
917
925
  "observerpos": "",
@@ -133,6 +133,7 @@
133
133
  "dataloadfailed": "Daten konnten nicht geladen werden",
134
134
  "date": "Datum",
135
135
  "delete": "Löschen",
136
+ "disabled": "Deaktiviert",
136
137
  "download": "Herunterladen",
137
138
  "ellipse": "Ellipse",
138
139
  "export": "Exportieren",
@@ -142,6 +143,7 @@
142
143
  "line": "Linie",
143
144
  "loading": "Laden...",
144
145
  "lock2dview": "Mit 2D Ansicht bewegen",
146
+ "mode": "Modus",
145
147
  "noresults": "Keine Ergebnisse",
146
148
  "pick": "Auswählen",
147
149
  "point": "Punkt",
@@ -417,6 +419,9 @@
417
419
  "terrain": "Gelände",
418
420
  "title": "3D Ansicht"
419
421
  },
422
+ "mapdropimport": {
423
+ "dropfiles": "Dateien hierher ziehen, um sie als Kartenebenen zu importieren"
424
+ },
420
425
  "mapexport": {
421
426
  "configuration": "Konfiguration",
422
427
  "projection": "Projektion",
@@ -912,6 +917,9 @@
912
917
  "view3d": {
913
918
  "storingstate": "3D Ansicht wird gespeichert..."
914
919
  },
920
+ "viewshed": {
921
+ "cubemap": "360° Sichtbereich"
922
+ },
915
923
  "viewshed3d": {
916
924
  "maxDistance": "Maximale Distanz",
917
925
  "observerpos": "Beobachterposition",
@@ -133,6 +133,7 @@
133
133
  "dataloadfailed": "Daten konnten nicht geladen werden",
134
134
  "date": "Datum",
135
135
  "delete": "Löschen",
136
+ "disabled": "Deaktiviert",
136
137
  "download": "Herunterladen",
137
138
  "ellipse": "Ellipse",
138
139
  "export": "Exportieren",
@@ -142,6 +143,7 @@
142
143
  "line": "Linie",
143
144
  "loading": "Laden...",
144
145
  "lock2dview": "Mit 2D Ansicht bewegen",
146
+ "mode": "Modus",
145
147
  "noresults": "Keine Ergebnisse",
146
148
  "pick": "Auswählen",
147
149
  "point": "Punkt",
@@ -417,6 +419,9 @@
417
419
  "terrain": "Gelände",
418
420
  "title": "3D Ansicht"
419
421
  },
422
+ "mapdropimport": {
423
+ "dropfiles": "Dateien hierher ziehen, um sie als Kartenebenen zu importieren"
424
+ },
420
425
  "mapexport": {
421
426
  "configuration": "Konfiguration",
422
427
  "projection": "Projektion",
@@ -912,6 +917,9 @@
912
917
  "view3d": {
913
918
  "storingstate": "3D Ansicht wird gespeichert..."
914
919
  },
920
+ "viewshed": {
921
+ "cubemap": "360° Sichtbereich"
922
+ },
915
923
  "viewshed3d": {
916
924
  "maxDistance": "Maximale Distanz",
917
925
  "observerpos": "Beobachterposition",
@@ -133,6 +133,7 @@
133
133
  "dataloadfailed": "Failed to load data",
134
134
  "date": "Date",
135
135
  "delete": "Delete",
136
+ "disabled": "Disabled",
136
137
  "download": "Download",
137
138
  "ellipse": "Ellipse",
138
139
  "export": "Export",
@@ -142,6 +143,7 @@
142
143
  "line": "Line",
143
144
  "loading": "Loading...",
144
145
  "lock2dview": "Move with 2D view",
146
+ "mode": "Mode",
145
147
  "noresults": "No results",
146
148
  "pick": "Pick",
147
149
  "point": "Point",
@@ -417,6 +419,9 @@
417
419
  "terrain": "Terrain",
418
420
  "title": "3D View"
419
421
  },
422
+ "mapdropimport": {
423
+ "dropfiles": "Drop files to import them as map layers"
424
+ },
420
425
  "mapexport": {
421
426
  "configuration": "Configuration",
422
427
  "projection": "Projection",
@@ -912,6 +917,9 @@
912
917
  "view3d": {
913
918
  "storingstate": "Storing 3D state..."
914
919
  },
920
+ "viewshed": {
921
+ "cubemap": "360° viewshed"
922
+ },
915
923
  "viewshed3d": {
916
924
  "maxDistance": "Maximum distance",
917
925
  "observerpos": "Observer position",