Skip to content

Commit 643121c

Browse files
author
pythcoiner
committed
move qr code to modal
1 parent 7801fc7 commit 643121c

File tree

3 files changed

+70
-34
lines changed

3 files changed

+70
-34
lines changed

gui/src/app/state/receive.rs

+46-23
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ use crate::daemon::{
2727
Daemon,
2828
};
2929

30+
pub enum Modal {
31+
VerifyAddress(VerifyAddressModal),
32+
ShowQrCode(ShowQrCodeModal),
33+
None,
34+
}
35+
3036
#[derive(Debug, Default)]
3137
pub struct Addresses {
3238
list: Vec<Address>,
@@ -51,8 +57,7 @@ pub struct ReceivePanel {
5157
wallet: Arc<Wallet>,
5258
addresses: Addresses,
5359
labels_edited: LabelsEdited,
54-
qr_code: Option<qr_code::State>,
55-
modal: Option<VerifyAddressModal>,
60+
modal: Modal,
5661
warning: Option<Error>,
5762
}
5863

@@ -63,8 +68,7 @@ impl ReceivePanel {
6368
wallet,
6469
addresses: Addresses::default(),
6570
labels_edited: LabelsEdited::default(),
66-
qr_code: None,
67-
modal: None,
71+
modal: Modal::None,
6872
warning: None,
6973
}
7074
}
@@ -78,22 +82,24 @@ impl State for ReceivePanel {
7882
self.warning.as_ref(),
7983
view::receive::receive(
8084
&self.addresses.list,
81-
self.qr_code.as_ref(),
8285
&self.addresses.labels,
8386
self.labels_edited.cache(),
8487
),
8588
);
86-
if let Some(m) = &self.modal {
87-
modal::Modal::new(content, m.view())
89+
90+
match &self.modal {
91+
Modal::VerifyAddress(m) => modal::Modal::new(content, m.view())
8892
.on_blur(Some(view::Message::Close))
89-
.into()
90-
} else {
91-
content
93+
.into(),
94+
Modal::ShowQrCode(m) => modal::Modal::new(content, m.view())
95+
.on_blur(Some(view::Message::Close))
96+
.into(),
97+
Modal::None => content,
9298
}
9399
}
94100

95101
fn subscription(&self) -> Subscription<Message> {
96-
if let Some(modal) = &self.modal {
102+
if let Modal::VerifyAddress(modal) = &self.modal {
97103
modal.subscription()
98104
} else {
99105
Subscription::none()
@@ -124,11 +130,6 @@ impl State for ReceivePanel {
124130
match res {
125131
Ok((address, derivation_index)) => {
126132
self.warning = None;
127-
self.qr_code = qr_code::State::new(format!(
128-
"bitcoin:{}?index={}",
129-
address, derivation_index
130-
))
131-
.ok();
132133
self.addresses.list.push(address);
133134
self.addresses.derivation_indexes.push(derivation_index);
134135
}
@@ -137,11 +138,11 @@ impl State for ReceivePanel {
137138
Command::none()
138139
}
139140
Message::View(view::Message::Close) => {
140-
self.modal = None;
141+
self.modal = Modal::None;
141142
Command::none()
142143
}
143144
Message::View(view::Message::Select(i)) => {
144-
self.modal = Some(VerifyAddressModal::new(
145+
self.modal = Modal::VerifyAddress(VerifyAddressModal::new(
145146
self.data_dir.clone(),
146147
self.wallet.clone(),
147148
cache.network,
@@ -154,12 +155,20 @@ impl State for ReceivePanel {
154155
));
155156
Command::none()
156157
}
158+
Message::View(view::Message::ShowQrCode(i)) => {
159+
let address = self.addresses.list.get(i).expect("Must be present").clone();
160+
let qr_code = qr_code::State::new(format!("bitcoin:{}?index={}", address, i)).ok();
161+
self.modal = Modal::ShowQrCode(ShowQrCodeModal::new(qr_code.unwrap()));
162+
Command::none()
163+
}
157164
Message::View(view::Message::Next) => self.load(daemon),
158-
_ => self
159-
.modal
160-
.as_mut()
161-
.map(|m| m.update(daemon, cache, message))
162-
.unwrap_or_else(Command::none),
165+
_ => {
166+
if let Modal::VerifyAddress(ref mut m) = self.modal {
167+
m.update(daemon, cache, message)
168+
} else {
169+
Command::none()
170+
}
171+
}
163172
}
164173
}
165174

@@ -268,6 +277,20 @@ impl VerifyAddressModal {
268277
}
269278
}
270279

280+
pub struct ShowQrCodeModal {
281+
qr_code: qr_code::State,
282+
}
283+
284+
impl ShowQrCodeModal {
285+
pub fn new(qr: qr_code::State) -> Self {
286+
Self { qr_code: qr }
287+
}
288+
289+
fn view(&self) -> Element<view::Message> {
290+
view::receive::qr_modal(&self.qr_code)
291+
}
292+
}
293+
271294
async fn verify_address(
272295
hw: std::sync::Arc<dyn async_hwi::HWI + Send + Sync>,
273296
index: ChildNumber,

gui/src/app/view/message.rs

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ pub enum Message {
1818
Previous,
1919
SelectHardwareWallet(usize),
2020
CreateRbf(CreateRbfMessage),
21+
ShowQrCode(usize),
2122
}
2223

2324
#[derive(Debug, Clone)]

gui/src/app/view/receive.rs

+23-11
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ use super::message::Message;
3737

3838
pub fn receive<'a>(
3939
addresses: &'a [bitcoin::Address],
40-
qr: Option<&'a qr_code::State>,
4140
labels: &'a HashMap<String, String>,
4241
labels_editing: &'a HashMap<String, form::Value<String>>,
4342
) -> Element<'a, Message> {
@@ -111,22 +110,23 @@ pub fn receive<'a>(
111110
.align_items(Alignment::Center),
112111
)
113112
.push(
114-
button::primary(None, "Verify on hardware device")
115-
.on_press(Message::Select(i)),
113+
Row::new()
114+
.push(
115+
button::primary(None, "Verify on hardware device")
116+
.on_press(Message::Select(i)),
117+
)
118+
.push(Space::with_width(Length::Fill))
119+
.push(
120+
button::primary(None, "Show QR Code")
121+
.on_press(Message::ShowQrCode(i)),
122+
),
116123
)
117124
.spacing(10),
118125
)
119126
.padding(20),
120127
)
121128
},
122-
))
123-
.push(if let Some(qr) = qr {
124-
Container::new(QRCode::new(qr).cell_size(5))
125-
.padding(10)
126-
.style(theme::Container::QrCode)
127-
} else {
128-
Container::new(Space::with_width(Length::Fill)).width(Length::Fixed(200.0))
129-
}),
129+
)),
130130
)
131131
.spacing(20)
132132
.into()
@@ -214,3 +214,15 @@ pub fn verify_address_modal<'a>(
214214
.max_width(750)
215215
.into()
216216
}
217+
218+
pub fn qr_modal(qr: &qr_code::State) -> Element<Message> {
219+
Column::new()
220+
.push(
221+
Container::new(QRCode::new(qr).cell_size(8))
222+
.padding(10)
223+
.style(theme::Container::QrCode),
224+
)
225+
.width(Length::Fill)
226+
.max_width(400)
227+
.into()
228+
}

0 commit comments

Comments
 (0)