summaryrefslogtreecommitdiffstats
path: root/src/sandbox.rs
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-11-22 19:36:57 +0100
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-11-22 19:36:57 +0100
commita7dba612f03e58d7bd9527499d893987986b347c (patch)
treeb8c3d8f997b714aa368bd6eaecf14065f7645c77 /src/sandbox.rs
parentba56a561b254c9a5f3d23cb54d23dc311759ab4c (diff)
downloadiced-a7dba612f03e58d7bd9527499d893987986b347c.tar.gz
iced-a7dba612f03e58d7bd9527499d893987986b347c.tar.bz2
iced-a7dba612f03e58d7bd9527499d893987986b347c.zip
Write docs for `iced` and `iced_native`
Diffstat (limited to 'src/sandbox.rs')
-rw-r--r--src/sandbox.rs114
1 files changed, 112 insertions, 2 deletions
diff --git a/src/sandbox.rs b/src/sandbox.rs
index 8ff374f7..698578f4 100644
--- a/src/sandbox.rs
+++ b/src/sandbox.rs
@@ -1,16 +1,126 @@
use crate::{Application, Command, Element};
+/// A sandboxed [`Application`].
+///
+/// A [`Sandbox`] is just an [`Application`] that cannot run any asynchronous
+/// actions.
+///
+/// If you do not need to leverage a [`Command`], you can use a [`Sandbox`]
+/// instead of returning a [`Command::none`] everywhere.
+///
+/// [`Application`]: trait.Application.html
+/// [`Sandbox`]: trait.Sandbox.html
+/// [`Command`]: struct.Command.html
+/// [`Command::none`]: struct.Command.html#method.none
+///
+/// # Example
+/// We can use a [`Sandbox`] to run the [`Counter` example we implemented
+/// before](index.html#overview), instead of an [`Application`]. We just need
+/// to remove the use of [`Command`]:
+///
+/// ```no_run
+/// use iced::{button, Button, Column, Element, Sandbox, Text};
+///
+/// pub fn main() {
+/// Counter::run()
+/// }
+///
+/// #[derive(Default)]
+/// struct Counter {
+/// value: i32,
+/// increment_button: button::State,
+/// decrement_button: button::State,
+/// }
+///
+/// #[derive(Debug, Clone, Copy)]
+/// enum Message {
+/// IncrementPressed,
+/// DecrementPressed,
+/// }
+///
+/// impl Sandbox for Counter {
+/// type Message = Message;
+///
+/// fn new() -> Self {
+/// Self::default()
+/// }
+///
+/// fn title(&self) -> String {
+/// String::from("A simple counter")
+/// }
+///
+/// fn update(&mut self, message: Message) {
+/// match message {
+/// Message::IncrementPressed => {
+/// self.value += 1;
+/// }
+/// Message::DecrementPressed => {
+/// self.value -= 1;
+/// }
+/// }
+/// }
+///
+/// fn view(&mut self) -> Element<Message> {
+/// Column::new()
+/// .push(
+/// Button::new(&mut self.increment_button, Text::new("Increment"))
+/// .on_press(Message::IncrementPressed),
+/// )
+/// .push(
+/// Text::new(self.value.to_string()).size(50),
+/// )
+/// .push(
+/// Button::new(&mut self.decrement_button, Text::new("Decrement"))
+/// .on_press(Message::DecrementPressed),
+/// )
+/// .into()
+/// }
+/// }
+/// ```
pub trait Sandbox {
+ /// The type of __messages__ your [`Sandbox`] will produce.
+ ///
+ /// [`Sandbox`]: trait.Sandbox.html
type Message: std::fmt::Debug + Send;
+ /// Initializes the [`Sandbox`].
+ ///
+ /// Here is where you should return the initial state of your app.
+ ///
+ /// [`Sandbox`]: trait.Sandbox.html
fn new() -> Self;
+ /// Returns the current title of the [`Sandbox`].
+ ///
+ /// This title can be dynamic! The runtime will automatically update the
+ /// title of your application when necessary.
+ ///
+ /// [`Sandbox`]: trait.Sandbox.html
fn title(&self) -> String;
+ /// Handles a __message__ and updates the state of the [`Sandbox`].
+ ///
+ /// This is where you define your __update logic__. All the __messages__,
+ /// produced by user interactions, will be handled by this method.
+ ///
+ /// [`Sandbox`]: trait.Sandbox.html
fn update(&mut self, message: Self::Message);
- fn view(&mut self) -> Element<Self::Message>;
+ /// Returns the widgets to display in the [`Sandbox`].
+ ///
+ /// These widgets can produce __messages__ based on user interaction.
+ ///
+ /// [`Sandbox`]: trait.Sandbox.html
+ fn view(&mut self) -> Element<'_, Self::Message>;
+ /// Runs the [`Sandbox`].
+ ///
+ /// This method will take control of the current thread and __will NOT
+ /// return__.
+ ///
+ /// It should probably be that last thing you call in your `main` function.
+ ///
+ /// [`Sandbox`]: trait.Sandbox.html
fn run()
where
Self: 'static + Sized,
@@ -39,7 +149,7 @@ where
Command::none()
}
- fn view(&mut self) -> Element<T::Message> {
+ fn view(&mut self) -> Element<'_, T::Message> {
T::view(self)
}
}