thematic-earth
Version:
HTML-based, whole-Earth thematic maps using locally hosted data layers
2 lines • 2.67 kB
JavaScript
/* Copyright (c) 2023 Read Write Tools. Legal use subject to the Thematic Earth Software License Agreement. */
import expect from'../dev/expect.js';import StackTrace from'../dev/stack-trace.js';export default class Signal extends EventTarget{constructor(t){super(),expect(t,'ThematicEarthElement'),this.thematicEarthElement=t,this.hasSignalsPanel=!0,this.wantsMenu=!1,this.wantsUser=!1,this.wantsKeyboard=!1,this.wantsMouse=!1,this.wantsGesture=!1,this.wantsProjection=!1,this.wantsEarthPosition=!0,this.wantsLayers=!0,this.wantsOthers=!0,this.signalCounter=0,Object.seal(this)}broadcast(t,e){expect(t,'String'),expect(e,['Array','Object','String','Number','Boolean','Date','ProjectedPoint','null']),this.hasSignalsPanel&&this.logBroadcast(t,e);const a=new CustomEvent(t,{detail:e});this.dispatchEvent(a);var[s,r]=t.split('/',2);['package','catalog','visualization','greatCircles','user'].includes(s)&&this.thematicEarthElement.dispatchEvent(a)}listen(t,e){expect(t,'String'),expect(e,['Function','AsyncFunction']);var a=StackTrace.getInfo(3);this.addEventListener(t,(s=>{this.hasSignalsPanel&&this.logCallback(t,a),e(s.detail)}))}logBroadcast(t,e){var[a,s]=t.split('/',2);if(1==this.filter(a)){this.signalCounter++;var r=StackTrace.getInfo(4);this.broadcast('signal/broadcast',{origin:a,request:s,sti:r,signalCounter:this.signalCounter,data:e})}}logCallback(t,e){var[a,s]=t.split('/',2);1==this.filter(a)&&this.broadcast('signal/receive',{origin:a,request:s,sti:e,signalCounter:this.signalCounter})}filter(t){switch(t){case'signal':return!1;case'menu':return this.wantsMenu;case'user':return this.wantsUser;case'keyboard':return this.wantsKeyboard;case'mouse':return this.wantsMouse;case'gesture':return this.wantsGesture;case'carte':case'ortho':case'viewport':return this.wantsProjection;case'earthPosition':return this.wantsEarthPosition;case'catalog':case'legend':case'greatCircles':return this.wantsLayers;default:return this.wantsOthers}}static formatSignalsData(t){if(expect(t,['Array','Object','String','Number','Date','ProjectedPoint','null']),null==t)return'(null)';if(null==t)return'(undefined)';switch(t.constructor.name){case'Array':case'Object':let e=JSON.stringify(t,null,4);return e=e.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"').replace(/'/g,'''),`<details><summary>(JSON)</summary>${e}</details>`;case'String':return`${t} (String)`;case'Number':return`${t.toString()} (Number)`;case'Boolean':return`${t.toString()} (Boolean)`;case'Date':return`${t.toLocaleString()} (Date)`;case'ProjectedPoint':return`${t.latitude} / ${t.longitude} (ProjectedPoint)`;default:return`${t.toString()} ${t.constructor.name}`}}}