aboutsummaryrefslogtreecommitdiff
path: root/lib/Daffm/View.hs
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2025-10-02 23:09:36 +0530
committerAkshay Nair <phenax5@gmail.com>2025-10-02 23:21:13 +0530
commit7fc70c52f322d451e8295a12a6fbaf869a2d9a2b (patch)
tree14dfe42e7e05890054eb3300ad7fa8f90f3adba5 /lib/Daffm/View.hs
parent51e29e21ca118ec690f20eaaf7b2b42c0a90e5e6 (diff)
downloaddaffm-7fc70c52f322d451e8295a12a6fbaf869a2d9a2b.tar.gz
daffm-7fc70c52f322d451e8295a12a6fbaf869a2d9a2b.zip
Add cmdline editor, focus switch + styling
Diffstat (limited to '')
-rw-r--r--lib/Daffm/View.hs75
1 files changed, 61 insertions, 14 deletions
diff --git a/lib/Daffm/View.hs b/lib/Daffm/View.hs
index 02529ac..db26a7d 100644
--- a/lib/Daffm/View.hs
+++ b/lib/Daffm/View.hs
@@ -1,25 +1,72 @@
module Daffm.View where
import Brick.Types (Widget)
-import Brick.Widgets.Core (str, vBox, vLimit, withAttr, (<+>))
+import Brick.Widgets.Core (Padding (Max, Pad), TextWidth (textWidth), hBox, hLimit, padLeft, padRight, str, vBox, vLimit, withAttr, (<+>))
+import Brick.Widgets.Edit (renderEditor)
import qualified Brick.Widgets.List as L
-import Daffm.Attrs (selectedFileAttr)
-import Daffm.Types (AppState (..), FileInfo (..))
+import Daffm.Attrs (directoryAttr, directorySelectedAttr, fileAttr, fileSelectedAttr)
+import Daffm.Types (AppState (..), FileInfo (..), FileType (..), FocusTarget (..))
+import Data.Int (Int64)
import qualified Data.Vector as Vec
+import Text.Printf (printf)
-appView :: AppState -> [Widget ()]
-appView (AppState {stateFiles, stateCwd}) = [ui]
+appView :: AppState -> [Widget FocusTarget]
+appView appState@(AppState {stateFiles, stateCwd}) = [ui]
where
+ ui :: Widget FocusTarget
ui = vBox [vLimit 1 header, box, vLimit 1 cmdline]
header = str stateCwd
- cmdline = str "Item " <+> cur <+> str " of " <+> total
- cur = case L.listSelected stateFiles of
- Nothing -> str "-"
- Just i -> str (show (i + 1))
- total = str $ show $ Vec.length $ L.listElements stateFiles
+ cmdline = cmdlineView appState
+ box :: Widget FocusTarget
box = L.renderList fileItemView True stateFiles
-fileItemView :: Bool -> FileInfo -> Widget ()
-fileItemView sel (FileInfo {fileName, fileSize, fileType}) =
- let wrap w = if sel then withAttr selectedFileAttr w else w
- in wrap (str fileName) <+> str (" : " <> show fileSize <> " | " <> show fileType)
+fixedColumnsStr :: Int -> Widget n -> Widget n
+fixedColumnsStr w s = hLimit w $ padRight Max s
+
+fileItemView :: Bool -> FileInfo -> Widget FocusTarget
+fileItemView sel fileInfo@(FileInfo {fileSize, fileType}) =
+ hBox
+ [ fixedColumnsStr 5 (fileTypeView fileType),
+ fixedColumnsStr 7 (fileSizeView fileSize),
+ fileNameView sel fileInfo
+ ]
+ where
+ fileSizeView = str . prettyFileSize . fromIntegral
+ fileTypeView = str . showFileType
+ showFileType Directory = "dir"
+ showFileType SymbolicLink = "link"
+ showFileType UnixSocket = "sock"
+ showFileType NamedPipe = "pipe"
+ showFileType CharacterDevice = "cdev"
+ showFileType BlockDevice = "bdev"
+ showFileType RegularFile = "file"
+
+fileNameView :: Bool -> FileInfo -> Widget FocusTarget
+fileNameView True (FileInfo {fileName, fileType = Directory}) = withAttr directorySelectedAttr $ str $ fileName <> "/"
+fileNameView False (FileInfo {fileName, fileType = Directory}) = withAttr directoryAttr $ str $ fileName <> "/"
+fileNameView True (FileInfo {fileName}) = withAttr fileSelectedAttr $ str fileName
+fileNameView False (FileInfo {fileName}) = withAttr fileAttr $ str fileName
+
+cmdlineView :: AppState -> Widget FocusTarget
+cmdlineView (AppState {stateFocusTarget = FocusCmdline, stateCmdlineEditor}) =
+ str ":" <+> renderEditor (str . unlines) True stateCmdlineEditor
+cmdlineView (AppState {stateFiles}) =
+ hBox [str ":", padLeft Max $ padRight (Pad 1) posIndicator]
+ where
+ posIndicator = str $ cur <> "/" <> total
+ cur = case L.listSelected stateFiles of
+ Nothing -> "-"
+ Just n -> show (n + 1)
+ total = show $ Vec.length $ L.listElements stateFiles
+
+prettyFileSize :: Int64 -> String
+prettyFileSize i
+ | i >= 2 ^ (40 :: Int64) = format (i `divBy` (2 ** 40)) <> "T"
+ | i >= 2 ^ (30 :: Int64) = format (i `divBy` (2 ** 30)) <> "G"
+ | i >= 2 ^ (20 :: Int64) = format (i `divBy` (2 ** 20)) <> "M"
+ | i >= 2 ^ (10 :: Int64) = format (i `divBy` (2 ** 10)) <> "K"
+ | otherwise = show i
+ where
+ format = printf "%0.1f"
+ divBy :: Int64 -> Double -> Double
+ divBy a b = (fromIntegral a :: Double) / b