diff options
Diffstat (limited to 'src/Chelleport/AppState.hs')
| -rw-r--r-- | src/Chelleport/AppState.hs | 46 |
1 files changed, 22 insertions, 24 deletions
diff --git a/src/Chelleport/AppState.hs b/src/Chelleport/AppState.hs index 9b69404..a304c96 100644 --- a/src/Chelleport/AppState.hs +++ b/src/Chelleport/AppState.hs @@ -15,13 +15,11 @@ import qualified Text.Fuzzy as Fuzzy initialState :: (Monad m) => Configuration -> m (State, Maybe AppAction) initialState config = do - let cells = either error id $ generateGrid 0 (rows, columns) hintKeys let action = Just $ SetMode $ configMode config - pure (def {stateGrid = cells}, action) + pure (def {stateGridRows = rows, stateGridCols = columns}, action) where rows = 9 columns = 16 - hintKeys = ['A' .. 'Z'] update :: (MonadAppShell m, MonadDraw m, MonadControl m, MonadOCR m) => Update m State AppAction -- Chain clicks @@ -32,20 +30,20 @@ update _ state (ChainMouseClick btn) = do pure (state {stateRepetition = 1}, Just ResetKeys) -- HINTS MODE: Act on key inputs -update _ state@(State {stateMode = ModeHints {}}) (HandleKeyInput keycode) = do +update _ state@(State {stateMode = ModeHints hintsData}) (HandleKeyInput keycode) = do case (toKeyChar keycode, validNextKeys) of (Just keyChar, Just validChars') - | stateIsMatched state && keyChar `elem` ("HJKL" :: String) -> do + | stateIsMatched hintsData && keyChar `elem` ("HJKL" :: String) -> do pure (state, Just $ MoveMouseInDirection $ hjklDirection keyChar) | keyChar `elem` validChars' -> do - let newKeySequence = stateKeySequence state ++ [keyChar] - let matchPosition = findMatchPosition newKeySequence $ stateGrid state - let state' = state {stateKeySequence = newKeySequence, stateIsMatched = isJust matchPosition} + let newKeySequence = stateKeySequence hintsData ++ [keyChar] + let matchPosition = findMatchPosition newKeySequence $ stateGrid hintsData + let updatedHintsData = hintsData {stateKeySequence = newKeySequence, stateIsMatched = isJust matchPosition} action <- traverse (fmap MoveMousePosition . screenPositionFromCellPosition state) matchPosition - pure (state', action) + pure (state {stateMode = ModeHints updatedHintsData}, action) _ -> pure (state, Nothing) where - validNextKeys = nextChars (stateKeySequence state) (stateGrid state) + validNextKeys = nextChars (stateKeySequence hintsData) (stateGrid hintsData) -- SEARCH MODE: Act on key inputs update _ state@(State {stateMode = ModeSearch (ModeSearchData {searchWords, searchInputText})}) (HandleKeyInput keycode) = do @@ -125,25 +123,25 @@ update _ state (MoveMousePosition (x, y)) = do -- Reset entered key sequence and state update _ state ResetKeys = do - pure - ( state - { stateKeySequence = [], - stateIsMatched = False, - stateRepetition = 1, - stateMode = resetMode (stateMode state) - }, - Nothing - ) + let nextState = + state + { stateRepetition = 1, + stateMode = resetMode (stateMode state) + } + pure (nextState, Nothing) where - resetMode mode@(ModeHints {}) = mode + resetMode (ModeHints hintsData) = ModeHints $ hintsData {stateKeySequence = [], stateIsMatched = False} resetMode (ModeSearch searchData@(ModeSearchData {searchWords})) = - ModeSearch (searchData {searchWords = searchWords, searchFilteredWords = searchWords}) + ModeSearch $ searchData {searchWords = searchWords, searchFilteredWords = searchWords} -- Initialize current mode update flush state InitializeMode = case stateMode state of - ModeHints {} -> pure (state {stateIsModeInitialized = True}, Nothing) - ModeSearch {} -> do + ModeHints hintsData -> do + let cells = either error id $ generateGrid 0 (stateGridRows state, stateGridCols state) ['A' .. 'Z'] + let updateHintsData = hintsData {stateGrid = cells} + pure (state {stateMode = ModeHints updateHintsData, stateIsModeInitialized = True}, Nothing) + ModeSearch searchData -> do position <- windowPosition size <- windowSize hideWindow @@ -151,7 +149,7 @@ update flush state InitializeMode = showWindow flush matches <- getWordsInImage screenshot - let updatedSearchData = (modeSearchData $ stateMode state) {searchWords = matches, searchFilteredWords = matches} + let updatedSearchData = searchData {searchWords = matches, searchFilteredWords = matches} pure (state {stateMode = ModeSearch updatedSearchData, stateIsModeInitialized = True}, Nothing) -- Set mode |
