(loadFrom "nat-archive-tool" "src/nat/Lib.kiss") (prop :Map sprites (new Map)) // TODO this can also handle text sprites, and instead of saving out the text bitmap, // just make the FlxText every time at runtime -- so PinNextImage won't be needed // when the media tag is added (defNew [&prop :PlayState playState &prop :ArchiveController controller] (super playState ->[archive e] ?(or (hasComponent e Name) (hasComponent e Circle)) ->[archive e pos &opt ui] (unless (sprites.exists e.id) (let [sprite (new EntrySprite this _playgroundKey pos archive e controller)] (playState.entryGroup.add sprite) (dictSet sprites e.id sprite))) ->[archive e pos e2 pos2 &opt ui] (let [o .origin (dictGet sprites e.id) o2 .origin (dictGet sprites e2.id)] (playState.debugLayer.drawLine (+ pos.x o.x) (+ pos.y o.y) (+ pos2.x o2.x) (+ pos2.y o2.y) FlxColor.LIME)) ->[archive e &opt ui] { (whenLet [sprite (dictGet sprites e.id)] (sprite.kill) (playState.entryGroup.remove sprite true) (sprites.remove e.id)) // When an Entry is hidden, we can bet the user doesn't want it selected anymore (controller.DeSelectEntry e) })) (method &override :Void clear [] (playState.debugLayer.clear) (sprites.clear) (playState.entryGroup.kill) (playState.entryGroup.clear) (playState.entryGroup.revive) (controller.SelectEntries [])) (method z [:Entry e] .z (dictGet (readComponent e Positions) _playgroundKey)) // override process to z-sort all sprites after making them (method &override :Void process [:Archive archive &opt :ArchiveUI ui] (super.process archive ui) (FlxG.camera.calculateScrollBounds playState.entryGroup PlayState.SCROLL_BOUND_MARGIN) (playState.entryGroup.sort ->[o s1 s2] (FlxSort.byValues o (z s1.e) (z s2.e)))) (method getSelectedSprites [] (filter (for e (controller.getSelectedEntries) (dictGet sprites e.id)))) (prop defaultSpacing 50) (prop &mut defaultY 0) (method &override :Position defaultPosition [_] (+= defaultY defaultSpacing) (object x 0 y defaultY z 0.0))