Allowing textInput to be controlled or uncontrolled. adding tab to palette to replace query text with selected item

master
Dustin Swan 6 days ago
parent eb5618c64e
commit 5d7d297050
Signed by: dustinswan
GPG Key ID: 30D46587E2100467

@ -168,51 +168,58 @@ textInput = config \
}, },
# update : State \ Event \ State # update : State \ Event \ State
update = state event \ event update = state event \
s = (hasField "value" c
| True \ (c.value == state.text
| True \ state
| False \ state.{ text = c.value, cursorPos = len c.value, scrollOffset = 0 })
| False \ state);
event
| Key { key = key, printable = True, meta = False, ctrl = False } \ ( | Key { key = key, printable = True, meta = False, ctrl = False } \ (
newText = insertChar state.text state.cursorPos key; newText = insertChar s.text s.cursorPos key;
newCursorPos = state.cursorPos + 1; newCursorPos = s.cursorPos + 1;
newScroll = calcScrollOffset newText newCursorPos state.scrollOffset c.w; newScroll = calcScrollOffset newText newCursorPos s.scrollOffset c.w;
newState = state.{ text = newText, cursorPos = newCursorPos, scrollOffset = newScroll }; newState = s.{ text = newText, cursorPos = newCursorPos, scrollOffset = newScroll };
{ state = newState, emit = [c.onChange newText] }) { state = newState, emit = [c.onChange newText] })
| Key { key = "ArrowLeft" } \ ( | Key { key = "ArrowLeft" } \ (
newCursorPos = max 0 (state.cursorPos - 1); newCursorPos = max 0 (s.cursorPos - 1);
newScroll = calcScrollOffset state.text newCursorPos state.scrollOffset c.w; newScroll = calcScrollOffset s.text newCursorPos s.scrollOffset c.w;
newState = state.{ text = state.text, cursorPos = newCursorPos, scrollOffset = newScroll }; newState = s.{ text = s.text, cursorPos = newCursorPos, scrollOffset = newScroll };
{ state = newState, emit = [] }) { state = newState, emit = [] })
| Key { key = "ArrowRight" } \ ( | Key { key = "ArrowRight" } \ (
newCursorPos = min (len state.text) (state.cursorPos + 1); newCursorPos = min (len s.text) (s.cursorPos + 1);
newScroll = calcScrollOffset state.text newCursorPos state.scrollOffset c.w; newScroll = calcScrollOffset s.text newCursorPos s.scrollOffset c.w;
newState = state.{ text = state.text, cursorPos = newCursorPos, scrollOffset = newScroll }; newState = s.{ text = s.text, cursorPos = newCursorPos, scrollOffset = newScroll };
{ state = newState, emit = [] }) { state = newState, emit = [] })
| Key { key = "Backspace" } \ ( | Key { key = "Backspace" } \ (
newText = deleteChar state.text state.cursorPos; newText = deleteChar s.text s.cursorPos;
newCursorPos = max 0 (state.cursorPos - 1); newCursorPos = max 0 (s.cursorPos - 1);
newScroll = calcScrollOffset newText newCursorPos state.scrollOffset c.w; newScroll = calcScrollOffset newText newCursorPos s.scrollOffset c.w;
newState = state.{ text = newText, cursorPos = newCursorPos, scrollOffset = newScroll }; newState = s.{ text = newText, cursorPos = newCursorPos, scrollOffset = newScroll };
{ state = newState, emit = [c.onChange newText] }) { state = newState, emit = [c.onChange newText] })
| Key { key = "Enter" } \ ( | Key { key = "Enter" } \ { state = s, emit = [c.onSubmit s.text] }
# newState = state.{ text = "", cursorPos = 0, scrollOffset = 0 };
# do we blank it out here? wish parent could decide..
{ state = state, emit = [c.onSubmit state.text] })
| Clicked coords \ ( | Clicked coords \ (
newCursorPos = findCursorPos state.text coords.x state.scrollOffset 8; newCursorPos = findCursorPos s.text coords.x s.scrollOffset 8;
newScroll = calcScrollOffset state.text newCursorPos state.scrollOffset c.w; newScroll = calcScrollOffset s.text newCursorPos s.scrollOffset c.w;
newState = state.{ text = state.text, cursorPos = newCursorPos, scrollOffset = newScroll }; newState = s.{ text = s.text, cursorPos = newCursorPos, scrollOffset = newScroll };
{ state = newState, emit = [] }) { state = newState, emit = [] })
| Focused \ { state = state.{ focused = True }, emit = [] } | Focused \ { state = state.{ focused = True }, emit = [] }
| Blurred \ { state = state.{ focused = False }, emit = [] } | Blurred \ { state = state.{ focused = False }, emit = [] }
# | Key { key = k } \ { state = state, emit = [\ c.onKeyDown k ] } | SetText newText \ (
| _ \ { state = state, emit = [] }, newState = s.{ text = newText, cursorPos = len newText, scrollOffset = 0 };
{ state = newState, emit = [c.onChange newText] })
| _ \ { state = s, emit = [] },
view = state emit \ view = state emit \
textBeforeCursor = slice state.text 0 state.cursorPos; text = (hasField "value" c | True \ c.value | False \ state.text);
cursorPos = (text == state.text | True \ state.cursorPos | False \ len text);
textBeforeCursor = slice text 0 cursorPos;
cursorX = ui.measureText textBeforeCursor; cursorX = ui.measureText textBeforeCursor;
padding = 8; padding = 8;
@ -226,7 +233,7 @@ textInput = config \
ui.positioned { ui.positioned {
x = 8 - state.scrollOffset, x = 8 - state.scrollOffset,
y = 0, y = 0,
child = ui.positioned { x = 0, y = 12, child = ui.text { content = state.text, color = c.color } } child = ui.positioned { x = 0, y = 12, child = ui.text { content = text, color = c.color } }
}, },
(state.focused (state.focused

@ -97,6 +97,11 @@ palette = config \
(nth effectiveIndex results (nth effectiveIndex results
| Some (Item data) \ { state = state, emit = [onSelect data.label] } | Some (Item data) \ { state = state, emit = [onSelect data.label] }
| _ \ { state = state, emit = [] }) | _ \ { state = state, emit = [] })
| Key { key = "Tab" } \ (
newQuery = (nth effectiveIndex results
| Some (Item data) \ data.label
| None \ paletteState.query);
{ state = state, emit = [ paletteState.query := newQuery ] })
| Key { key = "Escape" } \ { state = state, emit = [osState.palette.visible := False] } | Key { key = "Escape" } \ { state = state, emit = [osState.palette.visible := False] }
| _ \ { state = state, emit = [] }, | _ \ { state = state, emit = [] },
@ -118,7 +123,7 @@ palette = config \
children = [ children = [
textInput { textInput {
key = "palette-query", key = "palette-query",
initialValue = paletteState.query, value = paletteState.query,
autoFocus = True, autoFocus = True,
color = "white", color = "white",
backgroundColor = "rgba(0,0,0,0.2)", backgroundColor = "rgba(0,0,0,0.2)",

Loading…
Cancel
Save