/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 . ĠJetBrains Ġs . r . o . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠMIT Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġjet brains . liv emap . core . input Ċ Ċ import Ġjet brains . liv emap . core . ecs . Abstract System Ċ import Ġjet brains . liv emap . core . ecs . E cs Component Manager Ċ import Ġjet brains . liv emap . core . ecs . E cs Context Ċ import Ġjet brains . liv emap . core . ecs . E cs Entity Ċ import Ġjet brains . liv emap . core . rendering . layers . Canvas Layer Ċ import Ġjet brains . liv emap . core . rendering . layers . Canvas Layer Component Ċ import Ġjet brains . liv emap . core . rendering . layers . Layers Order Component Ċ import Ġjet brains . liv emap . core . rendering . layers . Parent Layer Component Ċ import Ġjet brains . liv emap . map engine . camera . Camera Component Ċ Ċ class ĠMouse Input Detection System ( component Manager : ĠE cs Component Manager ) Ġ: ĠAbstract System < E cs Context >( component Manager ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġmy Interactive Entity View : ĠInteractive Entity View Ġ= ĠInteractive Entity View () ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Impl ( context : ĠE cs Context , Ġdt : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġentities By EventType And Z Index Ġ= ĠHashMap < Mouse EventType , ĠHashMap < Int , ĠArrayList < E cs Entity >> >() ĊĠĠĠĠĠĠĠ Ġval Ġcanvas Layers Ġ= Ġget Singleton < Layers Order Component >(). canvas Layers ĊĊĠĠĠĠĠĠĠ Ġget Entities ( COMPONENTS ). forEach Ġ{ Ġentity Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Interactive Entity View . set Entity ( entity ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMouse EventType . values (). forEach Ġ{ Ġtype Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( my Interactive Entity View . need ToAdd ( type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Interactive Entity View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentities By EventType And Z Index . get Or Put ( type , Ġ:: HashMap ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Z Index ( entity , Ġcanvas Layers ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( type Ġin ĠMouse EventType . values ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentities By Z Index Ġ= Ġentities By EventType And Z Index [ type ] Ġ?: Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġcanvas Layers . size Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentities By Z Index [ i ]?. let Ġ{ Ġaccept Listeners ( type , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġaccept Listeners ( eventType : ĠMouse EventType , Ġentities : ĠArrayList < E cs Entity >) Ġ{ ĊĠĠĠĠĠĠĠ Ġentities . forEach Ġ{ Ġentity Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġentity . getComponent < Mouse Input Component >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlisteners Ġ= Ġentity . getComponent < EventListener Component >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . getEvent ( eventType )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Stopped ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( listener Ġin Ġlisteners . get Listeners ( eventType )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Z Index ( entity : ĠE cs Entity , Ġcanvas Layers : ĠList < Canvas Layer >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( entity . contains < Camera Component >()) Ġ 0 Ġ// Ġif ĠUI ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcanvas Layer Ġ= Ġentity . component Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getEntity ById ( entity . get < Parent Layer Component >(). layer Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get < Canvas Layer Component >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. canvas Layer ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas Layers . indexOf ( canvas Layer ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠInteractive Entity View Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġmy Input : ĠMouse Input Component ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġmy Clickable : ĠClick able Component ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġmy Listeners : ĠEvent Listener Component ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġmy Entity : ĠE cs Entity ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġset Entity ( entity : ĠE cs Entity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Entity Ġ= Ġentity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Input Ġ= Ġentity . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Clickable Ġ= Ġentity . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Listeners Ġ= Ġentity . get () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġneed ToAdd ( type : ĠMouse EventType ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmy Input ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getEvent ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġmy Listeners . contains ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġmy Clickable . rect . contains ( it . location . toDouble Vector ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠaddTo ( map : ĠHashMap < Int , ĠArrayList < E cs Entity >>, Ġz Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap . get Or Put ( z Index , Ġ{ ĠArrayList () Ġ}). add ( my Entity ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠCOMPONENT S Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMouse Input Component :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClick able Component :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEvent Listener Component :: class ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ }