From dd048c390f8762e7701572c4e319f22df06aeb75 Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Fri, 3 Oct 2025 15:29:11 +0530 Subject: Add file mode string in listing --- lib/Daffm/View.hs | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) (limited to 'lib/Daffm/View.hs') diff --git a/lib/Daffm/View.hs b/lib/Daffm/View.hs index 3066c93..443d017 100644 --- a/lib/Daffm/View.hs +++ b/lib/Daffm/View.hs @@ -8,6 +8,8 @@ import Daffm.Attrs (directoryAttr, directorySelectedAttr, fileAttr, fileSelected import Daffm.Types (AppState (..), FileInfo (..), FileType (..), FocusTarget (..)) import Data.Int (Int64) import qualified Data.Vector as Vec +import System.Posix.Types (FileMode) +import qualified System.PosixCompat as Posix import Text.Printf (printf) appView :: AppState -> [Widget FocusTarget] @@ -25,15 +27,17 @@ headerView :: AppState -> Widget n headerView (AppState {stateCwd}) = str stateCwd fileItemView :: Bool -> FileInfo -> Widget FocusTarget -fileItemView sel fileInfo@(FileInfo {fileSize, fileType}) = +fileItemView sel fileInfo@(FileInfo {fileSize, fileType, fileMode}) = hBox - [ hFixed 6 (fileTypeView fileType), - hFixed 7 (fileSizeView fileSize), + [ hFixed 10 $ fileModeView fileMode, + hFixed 6 $ fileTypeView fileType, + hFixed 7 $ fileSizeView fileSize, fileNameView sel fileInfo ] where fileSizeView = str . prettyFileSize . fromIntegral fileTypeView = str . showFileType + fileModeView = str . showFileMode showFileType Directory = "dir" showFileType SymbolicLink = "link" showFileType UnixSocket = "sock" @@ -43,6 +47,22 @@ fileItemView sel fileInfo@(FileInfo {fileSize, fileType}) = showFileType RegularFile = "file" showFileType UnknownFileType = "?" +showFileMode :: FileMode -> String +showFileMode mode = permchars + where + perm m c = if Posix.intersectFileModes mode m == m then c else '-' + permchars = + [ perm Posix.ownerReadMode 'r', + perm Posix.ownerWriteMode 'w', + perm Posix.ownerExecuteMode 'x', + perm Posix.groupReadMode 'r', + perm Posix.groupWriteMode 'w', + perm Posix.groupExecuteMode 'x', + perm Posix.otherReadMode 'r', + perm Posix.otherWriteMode 'w', + perm Posix.otherExecuteMode 'x' + ] + 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 <> "/" -- cgit v1.3.1