aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2024-12-14 20:59:19 +0530
committerAkshay Nair <phenax5@gmail.com>2024-12-14 21:32:10 +0530
commit0c6b8c83e8673b394914e1f824dfb887b762b0ee (patch)
treeb7878e594881609bd88b6f2f461cfdff5e9c7ab9 /src
parent34907bc25dba055dfbfe91d9a91803cc75283bfa (diff)
downloadchelleport-0c6b8c83e8673b394914e1f824dfb887b762b0ee.tar.gz
chelleport-0c6b8c83e8673b394914e1f824dfb887b762b0ee.zip
Add Tab to reset key sequence
Diffstat (limited to '')
-rw-r--r--src/Chelleport.hs29
-rw-r--r--src/Chelleport/AppShell.hs4
-rw-r--r--src/Chelleport/Context.hs4
-rw-r--r--src/Chelleport/Types.hs2
-rw-r--r--src/Chelleport/View.hs11
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