diff --git a/src/Zenith/CLI.hs b/src/Zenith/CLI.hs index 4522913..8a76b5c 100644 --- a/src/Zenith/CLI.hs +++ b/src/Zenith/CLI.hs @@ -102,6 +102,7 @@ import Zenith.Types , PrivacyPolicy(..) , UnifiedAddressDB(..) , ZcashNetDB(..) + , ShieldDeshieldOp(..) ) import Zenith.Utils ( displayTaz @@ -132,6 +133,8 @@ data Name | PrivacyLowField | PrivacyMediumField | PrivacyFullField + | ShieldField + | DeshieldField deriving (Eq, Show, Ord) data DialogInput = DialogInput @@ -156,6 +159,13 @@ data AdrBookEntry = AdrBookEntry makeLenses ''AdrBookEntry +data ShDshEntry = ShDshEntry + { _shieldOp :: !ShieldDeshieldOp + , _shAmt :: !Float + } deriving (Show) + +makeLenses ''ShDshEntry + data DialogType = WName | AName @@ -168,6 +178,7 @@ data DialogType | AdrBookForm | AdrBookUpdForm | AdrBookDelForm + | ShieldDeshieldForm data DisplayType = AddrDisplay @@ -216,6 +227,7 @@ data State = State , _abCurAdrs :: !T.Text -- used for address book CRUD operations , _sentTx :: !(Maybe HexString) , _unconfBalance :: !Integer + , _shdshForm :: !(Form ShDshEntry () Name) } makeLenses ''State @@ -263,17 +275,24 @@ drawUI s = [splashDialog s, helpDialog s, displayDialog s, inputDialog s, ui s] (C.hCenter (str ("Last block seen: " ++ show (st ^. syncBlock) ++ "\n")) <=> listTxBox " Transactions " (st ^. network) (st ^. transactions))) <=> - C.hCenter - (hBox - [ capCommand "W" "allets" - , capCommand "A" "ccounts" - , capCommand "V" "iew address" - , capCommand "S" "end Tx" - , capCommand2 "Address " "B" "ook" - , capCommand "Q" "uit" - , capCommand "?" " Help" - , str $ show (st ^. timer) - ]) + (vBox + [C.hCenter + (hBox + [ capCommand "W" "allets" + , capCommand "A" "ccounts" + , capCommand "V" "iew address" + , capCommand3 "" "S" "end Tx" + ]) + ,C.hCenter + (hBox + [ capCommand2 "Address " "B" "ook" + , capCommand2 "Shield/" "D" "eshield" + , capCommand "Q" "uit" + , capCommand "?" " Help" + , str $ show (st ^. timer) + ]) + ] + ) listBox :: Show e => String -> L.List Name e -> Widget Name listBox titleLabel l = C.vCenter $ @@ -339,7 +358,7 @@ drawUI s = [splashDialog s, helpDialog s, displayDialog s, inputDialog s, ui s] else emptyWidget where keyList = - map (C.hCenter . str) ["?", "Esc", "w", "a", "v", "s", "b", "q"] + map (C.hCenter . str) ["?", "Esc", "w", "a", "v", "s", "b", "d", "q"] actionList = map (hLimit 40 . str) @@ -350,6 +369,7 @@ drawUI s = [splashDialog s, helpDialog s, displayDialog s, inputDialog s, ui s] , "View address" , "Send Tx" , "Address Book" + , "Shield/De-Shield" , "Quit" ] inputDialog :: State -> Widget Name @@ -396,6 +416,12 @@ drawUI s = [splashDialog s, helpDialog s, displayDialog s, inputDialog s, ui s] (renderForm (st ^. txForm) <=> C.hCenter (hBox [capCommand "↲ " "Send", capCommand " " "Cancel"])) + ShieldDeshieldForm -> + D.renderDialog + (D.dialog (Just (str " Shield / De-Shield ")) Nothing 50) + (renderForm (st ^. shdshForm) <=> + C.hCenter + (hBox [capCommand "P" "roceed", capCommand " " "Cancel"])) Blank -> emptyWidget -- Address Book List AdrBook -> @@ -639,6 +665,24 @@ mkSendForm bal = label s w = padBottom (Pad 1) $ vLimit 1 (hLimit 15 $ str s <+> fill ' ') <+> w +mkshieldDeshieldForm :: Integer -> ShDshEntry -> Form ShDshEntry e Name +mkshieldDeshieldForm bal = + newForm + [ label "Select :" @@= + radioField + shieldOp + [ (Shield, ShieldField, "Shield") + , (Deshield, DeshieldField, "De-Shield") + ] + , label "Amount: " @@= + editShowableFieldWithValidate shAmt AmtField (isAmountValid bal) + ] + where + isAmountValid :: Integer -> Float -> Bool + isAmountValid b i = (fromIntegral b / 100000000.0) >= i + label s w = + padBottom (Pad 1) $ vLimit 1 (hLimit 15 $ str s <+> fill ' ') <+> w + mkNewABForm :: AdrBookEntry -> Form AdrBookEntry e Name mkNewABForm = newForm @@ -887,6 +931,7 @@ appEvent (BT.AppEvent t) = do AdrBookForm -> return () AdrBookUpdForm -> return () AdrBookDelForm -> return () + ShieldDeshieldForm -> return () Blank -> do if s ^. timer == 90 then do @@ -1135,6 +1180,14 @@ appEvent (BT.VtyEvent e) = do setFieldValid (isRecipientValidGUI (fs ^. policyField) (fs ^. sendTo)) RecField + ShieldDeshieldForm -> do + case e of + V.EvKey V.KEsc [] -> BT.modify $ set dialogBox Blank + ev -> + BT.zoom shdshForm $ do + handleFormEvent (BT.VtyEvent ev) +-- fs <- BT.gets formState +-- ev -> BT.zoom shdshForm $ L.handleListEvent ev AdrBook -> do case e of V.EvKey (V.KChar 'x') [] -> @@ -1344,6 +1397,8 @@ appEvent (BT.VtyEvent e) = do BT.modify $ set dialogBox SendTx V.EvKey (V.KChar 'b') [] -> BT.modify $ set dialogBox AdrBook + V.EvKey (V.KChar 'd') [] -> + BT.modify $ set dialogBox ShieldDeshieldForm ev -> case r of Just AList -> @@ -1482,6 +1537,7 @@ runZenithTUI config = do "" Nothing uBal + (mkshieldDeshieldForm 0 (ShDshEntry Shield 0.0 )) Left _e -> do print $ "No Zebra node available on port " <> diff --git a/src/Zenith/Types.hs b/src/Zenith/Types.hs index 0a3d58d..8b7762f 100644 --- a/src/Zenith/Types.hs +++ b/src/Zenith/Types.hs @@ -207,6 +207,11 @@ data PrivacyPolicy $(deriveJSON defaultOptions ''PrivacyPolicy) +data ShieldDeshieldOp + = Shield + | Deshield + deriving (Eq, Show, Read, Ord) + -- ** `zebrad` -- | Type for modeling the tree state response data ZebraTreeInfo = ZebraTreeInfo