Skip to content

Commit 4e8eb4a

Browse files
authored
Add settings for controlling map image and countries borders file (#32)
Adds new settings for: - globe map URL - globe bump map URL - countries GeoJSON file (for countries borders) This enables more control over these specifics and also provides dropdown displaying default values, to make it easier to revert these settings. Closes: #31
1 parent 57c9655 commit 4e8eb4a

File tree

2 files changed

+65
-21
lines changed

2 files changed

+65
-21
lines changed

src/globe/layers/coremap.ts

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,6 @@ import ThreeGlobe from "three-globe";
33
import { Settings, SettingsChangedEvent } from "../../settings";
44
import { GlobeLayerAttachHook, GlobeLayerSettingsHook } from "../layer";
55

6-
const COUNTRIES_GEOJSON_URL =
7-
import.meta.env.VITE_COUNTRIES_GEOJSON_URL || "assets/data/countries.geojson";
8-
const GLOBE_MAP_URL_DARK =
9-
import.meta.env.VITE_GLOBE_MAP_URL_DARK || "assets/img/earth-night.jpg";
10-
const GLOBE_MAP_URL_LIGHT =
11-
import.meta.env.VITE_GLOBE_MAP_URL_LIGHT || "assets/img/earth-day.jpg";
12-
const GLOBE_BUMP_MAP_URL =
13-
import.meta.env.VITE_GLOBE_BUMP_MAP_URL || "assets/img/earth-topology.png";
14-
156
const ATMOSPHERE_COLOR_DARK = "lightskyblue";
167
const ATMOSPHERE_SIZE_DARK = 0.25;
178
const ATMOSPHERE_COLOR_LIGHT = "blue";
@@ -54,31 +45,31 @@ export class CoreMapLayer
5445
): void {
5546
this.globe = globe;
5647
globe
57-
.globeImageUrl(GLOBE_MAP_URL_DARK)
58-
.bumpImageUrl(GLOBE_BUMP_MAP_URL)
5948
.atmosphereColor(ATMOSPHERE_COLOR_DARK)
6049
.atmosphereAltitude(ATMOSPHERE_SIZE_DARK)
6150
.polygonAltitude(0.005)
6251
.polygonCapMaterial(COUNTRY_BORDERS_MATERIAL)
6352
.polygonSideMaterial(COUNTRY_BORDERS_MATERIAL)
6453
.polygonStrokeColor(() => BORDER_COLOR_DARK);
65-
66-
fetch(COUNTRIES_GEOJSON_URL)
67-
.then((res) => res.json())
68-
.then((countries) => {
69-
this.bordersData = countries.features;
70-
this.updateCountryBorders(this.settings?.enableCountryBorders ?? true);
71-
});
7254
}
7355

7456
attachToSettings(settings: Settings): void {
7557
this.settings = settings;
7658
this.updateColorScheme(settings);
7759
this.globe?.showAtmosphere(settings.enableAtmosphere);
7860
this.globe?.showGraticules(settings.enableGraticules);
61+
this.globe?.bumpImageUrl(settings.globeBumpMapUrl);
62+
this.globe?.globeImageUrl(settings.globeMapUrl);
7963
this.updateCountryBorders(settings.enableCountryBorders);
8064
this.updateCountryBordersType(settings.simpleCountryBorders);
8165

66+
fetch(settings.countriesGeoJsonUrl)
67+
.then((res) => res.json())
68+
.then((countries) => {
69+
this.bordersData = countries.features;
70+
this.updateCountryBorders(this.settings?.enableCountryBorders ?? true);
71+
});
72+
8273
settings.addChangedListener((event: CustomEvent<SettingsChangedEvent>) => {
8374
if (event.detail.field_changed == "lightMode") {
8475
this.updateColorScheme(settings);
@@ -90,20 +81,31 @@ export class CoreMapLayer
9081
this.updateCountryBorders(settings.enableCountryBorders);
9182
} else if (event.detail.field_changed == "simpleCountryBorders") {
9283
this.updateCountryBordersType(settings.simpleCountryBorders);
84+
} else if (event.detail.field_changed == "globeMapUrl") {
85+
this.globe?.globeImageUrl(settings.globeMapUrl);
86+
} else if (event.detail.field_changed == "globeBumpMapUrl") {
87+
this.globe?.bumpImageUrl(settings.globeBumpMapUrl);
88+
} else if (event.detail.field_changed == "countriesGeoJsonUrl") {
89+
fetch(settings.countriesGeoJsonUrl)
90+
.then((res) => res.json())
91+
.then((countries) => {
92+
this.bordersData = countries.features;
93+
this.updateCountryBorders(
94+
this.settings?.enableCountryBorders ?? true,
95+
);
96+
});
9397
}
9498
});
9599
}
96100

97101
private updateColorScheme(settings: Settings) {
98102
if (settings.lightMode) {
99103
this.globe
100-
?.globeImageUrl(GLOBE_MAP_URL_LIGHT)
101104
?.atmosphereColor(ATMOSPHERE_COLOR_LIGHT)
102105
?.atmosphereAltitude(ATMOSPHERE_SIZE_LIGHT)
103106
?.polygonStrokeColor(() => BORDER_COLOR_LIGHT);
104107
} else {
105108
this.globe
106-
?.globeImageUrl(GLOBE_MAP_URL_DARK)
107109
?.atmosphereColor(ATMOSPHERE_COLOR_DARK)
108110
?.atmosphereAltitude(ATMOSPHERE_SIZE_DARK)
109111
?.polygonStrokeColor(() => BORDER_COLOR_DARK);

src/settings/index.ts

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,15 @@ import { ServiceState } from "../service/state";
66
const DEFAULT_DARK_BG = "#000000";
77
const DEFAULT_LIGHT_BG = "#FFFFFF";
88

9+
const GLOBE_MAP_URL_DARK =
10+
import.meta.env.VITE_GLOBE_MAP_URL_DARK || "assets/img/earth-night.jpg";
11+
const GLOBE_MAP_URL_LIGHT =
12+
import.meta.env.VITE_GLOBE_MAP_URL_LIGHT || "assets/img/earth-day.jpg";
13+
const GLOBE_BUMP_MAP_URL =
14+
import.meta.env.VITE_GLOBE_BUMP_MAP_URL || "assets/img/earth-topology.png";
15+
const COUNTRIES_GEOJSON_URL =
16+
import.meta.env.VITE_COUNTRIES_GEOJSON_URL || "assets/data/countries.geojson";
17+
918
/**
1019
* UI elements related to settings
1120
*/
@@ -187,11 +196,25 @@ export class Settings extends EventTarget {
187196
} else if (settings.bgColor == DEFAULT_LIGHT_BG && newValue == false) {
188197
settings.bgColor = DEFAULT_DARK_BG;
189198
}
199+
if (settings.globeMapUrl == GLOBE_MAP_URL_DARK && newValue == true) {
200+
settings.globeMapUrl = GLOBE_MAP_URL_LIGHT;
201+
} else if (
202+
settings.globeMapUrl == GLOBE_MAP_URL_LIGHT &&
203+
newValue == false
204+
) {
205+
settings.globeMapUrl = GLOBE_MAP_URL_DARK;
206+
}
190207
return newValue;
191208
})
192209
accessor lightMode: boolean = false;
193210
@SettingsField()
194-
accessor bgColor: string = "#000000";
211+
accessor bgColor: string = DEFAULT_DARK_BG;
212+
@SettingsField()
213+
accessor globeMapUrl: string = GLOBE_MAP_URL_DARK;
214+
@SettingsField()
215+
accessor globeBumpMapUrl: string = GLOBE_BUMP_MAP_URL;
216+
@SettingsField()
217+
accessor countriesGeoJsonUrl: string = COUNTRIES_GEOJSON_URL;
195218

196219
@SettingsField()
197220
accessor enableSettingsDialog: boolean = true;
@@ -482,6 +505,9 @@ export function setupSettingsDialog(
482505
["#counterstitle", "string", "countersTitle"],
483506
["#counterslabel", "string", "countersLabel"],
484507
["#bgcolor", "string", "bgColor"],
508+
["#globemapurl", "string", "globeMapUrl"],
509+
["#globebumpmapurl", "string", "globeBumpMapUrl"],
510+
["#countriesgeojsonurl", "string", "countriesGeoJsonUrl"],
485511
["#maxscale", "number", "maximumScale"],
486512
["#maxscalecounter", "number", "maximumScaleCounter"],
487513
["#timezone", "selectstring", "timeZone"],
@@ -848,6 +874,22 @@ function renderDialog(dialogContainer: HTMLElement) {
848874
<input type="checkbox" id="lightmode" name="lightmode" />
849875
<label for="bgcolor">Background color:</label>
850876
<input type="color" id="bgcolor" name="bgcolor" value="#000000" />
877+
<label for="globemapurl">Globe map url:</label>
878+
<input type="text" id="globemapurl" name="globemapurl" list="mapurls"/>
879+
<datalist id="mapurls">
880+
<option value="${GLOBE_MAP_URL_DARK}">Default dark</option>
881+
<option value="${GLOBE_MAP_URL_LIGHT}">Default light</option>
882+
</datalist>
883+
<label for="globebumpmapurl">Globe bump map url:</label>
884+
<input type="text" id="globebumpmapurl" name="globebumpmapurl" list="bumpmapurls"/>
885+
<datalist id="bumpmapurls">
886+
<option value="${GLOBE_BUMP_MAP_URL}">Default</option>
887+
</datalist>
888+
<label for="countriesgeojsonurl">Countries borders GeoJSON url:</label>
889+
<input type="text" id="countriesgeojsonurl" name="countriesgeojsonurl" list="countriesurls"/>
890+
<datalist id="countriesurls">
891+
<option value="${COUNTRIES_GEOJSON_URL}">Default</option>
892+
</datalist>
851893
<label for="showwebsocketui">Show websocket connection UI:</label>
852894
<input type="checkbox" id="showwebsocketui" name="showwebsocketui" />
853895
<label for="showwsstatus">Show websocket status:</label>

0 commit comments

Comments
 (0)