From 5780c1644e5b44760f93bf69d072ce1a5daed8e8 Mon Sep 17 00:00:00 2001 From: Fabricio Silva Date: Sat, 2 May 2026 21:52:57 +0100 Subject: [PATCH] Add Suspend, Power off and USB (force reconnect, auto connect) to menu --- crates/core/src/view/common.rs | 9 +++++++++ crates/core/src/view/intermission.rs | 2 +- crates/core/src/view/mod.rs | 4 ++++ crates/emulator/src/main.rs | 22 ++++++++++++++++++++++ crates/plato/src/app.rs | 28 ++++++++++++++++++++++++++++ 5 files changed, 64 insertions(+), 1 deletion(-) diff --git a/crates/core/src/view/common.rs b/crates/core/src/view/common.rs index e4a5a69..041c310 100644 --- a/crates/core/src/view/common.rs +++ b/crates/core/src/view/common.rs @@ -109,7 +109,16 @@ pub fn toggle_main_menu(view: &mut dyn View, rect: Rectangle, enable: Option Result<(), Error> { Event::Device(DeviceEvent::RotateScreen(n)) => { tx.send(Event::Select(EntryId::Rotate(n))).ok(); }, + Event::Select(EntryId::ToggleWifi) => { + context.settings.wifi = !context.settings.wifi; + }, + Event::Select(EntryId::UsbForceReconnect) => { + let dialog = Dialog::new(ViewId::ShareDialog, + Some(Event::PrepareShare), + "Share storage via USB?".to_string(), + &mut context); + rq.add(RenderData::new(dialog.id(), *dialog.rect(), UpdateMode::Gui)); + view.children_mut().push(Box::new(dialog) as Box); + }, + Event::Select(EntryId::ToggleAutoShare) => { + context.settings.auto_share = !context.settings.auto_share; + }, + Event::Select(EntryId::Suspend) => { + view.handle_event(&Event::Suspend, &tx, &mut bus, &mut rq, &mut context); + let interm = Intermission::new(context.fb.rect(), IntermKind::Suspend, &context); + rq.add(RenderData::new(interm.id(), *interm.rect(), UpdateMode::Full)); + // In emulator, immediately prepare suspend (no real hardware to suspend) + tx.send(Event::PrepareSuspend).ok(); + view.children_mut().push(Box::new(interm) as Box); + }, Event::Select(EntryId::Quit) => { break 'outer; }, diff --git a/crates/plato/src/app.rs b/crates/plato/src/app.rs index 0c776e1..e06006d 100644 --- a/crates/plato/src/app.rs +++ b/crates/plato/src/app.rs @@ -928,6 +928,21 @@ pub fn run() -> Result<(), Error> { Event::Select(EntryId::ToggleWifi) => { set_wifi(!context.settings.wifi, &mut context); }, + Event::Select(EntryId::UsbForceReconnect) => { + if !context.plugged { + continue; + } + + let dialog = Dialog::new(ViewId::ShareDialog, + Some(Event::PrepareShare), + "Share storage via USB?".to_string(), + &mut context); + rq.add(RenderData::new(dialog.id(), *dialog.rect(), UpdateMode::Gui)); + view.children_mut().push(Box::new(dialog) as Box); + }, + Event::Select(EntryId::ToggleAutoShare) => { + context.settings.auto_share = !context.settings.auto_share; + }, Event::Select(EntryId::TakeScreenshot) => { view.children_mut().retain(|child| !child.is::()); if let Some(reader) = view.as_mut().downcast_mut::() { @@ -966,10 +981,23 @@ pub fn run() -> Result<(), Error> { let notif = Notification::new(msg, &tx, &mut rq, &mut context); view.children_mut().push(Box::new(notif) as Box); }, + Event::Select(EntryId::Suspend) => { + view.handle_event(&Event::Suspend, &tx, &mut bus, &mut rq, &mut context); + let interm = Intermission::new(context.fb.rect(), IntermKind::Suspend, &context); + rq.add(RenderData::new(interm.id(), *interm.rect(), UpdateMode::Full)); + schedule_task(TaskId::PrepareSuspend, Event::PrepareSuspend, + PREPARE_SUSPEND_WAIT_DELAY, &tx, &mut tasks); + view.children_mut().push(Box::new(interm) as Box); + }, Event::Select(EntryId::Reboot) => { exit_status = ExitStatus::Reboot; break; }, + Event::Select(EntryId::PowerOff) => { + power_off(view.as_mut(), &mut history, &mut updating, &mut context); + exit_status = ExitStatus::PowerOff; + break; + }, Event::Select(EntryId::Quit) => { break; }, -- 2.51.2