From 50bdd31d59508a1a21330cd63aacf5d82dfd2741 Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Fri, 8 Aug 2025 23:56:24 +0100 Subject: [PATCH] progress with move mode --- dotscape | Bin 1051496 -> 1051496 bytes fcore/move-mode.sml | 87 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 83 insertions(+), 4 deletions(-) diff --git a/dotscape b/dotscape index 51dcc573545cacfb515b4c299219b8abc7a1f9e3..8bb81c58a05f4959d7eaa5be7c4a725ba4a079ea 100755 GIT binary patch delta 11375 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 c#v}G0=P$J6sMV(B4Ugs8 {r = 0, g = 0, b = 0, a = 0}) + fun getDrawMsg (model: app_type) = + let + val + { canvasWidth + , canvasHeight + , windowWidth + , windowHeight + , squares + , xClickPoints + , yClickPoints + , ... + } = model + + val maxSide = Int.max (canvasWidth, canvasHeight) + val squares = CollisionTree.toTriangles + ( windowWidth + , windowHeight + , squares + , maxSide + , canvasWidth + , canvasHeight + , xClickPoints + , yClickPoints + ) + val drawMsg = + DRAW_SQUARES_AND_DOTS {squares = squares, dots = Vector.fromList []} + in + (model, [DRAW drawMsg]) + end + fun moveImageUp (model: app_type) = let val {squares, ...} = model @@ -20,16 +54,61 @@ struct val model = AppWith.squares (model, squares) in - (model, []) + getDrawMsg model + end + + fun moveImageDown (model: app_type) = + let + val {squares, ...} = model + + val squares = + Vector.mapi + (fn (idx, yAxis) => + if idx = 0 then makeBlankYAxis (Vector.length yAxis) + else Vector.sub (squares, idx - 1)) squares + + val model = AppWith.squares (model, squares) + in + getDrawMsg model + end + + fun moveImageLeft (model: app_type) = + let + val {squares, ...} = model + + val squares = + Vector.mapi + (fn (idx, yAxis) => + if idx = 0 then makeBlankYAxis (Vector.length squares) + else Vector.sub (squares, idx - 1)) squares + + val model = AppWith.squares (model, squares) + in + getDrawMsg model + end + + fun moveImageRight (model: app_type) = + let + val {squares, ...} = model + + val squares = + Vector.mapi + (fn (idx, yAxis) => + if idx + 1 = Vector.length squares then + makeBlankYAxis (Vector.length squares) + else + Vector.sub (squares, idx + 1)) squares + + val model = AppWith.squares (model, squares) + in + getDrawMsg model end fun update (model, inputMsg) = case inputMsg of ARROW_UP => moveImageUp model - (* + | ARROW_DOWN => moveImageDown model | ARROW_LEFT => moveImageLeft model | ARROW_RIGHT => moveImageRight model - | ARROW_DOWN => moveImageDown model - *) | _ => (model, []) end