{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE EmptyDataDeriving #-}
module Hledger.UI.UITypes where
import Data.Text (Text)
import Data.Time.Calendar (Day)
import Brick.Widgets.List (List)
import Brick.Widgets.Edit (Editor)
import Lens.Micro.Platform (makeLenses)
import Text.Show.Functions ()
import Hledger
import Hledger.Cli (HasCliOpts(..))
import Hledger.UI.UIOptions
data AppEvent =
FileChange
| DateChange Day Day
deriving (AppEvent -> AppEvent -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AppEvent -> AppEvent -> Bool
$c/= :: AppEvent -> AppEvent -> Bool
== :: AppEvent -> AppEvent -> Bool
$c== :: AppEvent -> AppEvent -> Bool
Eq, Int -> AppEvent -> ShowS
[AppEvent] -> ShowS
AppEvent -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AppEvent] -> ShowS
$cshowList :: [AppEvent] -> ShowS
show :: AppEvent -> String
$cshow :: AppEvent -> String
showsPrec :: Int -> AppEvent -> ShowS
$cshowsPrec :: Int -> AppEvent -> ShowS
Show)
data UIState = UIState {
UIState -> UIOpts
astartupopts :: UIOpts
,UIState -> UIOpts
aopts :: UIOpts
,UIState -> Journal
ajournal :: Journal
,UIState -> [Screen]
aPrevScreens :: [Screen]
,UIState -> Screen
aScreen :: Screen
,UIState -> Mode
aMode :: Mode
} deriving (Int -> UIState -> ShowS
[UIState] -> ShowS
UIState -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [UIState] -> ShowS
$cshowList :: [UIState] -> ShowS
show :: UIState -> String
$cshow :: UIState -> String
showsPrec :: Int -> UIState -> ShowS
$cshowsPrec :: Int -> UIState -> ShowS
Show)
data Mode =
Normal
| Help
| Minibuffer Text (Editor String Name)
deriving (Int -> Mode -> ShowS
[Mode] -> ShowS
Mode -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Mode] -> ShowS
$cshowList :: [Mode] -> ShowS
show :: Mode -> String
$cshow :: Mode -> String
showsPrec :: Int -> Mode -> ShowS
$cshowsPrec :: Int -> Mode -> ShowS
Show,Mode -> Mode -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Mode -> Mode -> Bool
$c/= :: Mode -> Mode -> Bool
== :: Mode -> Mode -> Bool
$c== :: Mode -> Mode -> Bool
Eq)
instance Eq (Editor l n) where Editor l n
_ == :: Editor l n -> Editor l n -> Bool
== Editor l n
_ = Bool
True
data Name =
HelpDialog
| MinibufferEditor
|
| AccountsViewport
| AccountsList
| RegisterViewport
| RegisterList
| TransactionEditor
deriving (Eq Name
Name -> Name -> Bool
Name -> Name -> Ordering
Name -> Name -> Name
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Name -> Name -> Name
$cmin :: Name -> Name -> Name
max :: Name -> Name -> Name
$cmax :: Name -> Name -> Name
>= :: Name -> Name -> Bool
$c>= :: Name -> Name -> Bool
> :: Name -> Name -> Bool
$c> :: Name -> Name -> Bool
<= :: Name -> Name -> Bool
$c<= :: Name -> Name -> Bool
< :: Name -> Name -> Bool
$c< :: Name -> Name -> Bool
compare :: Name -> Name -> Ordering
$ccompare :: Name -> Name -> Ordering
Ord, Int -> Name -> ShowS
[Name] -> ShowS
Name -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Name] -> ShowS
$cshowList :: [Name] -> ShowS
show :: Name -> String
$cshow :: Name -> String
showsPrec :: Int -> Name -> ShowS
$cshowsPrec :: Int -> Name -> ShowS
Show, Name -> Name -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Name -> Name -> Bool
$c/= :: Name -> Name -> Bool
== :: Name -> Name -> Bool
$c== :: Name -> Name -> Bool
Eq)
data ScreenName =
Accounts
| CashScreen
| Balancesheet
| Incomestatement
deriving (Eq ScreenName
ScreenName -> ScreenName -> Bool
ScreenName -> ScreenName -> Ordering
ScreenName -> ScreenName -> ScreenName
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ScreenName -> ScreenName -> ScreenName
$cmin :: ScreenName -> ScreenName -> ScreenName
max :: ScreenName -> ScreenName -> ScreenName
$cmax :: ScreenName -> ScreenName -> ScreenName
>= :: ScreenName -> ScreenName -> Bool
$c>= :: ScreenName -> ScreenName -> Bool
> :: ScreenName -> ScreenName -> Bool
$c> :: ScreenName -> ScreenName -> Bool
<= :: ScreenName -> ScreenName -> Bool
$c<= :: ScreenName -> ScreenName -> Bool
< :: ScreenName -> ScreenName -> Bool
$c< :: ScreenName -> ScreenName -> Bool
compare :: ScreenName -> ScreenName -> Ordering
$ccompare :: ScreenName -> ScreenName -> Ordering
Ord, Int -> ScreenName -> ShowS
[ScreenName] -> ShowS
ScreenName -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ScreenName] -> ShowS
$cshowList :: [ScreenName] -> ShowS
show :: ScreenName -> String
$cshow :: ScreenName -> String
showsPrec :: Int -> ScreenName -> ShowS
$cshowsPrec :: Int -> ScreenName -> ShowS
Show, ScreenName -> ScreenName -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ScreenName -> ScreenName -> Bool
$c/= :: ScreenName -> ScreenName -> Bool
== :: ScreenName -> ScreenName -> Bool
$c== :: ScreenName -> ScreenName -> Bool
Eq)
data Screen =
MS MenuScreenState
| AS AccountsScreenState
| CS AccountsScreenState
| BS AccountsScreenState
| IS AccountsScreenState
| RS RegisterScreenState
| TS TransactionScreenState
| ES ErrorScreenState
deriving (Int -> Screen -> ShowS
[Screen] -> ShowS
Screen -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Screen] -> ShowS
$cshowList :: [Screen] -> ShowS
show :: Screen -> String
$cshow :: Screen -> String
showsPrec :: Int -> Screen -> ShowS
$cshowsPrec :: Int -> Screen -> ShowS
Show)
data AccountsLikeScreen = ALS (AccountsScreenState -> Screen) AccountsScreenState
deriving (Int -> AccountsLikeScreen -> ShowS
[AccountsLikeScreen] -> ShowS
AccountsLikeScreen -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AccountsLikeScreen] -> ShowS
$cshowList :: [AccountsLikeScreen] -> ShowS
show :: AccountsLikeScreen -> String
$cshow :: AccountsLikeScreen -> String
showsPrec :: Int -> AccountsLikeScreen -> ShowS
$cshowsPrec :: Int -> AccountsLikeScreen -> ShowS
Show)
toAccountsLikeScreen :: Screen -> Maybe AccountsLikeScreen
toAccountsLikeScreen :: Screen -> Maybe AccountsLikeScreen
toAccountsLikeScreen Screen
scr = case Screen
scr of
AS AccountsScreenState
ass -> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ (AccountsScreenState -> Screen)
-> AccountsScreenState -> AccountsLikeScreen
ALS AccountsScreenState -> Screen
AS AccountsScreenState
ass
CS AccountsScreenState
ass -> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ (AccountsScreenState -> Screen)
-> AccountsScreenState -> AccountsLikeScreen
ALS AccountsScreenState -> Screen
CS AccountsScreenState
ass
BS AccountsScreenState
ass -> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ (AccountsScreenState -> Screen)
-> AccountsScreenState -> AccountsLikeScreen
ALS AccountsScreenState -> Screen
BS AccountsScreenState
ass
IS AccountsScreenState
ass -> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ (AccountsScreenState -> Screen)
-> AccountsScreenState -> AccountsLikeScreen
ALS AccountsScreenState -> Screen
IS AccountsScreenState
ass
Screen
_ -> forall a. Maybe a
Nothing
fromAccountsLikeScreen :: AccountsLikeScreen -> Screen
fromAccountsLikeScreen :: AccountsLikeScreen -> Screen
fromAccountsLikeScreen (ALS AccountsScreenState -> Screen
scons AccountsScreenState
ass) = AccountsScreenState -> Screen
scons AccountsScreenState
ass
data = MSS {
MenuScreenState -> List Name MenuScreenItem
_mssList :: List Name MenuScreenItem
,MenuScreenState -> ()
_mssUnused :: ()
} deriving (Int -> MenuScreenState -> ShowS
[MenuScreenState] -> ShowS
MenuScreenState -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MenuScreenState] -> ShowS
$cshowList :: [MenuScreenState] -> ShowS
show :: MenuScreenState -> String
$cshow :: MenuScreenState -> String
showsPrec :: Int -> MenuScreenState -> ShowS
$cshowsPrec :: Int -> MenuScreenState -> ShowS
Show)
data AccountsScreenState = ASS {
AccountsScreenState -> Text
_assSelectedAccount :: AccountName
,AccountsScreenState -> List Name AccountsScreenItem
_assList :: List Name AccountsScreenItem
} deriving (Int -> AccountsScreenState -> ShowS
[AccountsScreenState] -> ShowS
AccountsScreenState -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AccountsScreenState] -> ShowS
$cshowList :: [AccountsScreenState] -> ShowS
show :: AccountsScreenState -> String
$cshow :: AccountsScreenState -> String
showsPrec :: Int -> AccountsScreenState -> ShowS
$cshowsPrec :: Int -> AccountsScreenState -> ShowS
Show)
data RegisterScreenState = {
:: AccountName
, :: Bool
, :: List Name RegisterScreenItem
} deriving (Int -> RegisterScreenState -> ShowS
[RegisterScreenState] -> ShowS
RegisterScreenState -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RegisterScreenState] -> ShowS
$cshowList :: [RegisterScreenState] -> ShowS
show :: RegisterScreenState -> String
$cshow :: RegisterScreenState -> String
showsPrec :: Int -> RegisterScreenState -> ShowS
$cshowsPrec :: Int -> RegisterScreenState -> ShowS
Show)
data TransactionScreenState = TSS {
TransactionScreenState -> Text
_tssAccount :: AccountName
,TransactionScreenState -> [NumberedTransaction]
_tssTransactions :: [NumberedTransaction]
,TransactionScreenState -> NumberedTransaction
_tssTransaction :: NumberedTransaction
} deriving (Int -> TransactionScreenState -> ShowS
[TransactionScreenState] -> ShowS
TransactionScreenState -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TransactionScreenState] -> ShowS
$cshowList :: [TransactionScreenState] -> ShowS
show :: TransactionScreenState -> String
$cshow :: TransactionScreenState -> String
showsPrec :: Int -> TransactionScreenState -> ShowS
$cshowsPrec :: Int -> TransactionScreenState -> ShowS
Show)
data ErrorScreenState = ESS {
ErrorScreenState -> String
_essError :: String
,ErrorScreenState -> ()
_essUnused :: ()
} deriving (Int -> ErrorScreenState -> ShowS
[ErrorScreenState] -> ShowS
ErrorScreenState -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ErrorScreenState] -> ShowS
$cshowList :: [ErrorScreenState] -> ShowS
show :: ErrorScreenState -> String
$cshow :: ErrorScreenState -> String
showsPrec :: Int -> ErrorScreenState -> ShowS
$cshowsPrec :: Int -> ErrorScreenState -> ShowS
Show)
data = {
MenuScreenItem -> Text
msItemScreenName :: Text
,MenuScreenItem -> ScreenName
msItemScreen :: ScreenName
} deriving (Int -> MenuScreenItem -> ShowS
[MenuScreenItem] -> ShowS
MenuScreenItem -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MenuScreenItem] -> ShowS
$cshowList :: [MenuScreenItem] -> ShowS
show :: MenuScreenItem -> String
$cshow :: MenuScreenItem -> String
showsPrec :: Int -> MenuScreenItem -> ShowS
$cshowsPrec :: Int -> MenuScreenItem -> ShowS
Show)
data AccountsScreenItem = AccountsScreenItem {
AccountsScreenItem -> Int
asItemIndentLevel :: Int
,AccountsScreenItem -> Text
asItemAccountName :: AccountName
,AccountsScreenItem -> Text
asItemDisplayAccountName :: AccountName
,AccountsScreenItem -> Maybe MixedAmount
asItemMixedAmount :: Maybe MixedAmount
} deriving (Int -> AccountsScreenItem -> ShowS
[AccountsScreenItem] -> ShowS
AccountsScreenItem -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AccountsScreenItem] -> ShowS
$cshowList :: [AccountsScreenItem] -> ShowS
show :: AccountsScreenItem -> String
$cshow :: AccountsScreenItem -> String
showsPrec :: Int -> AccountsScreenItem -> ShowS
$cshowsPrec :: Int -> AccountsScreenItem -> ShowS
Show)
data RegisterScreenItem = RegisterScreenItem {
RegisterScreenItem -> Text
rsItemDate :: Text
,RegisterScreenItem -> Status
rsItemStatus :: Status
,RegisterScreenItem -> Text
rsItemDescription :: Text
,RegisterScreenItem -> Text
rsItemOtherAccounts :: Text
,RegisterScreenItem -> WideBuilder
rsItemChangeAmount :: WideBuilder
,RegisterScreenItem -> WideBuilder
rsItemBalanceAmount :: WideBuilder
,RegisterScreenItem -> Transaction
rsItemTransaction :: Transaction
}
deriving (Int -> RegisterScreenItem -> ShowS
[RegisterScreenItem] -> ShowS
RegisterScreenItem -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RegisterScreenItem] -> ShowS
$cshowList :: [RegisterScreenItem] -> ShowS
show :: RegisterScreenItem -> String
$cshow :: RegisterScreenItem -> String
showsPrec :: Int -> RegisterScreenItem -> ShowS
$cshowsPrec :: Int -> RegisterScreenItem -> ShowS
Show)
type NumberedTransaction = (Integer, Transaction)
makeLenses ''MenuScreenState
makeLenses ''AccountsScreenState
makeLenses ''TransactionScreenState
makeLenses ''ErrorScreenState
errorWrongScreenType :: String -> a
errorWrongScreenType :: forall a. String -> a
errorWrongScreenType String
lbl =
forall a. String -> a
error' ([String] -> String
unwords [String
lbl, String
"called with wrong screen type, should not happen"])
uioptslens :: (UIOpts -> f UIOpts) -> UIState -> f UIState
uioptslens UIOpts -> f UIOpts
f UIState
ui = (\UIOpts
x -> UIState
ui{aopts :: UIOpts
aopts=UIOpts
x}) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> UIOpts -> f UIOpts
f (UIState -> UIOpts
aopts UIState
ui)
instance HasCliOpts UIState where
cliOpts :: Lens' UIState CliOpts
cliOpts = forall {f :: * -> *}.
Functor f =>
(UIOpts -> f UIOpts) -> UIState -> f UIState
uioptslensforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall c. HasCliOpts c => Lens' c CliOpts
cliOpts
instance HasInputOpts UIState where
inputOpts :: Lens' UIState InputOpts
inputOpts = forall {f :: * -> *}.
Functor f =>
(UIOpts -> f UIOpts) -> UIState -> f UIState
uioptslensforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall c. HasInputOpts c => Lens' c InputOpts
inputOpts
instance HasBalancingOpts UIState where
balancingOpts :: Lens' UIState BalancingOpts
balancingOpts = forall {f :: * -> *}.
Functor f =>
(UIOpts -> f UIOpts) -> UIState -> f UIState
uioptslensforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall c. HasBalancingOpts c => Lens' c BalancingOpts
balancingOpts
instance HasReportSpec UIState where
reportSpec :: Lens' UIState ReportSpec
reportSpec = forall {f :: * -> *}.
Functor f =>
(UIOpts -> f UIOpts) -> UIState -> f UIState
uioptslensforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall c. HasReportSpec c => Lens' c ReportSpec
reportSpec
instance HasReportOptsNoUpdate UIState where
reportOptsNoUpdate :: Lens' UIState ReportOpts
reportOptsNoUpdate = forall {f :: * -> *}.
Functor f =>
(UIOpts -> f UIOpts) -> UIState -> f UIState
uioptslensforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall c. HasReportOptsNoUpdate c => Lens' c ReportOpts
reportOptsNoUpdate
instance HasReportOpts UIState where
reportOpts :: ReportableLens' UIState ReportOpts
reportOpts = forall {f :: * -> *}.
Functor f =>
(UIOpts -> f UIOpts) -> UIState -> f UIState
uioptslensforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall a. HasReportOpts a => ReportableLens' a ReportOpts
reportOpts