aboutsummaryrefslogtreecommitdiff
path: root/lib/Daffm/Types.hs
blob: 15c284b36819c87c1f389b3e45fd4f8b67e9b24f (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
116
117
118
119
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,
    stateCustomCommands :: Map.Map Text.Text Command,
    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 CustomArgs = Text.Text

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
  | CmdCustom Text.Text CustomArgs
  | 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),
    configCommands :: !(Map.Map Text.Text Command)
  }
  deriving (Show)

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

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