Draft Panes widget and panes example

This commit is contained in:
Héctor Ramón Jiménez 2020-03-04 04:10:26 +01:00
parent 02091267bf
commit 012b4adec7
17 changed files with 801 additions and 396 deletions

11
examples/panes/Cargo.toml Normal file
View file

@ -0,0 +1,11 @@
[package]
name = "panes"
version = "0.1.0"
authors = ["Héctor Ramón Jiménez <hector0193@gmail.com>"]
edition = "2018"
publish = false
[dependencies]
iced = { path = "../..", features = ["async-std"] }
clock = { path = "../clock" }
stopwatch = { path = "../stopwatch" }

18
examples/panes/README.md Normal file
View file

@ -0,0 +1,18 @@
## Counter
The classic counter example explained in the [`README`](../../README.md).
The __[`main`]__ file contains all the code of the example.
<div align="center">
<a href="https://gfycat.com/fairdeadcatbird">
<img src="https://thumbs.gfycat.com/FairDeadCatbird-small.gif">
</a>
</div>
You can run it with `cargo run`:
```
cargo run --package counter
```
[`main`]: src/main.rs

View file

@ -0,0 +1,95 @@
use iced::{
panes, Application, Command, Element, Panes, Settings, Subscription,
};
use clock::{self, Clock};
use stopwatch::{self, Stopwatch};
pub fn main() {
Launcher::run(Settings {
antialiasing: true,
..Settings::default()
})
}
struct Launcher {
panes: panes::State<Example>,
}
#[derive(Debug)]
enum Example {
Clock(Clock),
Stopwatch(Stopwatch),
}
#[derive(Debug, Clone)]
enum Message {
Clock(panes::Pane, clock::Message),
Stopwatch(panes::Pane, stopwatch::Message),
}
impl Application for Launcher {
type Executor = iced::executor::Default;
type Message = Message;
fn new() -> (Self, Command<Message>) {
let (clock, _) = Clock::new();
let (panes, _) = panes::State::new(Example::Clock(clock));
dbg!(&panes);
(Self { panes }, Command::none())
}
fn title(&self) -> String {
String::from("Panes - Iced")
}
fn update(&mut self, message: Message) -> Command<Message> {
match message {
Message::Clock(pane, message) => {
if let Some(Example::Clock(clock)) = self.panes.get_mut(&pane) {
let _ = clock.update(message);
}
}
Message::Stopwatch(pane, message) => {
if let Some(Example::Stopwatch(stopwatch)) =
self.panes.get_mut(&pane)
{
let _ = stopwatch.update(message);
}
}
}
Command::none()
}
fn subscription(&self) -> Subscription<Message> {
Subscription::batch(self.panes.iter().map(|(pane, example)| {
match example {
Example::Clock(clock) => clock
.subscription()
.map(move |message| Message::Clock(pane, message)),
Example::Stopwatch(stopwatch) => stopwatch
.subscription()
.map(move |message| Message::Stopwatch(pane, message)),
}
}))
}
fn view(&mut self) -> Element<Message> {
let Self { panes } = self;
Panes::new(panes, |pane, example| match example {
Example::Clock(clock) => clock
.view()
.map(move |message| Message::Clock(pane, message)),
Example::Stopwatch(stopwatch) => stopwatch
.view()
.map(move |message| Message::Stopwatch(pane, message)),
})
.into()
}
}