Fixing keydown events.

master
Dustin Swan 3 weeks ago
parent 3fe7750290
commit 0a60d472ea
Signed by: dustinswan
GPG Key ID: 30D46587E2100467

@ -95,31 +95,32 @@ textInput = config \ ui.stateful {
# update : State \ Event \ State
update = state event \ event
| ArrowLeft \
| Key { key = c, printable = True } \
_ = debug "text keydown" c;
newText = insertChar state.text state.cursorPos c;
newCursorPos = state.cursorPos + 1;
newScroll = calcScrollOffset newText newCursorPos state.scrollOffset config.w;
newState = state.{ text = newText, cursorPos = newCursorPos, scrollOffset = newScroll };
{ state = newState, emit = [config.onChange newText] }
| Key { key = "ArrowLeft" } \
newCursorPos = max 0 (state.cursorPos - 1);
newScroll = calcScrollOffset state.text newCursorPos state.scrollOffset config.w;
newState = state.{ text = state.text, cursorPos = newCursorPos, scrollOffset = newScroll };
{ state = newState, emit = [config.onKeyDown] }
{ state = newState, emit = [] }
| ArrowRight \
| Key { key = "ArrowRight" } \
newCursorPos = min (len state.text) (state.cursorPos + 1);
newScroll = calcScrollOffset state.text newCursorPos state.scrollOffset config.w;
newState = state.{ text = state.text, cursorPos = newCursorPos, scrollOffset = newScroll };
{ state = newState, emit = [config.onKeyDown] }
{ state = newState, emit = [] }
| Backspace \
| Key { key = "Backspace" } \
newText = deleteChar state.text state.cursorPos;
newCursorPos = max 0 (state.cursorPos - 1);
newScroll = calcScrollOffset newText newCursorPos state.scrollOffset config.w;
newState = state.{ text = newText, cursorPos = newCursorPos, scrollOffset = newScroll };
{ state = newState, emit = [config.onChange newText, config.onKeyDown] }
| Char c \
newText = insertChar state.text state.cursorPos c;
newCursorPos = state.cursorPos + 1;
newScroll = calcScrollOffset newText newCursorPos state.scrollOffset config.w;
newState = state.{ text = newText, cursorPos = newCursorPos, scrollOffset = newScroll };
{ state = newState, emit = [config.onChange newText, config.onKeyDown] }
{ state = newState, emit = [config.onChange newText] }
| Clicked coords \
newCursorPos = findCursorPos state.text coords.x state.scrollOffset 8;
@ -129,7 +130,8 @@ textInput = config \ ui.stateful {
| Focused \ { state = state.{ focused = True }, emit = [] }
| Blurred \ { state = state.{ focused = False }, emit = [] }
| event \ { state = state, emit = [config.onKeyDown event] },
| Key { key = k } \ { state = state, emit = [\ config.onKeyDown k ] }
| _ \ { state = state, emit = [] },
view = state \
textBeforeCursor = slice state.text 0 state.cursorPos;

@ -52,10 +52,12 @@ palette = config \
w = contentWidth,
h = textInputHeight,
onChange = text \ batch [config.state.query := text, config.state.focusedIndex := 0],
onKeyDown = key \ key
| ArrowUp \ config.state.focusedIndex := max 0 (config.state.focusedIndex - 1)
| ArrowDown \ config.state.focusedIndex := (config.state.focusedIndex + 1)
| Enter \ (\ config.onSelect (unwrapOr "" (nth config.state.focusedIndex results)))
onKeyDown = key \
_ = debug "palette key" key;
key
| "ArrowUp" \ config.state.focusedIndex := max 0 (config.state.focusedIndex - 1)
| "ArrowDown" \ config.state.focusedIndex := (config.state.focusedIndex + 1)
| "Enter" \ (\ config.onSelect (unwrapOr "" (nth config.state.focusedIndex results)))
| _ \ noOp
},
ui.clip {

@ -9,6 +9,8 @@ osState = {
init = {};
update = state event \ event
| Key { key = "p", meta = True } \ togglePalette
| Key { key = k } \ debug "key" k
| _ \ state;
view = state viewport \

@ -298,7 +298,8 @@ export class Parser {
return kind === 'underscore' || kind === 'ident' ||
kind === 'type-ident' || kind === 'int' ||
kind === 'float' || kind === 'string' ||
kind === 'open-paren';
kind === 'open-paren' || kind === 'open-brace' ||
kind === 'open-bracket';
}
private parseLambda(): AST {

@ -205,13 +205,17 @@ export function runAppCompiled(app: App, canvas: HTMLCanvasElement, rt: any) {
});
window.addEventListener('keydown', (e) => {
let event: any;
if (e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {
event = { _tag: 'Char', _0: e.key };
} else {
event = { _tag: e.key };
const event = {
_tag: 'Key',
_0: {
key: e.key,
ctrl: { _tag: e.ctrlKey ? 'True' : 'False' },
meta: { _tag: e.metaKey ? 'True' : 'False' },
alt: { _tag: e.altKey ? 'True' : 'False' },
shift: { _tag: e.shiftKey ? 'True' : 'False' },
printable: { _tag: e.key.length === 1 ? 'True' : 'False' }
}
};
if (focusedComponentKey) {
handleComponentEvent(focusedComponentKey, event);

Loading…
Cancel
Save