diff --git a/dot-to-dot b/dot-to-dot index ba4ff47..80fcfa4 100755 Binary files a/dot-to-dot and b/dot-to-dot differ diff --git a/dot-to-dot.mlb b/dot-to-dot.mlb index 89bb2e5..81ab1a7 100644 --- a/dot-to-dot.mlb +++ b/dot-to-dot.mlb @@ -10,8 +10,9 @@ in ffi/glfw-input.sml end +message-types/input-msg.sml + functional-core/app-type.sml -functional-core/msg.sml functional-core/app-update.sml ann diff --git a/functional-core/app-update.sml b/functional-core/app-update.sml index 365cecd..2f42ee4 100644 --- a/functional-core/app-update.sml +++ b/functional-core/app-update.sml @@ -1 +1,75 @@ -structure AppUpdate = struct end +structure AppUpdate = +struct + val clickPoints = + #[ 25 + , 50 + , 75 + , 100 + , 125 + , 150 + , 175 + , 200 + , 225 + , 250 + , 275 + , 300 + , 325 + , 350 + , 375 + , 400 + , 425 + , 450 + , 475 + ] + + local + fun getVerticalClickPos (idx, horizontalPos, mouseX, mouseY) = + if idx = Vector.length clickPoints then + #[] + else + let + val curVerticalPos = Vector.sub (clickPoints, idx) + in + if mouseY < curVerticalPos - 10 orelse mouseY > curVerticalPos + 10 then + getVerticalClickPos (idx + 1, horizontalPos, mouseX, mouseY) + else + let + val left = Real32.fromInt ((horizontalPos - 10) div 500) + val right = Real32.fromInt ((horizontalPos + 10) div 500) + val bottom = Real32.fromInt ((curVerticalPos - 10) div 500) + val top = Real32.fromInt ((curVerticalPos + 10) div 500) + in + val highlightSquare = #[ + left, bottom, (* lower left *) + right, bottom, (* lower right *) + left, top, (* upper left *) + + left, top, (* upper left *) + right, bottom, (* lower right *) + right, top (* upper right *) + ] + end + end + + fun getHorizontalClickPos (idx, mouseX, mouseY) = + if idx = Vector.length clickPoints then + #[] + else + let + val curPos = Vector.sub (clickPoints, idx) + in + if mouseX < curPos - 10 orelse mouseX > curPos + 10 then + getHorizontalClickPos (idx + 1, mouseX, mouseY) + else + getVerticalClickPos (0, curPos, mouseX, mouseY) + end + in + (* + * This function returns a vector containing the position data of the + * clicked square. + * If a square wasn't found at the clicked position, + * an empty vector is returned. + *) + fun getClickPos (mouseX, mouseY) = getHorizontalClickPos (0, mouseX, mouseY) + end +end diff --git a/imperative-shell/input-callbacks.sml b/imperative-shell/input-callbacks.sml index 99eb570..252560d 100644 --- a/imperative-shell/input-callbacks.sml +++ b/imperative-shell/input-callbacks.sml @@ -1,7 +1,7 @@ structure InputCallbacks = struct open CML - open Msg + open InputMessage fun mouseMoveCallback mailbox (x, y) = Mailbox.send (mailbox, (MOUSE_MOVE {x = x, y = y})) diff --git a/imperative-shell/shell.sml b/imperative-shell/shell.sml index 225fba3..2370f0e 100644 --- a/imperative-shell/shell.sml +++ b/imperative-shell/shell.sml @@ -4,7 +4,7 @@ struct fun callbackListener mailbox = let - open Msg + open InputMessage val _ = case Mailbox.recv mailbox of MOUSE_MOVE {x, y} => diff --git a/message-types/draw-msg.sml b/message-types/draw-msg.sml new file mode 100644 index 0000000..d6adc1e --- /dev/null +++ b/message-types/draw-msg.sml @@ -0,0 +1,9 @@ +signature DRAW_MESSAGE = +sig + +end + +structure DrawMessage :> DRAW_MESSAGE = +struct + +end diff --git a/functional-core/msg.sml b/message-types/input-msg.sml similarity index 75% rename from functional-core/msg.sml rename to message-types/input-msg.sml index 9eb30a7..d15c69f 100644 --- a/functional-core/msg.sml +++ b/message-types/input-msg.sml @@ -1,4 +1,4 @@ -signature MSG = +signature INPUT_MESSAGE = sig datatype t = MOUSE_MOVE of {x: int, y: int} @@ -6,7 +6,7 @@ sig | MOUSE_LEFT_RELEASE end -structure Msg :> MSG = +structure InputMessage :> INPUT_MESSAGE = struct datatype t = MOUSE_MOVE of {x: int, y: int}