aboutsummaryrefslogtreecommitdiff
path: root/lib/Daffm/Action/Cmdline.hs
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2025-10-03 15:48:49 +0530
committerAkshay Nair <phenax5@gmail.com>2025-10-03 15:55:29 +0530
commita3d5295ee745ab851c28d0a53147cbad65a7805f (patch)
treef1771baa2748700e3045e00344d53a5782bd48c0 /lib/Daffm/Action/Cmdline.hs
parentdd048c390f8762e7701572c4e319f22df06aeb75 (diff)
downloaddaffm-a3d5295ee745ab851c28d0a53147cbad65a7805f.tar.gz
daffm-a3d5295ee745ab851c28d0a53147cbad65a7805f.zip
Refactor event module with actions
Diffstat (limited to 'lib/Daffm/Action/Cmdline.hs')
-rw-r--r--lib/Daffm/Action/Cmdline.hs65
1 files changed, 65 insertions, 0 deletions
diff --git a/lib/Daffm/Action/Cmdline.hs b/lib/Daffm/Action/Cmdline.hs
new file mode 100644
index 0000000..bf1f3f1
--- /dev/null
+++ b/lib/Daffm/Action/Cmdline.hs
@@ -0,0 +1,65 @@
+module Daffm.Action.Cmdline where
+
+import Brick (suspendAndResume')
+import qualified Brick.Widgets.Edit as Editor
+import qualified Brick.Widgets.List as L
+import Control.Monad (void)
+import Control.Monad.State (get, gets, modify)
+import Daffm.Action.Core (reloadDir)
+import Daffm.Types (AppEvent, AppState (..), FileInfo (..), FocusTarget (..))
+import Data.Char (isSpace)
+import Data.List (dropWhileEnd)
+import qualified Data.Text as Text
+import qualified Data.Text.Zipper as Z
+import qualified Data.Text.Zipper as Zipper
+import System.Process (callCommand)
+
+leaveCmdline :: AppEvent ()
+leaveCmdline = clearCmdline >> modify (\st -> st {stateFocusTarget = FocusMain})
+
+enterCmdline :: AppEvent ()
+enterCmdline = modify (\st -> st {stateFocusTarget = FocusCmdline})
+
+setCmdlineText :: String -> AppEvent ()
+setCmdlineText text =
+ applyCmdlineEdit (const $ Z.stringZipper [text] (Just 1))
+
+clearCmdline :: AppEvent ()
+clearCmdline = applyCmdlineEdit Z.clearZipper
+
+cmdSubstitutions :: Text.Text -> AppEvent Text.Text
+cmdSubstitutions cmd = do
+ (AppState {stateFiles, stateCwd}) <- get
+ let file = maybe "" (filePath . snd) . L.listSelectedElement $ stateFiles
+ -- TODO: Escaping %
+ let subst =
+ Text.replace "%" (Text.pack file)
+ . Text.replace "%d" (Text.pack stateCwd)
+ pure . subst $ cmd
+
+runCmdline :: AppEvent ()
+runCmdline = do
+ cmd <- gets (trimCmd . Editor.getEditContents . stateCmdlineEditor)
+ evaluateCommand cmd
+ leaveCmdline
+ where
+ trimCmd = dropWhile isSpace . dropWhileEnd isSpace . unlines
+
+evaluateCommand :: String -> AppEvent ()
+evaluateCommand ('!' : '!' : cmd) = do
+ cmd' <- Text.unpack <$> cmdSubstitutions (Text.pack cmd)
+ suspendAndResume' $ do
+ callCommand cmd'
+ putStrLn "Press any key to continue" >> void getChar
+ reloadDir
+evaluateCommand ('!' : cmd) = do
+ cmd' <- Text.unpack <$> cmdSubstitutions (Text.pack cmd)
+ suspendAndResume' $ callCommand cmd'
+ reloadDir
+evaluateCommand _cmd = pure ()
+
+applyCmdlineEdit :: (Zipper.TextZipper String -> Zipper.TextZipper String) -> AppEvent ()
+applyCmdlineEdit zipper = do
+ editor <- gets stateCmdlineEditor
+ let editor' = Editor.applyEdit zipper editor
+ modify (\s -> s {stateCmdlineEditor = editor'})