aboutsummaryrefslogtreecommitdiff
path: root/lib/Daffm/Types.hs
blob: d9dd977a1629c5b1d372b64ded14de7f2e9814b3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
module Daffm.Types where

import Brick (EventM)
import qualified Brick.Widgets.Edit as Editor
import qualified Brick.Widgets.List as L
import Control.Applicative ((<|>))
import qualified Data.Map as Map
import qualified Data.Set as Set
import qualified Data.Text as Text
import qualified Data.Vector as Vec
import qualified Graphics.Vty as V
import System.Posix.Types (FileMode, FileOffset)

data FileType
  = RegularFile
  | BlockDevice
  | CharacterDevice
  | NamedPipe
  | Directory
  | SymbolicLink
  | UnixSocket
  | UnknownFileType
  deriving (Show)

type FilePathText = Text.Text

data FileInfo = FileInfo
  { fileName :: Text.Text,
    filePath :: FilePathText,
    fileSize :: FileOffset,
    fileMode :: FileMode,
    fileType :: FileType,
    fileLinkType :: Maybe FileType,
    fileLinkTarget :: Maybe FilePathText
  }
  deriving (Show)

data FocusTarget = FocusCmdline | FocusMain deriving (Show, Eq, Ord)

data AppState = AppState
  { stateCmdlineEditor :: CmdlineEditor,
    stateCwd :: FilePathText,
    stateFileSelections :: Set.Set FilePathText,
    stateFiles :: L.List FocusTarget FileInfo,
    stateFocusTarget :: FocusTarget,
    stateKeyMap :: Keymap,
    stateKeySequence :: KeySequence,
    stateListPositionHistory :: Map.Map Text.Text Int,
    stateOpenerScript :: Maybe Text.Text,
    stateSearchTerm :: Maybe Text.Text,
    stateSearchMatches :: Vec.Vector Int,
    stateSearchIndex :: Int
  }
  deriving (Show)

type AppEvent = EventM FocusTarget AppState

type CmdlineEditor = Editor.Editor Text.Text FocusTarget

data KeyMatchResult = MatchSuccess Command | MatchPartial | MatchFailure
  deriving (Show, Eq)

data MoveInc = MoveDown Int | MoveUp Int | MoveTo Int | MoveToEnd
  deriving (Show, Eq)

data Command
  = CmdShell Bool Text.Text
  | CmdCommandShell Text.Text
  | CmdQuit
  | CmdSetCmdline Text.Text
  | CmdEnterCmdline
  | CmdLeaveCmdline
  | CmdOpenSelection
  | CmdChangeDir Text.Text
  | CmdReload
  | CmdToggleSelection
  | CmdClearSelection
  | CmdGoBack
  | CmdChain [Command]
  | CmdSearch Text.Text
  | CmdSearchNext Int
  | CmdKeymapSet [Key] Command
  | CmdMove MoveInc
  | CmdNoop
  deriving (Show, Eq)

type Key = V.Key

type Keymap = Map.Map [Key] Command

type KeySequence = [Key]

data Configuration = Configuration
  { configKeymap :: !Keymap,
    configOpener :: !(Maybe Text.Text),
    configExtend :: !(Maybe Text.Text),
    configTheme :: !(Map.Map Text.Text Text.Text)
  }
  deriving (Show)

instance Semigroup Configuration where
  a <> b =
    a
      { configKeymap = configKeymap a <> configKeymap b,
        configOpener = configOpener a <|> configOpener b,
        configTheme = configTheme a <> configTheme b
      }

data Args = Args
  { argsDirOrFile :: Maybe Text.Text,
    argsConfigFile :: Maybe FilePath,
    argsHelp :: Bool
  }
  deriving (Show)