aboutsummaryrefslogtreecommitdiff
path: root/lib/Daffm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Daffm')
-rw-r--r--lib/Daffm/Attrs.hs17
-rw-r--r--lib/Daffm/Types.hs29
-rw-r--r--lib/Daffm/View.hs25
3 files changed, 71 insertions, 0 deletions
diff --git a/lib/Daffm/Attrs.hs b/lib/Daffm/Attrs.hs
new file mode 100644
index 0000000..93a4163
--- /dev/null
+++ b/lib/Daffm/Attrs.hs
@@ -0,0 +1,17 @@
+module Daffm.Attrs where
+
+import qualified Brick.AttrMap as A
+import Brick.Util (fg)
+import qualified Brick.Widgets.List as L
+import qualified Graphics.Vty as V
+
+selectedFileAttr :: A.AttrName
+selectedFileAttr = A.attrName "selected-file"
+
+appAttrMap :: A.AttrMap
+appAttrMap =
+ A.attrMap
+ V.defAttr
+ [ (L.listAttr, fg V.white),
+ (selectedFileAttr, fg V.cyan)
+ ]
diff --git a/lib/Daffm/Types.hs b/lib/Daffm/Types.hs
new file mode 100644
index 0000000..2a8e97d
--- /dev/null
+++ b/lib/Daffm/Types.hs
@@ -0,0 +1,29 @@
+module Daffm.Types where
+
+import qualified Brick.Widgets.List as L
+import System.Posix.Types (FileOffset)
+
+data FileType
+ = RegularFile
+ | BlockDevice
+ | CharacterDevice
+ | NamedPipe
+ | Directory
+ | SymbolicLink
+ | UnixSocket
+ deriving (Show)
+
+data FileInfo = FileInfo
+ { fileName :: String,
+ filePath :: FilePath,
+ fileSize :: FileOffset,
+ fileType :: FileType
+ }
+ deriving (Show)
+
+data AppState = AppState
+ { stateFiles :: L.List () FileInfo,
+ stateCwd :: FilePath,
+ stateParentDir :: FilePath
+ }
+ deriving (Show)
diff --git a/lib/Daffm/View.hs b/lib/Daffm/View.hs
new file mode 100644
index 0000000..02529ac
--- /dev/null
+++ b/lib/Daffm/View.hs
@@ -0,0 +1,25 @@
+module Daffm.View where
+
+import Brick.Types (Widget)
+import Brick.Widgets.Core (str, vBox, vLimit, withAttr, (<+>))
+import qualified Brick.Widgets.List as L
+import Daffm.Attrs (selectedFileAttr)
+import Daffm.Types (AppState (..), FileInfo (..))
+import qualified Data.Vector as Vec
+
+appView :: AppState -> [Widget ()]
+appView (AppState {stateFiles, stateCwd}) = [ui]
+ where
+ 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
+ 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)