Fixing keydown events.
This commit is contained in:
parent
3fe7750290
commit
0a60d472ea
5 changed files with 45 additions and 34 deletions
|
|
@ -95,31 +95,32 @@ textInput = config \ ui.stateful {
|
|||
|
||||
# update : State \ Event \ State
|
||||
update = state event \ event
|
||||
| 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] }
|
||||
|
||||
| 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] }
|
||||
|
||||
| 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 \
|
||||
| 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, config.onKeyDown] }
|
||||
{ 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 = [] }
|
||||
|
||||
| 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 = [] }
|
||||
|
||||
| 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] }
|
||||
|
||||
| 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…
Add table
Add a link
Reference in a new issue