a little additional scaffolding for normal mode

This commit is contained in:
2025-08-31 02:41:37 +01:00
parent 3b6dff3081
commit 542da2229c
8 changed files with 50 additions and 5 deletions

View File

@@ -1,6 +1,8 @@
structure AppType = structure AppType =
struct struct
datatype mode = NORMAL_MODE of string | NORMAL_SEARCH_MODE of string datatype mode =
NORMAL_MODE of string
| NORMAL_SEARCH_MODE of {searchString: string, tempSearchList: int vector}
type app_type = type app_type =
{ mode: mode { mode: mode

View File

@@ -4,6 +4,7 @@ struct
fun update (app: app_type, msg, time) = fun update (app: app_type, msg, time) =
case #mode app of case #mode app of
NORMAL_MODE str => NormalMode.update (app, str, msg, time) NORMAL_MODE modeData => NormalMode.update (app, modeData, msg, time)
| NORMAL_SEARCH_MODE str => NormalSearchMode.update (app, str, msg, time) | NORMAL_SEARCH_MODE modeData =>
NormalSearchMode.update (app, modeData, msg, time)
end end

View File

@@ -5,6 +5,16 @@ struct
open AppType open AppType
open InputMsg open InputMsg
(* todo: create draw msg showing search bar *)
fun switchToNormalSearchMode (app: app_type) =
let
val mode =
NORMAL_SEARCH_MODE
{searchString = "", tempSearchList = Vector.fromList []}
in
AppWith.mode (app, mode, [])
end
fun getNumLength (pos, str) = fun getNumLength (pos, str) =
if pos = String.size str then if pos = String.size str then
pos pos
@@ -82,6 +92,7 @@ struct
else NormalMove.moveToLine (app, count - 1) else NormalMove.moveToLine (app, count - 1)
| #"%" => NormalMove.moveToMatchingPair app | #"%" => NormalMove.moveToMatchingPair app
| #"x" => NormalDelete.removeChr (app, count, time) | #"x" => NormalDelete.removeChr (app, count, time)
| #"/" => switchToNormalSearchMode app
(* multi-char commands which can be appended *) (* multi-char commands which can be appended *)
| #"t" => appendChr (app, chr, str) | #"t" => appendChr (app, chr, str)
| #"T" => appendChr (app, chr, str) | #"T" => appendChr (app, chr, str)
@@ -258,4 +269,5 @@ struct
| KEY_ESC => Finish.clearMode app | KEY_ESC => Finish.clearMode app
| RESIZE_EVENT (width, height) => Finish.resizeText (app, width, height) | RESIZE_EVENT (width, height) => Finish.resizeText (app, width, height)
| WITH_SEARCH_LIST searchList => Finish.withSearchList (app, searchList) | WITH_SEARCH_LIST searchList => Finish.withSearchList (app, searchList)
| KEY_ENTER => app
end end

View File

@@ -3,10 +3,33 @@ struct
open AppType open AppType
open InputMsg open InputMsg
fun update (app, searchString, msg, time) = (* todo: redraw based on results of tempSearchList *)
fun parseChr (app: app_type, searchString, chr) =
let
val c = String.implode [chr]
val searchString = searchString ^ c
val {buffer, cursorIdx, ...} = app
val buffer = LineGap.goToIdx (cursorIdx - 1111, buffer)
val tempSearchList =
SearchList.buildRange (buffer, searchString, cursorIdx + 1111)
val mode =
NORMAL_SEARCH_MODE
{searchString = searchString, tempSearchList = tempSearchList}
in
AppWith.mode (app, mode, [])
end
(* todo: switch to normal mode, save tempSearchList and searchString,
* and redraw *)
fun finishSearch (app: app_type, searchString, tempSearchList) = app
fun update (app, {searchString, tempSearchList}, msg, time) =
case msg of case msg of
CHAR_EVENT chrCmd => app CHAR_EVENT chr => parseChr (app, searchString, chr)
| KEY_ESC => Finish.clearMode app | KEY_ESC => Finish.clearMode app
| KEY_ENTER => finishSearch (app, searchString, tempSearchList)
| RESIZE_EVENT (width, height) => app | RESIZE_EVENT (width, height) => app
| WITH_SEARCH_LIST searchList => app | WITH_SEARCH_LIST searchList => app
end end

View File

@@ -7,6 +7,7 @@ int PRESS = GLFW_PRESS;
int REPEAT = GLFW_REPEAT; int REPEAT = GLFW_REPEAT;
int RELEASE = GLFW_RELEASE; int RELEASE = GLFW_RELEASE;
int KEY_ESC = GLFW_KEY_ESCAPE; int KEY_ESC = GLFW_KEY_ESCAPE;
int KEY_ENTER = GLFW_KEY_ENTER;
void framebufferSizeCallback(GLFWwindow* window, int width, int height) { void framebufferSizeCallback(GLFWwindow* window, int width, int height) {
glViewport(0, 0, width, height); glViewport(0, 0, width, height);

View File

@@ -33,4 +33,7 @@ struct
val (KEY_ESC, _) = val (KEY_ESC, _) =
_symbol "KEY_ESC" public : ( unit -> int ) * ( int -> unit ); _symbol "KEY_ESC" public : ( unit -> int ) * ( int -> unit );
val KEY_ESC = KEY_ESC () val KEY_ESC = KEY_ESC ()
val (KEY_ENTER, _) =
_symbol "KEY_ENTER" public : ( unit -> int ) * ( int -> unit );
val KEY_ENTER = KEY_ENTER ()
end end

View File

@@ -3,6 +3,7 @@ struct
datatype t = datatype t =
CHAR_EVENT of char CHAR_EVENT of char
| KEY_ESC | KEY_ESC
| KEY_ENTER
| RESIZE_EVENT of int * int | RESIZE_EVENT of int * int
| WITH_SEARCH_LIST of int vector | WITH_SEARCH_LIST of int vector
end end

View File

@@ -25,6 +25,8 @@ struct
in in
if key = KEY_ESC andalso action = PRESS andalso mods = 0 then if key = KEY_ESC andalso action = PRESS andalso mods = 0 then
Mailbox.send (inputMailbox, InputMsg.KEY_ESC) Mailbox.send (inputMailbox, InputMsg.KEY_ESC)
else if key = KEY_ENTER andalso action = PRESS andalso mods = 0 then
Mailbox.send (inputMailbox, InputMsg.KEY_ENTER)
else else
() ()
end end