diff options
| author | Akshay Nair <phenax5@gmail.com> | 2025-10-03 11:05:17 +0530 |
|---|---|---|
| committer | Akshay Nair <phenax5@gmail.com> | 2025-10-03 11:05:17 +0530 |
| commit | 2d0abaeb779ef63ed59de136e55c63ed2fd0a4ba (patch) | |
| tree | f00b8e584e42b4273ae5b75ec04efbf6585dafd1 /lib/Daffm/Event.hs | |
| parent | c636e2bbe34bff6f75b334cdaa9d4e59b92fa48c (diff) | |
| download | daffm-2d0abaeb779ef63ed59de136e55c63ed2fd0a4ba.tar.gz daffm-2d0abaeb779ef63ed59de136e55c63ed2fd0a4ba.zip | |
Preserve list position while navigating through directories
Diffstat (limited to 'lib/Daffm/Event.hs')
| -rw-r--r-- | lib/Daffm/Event.hs | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/lib/Daffm/Event.hs b/lib/Daffm/Event.hs new file mode 100644 index 0000000..f14ebd8 --- /dev/null +++ b/lib/Daffm/Event.hs @@ -0,0 +1,62 @@ +module Daffm.Event where + +import Brick (suspendAndResume') +import qualified Brick.Main as M +import qualified Brick.Types as T +import qualified Brick.Widgets.Edit as Editor +import qualified Brick.Widgets.List as L +import Control.Monad.State (MonadIO (liftIO), MonadState, get, gets, modify, put) +import Daffm.State (cacheDirPosition, loadDirInAppState) +import Daffm.Types (AppState (..), FileInfo (..), FileType (..), FocusTarget (FocusCmdline, FocusMain)) +import Data.Vector ((!?)) +import qualified Graphics.Vty as V +import System.FilePath (takeDirectory) +import System.Process (callProcess) + +type AppEvent = T.EventM FocusTarget AppState + +modifyM :: (MonadState s m) => (s -> m s) -> m () +modifyM f = get >>= f >>= put + +appEvent :: T.BrickEvent FocusTarget e -> AppEvent () +appEvent brickevent@(T.VtyEvent event) = do + focusTarget <- gets stateFocusTarget + case (focusTarget, event) of + (FocusCmdline, V.EvKey V.KEsc []) -> modify (\st -> st {stateFocusTarget = FocusMain}) + (FocusMain, V.EvKey (V.KChar ':') []) -> modify (\st -> st {stateFocusTarget = FocusCmdline}) + (FocusMain, V.EvKey (V.KChar 'q') []) -> M.halt + (FocusMain, V.EvKey (V.KChar 'l') []) -> openSelectedFile + (FocusMain, V.EvKey (V.KChar 'h') []) -> goBackToParentDir + (FocusMain, V.EvKey V.KEnter []) -> openSelectedFile + (FocusMain, V.EvKey V.KBS []) -> goBackToParentDir + (FocusMain, _) -> do + files <- gets stateFiles + newFiles <- T.nestEventM' files (L.handleListEventVi L.handleListEvent event) + modify (\appState -> appState {stateFiles = newFiles}) + (FocusCmdline, _) -> do + editor <- gets stateCmdlineEditor + newEditor <- T.nestEventM' editor (Editor.handleEditorEvent brickevent) + modify (\appState -> appState {stateCmdlineEditor = newEditor}) + modify cacheDirPosition +appEvent _ = pure () + +openSelectedFile :: AppEvent () +openSelectedFile = do + AppState {stateFiles, stateCwd} <- get + let indexM = L.listSelected stateFiles + let files = L.listElements stateFiles + case indexM >>= (files !?) of + Just (FileInfo {filePath, fileType = Directory}) -> + modifyM (liftIO . loadDirInAppState filePath stateCwd) + Just (FileInfo {filePath, fileType}) -> do + suspendAndResume' $ do + putStrLn $ "Opening " <> show fileType <> ": " <> filePath + callProcess "nvim" [filePath] + pure () + Nothing -> pure () + pure () + +goBackToParentDir :: AppEvent () +goBackToParentDir = do + dir <- gets stateParentDir + modifyM (liftIO . loadDirInAppState dir (takeDirectory dir)) |
