From 1022944e67dc60d042303cde4e7f9b073f04f636 Mon Sep 17 00:00:00 2001 From: Rene Vergara Date: Tue, 13 Feb 2024 14:19:05 -0600 Subject: [PATCH] Implement help dialog --- src/Zenith/CLI.hs | 23 +++++++++++++++++++++-- src/Zenith/Core.hs | 5 +++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/Zenith/CLI.hs b/src/Zenith/CLI.hs index 37c5fe4..e63d581 100644 --- a/src/Zenith/CLI.hs +++ b/src/Zenith/CLI.hs @@ -23,8 +23,10 @@ import Brick.Widgets.Core ( Padding(..) , (<+>) , (<=>) + , emptyWidget , hLimit , joinBorders + , padAll , padRight , str , vBox @@ -32,6 +34,7 @@ import Brick.Widgets.Core , withAttr , withBorderStyle ) +import qualified Brick.Widgets.Dialog as D import qualified Brick.Widgets.List as L import qualified Data.Vector as Vec import Network.HTTP.Simple @@ -42,6 +45,7 @@ data Name = WList | AList | TList + | HelpDialog deriving (Eq, Show, Ord) data State = State @@ -50,12 +54,13 @@ data State = State , _addresses :: !(L.List Name String) , _transactions :: !(L.List Name String) , _msg :: !String + , _helpBox :: !Bool } deriving (Show) makeLenses ''State drawUI :: State -> [Widget Name] -drawUI s = [ui s] +drawUI s = [helpDialog s, ui s] where ui :: State -> Widget Name ui s = @@ -79,6 +84,17 @@ drawUI s = [ui s] msgBox m = vBox [B.hBorderWithLabel (str "Messages"), hLimit 70 $ padRight Max $ str m] + helpDialog :: State -> Widget Name + helpDialog s = + if s ^. helpBox + then D.renderDialog + (D.dialog (Just (str "Commands")) Nothing 50) + (vBox ([C.hCenter $ str "Key", B.hBorder] <> keyList) <+> + vBox ([str "Actions", B.hBorder] <> actionList)) + else emptyWidget + where + keyList = map (C.hCenter . str) ["?", "Esc", "q"] + actionList = map (hLimit 40 . str) ["Open help", "Close dialog", "Quit"] listDrawElement :: (Show a) => Bool -> a -> Widget Name listDrawElement sel a = @@ -94,7 +110,9 @@ customAttr = L.listSelectedAttr <> A.attrName "custom" appEvent :: BT.BrickEvent Name e -> BT.EventM Name State () appEvent (BT.VtyEvent e) = case e of - V.EvKey V.KEsc [] -> M.halt + V.EvKey V.KEsc [] -> BT.modify $ set helpBox False + V.EvKey (V.KChar 'q') [] -> M.halt + V.EvKey (V.KChar '?') [] -> BT.modify $ set helpBox True V.EvKey (V.KChar 'c') [] -> printMsg "You pressed C!" V.EvKey (V.KChar 's') [] -> printMsg "You pressed S!" ev -> BT.zoom addresses $ L.handleListEvent ev @@ -141,6 +159,7 @@ runZenithCLI port dbName = do (L.list TList (Vec.fromList ["tx1", "tx2", "tx3"]) 1) ("Start up Ok! Connected to Zebra " ++ (T.unpack . zgi_build) zebra ++ " on port " ++ show port ++ ".") + False Nothing -> do print $ "No Zebra node available on port " <> diff --git a/src/Zenith/Core.hs b/src/Zenith/Core.hs index f2f2bbb..2ba8480 100644 --- a/src/Zenith/Core.hs +++ b/src/Zenith/Core.hs @@ -16,10 +16,11 @@ import Zenith.DB -- | Returns the list of wallets available in the given database checkWallets :: T.Text -- ^ The database name to check + -> ZcashNet -- ^ The network the wallet is running -> IO [Entity ZcashWallet] -checkWallets dbName = do +checkWallets dbName znet = do runSqlite dbName $ do runMigration migrateAll - runSqlite dbName $ selectList [ZcashWalletBirthdayHeight >. 0] [] + runSqlite dbName $ selectList [ZcashWalletNetwork ==. znet] [] -- * Zebra Node interaction -- | Checks the status of the `zebrad` node