Merge pull request #1175 from EkardNT/sandbox-exit

Allow Sandbox applications to exit.
This commit is contained in:
Héctor Ramón 2022-01-03 16:23:01 +07:00 committed by GitHub
commit 7ab584ce96
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 116 additions and 0 deletions

View file

@ -71,6 +71,7 @@ members = [
"examples/custom_widget",
"examples/download_progress",
"examples/events",
"examples/exit",
"examples/game_of_life",
"examples/geometry",
"examples/integration_opengl",

8
examples/exit/Cargo.toml Normal file
View file

@ -0,0 +1,8 @@
[package]
name = "exit"
version = "0.1.0"
edition = "2021"
publish = false
[dependencies]
iced = { path = "../.." }

12
examples/exit/README.md Normal file
View file

@ -0,0 +1,12 @@
## Exit
How to exit an application based on user input.
The __[`main`]__ file contains all the code of the example.
You can run it with `cargo run`:
```
cargo run --package exit
```
[`main`]: src/main.rs

84
examples/exit/src/main.rs Normal file
View file

@ -0,0 +1,84 @@
use iced::{
button, Alignment, Button, Column, Container, Element, Length, Sandbox,
Settings, Text,
};
pub fn main() -> iced::Result {
Exit::run(Settings::default())
}
#[derive(Default)]
struct Exit {
show_confirm: bool,
exit: bool,
confirm_button: button::State,
exit_button: button::State,
}
#[derive(Debug, Clone, Copy)]
enum Message {
Confirm,
Exit,
}
impl Sandbox for Exit {
type Message = Message;
fn new() -> Self {
Self::default()
}
fn title(&self) -> String {
String::from("Exit - Iced")
}
fn should_exit(&self) -> bool {
self.exit
}
fn update(&mut self, message: Message) {
match message {
Message::Confirm => {
self.exit = true;
}
Message::Exit => {
self.show_confirm = true;
}
}
}
fn view(&mut self) -> Element<Message> {
let content = if self.show_confirm {
Column::new()
.spacing(10)
.align_items(Alignment::Center)
.push(Text::new("Are you sure you want to exit?"))
.push(
Button::new(
&mut self.confirm_button,
Text::new("Yes, exit now"),
)
.padding([10, 20])
.on_press(Message::Confirm),
)
} else {
Column::new()
.spacing(10)
.align_items(Alignment::Center)
.push(Text::new("Click the button to exit"))
.push(
Button::new(&mut self.exit_button, Text::new("Exit"))
.padding([10, 20])
.on_press(Message::Exit),
)
};
Container::new(content)
.width(Length::Fill)
.height(Length::Fill)
.padding(20)
.center_x()
.center_y()
.into()
}
}

View file

@ -131,6 +131,13 @@ pub trait Sandbox {
1.0
}
/// Returns whether the [`Sandbox`] should be terminated.
///
/// By default, it returns `false`.
fn should_exit(&self) -> bool {
false
}
/// Runs the [`Sandbox`].
///
/// On native platforms, this method will take control of the current thread
@ -182,4 +189,8 @@ where
fn scale_factor(&self) -> f64 {
T::scale_factor(self)
}
fn should_exit(&self) -> bool {
T::should_exit(self)
}
}