ddd
This commit is contained in:
parent
0a343ecbc5
commit
c3a6f5ff37
80 changed files with 2512 additions and 1625 deletions
52
client/input/interaction-state.js
Normal file
52
client/input/interaction-state.js
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
(function(root,factory){
|
||||
const api=factory();
|
||||
if(typeof module==='object'&&module.exports)module.exports=api;
|
||||
root.BendInteractionState=api;
|
||||
})(typeof globalThis!=='undefined'?globalThis:this,function(){
|
||||
'use strict';
|
||||
|
||||
const DEFAULT_SCOPES=Object.freeze({
|
||||
any:Object.freeze(['camera','drawing','claim','wheel','reaction','minimap','dialog']),
|
||||
pointer:Object.freeze(['camera','drawing','claim','reaction','minimap']),
|
||||
camera:Object.freeze(['camera','wheel']),
|
||||
persistence:Object.freeze(['camera','drawing','claim','wheel','reaction','minimap']),
|
||||
world:Object.freeze(['camera','drawing','claim','wheel','reaction','minimap']),
|
||||
overview:Object.freeze(['camera','drawing','claim','wheel','reaction','minimap']),
|
||||
worker:Object.freeze(['drawing','claim'])
|
||||
});
|
||||
|
||||
function createInteractionState(scopeDefinitions=DEFAULT_SCOPES){
|
||||
const owners=new Map(),listeners=new Set(),scopes=new Map(
|
||||
Object.entries(scopeDefinitions).map(([name,kinds])=>[name,new Set(kinds)])
|
||||
);
|
||||
let revision=0;
|
||||
const snapshot=()=>Object.freeze({
|
||||
revision,
|
||||
activeKinds:Object.freeze([...owners.keys()]),
|
||||
owners:Object.freeze(Object.fromEntries(owners))
|
||||
});
|
||||
const notify=()=>{const state=snapshot();for(const listener of listeners)listener(state)};
|
||||
const set=(kind,owner)=>{
|
||||
const key=String(kind||'');if(!key)throw new TypeError('Interaction kind is required');
|
||||
const next=owner==null||owner===false?null:String(owner),previous=owners.get(key)||null;
|
||||
if(previous===next)return false;
|
||||
if(next==null)owners.delete(key);else owners.set(key,next);
|
||||
revision++;notify();return true;
|
||||
};
|
||||
const active=(scope='any')=>{
|
||||
const kinds=scopes.get(scope);if(!kinds)throw new TypeError(`Unknown interaction scope: ${scope}`);
|
||||
for(const kind of kinds)if(owners.has(kind))return true;
|
||||
return false;
|
||||
};
|
||||
return Object.freeze({
|
||||
set,
|
||||
clear:kind=>set(kind,null),
|
||||
owner:kind=>owners.get(String(kind||''))||null,
|
||||
active,
|
||||
snapshot,
|
||||
subscribe(listener){if(typeof listener!=='function')throw new TypeError('Listener must be a function');listeners.add(listener);return()=>listeners.delete(listener)}
|
||||
});
|
||||
}
|
||||
|
||||
return Object.freeze({DEFAULT_SCOPES,createInteractionState});
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue