diff options
Diffstat (limited to 'lib/Daffm/Action/Core.hs')
| -rw-r--r-- | lib/Daffm/Action/Core.hs | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/lib/Daffm/Action/Core.hs b/lib/Daffm/Action/Core.hs new file mode 100644 index 0000000..48792c4 --- /dev/null +++ b/lib/Daffm/Action/Core.hs @@ -0,0 +1,45 @@ +{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} + +{-# HLINT ignore "Use for_" #-} +module Daffm.Action.Core where + +import Brick (suspendAndResume') +import qualified Brick.Widgets.List as L +import Control.Monad.State (MonadIO (liftIO), MonadState, get, gets, put) +import Daffm.State (loadDirInAppState) +import Daffm.Types (AppEvent, AppState (..), FileInfo (..), FileType (..)) +import Data.Vector ((!?)) +import System.FilePath (takeDirectory) +import System.Process (callProcess) + +modifyM :: (MonadState s m) => (s -> m s) -> m () +modifyM f = get >>= f >>= put + +reloadDir :: AppEvent () +reloadDir = do + AppState {stateCwd, stateParentDir} <- get + modifyM (liftIO . loadDirInAppState stateCwd stateParentDir) + +goBackToParentDir :: AppEvent () +goBackToParentDir = do + dir <- gets stateParentDir + modifyM (liftIO . loadDirInAppState dir (takeDirectory dir)) + +openSelectedFile :: AppEvent () +openSelectedFile = do + appState <- get + let indexM = L.listSelected $ stateFiles appState + let files = L.listElements $ stateFiles appState + case indexM >>= (files !?) of + Just file -> openFile appState file + Nothing -> pure () + pure () + +openFile :: AppState -> FileInfo -> AppEvent () +openFile appState (FileInfo {filePath, fileType = Directory}) = do + modifyM (liftIO . loadDirInAppState filePath (stateCwd appState)) +openFile _appState (FileInfo {filePath, fileType}) = do + suspendAndResume' $ do + putStrLn $ "Opening " <> show fileType <> ": " <> filePath + callProcess "nvim" [filePath] + pure () |
