{-# LANGUAGE DuplicateRecordFields #-}
{-# OPTIONS_GHC -Wno-orphans #-}
module Hydra.TUI.Drawing where
import Hydra.Prelude hiding (Down, State)
import Brick
import Brick.Forms (formState, renderForm)
import Brick.Widgets.Border (borderWithLabel)
import Brick.Widgets.Border.Style (unicodeRounded)
import Data.Text qualified as T
import Hydra.API.ServerOutput (FanoutProgressMode (..))
import Hydra.Cardano.Api hiding (Active, getVerificationKey)
import Hydra.Chain.CardanoClient (CardanoClient (..))
import Hydra.Client (Client (..))
import Hydra.TUI.Config (Theme (..))
import Hydra.TUI.Drawing.EventHistoryTab (drawEventHistoryTab)
import Hydra.TUI.Drawing.FundsTab (drawFocusPanel, drawFundsTab, drawRecoverFormWithDetail)
import Hydra.TUI.Drawing.MainTab (drawMainTab)
import Hydra.TUI.Drawing.Utils (scrollableViewport)
import Hydra.TUI.Logging.Types (EventHistoryFilter (..))
import Hydra.TUI.Model
import Hydra.TUI.Style
import Hydra.Tx.Crypto (getVerificationKey)
import Lens.Micro ((^.), (^?))
draw :: CardanoClient -> Client Tx IO -> RootState -> [Widget Name]
draw :: CardanoClient -> Client Tx IO -> RootState -> [Widget Name]
draw CardanoClient
cardanoClient Client Tx IO
hydraClient RootState
s =
Widget Name -> [Widget Name]
forall a. a -> [a]
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Widget Name -> [Widget Name]) -> Widget Name -> [Widget Name]
forall a b. (a -> b) -> a -> b
$
BorderStyle -> Widget Name -> Widget Name
forall n. BorderStyle -> Widget n -> Widget n
withBorderStyle BorderStyle
unicodeRounded (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$
Widget Name -> Widget Name
forall n. Widget n -> Widget n
joinBorders (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$
[Widget Name] -> Widget Name
forall n. [Widget n] -> Widget n
vBox
[ ActiveTab -> Name -> Name -> Widget Name
forall n. ActiveTab -> Name -> Name -> Widget n
drawTabBar (RootState
s RootState -> Getting ActiveTab RootState ActiveTab -> ActiveTab
forall s a. s -> Getting a s a -> a
^. Getting ActiveTab RootState ActiveTab
Lens' RootState ActiveTab
activeTabL) (RootState -> Name
modalTabLabel RootState
s) Name
fundsLabel
, CardanoClient -> Client Tx IO -> RootState -> Widget Name
drawTabContent CardanoClient
cardanoClient Client Tx IO
hydraClient RootState
s
, Int -> Widget Name -> Widget Name
forall n. Int -> Widget n -> Widget n
vLimit Int
1 (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$
Padding -> Widget Name -> Widget Name
forall n. Padding -> Widget n -> Widget n
padLeft (Int -> Padding
Pad Int
2) (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$
case RootState
s RootState
-> Getting (Maybe Name) RootState (Maybe Name) -> Maybe Name
forall s a. s -> Getting a s a -> a
^. Getting (Maybe Name) RootState (Maybe Name)
Lens' RootState (Maybe Name)
pendingActionL of
Maybe Name
Nothing -> Char -> Widget Name
forall n. Char -> Widget n
fill Char
' '
Just Name
msg -> AttrName -> Widget Name -> Widget Name
forall n. AttrName -> Widget n -> Widget n
withAttr AttrName
pendingA (Name -> Widget Name
forall n. Name -> Widget n
txt Name
msg) Widget Name -> Widget Name -> Widget Name
forall n. Widget n -> Widget n -> Widget n
<+> Char -> Widget Name
forall n. Char -> Widget n
fill Char
' '
, Int -> Widget Name -> Widget Name
forall n. Int -> Widget n -> Widget n
padLeftRight Int
2 (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$ RootState -> Widget Name
forall n. RootState -> Widget n
drawActionBar RootState
s
]
where
fundsLabel :: Name
fundsLabel =
let hasPendingCommit :: Bool
hasPendingCommit = case RootState
s RootState
-> Getting (First [PendingIncrement]) RootState [PendingIncrement]
-> Maybe [PendingIncrement]
forall s a. s -> Getting (First a) s a -> Maybe a
^? (ConnectedState -> Const (First [PendingIncrement]) ConnectedState)
-> RootState -> Const (First [PendingIncrement]) RootState
Lens' RootState ConnectedState
connectedStateL ((ConnectedState
-> Const (First [PendingIncrement]) ConnectedState)
-> RootState -> Const (First [PendingIncrement]) RootState)
-> (([PendingIncrement]
-> Const (First [PendingIncrement]) [PendingIncrement])
-> ConnectedState
-> Const (First [PendingIncrement]) ConnectedState)
-> Getting (First [PendingIncrement]) RootState [PendingIncrement]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Connection -> Const (First [PendingIncrement]) Connection)
-> ConnectedState
-> Const (First [PendingIncrement]) ConnectedState
Traversal' ConnectedState Connection
connectionL ((Connection -> Const (First [PendingIncrement]) Connection)
-> ConnectedState
-> Const (First [PendingIncrement]) ConnectedState)
-> (([PendingIncrement]
-> Const (First [PendingIncrement]) [PendingIncrement])
-> Connection -> Const (First [PendingIncrement]) Connection)
-> ([PendingIncrement]
-> Const (First [PendingIncrement]) [PendingIncrement])
-> ConnectedState
-> Const (First [PendingIncrement]) ConnectedState
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HeadState -> Const (First [PendingIncrement]) HeadState)
-> Connection -> Const (First [PendingIncrement]) Connection
Lens' Connection HeadState
headStateL ((HeadState -> Const (First [PendingIncrement]) HeadState)
-> Connection -> Const (First [PendingIncrement]) Connection)
-> (([PendingIncrement]
-> Const (First [PendingIncrement]) [PendingIncrement])
-> HeadState -> Const (First [PendingIncrement]) HeadState)
-> ([PendingIncrement]
-> Const (First [PendingIncrement]) [PendingIncrement])
-> Connection
-> Const (First [PendingIncrement]) Connection
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ActiveLink -> Const (First [PendingIncrement]) ActiveLink)
-> HeadState -> Const (First [PendingIncrement]) HeadState
Traversal' HeadState ActiveLink
activeLinkL ((ActiveLink -> Const (First [PendingIncrement]) ActiveLink)
-> HeadState -> Const (First [PendingIncrement]) HeadState)
-> (([PendingIncrement]
-> Const (First [PendingIncrement]) [PendingIncrement])
-> ActiveLink -> Const (First [PendingIncrement]) ActiveLink)
-> ([PendingIncrement]
-> Const (First [PendingIncrement]) [PendingIncrement])
-> HeadState
-> Const (First [PendingIncrement]) HeadState
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([PendingIncrement]
-> Const (First [PendingIncrement]) [PendingIncrement])
-> ActiveLink -> Const (First [PendingIncrement]) ActiveLink
Lens' ActiveLink [PendingIncrement]
pendingIncrementsL of
Just (PendingIncrement
_ : [PendingIncrement]
_) -> Bool
True
Maybe [PendingIncrement]
_ -> Bool
False
hasPendingDecommit :: Bool
hasPendingDecommit = case RootState
s RootState -> Getting (First UTxO) RootState UTxO -> Maybe UTxO
forall s a. s -> Getting (First a) s a -> Maybe a
^? (ConnectedState -> Const (First UTxO) ConnectedState)
-> RootState -> Const (First UTxO) RootState
Lens' RootState ConnectedState
connectedStateL ((ConnectedState -> Const (First UTxO) ConnectedState)
-> RootState -> Const (First UTxO) RootState)
-> ((UTxO -> Const (First UTxO) UTxO)
-> ConnectedState -> Const (First UTxO) ConnectedState)
-> Getting (First UTxO) RootState UTxO
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Connection -> Const (First UTxO) Connection)
-> ConnectedState -> Const (First UTxO) ConnectedState
Traversal' ConnectedState Connection
connectionL ((Connection -> Const (First UTxO) Connection)
-> ConnectedState -> Const (First UTxO) ConnectedState)
-> ((UTxO -> Const (First UTxO) UTxO)
-> Connection -> Const (First UTxO) Connection)
-> (UTxO -> Const (First UTxO) UTxO)
-> ConnectedState
-> Const (First UTxO) ConnectedState
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HeadState -> Const (First UTxO) HeadState)
-> Connection -> Const (First UTxO) Connection
Lens' Connection HeadState
headStateL ((HeadState -> Const (First UTxO) HeadState)
-> Connection -> Const (First UTxO) Connection)
-> ((UTxO -> Const (First UTxO) UTxO)
-> HeadState -> Const (First UTxO) HeadState)
-> (UTxO -> Const (First UTxO) UTxO)
-> Connection
-> Const (First UTxO) Connection
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ActiveLink -> Const (First UTxO) ActiveLink)
-> HeadState -> Const (First UTxO) HeadState
Traversal' HeadState ActiveLink
activeLinkL ((ActiveLink -> Const (First UTxO) ActiveLink)
-> HeadState -> Const (First UTxO) HeadState)
-> ((UTxO -> Const (First UTxO) UTxO)
-> ActiveLink -> Const (First UTxO) ActiveLink)
-> (UTxO -> Const (First UTxO) UTxO)
-> HeadState
-> Const (First UTxO) HeadState
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UTxO -> Const (First UTxO) UTxO)
-> ActiveLink -> Const (First UTxO) ActiveLink
Lens' ActiveLink UTxO
pendingUTxOToDecommitL of
Just UTxO
u | UTxO
u UTxO -> UTxO -> Bool
forall a. Eq a => a -> a -> Bool
/= UTxO
forall a. Monoid a => a
mempty -> Bool
True
Maybe UTxO
_ -> Bool
False
arrows :: Name
arrows = (if Bool
hasPendingCommit then Name
"↑" else Name
"") Name -> Name -> Name
forall a. Semigroup a => a -> a -> a
<> (if Bool
hasPendingDecommit then Name
"↓" else Name
"")
in if Name -> Bool
T.null Name
arrows then Name
"Funds" else Name
"Funds " Name -> Name -> Name
forall a. Semigroup a => a -> a -> a
<> Name
arrows
drawTabBar :: ActiveTab -> Text -> Text -> Widget n
drawTabBar :: forall n. ActiveTab -> Name -> Name -> Widget n
drawTabBar ActiveTab
active Name
modalTabName Name
fundsLabel =
Padding -> Widget n -> Widget n
forall n. Padding -> Widget n -> Widget n
padLeft (Int -> Padding
Pad Int
1) (Widget n -> Widget n) -> Widget n -> Widget n
forall a b. (a -> b) -> a -> b
$
[Widget n] -> Widget n
forall n. [Widget n] -> Widget n
hBox ([Widget n] -> Widget n) -> [Widget n] -> Widget n
forall a b. (a -> b) -> a -> b
$
[ ActiveTab -> Name -> ActiveTab -> Widget n
forall n. ActiveTab -> Name -> ActiveTab -> Widget n
drawTab ActiveTab
MainTab Name
"Main" ActiveTab
active
, Name -> Widget n
forall n. Name -> Widget n
txt Name
" "
, ActiveTab -> Name -> ActiveTab -> Widget n
forall n. ActiveTab -> Name -> ActiveTab -> Widget n
drawTab ActiveTab
FundsTab Name
fundsLabel ActiveTab
active
, Name -> Widget n
forall n. Name -> Widget n
txt Name
" "
, ActiveTab -> Name -> ActiveTab -> Widget n
forall n. ActiveTab -> Name -> ActiveTab -> Widget n
drawTab ActiveTab
EventHistoryTab Name
"Event History" ActiveTab
active
]
[Widget n] -> [Widget n] -> [Widget n]
forall a. [a] -> [a] -> [a]
++ case ActiveTab
active of
ActiveTab
ModalTab -> [Name -> Widget n
forall n. Name -> Widget n
txt Name
" ", ActiveTab -> Name -> ActiveTab -> Widget n
forall n. ActiveTab -> Name -> ActiveTab -> Widget n
drawTab ActiveTab
ModalTab Name
modalTabName ActiveTab
active]
ActiveTab
_ -> []
modalTabLabel :: RootState -> Text
modalTabLabel :: RootState -> Name
modalTabLabel RootState
s
| Maybe (TxIdRadioFieldForm (HydraEvent Tx) Name) -> Bool
forall a. Maybe a -> Bool
isJust (RootState
s RootState
-> Getting
(Maybe (TxIdRadioFieldForm (HydraEvent Tx) Name))
RootState
(Maybe (TxIdRadioFieldForm (HydraEvent Tx) Name))
-> Maybe (TxIdRadioFieldForm (HydraEvent Tx) Name)
forall s a. s -> Getting a s a -> a
^. Getting
(Maybe (TxIdRadioFieldForm (HydraEvent Tx) Name))
RootState
(Maybe (TxIdRadioFieldForm (HydraEvent Tx) Name))
Lens' RootState (Maybe (TxIdRadioFieldForm (HydraEvent Tx) Name))
recoveryFormL) = Name
"Recover"
| Maybe (UTxOCheckboxForm (HydraEvent Tx) Name) -> Bool
forall a. Maybe a -> Bool
isJust (RootState
s RootState
-> Getting
(Maybe (UTxOCheckboxForm (HydraEvent Tx) Name))
RootState
(Maybe (UTxOCheckboxForm (HydraEvent Tx) Name))
-> Maybe (UTxOCheckboxForm (HydraEvent Tx) Name)
forall s a. s -> Getting a s a -> a
^. Getting
(Maybe (UTxOCheckboxForm (HydraEvent Tx) Name))
RootState
(Maybe (UTxOCheckboxForm (HydraEvent Tx) Name))
Lens' RootState (Maybe (UTxOCheckboxForm (HydraEvent Tx) Name))
fanoutSelectionFormL) = Name
"Partial fanout"
| Bool
otherwise = case RootState
s RootState
-> Getting (First OpenScreen) RootState OpenScreen
-> Maybe OpenScreen
forall s a. s -> Getting (First a) s a -> Maybe a
^? (ConnectedState -> Const (First OpenScreen) ConnectedState)
-> RootState -> Const (First OpenScreen) RootState
Lens' RootState ConnectedState
connectedStateL ((ConnectedState -> Const (First OpenScreen) ConnectedState)
-> RootState -> Const (First OpenScreen) RootState)
-> ((OpenScreen -> Const (First OpenScreen) OpenScreen)
-> ConnectedState -> Const (First OpenScreen) ConnectedState)
-> Getting (First OpenScreen) RootState OpenScreen
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Connection -> Const (First OpenScreen) Connection)
-> ConnectedState -> Const (First OpenScreen) ConnectedState
Traversal' ConnectedState Connection
connectionL ((Connection -> Const (First OpenScreen) Connection)
-> ConnectedState -> Const (First OpenScreen) ConnectedState)
-> ((OpenScreen -> Const (First OpenScreen) OpenScreen)
-> Connection -> Const (First OpenScreen) Connection)
-> (OpenScreen -> Const (First OpenScreen) OpenScreen)
-> ConnectedState
-> Const (First OpenScreen) ConnectedState
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HeadState -> Const (First OpenScreen) HeadState)
-> Connection -> Const (First OpenScreen) Connection
Lens' Connection HeadState
headStateL ((HeadState -> Const (First OpenScreen) HeadState)
-> Connection -> Const (First OpenScreen) Connection)
-> ((OpenScreen -> Const (First OpenScreen) OpenScreen)
-> HeadState -> Const (First OpenScreen) HeadState)
-> (OpenScreen -> Const (First OpenScreen) OpenScreen)
-> Connection
-> Const (First OpenScreen) Connection
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ActiveLink -> Const (First OpenScreen) ActiveLink)
-> HeadState -> Const (First OpenScreen) HeadState
Traversal' HeadState ActiveLink
activeLinkL ((ActiveLink -> Const (First OpenScreen) ActiveLink)
-> HeadState -> Const (First OpenScreen) HeadState)
-> ((OpenScreen -> Const (First OpenScreen) OpenScreen)
-> ActiveLink -> Const (First OpenScreen) ActiveLink)
-> (OpenScreen -> Const (First OpenScreen) OpenScreen)
-> HeadState
-> Const (First OpenScreen) HeadState
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ActiveHeadState -> Const (First OpenScreen) ActiveHeadState)
-> ActiveLink -> Const (First OpenScreen) ActiveLink
Lens' ActiveLink ActiveHeadState
activeHeadStateL ((ActiveHeadState -> Const (First OpenScreen) ActiveHeadState)
-> ActiveLink -> Const (First OpenScreen) ActiveLink)
-> ((OpenScreen -> Const (First OpenScreen) OpenScreen)
-> ActiveHeadState -> Const (First OpenScreen) ActiveHeadState)
-> (OpenScreen -> Const (First OpenScreen) OpenScreen)
-> ActiveLink
-> Const (First OpenScreen) ActiveLink
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (OpenScreen -> Const (First OpenScreen) OpenScreen)
-> ActiveHeadState -> Const (First OpenScreen) ActiveHeadState
Traversal' ActiveHeadState OpenScreen
openStateL of
Just OpenScreen
LoadingUTxOForIncrement -> Name
"Increment"
Just OpenScreen
NoUTxOToIncrement -> Name
"Increment"
Just (SelectingUTxOToIncrement UTxORadioFieldForm (HydraEvent Tx) Name
_) -> Name
"Increment"
Just (SelectingUTxOToDecommit UTxORadioFieldForm (HydraEvent Tx) Name
_) -> Name
"Decommit"
Just (SelectingUTxO UTxORadioFieldForm (HydraEvent Tx) Name
_) -> Name
"New Tx"
Just EnteringAmount{} -> Name
"New Tx"
Just SelectingRecipient{} -> Name
"New Tx"
Just EnteringRecipientAddress{} -> Name
"New Tx"
Just (ConfirmingClose ConfirmingRadioFieldForm (HydraEvent Tx) Name
_) -> Name
"Close"
Maybe OpenScreen
_ -> Name
"Action"
drawTab :: ActiveTab -> Text -> ActiveTab -> Widget n
drawTab :: forall n. ActiveTab -> Name -> ActiveTab -> Widget n
drawTab ActiveTab
tab Name
tabLabel ActiveTab
current =
if ActiveTab
tab ActiveTab -> ActiveTab -> Bool
forall a. Eq a => a -> a -> Bool
== ActiveTab
current
then AttrName -> Widget n -> Widget n
forall n. AttrName -> Widget n -> Widget n
withAttr AttrName
activeTabA (Widget n -> Widget n) -> Widget n -> Widget n
forall a b. (a -> b) -> a -> b
$ Name -> Widget n
forall n. Name -> Widget n
txt (Name
" " Name -> Name -> Name
forall a. Semigroup a => a -> a -> a
<> Name
tabLabel Name -> Name -> Name
forall a. Semigroup a => a -> a -> a
<> Name
" ")
else AttrName -> Widget n -> Widget n
forall n. AttrName -> Widget n -> Widget n
withAttr AttrName
neutral (Widget n -> Widget n) -> Widget n -> Widget n
forall a b. (a -> b) -> a -> b
$ Name -> Widget n
forall n. Name -> Widget n
txt Name
tabLabel
drawTabContent :: CardanoClient -> Client Tx IO -> RootState -> Widget Name
drawTabContent :: CardanoClient -> Client Tx IO -> RootState -> Widget Name
drawTabContent CardanoClient
cardanoClient Client Tx IO
hydraClient RootState
s =
case RootState
s RootState -> Getting ActiveTab RootState ActiveTab -> ActiveTab
forall s a. s -> Getting a s a -> a
^. Getting ActiveTab RootState ActiveTab
Lens' RootState ActiveTab
activeTabL of
ActiveTab
MainTab -> CardanoClient -> Client Tx IO -> RootState -> Widget Name
drawMainTab CardanoClient
cardanoClient Client Tx IO
hydraClient RootState
s
ActiveTab
FundsTab -> CardanoClient -> Client Tx IO -> RootState -> Widget Name
drawFundsTab CardanoClient
cardanoClient Client Tx IO
hydraClient RootState
s
ActiveTab
EventHistoryTab -> RootState -> Widget Name
drawEventHistoryTab RootState
s
ActiveTab
ModalTab -> CardanoClient -> Client Tx IO -> RootState -> Widget Name
drawModalTab CardanoClient
cardanoClient Client Tx IO
hydraClient RootState
s
drawModalTab :: CardanoClient -> Client Tx IO -> RootState -> Widget Name
drawModalTab :: CardanoClient -> Client Tx IO -> RootState -> Widget Name
drawModalTab CardanoClient{NetworkId
networkId :: NetworkId
$sel:networkId:CardanoClient :: CardanoClient -> NetworkId
networkId} Client{Secret (SigningKey PaymentKey)
sk :: Secret (SigningKey PaymentKey)
sk :: forall tx (m :: * -> *).
Client tx m -> Secret (SigningKey PaymentKey)
sk} RootState
s =
Widget Name -> Widget Name -> Widget Name
forall n. Widget n -> Widget n -> Widget n
borderWithLabel (AttrName -> Widget Name -> Widget Name
forall n. AttrName -> Widget n -> Widget n
withAttr AttrName
neutral (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$ Name -> Widget Name
forall n. Name -> Widget n
txt (Name
" " Name -> Name -> Name
forall a. Semigroup a => a -> a -> a
<> RootState -> Name
modalTabLabel RootState
s Name -> Name -> Name
forall a. Semigroup a => a -> a -> a
<> Name
" ")) (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$
Int -> Widget Name -> Widget Name
forall n. Int -> Widget n -> Widget n
padLeftRight Int
1 (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$
case RootState
s RootState
-> Getting
(Maybe (TxIdRadioFieldForm (HydraEvent Tx) Name))
RootState
(Maybe (TxIdRadioFieldForm (HydraEvent Tx) Name))
-> Maybe (TxIdRadioFieldForm (HydraEvent Tx) Name)
forall s a. s -> Getting a s a -> a
^. Getting
(Maybe (TxIdRadioFieldForm (HydraEvent Tx) Name))
RootState
(Maybe (TxIdRadioFieldForm (HydraEvent Tx) Name))
Lens' RootState (Maybe (TxIdRadioFieldForm (HydraEvent Tx) Name))
recoveryFormL of
Just TxIdRadioFieldForm (HydraEvent Tx) Name
form ->
let ownAddress :: AddressInEra Era
ownAddress = forall era.
IsShelleyBasedEra era =>
NetworkId -> VerificationKey PaymentKey -> AddressInEra era
mkVkAddress @Era NetworkId
networkId (Secret (SigningKey PaymentKey) -> VerificationKey PaymentKey
forall s k. HasVerificationKey s k => s -> VerificationKey k
getVerificationKey Secret (SigningKey PaymentKey)
sk)
pendingIncrements :: [PendingIncrement]
pendingIncrements =
[PendingIncrement]
-> Maybe [PendingIncrement] -> [PendingIncrement]
forall a. a -> Maybe a -> a
fromMaybe [] (Maybe [PendingIncrement] -> [PendingIncrement])
-> Maybe [PendingIncrement] -> [PendingIncrement]
forall a b. (a -> b) -> a -> b
$
RootState
s RootState
-> Getting (First [PendingIncrement]) RootState [PendingIncrement]
-> Maybe [PendingIncrement]
forall s a. s -> Getting (First a) s a -> Maybe a
^? (ConnectedState -> Const (First [PendingIncrement]) ConnectedState)
-> RootState -> Const (First [PendingIncrement]) RootState
Lens' RootState ConnectedState
connectedStateL ((ConnectedState
-> Const (First [PendingIncrement]) ConnectedState)
-> RootState -> Const (First [PendingIncrement]) RootState)
-> (([PendingIncrement]
-> Const (First [PendingIncrement]) [PendingIncrement])
-> ConnectedState
-> Const (First [PendingIncrement]) ConnectedState)
-> Getting (First [PendingIncrement]) RootState [PendingIncrement]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Connection -> Const (First [PendingIncrement]) Connection)
-> ConnectedState
-> Const (First [PendingIncrement]) ConnectedState
Traversal' ConnectedState Connection
connectionL ((Connection -> Const (First [PendingIncrement]) Connection)
-> ConnectedState
-> Const (First [PendingIncrement]) ConnectedState)
-> (([PendingIncrement]
-> Const (First [PendingIncrement]) [PendingIncrement])
-> Connection -> Const (First [PendingIncrement]) Connection)
-> ([PendingIncrement]
-> Const (First [PendingIncrement]) [PendingIncrement])
-> ConnectedState
-> Const (First [PendingIncrement]) ConnectedState
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HeadState -> Const (First [PendingIncrement]) HeadState)
-> Connection -> Const (First [PendingIncrement]) Connection
Lens' Connection HeadState
headStateL ((HeadState -> Const (First [PendingIncrement]) HeadState)
-> Connection -> Const (First [PendingIncrement]) Connection)
-> (([PendingIncrement]
-> Const (First [PendingIncrement]) [PendingIncrement])
-> HeadState -> Const (First [PendingIncrement]) HeadState)
-> ([PendingIncrement]
-> Const (First [PendingIncrement]) [PendingIncrement])
-> Connection
-> Const (First [PendingIncrement]) Connection
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ActiveLink -> Const (First [PendingIncrement]) ActiveLink)
-> HeadState -> Const (First [PendingIncrement]) HeadState
Traversal' HeadState ActiveLink
activeLinkL ((ActiveLink -> Const (First [PendingIncrement]) ActiveLink)
-> HeadState -> Const (First [PendingIncrement]) HeadState)
-> (([PendingIncrement]
-> Const (First [PendingIncrement]) [PendingIncrement])
-> ActiveLink -> Const (First [PendingIncrement]) ActiveLink)
-> ([PendingIncrement]
-> Const (First [PendingIncrement]) [PendingIncrement])
-> HeadState
-> Const (First [PendingIncrement]) HeadState
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([PendingIncrement]
-> Const (First [PendingIncrement]) [PendingIncrement])
-> ActiveLink -> Const (First [PendingIncrement]) ActiveLink
Lens' ActiveLink [PendingIncrement]
pendingIncrementsL
in AddressInEra Era
-> TxIdRadioFieldForm (HydraEvent Tx) Name
-> [PendingIncrement]
-> UTCTime
-> Widget Name
forall e.
AddressInEra Era
-> Form TxId e Name -> [PendingIncrement] -> UTCTime -> Widget Name
drawRecoverFormWithDetail AddressInEra Era
ownAddress TxIdRadioFieldForm (HydraEvent Tx) Name
form [PendingIncrement]
pendingIncrements (RootState
s RootState -> Getting UTCTime RootState UTCTime -> UTCTime
forall s a. s -> Getting a s a -> a
^. Getting UTCTime RootState UTCTime
Lens' RootState UTCTime
nowL)
Maybe (TxIdRadioFieldForm (HydraEvent Tx) Name)
Nothing -> case RootState
s RootState
-> Getting
(Maybe (UTxOCheckboxForm (HydraEvent Tx) Name))
RootState
(Maybe (UTxOCheckboxForm (HydraEvent Tx) Name))
-> Maybe (UTxOCheckboxForm (HydraEvent Tx) Name)
forall s a. s -> Getting a s a -> a
^. Getting
(Maybe (UTxOCheckboxForm (HydraEvent Tx) Name))
RootState
(Maybe (UTxOCheckboxForm (HydraEvent Tx) Name))
Lens' RootState (Maybe (UTxOCheckboxForm (HydraEvent Tx) Name))
fanoutSelectionFormL of
Just UTxOCheckboxForm (HydraEvent Tx) Name
form ->
let entries :: [(TxOut CtxUTxO, Bool)]
entries = Map TxIn (TxOut CtxUTxO, Bool) -> [(TxOut CtxUTxO, Bool)]
forall a. Map TxIn a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
toList (UTxOCheckboxForm (HydraEvent Tx) Name
-> Map TxIn (TxOut CtxUTxO, Bool)
forall s e n. Form s e n -> s
formState UTxOCheckboxForm (HydraEvent Tx) Name
form)
total :: Int
total = [(TxOut CtxUTxO, Bool)] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(TxOut CtxUTxO, Bool)]
entries
selected :: Int
selected = [(TxOut CtxUTxO, Bool)] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length (((TxOut CtxUTxO, Bool) -> Bool)
-> [(TxOut CtxUTxO, Bool)] -> [(TxOut CtxUTxO, Bool)]
forall a. (a -> Bool) -> [a] -> [a]
filter (TxOut CtxUTxO, Bool) -> Bool
forall a b. (a, b) -> b
snd [(TxOut CtxUTxO, Bool)]
entries)
in [Widget Name] -> Widget Name
forall n. [Widget n] -> Widget n
vBox
[ AttrName -> Widget Name -> Widget Name
forall n. AttrName -> Widget n -> Widget n
withAttr AttrName
sectionHeaderA (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$ Name -> Widget Name
forall n. Name -> Widget n
txt Name
"Select UTxOs to fan out (Space toggle, A all, PgUp/PgDn scroll):"
, AttrName -> Widget Name -> Widget Name
forall n. AttrName -> Widget n -> Widget n
withAttr AttrName
neutral (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$ Name -> Widget Name
forall n. Name -> Widget n
txt (Name
"Selected " Name -> Name -> Name
forall a. Semigroup a => a -> a -> a
<> Int -> Name
forall b a. (Show a, IsString b) => a -> b
show Int
selected Name -> Name -> Name
forall a. Semigroup a => a -> a -> a
<> Name
" of " Name -> Name -> Name
forall a. Semigroup a => a -> a -> a
<> Int -> Name
forall b a. (Show a, IsString b) => a -> b
show Int
total Name -> Name -> Name
forall a. Semigroup a => a -> a -> a
<> Name
" UTxO")
, Name -> Widget Name -> Widget Name
forall n. (Ord n, Show n) => n -> Widget n -> Widget n
scrollableViewport Name
fanoutSelectionViewportName (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$ UTxOCheckboxForm (HydraEvent Tx) Name -> Widget Name
forall n s e. Eq n => Form s e n -> Widget n
renderForm UTxOCheckboxForm (HydraEvent Tx) Name
form
]
Maybe (UTxOCheckboxForm (HydraEvent Tx) Name)
Nothing -> case RootState
s RootState
-> Getting ConnectedState RootState ConnectedState
-> ConnectedState
forall s a. s -> Getting a s a -> a
^. Getting ConnectedState RootState ConnectedState
Lens' RootState ConnectedState
connectedStateL of
ConnectedState
Disconnected -> Widget Name
forall n. Widget n
emptyWidget
Connected Connection
k -> NetworkId
-> VerificationKey PaymentKey
-> UTCTime
-> Connection
-> Widget Name
drawFocusPanel NetworkId
networkId (Secret (SigningKey PaymentKey) -> VerificationKey PaymentKey
forall s k. HasVerificationKey s k => s -> VerificationKey k
getVerificationKey Secret (SigningKey PaymentKey)
sk) (RootState
s RootState -> Getting UTCTime RootState UTCTime -> UTCTime
forall s a. s -> Getting a s a -> a
^. Getting UTCTime RootState UTCTime
Lens' RootState UTCTime
nowL) Connection
k
drawActionBar :: RootState -> Widget n
drawActionBar :: forall n. RootState -> Widget n
drawActionBar RootState
s =
[Widget n] -> Widget n
forall n. [Widget n] -> Widget n
hBox ([Widget n] -> Widget n)
-> ([Widget n] -> [Widget n]) -> [Widget n] -> Widget n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Widget n -> [Widget n] -> [Widget n]
forall a. a -> [a] -> [a]
intersperse (Name -> Widget n
forall n. Name -> Widget n
txt Name
" ") ([Widget n] -> Widget n) -> [Widget n] -> Widget n
forall a b. (a -> b) -> a -> b
$ ((Name, Name) -> Widget n) -> [(Name, Name)] -> [Widget n]
forall a b. (a -> b) -> [a] -> [b]
map (Name, Name) -> Widget n
forall n. (Name, Name) -> Widget n
drawAction ([(Name, Name)]
actions [(Name, Name)] -> [(Name, Name)] -> [(Name, Name)]
forall a. Semigroup a => a -> a -> a
<> [(Name
"F3", Name
themeLabel)])
where
isModal :: Bool
isModal = RootState
s RootState -> Getting ActiveTab RootState ActiveTab -> ActiveTab
forall s a. s -> Getting a s a -> a
^. Getting ActiveTab RootState ActiveTab
Lens' RootState ActiveTab
activeTabL ActiveTab -> ActiveTab -> Bool
forall a. Eq a => a -> a -> Bool
== ActiveTab
ModalTab
themeLabel :: Name
themeLabel = case RootState
s RootState -> Getting Theme RootState Theme -> Theme
forall s a. s -> Getting a s a -> a
^. Getting Theme RootState Theme
Lens' RootState Theme
themeL of
Theme
DarkTheme -> Name
" ☾ dark (toggle)"
Theme
LightTheme -> Name
" ☀ light (toggle)"
actions :: [(Name, Name)]
actions = case RootState
s RootState
-> Getting ConnectedState RootState ConnectedState
-> ConnectedState
forall s a. s -> Getting a s a -> a
^. Getting ConnectedState RootState ConnectedState
Lens' RootState ConnectedState
connectedStateL of
ConnectedState
Disconnected -> [(Name
"Q", Name
"uit")]
Connected Connection
c -> case Connection
c Connection -> Getting HeadState Connection HeadState -> HeadState
forall s a. s -> Getting a s a -> a
^. Getting HeadState Connection HeadState
Lens' Connection HeadState
headStateL of
HeadState
Idle -> [(Name
"I", Name
"nit"), (Name
"Q", Name
"uit")]
Active (ActiveLink{ActiveHeadState
activeHeadState :: ActiveHeadState
$sel:activeHeadState:ActiveLink :: ActiveLink -> ActiveHeadState
activeHeadState}) ->
if Bool
isModal
then case (RootState
s RootState
-> Getting
(Maybe (TxIdRadioFieldForm (HydraEvent Tx) Name))
RootState
(Maybe (TxIdRadioFieldForm (HydraEvent Tx) Name))
-> Maybe (TxIdRadioFieldForm (HydraEvent Tx) Name)
forall s a. s -> Getting a s a -> a
^. Getting
(Maybe (TxIdRadioFieldForm (HydraEvent Tx) Name))
RootState
(Maybe (TxIdRadioFieldForm (HydraEvent Tx) Name))
Lens' RootState (Maybe (TxIdRadioFieldForm (HydraEvent Tx) Name))
recoveryFormL, RootState
s RootState
-> Getting
(Maybe (UTxOCheckboxForm (HydraEvent Tx) Name))
RootState
(Maybe (UTxOCheckboxForm (HydraEvent Tx) Name))
-> Maybe (UTxOCheckboxForm (HydraEvent Tx) Name)
forall s a. s -> Getting a s a -> a
^. Getting
(Maybe (UTxOCheckboxForm (HydraEvent Tx) Name))
RootState
(Maybe (UTxOCheckboxForm (HydraEvent Tx) Name))
Lens' RootState (Maybe (UTxOCheckboxForm (HydraEvent Tx) Name))
fanoutSelectionFormL) of
(Just TxIdRadioFieldForm (HydraEvent Tx) Name
_, Maybe (UTxOCheckboxForm (HydraEvent Tx) Name)
_) -> [(Name
"↑↓/Space", Name
" choose"), (Name
"Enter", Name
" recover"), (Name
"Esc/C", Name
" cancel")]
(Maybe (TxIdRadioFieldForm (HydraEvent Tx) Name)
_, Just UTxOCheckboxForm (HydraEvent Tx) Name
_) -> [(Name
"↑↓", Name
" move"), (Name
"Space", Name
" toggle"), (Name
"A", Name
" all"), (Name
"Enter", Name
" fan out"), (Name
"Esc/C", Name
" cancel")]
(Maybe (TxIdRadioFieldForm (HydraEvent Tx) Name)
Nothing, Maybe (UTxOCheckboxForm (HydraEvent Tx) Name)
Nothing) -> case ActiveHeadState
activeHeadState of
Open{OpenScreen
openState :: OpenScreen
$sel:openState:Open :: ActiveHeadState -> OpenScreen
openState} -> case OpenScreen
openState of
SelectingUTxOToIncrement UTxORadioFieldForm (HydraEvent Tx) Name
_ -> [(Name
"↑↓/Space", Name
" choose"), (Name
"Enter", Name
" select"), (Name
"U", Name
" refresh"), (Name
"Esc/C", Name
" cancel")]
OpenScreen
NoUTxOToIncrement -> [(Name
"U", Name
" refresh"), (Name
"Esc/C", Name
" cancel")]
SelectingUTxOToDecommit UTxORadioFieldForm (HydraEvent Tx) Name
_ -> [(Name
"↑↓/Space", Name
" choose"), (Name
"Enter", Name
" decommit"), (Name
"Esc/C", Name
" cancel")]
SelectingUTxO UTxORadioFieldForm (HydraEvent Tx) Name
_ -> [(Name
"↑↓/Space", Name
" choose"), (Name
"Enter", Name
" select"), (Name
"Esc/C", Name
" cancel")]
EnteringAmount{} -> [(Name
"Enter", Name
" confirm"), (Name
"Esc", Name
" cancel")]
SelectingRecipient{} -> [(Name
"↑↓/Space", Name
" choose"), (Name
"Enter", Name
" send"), (Name
"Esc/C", Name
" cancel")]
EnteringRecipientAddress{} -> [(Name
"Enter", Name
" send"), (Name
"Esc", Name
" cancel")]
ConfirmingClose ConfirmingRadioFieldForm (HydraEvent Tx) Name
_ -> [(Name
"↑↓/Space", Name
" choose"), (Name
"Enter", Name
" confirm"), (Name
"Esc/C", Name
" cancel")]
OpenScreen
_ -> [(Name
"Esc/C", Name
" cancel")]
ActiveHeadState
_ -> [(Name
"Esc/C", Name
" close")]
else case (RootState
s RootState -> Getting ActiveTab RootState ActiveTab -> ActiveTab
forall s a. s -> Getting a s a -> a
^. Getting ActiveTab RootState ActiveTab
Lens' RootState ActiveTab
activeTabL, ActiveHeadState
activeHeadState) of
(ActiveTab
EventHistoryTab, ActiveHeadState
_) -> [(Name
"d", Name
" raw/summary"), (Name, Name)
eventFilterAction, (Name
"Q", Name
"uit")]
(ActiveTab
FundsTab, ActiveHeadState
hs) -> ActiveHeadState -> [(Name, Name)]
fundsTabActions ActiveHeadState
hs
(ActiveTab
_, ActiveHeadState
hs) -> ActiveHeadState -> [(Name, Name)]
mainTabActions ActiveHeadState
hs
fundsTabActions :: ActiveHeadState -> [(Name, Name)]
fundsTabActions = \case
Open{} -> [(Name
"I", Name
"ncrement"), (Name
"D", Name
"ecommit")] [(Name, Name)] -> [(Name, Name)] -> [(Name, Name)]
forall a. Semigroup a => a -> a -> a
<> [(Name, Name)]
recoverIf [(Name, Name)] -> [(Name, Name)] -> [(Name, Name)]
forall a. Semigroup a => a -> a -> a
<> [(Name
"U", Name
"pdate"), (Name
"Q", Name
"uit")]
Closed{} -> [(Name, Name)]
recoverIf [(Name, Name)] -> [(Name, Name)] -> [(Name, Name)]
forall a. Semigroup a => a -> a -> a
<> [(Name
"U", Name
"pdate"), (Name
"Q", Name
"uit")]
FanoutPossible{} -> [(Name, Name)]
recoverIf [(Name, Name)] -> [(Name, Name)] -> [(Name, Name)]
forall a. Semigroup a => a -> a -> a
<> [(Name
"F", Name
"anout"), (Name
"P", Name
"artial fanout"), (Name
"U", Name
"pdate"), (Name
"Q", Name
"uit")]
FanningOut{$sel:fanoutMode:Open :: ActiveHeadState -> FanoutProgressMode
fanoutMode = FanoutProgressMode
AwaitingFanoutSelection} -> [(Name, Name)]
recoverIf [(Name, Name)] -> [(Name, Name)] -> [(Name, Name)]
forall a. Semigroup a => a -> a -> a
<> [(Name
"P", Name
"artial fanout"), (Name
"U", Name
"pdate"), (Name
"Q", Name
"uit")]
FanningOut{} -> [(Name, Name)]
recoverIf [(Name, Name)] -> [(Name, Name)] -> [(Name, Name)]
forall a. Semigroup a => a -> a -> a
<> [(Name
"U", Name
"pdate"), (Name
"Q", Name
"uit")]
Final{} -> [(Name, Name)]
recoverIf [(Name, Name)] -> [(Name, Name)] -> [(Name, Name)]
forall a. Semigroup a => a -> a -> a
<> [(Name
"I", Name
"nit"), (Name
"U", Name
"pdate"), (Name
"Q", Name
"uit")]
mainTabActions :: ActiveHeadState -> [(Name, Name)]
mainTabActions = \case
Open{} -> [(Name
"N", Name
"ew Tx"), (Name
"D", Name
"ecommit"), (Name
"I", Name
"ncrement")] [(Name, Name)] -> [(Name, Name)] -> [(Name, Name)]
forall a. Semigroup a => a -> a -> a
<> [(Name, Name)]
recoverIf [(Name, Name)] -> [(Name, Name)] -> [(Name, Name)]
forall a. Semigroup a => a -> a -> a
<> [(Name
"C", Name
"lose"), (Name
"Q", Name
"uit")]
Closed{} -> [(Name, Name)]
recoverIf [(Name, Name)] -> [(Name, Name)] -> [(Name, Name)]
forall a. Semigroup a => a -> a -> a
<> [(Name
"Q", Name
"uit")]
FanoutPossible{} -> [(Name, Name)]
recoverIf [(Name, Name)] -> [(Name, Name)] -> [(Name, Name)]
forall a. Semigroup a => a -> a -> a
<> [(Name
"F", Name
"anout"), (Name
"P", Name
"artial fanout"), (Name
"Q", Name
"uit")]
FanningOut{$sel:fanoutMode:Open :: ActiveHeadState -> FanoutProgressMode
fanoutMode = FanoutProgressMode
AwaitingFanoutSelection} -> [(Name, Name)]
recoverIf [(Name, Name)] -> [(Name, Name)] -> [(Name, Name)]
forall a. Semigroup a => a -> a -> a
<> [(Name
"P", Name
"artial fanout"), (Name
"Q", Name
"uit")]
FanningOut{} -> [(Name, Name)]
recoverIf [(Name, Name)] -> [(Name, Name)] -> [(Name, Name)]
forall a. Semigroup a => a -> a -> a
<> [(Name
"Q", Name
"uit")]
Final{} -> [(Name, Name)]
recoverIf [(Name, Name)] -> [(Name, Name)] -> [(Name, Name)]
forall a. Semigroup a => a -> a -> a
<> [(Name
"I", Name
"nit"), (Name
"Q", Name
"uit")]
recoverIf :: [(Name, Name)]
recoverIf = case RootState
s RootState
-> Getting (First [PendingIncrement]) RootState [PendingIncrement]
-> Maybe [PendingIncrement]
forall s a. s -> Getting (First a) s a -> Maybe a
^? (ConnectedState -> Const (First [PendingIncrement]) ConnectedState)
-> RootState -> Const (First [PendingIncrement]) RootState
Lens' RootState ConnectedState
connectedStateL ((ConnectedState
-> Const (First [PendingIncrement]) ConnectedState)
-> RootState -> Const (First [PendingIncrement]) RootState)
-> (([PendingIncrement]
-> Const (First [PendingIncrement]) [PendingIncrement])
-> ConnectedState
-> Const (First [PendingIncrement]) ConnectedState)
-> Getting (First [PendingIncrement]) RootState [PendingIncrement]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Connection -> Const (First [PendingIncrement]) Connection)
-> ConnectedState
-> Const (First [PendingIncrement]) ConnectedState
Traversal' ConnectedState Connection
connectionL ((Connection -> Const (First [PendingIncrement]) Connection)
-> ConnectedState
-> Const (First [PendingIncrement]) ConnectedState)
-> (([PendingIncrement]
-> Const (First [PendingIncrement]) [PendingIncrement])
-> Connection -> Const (First [PendingIncrement]) Connection)
-> ([PendingIncrement]
-> Const (First [PendingIncrement]) [PendingIncrement])
-> ConnectedState
-> Const (First [PendingIncrement]) ConnectedState
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HeadState -> Const (First [PendingIncrement]) HeadState)
-> Connection -> Const (First [PendingIncrement]) Connection
Lens' Connection HeadState
headStateL ((HeadState -> Const (First [PendingIncrement]) HeadState)
-> Connection -> Const (First [PendingIncrement]) Connection)
-> (([PendingIncrement]
-> Const (First [PendingIncrement]) [PendingIncrement])
-> HeadState -> Const (First [PendingIncrement]) HeadState)
-> ([PendingIncrement]
-> Const (First [PendingIncrement]) [PendingIncrement])
-> Connection
-> Const (First [PendingIncrement]) Connection
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ActiveLink -> Const (First [PendingIncrement]) ActiveLink)
-> HeadState -> Const (First [PendingIncrement]) HeadState
Traversal' HeadState ActiveLink
activeLinkL ((ActiveLink -> Const (First [PendingIncrement]) ActiveLink)
-> HeadState -> Const (First [PendingIncrement]) HeadState)
-> (([PendingIncrement]
-> Const (First [PendingIncrement]) [PendingIncrement])
-> ActiveLink -> Const (First [PendingIncrement]) ActiveLink)
-> ([PendingIncrement]
-> Const (First [PendingIncrement]) [PendingIncrement])
-> HeadState
-> Const (First [PendingIncrement]) HeadState
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([PendingIncrement]
-> Const (First [PendingIncrement]) [PendingIncrement])
-> ActiveLink -> Const (First [PendingIncrement]) ActiveLink
Lens' ActiveLink [PendingIncrement]
pendingIncrementsL of
Just (PendingIncrement
_ : [PendingIncrement]
_) -> [(Name
"R", Name
"ecover")]
Maybe [PendingIncrement]
_ -> []
eventFilterAction :: (Name, Name)
eventFilterAction = case RootState
s RootState
-> Getting EventHistoryFilter RootState EventHistoryFilter
-> EventHistoryFilter
forall s a. s -> Getting a s a -> a
^. Getting EventHistoryFilter RootState EventHistoryFilter
Lens' RootState EventHistoryFilter
eventHistoryFilterL of
EventHistoryFilter
ShowAll -> (Name
"e", Name
" errors only")
EventHistoryFilter
ErrorsOnly -> (Name
"e", Name
" show all")
drawAction :: (Text, Text) -> Widget n
drawAction :: forall n. (Name, Name) -> Widget n
drawAction (Name
key, Name
rest) = AttrName -> Widget n -> Widget n
forall n. AttrName -> Widget n -> Widget n
withAttr AttrName
keyA (Name -> Widget n
forall n. Name -> Widget n
txt Name
key) Widget n -> Widget n -> Widget n
forall n. Widget n -> Widget n -> Widget n
<+> AttrName -> Widget n -> Widget n
forall n. AttrName -> Widget n -> Widget n
withAttr AttrName
actionDescA (Name -> Widget n
forall n. Name -> Widget n
txt Name
rest)