parent
34f6964241
commit
45eaab0ce0
@ -0,0 +1,44 @@
|
||||
// ButtonRequestType from messages-common.proto
|
||||
// Eventually this should be generated
|
||||
#[derive(Clone, Copy)]
|
||||
#[repr(u16)]
|
||||
pub enum ButtonRequestCode {
|
||||
Other = 1,
|
||||
FeeOverThreshold = 2,
|
||||
ConfirmOutput = 3,
|
||||
ResetDevice = 4,
|
||||
ConfirmWord = 5,
|
||||
WipeDevice = 6,
|
||||
ProtectCall = 7,
|
||||
SignTx = 8,
|
||||
FirmwareCheck = 9,
|
||||
Address = 10,
|
||||
PublicKey = 11,
|
||||
MnemonicWordCount = 12,
|
||||
MnemonicInput = 13,
|
||||
UnknownDerivationPath = 15,
|
||||
RecoveryHomepage = 16,
|
||||
Success = 17,
|
||||
Warning = 18,
|
||||
PassphraseEntry = 19,
|
||||
PinEntry = 20,
|
||||
}
|
||||
|
||||
impl ButtonRequestCode {
|
||||
pub fn num(&self) -> u16 {
|
||||
*self as u16
|
||||
}
|
||||
|
||||
pub fn with_type(self, br_type: &'static str) -> Option<ButtonRequest> {
|
||||
Some(ButtonRequest {
|
||||
code: self,
|
||||
br_type,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy)]
|
||||
pub struct ButtonRequest {
|
||||
pub code: ButtonRequestCode,
|
||||
pub br_type: &'static str,
|
||||
}
|
@ -0,0 +1,84 @@
|
||||
use crate::ui::{
|
||||
button_request::{ButtonRequest, ButtonRequestCode},
|
||||
component::{Component, Event, EventCtx},
|
||||
geometry::Rect,
|
||||
shape::Renderer,
|
||||
};
|
||||
|
||||
/// Component that sends a ButtonRequest after receiving Event::Attach. The
|
||||
/// request is only sent once.
|
||||
#[derive(Clone, Copy)]
|
||||
pub struct OneButtonRequest<T> {
|
||||
button_request: Option<ButtonRequest>,
|
||||
pub inner: T,
|
||||
}
|
||||
|
||||
impl<T> OneButtonRequest<T> {
|
||||
pub fn new(button_request: ButtonRequest, inner: T) -> Self {
|
||||
Self {
|
||||
button_request: Some(button_request),
|
||||
inner,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Component> Component for OneButtonRequest<T> {
|
||||
type Msg = T::Msg;
|
||||
|
||||
fn place(&mut self, bounds: Rect) -> Rect {
|
||||
self.inner.place(bounds)
|
||||
}
|
||||
|
||||
fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option<Self::Msg> {
|
||||
if matches!(event, Event::Attach) {
|
||||
if let Some(button_request) = self.button_request.take() {
|
||||
ctx.send_button_request(button_request.code, button_request.br_type)
|
||||
}
|
||||
}
|
||||
self.inner.event(ctx, event)
|
||||
}
|
||||
|
||||
fn paint(&mut self) {
|
||||
self.inner.paint()
|
||||
}
|
||||
|
||||
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
|
||||
self.inner.render(target)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "ui_debug")]
|
||||
impl<T: crate::trace::Trace> crate::trace::Trace for OneButtonRequest<T> {
|
||||
fn trace(&self, t: &mut dyn crate::trace::Tracer) {
|
||||
self.inner.trace(t)
|
||||
}
|
||||
}
|
||||
|
||||
pub trait ButtonRequestExt {
|
||||
fn one_button_request(
|
||||
self,
|
||||
code: ButtonRequestCode,
|
||||
br_type: &'static str,
|
||||
) -> OneButtonRequest<Self>
|
||||
where
|
||||
Self: Sized,
|
||||
{
|
||||
OneButtonRequest::new(ButtonRequest { code, br_type }, self)
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Component> ButtonRequestExt for T {}
|
||||
|
||||
#[cfg(all(feature = "micropython", feature = "touch"))]
|
||||
impl<T> crate::ui::flow::Swipable for OneButtonRequest<T>
|
||||
where
|
||||
T: Component + crate::ui::flow::Swipable,
|
||||
{
|
||||
fn can_swipe(&self, direction: crate::ui::component::SwipeDirection) -> bool {
|
||||
self.inner.can_swipe(direction)
|
||||
}
|
||||
|
||||
fn swiped(&mut self, ctx: &mut EventCtx, direction: crate::ui::component::SwipeDirection) {
|
||||
self.inner.swiped(ctx, direction)
|
||||
}
|
||||
}
|
Loading…
Reference in new issue