diff --git a/dotscape b/dotscape index 8bb81c5..9b3ba00 100755 Binary files a/dotscape and b/dotscape differ diff --git a/fcore/move-mode.sml b/fcore/move-mode.sml index 6912914..efc7aa6 100644 --- a/fcore/move-mode.sml +++ b/fcore/move-mode.sml @@ -7,9 +7,6 @@ struct (* todo: resize message, escape button to go back to normal mode *) - fun makeBlankYAxis length = - Vector.tabulate (length, fn _ => {r = 0, g = 0, b = 0, a = 0}) - fun getDrawMsg (model: app_type) = let val @@ -40,6 +37,9 @@ struct (model, [DRAW drawMsg]) end + fun makeBlankYAxis length = + Vector.tabulate (length, fn _ => {r = 0, g = 0, b = 0, a = 0}) + fun moveImageUp (model: app_type) = let val {squares, ...} = model @@ -79,8 +79,10 @@ struct val squares = Vector.mapi (fn (idx, yAxis) => - if idx = 0 then makeBlankYAxis (Vector.length squares) - else Vector.sub (squares, idx - 1)) squares + 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 @@ -94,21 +96,25 @@ struct 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 + 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 enterNormalMode model = + let val model = AppWith.mode (model, AppType.NORMAL_MODE) + in (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 + | KEY_ESC => enterNormalMode model | _ => (model, []) end diff --git a/fcore/normal-mode.sml b/fcore/normal-mode.sml index 40a2a0f..19bcb35 100644 --- a/fcore/normal-mode.sml +++ b/fcore/normal-mode.sml @@ -336,6 +336,11 @@ struct (model, fileMsg) end + fun enterMoveMode model = + let val model = AppWith.mode (model, AppType.MOVE_MODE) + in (model, []) + end + fun handleFileBrowserAndPathInNormalMode (model, fileBrowser, path) = let val model = AppWith.fileBrowserAndPath (model, fileBrowser, path) in (model, []) @@ -356,6 +361,7 @@ struct | KEY_A => updateAlpha model | KEY_W => updateCanvasWidth model | KEY_H => updateCanvasHeight model + | KEY_M => enterMoveMode model | RESIZE_WINDOW {width, height} => resizeWindow (model, width, height) | UNDO_ACTION => undoAction model | REDO_ACTION => redoAction model @@ -377,4 +383,5 @@ struct | KEY_SPACE => enterOrSpaceCoordinates model | FILE_BROWSER_AND_PATH {fileBrowser, path} => handleFileBrowserAndPathInNormalMode (model, fileBrowser, path) + | KEY_ESC => (model, []) end diff --git a/ffi/glfw-input.c b/ffi/glfw-input.c index b95df23..2067117 100644 --- a/ffi/glfw-input.c +++ b/ffi/glfw-input.c @@ -23,6 +23,7 @@ int KEY_A = GLFW_KEY_A; int KEY_W = GLFW_KEY_W; int KEY_H = GLFW_KEY_H; int KEY_C = GLFW_KEY_C; +int KEY_M = GLFW_KEY_M; int KEY_ENTER = GLFW_KEY_ENTER; int KEY_SPACE = GLFW_KEY_SPACE; @@ -31,6 +32,7 @@ int KEY_LEFT = GLFW_KEY_LEFT; int KEY_RIGHT = GLFW_KEY_RIGHT; int KEY_DOWN = GLFW_KEY_DOWN; int KEY_BACKSPACE = GLFW_KEY_BACKSPACE; +int KEY_ESC = GLFW_KEY_ESCAPE; int KEY_0 = GLFW_KEY_0; int KEY_1 = GLFW_KEY_1; diff --git a/ffi/glfw-input.sml b/ffi/glfw-input.sml index 24c2662..ec1ed18 100644 --- a/ffi/glfw-input.sml +++ b/ffi/glfw-input.sml @@ -39,6 +39,8 @@ struct _symbol "KEY_B" public : ( unit -> int ) * ( int -> unit ); val (KEY_C, _) = _symbol "KEY_C" public : ( unit -> int ) * ( int -> unit ); + val (KEY_M, _) = + _symbol "KEY_M" public : ( unit -> int ) * ( int -> unit ); val (KEY_T, _) = _symbol "KEY_T" public : ( unit -> int ) * ( int -> unit ); @@ -78,6 +80,8 @@ struct _symbol "KEY_DOWN" public : ( unit -> int ) * ( int -> unit ); val (KEY_BACKSPACE, _) = _symbol "KEY_BACKSPACE" public : ( unit -> int ) * ( int -> unit ); + val (KEY_ESC, _) = + _symbol "KEY_ESC" public : ( unit -> int ) * ( int -> unit ); val (KEY_0, _) = _symbol "KEY_0" public : ( unit -> int ) * ( int -> unit ); diff --git a/imperative-shell/input-callbacks.sml b/imperative-shell/input-callbacks.sml index b75b82d..f6bb155 100644 --- a/imperative-shell/input-callbacks.sml +++ b/imperative-shell/input-callbacks.sml @@ -164,6 +164,14 @@ struct key = Input.KEY_9 () andalso action = Input.PRESS () andalso mods = 0 then Mailbox.send (mailbox, NUM 9) + else if + key = Input.KEY_ESC () andalso action = Input.PRESS () andalso mods = 0 + then + Mailbox.send (mailbox, KEY_ESC) + else if + key = Input.KEY_M () andalso action = Input.PRESS () andalso mods = 0 + then + Mailbox.send (mailbox, KEY_M) else () diff --git a/message-types/input-msg.sml b/message-types/input-msg.sml index c234c25..fe3725c 100644 --- a/message-types/input-msg.sml +++ b/message-types/input-msg.sml @@ -14,12 +14,14 @@ struct | KEY_A | KEY_W | KEY_H + | KEY_M | KEY_BACKSPACE | KEY_CTRL_S | KEY_CTRL_L | KEY_CTRL_E | KEY_CTRL_O | KEY_CTRL_C + | KEY_ESC | NUM of int | ARROW_UP | ARROW_LEFT