Make loading the messages be responsibility of the state itself
This commit is contained in:
parent
11ca5019b5
commit
9daff326d1
@ -165,7 +165,7 @@ pub trait MenuItem {
|
||||
|
||||
#[derive(Default, Debug, Clone)]
|
||||
pub struct Menu<T: MenuItem> {
|
||||
items: Vec<T>,
|
||||
pub items: Vec<T>,
|
||||
idx: usize,
|
||||
scroll: usize,
|
||||
}
|
||||
|
||||
@ -340,27 +340,7 @@ impl State for MainMenuState {
|
||||
match option {
|
||||
MainMenuItem::SendSMS => return Some(Box::new(PhoneNumberState::default())),
|
||||
MainMenuItem::ReadSMS => {
|
||||
return Some(Box::new(ATCommandState::with(
|
||||
"Loading\nmessages".to_owned(),
|
||||
ListSMSMessages {
|
||||
stat: SMSMessageStat::All,
|
||||
},
|
||||
|resp| match resp {
|
||||
Ok(response) => match response {
|
||||
ListSMSMessagesResponse::Ok(messages) => {
|
||||
Box::new(ListSMSMessagesState::from(messages))
|
||||
}
|
||||
ListSMSMessagesResponse::Error(err) => Box::new(TextState {
|
||||
text: format!("Error:\n{:?}", err),
|
||||
after: MainMenuState::default(),
|
||||
}),
|
||||
},
|
||||
Err(err) => Box::new(TextState {
|
||||
text: format!("Error:\n{:?}", err),
|
||||
after: MainMenuState::default(),
|
||||
}),
|
||||
},
|
||||
)));
|
||||
return Some(Box::new(ListSMSMessagesState::default()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -388,24 +368,53 @@ impl MenuItem for MessageListing {
|
||||
#[derive(Clone, Default)]
|
||||
pub struct ListSMSMessagesState {
|
||||
menu: Menu<MessageListing>,
|
||||
promise: Option<ATPromise<ListSMSMessages>>,
|
||||
}
|
||||
|
||||
impl ListSMSMessagesState {
|
||||
pub fn from(messages: Vec<SMSMessageListing>) -> ListSMSMessagesState {
|
||||
let mut menu = Menu::default();
|
||||
for message in &messages {
|
||||
menu = menu.with_item(MessageListing {
|
||||
impl State for ListSMSMessagesState {
|
||||
fn init(&mut self, data: &mut StateData) {
|
||||
self.promise = data
|
||||
.io
|
||||
.send_at_command(ListSMSMessages {
|
||||
stat: SMSMessageStat::All,
|
||||
})
|
||||
.ok()
|
||||
}
|
||||
|
||||
fn update(&mut self, data: &mut StateData) -> Option<Box<dyn State>> {
|
||||
if let Some(promise) = &self.promise {
|
||||
match promise.poll(&mut data.io) {
|
||||
Some(result) => {
|
||||
match result {
|
||||
Ok(response) => match response {
|
||||
ListSMSMessagesResponse::Ok(messages) => {
|
||||
for message in messages {
|
||||
self.menu = self.menu.clone().with_item(MessageListing {
|
||||
from: message.from_addr.clone(),
|
||||
text: message.text.clone(),
|
||||
})
|
||||
}
|
||||
|
||||
ListSMSMessagesState { menu }
|
||||
}
|
||||
}
|
||||
ListSMSMessagesResponse::Error(err) => {
|
||||
return Some(Box::new(TextState {
|
||||
text: format!("Error\n{:?}", err),
|
||||
after: MainMenuState::default(),
|
||||
}));
|
||||
}
|
||||
},
|
||||
Err(err) => {
|
||||
return Some(Box::new(TextState {
|
||||
text: format!("Error\n{:?}", err),
|
||||
after: MainMenuState::default(),
|
||||
}));
|
||||
}
|
||||
}
|
||||
self.promise = None;
|
||||
}
|
||||
None => return None,
|
||||
}
|
||||
}
|
||||
|
||||
impl State for ListSMSMessagesState {
|
||||
fn update(&mut self, data: &mut StateData) -> Option<Box<dyn State>> {
|
||||
if let Some(listing) = self.menu.poll(&mut data.io) {
|
||||
return Some(Box::new(ReadMessageState {
|
||||
message: listing.clone(),
|
||||
@ -419,8 +428,17 @@ impl State for ListSMSMessagesState {
|
||||
}
|
||||
|
||||
fn draw(&self, data: &mut StateData) {
|
||||
data.clear_screen(Rgb565::black().as_color());
|
||||
if self.menu.items.len() == 0 {
|
||||
data.draw_text(
|
||||
"Loading\nmessages",
|
||||
Position::new(0, 0),
|
||||
TextSettings::default(),
|
||||
);
|
||||
} else {
|
||||
self.menu.draw(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Default)]
|
||||
@ -431,7 +449,7 @@ pub struct ReadMessageState {
|
||||
impl State for ReadMessageState {
|
||||
fn update(&mut self, data: &mut StateData) -> Option<Box<dyn State>> {
|
||||
if data.io.keypad.get_presses(KeypadButton::KeypadB) > 0 {
|
||||
Some(Box::new(MainMenuState::default()))
|
||||
Some(Box::new(ListSMSMessagesState::default()))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user