1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-07-04 22:02:34 +00:00

fix(core/rust/ui): respect DISABLE_ANIMATION

[no changelog]
This commit is contained in:
Martin Milata 2022-11-03 11:51:04 +01:00
parent 75cee540a4
commit 1b4dff6275
12 changed files with 93 additions and 6 deletions

View File

@ -16,6 +16,7 @@ static void _librust_qstrs(void) {
MP_QSTR_CONFIRMED; MP_QSTR_CONFIRMED;
MP_QSTR_CANCELLED; MP_QSTR_CANCELLED;
MP_QSTR_INFO; MP_QSTR_INFO;
MP_QSTR_disable_animation;
MP_QSTR_confirm_action; MP_QSTR_confirm_action;
MP_QSTR_confirm_blob; MP_QSTR_confirm_blob;
MP_QSTR_confirm_properties; MP_QSTR_confirm_properties;

View File

@ -89,6 +89,10 @@ where
self self
} }
pub fn inner(&self) -> &T {
&self.source
}
pub fn inner_mut(&mut self) -> &mut T { pub fn inner_mut(&mut self) -> &mut T {
&mut self.source &mut self.source
} }

View File

@ -6,11 +6,15 @@ use crate::{
iter::{Iter, IterBuf}, iter::{Iter, IterBuf},
list::List, list::List,
obj::Obj, obj::Obj,
util::try_or_raise,
}, },
ui::component::text::{ ui::{
component::text::{
paragraphs::{Paragraph, ParagraphSource, ParagraphStrType}, paragraphs::{Paragraph, ParagraphSource, ParagraphStrType},
TextStyle, TextStyle,
}, },
util::set_animation_disabled,
},
}; };
use cstr_core::cstr; use cstr_core::cstr;
use heapless::Vec; use heapless::Vec;
@ -228,3 +232,11 @@ impl ParagraphStrType for StrBuffer {
self.offset(chars) self.offset(chars)
} }
} }
pub extern "C" fn upy_disable_animation(disable: Obj) -> Obj {
let block = || {
set_animation_disabled(disable.try_into()?);
Ok(Obj::const_none())
};
unsafe { try_or_raise(block) }
}

View File

@ -13,6 +13,7 @@ use crate::{
layout::{ layout::{
obj::{ComponentMsgObj, LayoutObj}, obj::{ComponentMsgObj, LayoutObj},
result::{CANCELLED, CONFIRMED}, result::{CANCELLED, CONFIRMED},
util::upy_disable_animation,
}, },
}, },
}; };
@ -116,6 +117,10 @@ pub static mp_module_trezorui2: Module = obj_module! {
/// CANCELLED: object /// CANCELLED: object
Qstr::MP_QSTR_CANCELLED => CANCELLED.as_obj(), Qstr::MP_QSTR_CANCELLED => CANCELLED.as_obj(),
/// def disable_animation(disable: bool) -> None:
/// """Disable animations, debug builds only."""
Qstr::MP_QSTR_disable_animation => obj_fn_1!(upy_disable_animation).as_obj(),
/// def confirm_action( /// def confirm_action(
/// *, /// *,
/// title: str, /// title: str,

View File

@ -13,6 +13,7 @@ use crate::{
layout::{ layout::{
obj::{ComponentMsgObj, LayoutObj}, obj::{ComponentMsgObj, LayoutObj},
result::{CANCELLED, CONFIRMED}, result::{CANCELLED, CONFIRMED},
util::upy_disable_animation,
}, },
}, },
}; };
@ -116,6 +117,10 @@ pub static mp_module_trezorui2: Module = obj_module! {
/// CANCELLED: object /// CANCELLED: object
Qstr::MP_QSTR_CANCELLED => CANCELLED.as_obj(), Qstr::MP_QSTR_CANCELLED => CANCELLED.as_obj(),
/// def disable_animation(disable: bool) -> None:
/// """Disable animations, debug builds only."""
Qstr::MP_QSTR_disable_animation => obj_fn_1!(upy_disable_animation).as_obj(),
/// def confirm_action( /// def confirm_action(
/// *, /// *,
/// title: str, /// title: str,

View File

@ -3,6 +3,7 @@ use crate::{
ui::{ ui::{
component::{Child, Component, ComponentExt, Event, EventCtx, FixedHeightBar, Pad}, component::{Child, Component, ComponentExt, Event, EventCtx, FixedHeightBar, Pad},
geometry::{Grid, Insets, Rect}, geometry::{Grid, Insets, Rect},
util::animation_disabled,
}, },
}; };
@ -220,7 +221,7 @@ where
loader.start_shrinking(ctx, now); loader.start_shrinking(ctx, now);
} }
Some(ButtonMsg::Clicked) => { Some(ButtonMsg::Clicked) => {
if loader.is_completely_grown(now) { if loader.is_completely_grown(now) || animation_disabled() {
return true; return true;
} else { } else {
loader.start_shrinking(ctx, now); loader.start_shrinking(ctx, now);

View File

@ -6,6 +6,7 @@ use crate::{
display::{self, Color}, display::{self, Color},
geometry::{Offset, Rect}, geometry::{Offset, Rect},
model_tt::constant, model_tt::constant,
util::animation_disabled,
}, },
}; };
@ -131,7 +132,9 @@ impl Component for Loader {
if let Event::Timer(EventCtx::ANIM_FRAME_TIMER) = event { if let Event::Timer(EventCtx::ANIM_FRAME_TIMER) = event {
if self.is_animating() { if self.is_animating() {
// We have something to paint, so request to be painted in the next pass. // We have something to paint, so request to be painted in the next pass.
if !animation_disabled() {
ctx.request_paint(); ctx.request_paint();
}
if self.is_completely_grown(now) { if self.is_completely_grown(now) {
return Some(LoaderMsg::GrownCompletely); return Some(LoaderMsg::GrownCompletely);

View File

@ -32,7 +32,9 @@ use crate::{
layout::{ layout::{
obj::{ComponentMsgObj, LayoutObj}, obj::{ComponentMsgObj, LayoutObj},
result::{CANCELLED, CONFIRMED, INFO}, result::{CANCELLED, CONFIRMED, INFO},
util::{iter_into_array, iter_into_objs, ConfirmBlob, PropsList}, util::{
iter_into_array, iter_into_objs, upy_disable_animation, ConfirmBlob, PropsList,
},
}, },
}, },
}; };
@ -1175,6 +1177,10 @@ pub static mp_module_trezorui2: Module = obj_module! {
/// INFO: object /// INFO: object
Qstr::MP_QSTR_INFO => INFO.as_obj(), Qstr::MP_QSTR_INFO => INFO.as_obj(),
/// def disable_animation(disable: bool) -> None:
/// """Disable animations, debug builds only."""
Qstr::MP_QSTR_disable_animation => obj_fn_1!(upy_disable_animation).as_obj(),
/// def confirm_action( /// def confirm_action(
/// *, /// *,
/// title: str, /// title: str,

View File

@ -31,6 +31,30 @@ pub fn u32_to_str(num: u32, buffer: &mut [u8]) -> Option<&str> {
} }
} }
#[cfg(feature = "ui_debug")]
static mut DISABLE_ANIMATION: bool = false;
#[cfg(feature = "ui_debug")]
pub fn animation_disabled() -> bool {
// SAFETY: single-threaded access
unsafe { DISABLE_ANIMATION }
}
#[cfg(feature = "ui_debug")]
pub fn set_animation_disabled(disabled: bool) {
// SAFETY: single-threaded access
unsafe {
DISABLE_ANIMATION = disabled;
}
}
#[cfg(not(feature = "ui_debug"))]
pub fn animation_disabled() -> bool {
false
}
#[cfg(not(feature = "ui_debug"))]
pub fn set_animation_disabled(_disabled: bool) {}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;

View File

@ -3,6 +3,11 @@ CONFIRMED: object
CANCELLED: object CANCELLED: object
# rust/src/ui/model_t1/layout.rs
def disable_animation(disable: bool) -> None:
"""Disable animations, debug builds only."""
# rust/src/ui/model_t1/layout.rs # rust/src/ui/model_t1/layout.rs
def confirm_action( def confirm_action(
*, *,
@ -29,6 +34,11 @@ CONFIRMED: object
CANCELLED: object CANCELLED: object
# rust/src/ui/model_tr/layout.rs
def disable_animation(disable: bool) -> None:
"""Disable animations, debug builds only."""
# rust/src/ui/model_tr/layout.rs # rust/src/ui/model_tr/layout.rs
def confirm_action( def confirm_action(
*, *,
@ -56,6 +66,11 @@ CANCELLED: object
INFO: object INFO: object
# rust/src/ui/model_tt/layout.rs
def disable_animation(disable: bool) -> None:
"""Disable animations, debug builds only."""
# rust/src/ui/model_tt/layout.rs # rust/src/ui/model_tt/layout.rs
def confirm_action( def confirm_action(
*, *,

View File

@ -2,6 +2,7 @@ from typing import TYPE_CHECKING, Sequence
from trezor import io, log, loop, ui, wire, workflow from trezor import io, log, loop, ui, wire, workflow
from trezor.enums import ButtonRequestType from trezor.enums import ButtonRequestType
from trezor.utils import DISABLE_ANIMATION
import trezorui2 import trezorui2
@ -14,6 +15,10 @@ if TYPE_CHECKING:
ExceptionType = BaseException | Type[BaseException] ExceptionType = BaseException | Type[BaseException]
if __debug__:
trezorui2.disable_animation(bool(DISABLE_ANIMATION))
class _RustLayout(ui.Layout): class _RustLayout(ui.Layout):
# pylint: disable=super-init-not-called # pylint: disable=super-init-not-called
def __init__(self, layout: Any): def __init__(self, layout: Any):

View File

@ -24,6 +24,12 @@ CANCELLED = trezorui2.CANCELLED
INFO = trezorui2.INFO INFO = trezorui2.INFO
if __debug__:
from trezor.utils import DISABLE_ANIMATION
trezorui2.disable_animation(bool(DISABLE_ANIMATION))
class _RustLayout(ui.Layout): class _RustLayout(ui.Layout):
# pylint: disable=super-init-not-called # pylint: disable=super-init-not-called
def __init__(self, layout: Any, is_backup: bool = False): def __init__(self, layout: Any, is_backup: bool = False):