-
Notifications
You must be signed in to change notification settings - Fork 394
Expand file tree
/
Copy pathBaseMapsModel.ts
More file actions
155 lines (139 loc) · 4.74 KB
/
BaseMapsModel.ts
File metadata and controls
155 lines (139 loc) · 4.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
import { action, computed, makeObservable } from "mobx";
import DeveloperError from "terriajs-cesium/Source/Core/DeveloperError";
import { JsonObject, isJsonObject } from "../../Core/Json";
import Result from "../../Core/Result";
import TerriaError from "../../Core/TerriaError";
import isDefined from "../../Core/isDefined";
import MappableMixin from "../../ModelMixins/MappableMixin";
import ModelReference from "../../Traits/ModelReference";
import {
BaseMapTraits,
BaseMapsTraits
} from "../../Traits/TraitsClasses/BaseMapTraits";
import BingMapsCatalogItem from "../Catalog/CatalogItems/BingMapsCatalogItem";
import CommonStrata from "../Definition/CommonStrata";
import CreateModel from "../Definition/CreateModel";
import { BaseModel, ModelConstructorParameters } from "../Definition/Model";
import ModelPropertiesFromTraits from "../Definition/ModelPropertiesFromTraits";
import updateModelFromJson from "../Definition/updateModelFromJson";
import Terria from "../Terria";
import { defaultBaseMaps } from "./defaultBaseMaps";
export class BaseMapModel extends CreateModel(BaseMapTraits) {}
export type BaseMapJson = Partial<
Omit<ModelPropertiesFromTraits<BaseMapTraits>, "item"> & {
item: JsonObject | string;
}
>;
export type BaseMapsJson = Partial<
Omit<ModelPropertiesFromTraits<BaseMapsTraits>, "items"> & {
items: BaseMapJson[];
}
>;
export interface BaseMapItem {
image?: string;
contrastColor?: string;
backgroundColor?: string;
item: MappableMixin.Instance;
}
export class BaseMapsModel extends CreateModel(BaseMapsTraits) {
constructor(...args: ModelConstructorParameters) {
super(...args);
makeObservable(this);
}
/**
* List of the basemaps to show in setting panel
*/
@computed
get baseMapItems(): BaseMapItem[] {
const enabledBaseMaps: BaseMapItem[] = [];
const baseMapItems =
this.enabledBaseMaps
?.map((enabledBaseMapId) => {
return this.items.find((item) => item.item === enabledBaseMapId);
})
.filter(isDefined) ?? this.items;
baseMapItems.forEach((baseMapItem) => {
if (baseMapItem.item && !ModelReference.isRemoved(baseMapItem.item)) {
const itemModel = this.terria.getModelById(BaseModel, baseMapItem.item);
if (MappableMixin.isMixedInto(itemModel)) {
enabledBaseMaps.push({
image: baseMapItem.image,
contrastColor: baseMapItem.contrastColor,
backgroundColor: baseMapItem.backgroundColor,
item: itemModel
});
}
}
});
return enabledBaseMaps;
}
// Can't do this in constructor since {@link CatalogMemberFactory} doesn't
// have any values at the moment of initializing Terria class.
initializeDefaultBaseMaps(): Result {
return this.loadFromJson(CommonStrata.definition, {
items: defaultBaseMaps(this.terria)
});
}
@action
private add(stratumId: string, baseMap: BaseMapModel) {
if (baseMap.item === undefined) {
throw new DeveloperError(
"A model without a `uniqueId` cannot be added to a group."
);
}
const resolvedItem = this.terria.getModelById(
BaseModel,
baseMap.item as any
);
if (resolvedItem instanceof BingMapsCatalogItem) {
addBingMapsKey(resolvedItem, this.terria);
}
const items = this.getTrait(stratumId, "items");
if (isDefined(items)) {
items.push(baseMap);
} else {
this.setTrait(stratumId, "items", [baseMap]);
}
}
@action
loadFromJson(stratumId: CommonStrata, newBaseMaps: BaseMapsJson): Result {
const errors: TerriaError[] = [];
const { items, ...rest } = newBaseMaps;
if (items !== undefined) {
const { items: itemsTrait } = this.traits;
const newItemsIds = itemsTrait.fromJson(this, stratumId, items);
newItemsIds
.pushErrorTo(errors)
?.forEach((member: BaseMapModel, i: number) => {
const existingItem = this.items.find(
(baseMap) => baseMap.item === member.item
);
if (existingItem) {
// object array trait doesn't automatically update model item
updateModelFromJson(existingItem, stratumId, items[i]);
} else {
this.add(stratumId, member);
}
});
}
if (isJsonObject(rest))
updateModelFromJson(this, stratumId, rest).pushErrorTo(errors);
else errors.push(TerriaError.from("Invalid JSON object"));
return new Result(
undefined,
TerriaError.combine(
errors,
`Failed to add members from JSON for model \`${this.uniqueId}\``
)
);
}
}
function addBingMapsKey(item: BingMapsCatalogItem, terria: Terria) {
if (!item.key) {
item.setTrait(
CommonStrata.defaults,
"key",
terria.configParameters.bingMapsKey
);
}
}