aboutsummaryrefslogtreecommitdiff
path: root/lib/Daffm/Types.hs
blob: dc6ca366c5b3dfbfa1ee6f00b207ff6b36eb444c (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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
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 K
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
  }
  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 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
  | 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
      }

defaultConfiguration :: Configuration
defaultConfiguration =
  Configuration
    { configKeymap = defaultKeymaps,
      configOpener = Nothing,
      configTheme = Map.empty,
      configExtend = Nothing
    }

defaultKeymaps :: Keymap
defaultKeymaps =
  Map.fromList
    [ ([K.KChar 'q'], CmdQuit),
      ([K.KChar 'r', K.KChar 'r'], CmdReload),
      ([K.KChar '!'], CmdSetCmdline "!"),
      ([K.KChar '/'], CmdSetCmdline "search "),
      ([K.KChar 'n'], CmdSearchNext 1),
      ([K.KChar 'N'], CmdSearchNext (-1)),
      ([K.KChar ':'], CmdEnterCmdline),
      ([K.KChar 'l'], CmdOpenSelection),
      ([K.KChar 'h'], CmdGoBack),
      ([K.KEnter], CmdOpenSelection),
      ([K.KBS], CmdGoBack),
      ([K.KChar 'v'], CmdToggleSelection),
      ([K.KChar '\t'], CmdToggleSelection),
      ([K.KChar 'C'], CmdClearSelection),
      ([K.KChar '~'], CmdChangeDir "~"),
      ([K.KChar '$'], CmdShell False "$SHELL"),
      ([K.KChar 'g', K.KChar 'x'], CmdShell False "!xdg-open % >/dev/null 2>&1"),
      ([K.KChar 'g', K.KChar 'h'], CmdChangeDir "~"),
      ([K.KChar 'g', K.KChar 'c', K.KChar 'f', K.KChar 'g'], CmdChangeDir "~/.config/daffm")
    ]