From 0c6b8c83e8673b394914e1f824dfb887b762b0ee Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Sat, 14 Dec 2024 20:59:19 +0530 Subject: Add Tab to reset key sequence --- src/Chelleport.hs | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) (limited to 'src/Chelleport.hs') diff --git a/src/Chelleport.hs b/src/Chelleport.hs index 7c44e26..c944dbd 100644 --- a/src/Chelleport.hs +++ b/src/Chelleport.hs @@ -21,39 +21,46 @@ initialState _ctx = do hintKeys = "ABCDEFGHIJKLMNOPRSTUVWXYZ1234567890" update :: State -> DrawContext -> AppAction -> IO State -update state _ctx SetupGrid = pure state +update state _ctx ResetKeys = pure state {stateKeySequence = []} update state ctx TriggerLeftClick = do hideWindow ctx triggerMouseLeftClick ctx shutdownApp ctx pure state update state ctx (FilterSequence key) = - case validChars >>= (\chars -> (,chars) <$> toKeyChar key) of + case liftA2 (,) (toKeyChar key) validChars of Just (keyChar, validChars') | keyChar `elem` validChars' -> do - (SDL.V2 width height) <- SDL.get $ SDL.windowSize $ ctxWindow ctx let newKeySequence = stateKeySequence state ++ [keyChar] - let rows = stateCells state - let wcell = width `div` unsafeCoerce (length $ head rows) - let hcell = height `div` unsafeCoerce (length rows) - case findMatchPosition newKeySequence rows of - Just (row, col) -> do - moveMouse ctx (wcell * unsafeCoerce col) (hcell * unsafeCoerce row) - Nothing -> pure () + let matchPosition = findMatchPosition newKeySequence $ stateCells state + maybe (pure ()) moveMouseToCell matchPosition pure state {stateKeySequence = newKeySequence} _ -> pure state where validChars = nextChars (stateKeySequence state) (stateCells state) + cellDimensions = do + (SDL.V2 width height) <- SDL.get $ SDL.windowSize $ ctxWindow ctx + let rows = stateCells state + let wcell = width `div` unsafeCoerce (length $ head rows) + let hcell = height `div` unsafeCoerce (length rows) + pure (wcell, hcell) + + moveMouseToCell (row, col) = do + (wcell, hcell) <- cellDimensions + let x = (wcell `div` 2) + wcell * unsafeCoerce col + let y = (hcell `div` 2) + hcell * unsafeCoerce row + moveMouse ctx x y + eventToAction :: State -> SDL.Event -> Maybe (Action AppAction) eventToAction _state event = case SDL.eventPayload event of - -- SDL.WindowShownEvent _ -> Just $ AppAction SetupGrid SDL.QuitEvent -> Just SysQuit SDL.KeyboardEvent ev | isKeyPressWith ev SDL.KeycodeQ -> Just SysQuit | isKeyPressWith ev SDL.KeycodeEscape -> Just SysQuit | isKeyPressWith ev SDL.KeycodeSpace -> Just $ AppAction TriggerLeftClick + | isKeyPressWith ev SDL.KeycodeTab -> Just $ AppAction ResetKeys | isKeyPress ev && isValidKey (eventToKeycode ev) -> Just $ AppAction $ FilterSequence $ eventToKeycode ev _ -> Nothing -- cgit v1.3.1