diff options
Diffstat (limited to '')
| -rw-r--r-- | src/Chelleport.hs | 82 |
1 files changed, 5 insertions, 77 deletions
diff --git a/src/Chelleport.hs b/src/Chelleport.hs index 3e8718e..7c44e26 100644 --- a/src/Chelleport.hs +++ b/src/Chelleport.hs @@ -1,28 +1,15 @@ module Chelleport where import Chelleport.AppShell (Action (AppAction, SysQuit), hideWindow, setupAppShell, shutdownApp) -import Chelleport.Context (DrawContext (ctxRenderer, ctxWindow)) -import Chelleport.Control (moveMouse, triggerMouseLeftClick) -import Chelleport.Draw (colorAxisLines, colorGridLines, colorLightGray, colorWhite, drawHorizontalLine, drawVerticalLine, renderText) -import Chelleport.KeySequence (Cell, KeyGrid, KeySequence, eventToKeycode, findMatchPosition, generateKeyCells, isValidKey, nextChars, toKeyChar) -import Control.Monad (forM_, unless, void) -import Data.IORef (modifyIORef', newIORef, readIORef) -import Data.List (isPrefixOf) -import qualified Data.Text as Text -import Foreign.C (CInt) -import SDL (($=)) +import Chelleport.Control (isKeyPress, isKeyPressWith, moveMouse, triggerMouseLeftClick) +import Chelleport.KeySequence (eventToKeycode, findMatchPosition, generateKeyCells, isValidKey, nextChars, toKeyChar) +import Chelleport.Types +import qualified Chelleport.View import qualified SDL import Unsafe.Coerce (unsafeCoerce) -data State = State - { stateCells :: KeyGrid, - stateKeySequence :: KeySequence - } - -data AppAction = FilterSequence SDL.Keycode | TriggerLeftClick | SetupGrid - open :: IO () -open = setupAppShell initialState update eventToAction render +open = setupAppShell initialState update eventToAction Chelleport.View.render initialState :: DrawContext -> IO State initialState _ctx = do @@ -33,57 +20,6 @@ initialState _ctx = do columns = 16 hintKeys = "ABCDEFGHIJKLMNOPRSTUVWXYZ1234567890" -render :: State -> DrawContext -> IO () -render state ctx = do - (SDL.V2 width height) <- SDL.get $ SDL.windowSize $ ctxWindow ctx - let grid = stateCells state - let wcell = width `div` unsafeCoerce (length $ head grid) - let hcell = height `div` unsafeCoerce (length grid) - - renderGridLines state ctx - - forM_ (zip [0 ..] grid) $ \(rowIndex, row) -> do - let py = rowIndex * hcell - forM_ (zip [0 ..] row) $ \(colIndex, cell) -> do - let px = colIndex * wcell - renderKeySequence ctx (stateKeySequence state) cell (px, py) - -renderKeySequence :: DrawContext -> KeySequence -> Cell -> (CInt, CInt) -> IO () -renderKeySequence ctx keySequence cell (px, py) = do - let (matched, remaining) = - if keySequence `isPrefixOf` cell - then splitAt (length keySequence) cell - else ("", cell) - - widthRef <- newIORef 0 - unless (null matched) $ do - (textWidth, _h) <- renderText ctx (SDL.V2 px py) colorLightGray $ Text.pack matched - modifyIORef' widthRef (const textWidth) - - unless (null remaining) $ do - prevTextWidth <- readIORef widthRef - let pos = px + prevTextWidth - void $ renderText ctx (SDL.V2 pos py) colorWhite $ Text.pack remaining - -renderGridLines :: State -> DrawContext -> IO () -renderGridLines state ctx = do - (SDL.V2 width height) <- SDL.get $ SDL.windowSize $ ctxWindow ctx - let grid = stateCells state - let wcell = width `div` unsafeCoerce (length $ head grid) - let hcell = height `div` unsafeCoerce (length grid) - - SDL.rendererDrawColor (ctxRenderer ctx) $= colorGridLines - let rows = unsafeCoerce $ length grid - let columns = unsafeCoerce $ length $ head grid - forM_ [0 .. rows] $ \rowIndex -> do - drawHorizontalLine ctx $ rowIndex * hcell - forM_ [0 .. columns] $ \colIndex -> do - drawVerticalLine ctx $ colIndex * wcell - - SDL.rendererDrawColor (ctxRenderer ctx) $= colorAxisLines - drawHorizontalLine ctx (rows * hcell `div` 2) - drawVerticalLine ctx (columns * wcell `div` 2) - update :: State -> DrawContext -> AppAction -> IO State update state _ctx SetupGrid = pure state update state ctx TriggerLeftClick = do @@ -121,11 +57,3 @@ eventToAction _state event = | isKeyPress ev && isValidKey (eventToKeycode ev) -> Just $ AppAction $ FilterSequence $ eventToKeycode ev _ -> Nothing - -isKeyPress :: SDL.KeyboardEventData -> Bool -isKeyPress keyboardEvent = - SDL.keyboardEventKeyMotion keyboardEvent == SDL.Pressed - -isKeyPressWith :: SDL.KeyboardEventData -> SDL.Keycode -> Bool -isKeyPressWith keyboardEvent keyCode = - isKeyPress keyboardEvent && SDL.keysymKeycode (SDL.keyboardEventKeysym keyboardEvent) == keyCode |
