diff options
Diffstat (limited to 'examples')
-rw-r--r-- | examples/events/src/main.rs | 12 | ||||
-rw-r--r-- | examples/exit/src/main.rs | 2 | ||||
-rw-r--r-- | examples/integration/src/main.rs | 7 | ||||
-rw-r--r-- | examples/loading_spinners/src/circular.rs | 2 | ||||
-rw-r--r-- | examples/loading_spinners/src/linear.rs | 2 | ||||
-rw-r--r-- | examples/multi_window/Cargo.toml | 9 | ||||
-rw-r--r-- | examples/multi_window/src/main.rs | 211 | ||||
-rw-r--r-- | examples/screenshot/src/main.rs | 7 | ||||
-rw-r--r-- | examples/toast/src/main.rs | 4 | ||||
-rw-r--r-- | examples/todos/src/main.rs | 10 | ||||
-rw-r--r-- | examples/visible_bounds/src/main.rs | 2 |
11 files changed, 251 insertions, 17 deletions
diff --git a/examples/events/src/main.rs b/examples/events/src/main.rs index 32d0da2c..334b012d 100644 --- a/examples/events/src/main.rs +++ b/examples/events/src/main.rs @@ -10,7 +10,10 @@ use iced::{ pub fn main() -> iced::Result { Events::run(Settings { - exit_on_close_request: false, + window: window::Settings { + exit_on_close_request: false, + ..window::Settings::default() + }, ..Settings::default() }) } @@ -54,8 +57,9 @@ impl Application for Events { Command::none() } Message::EventOccurred(event) => { - if let Event::Window(window::Event::CloseRequested) = event { - window::close() + if let Event::Window(id, window::Event::CloseRequested) = event + { + window::close(id) } else { Command::none() } @@ -65,7 +69,7 @@ impl Application for Events { Command::none() } - Message::Exit => window::close(), + Message::Exit => window::close(window::Id::MAIN), } } diff --git a/examples/exit/src/main.rs b/examples/exit/src/main.rs index 6152f627..ec618dc1 100644 --- a/examples/exit/src/main.rs +++ b/examples/exit/src/main.rs @@ -34,7 +34,7 @@ impl Application for Exit { fn update(&mut self, message: Message) -> Command<Message> { match message { - Message::Confirm => window::close(), + Message::Confirm => window::close(window::Id::MAIN), Message::Exit => { self.show_confirm = true; diff --git a/examples/integration/src/main.rs b/examples/integration/src/main.rs index 0f32fca0..276794c8 100644 --- a/examples/integration/src/main.rs +++ b/examples/integration/src/main.rs @@ -6,13 +6,17 @@ use scene::Scene; use iced_wgpu::graphics::Viewport; use iced_wgpu::{wgpu, Backend, Renderer, Settings}; +use iced_winit::conversion; use iced_winit::core::mouse; use iced_winit::core::renderer; +use iced_winit::core::window; use iced_winit::core::{Color, Font, Pixels, Size}; +use iced_winit::futures; use iced_winit::runtime::program; use iced_winit::runtime::Debug; use iced_winit::style::Theme; -use iced_winit::{conversion, futures, winit, Clipboard}; +use iced_winit::winit; +use iced_winit::Clipboard; use winit::{ event::{Event, ModifiersState, WindowEvent}, @@ -180,6 +184,7 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> { // Map window event to iced event if let Some(event) = iced_winit::conversion::window_event( + window::Id::MAIN, &event, window.scale_factor(), modifiers, diff --git a/examples/loading_spinners/src/circular.rs b/examples/loading_spinners/src/circular.rs index bf01c3b4..dca8046a 100644 --- a/examples/loading_spinners/src/circular.rs +++ b/examples/loading_spinners/src/circular.rs @@ -279,7 +279,7 @@ where let state = tree.state.downcast_mut::<State>(); - if let Event::Window(window::Event::RedrawRequested(now)) = event { + if let Event::Window(_, window::Event::RedrawRequested(now)) = event { state.animation = state.animation.timed_transition( self.cycle_duration, self.rotation_duration, diff --git a/examples/loading_spinners/src/linear.rs b/examples/loading_spinners/src/linear.rs index c5bb4791..db10bfba 100644 --- a/examples/loading_spinners/src/linear.rs +++ b/examples/loading_spinners/src/linear.rs @@ -200,7 +200,7 @@ where let state = tree.state.downcast_mut::<State>(); - if let Event::Window(window::Event::RedrawRequested(now)) = event { + if let Event::Window(_, window::Event::RedrawRequested(now)) = event { *state = state.timed_transition(self.cycle_duration, now); shell.request_redraw(RedrawRequest::At( diff --git a/examples/multi_window/Cargo.toml b/examples/multi_window/Cargo.toml new file mode 100644 index 00000000..2e222dfb --- /dev/null +++ b/examples/multi_window/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "multi_window" +version = "0.1.0" +authors = ["Bingus <shankern@protonmail.com>"] +edition = "2021" +publish = false + +[dependencies] +iced = { path = "../..", features = ["debug", "multi-window"] } diff --git a/examples/multi_window/src/main.rs b/examples/multi_window/src/main.rs new file mode 100644 index 00000000..7d1f1e91 --- /dev/null +++ b/examples/multi_window/src/main.rs @@ -0,0 +1,211 @@ +use iced::event; +use iced::executor; +use iced::multi_window::{self, Application}; +use iced::widget::{button, column, container, scrollable, text, text_input}; +use iced::window; +use iced::{ + Alignment, Command, Element, Length, Settings, Subscription, Theme, +}; +use std::collections::HashMap; + +fn main() -> iced::Result { + Example::run(Settings::default()) +} + +#[derive(Default)] +struct Example { + windows: HashMap<window::Id, Window>, + next_window_pos: window::Position, +} + +#[derive(Debug)] +struct Window { + title: String, + scale_input: String, + current_scale: f64, + theme: Theme, + input_id: iced::widget::text_input::Id, +} + +#[derive(Debug, Clone)] +enum Message { + ScaleInputChanged(window::Id, String), + ScaleChanged(window::Id, String), + TitleChanged(window::Id, String), + CloseWindow(window::Id), + WindowDestroyed(window::Id), + WindowCreated(window::Id, (i32, i32)), + NewWindow, +} + +impl multi_window::Application for Example { + type Executor = executor::Default; + type Message = Message; + type Theme = Theme; + type Flags = (); + + fn new(_flags: ()) -> (Self, Command<Message>) { + ( + Example { + windows: HashMap::from([(window::Id::MAIN, Window::new(1))]), + next_window_pos: window::Position::Default, + }, + Command::none(), + ) + } + + fn title(&self, window: window::Id) -> String { + self.windows + .get(&window) + .map(|window| window.title.clone()) + .unwrap_or("Example".to_string()) + } + + fn update(&mut self, message: Message) -> Command<Message> { + match message { + Message::ScaleInputChanged(id, scale) => { + let window = + self.windows.get_mut(&id).expect("Window not found!"); + window.scale_input = scale; + } + 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); + } + Message::TitleChanged(id, title) => { + let window = + self.windows.get_mut(&id).expect("Window not found."); + + window.title = title; + } + Message::CloseWindow(id) => { + return window::close(id); + } + Message::WindowDestroyed(id) => { + self.windows.remove(&id); + } + Message::WindowCreated(id, position) => { + self.next_window_pos = window::Position::Specific( + position.0 + 20, + position.1 + 20, + ); + + if let Some(window) = self.windows.get(&id) { + return text_input::focus(window.input_id.clone()); + } + } + Message::NewWindow => { + let count = self.windows.len() + 1; + let id = window::Id::new(count); + + self.windows.insert(id, Window::new(count)); + + return window::spawn( + id, + window::Settings { + position: self.next_window_pos, + exit_on_close_request: count % 2 == 0, + ..Default::default() + }, + ); + } + } + + Command::none() + } + + fn view(&self, window: window::Id) -> Element<Message> { + let content = self.windows.get(&window).unwrap().view(window); + + container(content) + .width(Length::Fill) + .height(Length::Fill) + .center_x() + .center_y() + .into() + } + + fn theme(&self, window: window::Id) -> Self::Theme { + self.windows.get(&window).unwrap().theme.clone() + } + + fn scale_factor(&self, window: window::Id) -> f64 { + self.windows + .get(&window) + .map(|window| window.current_scale) + .unwrap_or(1.0) + } + + fn subscription(&self) -> Subscription<Self::Message> { + event::listen_with(|event, _| { + if let iced::Event::Window(id, window_event) = event { + match window_event { + window::Event::CloseRequested => { + Some(Message::CloseWindow(id)) + } + window::Event::Destroyed => { + Some(Message::WindowDestroyed(id)) + } + window::Event::Created { position, .. } => { + Some(Message::WindowCreated(id, position)) + } + _ => None, + } + } else { + None + } + }) + } +} + +impl Window { + fn new(count: usize) -> Self { + Self { + title: format!("Window_{}", count), + scale_input: "1.0".to_string(), + current_scale: 1.0, + theme: if count % 2 == 0 { + Theme::Light + } else { + Theme::Dark + }, + input_id: text_input::Id::unique(), + } + } + + fn view(&self, id: window::Id) -> Element<Message> { + let scale_input = column![ + text("Window scale factor:"), + text_input("Window Scale", &self.scale_input) + .on_input(move |msg| { Message::ScaleInputChanged(id, msg) }) + .on_submit(Message::ScaleChanged( + id, + self.scale_input.to_string() + )) + ]; + + let title_input = column![ + text("Window title:"), + text_input("Window Title", &self.title) + .on_input(move |msg| { Message::TitleChanged(id, msg) }) + .id(self.input_id.clone()) + ]; + + let new_window_button = + button(text("New Window")).on_press(Message::NewWindow); + + let content = scrollable( + column![scale_input, title_input, new_window_button] + .spacing(50) + .width(Length::Fill) + .align_items(Alignment::Center), + ); + + container(content).width(200).center_x().into() + } +} diff --git a/examples/screenshot/src/main.rs b/examples/screenshot/src/main.rs index f781a401..20d34be6 100644 --- a/examples/screenshot/src/main.rs +++ b/examples/screenshot/src/main.rs @@ -1,8 +1,8 @@ -use iced::alignment; use iced::keyboard::KeyCode; use iced::theme::{Button, Container}; use iced::widget::{button, column, container, image, row, text, text_input}; use iced::window::screenshot::{self, Screenshot}; +use iced::{alignment, window}; use iced::{ event, executor, keyboard, Alignment, Application, Command, ContentFit, Element, Event, Length, Rectangle, Renderer, Subscription, Theme, @@ -70,7 +70,10 @@ impl Application for Example { fn update(&mut self, message: Self::Message) -> Command<Self::Message> { match message { Message::Screenshot => { - return iced::window::screenshot(Message::ScreenshotData); + return iced::window::screenshot( + window::Id::MAIN, + Message::ScreenshotData, + ); } Message::ScreenshotData(screenshot) => { self.screenshot = Some(screenshot); diff --git a/examples/toast/src/main.rs b/examples/toast/src/main.rs index 934049d5..31b6f191 100644 --- a/examples/toast/src/main.rs +++ b/examples/toast/src/main.rs @@ -539,7 +539,9 @@ mod toast { clipboard: &mut dyn Clipboard, shell: &mut Shell<'_, Message>, ) -> event::Status { - if let Event::Window(window::Event::RedrawRequested(now)) = &event { + if let Event::Window(_, window::Event::RedrawRequested(now)) = + &event + { let mut next_redraw: Option<window::RedrawRequest> = None; self.instants.iter_mut().enumerate().for_each( diff --git a/examples/todos/src/main.rs b/examples/todos/src/main.rs index 1ad3aba7..a7ba69b9 100644 --- a/examples/todos/src/main.rs +++ b/examples/todos/src/main.rs @@ -54,7 +54,7 @@ enum Message { FilterChanged(Filter), TaskMessage(usize, TaskMessage), TabPressed { shift: bool }, - ChangeWindowMode(window::Mode), + ToggleFullscreen(window::Mode), } impl Application for Todos { @@ -165,8 +165,8 @@ impl Application for Todos { widget::focus_next() } } - Message::ChangeWindowMode(mode) => { - window::change_mode(mode) + Message::ToggleFullscreen(mode) => { + window::change_mode(window::Id::MAIN, mode) } _ => Command::none(), }; @@ -272,10 +272,10 @@ impl Application for Todos { shift: modifiers.shift(), }), (keyboard::KeyCode::Up, keyboard::Modifiers::SHIFT) => { - Some(Message::ChangeWindowMode(window::Mode::Fullscreen)) + Some(Message::ToggleFullscreen(window::Mode::Fullscreen)) } (keyboard::KeyCode::Down, keyboard::Modifiers::SHIFT) => { - Some(Message::ChangeWindowMode(window::Mode::Windowed)) + Some(Message::ToggleFullscreen(window::Mode::Windowed)) } _ => None, } diff --git a/examples/visible_bounds/src/main.rs b/examples/visible_bounds/src/main.rs index 697badb4..fdf1e0f9 100644 --- a/examples/visible_bounds/src/main.rs +++ b/examples/visible_bounds/src/main.rs @@ -167,7 +167,7 @@ impl Application for Example { Event::Mouse(mouse::Event::CursorMoved { position }) => { Some(Message::MouseMoved(position)) } - Event::Window(window::Event::Resized { .. }) => { + Event::Window(_, window::Event::Resized { .. }) => { Some(Message::WindowResized) } _ => None, |