summaryrefslogtreecommitdiffstats
path: root/examples/multi_window
diff options
context:
space:
mode:
Diffstat (limited to 'examples/multi_window')
-rw-r--r--examples/multi_window/src/main.rs166
1 files changed, 75 insertions, 91 deletions
diff --git a/examples/multi_window/src/main.rs b/examples/multi_window/src/main.rs
index eb74c94a..b82ad1f3 100644
--- a/examples/multi_window/src/main.rs
+++ b/examples/multi_window/src/main.rs
@@ -1,16 +1,15 @@
-use iced::event;
use iced::executor;
use iced::multi_window::{self, Application};
use iced::widget::{
- button, center, column, container, scrollable, text, text_input,
+ button, center, column, container, horizontal_space, scrollable, text,
+ text_input,
};
use iced::window;
use iced::{
- Alignment, Command, Element, Length, Point, Settings, Subscription, Theme,
- Vector,
+ Alignment, Element, Length, Settings, Subscription, Task, Theme, Vector,
};
-use std::collections::HashMap;
+use std::collections::BTreeMap;
fn main() -> iced::Result {
Example::run(Settings::default())
@@ -18,8 +17,7 @@ fn main() -> iced::Result {
#[derive(Default)]
struct Example {
- windows: HashMap<window::Id, Window>,
- next_window_pos: window::Position,
+ windows: BTreeMap<window::Id, Window>,
}
#[derive(Debug)]
@@ -33,13 +31,12 @@ struct Window {
#[derive(Debug, Clone)]
enum Message {
+ OpenWindow,
+ WindowOpened(window::Id),
+ WindowClosed(window::Id),
ScaleInputChanged(window::Id, String),
ScaleChanged(window::Id, String),
TitleChanged(window::Id, String),
- CloseWindow(window::Id),
- WindowOpened(window::Id, Option<Point>),
- WindowClosed(window::Id),
- NewWindow,
}
impl multi_window::Application for Example {
@@ -48,13 +45,12 @@ impl multi_window::Application for Example {
type Theme = Theme;
type Flags = ();
- fn new(_flags: ()) -> (Self, Command<Message>) {
+ fn new(_flags: ()) -> (Self, Task<Message>) {
(
Example {
- windows: HashMap::from([(window::Id::MAIN, Window::new(1))]),
- next_window_pos: window::Position::Default,
+ windows: BTreeMap::from([(window::Id::MAIN, Window::new(1))]),
},
- Command::none(),
+ Task::none(),
)
}
@@ -62,79 +58,88 @@ impl multi_window::Application for Example {
self.windows
.get(&window)
.map(|window| window.title.clone())
- .unwrap_or("Example".to_string())
+ .unwrap_or_default()
}
- fn update(&mut self, message: Message) -> Command<Message> {
+ fn update(&mut self, message: Message) -> Task<Message> {
match message {
- Message::ScaleInputChanged(id, scale) => {
- let window =
- self.windows.get_mut(&id).expect("Window not found!");
- window.scale_input = scale;
-
- Command::none()
- }
- Message::ScaleChanged(id, scale) => {
- let window =
- self.windows.get_mut(&id).expect("Window not found!");
-
- window.current_scale = scale
- .parse::<f64>()
- .unwrap_or(window.current_scale)
- .clamp(0.5, 5.0);
-
- Command::none()
+ Message::OpenWindow => {
+ let Some(last_window) = self.windows.keys().last() else {
+ return Task::none();
+ };
+
+ window::fetch_position(*last_window)
+ .then(|last_position| {
+ let position = last_position.map_or(
+ window::Position::Default,
+ |last_position| {
+ window::Position::Specific(
+ last_position + Vector::new(20.0, 20.0),
+ )
+ },
+ );
+
+ window::open(window::Settings {
+ position,
+ ..window::Settings::default()
+ })
+ })
+ .map(Message::WindowOpened)
}
- Message::TitleChanged(id, title) => {
- let window =
- self.windows.get_mut(&id).expect("Window not found.");
+ Message::WindowOpened(id) => {
+ let window = Window::new(self.windows.len() + 1);
+ let focus_input = text_input::focus(window.input_id.clone());
- window.title = title;
+ self.windows.insert(id, window);
- Command::none()
+ focus_input
}
- Message::CloseWindow(id) => window::close(id),
Message::WindowClosed(id) => {
self.windows.remove(&id);
- Command::none()
+
+ Task::none()
}
- Message::WindowOpened(id, position) => {
- if let Some(position) = position {
- self.next_window_pos = window::Position::Specific(
- position + Vector::new(20.0, 20.0),
- );
+ Message::ScaleInputChanged(id, scale) => {
+ if let Some(window) = self.windows.get_mut(&id) {
+ window.scale_input = scale;
}
- if let Some(window) = self.windows.get(&id) {
- text_input::focus(window.input_id.clone())
- } else {
- Command::none()
- }
+ Task::none()
}
- Message::NewWindow => {
- let count = self.windows.len() + 1;
-
- let (id, spawn_window) = window::spawn(window::Settings {
- position: self.next_window_pos,
- exit_on_close_request: count % 2 == 0,
- ..Default::default()
- });
+ Message::ScaleChanged(id, scale) => {
+ if let Some(window) = self.windows.get_mut(&id) {
+ window.current_scale = scale
+ .parse::<f64>()
+ .unwrap_or(window.current_scale)
+ .clamp(0.5, 5.0);
+ }
- self.windows.insert(id, Window::new(count));
+ Task::none()
+ }
+ Message::TitleChanged(id, title) => {
+ if let Some(window) = self.windows.get_mut(&id) {
+ window.title = title;
+ }
- spawn_window
+ Task::none()
}
}
}
- fn view(&self, window: window::Id) -> Element<Message> {
- let content = self.windows.get(&window).unwrap().view(window);
-
- center(content).into()
+ fn view(&self, window_id: window::Id) -> Element<Message> {
+ if let Some(window) = self.windows.get(&window_id) {
+ center(window.view(window_id)).into()
+ } else {
+ horizontal_space().into()
+ }
}
- fn theme(&self, window: window::Id) -> Self::Theme {
- self.windows.get(&window).unwrap().theme.clone()
+ fn theme(&self, window: window::Id) -> Theme {
+ if let Some(window) = self.windows.get(&window) {
+ window.theme.clone()
+ } else {
+ Theme::default()
+ }
}
fn scale_factor(&self, window: window::Id) -> f64 {
@@ -145,24 +150,7 @@ impl multi_window::Application for Example {
}
fn subscription(&self) -> Subscription<Self::Message> {
- event::listen_with(|event, _, window| {
- if let iced::Event::Window(window_event) = event {
- match window_event {
- window::Event::CloseRequested => {
- Some(Message::CloseWindow(window))
- }
- window::Event::Opened { position, .. } => {
- Some(Message::WindowOpened(window, position))
- }
- window::Event::Closed => {
- Some(Message::WindowClosed(window))
- }
- _ => None,
- }
- } else {
- None
- }
- })
+ window::close_events().map(Message::WindowClosed)
}
}
@@ -172,11 +160,7 @@ impl Window {
title: format!("Window_{}", count),
scale_input: "1.0".to_string(),
current_scale: 1.0,
- theme: if count % 2 == 0 {
- Theme::Light
- } else {
- Theme::Dark
- },
+ theme: Theme::ALL[count % Theme::ALL.len()].clone(),
input_id: text_input::Id::unique(),
}
}
@@ -200,7 +184,7 @@ impl Window {
];
let new_window_button =
- button(text("New Window")).on_press(Message::NewWindow);
+ button(text("New Window")).on_press(Message::OpenWindow);
let content = scrollable(
column![scale_input, title_input, new_window_button]