diff options
| author | Akshay Nair <phenax5@gmail.com> | 2024-12-14 20:59:19 +0530 |
|---|---|---|
| committer | Akshay Nair <phenax5@gmail.com> | 2024-12-14 21:32:10 +0530 |
| commit | 0c6b8c83e8673b394914e1f824dfb887b762b0ee (patch) | |
| tree | b7878e594881609bd88b6f2f461cfdff5e9c7ab9 /src | |
| parent | 34907bc25dba055dfbfe91d9a91803cc75283bfa (diff) | |
| download | chelleport-0c6b8c83e8673b394914e1f824dfb887b762b0ee.tar.gz chelleport-0c6b8c83e8673b394914e1f824dfb887b762b0ee.zip | |
Add Tab to reset key sequence
Diffstat (limited to '')
| -rw-r--r-- | src/Chelleport.hs | 29 | ||||
| -rw-r--r-- | src/Chelleport/AppShell.hs | 4 | ||||
| -rw-r--r-- | src/Chelleport/Context.hs | 4 | ||||
| -rw-r--r-- | src/Chelleport/Types.hs | 2 | ||||
| -rw-r--r-- | src/Chelleport/View.hs | 11 |
5 files changed, 30 insertions, 20 deletions
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 diff --git a/src/Chelleport/AppShell.hs b/src/Chelleport/AppShell.hs index 9b8a284..0a5bdfe 100644 --- a/src/Chelleport/AppShell.hs +++ b/src/Chelleport/AppShell.hs @@ -1,6 +1,6 @@ module Chelleport.AppShell where -import Chelleport.Context (createContext) +import Chelleport.Context (initializeContext) import Chelleport.Draw (colorBackground) import Chelleport.Types import Control.Monad (foldM, unless) @@ -25,7 +25,7 @@ setupAppShell initState update eventHandler draw = do SDL.initializeAll TTF.initialize - ctx <- createContext + ctx <- initializeContext state <- initState ctx appLoop ctx (state, SysState {sysExit = False}) diff --git a/src/Chelleport/Context.hs b/src/Chelleport/Context.hs index d62cd7e..9b1e13e 100644 --- a/src/Chelleport/Context.hs +++ b/src/Chelleport/Context.hs @@ -6,8 +6,8 @@ import SDL (($=)) import qualified SDL import qualified SDL.Font as TTF -createContext :: IO DrawContext -createContext = do +initializeContext :: IO DrawContext +initializeContext = do let windowCfg = SDL.defaultWindow { SDL.windowMode = SDL.FullscreenDesktop, diff --git a/src/Chelleport/Types.hs b/src/Chelleport/Types.hs index 766348b..8f69e72 100644 --- a/src/Chelleport/Types.hs +++ b/src/Chelleport/Types.hs @@ -15,7 +15,7 @@ data State = State stateKeySequence :: KeySequence } -data AppAction = FilterSequence SDL.Keycode | TriggerLeftClick | SetupGrid +data AppAction = FilterSequence SDL.Keycode | TriggerLeftClick | ResetKeys data DrawContext = DrawContext { ctxWindow :: SDL.Window, diff --git a/src/Chelleport/View.hs b/src/Chelleport/View.hs index f1e941f..cf51390 100644 --- a/src/Chelleport/View.hs +++ b/src/Chelleport/View.hs @@ -11,6 +11,9 @@ import SDL (($=)) import qualified SDL import Unsafe.Coerce (unsafeCoerce) +isEmpty :: [a] -> Bool +isEmpty = null + render :: State -> DrawContext -> IO () render state ctx = do renderGridLines state ctx @@ -33,16 +36,16 @@ renderKeySequence ctx keySequence cell (px, py) = do | otherwise = ("", cell) let textColor - | null keySequence = colorWhite - | not (null matched) = colorAccent + | isEmpty keySequence = colorWhite + | not $ isEmpty matched = colorAccent | otherwise = colorGray widthRef <- newIORef 0 - unless (null matched) $ do + unless (isEmpty matched) $ do (textWidth, _h) <- drawText ctx (SDL.V2 px py) colorLightGray $ Text.pack matched modifyIORef' widthRef (const textWidth) - unless (null remaining) $ do + unless (isEmpty remaining) $ do prevTextWidth <- readIORef widthRef let pos = px + prevTextWidth void $ drawText ctx (SDL.V2 pos py) textColor $ Text.pack remaining |
