Move EntryRep/id tracking to PlaygroundSystem

This commit is contained in:
2023-02-13 05:15:22 -07:00
parent 7d7fa70d03
commit 3dd221e32e
10 changed files with 50 additions and 44 deletions

View File

@@ -280,7 +280,7 @@
(method getSelectedEntries [] (method getSelectedEntries []
(_selectedEntries.copy)) (_selectedEntries.copy))
(prop &mut :PlaygroundSystem playgroundSystem null) (prop &mut :PlaygroundSystem<Dynamic> playgroundSystem null)
(defNew [&prop :Archive archive (defNew [&prop :Archive archive
&prop :ArchiveUI ui] &prop :ArchiveUI ui]

View File

@@ -24,7 +24,7 @@ interface ArchiveUI {
/** /**
* A PlaygroundSystem that will display interactible entry representations * A PlaygroundSystem that will display interactible entry representations
*/ */
function playgroundSystem():Null<PlaygroundSystem>; function playgroundSystem():Null<PlaygroundSystem<Dynamic>>;
/** /**
* Prompt the user to enter text * Prompt the user to enter text

View File

@@ -117,4 +117,4 @@
(method :Void hidePrefixMap []) (method :Void hidePrefixMap [])
(method :PlaygroundSystem playgroundSystem [] null) (method :PlaygroundSystem<String> playgroundSystem [] null)

View File

@@ -15,4 +15,4 @@ typedef PlaygroundConnectionProcessor = (Archive, Entry, Position, Entry, Positi
* (EntrySpriteSystem, for example) * (EntrySpriteSystem, for example)
*/ */
@:build(kiss.Kiss.build()) @:build(kiss.Kiss.build())
class PlaygroundSystem extends System {} class PlaygroundSystem<EntryRep> extends System {}

View File

@@ -6,12 +6,20 @@
(prop :Map<String,TagList> playgroundDefaultTags (new Map)) (prop :Map<String,TagList> playgroundDefaultTags (new Map))
(prop :Map<String,ColorF> playgroundBGColors (new Map)) (prop :Map<String,ColorF> playgroundBGColors (new Map))
(prop :Map<String,EntryRep> entryReps (new Map))
(defNew [&prop :ArchiveUI ui (defNew [&prop :ArchiveUI ui
&prop :ArchiveController controller
:EntryChecker canProcess :EntryChecker canProcess
&prop :PlaygroundEntryProcessor processor &prop :PlaygroundEntryProcessor createEntryRep
&prop :PlaygroundConnectionProcessor connectionProcessor &prop :PlaygroundConnectionProcessor connectionProcessor
:EntryProcessor onRemoveEntry] :EntryProcessor onRemoveEntry]
[:PlaygroundEntryProcessor processor
->[archive e pos &opt ui]
(unless (entryReps.exists e.id)
(let [eRep (createEntryRep archive e pos ui)]
(dictSet entryReps e.id eRep)))]
(super (super
->[archive e] ->[archive e]
@@ -37,7 +45,11 @@
(dictSet positions _playgroundKey (defaultPosition e)))) (dictSet positions _playgroundKey (defaultPosition e))))
(let [pos (dictGet (readComponent e Positions) _playgroundKey)] (let [pos (dictGet (readComponent e Positions) _playgroundKey)]
(processor archive e pos ui))))) (processor archive e pos ui)))))
(set this.onRemoveEntry onRemoveEntry)) (set this.onRemoveEntry
->[archive e &opt ui] {
(onRemoveEntry archive e ui)
(entryReps.remove e.id)
}))
(method switchPlaygroundKey [key] (method switchPlaygroundKey [key]
(set _playgroundKey key) (set _playgroundKey key)
@@ -75,6 +87,9 @@
(method defaultPosition [:Entry e] (method defaultPosition [:Entry e]
(object x 0.0 y 0.0 z 0.0)) (object x 0.0 y 0.0 z 0.0))
(method getSelectedReps []
(filter (for e (controller.getSelectedEntries) (dictGet entryReps e.id))))
// TODO overridable circleContainsEntry function (default is to check only the position, Flixel version will use scaled sprite bounding box) // TODO overridable circleContainsEntry function (default is to check only the position, Flixel version will use scaled sprite bounding box)
// TODO when a circle contains an entry in the current playground, add it as a child // TODO when a circle contains an entry in the current playground, add it as a child

View File

@@ -52,7 +52,7 @@ class DummyUI implements ArchiveUI {
public function choosePosition(prompt:String, resolve:Position->Void) { public function choosePosition(prompt:String, resolve:Position->Void) {
resolve({x: 0, y: 0, z: 0}); resolve({x: 0, y: 0, z: 0});
} }
public function playgroundSystem():Null<PlaygroundSystem> { public function playgroundSystem():Null<PlaygroundSystem<Dynamic>> {
return null; return null;
} }
public var shortcutHandler:Null<KeyShortcutHandler<Entry>> = null; public var shortcutHandler:Null<KeyShortcutHandler<Entry>> = null;

View File

@@ -65,7 +65,7 @@
(enableMouseDrag false (hasComponent e Circle)) (enableMouseDrag false (hasComponent e Circle))
(set mouseStartDragCallback (set mouseStartDragCallback
->[self _dx _dy] ->[self _dx _dy]
(doFor sprite (system.getSelectedSprites) (doFor sprite (system.getSelectedReps)
(unless (= sprite.e.id this.e.id) (unless (= sprite.e.id this.e.id)
(sprite.fixToSprite this)))) (sprite.fixToSprite this))))
@@ -73,7 +73,7 @@
->[self _dx _dy] ->[self _dx _dy]
{ {
(savePos) (savePos)
(doFor sprite (system.getSelectedSprites) (doFor sprite (system.getSelectedReps)
(unless (= sprite.e.id this.e.id) (unless (= sprite.e.id this.e.id)
(sprite.endFixToSprite))) (sprite.endFixToSprite)))
})) }))

View File

@@ -14,4 +14,4 @@ import nat.systems.PlaygroundSystem;
import flixel.util.FlxSort; import flixel.util.FlxSort;
@:build(kiss.Kiss.build()) @:build(kiss.Kiss.build())
class EntrySpriteSystem extends PlaygroundSystem {} class EntrySpriteSystem extends PlaygroundSystem<EntrySprite> {}

View File

@@ -1,48 +1,41 @@
(loadFrom "nat-archive-tool" "src/nat/Lib.kiss") (loadFrom "nat-archive-tool" "src/nat/Lib.kiss")
(prop :Map<String,EntrySprite> 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 (defNew [&prop :PlayState playState
&prop :ArchiveController controller] :ArchiveController controller]
(super (super
playState playState
controller
->[archive e] ->[archive e]
?(or (hasComponent e Name) (hasComponent e Circle) (hasComponent e Rectangle)) ?(or (hasComponent e Name) (hasComponent e Circle) (hasComponent e Rectangle))
->[archive e pos &opt ui] ->[archive e pos &opt ui]
(unless (sprites.exists e.id) (let [sprite (new EntrySprite this _playgroundKey pos archive e controller)]
(let [sprite (new EntrySprite this _playgroundKey pos archive e controller)] (set sprite.cameras [FlxG.camera])
(set sprite.cameras [FlxG.camera]) (sprite.enableDragToSelect
(sprite.enableDragToSelect ->:Void {
->:Void { (controller.AddSelectEntry e)
(controller.AddSelectEntry e) (sprite.updateColor)
(sprite.updateColor) }
} ->:Void {
->:Void { (controller.DeSelectEntry e)
(controller.DeSelectEntry e) (sprite.updateColor)
(sprite.updateColor) })
}) (playState.entryGroup.add sprite)
(playState.entryGroup.add sprite) sprite)
(dictSet sprites e.id sprite)))
->[archive e pos e2 pos2 &opt ui] ->[archive e pos e2 pos2 &opt ui]
(let [o .origin (dictGet sprites e.id) (let [o .origin (dictGet entryReps e.id)
o2 .origin (dictGet sprites e2.id)] o2 .origin (dictGet entryReps e2.id)]
(playState.debugLayer.drawLine (+ pos.x o.x) (+ pos.y o.y) (+ pos2.x o2.x) (+ pos2.y o2.y) FlxColor.LIME)) (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] ->[archive e &opt ui]
{ {
(whenLet [sprite (dictGet sprites e.id)] (whenLet [sprite (dictGet entryReps e.id)]
(sprite.kill) (sprite.kill)
(playState.entryGroup.remove sprite true) (playState.entryGroup.remove sprite true))
(sprites.remove e.id))
})) }))
(method &override :Void clear [:ColorF color] (method &override :Void clear [:ColorF color]
(set playState.bgColor (FlxColor.fromRGBFloat color.r color.g color.b color.a)) (set playState.bgColor (FlxColor.fromRGBFloat color.r color.g color.b color.a))
(playState.debugLayer.clear) (playState.debugLayer.clear)
(sprites.clear) (entryReps.clear)
(playState.entryGroup.kill) (playState.entryGroup.kill)
(playState.entryGroup.clear) (playState.entryGroup.clear)
(playState.entryGroup.revive)) (playState.entryGroup.revive))
@@ -56,9 +49,6 @@
(FlxG.camera.calculateScrollBounds playState.entryGroup PlayState.SCROLL_BOUND_MARGIN) (FlxG.camera.calculateScrollBounds playState.entryGroup PlayState.SCROLL_BOUND_MARGIN)
(playState.entryGroup.sort ->[o s1 s2] (FlxSort.byValues o (z s1.e) (z s2.e)))) (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 defaultSpacing 50)
(prop &mut defaultY 0) (prop &mut defaultY 0)
(method &override :Position defaultPosition [_] (method &override :Position defaultPosition [_]

View File

@@ -4,7 +4,7 @@
(prop &mut :EntrySpriteSystem spriteSystem) (prop &mut :EntrySpriteSystem spriteSystem)
(method :PlaygroundSystem playgroundSystem [] (method :PlaygroundSystem<EntrySprite> playgroundSystem []
(set spriteSystem (new EntrySpriteSystem this controller))) (set spriteSystem (new EntrySpriteSystem this controller)))
(prop :KeyShortcutHandler<Entry> shortcutHandler (new FlxKeyShortcutHandler<Entry>)) (prop :KeyShortcutHandler<Entry> shortcutHandler (new FlxKeyShortcutHandler<Entry>))
@@ -196,8 +196,9 @@
// by refreshEntry() // by refreshEntry()
(when (spriteSystem.entries.exists e.id) (when (spriteSystem.entries.exists e.id)
// refresh the sprites for entries that changed data but still should have sprites // refresh the sprites for entries that changed data but still should have sprites
(when (spriteSystem.sprites.exists e.id) (when (spriteSystem.entryReps.exists e.id)
(spriteSystem.onRemoveEntry archive e)) (spriteSystem.onRemoveEntry archive e)
(spriteSystem.entryReps.remove e.id))
(spriteSystem.processEntry archive e))) (spriteSystem.processEntry archive e)))
(FlxG.camera.calculateScrollBounds entryGroup SCROLL_BOUND_MARGIN)) (FlxG.camera.calculateScrollBounds entryGroup SCROLL_BOUND_MARGIN))
@@ -221,7 +222,7 @@
(method :Void onSelectionChanged [:Array<Entry> selectedEntries :Array<Entry> lastSelectedEntries] (method :Void onSelectionChanged [:Array<Entry> selectedEntries :Array<Entry> lastSelectedEntries]
(doFor e (selectedEntries.concat lastSelectedEntries) (doFor e (selectedEntries.concat lastSelectedEntries)
(whenLet [sprite (dictGet spriteSystem.sprites e.id)] (whenLet [sprite (dictGet spriteSystem.entryReps e.id)]
(sprite.updateColor)))) (sprite.updateColor))))
(prop &mut :Position->Void resolvePosition) (prop &mut :Position->Void resolvePosition)