a little additional scaffolding for normal mode
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user