mirror of
https://github.com/a-nyx/maputnik-with-pmtiles.git
synced 2024-12-27 08:25:24 +01:00
Work on immutable style
This commit is contained in:
parent
1d7294dc92
commit
d05d41c76a
1 changed files with 139 additions and 0 deletions
139
src/mapbox-gl/immutable.js
Normal file
139
src/mapbox-gl/immutable.js
Normal file
|
@ -0,0 +1,139 @@
|
|||
import Immutable from 'immutable'
|
||||
import spec from 'mapbox-gl-style-spec/reference/latest.min.js'
|
||||
|
||||
function memberDefaults(type) {
|
||||
const fields = {}
|
||||
for(let fieldName in type) {
|
||||
fields[fieldName] = immutableDefault(type[fieldName])
|
||||
}
|
||||
return fields
|
||||
}
|
||||
|
||||
function immutableDefault(obj) {
|
||||
if(obj.default) return obj.default
|
||||
|
||||
// Known spec defaults
|
||||
if(obj.type === "filter") return new Immutable.List()
|
||||
if(obj.type === "sources") return new Immutable.List()
|
||||
if(obj.type === "array" && obj.value === "layer") return new Immutable.OrderedMap()
|
||||
|
||||
// Deal with primitives
|
||||
if(obj.type === "boolean") return false
|
||||
if(obj.type === "string") return ""
|
||||
if(obj.type === "number") return 0
|
||||
if(obj.type === "enum") return obj.values[0]
|
||||
if(obj.type === "*") return new Immutable.Map()
|
||||
if(obj.type === "array") return new Immutable.List()
|
||||
|
||||
return new Immutable.Map()
|
||||
}
|
||||
|
||||
function TypeRecord(type) {
|
||||
return Immutable.Record(memberDefaults(spec[type]))
|
||||
}
|
||||
|
||||
export const SourceTile = TypeRecord("source_tile")
|
||||
export const SourceGeojson = TypeRecord("source_geojson")
|
||||
|
||||
export const LayoutBackground = TypeRecord("layout_background")
|
||||
export const LayoutFill = TypeRecord("layout_fill")
|
||||
export const LayoutCircle = TypeRecord("layout_circle")
|
||||
export const LayoutLine = TypeRecord("layout_line")
|
||||
export const LayoutSymbol = TypeRecord("layout_symbol")
|
||||
export const LayoutRaster = TypeRecord("layout_raster")
|
||||
|
||||
export const PaintBackground = TypeRecord("paint_background")
|
||||
export const PaintFill = TypeRecord("paint_fill")
|
||||
export const PaintCircle = TypeRecord("paint_circle")
|
||||
export const PaintLine = TypeRecord("paint_line")
|
||||
export const PaintSymbol = TypeRecord("paint_symbol")
|
||||
export const PaintRaster = TypeRecord("paint_raster")
|
||||
|
||||
export const MapboxGlStyle = Immutable.Record({
|
||||
...memberDefaults(spec['$root']),
|
||||
id: Math.random().toString(36).substr(2, 9),
|
||||
created: new Date().toJSON()
|
||||
})
|
||||
|
||||
//TODO: Ugly?
|
||||
function LayerRecord(layerType) {
|
||||
const defaults = memberDefaults(spec["layer"])
|
||||
defaults["type"] = layerType
|
||||
|
||||
if(layerType === "fill") {
|
||||
defaults["layout"] = new LayoutFill
|
||||
defaults["paint"] = new PaintFill()
|
||||
} if(layerType === "line") {
|
||||
defaults["layout"] = new LayoutLine()
|
||||
defaults["paint"] = new PaintLine()
|
||||
} if(layerType === "symbol") {
|
||||
defaults["layout"] = new LayoutSymbol()
|
||||
defaults["paint"] = new PaintSymbol()
|
||||
} if(layerType === "circle") {
|
||||
defaults["layout"] = new LayoutCircle()
|
||||
defaults["paint"] = new PaintCircle()
|
||||
} if(layerType === "raster") {
|
||||
defaults["layout"] = new LayoutRaster()
|
||||
defaults["paint"] = new PaintRaster()
|
||||
} else if(layerType === "background") {
|
||||
defaults["layout"] = new LayoutBackground()
|
||||
defaults["paint"] = new PaintBackground()
|
||||
}
|
||||
|
||||
return Immutable.Record(defaults)
|
||||
}
|
||||
|
||||
// Each layer type has default layout and paint
|
||||
export const FillLayer = LayerRecord("fill")
|
||||
export const LineLayer = LayerRecord("line")
|
||||
export const SymbolLayer = LayerRecord("symbol")
|
||||
export const CircleLayer = LayerRecord("circle")
|
||||
export const RasterLayer = LayerRecord("raster")
|
||||
export const BackgroundLayer = LayerRecord("background")
|
||||
|
||||
function createLayer(type) {
|
||||
switch(type) {
|
||||
case "fill":
|
||||
return new FillLayer()
|
||||
case "line":
|
||||
return new LineLayer()
|
||||
case "symbol":
|
||||
return new SymbolLayer()
|
||||
case "circle":
|
||||
return new CircleLayer()
|
||||
case "raster":
|
||||
return new RasterLayer()
|
||||
case "background":
|
||||
return new BackgroundLayer()
|
||||
default:
|
||||
throw "No Layer with type " + type + " exists"
|
||||
}
|
||||
}
|
||||
|
||||
// Turn a Mapbox GL style JSON into an immutable MapboxGlStyle
|
||||
export function fromJSON(jsonStyle) {
|
||||
let record = new MapboxGlStyle()
|
||||
|
||||
for (let key in jsonStyle) {
|
||||
if(key === "layers") {
|
||||
record = record.set(key, Immutable.OrderedMap(jsonStyle[key].map(layer => {
|
||||
let layerRecord = createLayer(layer.type)
|
||||
|
||||
for (let key in layer) {
|
||||
layerRecord = layerRecord.set(key, layer[key])
|
||||
}
|
||||
|
||||
return [layer.id, layerRecord]
|
||||
})))
|
||||
} else {
|
||||
record = record.set(key, jsonStyle[key])
|
||||
}
|
||||
}
|
||||
|
||||
return record
|
||||
}
|
||||
|
||||
// Turn the immutable MapboxGlStyle into a Mapbox GL style JSON
|
||||
export function toJSON() {
|
||||
|
||||
}
|
Loading…
Reference in a new issue