diff options
| author | Akshay Nair <phenax5@gmail.com> | 2025-10-02 23:09:36 +0530 |
|---|---|---|
| committer | Akshay Nair <phenax5@gmail.com> | 2025-10-02 23:21:13 +0530 |
| commit | 7fc70c52f322d451e8295a12a6fbaf869a2d9a2b (patch) | |
| tree | 14dfe42e7e05890054eb3300ad7fa8f90f3adba5 /lib/Daffm/View.hs | |
| parent | 51e29e21ca118ec690f20eaaf7b2b42c0a90e5e6 (diff) | |
| download | daffm-7fc70c52f322d451e8295a12a6fbaf869a2d9a2b.tar.gz daffm-7fc70c52f322d451e8295a12a6fbaf869a2d9a2b.zip | |
Add cmdline editor, focus switch + styling
Diffstat (limited to '')
| -rw-r--r-- | lib/Daffm/View.hs | 75 |
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 |
