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 []
(_selectedEntries.copy))
(prop &mut :PlaygroundSystem playgroundSystem null)
(prop &mut :PlaygroundSystem<Dynamic> playgroundSystem null)
(defNew [&prop :Archive archive
&prop :ArchiveUI ui]

View File

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

View File

@@ -117,4 +117,4 @@
(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)
*/
@: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,ColorF> playgroundBGColors (new Map))
(prop :Map<String,EntryRep> entryReps (new Map))
(defNew [&prop :ArchiveUI ui
&prop :ArchiveController controller
:EntryChecker canProcess
&prop :PlaygroundEntryProcessor processor
&prop :PlaygroundEntryProcessor createEntryRep
&prop :PlaygroundConnectionProcessor connectionProcessor
: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
->[archive e]
@@ -37,7 +45,11 @@
(dictSet positions _playgroundKey (defaultPosition e))))
(let [pos (dictGet (readComponent e Positions) _playgroundKey)]
(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]
(set _playgroundKey key)
@@ -75,6 +87,9 @@
(method defaultPosition [:Entry e]
(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 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) {
resolve({x: 0, y: 0, z: 0});
}
public function playgroundSystem():Null<PlaygroundSystem> {
public function playgroundSystem():Null<PlaygroundSystem<Dynamic>> {
return null;
}
public var shortcutHandler:Null<KeyShortcutHandler<Entry>> = null;

View File

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

View File

@@ -14,4 +14,4 @@ import nat.systems.PlaygroundSystem;
import flixel.util.FlxSort;
@: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")
(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
&prop :ArchiveController controller]
:ArchiveController controller]
(super
playState
controller
->[archive e]
?(or (hasComponent e Name) (hasComponent e Circle) (hasComponent e Rectangle))
->[archive e pos &opt ui]
(unless (sprites.exists e.id)
(let [sprite (new EntrySprite this _playgroundKey pos archive e controller)]
(set sprite.cameras [FlxG.camera])
(sprite.enableDragToSelect
->:Void {
(controller.AddSelectEntry e)
(sprite.updateColor)
}
->:Void {
(controller.DeSelectEntry e)
(sprite.updateColor)
})
(playState.entryGroup.add sprite)
(dictSet sprites e.id sprite)))
(let [sprite (new EntrySprite this _playgroundKey pos archive e controller)]
(set sprite.cameras [FlxG.camera])
(sprite.enableDragToSelect
->:Void {
(controller.AddSelectEntry e)
(sprite.updateColor)
}
->:Void {
(controller.DeSelectEntry e)
(sprite.updateColor)
})
(playState.entryGroup.add sprite)
sprite)
->[archive e pos e2 pos2 &opt ui]
(let [o .origin (dictGet sprites e.id)
o2 .origin (dictGet sprites e2.id)]
(let [o .origin (dictGet entryReps e.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))
->[archive e &opt ui]
{
(whenLet [sprite (dictGet sprites e.id)]
(whenLet [sprite (dictGet entryReps e.id)]
(sprite.kill)
(playState.entryGroup.remove sprite true)
(sprites.remove e.id))
(playState.entryGroup.remove sprite true))
}))
(method &override :Void clear [:ColorF color]
(set playState.bgColor (FlxColor.fromRGBFloat color.r color.g color.b color.a))
(playState.debugLayer.clear)
(sprites.clear)
(entryReps.clear)
(playState.entryGroup.kill)
(playState.entryGroup.clear)
(playState.entryGroup.revive))
@@ -56,9 +49,6 @@
(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 [_]

View File

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