gui: add wallet to reload

This commit is contained in:
jp1ac4 2024-03-20 09:57:06 +00:00
parent 19d9a4b26a
commit 67ebde1432
No known key found for this signature in database
GPG Key ID: A7ACD32423568D7B
11 changed files with 94 additions and 31 deletions

View File

@ -60,7 +60,7 @@ impl Panels {
current: Menu::Home, current: Menu::Home,
home: Home::new(wallet.clone(), &cache.coins), home: Home::new(wallet.clone(), &cache.coins),
coins: CoinsPanel::new(&cache.coins, wallet.main_descriptor.first_timelock_value()), coins: CoinsPanel::new(&cache.coins, wallet.main_descriptor.first_timelock_value()),
transactions: TransactionsPanel::new(), transactions: TransactionsPanel::new(wallet.clone()),
psbts: PsbtsPanel::new(wallet.clone()), psbts: PsbtsPanel::new(wallet.clone()),
recovery: RecoveryPanel::new(wallet.clone(), &cache.coins, cache.blockheight), recovery: RecoveryPanel::new(wallet.clone(), &cache.coins, cache.blockheight),
receive: ReceivePanel::new(data_dir.clone(), wallet.clone()), receive: ReceivePanel::new(data_dir.clone(), wallet.clone()),
@ -137,7 +137,7 @@ impl App {
data_dir.clone(), data_dir.clone(),
internal_bitcoind.as_ref(), internal_bitcoind.as_ref(),
); );
let cmd = panels.home.reload(daemon.clone()); let cmd = panels.home.reload(daemon.clone(), wallet.clone());
( (
Self { Self {
panels, panels,
@ -202,7 +202,9 @@ impl App {
_ => {} _ => {}
}; };
self.panels.current = menu; self.panels.current = menu;
self.panels.current_mut().reload(self.daemon.clone()) self.panels
.current_mut()
.reload(self.daemon.clone(), self.wallet.clone())
} }
pub fn subscription(&self) -> Subscription<Message> { pub fn subscription(&self) -> Subscription<Message> {

View File

@ -14,6 +14,7 @@ use crate::{
message::Message, message::Message,
state::{label::LabelsEdited, State}, state::{label::LabelsEdited, State},
view, view,
wallet::Wallet,
}, },
daemon::{ daemon::{
model::{Coin, LabelItem, Labelled}, model::{Coin, LabelItem, Labelled},
@ -150,7 +151,11 @@ impl State for CoinsPanel {
Command::none() Command::none()
} }
fn reload(&mut self, daemon: Arc<dyn Daemon + Sync + Send>) -> Command<Message> { fn reload(
&mut self,
daemon: Arc<dyn Daemon + Sync + Send>,
_wallet: Arc<Wallet>,
) -> Command<Message> {
let daemon1 = daemon.clone(); let daemon1 = daemon.clone();
let daemon2 = daemon.clone(); let daemon2 = daemon.clone();
Command::batch(vec![ Command::batch(vec![

View File

@ -44,7 +44,11 @@ pub trait State {
fn subscription(&self) -> Subscription<Message> { fn subscription(&self) -> Subscription<Message> {
Subscription::none() Subscription::none()
} }
fn reload(&mut self, _daemon: Arc<dyn Daemon + Sync + Send>) -> Command<Message> { fn reload(
&mut self,
_daemon: Arc<dyn Daemon + Sync + Send>,
_wallet: Arc<Wallet>,
) -> Command<Message> {
Command::none() Command::none()
} }
} }
@ -208,7 +212,7 @@ impl State for Home {
}; };
} }
Message::View(view::Message::Reload) => { Message::View(view::Message::Reload) => {
return self.reload(daemon); return self.reload(daemon, self.wallet.clone());
} }
Message::View(view::Message::Close) => { Message::View(view::Message::Close) => {
self.selected_event = None; self.selected_event = None;
@ -259,8 +263,13 @@ impl State for Home {
Command::none() Command::none()
} }
fn reload(&mut self, daemon: Arc<dyn Daemon + Sync + Send>) -> Command<Message> { fn reload(
&mut self,
daemon: Arc<dyn Daemon + Sync + Send>,
wallet: Arc<Wallet>,
) -> Command<Message> {
self.selected_event = None; self.selected_event = None;
self.wallet = wallet;
let daemon1 = daemon.clone(); let daemon1 = daemon.clone();
let daemon2 = daemon.clone(); let daemon2 = daemon.clone();
let daemon3 = daemon.clone(); let daemon3 = daemon.clone();

View File

@ -75,7 +75,7 @@ impl State for PsbtsPanel {
) -> Command<Message> { ) -> Command<Message> {
match message { match message {
Message::View(view::Message::Reload) | Message::View(view::Message::Close) => { Message::View(view::Message::Reload) | Message::View(view::Message::Close) => {
return self.reload(daemon); return self.reload(daemon, self.wallet.clone());
} }
Message::SpendTxs(res) => match res { Message::SpendTxs(res) => match res {
Err(e) => self.warning = Some(e), Err(e) => self.warning = Some(e),
@ -118,7 +118,12 @@ impl State for PsbtsPanel {
} }
} }
fn reload(&mut self, daemon: Arc<dyn Daemon + Sync + Send>) -> Command<Message> { fn reload(
&mut self,
daemon: Arc<dyn Daemon + Sync + Send>,
wallet: Arc<Wallet>,
) -> Command<Message> {
self.wallet = wallet;
self.selected_tx = None; self.selected_tx = None;
self.import_tx = None; self.import_tx = None;
let daemon = daemon.clone(); let daemon = daemon.clone();

View File

@ -191,7 +191,12 @@ impl State for ReceivePanel {
} }
} }
fn reload(&mut self, daemon: Arc<dyn Daemon + Sync + Send>) -> Command<Message> { fn reload(
&mut self,
daemon: Arc<dyn Daemon + Sync + Send>,
wallet: Arc<Wallet>,
) -> Command<Message> {
self.wallet = wallet;
// Fill at least with one address, user will then use the generate button. // Fill at least with one address, user will then use the generate button.
if self.addresses.is_empty() { if self.addresses.is_empty() {
let daemon = daemon.clone(); let daemon = daemon.clone();
@ -364,13 +369,11 @@ mod tests {
ChildNumber::from_normal_idx(0).unwrap() ChildNumber::from_normal_idx(0).unwrap()
))), ))),
)]); )]);
let wallet = Arc::new(Wallet::new(LianaDescriptor::from_str(DESC).unwrap()));
let sandbox: Sandbox<ReceivePanel> = Sandbox::new(ReceivePanel::new( let sandbox: Sandbox<ReceivePanel> =
PathBuf::new(), Sandbox::new(ReceivePanel::new(PathBuf::new(), wallet.clone()));
Arc::new(Wallet::new(LianaDescriptor::from_str(DESC).unwrap())),
));
let client = Arc::new(Lianad::new(daemon.run())); let client = Arc::new(Lianad::new(daemon.run()));
let sandbox = sandbox.load(client, &Cache::default()).await; let sandbox = sandbox.load(client, &Cache::default(), wallet).await;
let panel = sandbox.state(); let panel = sandbox.state();
assert_eq!(panel.addresses.list, vec![addr]); assert_eq!(panel.addresses.list, vec![addr]);

View File

@ -192,8 +192,13 @@ impl State for RecoveryPanel {
Command::none() Command::none()
} }
fn reload(&mut self, daemon: Arc<dyn Daemon + Sync + Send>) -> Command<Message> { fn reload(
&mut self,
daemon: Arc<dyn Daemon + Sync + Send>,
wallet: Arc<Wallet>,
) -> Command<Message> {
let daemon = daemon.clone(); let daemon = daemon.clone();
self.wallet = wallet;
self.selected_path = None; self.selected_path = None;
self.warning = None; self.warning = None;
self.feerate = form::Value::default(); self.feerate = form::Value::default();

View File

@ -53,25 +53,28 @@ impl State for SettingsState {
) )
.into(), .into(),
); );
let wallet = self.wallet.clone();
self.setting self.setting
.as_mut() .as_mut()
.map(|s| s.reload(daemon)) .map(|s| s.reload(daemon, wallet))
.unwrap_or_else(Command::none) .unwrap_or_else(Command::none)
} }
Message::View(view::Message::Settings(view::SettingsMessage::AboutSection)) => { Message::View(view::Message::Settings(view::SettingsMessage::AboutSection)) => {
self.setting = Some(AboutSettingsState::default().into()); self.setting = Some(AboutSettingsState::default().into());
let wallet = self.wallet.clone();
self.setting self.setting
.as_mut() .as_mut()
.map(|s| s.reload(daemon)) .map(|s| s.reload(daemon, wallet))
.unwrap_or_else(Command::none) .unwrap_or_else(Command::none)
} }
Message::View(view::Message::Settings(view::SettingsMessage::EditWalletSettings)) => { Message::View(view::Message::Settings(view::SettingsMessage::EditWalletSettings)) => {
self.setting = Some( self.setting = Some(
WalletSettingsState::new(self.data_dir.clone(), self.wallet.clone()).into(), WalletSettingsState::new(self.data_dir.clone(), self.wallet.clone()).into(),
); );
let wallet = self.wallet.clone();
self.setting self.setting
.as_mut() .as_mut()
.map(|s| s.reload(daemon)) .map(|s| s.reload(daemon, wallet))
.unwrap_or_else(Command::none) .unwrap_or_else(Command::none)
} }
_ => self _ => self
@ -98,8 +101,13 @@ impl State for SettingsState {
} }
} }
fn reload(&mut self, _daemon: Arc<dyn Daemon + Sync + Send>) -> Command<Message> { fn reload(
&mut self,
_daemon: Arc<dyn Daemon + Sync + Send>,
wallet: Arc<Wallet>,
) -> Command<Message> {
self.setting = None; self.setting = None;
self.wallet = wallet;
Command::none() Command::none()
} }
} }
@ -150,7 +158,11 @@ impl State for AboutSettingsState {
Command::none() Command::none()
} }
fn reload(&mut self, daemon: Arc<dyn Daemon + Sync + Send>) -> Command<Message> { fn reload(
&mut self,
daemon: Arc<dyn Daemon + Sync + Send>,
_wallet: Arc<Wallet>,
) -> Command<Message> {
Command::perform( Command::perform(
async move { daemon.get_info().map_err(|e| e.into()) }, async move { daemon.get_info().map_err(|e| e.into()) },
Message::Info, Message::Info,

View File

@ -180,7 +180,14 @@ impl State for WalletSettingsState {
} }
} }
fn reload(&mut self, daemon: Arc<dyn Daemon + Sync + Send>) -> Command<Message> { fn reload(
&mut self,
daemon: Arc<dyn Daemon + Sync + Send>,
wallet: Arc<Wallet>,
) -> Command<Message> {
self.descriptor = wallet.main_descriptor.to_string();
self.keys_aliases = Self::keys_aliases(&wallet);
self.wallet = wallet;
Command::perform( Command::perform(
async move { daemon.get_info().map_err(|e| e.into()) }, async move { daemon.get_info().map_err(|e| e.into()) },
Message::Info, Message::Info,

View File

@ -112,7 +112,11 @@ impl State for CreateSpendPanel {
Command::none() Command::none()
} }
fn reload(&mut self, daemon: Arc<dyn Daemon + Sync + Send>) -> Command<Message> { fn reload(
&mut self,
daemon: Arc<dyn Daemon + Sync + Send>,
_wallet: Arc<Wallet>,
) -> Command<Message> {
let daemon1 = daemon.clone(); let daemon1 = daemon.clone();
let daemon2 = daemon.clone(); let daemon2 = daemon.clone();
Command::batch(vec![ Command::batch(vec![

View File

@ -22,6 +22,7 @@ use crate::{
message::Message, message::Message,
state::{label::LabelsEdited, State}, state::{label::LabelsEdited, State},
view, view,
wallet::Wallet,
}, },
daemon::model, daemon::model,
}; };
@ -31,8 +32,8 @@ use crate::daemon::{
Daemon, Daemon,
}; };
#[derive(Default)]
pub struct TransactionsPanel { pub struct TransactionsPanel {
wallet: Arc<Wallet>,
pending_txs: Vec<HistoryTransaction>, pending_txs: Vec<HistoryTransaction>,
txs: Vec<HistoryTransaction>, txs: Vec<HistoryTransaction>,
labels_edited: LabelsEdited, labels_edited: LabelsEdited,
@ -42,8 +43,9 @@ pub struct TransactionsPanel {
} }
impl TransactionsPanel { impl TransactionsPanel {
pub fn new() -> Self { pub fn new(wallet: Arc<Wallet>) -> Self {
Self { Self {
wallet,
selected_tx: None, selected_tx: None,
txs: Vec::new(), txs: Vec::new(),
pending_txs: Vec::new(), pending_txs: Vec::new(),
@ -120,7 +122,7 @@ impl State for TransactionsPanel {
} }
}, },
Message::View(view::Message::Reload) | Message::View(view::Message::Close) => { Message::View(view::Message::Reload) | Message::View(view::Message::Close) => {
return self.reload(daemon); return self.reload(daemon, self.wallet.clone());
} }
Message::View(view::Message::Select(i)) => { Message::View(view::Message::Select(i)) => {
self.selected_tx = if i < self.pending_txs.len() { self.selected_tx = if i < self.pending_txs.len() {
@ -225,7 +227,11 @@ impl State for TransactionsPanel {
Command::none() Command::none()
} }
fn reload(&mut self, daemon: Arc<dyn Daemon + Sync + Send>) -> Command<Message> { fn reload(
&mut self,
daemon: Arc<dyn Daemon + Sync + Send>,
_wallet: Arc<Wallet>,
) -> Command<Message> {
self.selected_tx = None; self.selected_tx = None;
let daemon1 = daemon.clone(); let daemon1 = daemon.clone();
let daemon2 = daemon.clone(); let daemon2 = daemon.clone();

View File

@ -3,7 +3,7 @@ use std::sync::Arc;
use iced_native::command::Action; use iced_native::command::Action;
use crate::{ use crate::{
app::{cache::Cache, message::Message, state::State}, app::{cache::Cache, message::Message, state::State, wallet::Wallet},
daemon::Daemon, daemon::Daemon,
}; };
@ -37,8 +37,13 @@ impl<S: State + Send + 'static> Sandbox<S> {
self self
} }
pub async fn load(mut self, daemon: Arc<dyn Daemon + Sync + Send>, cache: &Cache) -> Self { pub async fn load(
let cmd = self.state.reload(daemon.clone()); mut self,
daemon: Arc<dyn Daemon + Sync + Send>,
cache: &Cache,
wallet: Arc<Wallet>,
) -> Self {
let cmd = self.state.reload(daemon.clone(), wallet);
for action in cmd.actions() { for action in cmd.actions() {
if let Action::Future(f) = action { if let Action::Future(f) = action {
let msg = f.await; let msg = f.await;